curl https://mcp.bundleup.io \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "BU-Connection-Id: conn_abc123" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
const { url, headers } = bundleup.mcp('conn_abc123').transport();
const mcp = new Client({ name: 'my-agent', version: '1.0.0' });
await mcp.connect(new StreamableHTTPClientTransport(new URL(url), { requestInit: { headers } }));
const { tools } = await mcp.listTools();
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{
"name": "create_issue",
"description": "Create a new issue",
"inputSchema": { "type": "object", "properties": { "title": { "type": "string" } } }
}
]
}
}
{ "status": 400, "code": "mcp_not_supported", "message": "MCP is not supported for this integration" }
Proxy & MCP
MCP
Forward MCP messages to the connected provider’s MCP server with the user’s credentials.
POST
/
curl https://mcp.bundleup.io \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "BU-Connection-Id: conn_abc123" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
const { url, headers } = bundleup.mcp('conn_abc123').transport();
const mcp = new Client({ name: 'my-agent', version: '1.0.0' });
await mcp.connect(new StreamableHTTPClientTransport(new URL(url), { requestInit: { headers } }));
const { tools } = await mcp.listTools();
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{
"name": "create_issue",
"description": "Create a new issue",
"inputSchema": { "type": "object", "properties": { "title": { "type": "string" } } }
}
]
}
}
{ "status": 400, "code": "mcp_not_supported", "message": "MCP is not supported for this integration" }
The streamable HTTP MCP endpoint. Send JSON-RPC MCP messages with
POST, open a server stream with GET, and end a session with DELETE. Each message goes to the MCP server of the connection’s provider, with the user’s access token. Bodies and responses pass through unchanged.
Guides: MCP overview, How Proxy MCP works, Using MCP clients.
Headers
string
required
Bearer YOUR_API_KEY, or Bearer YOUR_API_KEY.CONNECTION_ID for clients that accept only one credential. Replaced with the user’s token before forwarding.string
The connection to use. Required unless it’s appended to the API key.
string
The session ID returned by the provider on
initialize. Passed through.string
Usually
application/json, text/event-stream. Passed through.Body
A JSON-RPC 2.0 MCP message, passed through unchanged.Response
The provider’s response, unchanged: JSON ortext/event-stream, with the provider’s Mcp-Session-Id. If BundleUp rejects the request first, you get an HTTP error with a JSON body, not a JSON-RPC error. See errors.
Behaviour
- The URL path and query string are ignored. The connection selects the upstream server.
- No retries.
- Every message counts toward the 100-per-60-seconds limit per connection.
curl https://mcp.bundleup.io \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "BU-Connection-Id: conn_abc123" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
const { url, headers } = bundleup.mcp('conn_abc123').transport();
const mcp = new Client({ name: 'my-agent', version: '1.0.0' });
await mcp.connect(new StreamableHTTPClientTransport(new URL(url), { requestInit: { headers } }));
const { tools } = await mcp.listTools();
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{
"name": "create_issue",
"description": "Create a new issue",
"inputSchema": { "type": "object", "properties": { "title": { "type": "string" } } }
}
]
}
}
{ "status": 400, "code": "mcp_not_supported", "message": "MCP is not supported for this integration" }
Was this page helpful?

