Runstack Docs

MCP Server

Connect any MCP-compatible client to the Runstack MCP server at /mcp and access 150+ tools across all your connected services.

The Runstack MCP server exposes your connected services as tools via the Model Context Protocol. Any MCP-compatible client — Claude Desktop, Cursor, custom agents — can call Runstack tools using a single authenticated endpoint.

Endpoint

POST https://app.runstack.engineer/mcp

Protocol: Streamable HTTP (stateless JSON-RPC) Auth: Authorization: Bearer rsk_<your_api_key>

How it works

The server exposes 4 meta tools instead of 150+ individual tools. This prevents context bloat and lets the AI dynamically discover and execute exactly the tools it needs:

search_tools     →  find tools by regex pattern
check_authentication  →  verify a connector is linked
initiate_connection   →  get OAuth URL for a provider
execute_tool     →  run any registered tool by name

When you ask your MCP client to "create a GitHub issue", it:

  1. Calls search_tools("github.*issue") → finds github_create_issue
  2. Calls check_authentication("github_create_issue") → confirms your GitHub token is linked
  3. Calls execute_tool("github_create_issue", { owner, repo, title, body }) → creates the issue

Client setup

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "runstack": {
      "url": "https://app.runstack.engineer/mcp",
      "headers": {
        "Authorization": "Bearer rsk_YOUR_API_KEY"
      }
    }
  }
}

Restart Claude Desktop after saving.

Cursor

In Cursor's MCP settings (.cursor/mcp.json or via the UI):

{
  "runstack": {
    "url": "https://app.runstack.engineer/mcp",
    "headers": {
      "Authorization": "Bearer rsk_YOUR_API_KEY"
    }
  }
}

Custom agent (TypeScript)

import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';

const client = new Client({ name: 'my-agent', version: '1.0.0' });

const transport = new StreamableHTTPClientTransport(
  new URL('https://app.runstack.engineer/mcp'),
  {
    requestInit: {
      headers: { Authorization: 'Bearer rsk_YOUR_API_KEY' },
    },
  },
);

await client.connect(transport);

// List available tools
const tools = await client.listTools();
console.log(tools);

Custom agent (Python)

import httpx
import json

MCP_URL = "https://app.runstack.engineer/mcp"
API_KEY = "rsk_YOUR_API_KEY"

headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {API_KEY}",
}

payload = {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
        "name": "search_tools",
        "arguments": {"pattern": "github", "searchIn": "both"},
    },
    "id": 1,
}

response = httpx.post(MCP_URL, json=payload, headers=headers)
print(response.json())

Error responses

StatusMeaning
401Missing, invalid, or malformed API key
429Usage limit reached for this key
500Internal server error (see error.message)

CORS

The /mcp endpoint includes CORS headers for browser-based clients:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization

On this page