MCP
Setu runs a Model Context Protocol server over streamable HTTP, so Cursor, Claude Desktop, Claude Code and other MCP clients can use your connected apps with no code.
Create a session#
curl -X POST $SETU_BASE_URL/v1/sessions \
-H "authorization: Bearer $SETU_API_KEY" \
-H "content-type: application/json" \
-d '{"user_id":"user_1","toolkits":["github","slack"]}'{
"session_id": "ses_...",
"mcp_url": "https://api.setuagent.com/v1/mcp/ses_...",
"expires_at": "2026-10-14T09:00:00.000Z"
}Paste mcp_url into the client. For Claude Code:
claude mcp add --transport http setu "https://api.setuagent.com/v1/mcp/ses_..."Treat the URL as a secret. It carries 256 bits of randomness and no other credential. Create one session
per end user, keep the lifetime short (ttl_seconds), and never put it in a log or a shared channel.
Dynamic mode (default)#
The server exposes four meta-tools, so the model never has to load the whole catalog:
| Tool | Purpose |
|---|---|
SETU_SEARCH_TOOLS |
Find tools by describing the task |
SETU_GET_TOOL_SCHEMA |
Fetch the input schema for one tool |
SETU_EXECUTE_TOOL |
Run a tool with arguments |
SETU_CONNECT |
Get a link for the user to connect a toolkit that is not connected yet |
If the model tries a toolkit the user has not connected, the result includes a connect_url it can show to the user.
Static mode#
Pass "mode": "static" with an explicit actions list to register each action as its own MCP tool.
Use it when you want a small, fixed tool surface:
{ "user_id": "user_1", "mode": "static", "actions": ["github.create_issue", "slack.post_message"] }Limits#
Sessions expire after ttl_seconds. Calls made through MCP count against the same rate limits and monthly
quota as REST calls, and appear in the same execution log.