Which surface you need
The rest of this page covers the third-party path. On the owner’s path the user points their own client at their Personal Server’s
/mcp URL and approves scopes in Vana; your app is not part of that flow.
The third-party flow
You sign once to mint a session token, then connect with an unmodified MCP client. The key never leaves your backend — the Personal Server only ever recovers your address, at the handshake.Prerequisites
Step 1 — Mint a session
aud, method, uri, bodyHash, iat, exp — and must carry a grantId claim. It is signed EIP-191 by your app key. A bearer token cannot open a session.
Step 2 — Connect a stock MCP client
Point any streamable-HTTP MCP transport at{personalServerUrl}/mcp with Authorization: Bearer <access_token>, then call listTools() and callTool() as usual. The endpoint is stateless: each request carries the token, and no MCP session is kept between requests.
The tool catalog
Every tool is grant-scoped: a scope your grant does not cover returnsscope_not_granted and the list of scopes that are covered.
request_scope_access does not grant anything. It reports what is missing; the user approves additional scopes in Vana.
Paying for reads
When the grant is priced, a chargeable read answers with an x402 challenge rather than data:GenericPayment message with your app key — the same EIP-712 settlement the HTTP read path uses — and call the tool again with the base64 X-PAYMENT payload in its payment argument. read_scope and get_scope_file both take it.
Design around three behaviors:
- Search does not settle payments.
search_personal_contextis free discovery and preview. Chargeable scopes come back inpaymentRequiredScopes; retrieve each throughread_scopewith a payment proof. - A
402that will never clear is a different error. A genuinePAYMENT_REQUIREDcarries a signable challenge. An empty escrow surfaces aspayment_failedwith no challenge — resolve the balance rather than signing in a loop. - Each cursor page and each retry is charged separately. A paginated read of one scope settles once per page. Budget for it, or read with explicit
blockIds.
Limits
- Read-only. MCP tools do not write. To store a result, use the Write API. To answer a question over data your app should not read, use derivative data.
- Desktop app only for the third-party path. Users on the web app cannot open a third-party MCP session, so plan for your users to be on the desktop app.
- The Personal Server must be reachable. A
503can mean the server is offline or that the requested feature is not available on it; check the error code before retrying. - Sessions do not survive a Personal Server restart.
Auditability
The properties that make a grant safe apply unchanged to an agent:- Consent is on-chain — which app may reach which scopes, until when
- Each scope-content read is logged in the Personal Server’s access log, attributed to your registered address, and every MCP tool call appears in an activity feed the owner can review
- Each chargeable read settles a fee, leaving an on-chain record per use
- Revocation is immediate — revoke the grant and the next tool call fails, without touching the session
Related
- Agents — why the protocol treats an agent as an ordinary grantee
- Personal Servers — what serves the MCP endpoint
- Grants & permissions — the grant an MCP session runs under
- Derivative data — answering a question without reading the sources
- Write API — storing a result back in the user’s Personal Server
- Payments & fees — funding the escrow a paid read settles from