Status. Two MCP surfaces ship in
@opendatalabs/personal-server-ts 1.16.0.- The owner’s own client path (OAuth, works with a stock MCP client such as Claude Desktop or Claude Code) runs on both the Node server and the in-browser PS Lite runtime.
- The third-party app path — an app that holds its own key and signs its own handshake — runs on the Node Personal Server only. PS Lite does not serve
POST /mcp/session. - Both surfaces are read-only. There are no write tools and no owner-management tools.
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 credential cannot open a session; the handshake exists to prove control of the key.
Step 2 — Connect a stock MCP client
Point any streamable-HTTP MCP transport at{personalServerUrl}/mcp with Authorization: Bearer <access_token>, then listTools() and callTool() as usual. The endpoint is stateless — there is no retained MCP session, only the auth token on each request.
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 cannot grant anything. It tells you what is missing and what to ask the user for; widening access is always a fresh approval 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.
Three behaviours to design around:
- 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 its own charge. There is no receipt cache today, so a paginated read of one scope settles once per page. Budget for it, or read with explicit
blockIds.
Limits
- Read-only. Agent writes over MCP are not built. An app that needs to store a result writes it through the Write API instead, and an agent that should answer a question over data it may not read uses derivative data.
- Node Personal Server only for the third-party path. The desktop app bundles the full Personal Server; the web app bundles PS Lite, which does not serve
/mcp/session. Plan for your users to be on desktop, or check with the Vana team before committing to a launch that assumes otherwise. - The Personal Server must be reachable. A browser-hosted server is unreachable while the user’s Vana tab is closed.
503also covers a server whose bounded-read or compute layer is not wired, so read the error code before deciding whether to retry. - Sessions do not survive a restart, and neither does the replay memory for handshake proofs.
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; the server separately records every MCP tool call 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