Signals. Infra
MCP server

Connect a client

Connect Codex, Claude Code, Cursor, or an MCP SDK to Signals Data MCP.

Signals Data MCP is a remote, read-only MCP server over Streamable HTTP:

https://api.signals.ai/api/infra/mcp

Use the same sk_live_… or sk_test_… key as the REST API. Create and rotate keys at developers.signals.ai. Keep the key in an environment variable or your client's secret store; never commit it.

Supported clients

ClientCurrent pathStatus
Codex CLI and IDE extensionRemote HTTP + API key environment variableSupported
Claude CodeRemote HTTP + Bearer headerSupported
Cursor and other MCP hostsRemote HTTP + Bearer headerSupported
Python, TypeScript, or another MCP SDKStreamable HTTP + Bearer headerSupported
Claude.ai and Claude DesktopCustom connector, OAuth sign-inSupported
ChatGPT webDeveloper mode custom connector, OAuth sign-inSupported
ChatGPT web app directoryPublished app listingNot listed yet
Claude.ai connector directoryPublished connector listingNot listed yet

The hosted endpoint publishes OAuth protected-resource metadata, so the two connector flows below sign you in with Clerk and need no API key. Public DIRECTORY distribution is a separate thing and is not approved yet — do not search an app store for Signals today. ChatGPT web does not read your local Codex MCP configuration.

Claude.ai and Claude Desktop

Settings → Connectors → Add custom connector, then paste:

https://api.signals.ai/api/infra/mcp

You will be sent to a Clerk sign-in. No API key is involved; the connector registers itself and stores an OAuth token.

ChatGPT

Developer mode is required, and it is a workspace-admin action on a Business or Enterprise/Edu plan — OpenAI states apps, full MCP support and developer mode are available to those plans on ChatGPT web. There is no Plus or Pro path today.

Signals needs no special tool shape: OpenAI removed the old requirement that a connected server expose both a search and a fetch tool ("No. They are no longer required."). Our search is search_companies, and retrieval is split across get_filing, get_transcript and get_ir_document so every result carries its own citation.

  1. An admin/owner enables developer mode — Settings → Apps → Advanced Settings, or Workspace Settings → Permissions & Roles → Connected Data → Developer mode / Create custom MCP connectors. Each admin enables it for themselves; the toggle is not workspace-wide. Enterprise/Edu can delegate via RBAC.

  2. Workspace Settings → Apps → Create:

    URL   https://api.signals.ai/api/infra/mcp
    Auth  OAuth
  3. Complete the Clerk sign-in, then wait for the tool scan to finish.

Custom connectors are not verified by OpenAI, so ChatGPT warns before connecting.

Codex

export SIGNALS_API_KEY=sk_live_…
codex mcp add signals --url https://api.signals.ai/api/infra/mcp \
  --bearer-token-env-var SIGNALS_API_KEY
codex mcp list

Restart the active Codex client after changing MCP configuration. Codex CLI, the IDE extension, and desktop surfaces on the same Codex host share this configuration. See the official Codex MCP guide.

Claude Code

Recent Claude Code releases support environment-variable expansion in MCP headers. Single quotes preserve the placeholder for Claude Code instead of expanding it into the shell command history:

export SIGNALS_API_KEY=sk_live_…
claude mcp add --transport http signals \
  https://api.signals.ai/api/infra/mcp \
  --header 'Authorization: Bearer ${SIGNALS_API_KEY}'
claude mcp list

Run /mcp inside Claude Code to inspect connection state. See the official Claude Code MCP guide.

Cursor or another JSON-configured host

Configure a remote HTTP server and inject the secret using that client's environment-variable syntax:

{
  "mcpServers": {
    "signals": {
      "url": "https://api.signals.ai/api/infra/mcp",
      "headers": {
        "Authorization": "Bearer ${SIGNALS_API_KEY}"
      }
    }
  }
}

Environment placeholder syntax differs between hosts. If your client does not expand ${SIGNALS_API_KEY}, use its encrypted secret store instead of putting a live key in a project-level config file.

Verify the endpoint directly

Initialize the server:

curl https://api.signals.ai/api/infra/mcp \
  -H "Authorization: Bearer $SIGNALS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'

Then list the model-facing contract:

curl https://api.signals.ai/api/infra/mcp \
  -H "Authorization: Bearer $SIGNALS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'

A healthy response identifies signals-infra version 1.1.0 and returns each tool's title, description, inputSchema, outputSchema, and read-only annotations.

Authentication failures

SymptomMeaningFix
HTTP 401, "detail": "Missing token."No Bearer token reached the serverConfigure the header or environment variable
HTTP 401, "detail": "Invalid api key."Key is malformed, revoked, or unknownCreate or rotate a key in the developer portal
HTTP 429Burst, daily, or concurrency limit reachedHonor Retry-After; do not retry in a tight loop
JSON-RPC -32602Tool name or arguments are invalidRefresh tools/list and validate against inputSchema

Next: read the tool contract, then copy a tested workflow.

On this page