Koskamo

402lounge MCP

An MCP server for AI agents to manage receipts, invoices, and a payTo register for payments made with x402 (USDC on Base). It allows agents to sign up with their wallet, record payments, look up sellers, and handle company billing data without exposing private keys.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

402lounge MCP logo, by 402loungeVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by 402lounge
MCP endpoint (Streamable HTTP)
https://mcp.402lounge.com/mcp
Vendor documentation

What its tools do

59 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

59 of 59 have a description · 59 of 59 declare behavior hints · 58 of 58 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to 402lounge.com ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Record USDC payments on Base as receipts
  • Look up seller payTo addresses in the register
  • Manage company invoices and vouchers
  • Sign up agents with wallet signatures

Source and maintenance

Vendor evidenceRegistry 0.4.0

Protocol and capabilities

Server
402lounge 0.4.0
MCP protocol negotiated in check
2025-11-25
Tools
59 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

402lounge: receipts and a register for AI agents that pay with x402 (USDC on Base). Every account is a company: lounge.signup creates it with you as its agent and your wallet; company.update adds the legal data the monthly vouchers need; company.invite and company.join bring more agents in. After every x402 payment call receipts.record with the transaction hash and the URL you paid; a receipt with the seller, the description, the paying agent and a EUR value follows. register.lookup tells you who is behind a payTo address before you pay. The company gets one document per seller every month (invoices.list), the month so far is in invoices.draft. Free tools work without an account. Call lounge.requirements first if you are new.

Tools

59 advertised

lounge.requirements — What you need to join
Advertised by the server during the last successful anonymous check.
Advertised read-only

Rules, prices, the current terms and the exact sentences you will sign. Free, no account.

lounge.requirements input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
lounge.requirements annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
lounge.terms — Current terms
Advertised by the server during the last successful anonymous check.

Versions, hashes and links of the terms and the privacy notice. With accept: true you confirm a new version: first call returns a challenge, second call with proof {message, signature} records it.

lounge.terms input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "accept": {
      "type": "boolean",
      "description": "true confirms the current terms and privacy notice. The first call returns the challenge to sign, the second call sends it as proof"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
lounge.terms annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
lounge.signup — Create your account
Advertised by the server during the last successful anonymous check.

Free. Your account is a company from the first call, named after you until company.update adds the legal data. With invite_code you join an existing company instead. Proves your wallet with a signature: first call returns a challenge, second call with proof {message, signature} creates the account. Wallets that cannot sign pay 0.001 USDC over HTTP instead (pay_instead in the answer), once payments are open.

lounge.signup input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "name",
    "accept"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 40,
      "minLength": 1,
      "description": "Your name as an agent, unique inside your company, e.g. \"Research\""
    },
    "email": {
      "type": "string",
      "format": "email",
      "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
      "description": "Optional: where documents and notices of your new company go. Ignored with invite_code."
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "accept": {
      "type": "object",
      "required": [
        "terms",
        "privacy",
        "business"
      ],
      "properties": {
        "terms": {
          "type": "string"
        },
        "privacy": {
          "type": "string"
        },
        "business": {
          "type": "boolean",
          "const": true
        }
      },
      "description": "What you accept: the terms and privacy versions from lounge.requirements, and business: true, because 402lounge is for businesses only"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "address": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$",
      "description": "Your wallet address, so the challenge comes back as a finished message"
    },
    "provider": {
      "type": "string",
      "maxLength": 40,
      "description": "awal, cdp, viem, other"
    },
    "invite_code": {
      "type": "string",
      "maxLength": 12,
      "minLength": 8,
      "description": "From company.invite, to join that company"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
lounge.signup annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
lounge.me — You and your company
Advertised by the server during the last successful anonymous check.
Advertised read-only

Who you are (agent and role), your company with its agents, people and level, its wallets, your apps, terms state and pending notices.

lounge.me input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
lounge.me annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
lounge.agent.update — Rename yourself
Advertised by the server during the last successful anonymous check.

Your name inside the company, 1 to 40 characters, unique in the company. Company data lives in company.update.

lounge.agent.update input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 40,
      "minLength": 1,
      "description": "Your new name, 1 to 40 characters, unique in your company"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
lounge.agent.update annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
lounge.wallet.add — Add a wallet
Advertised by the server during the last successful anonymous check.

The new wallet proves itself: first call returns a challenge for it, second call with wallet_proof {message, signature} adds it. It belongs to your company and you operate it. How many follows the plan: Free 1, Books 5 per agent and 15 in all, Books for teams without limit.

lounge.wallet.add input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "address"
  ],
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "address": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$",
      "description": "The wallet to add, 0x followed by 40 hex characters"
    },
    "provider": {
      "type": "string",
      "maxLength": 40,
      "description": "Optional: what holds the key: awal, cdp, viem or other"
    },
    "wallet_proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "Second call only: the challenge message the first call returned, and the signature of that wallet over it"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
lounge.wallet.add annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
lounge.wallet.remove — Remove a wallet
Advertised by the server during the last successful anonymous check.
Advertised destructive

Your own wallets (admins: any wallet of the company). Not the one you sign in with, and never your last one. Sessions made with that wallet end. Its receipts stay.

lounge.wallet.remove input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "address"
  ],
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "address": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$",
      "description": "The wallet to remove"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
lounge.wallet.remove annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
lounge.wallet.primary — Set your sign-in wallet
Advertised by the server during the last successful anonymous check.

The wallet you sign in with. It has to be assigned to you.

lounge.wallet.primary input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "address"
  ],
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "address": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$",
      "description": "The wallet you sign in with from now on. It has to be assigned to you"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
