MCP server
Connect Claude, Cursor or VS Code to Peersheep, and ask about your competitors in plain language.
Peersheep runs a Model Context Protocol server, so an AI assistant can read your alerts, competitors and page snapshots, and with a write key, manage them for you. Ask things like:
- "What did our competitors change on their pricing pages this week?"
- "Show me the before and after for the latest high-signal alert."
- "Start watching acme.ai's changelog and careers pages."
| Setting | Value |
|---|---|
| URL | https://api.peersheep.com/mcp |
| Transport | Streamable HTTP |
| Authentication | Authorization: Bearer ps_live_... |
The server uses the same API keys as the REST API, and every tool calls the REST API with your key. The assistant can never do more than the key allows.
Give the assistant a Read only key unless you want it to make changes. A read-only key only exposes the read tools.
Connect your assistant
Run this in your terminal:
claude mcp add --transport http peersheep https://api.peersheep.com/mcp \
--header "Authorization: Bearer ps_live_..."Add --scope user to use it in every project. Run /mcp inside Claude Code to check it's connected.
Any other client that supports Streamable HTTP and custom headers works the same way: point it at the URL and send the key as a bearer token.
Config files like mcp.json are easy to commit by accident. Keep keys out of shared repositories, or use your client's secret storage where it has one.
Tools
Tools return the same JSON as the matching endpoint. When a call fails, the tool returns an error with the HTTP status and message, such as HTTP 402: Domain limit reached (5/5), so the assistant can explain what went wrong.
Read tools
Available with every key.
| Tool | What it does | Inputs | Endpoint |
|---|---|---|---|
get_workspace | The workspace's name, plan, subscription status and limits. | None | GET /me |
get_dashboard_stats | Unread alerts, alerts in the last 7 days, signal breakdown and usage. | None | GET /dashboard/stats |
list_competitors | Every competitor, with its domain and number of watched pages. | None | GET /competitors |
get_competitor_timeline | The latest 50 changes on one competitor's pages. | competitorId | GET /competitors/{id}/timeline |
list_watched_urls | Watched pages, with label, crawl frequency and last crawl status. | competitorId (optional) | GET /watched-urls |
get_page_snapshot | The latest structured reading of a page: SEO tags, headings, prices, calls to action. | watchedUrlId | GET /watched-urls/{id}/snapshot |
list_alerts | Detected changes, newest first. | signalScore, status, pageType, competitorId, page, limit (all optional) | GET /alerts |
get_alert | One alert, including the reasoning behind its score. | alertId | GET /alerts/{id} |
get_alert_evidence | The before and after behind an alert. | alertId | GET /alerts/{id}/evidence |
get_analytics_summary | Visitors, page views and top pages across your tracked sites. | None | GET /analytics/summary |
Write tools
Only available with a Read and write key.
| Tool | What it does | Inputs | Endpoint |
|---|---|---|---|
add_competitor | Starts monitoring a competitor. Counts against your competitor limit. | name, domain | POST /competitors |
suggest_competitor_urls | Finds which common pages (pricing, changelog, careers…) exist on a domain. Doesn't change your workspace. | domain | POST /competitors/suggest-urls |
watch_url | Starts monitoring a page and crawls it straight away. Counts against your URL limit. | competitorId, url, label, crawlFrequency (optional) | POST /watched-urls |
update_watched_url | Changes a page's label or crawl frequency, or pauses and resumes it. | watchedUrlId, label, crawlFrequency, isActive (all but the ID optional) | PATCH /watched-urls/{id} |
crawl_now | Crawls a page now instead of waiting for its schedule. | watchedUrlId | POST /watched-urls/{id}/crawl |
mark_alert_read | Marks one alert as read. | alertId | POST /alerts/{id}/read |
mark_all_alerts_read | Marks every unread alert as read. | None | POST /alerts/read-all |
archive_alert | Archives an alert. | alertId | POST /alerts/{id}/archive |
rate_alert | Rates an alert, which tunes future signal scoring. | alertId, feedback (useful or not_useful) | POST /alerts/{id}/feedback |
remove_competitor | Stops monitoring a competitor and deletes its pages and history. | competitorId | DELETE /competitors/{id} |
unwatch_url | Stops monitoring a page and deletes its history. | watchedUrlId | DELETE /watched-urls/{id} |
Every tool is labelled for your client: read tools as read-only, and remove_competitor and unwatch_url as destructive, so clients that ask before risky actions will check with you first. Removing a competitor or page can't be undone.
Troubleshooting
The server won't connect, or returns 401. Check the header is exactly Authorization: Bearer ps_live_..., with no quotes around the key, and that the key hasn't been revoked under Settings → API.
Write tools are missing. The key is Read only. Create a Read and write key and reconnect. The tool list is fixed when the client connects, so restart the server after changing keys.
A tool fails with HTTP 402. You've reached a plan limit. See Plans and limits.
The assistant sees the wrong workspace. A key belongs to one workspace. Create a key in the workspace you want, from Settings → API while that workspace is selected.