MCP tools
The Marvin MCP server speaks JSON-RPC over Streamable HTTP. Every request is a POST to / with a Bearer token and a JSON-RPC body — only the body changes between calls.
| Region | MCP server |
|---|---|
| US | https://mcp.heymarvin.com/ |
| EU | https://mcp-eu.heymarvin.com/ |
Authentication#
MCP tokens need the mcp:read scope and a resource parameter naming the server you're targeting. The audience is checked on every call, so a token minted for the US server won't work against the EU one.
curl -X POST https://app.heymarvin.com/api/v1/oauth/token \
-d "grant_type=client_credentials" \
-d "client_id=<YOUR_CLIENT_ID>" \
-d "client_secret=<YOUR_CLIENT_SECRET>" \
-d "scope=mcp:read" \
-d "resource=https://mcp.heymarvin.com"
See Access and authorization for where the client ID and secret come from.
All three headers below are the same on every request:
Authorization: Bearer <ACCESS_TOKEN>
Content-Type: application/json
Accept: application/json, text/event-stream
Initialize the session #
The initialize handshake is also the quickest way to confirm your token and audience are right.
curl -X POST https://mcp.heymarvin.com/ \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize",
"params":{"protocolVersion":"2025-03-26",
"capabilities":{},
"clientInfo":{"name":"my-app","version":"0.1"}}}'
A 401 here means the token is missing scope=mcp:read or the matching resource parameter.
List available tools #
tools/list returns the tools your token can reach, with their input schemas.
curl -X POST https://mcp.heymarvin.com/ \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
Call a tool #
tools/call takes the tool name and an arguments object matching that tool's schema. This example calls list_projects, which takes none.
curl -X POST https://mcp.heymarvin.com/ \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call",
"params":{"name":"list_projects","arguments":{}}}'
If a tool returns nothing where you expected data, check sharing: the key only reaches projects it has access to. See Troubleshooting.
Next steps#
- Client configuration — point Claude, Cursor, or another MCP client at Marvin
- Token lifecycle — tokens last an hour; plan for refresh