lounge.wallet.primary annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
lounge.wallet.list — Wallets
Advertised by the server during the last successful anonymous check.
Advertised read-only

All wallets of your company, each with the agent that operates it. mine: true lists only yours.

lounge.wallet.list input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "mine": {
      "type": "boolean",
      "description": "true lists only the wallets you operate"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
lounge.wallet.list annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
lounge.session — Session tokens
Advertised by the server during the last successful anonymous check.
Advertised destructive

create: a new lg_ token (needs a signature or an existing token). list and revoke manage them.

lounge.session input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "action"
  ],
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "action": {
      "enum": [
        "create",
        "list",
        "revoke"
      ],
      "type": "string",
      "description": "create a new lg_ token, list your sessions or revoke one"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "revoke: the session to end, from list"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
lounge.session annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": true
}
lounge.apps — Connected apps
Advertised by the server during the last successful anonymous check.
Advertised destructive

Which clients this agent has used. deactivate ends their sessions, activate turns them back on, disconnect forgets them.

lounge.apps input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "action": {
      "enum": [
        "list",
        "deactivate",
        "activate",
        "disconnect"
      ],
      "type": "string",
      "default": "list",
      "description": "list (default) shows the clients. deactivate ends a client's sessions, activate turns it back on, disconnect forgets it"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "app_client": {
      "type": "string",
      "maxLength": 40,
      "description": "The client as list names it. Needed for every action but list"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
lounge.apps annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": true
}
lounge.notices — Notices
Advertised by the server during the last successful anonymous check.

Terms changes, moderation decisions, deletion and security notes, for you and for your company. ack marks one as read.

lounge.notices input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "id": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "ack: the notice to mark as read, from list"
    },
    "all": {
      "type": "boolean",
      "description": "list: also the notices you have read already"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "action": {
      "enum": [
        "list",
        "ack"
      ],
      "type": "string",
      "default": "list",
      "description": "list (default) shows the notices, ack marks one as read"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
lounge.notices annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
lounge.dashboard.link — Dashboard link
Advertised by the server during the last successful anonymous check.

A one-time browser link (10 minutes) into your company's dashboard, signed in as you, for the human behind you.

lounge.dashboard.link input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
lounge.dashboard.link annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
lounge.account.export — Export your data
Advertised by the server during the last successful anonymous check.
Advertised read-only

Everything 402lounge keeps about you as an agent off chain, as JSON. The company's books come from receipts.list and invoices.list.

lounge.account.export input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
lounge.account.export annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
lounge.account.delete — Delete yourself
Advertised by the server during the last successful anonymous check.
Advertised destructive

Schedules your deletion as an agent in 7 days. cancel: true keeps you. Your wallets and receipts stay with the company. Needs a fresh signature with the delete statement (first call returns the challenge).

lounge.account.delete input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "confirm"
  ],
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "cancel": {
      "type": "boolean",
      "description": "true keeps you: it cancels a deletion that is scheduled"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "confirm": {
      "type": "boolean",
      "const": true,
      "description": "Must be true: you want this agent deleted in 7 days"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
lounge.account.delete annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
receipts.record — Report a payment you made
Advertised by the server during the last successful anonymous check.
Open-world

Call this after every x402 payment: the transaction hash from the PAYMENT-RESPONSE header plus the URL you paid. 402lounge matches it with the transfer on Base and writes a receipt with the seller from the register, the catalogue description and a provisional EUR value. Free.

receipts.record input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "tx_hash"
  ],
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "amount": {
      "type": "string",
      "maxLength": 24,
      "description": "What you paid, in USDC, e.g. \"0.002\""
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "pay_to": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$",
      "description": "The payTo address from the payment requirements"
    },
    "supply": {
      "enum": [
        "service",
        "gift_card"
      ],
      "type": "string",
      "description": "What you bought: gift_card for a gift card or other voucher (a Bitrefill order of a gift card, for example), service for everything else, an eSIM included. Leave it out when unsure, the seller's routes decide then"
    },
    "network": {
      "enum": [
        "base",
        "base-sepolia"
      ],
      "type": "string",
      "description": "base or base-sepolia. Default: the network 402lounge runs on, base"
    },
    "tx_hash": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{64}$",
      "description": "The settlement transaction, 0x plus 64 hex characters"
    },
    "description": {
      "type": "string",
      "maxLength": 280,
      "description": "What you bought, in your words. The seller's catalogue wins when it knows the URL."
    },
    "resource_url": {
      "type": "string",
      "format": "uri",
      "maxLength": 500,
      "description": "The URL you paid for (the 402 resource)"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    },
    "payment_response": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 4000
        },
        {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {}
        }
      ],
      "description": "The raw PAYMENT-RESPONSE header, if you still have it"
    }
  }
}
receipts.record annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
receipts.list — Your company's receipts
Advertised by the server during the last successful anonymous check.
Advertised read-only

Receipts of your company for one month (default: the current month, Europe/Berlin), newest first, each with the agent that paid. Totals per seller and per agent, and the reports still waiting for the chain. mine: true, agent_id or wallet narrow it.

receipts.list input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "mine": {
      "type": "boolean",
      "description": "Only the receipts of wallets you operated"
    },
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "How many receipts, 1 to 200"
    },
    "month": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}$",
      "description": "Like 2026-10"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "before": {
      "type": "integer",
      "maximum": 9007199254740991,
      "description": "Page: the smallest receipt id of the previous page",
      "exclusiveMinimum": 0
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "status": {
      "enum": [
        "verified",
        "listed",
        "unverified"
      ],
      "type": "string",
      "description": "Only receipts with this seller status"
    },
    "wallet": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$",
      "description": "Only one paying wallet"
    },
    "agent_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "Only one agent of the company"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
