Quickstart
MCP quickstart
Endpoint
https://connect.onesilo.com/mcp1. 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.
curl -s https://api.onesilo.com/.well-known/oauth-authorization-server2. Register your app (DCR)
Most MCP SDKs do this for you. Manually, POST to the OAuth registration endpoint with your redirect URI(s).
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.
# 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
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"
}'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.