MCP server
Connect Claude or ChatGPT to your workspace, read-only.
prepaid.ai speaks the Model Context Protocol, so an AI assistant that supports MCP — Claude, ChatGPT, Cursor and others — can read your workspace and answer questions about it directly.
Streamable HTTP transport, protocol revision 2025-06-18.
The server URL is https://app.prepaid.ai/api/mcp. There are two ways to authenticate it, and which one you use depends on whether your client has a browser.
Connecting with OAuth#
This is the one to use in Claude or ChatGPT. Add the server URL as a connector; the client registers itself, sends you to your console to approve it, and stores a token of its own. You never paste a credential anywhere.
Approval happens on a page in your console, signed in as yourself, so the workspace it connects to comes from your session — never from anything the client claims about itself.
- PKCE with
S256is required.plainis refused. - Clients are public and get no client secret; PKCE is what proves the token request is theirs.
- The access token lasts an hour. The refresh token does not expire, and rotates every time it is used.
- The only scope is
workspace:read.
Connecting with an API key#
A config-file client with no browser to run a consent screen in — Claude Code, or a hand-written mcpServers block — sends an API key as a bearer token instead. This keeps working and is not deprecated.
{
"mcpServers": {
"prepaid-ai": {
"url": "https://app.prepaid.ai/api/mcp",
"headers": {
"Authorization": "Bearer pk_live_your_key_here"
}
}
}
}Tools#
| Field | Type | Description |
|---|---|---|
| get_balanceoptional | no arguments | Spendable credits, in credit-hundredths. |
| list_agentsoptional | no arguments | Every agent, with id, name and status. |
| list_numbersoptional | no arguments | Every number, with lifecycle status and the agent answering it. |
| list_callsoptional | limit: integer | Recent calls, newest first. limit is 1–200 and defaults to 50. No transcripts — use get_call. |
| get_planoptional | no arguments | The plan, its status and expiry, days left, and plan minutes left of the total. A null plan is the free tier. |
| get_callrequired | call_id: string | One call in full: details, summary, the transcript turn by turn, and any message taken. |
| list_messagesoptional | limit: integer, urgent_only: boolean | Messages your AI took and calls it flagged urgent, newest first. |
| list_bookingsoptional | days_ahead: integer | Appointments from now until 1–90 days ahead (default 14), and who made each one. |
| list_unanswered_questionsoptional | include_answered: boolean | Questions callers asked that your AI could not answer, most-asked first. |
| list_contactsoptional | search: string, limit: integer | Saved contacts, optionally filtered by name, number, email or company. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_calls",
"arguments": { "limit": 10 }
}
}