receipts.list annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
receipts.get — One receipt
Advertised by the server during the last successful anonymous check.
Advertised read-only

A single receipt of your company by id or transaction hash.

receipts.get input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 66,
      "minLength": 1,
      "description": "Receipt id or 0x transaction hash"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
receipts.get annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
receipts.set_supply — Say what a payment bought
Advertised by the server during the last successful anonymous check.

Mark a payment as a gift card purchase (gift_card) or as a service (service). Gift card purchases go onto a monthly document of their own without reverse charge, because selling a multi-purpose voucher is no supply. An eSIM or a single-purpose voucher bought through a gift card seller is a service. Owner, admin and finance, while no valid document lists the payment (error receipt_on_document names it, cancel it first). Your choice stays, nothing overwrites it.

receipts.set_supply input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id",
    "supply"
  ],
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 66,
      "minLength": 1,
      "description": "Receipt id or 0x transaction hash"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "supply": {
      "enum": [
        "service",
        "gift_card"
      ],
      "type": "string",
      "description": "gift_card or service"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
receipts.set_supply annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
receipts.name_wallet — Name a wallet you paid
Advertised by the server during the last successful anonymous check.

Your company's own name for a payTo wallet the register does not know, so its receipts say who was paid (e.g. a receipt that needs you because the wallet has no name). The name shows on your company's receipts only, marked as your name, never in the register. name null forgets it. Everyone in the company but viewers and the adviser.

receipts.name_wallet input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "address",
    "name"
  ],
  "properties": {
    "name": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 60
        },
        {
          "type": "null"
        }
      ],
      "description": "Who that wallet belongs to, up to 60 characters. null forgets the name"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "address": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$",
      "description": "The payTo wallet you paid, 0x followed by 40 hex characters"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
receipts.name_wallet annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
receipts.refunds — Refunds sellers paid back
Advertised by the server during the last successful anonymous check.

USDC a seller sent back to one of your wallets, read from Base. 402lounge links a refund to the payments it pays back when the amount matches one payment or the newest ones exactly, the receipts then show it under refunded. list (default, month or state narrow it), get (id), link (id plus payments, each a receipt id or tx hash with an optional usdc part), dismiss (id plus reason, when the transfer is no refund, finance), reopen (id). Refunds go onto the documents of the month the money came back, the original documents stay.

receipts.refunds input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 66,
      "minLength": 1,
      "description": "get, link, dismiss, reopen: the refund by id or 0x transaction hash"
    },
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "list: how many, 1 to 200"
    },
    "month": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}$",
      "description": "list: refunds that came back in this month, like 2026-11"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "state": {
      "enum": [
        "open",
        "allocated",
        "dismissed"
      ],
      "type": "string",
      "description": "list: only refunds in this state, open ones need you"
    },
    "action": {
      "enum": [
        "list",
        "get",
        "link",
        "dismiss",
        "reopen"
      ],
      "type": "string",
      "description": "list (default), get, link, dismiss or reopen"
    },
    "before": {
      "type": "integer",
      "maximum": 9007199254740991,
      "description": "list: page, the smallest refund id of the previous page",
      "exclusiveMinimum": 0
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "reason": {
      "type": "string",
      "maxLength": 500,
      "minLength": 3,
      "description": "dismiss: why the transfer is no refund, 3 to 500 characters"
    },
    "payments": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "receipt"
        ],
        "properties": {
          "usdc": {
            "type": "string",
            "maxLength": 24,
            "description": "The part of the refund for this payment, like \"0.002\". Default: what is left of the payment"
          },
          "receipt": {
            "type": "string",
            "maxLength": 66,
            "minLength": 1,
            "description": "Receipt id or 0x transaction hash of the payment"
          }
        }
      },
      "maxItems": 200,
      "description": "link: the payments the refund pays back"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
receipts.refunds annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
register.lookup — Who is behind this wallet?
Advertised by the server during the last successful anonymous check.
Advertised read-only

Wallet in, seller out: the listing that owns a payTo address, its verification level, its paid endpoints and the last health check. Free, no account. Call it before you pay someone new.

register.lookup input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "address"
  ],
  "properties": {
    "address": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$",
      "description": "A payTo address on Base"
    }
  }
}
register.lookup annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
company.get — Your company
Advertised by the server during the last successful anonymous check.
Advertised read-only

Legal data, VAT status, tier and level, what is missing for the next tier, its agents with this month's spending, its people and your role.

company.get input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
company.get annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
company.update — Fill in or change the company data
Advertised by the server during the last successful anonymous check.
Open-world

Admins only. Your account starts as a company named after you. A company is ready for invoices (tier invoice_ready) once it has name, legal_form (or sole_proprietor), owner_name for a sole proprietor, address_line1, postal_code, city, country, a confirmed email and its VAT status with the number: in the EU a VAT id VIES confirms (checked at once), or the tax_number for small businesses and VAT-exempt companies. Until then it gets receipts and a preview of its monthly documents, and buying a plan waits. Any subset works, and the answer lists what is still missing (missing_for_company).

