Koskamo

Screwtape MCP

An official MCP server for Screwtape.ai that provides tools to judge agent outputs, check for duplicate invoices, and score consensus among multiple agents. It enables independent verification of AI decisions with signed receipts, supporting payment control and output validation workflows.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Screwtape MCP logo, by Screwtape.aiVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Screwtape.ai
You need:Bearer API keyAuthorization: Bearer API key
MCP endpoint (Streamable HTTP)
https://screwtape.ai/mcp
Vendor documentation

What you can do with it

  • Judge agent outputs for pass, fail, or retry verdicts
  • Check for duplicate invoices before payment execution
  • Score agreement across multiple agents to detect false consensus
  • Verify signed receipts for audit trails

Source and maintenance

Vendor evidenceRegistry 1.1.0

Protocol and capabilities

Server
Screwtape.ai 1.2.0
MCP protocol
2025-06-18
Tools
6 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Verify before the agent pays: a separate check on agent work before a payment goes out (invoices, duplicate invoices, reconciliation), with signed receipts. Use check_duplicate_invoice with a Bearer key before an agent pays an invoice; it returns duplicate.status and costs one call like judge. Screwtape also gives false-consensus checks and pass/fail/retry verdicts for any agent output. Use judge on one draft answer before you return it (send evidence; it does not search the web). Use consensus when 2 to 16 answers to the same task agree and you are about to trust the majority. Use get_api_key only if no key is configured and you can compute SHA-256 in code. judge and consensus cost one call each: a free key gives 100 per UTC day, or pay $0.005 USDC on Base or Solana with x402. An unpaid tools/call returns HTTP 200 with isError true and the x402 PaymentRequirements in structuredContent. Retry with params._meta['x402/payment']. Settlement is echoed in result._meta['x402/payment-response']. Judged content is not stored unless retain is true or the key owner turned on opt-in data sharing (off by default; redacted, kept 90 days). A successful judge or consensus result includes an Ed25519 receipt when signing is configured. Public keys are at https://screwtape.ai/.well-known/screwtape-receipt-keys.json. POST /v1/receipts/verify checks a receipt. publish_receipt publishes one receipt you own. It needs the Bearer key and does not accept x402. Not the arXiv paper named Screwtape.

Tools

6 advertised

judge — Judge one agent output (pass, fail or retry)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

An independent pass/fail/retry verdict on ONE agent output. Call it before you return, store or act on a draft answer, especially when you have the evidence the answer should be based on. Do NOT call it to look up facts (it does no web search and only checks against the evidence you pass), to compare several agents' answers (use consensus), or for offline evaluation over a dataset. Inputs: task, agent_output, evidence, criteria, retain, and optional agent_id and version tags. Returns: verdict, score, reasons, engine, next_step, request_id, retention, the tags when sent, and receipt when signing is configured. On pass, use the output. On retry, revise using reasons and call again, at most 2 or 3 times. On fail, stop. Optional checks run first; on failure you get next_step.hint saying what to fix. Branch on next_step.action (pass, retry or escalate). Cost: 1 call. A free key covers 10 calls per UTC day; without a key, pay $0.005 USDC on Base or Solana per call with x402. Without a key or payment, tools/call is HTTP 200 with isError true and the x402 PaymentRequirements in structuredContent. Retry with params._meta['x402/payment'].

