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.

example session · claude code
you

Add Content Gate to the signup form on staging.example.com.

tools
  1. list_content_gate_sites
  2. create_content_gate_site name: "staging signup" · actions: [signup_submit]
  3. set_content_gate_action_policy action: signup_submit
agent

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?

  1. Create a tenant keyDashboard → Keys → Create MCP key. Shown once.
  2. Add the serverPaste one line or one JSON block into your editor.
  3. 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_required until 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

bash
claude mcp add --transport http siftfy https://api.siftfy.io/mcp \
  --header "Authorization: Bearer sf_tenant_…"

Cursor — ~/.cursor/mcp.json

json
{
  "mcpServers": {
    "siftfy": {
      "url": "https://api.siftfy.io/mcp",
      "headers": {
        "Authorization": "Bearer sf_tenant_…"
      }
    }
  }
}

VS Code — .vscode/mcp.json

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

toolreturns
get_accountPlan, status, and per-minute and monthly limits.
get_usageDaily prediction counts for the last 1–90 days (default 30).
list_api_keysActive API keys by prefix. Full keys are never shown again.
list_content_gate_sitesEvery Content Gate site on the account.
get_content_gate_siteOne site with its action policies and version.
get_content_gate_action_policyOne action's policy, or its defaults when none is set.
list_denylist_entriesA site's deny list, one page at a time.
get_content_gate_analyticsDaily challenge, verification and decision counts for 1–90 days.

Write

tooldoesconfirm
create_api_keyCreate an X-API-Key. The full key is in this result only.—
revoke_api_keyRevoke an API key; requests using it fail with 401 within 60 seconds.confirm
create_content_gate_siteCreate a site in monitor mode. Returns the site key and the secret (shown once).—
update_content_gate_siteChange name, origins, actions, mode, thresholds or enabled state.confirm
rotate_content_gate_secretReplace a site's secret. The old one stops working at once.confirm
delete_content_gate_siteDelete a site and its analytics.confirm
set_content_gate_action_policyReplace one action's policy; omitted fields take their defaults.—
add_denylist_entriesDeny up to 500 solver IDs, optionally for one action.—
remove_denylist_entriesRemove 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:

json
{
  "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:

json
{
  "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"
}
errormeaning
pro_requiredThe account isn't on Pro. Includes billing_url.
rate_limitedOver your plan's per-minute budget. Includes retry_after in seconds.
validation_errorAn argument is invalid; field names it. Strings are capped at 2,048 characters.
not_foundThe site or key doesn't exist on this account.
conflictThe site changed while the update ran. Read it again and retry.
unavailableA dependency is temporarily down. Safe to retry.
internalAn 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