company.update input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "skr": {
      "enum": [
        "SKR03",
        "SKR04",
        "OWN"
      ],
      "type": "string",
      "description": "Chart of accounts for exports. OWN takes own_accounts"
    },
    "city": {
      "type": "string",
      "maxLength": 80,
      "minLength": 1,
      "description": "City of the registered address"
    },
    "name": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1,
      "description": "Legal name of the company, without the legal form"
    },
    "email": {
      "type": "string",
      "format": "email",
      "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
      "description": "Where documents and notices go. A code confirms it"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "vat_id": {
      "type": "string",
      "maxLength": 30,
      "description": "VAT id in the format of its country, like DE123456789 or ATU12345678 (GET /v1/countries). EU numbers are checked against VIES"
    },
    "country": {
      "type": "string",
      "description": "ISO 3166 two-letter code, e.g. DE"
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "The currency amounts are shown in, next to USDC: EUR (default, the currency of the documents), USD, or any currency with an ECB reference rate"
    },
    "language": {
      "type": [
        "string",
        "null"
      ],
      "description": "Language of documents and mails: en, de, fr, it, es, nl, pt, sv, da, fi or nb. Null takes the language of the country"
    },
    "fx_method": {
      "enum": [
        "ecb_daily"
      ],
      "type": "string",
      "description": "How USDC becomes EUR on documents. Today only ecb_daily (ECB reference rate of the payment day)"
    },
    "legal_form": {
      "type": "string",
      "maxLength": 40,
      "description": "GmbH, UG, AG, e.K., Inc., ..."
    },
    "owner_name": {
      "type": "string",
      "maxLength": 120,
      "description": "A sole proprietorship (Einzelunternehmen, e.K., sole trader ...): the first and last name of the owner. It stands on every document, never in the register or on a listing. Empty removes it"
    },
    "tax_number": {
      "type": "string",
      "maxLength": 30,
      "description": "The national tax number, for vat_status tax_number or where the country asks for it"
    },
    "vat_status": {
      "anyOf": [
        {
          "enum": [
            "vat_id",
            "tax_number",
            "small_business",
            "exempt",
            "not_registered"
          ],
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "How the company stands with VAT: vat_id, tax_number (registered, VAT id still to come), small_business (§ 19 UStG) exempt (only VAT-exempt sales) or not_registered (no VAT registration, the USA or another country without VAT). Decides the tax note on its documents"
    },
    "postal_code": {
      "type": "string",
      "maxLength": 12,
      "minLength": 3,
      "description": "Postal code of the registered address"
    },
    "own_accounts": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "expense",
            "clearing",
            "usdc"
          ],
          "properties": {
            "usdc": {
              "type": "string",
              "pattern": "^\\d{4,8}$"
            },
            "expense": {
              "type": "string",
              "pattern": "^\\d{4,8}$"
            },
            "clearing": {
              "type": "string",
              "pattern": "^\\d{4,8}$"
            },
            "gift_cards": {
              "type": "string",
              "pattern": "^\\d{4,8}$"
            }
          }
        },
        {
          "type": "null"
        }
      ],
      "description": "With skr OWN: the expense, clearing and USDC holding accounts of your chart, 4 to 8 digits, and optionally gift_cards for gift card purchases (the expense account otherwise)"
    },
    "address_line1": {
      "type": "string",
      "maxLength": 120,
      "minLength": 2,
      "description": "Street and number of the registered address"
    },
    "address_line2": {
      "type": "string",
      "maxLength": 120,
      "description": "Optional second line of the address"
    },
    "address_state": {
      "type": "string",
      "maxLength": 40,
      "description": "State or province, written after the city in the USA, Canada and Australia (TX, ON, NSW)"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    },
    "sole_proprietor": {
      "type": "boolean",
      "description": "True for one person without a legal form of its own where the country has none to choose. Then owner_name is required"
    }
  }
}
company.update annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
company.vat_check — Re-check the VAT id
Advertised by the server during the last successful anonymous check.
Open-world

Asks VIES again and updates the tier. Admins, owners and finance.

company.vat_check input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
company.vat_check annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
company.email — The company email
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Where documents and notices go. start sets the address and mails a 6-digit code, confirm checks it, remove clears it (only while the account has no company data). Admins only.

company.email input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "action"
  ],
  "properties": {
    "code": {
      "type": "string",
      "maxLength": 6,
      "minLength": 6,
      "description": "confirm: the six-digit code from the mail"
    },
    "email": {
      "type": "string",
      "format": "email",
      "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
      "description": "start: where documents and notices go"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "action": {
      "enum": [
        "start",
        "confirm",
        "remove"
      ],
      "type": "string",
      "description": "start sets the address and mails a six-digit code, confirm checks the code, remove clears the address"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
company.email annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
company.invite — Invite another agent
Advertised by the server during the last successful anonymous check.

Admins only. A code valid for seven days. A new agent signs up with lounge.signup {invite_code}, an agent with its own account calls company.join {code} and brings its wallets and receipts.

company.invite input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
company.invite annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
company.join — Join a company
Advertised by the server during the last successful anonymous check.
Advertised destructive

With an invite code. Works while your own account has no company data, no vouchers and no other agents: your wallets, receipts and reports move into that company and your own account goes away. You join as an agent, and an admin there can make you admin.

company.join input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "code"
  ],
  "properties": {
    "code": {
      "type": "string",
      "maxLength": 12,
      "minLength": 8,
      "description": "The invite code from company.invite"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
company.join annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": true
}
company.agents — Agents of your company
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every agent with its role, its wallets and what it paid this month (receipts, USDC, EUR).

company.agents input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
company.agents annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
company.agent.update — Rename an agent or change its role
Advertised by the server during the last successful anonymous check.

Admins change any agent, an agent may rename itself. role is admin or agent. The company always keeps an admin or an owner.

company.agent.update input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "agent_id"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 40,
      "minLength": 1,
      "description": "The new name, 1 to 40 characters, unique in the company"
    },
    "role": {
      "enum": [
        "admin",
        "agent"
      ],
      "type": "string",
      "description": "admin or agent"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "agent_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The agent to change, from company.agents"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
company.agent.update annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
company.agent.remove — Remove an agent
Advertised by the server during the last successful anonymous check.
Advertised destructive

Admins only. Schedules the agent's deletion in 7 days. Its wallets stay with the company, unassigned, and its receipts stay in the books.

company.agent.remove input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "agent_id"
  ],
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "agent_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The agent to remove, from company.agents"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
company.agent.remove annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
company.wallet.assign — Move a wallet to another agent
Advertised by the server during the last successful anonymous check.

Admins only. agent_id null leaves the wallet unassigned. Receipts already written keep the agent that paid, new ones get the new agent. Sessions of the previous agent made with that wallet end.

company.wallet.assign input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "address",
    "agent_id"
  ],
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "address": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$",
      "description": "A wallet of your company"
    },
    "agent_id": {
      "anyOf": [
        {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        {
          "type": "null"
        }
      ],
      "description": "The agent that operates it from now on, from company.agents. null leaves the wallet unassigned"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
company.wallet.assign annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
company.wallet.label — Name a wallet
Advertised by the server during the last successful anonymous check.

A name for the company's own lists, e.g. "Research budget". Agents may name their own wallets, admins any. label null clears it.

company.wallet.label input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "address",
    "label"
  ],
  "properties": {
    "label": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 40
        },
        {
          "type": "null"
        }
      ],
      "description": "The name, up to 40 characters. null clears it"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "address": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$",
      "description": "A wallet of your company"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
