MCP server
Verid runs a Model Context Protocol server, so an AI agent such as Claude Code, Cursor, VS Code or Claude Desktop can create, run, pause and read your monitors and tell you what changed, in plain language. Ask "watch the price on this page and post to Slack when it drops 10%" and the agent builds the monitor for you. It works on every plan, including the trial.
Endpoint and auth
The server speaks Streamable HTTP at https://verid.dev/api/mcp. It is stateless: every request is a single POST with a JSON-RPC body, and there are no sessions.
Authenticate with a Verid API key in the Authorization header, the same keys you create on the API Keys page of the dashboard. Keys start with vrd_. The key decides what the agent can do:
- A key with only the
readscope sees the 9 read tools. Write tools are not offered to it at all. - A key with the
writescope sees all 17 tools and can create, change, run, pause and delete monitors.
The key works on the whole team's data, exactly like it does on the REST API (see API keys in a team).
Browser sessions are not accepted
The MCP endpoint only accepts an API key. Being signed in to the dashboard in the same browser does not authenticate a request, so a web page cannot use your session to change your monitors.Connect a client
Replace vrd_your_key with your key in the examples below. Start with a read-only key if you only want the agent to look, not change anything.
Claude Code
claude mcp add --transport http verid https://verid.dev/api/mcp \
--header "Authorization: Bearer vrd_your_key"Run /mcp inside Claude Code to check that verid is connected.
Cursor
Add this to .cursor/mcp.json in your project, or to ~/.cursor/mcp.json to use Verid in every project:
{
"mcpServers": {
"verid": {
"url": "https://verid.dev/api/mcp",
"headers": {
"Authorization": "Bearer vrd_your_key"
}
}
}
}VS Code
Add this to .vscode/mcp.json. VS Code asks for the key once and stores it, so it never sits in the file:
{
"inputs": [
{
"type": "promptString",
"id": "verid-api-key",
"description": "Verid API key",
"password": true
}
],
"servers": {
"verid": {
"type": "http",
"url": "https://verid.dev/api/mcp",
"headers": {
"Authorization": "Bearer ${input:verid-api-key}"
}
}
}
}Claude Desktop and stdio clients
Clients that only start local servers can reach Verid through mcp-remote. In Claude Desktop, add this to claude_desktop_config.json and restart the app. The header is passed through an environment variable because some clients break arguments that contain spaces.
{
"mcpServers": {
"verid": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://verid.dev/api/mcp",
"--header",
"Authorization:${VERID_AUTH}"
],
"env": {
"VERID_AUTH": "Bearer vrd_your_key"
}
}
}
}Tools
Tool inputs use the same fields as the REST API, so everything in Extraction methods and Diff predicates applies. Read tools are marked read-only and delete_monitor is marked destructive, so clients that support these hints ask before deleting.
| Tool | Scope | What it does |
|---|---|---|
list_monitors | read | List page and visual monitors with status counts. Filter by status, visual, or a name/URL search. |
get_monitor | read | One monitor with its full configuration. |
create_monitor | write | Create a monitor: URL, interval, extraction, alert rule and deliveries. The first check runs right away. |
create_monitor_from_template | write | Create a monitor from a template slug, with optional URL, name and deliveries. |
update_monitor | write | Change any field of a monitor; send only the fields to change. |
pause_monitor | write | Stop checks and alerts until resumed. |
resume_monitor | write | Resume a paused or auto-paused monitor; the next check runs right away. |
delete_monitor | write | Delete a monitor permanently. Marked destructive, so clients ask you to confirm. |
run_monitor_now | write | Queue an immediate check. Uses 1 run. |
list_runs | read | Recent checks of one monitor: status, time, fetch method, duration, whether it triggered an alert. |
get_run | read | One check in full: extracted data, field diff, visual change percent, and the before/after page text for full-page monitors. |
list_changes | read | Every change detected across all monitors since a time (default: last 24 hours), with before/after values. |
list_serp_monitors | read | List SERP (search rank) monitors. |
create_serp_monitor | write | Create a SERP monitor for a keyword. Needs a + SERP plan. |
list_serp_runs | read | Rank history of one SERP monitor: rank, rank change, AI Overview and featured snippet presence. |
get_usage | read | Plan, runs used and left this period, reset date, run credits and plan limits. |
list_templates | read | Ready-made monitor templates, optionally by category. |
Large values are cut to keep answers small: page text and extracted data in get_run stop at 20,000 characters, and each before/after value in list_changes at 500. Cut values are marked truncated. Monitor responses never include webhook signing secrets.
Limits and audit log
MCP is another way into the same account, so the same limits apply as on the REST API:
- Every check uses a run from the plan's monthly runs, whether the agent or the schedule started it.
get_usageshows what is left and when it resets. - Each tool call counts as one API request against the plan's per-minute budget. Connecting and listing tools do not count.
| Plan | Tool calls per minute |
|---|---|
| Free trial | 30 |
| Lite | 60 |
| Starter | 120 |
| Pro | 600 |
| Scale | 3,000 |
The + SERP variants have the same budget as their base plan. Every write tool is recorded in the audit log under the same action names as the REST API (for example monitor.created), with the API key as the actor and "via": "mcp" in the metadata.
Errors
When a tool fails, the result has isError: true and its text is the same code, message and details object the REST API returns, so the agent can read it and adjust: pick a longer interval after a validation error, or wait for resets_at after running out of runs.
{
"isError": true,
"content": [
{
"type": "text",
"text": "{\"code\":\"RUN_LIMIT_REACHED\",\"message\":\"...\",\"details\":{\"used\":1000,\"limit\":1000,\"resets_at\":\"2026-11-01T00:00:00.000Z\",\"credits_remaining\":0}}"
}
]
}A missing, invalid or expired key gets HTTP 401 before any tool runs. GET and DELETE on the endpoint return 405, because the server has no sessions or server-sent streams.