SignalSumo MCP Server
Model Context Protocol server for SignalSumo that lets Claude, Cursor, and other MCP-compatible clients read SEO data, run technical audits, research keywords, and check backlink profiles through natural-language tool calls.
README
@signalsumo/mcp
Model Context Protocol server for SignalSumo. Lets Claude, Cursor, and any other MCP-compatible client read your SEO data, run technical audits, research keywords, and check backlink profiles through natural-language tool calls.
Every tool wraps a real endpoint on the SignalSumo REST API (/api/v1/*). Auth, plan gating, quotas and billing all happen server-side — the MCP layer is a thin, well-typed shim.
What it exposes today
Eleven read-only tools. Every one reads data your SignalSumo account already holds — this server computes nothing of its own, so the "Produced by" column is the product that generates each dataset.
Rankings
| Tool | Wraps | Purpose | Produced by |
|---|---|---|---|
list_tracked_keywords |
GET /rank/keywords |
Every keyword you track, with country, device and current position | Rank Tracker |
get_rank_history |
GET /rank/history |
Daily position history for one keyword, plus the URL that ranked | Rank Tracker |
Research
| Tool | Wraps | Purpose | Produced by |
|---|---|---|---|
research_keyword |
POST /keyword-research |
Start keyword research (async — returns job_id) |
Keyword Research Tool |
get_backlinks |
GET /backlinks |
Backlink profile for any domain (paginated) | Backlink Checker |
Audits
| Tool | Wraps | Purpose | Produced by |
|---|---|---|---|
run_site_audit |
POST /site-audit |
Start a technical SEO audit (async — returns job_id) |
Website Audit Tool |
get_job_status |
GET /jobs/:id |
Poll any async job until done or failed |
— |
AI visibility
| Tool | Wraps | Purpose | Produced by |
|---|---|---|---|
list_ai_visibility_projects |
GET /ai-visibility/projects |
Brands you track across AI answer engines | AI Visibility Checker |
get_ai_share_of_voice |
GET /ai-visibility/share-of-voice |
How often each engine names you versus competitors | AI Visibility Checker |
Search Console
| Tool | Wraps | Purpose | Produced by |
|---|---|---|---|
list_gsc_properties |
GET /gsc/properties |
Connected Search Console properties | GSC Insights |
get_gsc_queries |
GET /gsc/queries |
Queries, clicks, impressions and position from GSC | GSC Insights |
Account
| Tool | Wraps | Purpose | Produced by |
|---|---|---|---|
get_api_usage |
GET /usage |
Current-month API usage, plan, quota reset date | Plans & pricing |
Reading is free. run_site_audit and research_keyword start work that consumes
plan credits; everything else reads data you have already paid for.
More tools follow the same pattern — one file per tool in src/tools/,
registered in src/index.ts. Full REST reference:
signalsumo.com/api-docs. Prefer no install?
The hosted connector speaks the same tools
over OAuth.
Quick start
1. Get an API key
Sign in to SignalSumo → API Keys → create a key. Copy it once — it won't be shown again.
2. Install
npm install -g @signalsumo/mcp
Or run without installing via npx:
npx -y @signalsumo/mcp
3. Wire it into your MCP client
Claude Desktop — edit claude_desktop_config.json:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"signalsumo": {
"command": "npx",
"args": ["-y", "@signalsumo/mcp"],
"env": {
"SIGNALSUMO_API_KEY": "sk_live_your_key_here"
}
}
}
}
Restart Claude Desktop. You should see the SignalSumo tools available in the tool picker.
Claude Code — add to ~/.claude/mcp_servers.json (same shape as above).
Cursor — Settings → MCP → Add a new server with command: npx, args: ["-y", "@signalsumo/mcp"], and set SIGNALSUMO_API_KEY in the env.
ChatGPT — this package will not help you, and that is not a limitation of the
package. ChatGPT connects to MCP servers as remote HTTPS connectors rather than
spawning a local process, so there is nothing for npx to do. Point it at the
hosted connector instead:
https://signalsumo.com/mcp
It exposes the same tools, authenticates with OAuth rather than an API key, and needs no install. Setup steps are at signalsumo.com/mcp-server.
The same applies to any client that takes a URL rather than a command — the split is stdio versus HTTP, not one vendor versus another.
4. Try it
Ask Claude:
"What SEO tools do I have available through SignalSumo? Check my API usage first."
Claude will call get_api_usage and describe what it can do with the other tools.
Local development
git clone https://github.com/signalsumo/mcp
cd mcp
npm install
cp .env.example .env # add your key
npm run build
SIGNALSUMO_API_KEY=sk_live_... node dist/index.js
Point Claude Desktop at your local build — replace the path with wherever you cloned the repo:
{
"mcpServers": {
"signalsumo-dev": {
"command": "node",
"args": ["/path/to/signalsumo-mcp/dist/index.js"],
"env": {
"SIGNALSUMO_API_KEY": "sk_live_..."
}
}
}
}
Hosted / multi-tenant mode (HTTP + SSE)
The package ships a second entry point for self-hosting the MCP server as a shared HTTP endpoint. This is what remote MCP clients (claude.ai's remote MCP registry, hosted Cursor, browser-based inspectors) connect to.
Transport: Streamable HTTP per the MCP 2025-06-18 spec — POST for client → server calls, GET for the SSE stream, DELETE to end a session. Session isolation is per-connection; each session gets its own Server + SignalSumoClient so keys and state never leak between users.
Auth: every request must carry Authorization: Bearer <signalsumo_api_key>. The key is resolved at session-init and used for every subsequent call in that session — the process itself holds no keys.
Run the HTTP server
npm run start:http
# or as an installed bin:
signalsumo-mcp-http
Env vars:
MCP_PORT— port to listen on (default3000)MCP_HOST— bind address (default0.0.0.0)SIGNALSUMO_API_BASE— API base URL (defaulthttps://signalsumo.com/api/v1)
Endpoints
| Method | Path | Purpose |
|---|---|---|
GET |
/healthz |
Liveness probe. Returns {ok, transport, sessions}. No auth. |
POST |
/mcp |
Every client → server MCP call. First call in a session must be initialize — server responds with an Mcp-Session-Id header that subsequent calls must echo. |
GET |
/mcp |
SSE stream for server → client notifications and streamed tool results. Requires Mcp-Session-Id. |
DELETE |
/mcp |
Cleanly terminate a session. Requires Mcp-Session-Id. |
Reverse proxy
Put it behind nginx/Caddy on a subdomain (e.g. mcp.signalsumo.com), terminate TLS there, and forward /mcp to the Node process. SSE requires HTTP/1.1 with buffering disabled — nginx snippet:
location /mcp {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Authorization $http_authorization;
proxy_buffering off; # critical for SSE
proxy_cache off;
proxy_read_timeout 24h;
chunked_transfer_encoding off;
}
Point a client at the hosted server
For MCP clients that accept a URL + Bearer token (e.g. custom scripts, MCP Inspector, ChatGPT, remote-server support in Claude clients), SignalSumo runs a hosted endpoint — nothing to deploy:
URL: https://signalsumo.com/mcp
Header: Authorization: Bearer sk_live_...
That endpoint also speaks OAuth 2.1, which is what the Claude and ChatGPT connector flows use instead of a raw key — see the section below and signalsumo.com/mcp-server.
If you have self-hosted this package on your own subdomain, substitute your own
host and /mcp path in the URL above.
OAuth 2.1 (for the claude.ai/mcp remote registry)
OAuth is handled by the SignalSumo authorization server at https://signalsumo.com — the MCP HTTP endpoint here is just the resource server. MCP clients that speak OAuth 2.1 (Claude Desktop's remote MCP support, claude.ai/mcp) discover everything automatically:
- Client hits
/mcpwithout a token → server replies 401 withWWW-Authenticate: Bearer error="unauthorized", resource_metadata="https://signalsumo.com/.well-known/oauth-protected-resource" - Client fetches the resource metadata → learns the authorization server is
https://signalsumo.com - Client fetches
https://signalsumo.com/.well-known/oauth-authorization-server→ learns the endpoints - Client POSTs to
/oauth/register→ gets aclient_id(Dynamic Client Registration, RFC 7591) - Client opens
/oauth/authorize?...in a browser tab → user logs into SignalSumo and clicks "Authorize" - Client POSTs to
/oauth/tokenwith the auth code + PKCE verifier → gets an access token - Client uses the access token as
Authorization: Bearer <token>on/mcp
The access token is validated by SignalSumo's ApiAuth — the same class that validates raw API keys — so the MCP server itself doesn't need to know about OAuth. Access tokens live 1 hour; refresh tokens are rotated on every use per OAuth 2.1.
Architecture
src/
├── index.ts # stdio entry (single-user, Claude Desktop / Cursor)
├── server-http.ts # HTTP + SSE entry (multi-tenant, self-hosted)
├── build-server.ts # shared: builds an MCP Server with all tools registered
├── client.ts # Axios wrapper around SignalSumo /api/v1
└── tools/
├── types.ts # Shared ToolDefinition interface
├── usage.ts # get_api_usage
├── backlinks.ts # get_backlinks
├── site_audit.ts # run_site_audit (async)
├── keyword_research.ts # research_keyword (async)
├── job_status.ts # get_job_status
├── rank_keywords.ts # list_tracked_keywords
├── rank_history.ts # get_rank_history
├── gsc_properties.ts # list_gsc_properties
├── gsc_queries.ts # get_gsc_queries
├── ai_visibility_projects.ts # list_ai_visibility_projects
└── ai_share_of_voice.ts # get_ai_share_of_voice
Both transports register the same tools — the only difference is where the API key comes from (env var for stdio, per-request header for HTTP).
Adding a new tool — copy an existing file in src/tools/, wire the Zod input schema, call client.get() / client.post(), then register it in the tools array in src/index.ts. Rebuild, restart your MCP client, done.
Boundaries
The MCP inherits your API key's trust level. It can do anything the key can do — no more, no less. Endpoints intentionally not exposed as tools even though they exist on the REST API:
- Billing / plan changes / credit purchases
- User account or password reset
- Team management
- Admin-only endpoints
Roadmap
- [x] Read-only rank tracker tools (
list_tracked_keywords,get_rank_history) - [x] Read-only AI visibility tools (
list_ai_visibility_projects,get_ai_share_of_voice) - [x] Read-only GSC tools (
list_gsc_properties,get_gsc_queries) - [x] HTTP + SSE transport (in addition to stdio)
- [x] OAuth 2.1 flow for the claude.ai/mcp remote registry
- [ ] Write-capable rank tracker tools (
add_keyword_to_tracker,trigger_rank_scan) - [ ] Local SEO tools (grid rank, review AI, citation status)
- [ ] Report generation (
generate_executive_report)
License
MIT
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。