company.wallet.label annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
company.members — People in your company
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

list shows them. invite adds a person by email with a role: owner (everything), finance (documents, VAT check, plan), adviser (reads and exports, changes nothing, for a tax adviser), viewer (reads). They sign in by email link. An address that is in another company already keeps its login and gets this company next to the others. role changes a role, remove takes someone out. The plan sets how many people sign in, the ones invited included: Free 1, Books 2, Books for teams no limit (plan_limit with what "people" past it). Admins and owners only, except list.

company.members input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "role": {
      "enum": [
        "owner",
        "finance",
        "adviser",
        "viewer"
      ],
      "type": "string",
      "description": "invite and role: owner, finance, adviser or viewer"
    },
    "email": {
      "type": "string",
      "format": "email",
      "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
      "description": "invite: the person's email address"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "action": {
      "enum": [
        "list",
        "invite",
        "role",
        "remove"
      ],
      "type": "string",
      "default": "list",
      "description": "list (default) shows the people, invite adds one, role changes a role, remove takes someone out"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "member_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "role and remove: the person, from list"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
company.members annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
company.requests — The board: requests between people and agents
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Where the tax adviser or the team ask for things, like a receipt that is missing or a purchase nobody described. list shows open ones (status: done or all for more), show one with its answers (request_id), ask writes one (title, body, optional month like 2026-10 and receipt_id), answer replies (request_id, body) and opens it again, done and reopen change its status, delete takes it back. A new request mails the people who keep the books, an answer everybody in the thread. Whoever reads the receipts may use it.

company.requests input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "body": {
      "type": "string",
      "maxLength": 4000,
      "description": "ask and answer: the text"
    },
    "month": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}$",
      "description": "ask, optional: the month it is about, YYYY-MM"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "title": {
      "type": "string",
      "maxLength": 200,
      "description": "ask: a short title"
    },
    "action": {
      "enum": [
        "list",
        "show",
        "ask",
        "answer",
        "done",
        "reopen",
        "delete"
      ],
      "type": "string",
      "default": "list",
      "description": "list (default), show, ask, answer, done, reopen or delete"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "status": {
      "enum": [
        "open",
        "done",
        "all"
      ],
      "type": "string",
      "description": "list: open (default), done or all"
    },
    "receipt_id": {
      "type": "integer",
      "maximum": 9007199254740991,
      "description": "ask, optional: the receipt it is about, from receipts.list",
      "exclusiveMinimum": 0
    },
    "request_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "show, answer, done, reopen and delete: the request, from list"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
company.requests annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
invoices.list — Your company's documents
Advertised by the server during the last successful anonymous check.
Advertised read-only

Monthly vouchers per seller (and later invoices), newest first. Optional month like 2026-10.

invoices.list input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "How many documents, 1 to 200"
    },
    "month": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}$",
      "description": "Optional: only the documents of this month, YYYY-MM"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
invoices.list annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
invoices.get — One document
Advertised by the server during the last successful anonymous check.
Advertised read-only

The full document as JSON, by id or number, with where its archived files lie and their sha256. The PDF is at /v1/invoices/{id}/pdf with your session token.

invoices.get input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 64,
      "minLength": 4,
      "description": "The document, by id or by its number"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
invoices.get annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
invoices.issue — Issue the documents for a month
Advertised by the server during the last successful anonymous check.

Admins, owners and finance. Runs by itself every night for last month. Call it for an older finished month or after a cancellation. One document per seller: the monthly overview on Free, the voucher with the tax note on Books. Payments that arrive after a document get a supplement. Pairs with receipts that lack a EUR rate are skipped and listed. Needs the company data and a confirmed email (tier company).

invoices.issue input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "month": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}$",
      "description": "Finished month, default: last month"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
invoices.issue annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
invoices.draft — The month so far
Advertised by the server during the last successful anonymous check.
Advertised read-only

Drafts of the documents the month would get today, one per seller, with lines, totals and the tax case. Nothing is stored and there is no number. Default: the current month (Europe/Berlin). The PDF of a draft is at /v1/invoices/draft/pdf?month=&seller=.

invoices.draft input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "month": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}$",
      "description": "The month, YYYY-MM. Default: the current month (Europe/Berlin)"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
invoices.draft annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
invoices.cancel — Cancel a document
Advertised by the server during the last successful anonymous check.
Advertised destructive

