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/mcpUse 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
| Client | Current path | Status |
|---|---|---|
| Codex CLI and IDE extension | Remote HTTP + API key environment variable | Supported |
| Claude Code | Remote HTTP + Bearer header | Supported |
| Cursor and other MCP hosts | Remote HTTP + Bearer header | Supported |
| Python, TypeScript, or another MCP SDK | Streamable HTTP + Bearer header | Supported |
| Claude.ai and Claude Desktop | Custom connector, OAuth sign-in | Supported |
| ChatGPT web | Developer mode custom connector, OAuth sign-in | Supported |
| ChatGPT web app directory | Published app listing | Not listed yet |
| Claude.ai connector directory | Published connector listing | Not 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/mcpYou 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.
-
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.
-
Workspace Settings → Apps → Create:
URL https://api.signals.ai/api/infra/mcp Auth OAuth -
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 listRestart 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 listRun /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
| Symptom | Meaning | Fix |
|---|---|---|
HTTP 401, "detail": "Missing token." | No Bearer token reached the server | Configure the header or environment variable |
HTTP 401, "detail": "Invalid api key." | Key is malformed, revoked, or unknown | Create or rotate a key in the developer portal |
HTTP 429 | Burst, daily, or concurrency limit reached | Honor Retry-After; do not retry in a tight loop |
JSON-RPC -32602 | Tool name or arguments are invalid | Refresh tools/list and validate against inputSchema |
Next: read the tool contract, then copy a tested workflow.