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)

  1. Open Claude → Customize → Connectors → + → Add custom connector.
  2. Paste this URL:
    https://app.signalkit.ai/api/mcp
  3. 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.
  4. 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/mcp

With 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 signalkit

With 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_KEY

ChatGPT

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-server

An 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:

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.

ToolWhat it doesKeyStatus
list_organizationsChoose an organization you belong toreadLive
list_app_operationsDiscover registered app reads, changes and signed-in handoffs; mutation inputs are labelled as validation schemas or field hintsreadLive
read_appRun a discovered app read with your connection's own accessreadLive
change_appRun a discovered app change with your connection's own access; work an API key may not do returns a dashboard handoffwriteLive
list_projectsList your projectsreadLive
create_projectNew project for a new brand; creates its own-brand rowwriteLive
list_segmentsThe project's segments: a named subset of its prompts plus the brands it compares against. Where a measurement tool's segmentId comes fromreadLive
list_brandsTracked brands with lifetime mention rate (counts included), mentions, position, sentimentreadLive
add_brandTrack a brand (typically a competitor)writeLive
delete_brandStop tracking a brandwriteLive
list_promptsTracked prompts and query configuration; use list_results for measurementsreadLive
add_promptAdd a prompt to run against the platforms (billed)writeLive
delete_promptArchive a promptwriteLive
suggest_promptsAI-generated prompt suggestions through the app's own suggestion routewriteLive
run_prompt_nowRun a prompt across its configured platforms now; one manual round every 7 days; a prompt in a switched-off project is refused (project_inactive)writeLive
get_overviewThe 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 segmentIdreadLive
get_ai_attributionObserved 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 evidencereadLive
get_measurement_calibrationRead separately supplied consumer observations and exact-name presence agreement; selected samples do not adjust dashboard ratesreadLive
get_measurement_profileRead 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 modelreadLive
get_answer_accuracyReference-backed turnaround, biomarker-count, sample-type and fasting-required checks with source-labelled expected values and validated answer quotesreadLive
get_product_prompt_scopesList active prompts, their catalogue assignments and searchable catalogue choices without running matchingreadLive
get_catalogue_suggestionsRead the current catalogue suggestion draft and setup without model spendreadLive
suggest_catalogue_monitoringGenerate catalogue-grounded segments, topics, prompts and applicability for review using the prompt-suggestion allowancewriteLive
record_consumer_observationRecord a separate consumer answer paired with a stored API answer for the same platform, prompt and region; buys no model callwriteLive
set_product_factsSet or clear manual turnaround, biomarker-count, sample-type and fasting-required facts without spending or reanalysing answerswriteLive
set_product_monitoring_roleClassify catalogue products as primary offerings, add-ons or unclassified without spendingwriteLive
set_product_prompt_scopeAssign prompts to the whole catalogue, selected collections or selected products without running matchingwriteLive
get_query_fanoutThe searches the platforms ran; unexposed platforms reported as unknown, never zeroreadLive
get_healthThe data doctor: stored check outcomes by id, and whether monitoring is paused for billingreadLive
get_opportunitiesThe stored weekly brief with evidence links; never generates onereadLive
list_resultsRaw LLM responses (truncated, injection-wrapped) with matched brands and citationsreadLive
list_sourcesPages or domains cited in the project's answers, with the denominator and ownershipreadLive
get_source_detailOne cited page or domain: pass its urls or domains view for exact grouping, with citing prompts, platforms and a bounded answer samplereadLive
discover_source_contactsRead public contact links from a cited source and linked contact pages; candidates require review and no message is sentwriteLive
get_source_outreachRead a cited source's saved public contact, pitch draft and tracked status; never sendsreadLive
update_source_outreachSave a user-supplied public contact, pitch draft and tracked status; never sendswriteLive
list_source_changesSources that arrived or fell away against the previous period, plus citation persistencereadLive
list_competitor_only_promptsPrompts whose answers cite a competitor and never youreadLive
list_alertsAlert episodes with status, severity, evidence and your read statereadLive
mark_alert_readMark an episode read for youwriteLive
acknowledge_alertAcknowledge an open episode (project write access)writeLive
resolve_alertResolve an open episode; a recurrence opens a new onewriteLive
reopen_alertTake a resolution back; refused while a recurrence of the same signal is openwriteLive
list_auditsSite audits run from the projectreadLive
get_auditOne audit's scores, findings, summary and probe resultsreadLive
get_geo_checklistDiscoverability checklist from the latest own-site audit, plus the generated site items in the project's To do listreadLive
run_site_auditStart a paid site audit; idempotent per key, 2 audits per project every 30 dayswriteLive
list_reportsPreviously generated reportsreadLive
generate_reportGenerate a CSV / JSON / PDF report through the app's own report routewriteLive
get_billingPrompt-region units, monthly cost, subscription, balancereadLive
get_settingsRead stored notification settingsreadLive
update_settingsUpdate stored notification settingswriteLive
list_content_workThe content production and review queue, with its stage countsreadLive
list_content_libraryIndexed pages and generated artifacts across the project's destinationsreadLive
get_content_artifactOne artifact: revisions, checks, reviews, approvals, publication attempts, decisionsreadLive
create_content_draftStore a brief or draft you wrote yourself; buys nothingwriteLive
generate_content_revisionWrite the next revision with SignalKit's pipeline; spends the content allowancewriteLive

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.