MCP API request shape
POST /v1/mcp is a Streamable HTTP transport for JSON-RPC 2.0.
Every request is a single JSON-RPC envelope, and the response
comes back over the same HTTP connection. The gateway implements
the MCP 2024-11-05 spec.
Required headers
| Header | Value | Notes |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | Preferred. x-api-key: YOUR_API_KEY also works for Anthropic-compatible clients. |
Content-Type | application/json | JSON-RPC body. |
Accept | application/json, text/event-stream | Required by the MCP Streamable HTTP transport. Missing text/event-stream returns 406. |
When both Authorization and x-api-key are present,
Authorization: Bearer takes precedence. A malformed
Authorization header is rejected outright — the gateway does
not fall back to x-api-key.
MCP SDKs and the mcp-remote bridge set the Accept header for
you. Raw curl or httpx callers must include it explicitly.
Supported methods
| Method | Description |
|---|---|
initialize | Returns server capabilities and identity. Most clients call this once at connection. |
ping | No-op heartbeat. |
tools/list | List tools your account is entitled to. See Scoping. |
tools/call | Execute a tool on the resolved upstream integration. |
prompts/list | List prompts your account is entitled to. |
prompts/get | Retrieve a specific prompt. |
resources/* methods are not supported yet. Calls to
resources/list or resources/read return the protocol’s
unknown-method error.
tools/list example
curl -X POST https://api.kindo.ai/v1/mcp \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -H "Authorization: Bearer $KINDO_API_KEY" \ -d '{ "jsonrpc": "2.0", "method": "tools/list", "id": 1 }'Response:
{ "jsonrpc": "2.0", "id": 1, "result": { "tools": [ { "name": "linear_list_issues", "description": "List issues in a Linear team", "inputSchema": { "type": "object", "properties": { "teamId": { "type": "string" } }, "required": ["teamId"] } }, { "name": "github_create_issue", "description": "Create a GitHub issue", "inputSchema": { "type": "object", "properties": { "repo": { "type": "string" }, "title": { "type": "string" } }, "required": ["repo", "title"] } } ] }}tools/call example
curl -X POST https://api.kindo.ai/v1/mcp \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -H "Authorization: Bearer $KINDO_API_KEY" \ -d '{ "jsonrpc": "2.0", "method": "tools/call", "id": 2, "params": { "name": "linear_list_issues", "arguments": { "teamId": "TEAM_ID" } } }'Response:
{ "jsonrpc": "2.0", "id": 2, "result": { "content": [{ "type": "text", "text": "..." }] }}Tool naming convention
Tool and prompt names are prefixed with their integration identifier to avoid collisions across providers. The format is:
{server}_{name}For example:
linear_list_issues— thelist_issuestool from the Linear integration.github_create_issue— thecreate_issuetool from the GitHub integration.slack_post_message— thepost_messagetool from the Slack integration.
The gateway splits on the first underscore only. Kindo’s
integration IDs use hyphens (e.g., sap-s4hana-rfc), so names
like sap-s4hana-rfc_invoke_bapi resolve cleanly to server
sap-s4hana-rfc and tool invoke_bapi. You only need to know the
integration ID to address its tools.
See also
- Quickstart — the smallest working call.
- Scoping — what
tools/listreturns and how to narrow it. - Errors — HTTP and protocol error envelopes.