guide · pro plan
MCP server
Updated October 12, 2026
Siftfy runs a remote Model Context Protocol server at https://api.siftfy.io/mcp. Connect Claude Code, Cursor, VS Code or any MCP client with one sf_tenant_ key and your agent can read usage, manage API keys, and set up Content Gate sites, policies and deny lists for the whole account. MCP access is included in the Pro plan.
Your agent already writes the form. Now it can protect it too. Ask it to "add Content Gate to the signup form on staging" and it creates the site, hands back the site key for the widget, and sets the policy, all from the editor you're already in.
Add Content Gate to the signup form on staging.example.com.
- list_content_gate_sites
- create_content_gate_site name: "staging signup" · actions: [signup_submit]
- set_content_gate_action_policy action: signup_submit
Done. The site is in monitor mode, so nothing is blocked yet. I added the widget with site key sf_site_… to signup.tsx and put the secret in .env.local. Want me to switch it to enforce once you've watched a few days of traffic?
- Create a tenant keyDashboard → Keys → Create MCP key. Shown once.
- Add the serverPaste one line or one JSON block into your editor.
- Ask in plain EnglishYour agent picks the tools and asks before anything risky.
Requirements
- A Pro plan. Free accounts can't create MCP keys, and a key on an account that leaves Pro answers every tool call with
pro_requireduntil the account is Pro again; the key itself keeps working once it is. See pricing. - An MCP client that supports the streamable HTTP transport with a custom header: Claude Code, Cursor and VS Code all do.
Create a tenant key
Sign in, open Dashboard → Keys, and click Create MCP key in the MCP access card. The full key is shown once; we only store a hash. Each account can hold up to 3 active tenant keys, so issue one per machine or per teammate and revoke any one without touching the others.
Tenant keys are separate from API keys. An X-API-Key can't authenticate MCP, and a tenant key can't call /v1/predict. Tenant keys can only be created, listed and revoked in the dashboard, never over MCP, so a leaked key can't mint more keys.
Connect your client
Send the key as Authorization: Bearer sf_tenant_…. The card on the Keys page fills these snippets in with your key.
Claude Code
claude mcp add --transport http siftfy https://api.siftfy.io/mcp \
--header "Authorization: Bearer sf_tenant_…"Cursor — ~/.cursor/mcp.json
{
"mcpServers": {
"siftfy": {
"url": "https://api.siftfy.io/mcp",
"headers": {
"Authorization": "Bearer sf_tenant_…"
}
}
}
}VS Code — .vscode/mcp.json
{
"servers": {
"siftfy": {
"type": "http",
"url": "https://api.siftfy.io/mcp",
"headers": {
"Authorization": "Bearer sf_tenant_…"
}
}
}
}The Cursor and VS Code files hold the key in plain text. Keep them out of version control, or add the key to your user-level config instead of the project's.
Tools
17 tools. Every tool runs the same validation as the dashboard, so an agent can't put a site into a state the dashboard would refuse.
Read
| tool | returns |
|---|---|
| get_account | Plan, status, and per-minute and monthly limits. |
| get_usage | Daily prediction counts for the last 1–90 days (default 30). |
| list_api_keys | Active API keys by prefix. Full keys are never shown again. |
| list_content_gate_sites | Every Content Gate site on the account. |
| get_content_gate_site | One site with its action policies and version. |
| get_content_gate_action_policy | One action's policy, or its defaults when none is set. |
| list_denylist_entries | A site's deny list, one page at a time. |
| get_content_gate_analytics | Daily challenge, verification and decision counts for 1–90 days. |
Write
| tool | does | confirm |
|---|---|---|
| create_api_key | Create an X-API-Key. The full key is in this result only. | — |
| revoke_api_key | Revoke an API key; requests using it fail with 401 within 60 seconds. | confirm |
| create_content_gate_site | Create a site in monitor mode. Returns the site key and the secret (shown once). | — |
| update_content_gate_site | Change name, origins, actions, mode, thresholds or enabled state. | confirm |
| rotate_content_gate_secret | Replace a site's secret. The old one stops working at once. | confirm |
| delete_content_gate_site | Delete a site and its analytics. | confirm |
| set_content_gate_action_policy | Replace one action's policy; omitted fields take their defaults. | — |
| add_denylist_entries | Deny up to 500 solver IDs, optionally for one action. | — |
| remove_denylist_entries | Remove up to 500 solver IDs from the deny list. | — |
update_content_gate_site needs confirm only when it moves a site to enforce mode. New sites always start in monitor mode.
The confirm guard
A tool marked confirm: required changes nothing unless the call includes "confirm": true. Without it, the tool returns a preview of the effect so the agent (and you) can see what would happen first:
{
"applied": false,
"confirm_required": true,
"effect": "Rotating the secret breaks siteverify on every server using the old secret until it is updated."
}Things to ask
Plain requests work. The agent maps them onto the tools above.
- “Add Content Gate to the signup and contact forms on staging.example.com.”
- “How many predictions did we run each day this week?”
- “Create an API key called checkout-service.”
- “Move the production site to enforce mode once the review rate is under 2%.”
- “Deny these three solver IDs on the signup action for 7 days.”
- “Rotate the Content Gate secret for production.”
Errors
A missing, malformed or revoked key gets HTTP 401 with invalid_tenant_key before any tool runs. Revoking a key in the dashboard takes effect on the next request. A tool that fails returns an MCP tool error whose structured content carries a stable error code:
{
"error": "pro_required",
"message": "MCP access is a Pro feature. Upgrade at https://siftfy.io/dashboard/billing and this key works again unchanged.",
"billing_url": "https://siftfy.io/dashboard/billing"
}| error | meaning |
|---|---|
| pro_required | The account isn't on Pro. Includes billing_url. |
| rate_limited | Over your plan's per-minute budget. Includes retry_after in seconds. |
| validation_error | An argument is invalid; field names it. Strings are capped at 2,048 characters. |
| not_found | The site or key doesn't exist on this account. |
| conflict | The site changed while the update ran. Read it again and retry. |
| unavailable | A dependency is temporarily down. Safe to retry. |
| internal | An unexpected failure. Includes a request_id to quote to support. |
Limits and audit
MCP calls share your plan's per-minute budget (see rate limits), counted separately from /v1/predict traffic. One request carries one call; JSON-RPC batches are refused. Every write call is recorded with its key, tool and result. The MCP access card shows the latest 50; we store a hash of the arguments, never the arguments themselves.
Where to next
- Content Gate → what the site, policy and deny-list tools configure.
- Authentication → API keys for
/v1/predict. - Pricing → what Pro includes.