MCP server
Connect Claude, Cursor and other AI agents to BuzzGlean through the Model Context Protocol.
BuzzGlean runs a remote Model Context Protocol server. Connect it to an AI assistant and ask in plain words: "What did people complain about this week?", "Add our Trustpilot page and create a rule for unhappy reviews" or "Draft a reply to the best lead from yesterday."
- Server URL (Streamable HTTP):
https://signalwatchr-dev.vercel.app/api/mcp - Authentication: an API key from API & MCP in the app, sent as
Authorization: Bearer YOUR_API_KEY
Set up your client
Create an API key first (see API keys), then replace YOUR_API_KEY in the snippet for your client.
Run in your terminal:
claude mcp add --transport http buzzglean https://signalwatchr-dev.vercel.app/api/mcp \
--header "Authorization: Bearer YOUR_API_KEY"Any other client that supports remote MCP servers over Streamable HTTP with custom headers works the same way.
Access and limits
- Scopes: agents only see the tools the key's scopes allow. Use a Read only key for reporting, and Full access only when the agent should change rules, pages or channels.
- Rate limits: MCP requests share your account's rate limit with the REST API. Tools that run an AI model, such as
suggest_comment, also have a limit of 10 calls per minute and 200 per day. - Plan limits and credits apply exactly as in the app. When something isn't allowed, the tool returns an error that explains the fix.
- Audit: every write an agent makes is recorded in the key's activity under API & MCP.
Tools
| Tool | Scope | What it does |
|---|---|---|
| get_account(read) | account:read | Your plan, billing state, plan limits and current usage (keywords, pages), today's comment credits and the API rate limit. Use it before creating rules to check remaining keyword capacity. |
| list_rules(read) | rules:read | List monitoring rules with their prompt, keywords, keyword platforms (search_keywords_sources), pages (page_ids, see list_pages) and alert channels. Filter by status or text. |
| get_rule(read) | rules:read | Get one rule by id with its keywords and sources. |
| create_rule | rules:write | Create a monitoring rule. prompt_text describes what a relevant post looks like (the AI scores posts against it). page_ids are pages from list_pages / add_pages (fb_group_ids / subreddit_ids are deprecated aliases). Keywords are searched on the platforms in search_keywords_sources (facebook, reddit, x, linkedin, tiktok, youtube; Facebook searches all of Facebook, not just added groups). search_geos picks the countries the searches run from (ISO-2 codes from list_search_countries; empty = anywhere); each country is a separate search and counts as one page per keyword and platform. Only active pages and keywords of active rules count toward plan limits (inactive_page_ids / inactive_keywords don't) — check get_account first. |
| update_rule | rules:write | Change some fields of a rule. Omitted fields keep their current values; arrays you pass replace the current list. To turn pages or keywords off/on without removing them, pass only inactive_page_ids / inactive_keywords. search_geos replaces the countries keyword searches run from (codes from list_search_countries; [] = anywhere; each country counts as one page per keyword and platform). Plan limits are checked on every update. |
| list_search_countries(read) | rules:read | Countries (ISO-2 codes) a rule's keyword searches can run from, for search_geos. Searches run from servers in these countries, so results match what people there see. Empty list = only anywhere searches are available. |
| pause_rule | rules:write | Stop a rule from matching new posts and sending alerts. Keeps its settings; its pages and keywords stop counting toward plan usage. |
| resume_rule | rules:write | Resume a paused rule. Fails with plan_limit_reached if its pages/keywords would exceed the plan. |
| delete_rule(destructive) | rules:write | Permanently delete a rule and stop monitoring its sources. Prefer pause_rule if the user may want it back. Confirm with the user first. |
| list_pages(read) | pages:read | List monitored pages: Facebook groups, subreddits, review sites, app stores and web pages, with review_status (pending = new site under review) and monitoring status. Use the ids in a rule's page_ids. |
| add_pages | pages:write | Add pages to monitor by URL (up to 50): Facebook group links (facebook.com/groups/…), subreddits (reddit.com/r/…), review sites, app store listings, blogs or forums. Sites outside the accepted list are reviewed first (review_status pending). Each new page counts toward the plan's page limit. Returns created and existing pages plus per-URL errors with a code (invalid_url, private_host, invalid_fb_group_url, invalid_subreddit_url, duplicate, too_many, plan_limit_reached, ...). |
| remove_pages(destructive) | pages:write | Stop monitoring pages (by id from list_pages); rules using them stop monitoring them. Confirm with the user first. |
| list_channels(read) | channels:read | List alert channels (email, Slack, Telegram, webhook) and whether they're verified. Secrets are masked. |
| get_channel(read) | channels:read | Get one alert channel by id (secrets masked). |
| create_channel | channels:write | Create an alert channel. email: sends a verification link to the address. webhook: destination is a public HTTPS URL; webhook_secret (optional) signs requests. slack: destination is an incoming-webhook URL, or leave it empty to get setup.oauth_url that the user opens in a browser (Add to Slack). telegram: returns setup.telegram.deep_link; the user opens it and presses Start. |
| update_channel | channels:write | Change a channel's destination, status or settings. Changing the destination restarts verification. |
| test_channel | channels:write | Send a test alert. If the channel isn't set up yet, returns the next step instead (resent email link, Slack oauth_url or Telegram deep_link) for the user to open. |
| delete_channel(destructive) | channels:write | Delete an alert channel. Fails while an active rule uses it (pause the rule or remove the channel from it first). Confirm with the user first. |
| search_matches(read) | feed:read | Search posts the AI matched for the user's rules, newest first. Text is truncated to 500 characters; use get_match or the url for the full post. Sentiments: positive (Positive), neutral (Neutral), negative (Negative). Tags: buy_intent (Buy intent), recommendation_request (Asking for recommendations), alternative_seeking (Looking for alternatives), complaint (Complaint), praise (Praise), question (Question), feedback (Feedback), other (Other). |
| get_match(read) | feed:read | Get one match by id with the full post text, AI reason, sentiment and tags. |
| suggest_comment | comments:write | Write a reply suggestion for a matched post in the user's voice, in the style of its source (community reply, public review response, app store developer reply). Works for every page type. Costs 1 comment credit (daily quota, see get_account). Pass context to say what the comment should achieve; otherwise the user's default purpose is used. |
| get_stats_summary(read) | stats:read | Dashboard numbers for a date range: matches vs the previous period, how much noise the AI filtered out, plan usage, comment credits and items needing attention. |
| get_matches_over_time(read) | stats:read | Matches per day (UTC) with an optional breakdown: none, platform, rule, result, sentiment, tag. Sentiments: positive (Positive), neutral (Neutral), negative (Negative). Tags: buy_intent (Buy intent), recommendation_request (Asking for recommendations), alternative_seeking (Looking for alternatives), complaint (Complaint), praise (Praise), question (Question), feedback (Feedback), other (Other). |
| get_source_stats(read) | stats:read | Per source (page such as a Facebook group, subreddit or review site, or a keyword search): posts collected, keyword hits, matches, match rate. Sort by name, postsCollected, keywordHits, matched, matchRate, lastMatchAt or rulesCount. |
| get_keyword_stats(read) | stats:read | Per keyword: hits, matches and match rate — find noisy or useless keywords. Sort by keyword, keywordHits, matched, matchRate or lastMatchAt. |
| get_rule_stats(read) | stats:read | Per rule: matches, match rate, alerts sent, comment suggestions, sentiment mix. Sort by name, matched, matchRate, alertsSent, commentSuggestions or lastMatchAt. Sentiments: positive (Positive), neutral (Neutral), negative (Negative). Tags: buy_intent (Buy intent), recommendation_request (Asking for recommendations), alternative_seeking (Looking for alternatives), complaint (Complaint), praise (Praise), question (Question), feedback (Feedback), other (Other). |
Tools marked (read) don't change anything. Tools marked (destructive) delete data; many clients ask you to confirm before running them.
Use list_pages, add_pages and remove_pages to manage the sources your rules watch, and pass their ids as page_ids when creating or updating a rule. fb_group_ids and subreddit_ids still work but are deprecated. suggest_comment works for matches from every page type, with a reply style suited to the site.
To search whole platforms (including Facebook) for a rule's keywords, set search_keywords_sources on create_rule or update_rule. To run those searches from specific countries, call list_search_countries for the countries available to you and pass ISO country codes as search_geos (for example ["VN", "TH"]; empty means anywhere). Each country is a separate search and counts as 1 page per keyword and platform.
Resources
| Resource | Contents |
|---|---|
buzzglean://taxonomy | The sentiment and tag values used on matches and in stats. |
Prompts
| Prompt | What it does |
|---|---|
weekly_summary | Combines the week's stats and top matches into a short report: headline numbers vs last week, trends per rule, the most actionable posts with links, and tuning suggestions. |
Example requests
Once connected, try:
- "Summarize my BuzzGlean matches from the last 7 days, grouped by rule."
- "Find matches tagged buy intent from this week and rank them by relevance."
- "Which keywords are noisy? Suggest more specific replacements."
- "Which of my pages are still in review?"
- "Search Facebook and Reddit for my brand name from Vietnam and Thailand."
- "Pause the Competitor X rule until Monday."
- "Draft a helpful reply to the top match, and mention that I work on the product."
Troubleshooting
| Problem | Fix |
|---|---|
invalid_api_key | Check the key was copied in full and hasn't expired or been revoked. |
| A tool is missing | The key lacks that scope. Edit the key under API & MCP. |
rate_limited | Wait for the time in the error, or upgrade for a higher limit. |
Writes fail with subscription_required | Your plan is inactive. See Plans and billing. |
A rule change fails with plan_limit_reached | The change needs more keywords or pages than your plan allows (each keyword searched on a platform, from each country, counts as a page). Ask the assistant to check get_account, remove keywords or sources, or upgrade. |