Admins, owners and finance. Issues a cancellation for a document, with your reason. The original keeps its number and turns to cancelled. Its payments are open again, so invoices.issue for that month (or the nightly run for last month) puts them in a new document.

invoices.cancel input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id",
    "reason"
  ],
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 64,
      "minLength": 4,
      "description": "Id or number of the document"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "reason": {
      "type": "string",
      "maxLength": 500,
      "minLength": 3,
      "description": "Why, 3 to 500 characters. It is written on the cancellation"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
invoices.cancel annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
company.close — Close the company
Advertised by the server during the last successful anonymous check.
Advertised destructive

Admin agents and the owner. Closes the company in 30 days: name confirms it with the company name. Until then everything can be read and the export works (GET /v1/company/export), calls that write are refused with company_closing. Then agents, people, sign-ins, sessions and wallets are removed. Receipts and issued documents stay locked until their retention period ends. cancel: true keeps the company. now: true with export_kept: true closes at once and deletes the receipts and documents too, after you downloaded the export. Documents in a seller's name stay with the seller.

company.close input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "now": {
      "type": "boolean",
      "description": "Close at once and delete everything"
    },
    "name": {
      "type": "string",
      "maxLength": 160,
      "minLength": 1,
      "description": "The company name, as confirmation"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "cancel": {
      "type": "boolean",
      "description": "true keeps the company: it cancels a closing that is scheduled"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "export_kept": {
      "type": "boolean",
      "description": "With now: you downloaded the export and keep the records yourself"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
company.close annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": true
}
directory.search — Find a seller in the directory
Advertised by the server during the last successful anonymous check.
Advertised read-only

Services that take x402 payments, with their level (0 listed, 1 wallet verified), what they offer (MCP, .well-known/x402, llms.txt) and a link. Search by name, description or host. filter: all, verified or mcp. sort: level, new or name. Free, no account.

directory.search input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "q": {
      "type": "string",
      "maxLength": 100,
      "description": "Words to look for, e.g. \"on-chain data\""
    },
    "sort": {
      "enum": [
        "level",
        "new",
        "name"
      ],
      "type": "string",
      "description": "level (default), new or name"
    },
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "How many services, 1 to 100"
    },
    "filter": {
      "enum": [
        "all",
        "verified",
        "mcp"
      ],
      "type": "string",
      "description": "all (default), verified for services whose wallet signed, mcp for services with an MCP server"
    },
    "offset": {
      "type": "integer",
      "maximum": 10000,
      "minimum": 0,
      "description": "How many to skip, for the next page"
    }
  }
}
directory.search annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
directory.get — One listing
Advertised by the server during the last successful anonymous check.
Advertised read-only

A listing with its wallets (network and level), what its calls cost, other networks it takes and its links. Company and location show from level 2 on. Free, no account.

directory.get input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "pattern": "^[a-z0-9][a-z0-9-]{1,59}$",
      "description": "The listing slug, e.g. glassnode"
    }
  }
}
directory.get annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
directory.claim — Claim your listing
Advertised by the server during the last successful anonymous check.

Admin agents and owners. A wallet the listing names proves the service is your company's: first call returns a challenge for that wallet, second call with wallet_proof {message, signature} signed by it claims the listing. The wallet moves to level 1 and payments to it name the listing on receipts. A listing your company holds takes more wallets the same way.

directory.claim input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "slug",
    "address"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "pattern": "^[a-z0-9][a-z0-9-]{1,59}$",
      "description": "The listing slug, e.g. glassnode"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "address": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$",
      "description": "A payTo wallet of the listing"
    },
    "wallet_proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "Second call only: the challenge message the first call returned, and the signature of that wallet over it"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
directory.claim annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
directory.preview — Read a paid URL for a new listing
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

We call one paid URL once without paying, read its 402 answer and show the listing it would make: name, description, price, logo and the wallet you get paid on. Says so when the host or the wallet is listed already, then claim that listing instead.

directory.preview input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 500,
      "minLength": 8,
      "description": "One https URL that answers 402 Payment Required"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
directory.preview annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
directory.submit — List your service
Advertised by the server during the last successful anonymous check.
Open-world

Admin agents and owners. Puts the service behind one paid URL into the directory on level 0, under your company: its payTo wallet on Base, the call and its price from the 402 answer. contact_email is only for us, never shown. Then prove the wallet with directory.claim for level 1.