judge input schema
{
  "type": "object",
  "required": [
    "task",
    "agent_output"
  ],
  "properties": {
    "mode": {
      "enum": [
        "blocking",
        "advisory"
      ],
      "type": "string",
      "description": "Optional. blocking (the default) is today's behaviour. advisory computes the same verdict, checks, next_step and receipt, then adds mode, decision_owner human, recommended_action (approve, review or return) and a notice. The receipt signs mode advisory as schema_version 5. Same price."
    },
    "task": {
      "type": "string",
      "description": "The original instruction or question the agent was answering."
    },
    "share": {
      "type": "boolean",
      "description": "Optional. false keeps this call out of opt-in data sharing even when the key has sharing on. It cannot turn sharing on."
    },
    "checks": {
      "type": "array",
      "items": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "type",
              "paths"
            ],
            "properties": {
              "type": {
                "const": "required_fields"
              },
              "paths": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 128,
                  "minLength": 1,
                  "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
                },
                "maxItems": 50,
                "minItems": 1
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "type",
              "fields"
            ],
            "properties": {
              "type": {
                "const": "types"
              },
              "fields": {
                "type": "object",
                "maxProperties": 50,
                "minProperties": 1,
                "additionalProperties": {
                  "enum": [
                    "string",
                    "number",
                    "integer",
                    "boolean",
                    "object",
                    "array",
                    "null"
                  ]
                }
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "type",
              "field",
              "format"
            ],
            "properties": {
              "type": {
                "const": "format"
              },
              "field": {
                "type": "string",
                "maxLength": 128,
                "minLength": 1,
                "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
              },
              "format": {
                "enum": [
                  "email",
                  "iso_date",
                  "iso_datetime",
                  "url",
                  "uuid",
                  "e164_phone",
                  "currency_code",
                  "integer_string"
                ]
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "type",
              "parts",
              "total"
            ],
            "properties": {
              "type": {
                "const": "sum"
              },
              "parts": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 128,
                  "minLength": 1,
                  "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
                },
                "maxItems": 20,
                "minItems": 1
              },
              "total": {
                "type": "string",
                "maxLength": 128,
                "minLength": 1,
                "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
              },
              "tolerance": {
                "type": "number",
                "default": 0.0001,
                "maximum": 1000000,
                "minimum": 0
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "type",
              "vendor_path",
              "invoice_id_path",
              "amount_path"
            ],
            "properties": {
              "type": {
                "const": "duplicate"
              },
              "store": {
                "type": "boolean",
                "default": false,
                "description": "Record this invoice's fingerprints so later calls can match it."
              },
              "date_path": {
                "type": "string",
                "maxLength": 128,
                "minLength": 1,
                "description": "Dot path to a YYYY-MM-DD invoice date. Enables the same vendor, amount and date rule."
              },
              "amount_path": {
                "type": "string",
                "maxLength": 128,
                "minLength": 1,
                "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
              },
              "retain_days": {
                "type": "integer",
                "default": 180,
                "maximum": 400,
                "minimum": 1
              },
              "vendor_path": {
                "type": "string",
                "maxLength": 128,
                "minLength": 1,
                "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
              },
              "window_days": {
                "type": "integer",
                "default": 3,
                "maximum": 30,
                "minimum": 0
              },
              "currency_path": {
                "type": "string",
                "maxLength": 128,
                "minLength": 1,
                "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
              },
              "invoice_id_path": {
                "type": "string",
                "maxLength": 128,
                "minLength": 1,
                "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
              }
            },
            "description": "Duplicate invoice check (needs an API key, at most 1 per call). Compares this invoice with ones the same key recorded earlier. Stores keyed HMAC fingerprints only, and only when store is true.",
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "enum": [
                  "url_contains",
                  "json_schema",
                  "equals",
                  "regex",
                  "numeric",
                  "onchain"
                ]
              }
            },
            "description": "Existing types, unchanged: url_contains, json_schema, equals, regex, numeric, onchain."
          }
        ]
      },
      "maxItems": 8,
      "description": "Optional. The worker runs each check. A failed check forces verdict fail. Types: url_contains, json_schema, equals, regex, numeric, onchain, required_fields, types, format, sum, duplicate. duplicate (at most 1, API key only) compares an invoice with ones this key recorded earlier and stores keyed fingerprints only when store is true. At most 3 url_contains checks. Local checks run first; if one fails, no model is called and next_step says what to fix."
    },
    "retain": {
      "type": "boolean",
      "description": "Optional. true stores this call for 24 hours; requires an API key. Default false stores nothing."
    },
    "version": {
      "type": "string",
      "maxLength": 64,
      "description": "Optional version tag for that agent. At most 64 characters."
    },
    "agent_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9._:-]{1,64}$",
      "maxLength": 64,
      "description": "Optional tag for the agent making this call. 1 to 64 characters: letters, digits, and . _ : -. This is not the per-answer agent_id on a consensus answer."
    },
    "criteria": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional. Facts or terms the answer must contain, one per string."
    },
    "evidence": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional. Source passages the answer must be grounded in, one string per passage. Without evidence, grounding cannot be checked."
    },
    "agent_output": {
      "type": "string",
      "description": "The agent's draft answer to check. Pass JSON as a string."
    }
  },
  "additionalProperties": false
}
judge output schema
{
  "type": "object",
  "required": [
    "verdict",
    "score",
    "reasons",
    "request_id"
  ],
  "properties": {
    "mode": {
      "enum": [
        "advisory"
      ],
      "type": "string",
      "description": "Present only when the call sent mode: advisory."
    },
    "model": {
      "type": [
        "string",
        "null"
      ]
    },
    "score": {
      "type": [
        "number",
        "null"
      ],
      "description": "null when no model gave a verdict (degraded)."
    },
    "checks": {
      "type": "array"
    },
    "claims": {
      "type": "array"
    },
    "engine": {
      "type": "string",
      "description": "groq, workers_ai, deterministic, or demo. Also signed into the receipt."
    },
    "notice": {
      "type": "string",
      "description": "Advisory only. Fixed text: the call does not approve, hold or release any payment."
    },
    "reasons": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "receipt": {
      "type": [
        "object",
        "null"
      ],
      "required": [
        "receipt_id",
        "issued_at",
        "endpoint",
        "request_sha256",
        "verdict",
        "score",
        "payment",
        "alg",
        "kid",
        "signature"
      ],
      "properties": {
        "alg": {
          "enum": [
            "Ed25519"
          ],
          "type": "string"
        },
        "kid": {
          "type": "string"
        },
        "mode": {
          "enum": [
            "advisory"
          ],
          "type": "string",
          "description": "Present only on schema 5 and 8: the call was advisory, so a person, not the API, owned the decision. Blocking receipts omit it."
        },
        "model": {
          "type": "string",
          "description": "Present only on schema 7 and 8: the model id the provider echoed back for this verdict, for example openai/gpt-oss-120b. Signed, so a changed model id fails verification."
        },
        "score": {
          "type": "number",
          "description": "Judge score from 0 to 1. For consensus this is agreement_score."
        },
        "checks": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "type",
              "passed",
              "evidence_hash"
            ],
            "properties": {
              "type": {
                "type": "string"
              },
              "passed": {
                "type": "boolean"
              },
              "evidence_hash": {
                "type": "string"
              }
            },
            "additionalProperties": false
          },
          "description": "Type, passed, and evidence_hash only. Fetched page text and chain responses are not stored."
        },
        "claims": {
          "type": "object",
          "required": [
            "total",
            "supported",
            "contradicted",
            "unsupported"
          ],
          "properties": {
            "total": {
              "type": "integer"
            },
            "supported": {
              "type": "integer"
            },
            "unsupported": {
              "type": "integer"
            },
            "contradicted": {
              "type": "integer"
            }
          },
          "additionalProperties": false
        },
        "engine": {
          "type": "string",
          "description": "groq, workers_ai, deterministic, or demo. Present on schema 3 and 4."
        },
        "payment": {
          "type": "object",
          "required": [
            "type"
          ],
          "properties": {
            "tx": {
              "type": "string",
              "description": "Settled transaction id, or the accepted payment nonce when nothing was settled."
            },
            "type": {
              "enum": [
                "x402",
                "free-key",
                "prepaid",
                "demo"
              ],
              "type": "string"
            },
            "payer": {
              "type": "string"
            },
            "network": {
              "type": "string"
            },
            "key_prefix": {
              "type": "string",
              "description": "Present on schema 3 free-key and prepaid payments. Omitted on schema 4. Never the secret."
            }
          },
          "description": "x402 includes tx, network, and payer. Schema 4 free-key and prepaid payments are the label only, with no key_prefix. Schema 3 may include the key display prefix, not the secret. demo is the /try/ allowance.",
          "additionalProperties": false
        },
        "verdict": {
          "type": "string",
          "description": "Judge verdict (pass, fail, or retry). For consensus this is false_consensus_risk (low, medium, or high)."
        },
        "version": {
          "type": "string",
          "description": "Present when the call sent a version tag. Omitted otherwise. Older receipts omit it."
        },
        "agent_id": {
          "type": "string",
          "description": "Present when the call sent an agent_id tag. Omitted otherwise. Older receipts omit it."
        },
        "endpoint": {
          "enum": [
            "/v1/judge",
            "/v1/consensus"
          ],
          "type": "string"
        },
        "issued_at": {
          "type": "string",
          "description": "ISO-8601 UTC timestamp."
        },
        "signature": {
          "type": "string",
          "description": "Unpadded base64url Ed25519 signature over the canonical JSON of every field except signature."
        },
        "receipt_id": {
          "type": "string"
        },
        "verification": {
          "enum": [
            "verified",
            "judged",
            "heuristic",
            "failed"
          ],
          "type": "string",
          "description": "verified when a check of the answer passed. judged when a model checked it and did not contradict it. heuristic when only string checks ran. failed when the agreed answer failed verification."
        },
        "request_sha256": {
          "type": "string",
          "description": "Lowercase hex SHA-256 of the canonical JSON of the normalized request. Judge requests include task, agent_output, evidence, and criteria. Consensus requests include task and answers, plus evidence when it was sent. agent_id and version tags are signed separately and are not part of this hash."
        },
        "schema_version": {
          "enum": [
            2,
            3,
            4,
            5,
            7,
            8
          ],
          "type": "integer",
          "description": "7 is schema 4 plus a signed model id, and 8 is schema 5 plus a signed model id: minted when a model gave the verdict. 5 is schema 4 plus a signed mode advisory, minted only for mode: advisory calls. 4 omits key_prefix from payment so a published receipt verifies without key info. 3 adds verification, engine, checks (type, passed, and evidence_hash only), and a claims count, and may include key_prefix. 2 can carry agent_id and version. Older receipts omit this field and still verify."
        }
      },
      "additionalProperties": false
    },
    "verdict": {
      "enum": [
        "pass",
        "fail",
        "retry"
      ],
      "type": "string"
    },
    "version": {
      "type": "string",
      "description": "Echoed when the call sent a version tag."
    },
    "agent_id": {
      "type": "string",
      "description": "Echoed when the call sent an agent_id tag."
    },
    "degraded": {
      "type": "object"
    },
    "duplicate": {
      "type": "object",
      "description": "Present only when the call sent a duplicate check. status is unique, duplicate, possible_duplicate, replay or not_checked. Carries no invoice data."
    },
    "next_step": {
      "type": "object",
      "required": [
        "action",
        "error_type",
        "hint"
      ],
      "properties": {
        "hint": {
          "type": "string",
          "maxLength": 300,
          "description": "Template text naming fields and types to fix. Never contains values from agent_output."
        },
        "action": {
          "enum": [
            "pass",
            "retry",
            "escalate"
          ],
          "type": "string",
          "description": "pass: use the output. retry: fix it using hint and call again. escalate: stop and hand to a person."
        },
        "error_type": {
          "enum": [
            "none",
            "invalid_json",
            "not_an_object",
            "missing_required_field",
            "type_mismatch",
            "format_mismatch",
            "sum_mismatch",
            "check_failed",
            "external_check_failed",
            "duplicate_invoice",
            "possible_duplicate",
            "quality_issue",
            "contradicted_claims",
            "rejected",
            "low_confidence",
            "unverifiable",
            "false_consensus_risk",
            "primary_engine_unavailable"
          ],
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "retention": {
      "type": "object"
    },
    "request_id": {
      "type": "string"
    },
    "fail_closed": {
      "type": "boolean",
      "description": "Present and true only when a finance check failed closed because the primary model was unavailable. Treat it as review."
    },
    "verification": {
      "enum": [
        "verified",
        "judged",
        "heuristic",
        "failed"
      ],
      "type": "string"
    },
    "decision_owner": {
      "enum": [
        "human"
      ],
      "type": "string",
      "description": "Advisory only. A person owns the decision."
    },
    "receipt_reason": {
      "type": "string"
    },
    "recommended_action": {
      "enum": [
        "approve",
        "review",
        "return"
      ],
      "type": "string",
      "description": "Advisory only, deterministic and not signed. Judge: next_step pass is approve, escalate is review, retry is return (send back to the agent). Consensus: risk low is approve, medium or high is review."
    }
  }
}
judge annotations
{
  "title": "Judge one agent output (pass, fail or retry)",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
check_duplicate_invoice — Check an invoice for duplicates before the agent pays
Advertised by the server during the last successful anonymous check.
Open-world

Duplicate invoice check before an agent pays. Same as judge with one duplicate check: it compares this invoice with the invoices this API key recorded earlier and also judges it. Call it before an agent pays or approves an invoice or payment instruction. Inputs: the judge inputs (task, agent_output as the invoice JSON, evidence, criteria, checks, mode, tags) plus duplicate {vendor_path, invoice_id_path, amount_path, currency_path?, date_path?, window_days?, store?, retain_days?}. Returns the judge result plus duplicate.status (unique, duplicate, possible_duplicate, replay or not_checked). On duplicate or possible_duplicate, next_step.action is escalate: do not pay. Needs Authorization: Bearer, because fingerprints are kept per key; only keyed HMAC fingerprints are stored, and only when store is true. Cost: 1 call, the same price as judge. Without a key or payment, tools/call is HTTP 200 with isError true and the x402 PaymentRequirements in structuredContent; an x402 payment without a key returns key_required and is not settled.

check_duplicate_invoice input schema
{
  "type": "object",
  "required": [
    "task",
    "agent_output",
    "duplicate"
  ],
  "properties": {
    "mode": {
      "enum": [
        "blocking",
        "advisory"
      ],
      "type": "string",
      "description": "Optional. blocking (the default) is today's behaviour. advisory computes the same verdict, checks, next_step and receipt, then adds mode, decision_owner human, recommended_action (approve, review or return) and a notice. The receipt signs mode advisory as schema_version 5. Same price."
    },
    "task": {
      "type": "string",
      "description": "The original instruction or question the agent was answering."
    },
    "share": {
      "type": "boolean",
      "description": "Optional. false keeps this call out of opt-in data sharing even when the key has sharing on. It cannot turn sharing on."
    },
    "checks": {
      "type": "array",
      "items": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "type",
              "paths"
            ],
            "properties": {
              "type": {
                "const": "required_fields"
              },
              "paths": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 128,
                  "minLength": 1,
                  "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
                },
                "maxItems": 50,
                "minItems": 1
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "type",
              "fields"
            ],
            "properties": {
              "type": {
                "const": "types"
              },
              "fields": {
                "type": "object",
                "maxProperties": 50,
                "minProperties": 1,
                "additionalProperties": {
                  "enum": [
                    "string",
                    "number",
                    "integer",
                    "boolean",
                    "object",
                    "array",
                    "null"
                  ]
                }
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "type",
              "field",
              "format"
            ],
            "properties": {
              "type": {
                "const": "format"
              },
              "field": {
                "type": "string",
                "maxLength": 128,
                "minLength": 1,
                "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
              },
              "format": {
                "enum": [
                  "email",
                  "iso_date",
                  "iso_datetime",
                  "url",
                  "uuid",
                  "e164_phone",
                  "currency_code",
                  "integer_string"
                ]
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "type",
              "parts",
              "total"
            ],
            "properties": {
              "type": {
                "const": "sum"
              },
              "parts": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 128,
                  "minLength": 1,
                  "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
                },
                "maxItems": 20,
                "minItems": 1
              },
              "total": {
                "type": "string",
                "maxLength": 128,
                "minLength": 1,
                "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
              },
              "tolerance": {
                "type": "number",
                "default": 0.0001,
                "maximum": 1000000,
                "minimum": 0
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "type",
              "vendor_path",
              "invoice_id_path",
              "amount_path"
            ],
            "properties": {
              "type": {
                "const": "duplicate"
              },
              "store": {
                "type": "boolean",
                "default": false,
                "description": "Record this invoice's fingerprints so later calls can match it."
              },
              "date_path": {
                "type": "string",
                "maxLength": 128,
                "minLength": 1,
                "description": "Dot path to a YYYY-MM-DD invoice date. Enables the same vendor, amount and date rule."
              },
              "amount_path": {
                "type": "string",
                "maxLength": 128,
                "minLength": 1,
                "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
              },
              "retain_days": {
                "type": "integer",
                "default": 180,
                "maximum": 400,
                "minimum": 1
              },
              "vendor_path": {
                "type": "string",
                "maxLength": 128,
                "minLength": 1,
                "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
              },
              "window_days": {
                "type": "integer",
                "default": 3,
                "maximum": 30,
                "minimum": 0
              },
              "currency_path": {
                "type": "string",
                "maxLength": 128,
                "minLength": 1,
                "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
              },
              "invoice_id_path": {
                "type": "string",
                "maxLength": 128,
                "minLength": 1,
                "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
              }
            },
            "description": "Duplicate invoice check (needs an API key, at most 1 per call). Compares this invoice with ones the same key recorded earlier. Stores keyed HMAC fingerprints only, and only when store is true.",
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "enum": [
                  "url_contains",
                  "json_schema",
                  "equals",
                  "regex",
                  "numeric",
                  "onchain"
                ]
              }
            },
            "description": "Existing types, unchanged: url_contains, json_schema, equals, regex, numeric, onchain."
          }
        ]
      },
      "maxItems": 8,
      "description": "Optional. The worker runs each check. A failed check forces verdict fail. Types: url_contains, json_schema, equals, regex, numeric, onchain, required_fields, types, format, sum, duplicate. duplicate (at most 1, API key only) compares an invoice with ones this key recorded earlier and stores keyed fingerprints only when store is true. At most 3 url_contains checks. Local checks run first; if one fails, no model is called and next_step says what to fix."
    },
    "retain": {
      "type": "boolean",
      "description": "Optional. true stores this call for 24 hours; requires an API key. Default false stores nothing."
    },
    "version": {
      "type": "string",
      "maxLength": 64,
      "description": "Optional version tag for that agent. At most 64 characters."
    },
    "agent_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9._:-]{1,64}$",
      "maxLength": 64,
      "description": "Optional tag for the agent making this call. 1 to 64 characters: letters, digits, and . _ : -. This is not the per-answer agent_id on a consensus answer."
    },
    "criteria": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional. Facts or terms the answer must contain, one per string."
    },
    "evidence": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional. Source passages the answer must be grounded in, one string per passage. Without evidence, grounding cannot be checked."
    },
    "duplicate": {
      "type": "object",
      "required": [
        "vendor_path",
        "invoice_id_path",
        "amount_path"
      ],
      "properties": {
        "type": {
          "const": "duplicate"
        },
        "store": {
          "type": "boolean",
          "default": false,
          "description": "Record this invoice's fingerprints so later calls can match it."
        },
        "date_path": {
          "type": "string",
          "maxLength": 128,
          "minLength": 1,
          "description": "Dot path to a YYYY-MM-DD invoice date. Enables the same vendor, amount and date rule."
        },
        "amount_path": {
          "type": "string",
          "maxLength": 128,
          "minLength": 1,
          "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
        },
        "retain_days": {
          "type": "integer",
          "default": 180,
          "maximum": 400,
          "minimum": 1
        },
        "vendor_path": {
          "type": "string",
          "maxLength": 128,
          "minLength": 1,
          "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
        },
        "window_days": {
          "type": "integer",
          "default": 3,
          "maximum": 30,
          "minimum": 0
        },
        "currency_path": {
          "type": "string",
          "maxLength": 128,
          "minLength": 1,
          "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
        },
        "invoice_id_path": {
          "type": "string",
          "maxLength": 128,
          "minLength": 1,
          "description": "Dot path into the output JSON, at most 8 segments, e.g. invoice.total or items.0.id."
        }
      },
      "description": "The duplicate check: dot paths into agent_output for vendor, invoice id and amount, plus optional currency_path, date_path, window_days, store and retain_days. store true records this invoice's keyed fingerprints so later calls can match it.",
      "additionalProperties": false
    },
    "agent_output": {
      "type": "string",
      "description": "The invoice or payment instruction the agent is about to pay, as a JSON string."
    }
  },
  "additionalProperties": false
}
check_duplicate_invoice output schema
{
  "type": "object",
  "required": [
    "verdict",
    "score",
    "reasons",
    "request_id"
  ],
  "properties": {
    "mode": {
      "enum": [
        "advisory"
      ],
      "type": "string",
      "description": "Present only when the call sent mode: advisory."
    },
    "model": {
      "type": [
        "string",
        "null"
      ]
    },
    "score": {
      "type": [
        "number",
        "null"
      ],
      "description": "null when no model gave a verdict (degraded)."
    },
    "checks": {
      "type": "array"
    },
    "claims": {
      "type": "array"
    },
    "engine": {
      "type": "string",
      "description": "groq, workers_ai, deterministic, or demo. Also signed into the receipt."
    },
    "notice": {
      "type": "string",
      "description": "Advisory only. Fixed text: the call does not approve, hold or release any payment."
    },
    "reasons": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "receipt": {
      "type": [
        "object",
        "null"
      ],
      "required": [
        "receipt_id",
        "issued_at",
        "endpoint",
        "request_sha256",
        "verdict",
        "score",
        "payment",
        "alg",
        "kid",
        "signature"
      ],
      "properties": {
        "alg": {
          "enum": [
            "Ed25519"
          ],
          "type": "string"
        },
        "kid": {
          "type": "string"
        },
        "mode": {
          "enum": [
            "advisory"
          ],
          "type": "string",
          "description": "Present only on schema 5 and 8: the call was advisory, so a person, not the API, owned the decision. Blocking receipts omit it."
        },
        "model": {
          "type": "string",
          "description": "Present only on schema 7 and 8: the model id the provider echoed back for this verdict, for example openai/gpt-oss-120b. Signed, so a changed model id fails verification."
        },
        "score": {
          "type": "number",
          "description": "Judge score from 0 to 1. For consensus this is agreement_score."
        },
        "checks": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "type",
              "passed",
              "evidence_hash"
            ],
            "properties": {
              "type": {
                "type": "string"
              },
              "passed": {
                "type": "boolean"
              },
              "evidence_hash": {
                "type": "string"
              }
            },
            "additionalProperties": false
          },
          "description": "Type, passed, and evidence_hash only. Fetched page text and chain responses are not stored."
        },
        "claims": {
          "type": "object",
          "required": [
            "total",
            "supported",
            "contradicted",
            "unsupported"
          ],
          "properties": {
            "total": {
              "type": "integer"
            },
            "supported": {
              "type": "integer"
            },
            "unsupported": {
              "type": "integer"
            },
            "contradicted": {
              "type": "integer"
            }
          },
          "additionalProperties": false
        },
        "engine": {
          "type": "string",
          "description": "groq, workers_ai, deterministic, or demo. Present on schema 3 and 4."
        },
        "payment": {
          "type": "object",
          "required": [
            "type"
          ],
          "properties": {
            "tx": {
              "type": "string",
              "description": "Settled transaction id, or the accepted payment nonce when nothing was settled."
            },
            "type": {
              "enum": [
                "x402",
                "free-key",
                "prepaid",
                "demo"
              ],
              "type": "string"
            },
            "payer": {
              "type": "string"
            },
            "network": {
              "type": "string"
            },
            "key_prefix": {
              "type": "string",
              "description": "Present on schema 3 free-key and prepaid payments. Omitted on schema 4. Never the secret."
            }
          },
          "description": "x402 includes tx, network, and payer. Schema 4 free-key and prepaid payments are the label only, with no key_prefix. Schema 3 may include the key display prefix, not the secret. demo is the /try/ allowance.",
          "additionalProperties": false
        },
        "verdict": {
          "type": "string",
          "description": "Judge verdict (pass, fail, or retry). For consensus this is false_consensus_risk (low, medium, or high)."
        },
        "version": {
          "type": "string",
          "description": "Present when the call sent a version tag. Omitted otherwise. Older receipts omit it."
        },
        "agent_id": {
          "type": "string",
          "description": "Present when the call sent an agent_id tag. Omitted otherwise. Older receipts omit it."
        },
        "endpoint": {
          "enum": [
            "/v1/judge",
            "/v1/consensus"
          ],
          "type": "string"
        },
        "issued_at": {
          "type": "string",
          "description": "ISO-8601 UTC timestamp."
        },
        "signature": {
          "type": "string",
          "description": "Unpadded base64url Ed25519 signature over the canonical JSON of every field except signature."
        },
        "receipt_id": {
          "type": "string"
        },
        "verification": {
          "enum": [
            "verified",
            "judged",
            "heuristic",
            "failed"
          ],
          "type": "string",
          "description": "verified when a check of the answer passed. judged when a model checked it and did not contradict it. heuristic when only string checks ran. failed when the agreed answer failed verification."
        },
        "request_sha256": {
          "type": "string",
          "description": "Lowercase hex SHA-256 of the canonical JSON of the normalized request. Judge requests include task, agent_output, evidence, and criteria. Consensus requests include task and answers, plus evidence when it was sent. agent_id and version tags are signed separately and are not part of this hash."
        },
        "schema_version": {
          "enum": [
            2,
            3,
            4,
            5,
            7,
            8
          ],
          "type": "integer",
          "description": "7 is schema 4 plus a signed model id, and 8 is schema 5 plus a signed model id: minted when a model gave the verdict. 5 is schema 4 plus a signed mode advisory, minted only for mode: advisory calls. 4 omits key_prefix from payment so a published receipt verifies without key info. 3 adds verification, engine, checks (type, passed, and evidence_hash only), and a claims count, and may include key_prefix. 2 can carry agent_id and version. Older receipts omit this field and still verify."
        }
      },
      "additionalProperties": false
    },
    "verdict": {
      "enum": [
        "pass",
        "fail",
        "retry"
      ],
      "type": "string"
    },
    "version": {
      "type": "string",
      "description": "Echoed when the call sent a version tag."
    },
    "agent_id": {
      "type": "string",
      "description": "Echoed when the call sent an agent_id tag."
    },
    "degraded": {
      "type": "object"
    },
    "duplicate": {
      "type": "object",
      "description": "Present only when the call sent a duplicate check. status is unique, duplicate, possible_duplicate, replay or not_checked. Carries no invoice data."
    },
    "next_step": {
      "type": "object",
      "required": [
        "action",
        "error_type",
        "hint"
      ],
      "properties": {
        "hint": {
          "type": "string",
          "maxLength": 300,
          "description": "Template text naming fields and types to fix. Never contains values from agent_output."
        },
        "action": {
          "enum": [
            "pass",
            "retry",
            "escalate"
          ],
          "type": "string",
          "description": "pass: use the output. retry: fix it using hint and call again. escalate: stop and hand to a person."
        },
        "error_type": {
          "enum": [
            "none",
            "invalid_json",
            "not_an_object",
            "missing_required_field",
            "type_mismatch",
            "format_mismatch",
            "sum_mismatch",
            "check_failed",
            "external_check_failed",
            "duplicate_invoice",
            "possible_duplicate",
            "quality_issue",
            "contradicted_claims",
            "rejected",
            "low_confidence",
            "unverifiable",
            "false_consensus_risk",
            "primary_engine_unavailable"
          ],
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "retention": {
      "type": "object"
    },
    "request_id": {
      "type": "string"
    },
    "fail_closed": {
      "type": "boolean",
      "description": "Present and true only when a finance check failed closed because the primary model was unavailable. Treat it as review."
    },
    "verification": {
      "enum": [
        "verified",
        "judged",
        "heuristic",
        "failed"
      ],
      "type": "string"
    },
    "decision_owner": {
      "enum": [
        "human"
      ],
      "type": "string",
      "description": "Advisory only. A person owns the decision."
    },
    "receipt_reason": {
      "type": "string"
    },
    "recommended_action": {
      "enum": [
        "approve",
        "review",
        "return"
      ],
      "type": "string",
      "description": "Advisory only, deterministic and not signed. Judge: next_step pass is approve, escalate is review, retry is return (send back to the agent). Consensus: risk low is approve, medium or high is review."
    }
  }
}
check_duplicate_invoice annotations
{
  "title": "Check an invoice for duplicates before the agent pays",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
consensus — False-consensus check across 2 to 16 agent answers
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

False-consensus check for 2 to 16 answers to the same task. It scores how the answers agree and flags agreement that looks copied or too thin to trust. Screwtape is not tied to the agent framework or the model that wrote the answers. Call it when several agents, samples or tools answered the same question and you are about to accept the majority. Do NOT call it with a single answer (use judge), with answers to different tasks, or as proof that an answer is correct: high agreement is not evidence. Inputs: task, answers (2 to 16 objects {agent_id?: string, output: string}), optional evidence (a string or an array of strings, used when scoring), retain, and optional call-level agent_id and version tags. The call-level agent_id is not the per-answer agent_id. Returns: consensus_answer, agreement_score, false_consensus_risk (low, medium or high), reasons, clusters, engine, request_id, retention, the tags when sent, and receipt when signing is configured. In that receipt, verdict is false_consensus_risk and score is agreement_score. If the risk is medium or high, verify consensus_answer with judge before using it. next_step.action is pass for low risk and escalate otherwise. Cost: 1 call. A free key covers 10 calls per UTC day; without a key, pay $0.005 USDC on Base or Solana per call with x402.

consensus input schema
{
  "type": "object",
  "required": [
    "task",
    "answers"
  ],
  "properties": {
    "mode": {
      "enum": [
        "blocking",
        "advisory"
      ],
      "type": "string",
      "description": "Optional. blocking (the default) is today's behaviour. advisory computes the same verdict, checks, next_step and receipt, then adds mode, decision_owner human, recommended_action (approve, review or return) and a notice. The receipt signs mode advisory as schema_version 5. Same price."
    },
    "task": {
      "type": "string",
      "description": "The question all answers respond to."
    },
    "share": {
      "type": "boolean",
      "description": "Optional. false keeps this call out of opt-in data sharing even when the key has sharing on. It cannot turn sharing on."
    },
    "retain": {
      "type": "boolean",
      "description": "Optional. true stores this call for 24 hours; requires an API key. Default false."
    },
    "answers": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "output"
        ],
        "properties": {
          "output": {
            "type": "string",
            "description": "That agent's answer."
          },
          "agent_id": {
            "type": "string",
            "description": "Optional name of the agent or sample that produced this answer."
          }
        }
      },
      "maxItems": 16,
      "minItems": 2,
      "description": "2 to 16 answers. Each is {agent_id (optional, string), output (string)}. Use one entry per independent agent or sample."
    },
    "version": {
      "type": "string",
      "maxLength": 64,
      "description": "Optional version tag for that agent. At most 64 characters."
    },
    "agent_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9._:-]{1,64}$",
      "maxLength": 64,
      "description": "Optional tag for the agent making this call. 1 to 64 characters: letters, digits, and . _ : -. This is not the per-answer agent_id on a consensus answer."
    },
    "evidence": {
      "oneOf": [
        {
          "type": "string",
          "maxLength": 4000
        },
        {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 4000
          },
          "maxItems": 20
        }
      ],
      "description": "Optional passages the agreed answer should be grounded in. A string is one passage. An array holds up to 20 passages of 4000 characters. Used when scoring false-consensus risk."
    }
  },
  "additionalProperties": false
}
consensus output schema
{
  "type": "object",
  "required": [
    "agreement_score",
    "false_consensus_risk",
    "reasons",
    "request_id"
  ],
  "properties": {
    "mode": {
      "enum": [
        "advisory"
      ],
      "type": "string",
      "description": "Present only when the call sent mode: advisory."
    },
    "model": {
      "type": [
        "string",
        "null"
      ]
    },
    "engine": {
      "type": "string",
      "description": "groq, workers_ai, deterministic, or demo."
    },
    "notice": {
      "type": "string",
      "description": "Advisory only. Fixed text: the call does not approve, hold or release any payment."
    },
    "reasons": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "receipt": {
      "type": [
        "object",
        "null"
      ],
      "required": [
        "receipt_id",
        "issued_at",
        "endpoint",
        "request_sha256",
        "verdict",
        "score",
        "payment",
        "alg",
        "kid",
        "signature"
      ],
      "properties": {
        "alg": {
          "enum": [
            "Ed25519"
          ],
          "type": "string"
        },
        "kid": {
          "type": "string"
        },
        "mode": {
          "enum": [
            "advisory"
          ],
          "type": "string",
          "description": "Present only on schema 5 and 8: the call was advisory, so a person, not the API, owned the decision. Blocking receipts omit it."
        },
        "model": {
          "type": "string",
          "description": "Present only on schema 7 and 8: the model id the provider echoed back for this verdict, for example openai/gpt-oss-120b. Signed, so a changed model id fails verification."
        },
        "score": {
          "type": "number",
          "description": "Judge score from 0 to 1. For consensus this is agreement_score."
        },
        "checks": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "type",
              "passed",
              "evidence_hash"
            ],
            "properties": {
              "type": {
                "type": "string"
              },
              "passed": {
                "type": "boolean"
              },
              "evidence_hash": {
                "type": "string"
              }
            },
            "additionalProperties": false
          },
          "description": "Type, passed, and evidence_hash only. Fetched page text and chain responses are not stored."
        },
        "claims": {
          "type": "object",
          "required": [
            "total",
            "supported",
            "contradicted",
            "unsupported"
          ],
          "properties": {
            "total": {
              "type": "integer"
            },
            "supported": {
              "type": "integer"
            },
            "unsupported": {
              "type": "integer"
            },
            "contradicted": {
              "type": "integer"
            }
          },
          "additionalProperties": false
        },
        "engine": {
          "type": "string",
          "description": "groq, workers_ai, deterministic, or demo. Present on schema 3 and 4."
        },
        "payment": {
          "type": "object",
          "required": [
            "type"
          ],
          "properties": {
            "tx": {
              "type": "string",
              "description": "Settled transaction id, or the accepted payment nonce when nothing was settled."
            },
            "type": {
              "enum": [
                "x402",
                "free-key",
                "prepaid",
                "demo"
              ],
              "type": "string"
            },
            "payer": {
              "type": "string"
            },
            "network": {
              "type": "string"
            },
            "key_prefix": {
              "type": "string",
              "description": "Present on schema 3 free-key and prepaid payments. Omitted on schema 4. Never the secret."
            }
          },
          "description": "x402 includes tx, network, and payer. Schema 4 free-key and prepaid payments are the label only, with no key_prefix. Schema 3 may include the key display prefix, not the secret. demo is the /try/ allowance.",
          "additionalProperties": false
        },
        "verdict": {
          "type": "string",
          "description": "Judge verdict (pass, fail, or retry). For consensus this is false_consensus_risk (low, medium, or high)."
        },
        "version": {
          "type": "string",
          "description": "Present when the call sent a version tag. Omitted otherwise. Older receipts omit it."
        },
        "agent_id": {
          "type": "string",
          "description": "Present when the call sent an agent_id tag. Omitted otherwise. Older receipts omit it."
        },
        "endpoint": {
          "enum": [
            "/v1/judge",
            "/v1/consensus"
          ],
          "type": "string"
        },
        "issued_at": {
          "type": "string",
          "description": "ISO-8601 UTC timestamp."
        },
        "signature": {
          "type": "string",
          "description": "Unpadded base64url Ed25519 signature over the canonical JSON of every field except signature."
        },
        "receipt_id": {
          "type": "string"
        },
        "verification": {
          "enum": [
            "verified",
            "judged",
            "heuristic",
            "failed"
          ],
          "type": "string",
          "description": "verified when a check of the answer passed. judged when a model checked it and did not contradict it. heuristic when only string checks ran. failed when the agreed answer failed verification."
        },
        "request_sha256": {
          "type": "string",
          "description": "Lowercase hex SHA-256 of the canonical JSON of the normalized request. Judge requests include task, agent_output, evidence, and criteria. Consensus requests include task and answers, plus evidence when it was sent. agent_id and version tags are signed separately and are not part of this hash."
        },
        "schema_version": {
          "enum": [
            2,
            3,
            4,
            5,
            7,
            8
          ],
          "type": "integer",
          "description": "7 is schema 4 plus a signed model id, and 8 is schema 5 plus a signed model id: minted when a model gave the verdict. 5 is schema 4 plus a signed mode advisory, minted only for mode: advisory calls. 4 omits key_prefix from payment so a published receipt verifies without key info. 3 adds verification, engine, checks (type, passed, and evidence_hash only), and a claims count, and may include key_prefix. 2 can carry agent_id and version. Older receipts omit this field and still verify."
        }
      },
      "additionalProperties": false
    },
    "version": {
      "type": "string",
      "description": "Echoed when the call sent a version tag."
    },
    "agent_id": {
      "type": "string",
      "description": "Echoed when the call sent an agent_id tag. Not the per-answer agent_id."
    },
    "clusters": {
      "type": "array"
    },
    "degraded": {
      "type": "object"
    },
    "next_step": {
      "type": "object",
      "required": [
        "action",
        "error_type",
        "hint"
      ],
      "properties": {
        "hint": {
          "type": "string",
          "maxLength": 300,
          "description": "Template text naming fields and types to fix. Never contains values from agent_output."
        },
        "action": {
          "enum": [
            "pass",
            "retry",
            "escalate"
          ],
          "type": "string",
          "description": "pass: use the output. retry: fix it using hint and call again. escalate: stop and hand to a person."
        },
        "error_type": {
          "enum": [
            "none",
            "invalid_json",
            "not_an_object",
            "missing_required_field",
            "type_mismatch",
            "format_mismatch",
            "sum_mismatch",
            "check_failed",
            "external_check_failed",
            "duplicate_invoice",
            "possible_duplicate",
            "quality_issue",
            "contradicted_claims",
            "rejected",
            "low_confidence",
            "unverifiable",
            "false_consensus_risk",
            "primary_engine_unavailable"
          ],
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "retention": {
      "type": "object"
    },
    "request_id": {
      "type": "string"
    },
    "verification": {
      "enum": [
        "verified",
        "judged",
        "heuristic",
        "failed"
      ],
      "type": "string"
    },
    "decision_owner": {
      "enum": [
        "human"
      ],
      "type": "string",
      "description": "Advisory only. A person owns the decision."
    },
    "receipt_reason": {
      "type": "string"
    },
    "agreement_score": {
      "type": [
        "number",
        "null"
      ],
      "description": "null when no model scored agreement (degraded)."
    },
    "consensus_answer": {
      "type": "string"
    },
    "recommended_action": {
      "enum": [
        "approve",
        "review",
        "return"
      ],
      "type": "string",
      "description": "Advisory only, deterministic and not signed. Judge: next_step pass is approve, escalate is review, retry is return (send back to the agent). Consensus: risk low is approve, medium or high is review."
    },
    "false_consensus_risk": {
      "enum": [
        "low",
        "medium",
        "high"
      ],
      "type": "string"
    },
    "unsupported_agreement": {
      "type": "boolean"
    }
  }
}
consensus annotations
{
  "title": "False-consensus check across 2 to 16 agent answers",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_api_key — Get a free API key (proof of work, no human approval)
Advertised by the server during the last successful anonymous check.

Create a free Screwtape.ai API key (10 calls per UTC day) with no human approval. Call it only when no Screwtape key is configured and you can compute SHA-256 with a code tool, because the proof of work must be computed exactly, not guessed. Do NOT call it when a key already exists, to get more quota (it is limited to 5 keys per IP per hour and per UTC day), or without a valid pow_nonce. A missing nonce returns an error that describes the challenge. Inputs: pow_nonce (required string matching ^[A-Za-z0-9_-]{8,64}$; SHA-256 of the UTF-8 string screwtape-signup-v1:<current UTC YYYY-MM-DD>:<nonce> must start with 12 zero bits, which is 3 hex zeros), email (optional), name (optional, at most 80 characters). Returns: api_key (shown once; store it securely and send it as Authorization: Bearer), key metadata and request_id. Only the key's SHA-256 hash is stored. Cost: free. Needs no key and no payment.

get_api_key input schema
{
  "type": "object",
  "required": [
    "pow_nonce"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 80,
      "description": "Optional agent or client name, at most 80 characters."
    },
    "email": {
      "type": "string",
      "description": "Optional. Omit it to store no email."
    },
    "pow_nonce": {
      "type": "string",
      "description": "Required. SHA-256 of the UTF-8 string screwtape-signup-v1:YYYY-MM-DD:<nonce> must have 12 leading zero bits. Nonce matches ^[A-Za-z0-9_-]{8,64}$. YYYY-MM-DD is the UTC day."
    },
    "data_sharing": {
      "type": "boolean",
      "description": "Optional, off by default. Only true turns on opt-in data sharing for the new key: redacted samples of its calls are kept 90 days. Turn it off anytime with PATCH /v1/keys/me/data-sharing. See https://screwtape.ai/privacy/#opt-in-data-sharing."
    }
  },
  "additionalProperties": false
}
get_api_key output schema
{
  "type": "object",
  "required": [
    "api_key",
    "key",
    "request_id"
  ],
  "properties": {
    "key": {
      "type": "object"
    },
    "api_key": {
      "type": "string"
    },
    "request_id": {
      "type": "string"
    }
  }
}
get_api_key annotations
{
  "title": "Get a free API key (proof of work, no human approval)",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
buy_pack — Retired: prepaid packs are no longer sold to agents
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Retired. No prepaid pack is sold to agents any more (Starter and Builder were retired), so this tool always returns the error pack_retired with how a person buys the Sandbox Evaluation Pack by card. It does not move funds and needs no key. Kept so existing clients get a clear answer. To pay per call without a key, call judge or consensus and handle the x402 payment requirements.

buy_pack input schema
{
  "type": "object",
  "properties": {
    "pack": {
      "type": "string",
      "description": "Any former pack id. Ignored: every pack answers pack_retired."
    }
  },
  "additionalProperties": false
}
buy_pack output schema
{
  "type": "object",
  "description": "Payment requirements and how to buy the pack. This tool does not move funds."
}
buy_pack annotations
{
  "title": "Retired: prepaid packs are no longer sold to agents",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
publish_receipt — Publish one signed receipt as a Screwtape Verified badge
Advertised by the server during the last successful anonymous check.
Open-world

Publish a signed receipt you own so a public page and a Screwtape Verified badge can link to that one verdict. Call it when you want to show that a specific output received a specific verdict. Do NOT call it to certify an agent in general: the page says this output received this verdict at this time, and it is not a general safety certification of the agent. Nothing is public until this call. Inputs: receipt_id (required), include_content (optional boolean, default false; true stores and shows the task and agent output only if that call was retained), label (optional, at most 80 characters), unpublish (optional boolean; true removes the public page). Returns public_url, badge_svg_url, embed_html, and embed_markdown. Requires the API key that owns the receipt. It does not accept x402 payment. Cost: free.

publish_receipt input schema
{
  "type": "object",
  "required": [
    "receipt_id"
  ],
  "properties": {
    "label": {
      "type": "string",
      "maxLength": 80,
      "description": "Optional label, at most 80 characters."
    },
    "unpublish": {
      "type": "boolean",
      "description": "true removes the public page and the badge."
    },
    "receipt_id": {
      "type": "string",
      "description": "Receipt id from a judge or consensus response this key owns."
    },
    "include_content": {
      "type": "boolean",
      "description": "Default false. true copies the retained task and agent output onto the public page."
    }
  },
  "additionalProperties": false
}
publish_receipt output schema
{
  "type": "object",
  "properties": {
    "embed_html": {
      "type": "string"
    },
    "public_url": {
      "type": "string"
    },
    "request_id": {
      "type": "string"
    },
    "unpublished": {
      "type": "boolean"
    },
    "badge_svg_url": {
      "type": "string"
    },
    "embed_markdown": {
      "type": "string"
    }
  }
}
publish_receipt annotations
{
  "title": "Publish one signed receipt as a Screwtape Verified badge",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
951 ms
95th percentile latency
951 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 951 ms · metadata changed · 6 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http screwtape-mcp https://screwtape.ai/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add screwtape-mcp --url https://screwtape.ai/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable screwtape-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "screwtape-mcp": {
      "url": "https://screwtape.ai/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "screwtape-mcp": {
      "type": "streamableHttp",
      "url": "https://screwtape.ai/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start screwtape-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "screwtape-mcp": {
      "type": "http",
      "url": "https://screwtape.ai/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http screwtape-mcp https://screwtape.ai/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "screwtape-mcp": {
      "url": "https://screwtape.ai/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "screwtape-mcp": {
      "serverUrl": "https://screwtape.ai/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Screwtape MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Screwtape MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing