@syndr-ai/mcp-server
v1.1.0
Published
MCP server for the Syndr public API
Readme
@syndr-ai/mcp-server
MCP (Model Context Protocol) server for the Syndr public API. Lets an MCP-compatible client (Claude Desktop, Cursor, etc.) manage campaigns, leads, thread monitors, reports, SEO presets, and eval cases over stdio.
Install
npm install -g @syndr-ai/mcp-serverOr run without installing:
npx @syndr-ai/mcp-serverConfiguration
Set environment variables before launching:
| Variable | Required | Default | Description |
| --- | --- | --- | --- |
| SYNDR_API_KEY | yes | — | API key from your Syndr account |
| SYNDR_API_URL | no | https://api.syndr.ai | Override for self-hosted or staging |
The server talks to ${SYNDR_API_URL}/api/v1/* with Authorization: Bearer ${SYNDR_API_KEY}.
Claude Desktop setup
Add to claude_desktop_config.json:
{
"mcpServers": {
"syndr": {
"command": "npx",
"args": ["-y", "@syndr-ai/mcp-server"],
"env": {
"SYNDR_API_KEY": "your-api-key"
}
}
}
}Tools
Campaigns
| Tool | Description |
| --- | --- |
| list_campaigns | List all campaigns (optional status filter) |
| get_campaign | Get a campaign by ID |
| create_campaign | Create a campaign (name, website, description, keywords, …) |
| update_campaign | Update name, keywords, status, selectivity, custom prompt, etc. |
| delete_campaign | Soft-delete a campaign |
Leads
| Tool | Description |
| --- | --- |
| list_leads | List leads for a campaign with filters (relevant, platform, search, pagination, sort) |
| get_lead | Get a single lead by ID |
Thread monitors
| Tool | Description |
| --- | --- |
| list_thread_monitors | List monitors with filters (status, contentStatus, campaignId, includeDeleted) |
| get_thread_monitor | Get a monitor by ID with metrics and content status |
| create_thread_monitor | Create a monitor from a Reddit URL |
| update_thread_monitor | Update status, keywords, campaign assignment |
| delete_thread_monitor | Soft-delete a monitor |
| refresh_thread_monitor | Fetch latest Reddit + SEO data |
| get_thread_monitor_history | Daily metric snapshots (up to 90 days) |
Reports
| Tool | Description |
| --- | --- |
| list_reports | List all reports with monitor counts |
| get_report | Get a report with populated monitors |
| create_report | Create a report (auto-generates a public share token) |
| update_report | Update name, description, visibility, content filtering |
| delete_report | Permanently delete a report |
| list_report_monitors | List monitors in a report with filters |
| add_monitors_to_report | Add monitors to a report |
| remove_monitors_from_report | Remove monitors from a report |
| get_public_report | View a public report by share token (no API key needed) |
Reddit SEO tool
Find high-ranking Reddit threads for target keywords.
| Tool | Description |
| --- | --- |
| list_reddit_seo_presets | List all SEO presets |
| create_reddit_seo_preset | Create a preset (1–20 keywords) |
| update_reddit_seo_preset | Update preset name or keywords |
| delete_reddit_seo_preset | Delete a preset |
| run_reddit_seo_preset | Kick off a run; returns a job ID |
| list_reddit_seo_jobs | List jobs for a preset (most recent first) |
| get_reddit_seo_results | Get ranked threads and comparison with previous run |
Keyword difficulty
Analyze how hard it is to rank Reddit posts on Google for target keywords.
| Tool | Description |
| --- | --- |
| list_keyword_difficulty_presets | List all keyword difficulty presets |
| create_keyword_difficulty_preset | Create a preset (1–20 keywords) |
| update_keyword_difficulty_preset | Update preset name or keywords |
| delete_keyword_difficulty_preset | Delete a preset |
| run_keyword_difficulty_preset | Kick off an analysis; returns a job ID |
| list_keyword_difficulty_jobs | List jobs for a preset |
| get_keyword_difficulty_results | Get difficulty scores, thread analysis, recommendations |
Rank tracker (agency-only)
Track Google SERP positions for individual Reddit threads over time. Requires role=AGENCY or ADMIN on the API key.
| Tool | Description |
| --- | --- |
| list_ranked_threads | List tracked threads (filter by status, includeDeleted) |
| get_ranked_thread | Get a thread with all tracked keywords and current SERP positions |
| create_ranked_thread | Start tracking a Reddit URL (comment URLs auto-normalize to parent thread) |
| update_ranked_thread | Pause/resume or change discovery cadence |
| delete_ranked_thread | Soft-delete a thread |
| refresh_ranked_thread_discovery | Run full keyword discovery (Ahrefs + DFS Labs + Gemini + SERP); 30–90s synchronous |
| refresh_ranked_thread_serp | Re-check SERP positions for existing keywords only — cheap interim check |
| add_ranked_thread_keywords | Manually add tracked keywords (up to 100/thread); enriched + SERP-checked inline |
| remove_ranked_thread_keywords | Remove manually-added keywords (auto-discovered ones cannot be removed) |
| get_ranked_thread_history | Daily SERP-position snapshots (up to 180 days) |
| list_ranked_thread_reports | List rank-tracker reports |
| get_ranked_thread_report | Get a report by ID |
| create_ranked_thread_report | Create a report (auto-generates a public share token) |
| update_ranked_thread_report | Update name, description, visibility, cadence override, thread membership |
| delete_ranked_thread_report | Permanently delete a report (threads stay tracked) |
| refresh_ranked_thread_report | Enqueue full discovery for every thread in the report (Bull-queued) |
| get_ranked_thread_report_refresh_status | Poll a batch refresh status |
| get_public_ranked_thread_report | Fetch a report by its public share token (no auth) |
Eval cases
Regression-test campaign relevancy logic.
| Tool | Description |
| --- | --- |
| list_eval_cases | List eval cases for a campaign |
| get_eval_case | Get a single eval case |
| create_eval_case | Create an eval case (post + expected relevancy) |
| update_eval_case | Update case content or expected flag |
| delete_eval_case | Delete an eval case |
| run_eval_cases | Run all cases against current (or overridden) settings |
| run_eval_cases_compare | Compare current vs proposed settings; shows improvements/regressions |
| import_leads_as_eval_cases | Bulk-import labeled leads as eval cases |
Testing
| Tool | Description |
| --- | --- |
| test_lead_relevancy | Test if a post would be flagged as a relevant lead for given settings |
| generate_response | Generate an AI response for a lead with brand guidelines |
Development
npm install
npm run dev # tsx src/index.ts
npm run build # tsc → dist/
npm start # node dist/index.jsLicense
Proprietary — © Syndr.