directory.submit input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "url",
    "contact_email"
  ],
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 500,
      "minLength": 8,
      "description": "One paid URL of the service. It answers 402 with its payment details"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "contact_email": {
      "type": "string",
      "format": "email",
      "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
      "maxLength": 200,
      "description": "Where we can reach you about the listing. Only for us, never shown"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
directory.submit annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
billing.get — Plan, limits and usage
Advertised by the server during the last successful anonymous check.
Advertised read-only

Your company's plan with its period and end, its limits (null means no limit), what it uses this month (transactions, agents, wallets), whether the one-time 20 % over the limit is used, whether the month is locked, the archive (keeps receipts and documents without a paid plan, archive) and what happens to them without either (retention).

billing.get input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
billing.get annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
billing.checkout — Choose a plan
Advertised by the server during the last successful anonymous check.
Open-world

Admin agents, the owner and finance. A checkout link at Polar for Books or Books for teams (plan + period), monthly or yearly (a year costs ten months), or for the archive (archive: month or year, €5 a month or €50 a year), which keeps receipts and documents of a company without a paid plan. Polar is the seller: it charges, handles VAT, issues the invoice and renews until cancelled. The invoices are in Polar's customer portal (billing.portal). Hand the link to a person of your company. It starts once Polar confirms the payment.

billing.checkout input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "plan": {
      "enum": [
        "books",
        "teams"
      ],
      "type": "string",
      "description": "books for Books, teams for Books for teams"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "period": {
      "enum": [
        "month",
        "year"
      ],
      "type": "string",
      "description": "month or year. A year costs ten months"
    },
    "archive": {
      "enum": [
        "month",
        "year"
      ],
      "type": "string",
      "description": "The archive instead of a plan, monthly or yearly"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
billing.checkout annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
billing.portal — Billing portal
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Admin agents, the owner and finance. A link to Polar's customer portal: payment method, invoices, change or cancel the plan.

billing.portal input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
billing.portal annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
billing.quote — Pay 402lounge in USDC
Advertised by the server during the last successful anonymous check.
Open-world

Admin agents, the owner and finance. An offer to pay in USDC on Base: a plan (plan + period), the archive for a company without a paid plan (archive: month or year) or the seller check for level 2 (seller_check: your listing slug, one year). The price is net in EUR, with VAT for your company and the ECB rate of the day, and the amount in USDC is unique for 30 minutes. Pay it yourself with your x402 client on pay_url, or a person sends exactly amount_usdc to pay_to. 402lounge sends an invoice. Nothing renews by itself. With quote_id only: the status of that offer, with the invoice once paid.

billing.quote input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "plan": {
      "enum": [
        "books",
        "teams"
      ],
      "type": "string",
      "description": "books for Books, teams for Books for teams"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "period": {
      "enum": [
        "month",
        "year"
      ],
      "type": "string",
      "description": "month or year. A year costs ten months"
    },
    "archive": {
      "enum": [
        "month",
        "year"
      ],
      "type": "string",
      "description": "The archive, monthly or yearly"
    },
    "quote_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "Read an offer instead of asking for one"
    },
    "seller_check": {
      "type": "string",
      "pattern": "^[a-z0-9][a-z0-9-]{1,59}$",
      "description": "Slug of your listing, for the seller check"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
billing.quote annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
billing.invoices — Invoices of 402lounge
Advertised by the server during the last successful anonymous check.
Advertised read-only

The invoices 402lounge issued to your company for payments in USDC, newest first, each with a PDF link (add ?lang=de for German). With id: one invoice with its full content. Plans bought through Polar get their invoice from Polar.

billing.invoices input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "Optional: one invoice with its full content"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
billing.invoices annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
seller.get — Your seller levels
Advertised by the server during the last successful anonymous check.
Advertised read-only

Your company as a seller: every listing with its level (0 listed, 1 wallet verified, 2 company verified, 3 invoicing), the company check and its steps, the seller profile (register entry, representative), the invoicing mandate and self-billing, and what is missing for the next level.

seller.get input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
seller.get annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
seller.profile — Representative and register entry
Advertised by the server during the last successful anonymous check.

Admin agents and owners. What level 2 needs on top of the company data: the name of the person who acts for the company (representative_name, the role is optional). The commercial register court and number help the check but are optional, no_register: true where there is none. sole_proprietor: true when the company is one person, then show_name says whether the register may show the name.

seller.profile input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "show_name": {
      "type": "boolean",
      "description": "With sole_proprietor: whether the register may show the name"
    },
    "no_register": {
      "type": "boolean",
      "description": "true when the company is in no commercial register"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    },
    "register_court": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 80,
          "minLength": 2
        },
        {
          "type": "null"
        }
      ],
      "description": "The court or office that keeps the register, where the country names one: Registergericht in Germany, Firmenbuchgericht in Austria. GET /v1/countries names it per country"
    },
    "register_number": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 40,
          "minLength": 2
        },
        {
          "type": "null"
        }
      ],
      "description": "The number in the register, as the register writes it (GET /v1/countries names the register per country)"
    },
    "sole_proprietor": {
      "type": "boolean",
      "description": "true when the company is one person"
    },
    "representative_name": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 120,
          "minLength": 2
        },
        {
          "type": "null"
        }
      ],
      "description": "The name of the person who acts for the company. null clears it"
    },
    "representative_role": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 60,
          "minLength": 2
        },
        {
          "type": "null"
        }
      ],
      "description": "e.g. Managing director"
    }
  }
}
seller.profile annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
seller.prices — State the prices of a listing
Advertised by the server during the last successful anonymous check.

Admin agents and owners. What your listing costs, in your words: up to 12 lines, each a label, a price in USDC and whether it is per call or the minimum top-up of a balance. All lines at once, they replace the ones before. The listing page shows them instead of what the nightly check read from your 402 answers. An empty list removes them. Nobody checks them, so state what a buyer really pays.

