Skip to content

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

HeaderValueNotes
AuthorizationBearer YOUR_API_KEYPreferred. x-api-key: YOUR_API_KEY also works for Anthropic-compatible clients.
Content-Typeapplication/jsonJSON-RPC body.
Acceptapplication/json, text/event-streamRequired 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

MethodDescription
initializeReturns server capabilities and identity. Most clients call this once at connection.
pingNo-op heartbeat.
tools/listList tools your account is entitled to. See Scoping.
tools/callExecute a tool on the resolved upstream integration.
prompts/listList prompts your account is entitled to.
prompts/getRetrieve 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

Terminal window
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

Terminal window
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 — the list_issues tool from the Linear integration.
  • github_create_issue — the create_issue tool from the GitHub integration.
  • slack_post_message — the post_message tool 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/list returns and how to narrow it.
  • Errors — HTTP and protocol error envelopes.