SignalKit Connector for Claude
Ask Claude about your brand's mention rate, which sources the platforms cite, what they searched for, what is open on the alert shelf, how your site audits scored and what is in the content queue; add prompts, close alerts, start an audit and write a draft — all from inside the chat. Any connection can also discover the registered app operations and run the ones its credential may reach. Signed in with OAuth, an agent can do ordinary work your role allows. Clinical certification and publishing require you to act in the app; changing billing also needs the owner's permission there.
Install (Claude.ai + Claude Desktop)
- Open Claude → Customize → Connectors → + → Add custom connector.
- Paste this URL:
https://app.signalkit.ai/api/mcp - Click Add. Claude will redirect you to sign in to SignalKit (via Clerk). Approve, and you'll bounce back to Claude with the connector installed.
- Try it: ask Claude "How is my brand doing in AI search this week?"
Set up any MCP client
Clients that take a remote server by URL connect to the hosted endpoint directly and sign in with OAuth. For a client that cannot sign in, or a narrower credential, create a key at account / API keys — a read key for an agent that reports, a write key only when it should add prompts, close alerts or start audits — and use the API-key variant for your client, which reads the key from SIGNALKIT_API_KEY or prompts for it.
Claude.ai and Claude Desktop
Customize → Connectors → + → Add custom connector, paste https://app.signalkit.ai/api/mcp, click Add, then sign in to SignalKit when asked. The connector then appears in Claude Desktop too.
With an API key: Custom connectors sign in with OAuth and take no API-key header. To pin a narrower key in Claude Desktop, run the local stdio server below with that key.
Claude Code
Add the server, then run /mcp inside Claude Code and sign in from the browser.
claude mcp add --transport http signalkit https://app.signalkit.ai/api/mcpWith an API key: Pass the key as a header instead of signing in; the shell fills it in from SIGNALKIT_API_KEY.
claude mcp add --transport http signalkit https://app.signalkit.ai/api/mcp \
--header "Authorization: Bearer $SIGNALKIT_API_KEY"Cursor
Add the server to .cursor/mcp.json (or ~/.cursor/mcp.json for every project); Cursor runs the OAuth sign-in when the server asks for it.
{
"mcpServers": {
"signalkit": {
"url": "https://app.signalkit.ai/api/mcp"
}
}
}With an API key: Add a header that reads the key from SIGNALKIT_API_KEY.
{
"mcpServers": {
"signalkit": {
"url": "https://app.signalkit.ai/api/mcp",
"headers": { "Authorization": "Bearer ${env:SIGNALKIT_API_KEY}" }
}
}
}VS Code
Add the server to .vscode/mcp.json; VS Code opens a browser to sign in on the first connection.
{
"servers": {
"signalkit": {
"type": "http",
"url": "https://app.signalkit.ai/api/mcp"
}
}
}With an API key: VS Code prompts for the key once and stores it outside the file.
{
"inputs": [
{
"type": "promptString",
"id": "signalkit-key",
"description": "SignalKit API key",
"password": true
}
],
"servers": {
"signalkit": {
"type": "http",
"url": "https://app.signalkit.ai/api/mcp",
"headers": { "Authorization": "Bearer ${input:signalkit-key}" }
}
}
}OpenAI Codex CLI
Add the server, then sign in.
codex mcp add signalkit --url https://app.signalkit.ai/api/mcp
codex mcp login signalkitWith an API key: Codex sends the key from SIGNALKIT_API_KEY as a bearer token.
codex mcp add signalkit --url https://app.signalkit.ai/api/mcp \
--bearer-token-env-var SIGNALKIT_API_KEYChatGPT
On the web (Plus, Pro, Business, Enterprise, Edu): Settings → Security and login → turn on Developer mode. Then chatgpt.com/plugins → +, name it, enter https://app.signalkit.ai/api/mcp under Connection and choose OAuth. Add it to a chat from the tools menu.
With an API key: Developer-mode apps sign in with OAuth and take no API-key header.
Keep the key out of anything you commit. A key can carry an expiry; set one for an agent you will not be watching. Then try: "Which sources cite my competitors but not me?"
Local stdio, from a source checkout
packages/mcp in the source tree is a stdio server over the same REST API, for a client that runs a command rather than taking a URL. It is not published to npm. Build it (pnpm install --frozen-lockfile && pnpm build in that directory) and point the client at the built file:
{
"mcpServers": {
"signalkit": {
"command": "node",
"args": ["/absolute/path/to/packages/mcp/dist/index.js"],
"env": { "SIGNALKIT_API_KEY": "sk_live_…" }
}
}
}Auth
SignalKit's MCP server speaks OAuth 2.0 with Dynamic Client Registration (RFC 7591). The discovery endpoint is:
https://signalkit.ai/.well-known/oauth-authorization-serverAn OAuth token is the person's own credential: every tool, with exactly the projects and role that person has in the organization, including drafts, brands, members and API keys. Clinical certification and publishing require a signed-in human action in the app. Billing changes run only if the owner has turned on “Allow agents to change billing” under Account; no agent can turn that on. Over an API key, that work returns a dashboard link instead. An API key is the alternative for a client that cannot sign in, and it can be narrower on two independent axes, chosen when it is minted and not editable afterwards:
- Scope — which projects it reaches: every project in the organization, or a fixed set.
- Access mode — what it may do inside them. A read key is offered only the read tools in the table below (
tools/listomits the rest) and is refused a write tool if it calls one anyway. A write key adds the tools that create, change, run, close or spend. New keys are read-only unless they ask for write.
Neither axis widens the other, and a key with an expiry is refused before any tool runs once it has passed. The key goes in the header:
Authorization: Bearer sk_live_…Tools
The connector exposes 57 tools: 33 reads and 24 writes. If your OAuth token has no organization claim, call list_organizations and pass its id as organizationId to tenant tools. Project tools use your default project unless you pass a projectId arg; run_site_audit requires one, because the audit and its spend are booked to it. Reads never trigger paid work: get_opportunities serves the stored brief and get_health the stored check outcomes.
Start with list_app_operations before using read_app or change_app. Every operation lists the parameters its route reads; a route on the operation registry also publishes the validation schema it enforces, and for the others the route stays authoritative for types, required fields and nested objects. An operation your connection may not perform returns the relevant dashboard URL without making the change.
Some clients cache tool schemas for a conversation. If a newly added parameter is rejected before SignalKit receives the call, reconnect the connector or start a new conversation to load the current schema.
| Tool | What it does | Key | Status |
|---|---|---|---|
list_organizations | Choose an organization you belong to | read | Live |
list_app_operations | Discover registered app reads, changes and signed-in handoffs; mutation inputs are labelled as validation schemas or field hints | read | Live |
read_app | Run a discovered app read with your connection's own access | read | Live |
change_app | Run a discovered app change with your connection's own access; work an API key may not do returns a dashboard handoff | write | Live |
list_projects | List your projects | read | Live |
create_project | New project for a new brand; creates its own-brand row | write | Live |
list_segments | The project's segments: a named subset of its prompts plus the brands it compares against. Where a measurement tool's segmentId comes from | read | Live |
list_brands | Tracked brands with lifetime mention rate (counts included), mentions, position, sentiment | read | Live |
add_brand | Track a brand (typically a competitor) | write | Live |
delete_brand | Stop tracking a brand | write | Live |
list_prompts | Tracked prompts and query configuration; use list_results for measurements | read | Live |
add_prompt | Add a prompt to run against the platforms (billed) | write | Live |
delete_prompt | Archive a prompt | write | Live |
suggest_prompts | AI-generated prompt suggestions through the app's own suggestion route | write | Live |
run_prompt_now | Run a prompt across its configured platforms now; one manual round every 7 days; a prompt in a switched-off project is refused (project_inactive) | write | Live |
get_overview | The dashboard Overview as the page computes it: mention and cited rates with their counts, the four tiles with like-for-like deltas, brand rankings and share of voice; takes a range, filters and a segmentId | read | Live |
get_ai_attribution | Observed citations beside attributable GA4 sessions and key events; page keys lead to exact answer evidence via get_source_detail view urls, and absent GA4 includes its setup link and gaCompleteness identifies partial page evidence | read | Live |
get_measurement_calibration | Read separately supplied consumer observations and exact-name presence agreement; selected samples do not adjust dashboard rates | read | Live |
get_measurement_profile | Read configured requested models, search capability, cadence and active prompt-region schedule; attempt counts are configured maxima and provider-reported served-model status remains per answer; runs no model | read | Live |
get_answer_accuracy | Reference-backed turnaround, biomarker-count, sample-type and fasting-required checks with source-labelled expected values and validated answer quotes | read | Live |
get_product_prompt_scopes | List active prompts, their catalogue assignments and searchable catalogue choices without running matching | read | Live |
get_catalogue_suggestions | Read the current catalogue suggestion draft and setup without model spend | read | Live |
suggest_catalogue_monitoring | Generate catalogue-grounded segments, topics, prompts and applicability for review using the prompt-suggestion allowance | write | Live |
record_consumer_observation | Record a separate consumer answer paired with a stored API answer for the same platform, prompt and region; buys no model call | write | Live |
set_product_facts | Set or clear manual turnaround, biomarker-count, sample-type and fasting-required facts without spending or reanalysing answers | write | Live |
set_product_monitoring_role | Classify catalogue products as primary offerings, add-ons or unclassified without spending | write | Live |
set_product_prompt_scope | Assign prompts to the whole catalogue, selected collections or selected products without running matching | write | Live |
get_query_fanout | The searches the platforms ran; unexposed platforms reported as unknown, never zero | read | Live |
get_health | The data doctor: stored check outcomes by id, and whether monitoring is paused for billing | read | Live |
get_opportunities | The stored weekly brief with evidence links; never generates one | read | Live |
list_results | Raw LLM responses (truncated, injection-wrapped) with matched brands and citations | read | Live |
list_sources | Pages or domains cited in the project's answers, with the denominator and ownership | read | Live |
get_source_detail | One cited page or domain: pass its urls or domains view for exact grouping, with citing prompts, platforms and a bounded answer sample | read | Live |
discover_source_contacts | Read public contact links from a cited source and linked contact pages; candidates require review and no message is sent | write | Live |
get_source_outreach | Read a cited source's saved public contact, pitch draft and tracked status; never sends | read | Live |
update_source_outreach | Save a user-supplied public contact, pitch draft and tracked status; never sends | write | Live |
list_source_changes | Sources that arrived or fell away against the previous period, plus citation persistence | read | Live |
list_competitor_only_prompts | Prompts whose answers cite a competitor and never you | read | Live |
list_alerts | Alert episodes with status, severity, evidence and your read state | read | Live |
mark_alert_read | Mark an episode read for you | write | Live |
acknowledge_alert | Acknowledge an open episode (project write access) | write | Live |
resolve_alert | Resolve an open episode; a recurrence opens a new one | write | Live |
reopen_alert | Take a resolution back; refused while a recurrence of the same signal is open | write | Live |
list_audits | Site audits run from the project | read | Live |
get_audit | One audit's scores, findings, summary and probe results | read | Live |
get_geo_checklist | Discoverability checklist from the latest own-site audit, plus the generated site items in the project's To do list | read | Live |
run_site_audit | Start a paid site audit; idempotent per key, 2 audits per project every 30 days | write | Live |
list_reports | Previously generated reports | read | Live |
generate_report | Generate a CSV / JSON / PDF report through the app's own report route | write | Live |
get_billing | Prompt-region units, monthly cost, subscription, balance | read | Live |
get_settings | Read stored notification settings | read | Live |
update_settings | Update stored notification settings | write | Live |
list_content_work | The content production and review queue, with its stage counts | read | Live |
list_content_library | Indexed pages and generated artifacts across the project's destinations | read | Live |
get_content_artifact | One artifact: revisions, checks, reviews, approvals, publication attempts, decisions | read | Live |
create_content_draft | Store a brief or draft you wrote yourself; buys nothing | write | Live |
generate_content_revision | Write the next revision with SignalKit's pipeline; spends the content allowance | write | Live |
Programmatic discovery
The connector advertises a standard MCP server card at /.well-known/mcp/server-card.json with tool names, OAuth endpoints, and capability flags. Anthropic's marketplace reads this card; other MCP clients can too.
Example session (raw JSON-RPC)
For curl-driven testing, the streamable-HTTP endpoint takes a JSON-RPC request and returns a JSON-RPC response:
# Initialize
curl -sX POST https://app.signalkit.ai/api/mcp \
-H "Authorization: Bearer sk_live_…" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'
# List tools
curl -sX POST https://app.signalkit.ai/api/mcp \
-H "Authorization: Bearer sk_live_…" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
# Call a tool
curl -sX POST https://app.signalkit.ai/api/mcp \
-H "Authorization: Bearer sk_live_…" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_overview","arguments":{}}}'
# Start a paid audit — a retry with the same idempotencyKey buys nothing
curl -sX POST https://app.signalkit.ai/api/mcp \
-H "Authorization: Bearer sk_live_…" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"run_site_audit","arguments":{"projectId":"<uuid>","url":"https://example.com","idempotencyKey":"audit-2026-09-16"}}}'Support
Bug reports + feature requests: hello@signalkit.ai.