seller.prices input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "listing",
    "prices"
  ],
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "prices": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "label",
          "price_usdc",
          "unit"
        ],
        "properties": {
          "unit": {
            "enum": [
              "call",
              "topup"
            ],
            "type": "string",
            "description": "call: per call. topup: the minimum top-up of a balance"
          },
          "label": {
            "type": "string",
            "maxLength": 80,
            "minLength": 1,
            "description": "What the price is for, up to three words, e.g. \"Token price\""
          },
          "price_usdc": {
            "type": "number",
            "maximum": 1000,
            "description": "The price in USDC, e.g. 0.002",
            "exclusiveMinimum": 0
          }
        }
      },
      "maxItems": 12,
      "description": "Every line of the listing, in the order to show. [] removes them"
    },
    "listing": {
      "type": "string",
      "pattern": "^[a-z0-9][a-z0-9-]{1,59}$",
      "description": "The listing slug, e.g. glassnode"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
seller.prices annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
seller.check — The company check of a listing (level 2)
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Level 2 for a listing of your company on level 1: action start {listing} opens the check and returns its steps. The domain of the listing is proved by an email address at it: email {id, email} sends a code there, confirm_email {id, code} confirms it. Without a mailbox, add the DNS TXT record from the check instead (_402lounge.<host>, value 402lounge-verify=<token>). verify {id} runs the steps again (company data with the name of the person who acts for the company, VIES, the domain, EU sanctions list, payment). Once all pass, 402lounge approves it, then the listing is on level 2 for a year. checkout {id} gives the Polar link for 10 € a year, included in Books. get {id}, withdraw {id}.

seller.check input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "action"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The check, from start. Every action but start needs it"
    },
    "code": {
      "type": "string",
      "pattern": "^\\s*\\d{6}\\s*$",
      "description": "confirm_email: the six-digit code from the mail"
    },
    "email": {
      "type": "string",
      "maxLength": 200,
      "minLength": 3,
      "description": "email: an address at the domain of the listing"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "action": {
      "enum": [
        "start",
        "get",
        "verify",
        "email",
        "confirm_email",
        "checkout",
        "withdraw"
      ],
      "type": "string",
      "description": "start, get, verify, email, confirm_email, checkout or withdraw, as the description explains"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "listing": {
      "type": "string",
      "pattern": "^[a-z0-9][a-z0-9-]{1,59}$",
      "description": "The listing slug, e.g. glassnode"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
seller.check annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
seller.mandate — Invoicing mandate (level 3)
Advertised by the server during the last successful anonymous check.
Advertised destructive

Admin agents and owners. get shows the mandate text (link, version, sha256) and whether it is signed. sign: first call returns a challenge, sign it with your wallet and call again with agreement_proof {message, signature}. Then, with a listing on level 2 and Books, buyers on level 3 get monthly invoices in your name (§ 14 (2) UStG), issued by 402lounge. revoke ends it at the end of the month.

seller.mandate input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "action"
  ],
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "action": {
      "enum": [
        "get",
        "sign",
        "revoke"
      ],
      "type": "string",
      "description": "get shows the text and whether it is signed, sign signs it (a challenge first), revoke ends it at the end of the month"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "confirm": {
      "type": "boolean",
      "description": "sign: true, after you read the mandate text from get"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    },
    "agreement_proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "sign, second call: the challenge message the first call returned, and your wallet's signature over it"
    }
  }
}
seller.mandate annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": true
}
seller.self_billing — Self-billing agreement
Advertised by the server during the last successful anonymous check.
Advertised destructive

Admin agents and owners. Without a mandate, a company on level 2 can agree that its buyers on level 3 issue credit notes (Gutschriften) for what they paid, on any plan. get, sign (challenge, then agreement_proof), revoke (at the end of the month).

seller.self_billing input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "action"
  ],
  "properties": {
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "action": {
      "enum": [
        "get",
        "sign",
        "revoke"
      ],
      "type": "string",
      "description": "get shows the agreement and whether it is signed, sign signs it (a challenge first), revoke ends it at the end of the month"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "confirm": {
      "type": "boolean",
      "description": "sign: true, after you read the agreement from get"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    },
    "agreement_proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "sign, second call: the challenge message the first call returned, and your wallet's signature over it"
    }
  }
}
seller.self_billing annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": true
}
seller.invoices — Documents in your name
Advertised by the server during the last successful anonymous check.
Advertised read-only

Invoices 402lounge issued in your name (L-2610-10427-01), credit notes your buyers issued to you (G-...) and their cancellations, newest first, each with its e-invoice. With id the whole document. PDF and XML: GET /v1/seller/invoices/{id}/pdf and /xml.

seller.invoices input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 80,
      "description": "Optional: one document in full, by id or number"
    },
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "How many documents, 1 to 200"
    },
    "month": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}$",
      "description": "Optional: only this month, YYYY-MM"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
seller.invoices annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
seller.invoices.cancel — Cancel a document in your name
Advertised by the server during the last successful anonymous check.
Advertised destructive

Admin agents, the owner and finance. Cancels an invoice in your name or a credit note you received, with a reason: a cancellation in your number range follows, the original stays. The payments are open again and the next monthly run issues them anew.

seller.invoices.cancel input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id",
    "reason"
  ],
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 80,
      "description": "The invoice or credit note, by id or number"
    },
    "proof": {
      "type": "object",
      "required": [
        "message",
        "signature"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "signature": {
          "type": "string"
        }
      },
      "description": "An EIP-4361 message you got from a challenge, signed by your wallet"
    },
    "client": {
      "type": "string",
      "maxLength": 40,
      "description": "Your client name, e.g. \"claude-code 2.1\""
    },
    "reason": {
      "type": "string",
      "maxLength": 500,
      "minLength": 3,
      "description": "Why, 3 to 500 characters. It is written on the cancellation"
    },
    "session_token": {
      "type": "string",
      "description": "A lounge session token (lg_...) if you have one"
    }
  }
}
seller.invoices.cancel annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
398 ms
95th percentile latency
398 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 398 ms · metadata changed · 59 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http 402lounge-mcp https://mcp.402lounge.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add 402lounge-mcp --url https://mcp.402lounge.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable 402lounge-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "402lounge-mcp": {
      "url": "https://mcp.402lounge.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "402lounge-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.402lounge.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start 402lounge-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "402lounge-mcp": {
      "type": "http",
      "url": "https://mcp.402lounge.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http 402lounge-mcp https://mcp.402lounge.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp.402lounge.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "402lounge-mcp": {
      "serverUrl": "https://mcp.402lounge.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like 402lounge MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run 402lounge MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing