prepaid.ai docs
StatusOpen the console
API referenceMCP server

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.

POST/api/mcp

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 S256 is required. plain is 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.
NoteYour connections are listed under Settings → Connected apps, with when each was last used. Disconnecting there ends the whole connection immediately, not just the current hour’s token.

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.

Client configurationjson
{
  "mcpServers": {
    "prepaid-ai": {
      "url": "https://app.prepaid.ai/api/mcp",
      "headers": {
        "Authorization": "Bearer pk_live_your_key_here"
      }
    }
  }
}

Tools#

FieldTypeDescription
get_balanceoptionalno argumentsSpendable credits, in credit-hundredths.
list_agentsoptionalno argumentsEvery agent, with id, name and status.
list_numbersoptionalno argumentsEvery number, with lifecycle status and the agent answering it.
list_callsoptionallimit: integerRecent calls, newest first. limit is 1–200 and defaults to 50. No transcripts — use get_call.
get_planoptionalno argumentsThe plan, its status and expiry, days left, and plan minutes left of the total. A null plan is the free tier.
get_callrequiredcall_id: stringOne call in full: details, summary, the transcript turn by turn, and any message taken.
list_messagesoptionallimit: integer, urgent_only: booleanMessages your AI took and calls it flagged urgent, newest first.
list_bookingsoptionaldays_ahead: integerAppointments from now until 1–90 days ahead (default 14), and who made each one.
list_unanswered_questionsoptionalinclude_answered: booleanQuestions callers asked that your AI could not answer, most-asked first.
list_contactsoptionalsearch: string, limit: integerSaved contacts, optionally filtered by name, number, email or company.
Calling a tooljson
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_calls",
    "arguments": { "limit": 10 }
  }
}

What it deliberately cannot do#

Worth knowingEvery tool is read-only, by decision rather than omission. Nothing reachable from inside an AI session can spend credits, take an agent live, or delete anything — changes to what a real phone number says belong on a screen where a person confirms them.
NoteJSON-RPC batching is not supported: it was removed in the 2025-06-18 revision of the protocol. Send one request per POST.