Silo

Quickstart

MCP quickstart

The Silo MCP gateway speaks Streamable HTTP at a single canonical endpoint. Any spec-compliant MCP client can list and call tools once it has an OAuth bearer for an authorized connection.

Endpoint

URL
https://connect.onesilo.com/mcp
Transport
Streamable HTTP (single POST endpoint, no SSE upgrade required)
Auth
Bearer token from an OAuth connection. Register your client via Dynamic Client Registration (DCR), then complete the user consent flow once per end-user.

1. Discover the OAuth endpoints

The gateway publishes RFC 8414 authorization-server metadata — registration, authorize, and token endpoints, plus supported grants (authorization_code, refresh_token) and PKCE methods. MCP SDKs bootstrap from this automatically.

discover.sh
curl -s https://api.onesilo.com/.well-known/oauth-authorization-server

2. Register your app (DCR)

Most MCP SDKs do this for you. Manually, POST to the OAuth registration endpoint with your redirect URI(s).

register-client.sh
curl -X POST https://api.onesilo.com/oauth/register \
  -H "Content-Type: application/json" \
  -d '{
    "client_name": "Cool App",
    "redirect_uris": ["https://coolapp.example.com/auth/callback"],
    "grant_types": ["authorization_code", "refresh_token"]
  }'

3. Authorize a user

Redirect the user to https://api.onesilo.com/oauth/authorize with the standard PKCE parameters. After they pick which services to share, Silo redirects back with a code; exchange it at https://api.onesilo.com/oauth/token for a bearer.

See OAuth + services for the full flow including service selection and the auto-provisioned default silo that lands on the connection.

4. Initialize a session

Streamable HTTP is stateful: the server issues an Mcp-Session-Id on initialize, and every later request must carry it. MCP SDKs handle this handshake for you — the raw sequence matters only if you're calling with curl. Note the Accept header: the gateway can answer as JSON or as a single SSE event, and requires clients to accept both.

initialize.sh
# 1. initialize — the session id arrives as the Mcp-Session-Id
#    response header; capture it straight into $SESSION_ID
SESSION_ID=$(curl -si -X POST https://connect.onesilo.com/mcp \
  -H "Authorization: Bearer $SILO_BEARER" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2025-06-18",
      "capabilities": {},
      "clientInfo": { "name": "cool-app", "version": "1.0.0" }
    }
  }' | grep -i '^mcp-session-id:' | cut -d' ' -f2 | tr -d '\r')

# 2. acknowledge the handshake with that session id
curl -s -X POST https://connect.onesilo.com/mcp \
  -H "Authorization: Bearer $SILO_BEARER" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "Mcp-Session-Id: $SESSION_ID" \
  -d '{ "jsonrpc": "2.0", "method": "notifications/initialized" }'

5. List and call tools

list-tools.sh
curl -X POST https://connect.onesilo.com/mcp \
  -H "Authorization: Bearer $SILO_BEARER" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "Mcp-Session-Id: $SESSION_ID" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/list"
  }'
call-tool.sh
curl -X POST https://connect.onesilo.com/mcp \
  -H "Authorization: Bearer $SILO_BEARER" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "Mcp-Session-Id: $SESSION_ID" \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
      "name": "silo_ask",
      "arguments": {
        "silo_id": "default",
        "question": "What did I discuss with Asher last week?"
      }
    }
  }'

The string "default"is a reserved alias for the connection's auto-provisioned default silo — see Default silo.