Developers
DEVELOPERS · MCP

MCP server

api.signalraven.ai/mcp — an OAuth-gated Model Context Protocol server exposing your signals as tools an AI assistant can call.

Looking to just connect Claude or ChatGPT? See Connect to Claude / ChatGPT. This page is the technical reference.

Endpoint & transport

  • URLhttps://api.signalraven.ai/mcp
  • Transport — Streamable HTTP, JSON-RPC 2.0
  • Auth — OAuth 2.1 (the client discovers the authorization server automatically)

Discovery

Connectors find the authorization server via standard metadata:

  • api.signalraven.ai/.well-known/oauth-protected-resource (RFC 9728)
  • auth.signalraven.ai/.well-known/openid-configuration

A 401 from /mcp carries a WWW-Authenticate: Bearer resource_metadata="…" header so clients can auto-discover the flow.

Tools

ToolScopeDescription
list_signalsread:signalsList signals (limit, offset, type, minStrength)
get_signalread:signalsFetch one signal by id
list_sourcesread:sourcesList sources + metrics (period)
get_watchlistread:watchlistList watchlist posts
get_icpread:icpGet the workspace ICP profile

Results carry structuredContent.mode = "live" or "sample", mirroring the REST _meta.mode.

Approved vs. sample data

There are two permission layers — worth understanding the difference:

  1. You authorizing a client — “I let this app read my workspace” (OAuth consent, or creating an API key).
  2. SignalRaven approving a client to operate — a platform-level gate for third-party connectors.
Client stateResult
Your own API keyLive data immediately — auto-approved for your workspace
Approved third-party connectorLive data for workspaces users consent to
Pending / unknown connectorSample data + a prompt to get approved
Denied connector403 — no access

So an unknown agent that discovers the server can complete the handshake, see the tool list, and get a realistic taste — but never a real customer’s data — until a human at SignalRaven approves it.

// Example: list_signals tool call (JSON-RPC)
{ "jsonrpc": "2.0", "id": 1, "method": "tools/call",
  "params": { "name": "list_signals", "arguments": { "limit": 5 } } }