{"serverId":"mcp-registry/ai.tunnelmind/data","tools":[{"name":"agent_registries_lookup","fixed":{"name":"agent_registries_lookup","description":"P75 registry aggregation: the cross-lens join applied to agent identity.\nIncumbent providers each consult only their own registry; this endpoint\nchecks every registry TunnelMind can reach and labels each answer with\nan explicit state, so a gap can never be mistaken for a clean result:\n\n- `observed` — the subject IS in this registry (record attached)\n- `not_present` — checked, and it isn't (an observation, not a gap)\n- `not_applicable` — the registry doesn't key on this subject type\n- `degraded` ","inputSchema":{"type":"object","required":["subject"],"properties":{"receipt":{"enum":["true"],"type":"string","description":"Attach a signed TunnelMind Receipt v1.0 over the aggregation."},"subject":{"type":"string","description":"IP address, domain, or agent name / User-Agent fragment."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":237,"tokensAfter":237},{"name":"attributes_lookup","fixed":{"name":"attributes_lookup","description":"P73 fast attributes endpoint (PIP-PLAN P3): a full `POST /v1/verify`\nresolve fans out across four lenses (~2s) — fine for preflight, fatal\ninside a per-request authorization loop. This endpoint serves the\nlast-known signed bundle from a single KV read, with the P69 freshness\ncontract deciding how much to trust it.\n\nUse this tool when:\n- A policy decision point (OPA, Cerbos, Cedar) needs node attributes\n  on its hot path and can tolerate `valid_until`-bounded staleness.\n- An agent re-checks a nod","inputSchema":{"type":"object","required":["node"],"properties":{"node":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":180,"tokensAfter":180},{"name":"audit_export","fixed":{"name":"audit_export","description":"Returns NDJSON (one JSON object per line) of audit log entries. Each entry records\nthe operation called, the identity, hashes of the request and response, duration,\nand an Ed25519 signature over the canonical entry JSON. Entries are hash-chained:\neach entry's `prev_entry_hash` is SHA-256 of the previous entry's signature,\nmaking deletion of any entry detectable offline.\n\nAuthenticated callers receive only their own entries (`identity_sub` match).\nAdmin key holders receive all entries.\n\nUse this ","inputSchema":{"type":"object","properties":{"to":{"type":"string","format":"date-time"},"from":{"type":"string","format":"date-time","example":"2026-04-17T00:00:00Z"},"limit":{"type":"integer","default":1000,"maximum":5000,"minimum":1}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":219,"tokensAfter":219},{"name":"cancel_task","fixed":{"name":"cancel_task","description":"Marks the task as `cancelled`. If the task is already in a terminal state\n(`complete`, `failed`, `expired`), returns 409 Conflict. Only the identity\nthat created the task may cancel it.\n\nUse this tool when:\n- You submitted a probe with `?async=true` and no longer need the result.\n- You want to free up a pending task before it expires.\n\nDo NOT use this tool when:\n- The task is already complete — cancellation is not possible.\n\nInputs:\n- `task_id` (path, required): 26-char ULID.\n\nReturns:\n- `task_i","inputSchema":{"type":"object","required":["task_id"],"properties":{"task_id":{"type":"string","pattern":"^[A-Z0-9]{26}$"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":189,"tokensAfter":189},{"name":"check_receipt_revoked","fixed":{"name":"check_receipt_revoked","description":"Single-item revocation lookup per Receipt Format v1.0 §8.2. Verifiers that\ndo not want to maintain a local mirror of `/.well-known/receipt-revocations.json`\ncall this endpoint instead. The response includes `feed_version` for cache\ncoherence.\n\nUse this tool when:\n- You are verifying a receipt and need to confirm its `signature.key_id` is still trusted.\n- You are verifying a receipt and need to confirm the specific `receipt_id` was not retracted by its issuer.\n- You hold receipts long-term and wa","inputSchema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"019e8054-4449-7a36-869f-cb76a3447d5a","description":"UUIDv7 of a specific receipt to check."},"key_id":{"type":"string","example":"tm-receipt-2026-05","description":"Receipt-format signing key_id to check."}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":240,"tokensAfter":240},{"name":"compliance_export","fixed":{"name":"compliance_export","description":"Generates a signed export bundle of your ledger over an optional time\nwindow, mapped to your regime's field names and citation, with a manifest\n+ chain-integrity proof + the latest signed checkpoint. Choose the format\nwith ?format= (signed_json | csv | eat | stix; defaults to your profile's\nfirst) and override the regime with ?regime=. The response is a downloadable\nartifact your auditor can verify independently against the spec.\n","inputSchema":{"type":"object","properties":{"to":{"type":"string","description":"ISO8601 upper bound."},"from":{"type":"string","description":"ISO8601 lower bound."},"format":{"type":"string","description":"signed_json | csv | eat | stix."},"regime":{"type":"string","description":"Override the profile regime for this export."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":227,"tokensAfter":227},{"name":"create_free_key","fixed":{"name":"create_free_key","description":"Self-serve free tier — the rung between anonymous access and paid\nblocks. One email in, one API key out, shown exactly once.\n\nUse this tool when:\n- You are calling anonymously and hitting the anonymous rate limit.\n- You want your calls identified so usage survives IP changes.\n\nLimits:\n- 50 requests/day, counted per key rather than per IP (same endpoints\n  as anonymous; anonymous is 10/min and 100/day per IP).\n- One active free key per email; 3 signups per IP per day.\n- The raw key is returned on","inputSchema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","example":"dev@example.com"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":193,"tokensAfter":193},{"name":"create_subscription","fixed":{"name":"create_subscription","description":"Subscribe to a node (ip, domain, asn, or entity slug). On a recurring\nsweep (~20 min) TunnelMind re-runs the fused `POST /v1/verify` verdict and,\nwhen the *material* result changes — the verdict label flips, the trust\nscore crosses a band, or the signal set changes — POSTs a signed event to\nyour `callback_url`.\n\nWebhook authenticity: every delivery carries an `X-TunnelMind-Signature:\nsha256=<hex>` header, an HMAC-SHA256 over the raw request body keyed by the\n`signing_key` returned ONCE at creati","inputSchema":{"type":"object","required":["node","callback_url"],"properties":{"node":{"type":"string","example":"example.com"},"events":{"type":"array","items":{"enum":["verdict_change"],"type":"string"}},"callback_url":{"type":"string","format":"uri","example":"https://hooks.example.com/tunnelmind"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":240,"tokensAfter":240},{"name":"cross_lens_lookup","fixed":{"name":"cross_lens_lookup","description":"Returns all three lens views for a single node key without computing a\nfused verdict. Use this when you want raw transparency — the Tracker\ncatalog presence, Scry attacker observations, and Sigil supply-graph\nposition — and intend to make your own decision. For an opinionated\nverdict, call `cross_lens_verify` instead. For an agent-side\nallow/caution/deny gate plus signed consultation receipt, call\n`preflight_should_i_act`.\n\nCoverage block exposes which lenses responded so agents can reason about","inputSchema":{"type":"object","required":["node"],"properties":{"node":{"type":"string","description":"IPv4/IPv6 address, domain, ASN with optional `AS` prefix, or entity_slug.\nType is auto-detected.\n"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":212,"tokensAfter":212},{"name":"delete_subscription","fixed":{"name":"delete_subscription","description":"Cancel a subscription.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":44,"tokensAfter":44},{"name":"explain_verdict","fixed":{"name":"explain_verdict","description":"Call this when you need to ACT ON a verdict and prove why. It returns the\nexact verdict `/v1/verify/{node}` computes (same fusion, same weights)\nPLUS a traced evidence chain: every claim is attributed to where it came\nfrom — the attested sensor fleet (with attestation tier), a named Augur\nthreat feed, sellers.json/ads.txt supply-graph presence, the cross-lens\nco-observation join, the DDG/IAB tracker corpus — and how much each item\nmoved the verdict (`weight`; null = supplementary, not scored).\n\n","inputSchema":{"type":"object","required":["node"],"properties":{"node":{"type":"string","description":"IPv4/IPv6, ASN (AS####), domain, or entity_slug."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":197,"tokensAfter":197},{"name":"get_analyst_config","fixed":{"name":"get_analyst_config","description":"Returns the TunnelMind analyst config bundle. Configures any LLM\n(Claude, GPT, Gemini, local) to behave as a TunnelMind analyst that\nknows the data graph, follows the 5-call golden path, and surfaces\nattestation_tier on every claim.\n\nThe bundle is signed inline (Ed25519, key_id from\n/.well-known/receipt-signing-key.json). Add `?receipt=true` to wrap\nthe response in a Receipt v1.0 envelope for end-to-end audit.\n\nUse this tool when:\n- You want to configure a new LLM runtime to act as a TunnelMind ","inputSchema":{"type":"object","properties":{"receipt":{"enum":["true","false"],"type":"string","default":"false","description":"When true, wrap the bundle in a Receipt v1.0 envelope."},"surface":{"enum":["data","scry","sigil"],"type":"string","default":"data"},"version":{"type":"string","example":"1.0.0","description":"Pin a specific bundle version. Omit for latest."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":259,"tokensAfter":259},{"name":"get_api_key","fixed":{"name":"get_api_key","description":"Returns the tier, label, masked owner email, creation date, last-used timestamp,\ntoday's request count, and daily request limit for the API key used in this request.\nUseful for agents that need to monitor their own quota consumption.\n\nUse this tool when:\n- You want to check how many requests your key has used today.\n- You need to know your current tier or daily limit.\n- You want to confirm that your API key is active.\n\nDo NOT use this tool when:\n- You want to manage multiple keys — this endpoint","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":166,"tokensAfter":166},{"name":"get_bgp_events","fixed":{"name":"get_bgp_events","description":"Returns the routing anomalies the bgp-monitor has observed against\nTunnelMind's BGP watchlist — the witnessability layer's routing\ndimension. The monitor polls RIPEstat (RIPE NCC) on a cron, self-baselines\neach watched prefix's origin set on first sight, then records an event\nwhenever a later poll deviates from that baseline.\n\nUse this to check whether a prefix or ASN you depend on (an SSP's egress,\na publisher's network, your own infrastructure) has shown a hijack-shaped\nrouting event. `event_t","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":100,"maximum":500,"minimum":1,"description":"Max events returned (default 100, hard cap 500)."},"resource":{"type":"string","description":"Filter to one watched resource — a CIDR prefix (e.g. 45.32.0.0/24) or an ASN (e.g. AS13335). Omit for all."},"since_ms":{"type":"integer","format":"int64","description":"Unix epoch milliseconds lower bound on observed_at."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":277,"tokensAfter":277},{"name":"get_changes","fixed":{"name":"get_changes","description":"The change ledger, read back: what TunnelMind itself changed in the window,\nnewest first, as one Ed25519-signed document.\n\nUse this tool when:\n- you need to know what changed in TunnelMind's site, prices, tools or operations, and want it signed rather than asserted.\n- you are checking whether a tool or price you rely on moved recently.\n\nItems come from receipts with lens `config`: the four recorded kinds plus\n`toolset_change` (derived from the tool registry; its `agent`, `class`,\n`reversible` an","inputSchema":{"type":"object","properties":{"days":{"type":"integer","default":30,"maximum":365,"minimum":1,"description":"Window length in days, 1-365."},"kind":{"enum":["site_change","price_change","retirement","ratified_op","toolset_change"],"type":"string","description":"Only this kind. Omit for all kinds."},"limit":{"type":"integer","default":100,"maximum":500,"minimum":1,"description":"Maximum items returned, 1-500."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":272,"tokensAfter":272},{"name":"get_demand_aggregate","fixed":{"name":"get_demand_aggregate","description":"Weekly public aggregate of demand: what callers asked this API for that it\ndid not have or rejected (ghost routes, rejected arguments, ghost MCP tools, tools/list counts). One ISO week, Monday 00:00 UTC to the next Monday\n00:00 UTC (`?week=` picks the week containing a date; default is the current\nweek). Aggregate rows only: a row is published only when at least\n`n_threshold` (3) distinct actors produced it in the window. Rows below that\nare omitted, and their count is published in `suppressed` ","inputSchema":{"type":"object","properties":{"week":{"type":"string","format":"date","description":"Any date (YYYY-MM-DD) inside the wanted ISO week. Defaults to the current week."},"receipt":{"type":"boolean","default":false,"description":"When true, attach a signed Receipt v1.0 committed to the transparency log. Additive — a signing failure never costs you the observation (ADR-014)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":263,"tokensAfter":263},{"name":"get_domain","fixed":{"name":"get_domain","description":"Returns the complete surveillance intelligence record for a domain name. If the\ndomain is in TunnelMind's tracker database (80,000+ entries), the response includes\ntracker category, risk score, fingerprinting data, cookie persistence, IAB TCF\npurposes, and the owning corporate entity. If the domain is not in the database,\na live probe is automatically run: RDAP registration data, DNS records (MX, SPF,\nTXT verification tokens), HTTP headers, and CSP third-party actors are fetched\nfresh from the e","inputSchema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","example":"doubleclick.net","description":"Domain name to look up (www. prefix stripped automatically)"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":207,"tokensAfter":207},{"name":"get_entity","fixed":{"name":"get_entity","description":"Returns an entity record for a surveillance company or data broker, including its\nindustry, estimated annual data value per user (in USD), categories of personal data\ncollected, and the full list of domains it controls. Free tier returns 5 domains,\npaid returns up to 200.\n\nUse this tool when:\n- You want to understand what corporate entity owns or controls a tracker domain.\n- You need to assess the total surveillance footprint of a company (e.g., Alphabet,\n  Meta, Oracle).\n- You are building a co","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","example":"alphabet","pattern":"^[a-z0-9\\-]+$"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":191,"tokensAfter":191},{"name":"get_feedback","fixed":{"name":"get_feedback","description":"Public read of the crowd-sourced outcome aggregate for a node — how\ncallers reported their real-world results after acting on its verdict.\nAdvisory signal, not a trust verdict. An empty aggregate returns cleanly\nwith `total: 0` and `signal: none`.\n\n`signal` is derived: `none` (no reports), `insufficient` (<3),\n`positive` / `negative` (score past ±0.3), or `mixed`.\n","inputSchema":{"type":"object","required":["node"],"properties":{"node":{"type":"string","description":"ip, domain, asn, or entity slug."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":155,"tokensAfter":155},{"name":"get_freshness","fixed":{"name":"get_freshness","description":"D4 — the freshness contract a PDP can gate on. For each lens (Scry /\nSigil / Tracker / GhostRoute) this reports the newest observation\ntimestamp in the corpus, the declared ingest cadence (taken from the\ningester's own code and cron schedules, never asserted), the published\nSLO, the current corpus age in seconds, and whether the SLO holds.\nGhostRoute reports its three corpus workers (CT hourly, RPKI 6-hourly,\nASN daily) individually.\n\nSLO rule: 2x the declared cadence — one fully missed ingest c","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":166,"tokensAfter":166},{"name":"get_pricing","fixed":{"name":"get_pricing","description":"Spec 097 / ADR-035 Amendment C8. Returns the usage-tiered price schedule\nfor paid calls. Prices are integer strings of USDC atomic units\n(6 decimals). Rows are `{tier, from, to, price_atomic}`; `to` is null for\nthe open tier. `anonymous` is the price a call without an API key pays.\nThe schedule is the compiled-in default unless a validated override is held\nin KV (one KV read, no database read); `schedule_source` says which.\n`band` is the floor and ceiling every tier price sits inside.\n`schedule_","inputSchema":{"type":"object","properties":{"receipt":{"type":"boolean","default":false,"description":"When true, attach a signed Receipt v1.0 committed to the transparency log. Additive — a signing failure never costs you the observation (ADR-014)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":223,"tokensAfter":223},{"name":"get_receipt","fixed":{"name":"get_receipt","description":"Returns metadata for a TunnelMind surveillance receipt — a signed document proving\nthat a specific user's surveillance exposure was observed, measured, and recorded at\na specific time. Does NOT return the receipt's signature (anti-phishing protection).\nTo verify a receipt's content integrity, use `verify_receipt` with the hash and\nsignature from the receipt document itself.\n\nUse this tool when:\n- You have a receipt ID and want to confirm it was genuinely issued by TunnelMind.\n- You need the issu","inputSchema":{"type":"object","required":["receipt_id"],"properties":{"receipt_id":{"type":"string","pattern":"^[a-zA-Z0-9\\-]+$","maxLength":128}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":194,"tokensAfter":194},{"name":"get_referral","fixed":{"name":"get_referral","description":"For a capability TunnelMind does not provide itself, returns the destination's\nendpoint and schema URL from a reviewed catalog, plus facts TunnelMind\nitself observed: when its own probe last reached the destination, whether the\ndestination advertises x402 or Web Bot Auth, and the origin ASN and RPKI state\nof the host. Every fact carries `{value, tier, source}` and a coverage state.\nThe response carries a signed Receipt v1.0.\nThe signature attests what TunnelMind recorded, not that the destinatio","inputSchema":{"type":"object","required":["capability"],"properties":{"X-PAYMENT":{"type":"string","description":"base64(JSON) x402 payment. Absent on the first call, which returns the 402 challenge."},"capability":{"type":"string","description":"Capability slug from the referral catalog, for example whois_history."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":242,"tokensAfter":242},{"name":"get_referral_log","fixed":{"name":"get_referral_log","description":"Weekly public aggregate of demand: what callers asked this API for that it\ndid not have or rejected on paid referrals (kinds referral and ghost_referral only). One ISO week, Monday 00:00 UTC to the next Monday\n00:00 UTC (`?week=` picks the week containing a date; default is the current\nweek). Aggregate rows only: a row is published only when at least\n`n_threshold` (3) distinct actors produced it in the window. Rows below that\nare omitted, and their count is published in `suppressed` ({rows, even","inputSchema":{"type":"object","properties":{"week":{"type":"string","format":"date","description":"Any date (YYYY-MM-DD) inside the wanted ISO week. Defaults to the current week."},"receipt":{"type":"boolean","default":false,"description":"When true, attach a signed Receipt v1.0 committed to the transparency log. Additive — a signing failure never costs you the observation (ADR-014)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":262,"tokensAfter":262},{"name":"get_self_view","fixed":{"name":"get_self_view","description":"P83 Gate 1. The caller is the subject: every fact here comes from the\nTLS handshake and headers the caller has already sent, so there is no\nrender, no browser, and nothing to authorize.\n\nThree surfaces:\n- `client` — user-agent, HTTP protocol, TLS version/cipher, ClientHello\n  length, the pre-hashed JA3/JA4 input components, header order.\n- `state` — how many cookies were sent (never their values), Referer,\n  DNT, Global Privacy Control.\n- `network` — address, ASN and operator, coarse geography, ","inputSchema":{"type":"object","properties":{"receipt":{"type":"boolean","default":false}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":179,"tokensAfter":179},{"name":"get_stats","fixed":{"name":"get_stats","description":"One public \"state of the corpus\" readout — the whole graph in a single\ncall. Distinct from the Scry-only sensor stats at\napi.tunnelmind.ai/v1/stats (which this reuses for the `scry` block): this\nspans Scry, Sigil, and Tracker plus the attestation and routing layers.\n\nUse it to cite live coverage — how many publishers / SSPs / DSPs / sell\npaths / sellers.json seats are in the Sigil supply graph, how many tracker\nentities and domains Tracker holds, how many ATAP witness events and OAIs\nthe attesta","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":166,"tokensAfter":166},{"name":"get_subscription","fixed":{"name":"get_subscription","description":"Read one of your subscriptions (signing_key redacted).","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":52,"tokensAfter":52},{"name":"get_task","fixed":{"name":"get_task","description":"Returns the current status of a task created by an `?async=true` intel request.\nPoll this endpoint until `status` is one of: `complete`, `failed`, `cancelled`,\n`expired`. On `complete`, the `result` field contains the same payload the sync\nendpoint would have returned. On `failed`, `error.message` explains the failure.\n\nUse this tool when:\n- You submitted an intel probe with `?async=true` and need to retrieve the result.\n- You want to check whether a background task finished without opening an S","inputSchema":{"type":"object","required":["task_id"],"properties":{"task_id":{"type":"string","example":"01KPFC524XASR404D436DX60AP","pattern":"^[A-Z0-9]{26}$"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":197,"tokensAfter":197},{"name":"get_tool_registry","fixed":{"name":"get_tool_registry","description":"Spec 097 FR-010 / ADR-034. Returns the tool registry generated from\nopenapi.yaml: one entry per operation with its version, status\n(active / deprecated / retired), lens and schema hash, plus the\n`registry_hash` over the whole set. Retired entries stay listed.\nNo database read: the registry is compiled into the running Worker.\n\nFreshness: `observed_at` is the response time, `valid_until` is 24 hours\nlater, `stale_if_error` is 86400 seconds. `deployed_at` is the Worker\nversion timestamp, or null w","inputSchema":{"type":"object","properties":{"receipt":{"type":"boolean","default":false,"description":"When true, attach a signed Receipt v1.0 committed to the transparency log. Additive — a signing failure never costs you the observation (ADR-014)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":225,"tokensAfter":225},{"name":"get_website_history","fixed":{"name":"get_website_history","description":"The over-time layer behind the site's website map (the radar's\nevolution). Every domain verify appends the domain's machinery tuple\n— origin AS, RPKI state, announced prefix, network country, CDN,\ncertificate authority, registrar, owning entity, and the per-lens\ncoverage tri-states — to an append-only change-log, one row per\nobserved change (plus a daily heartbeat row per looked-up domain).\n\nHonesty contract: `first_recorded` is when the observatory first\nlooked at this domain — never presented ","inputSchema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":181,"tokensAfter":181},{"name":"ghostroute_ai_lookup","fixed":{"name":"ghostroute_ai_lookup","description":"Checks whether a domain or ASN belongs to a known AI company's\ninfrastructure and what sovereignty it CLAIMS (program, zone, HQ), the\nbaseline GhostRoute scores routing reality against.\n\nUse this tool when:\n- You want to know \"whose AI infrastructure is this, and what does it claim?\"\n- You are enriching an endpoint before deciding whether to send it inference.\n\nInputs:\n- `entity` (path, required): a domain or ASN (AS####).\n\nReturns:\n- `matched`, `match_basis` (domain|asn), `ai_company`, `ai_prod","inputSchema":{"type":"object","required":["entity"],"properties":{"entity":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":183,"tokensAfter":183},{"name":"ghostroute_asn_lookup","fixed":{"name":"ghostroute_asn_lookup","description":"Returns GhostRoute's ownership-graph record for an autonomous system: the\nregistrant/parent organisation, its HQ country and sovereign zone, RIR,\nand cloud/AI-infrastructure flags. The long-term moat — who actually owns\nthe network a route originates from.\n\nUse this tool when:\n- You have an origin ASN and need its corporate owner + jurisdiction.\n- You are assessing whether an ASN belongs to a cloud front or the real operator.\n\nInputs:\n- `asn` (path, required): AS#### or a bare AS number.\n\nReturn","inputSchema":{"type":"object","required":["asn"],"properties":{"asn":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":181,"tokensAfter":181},{"name":"ghostroute_batch_check","fixed":{"name":"ghostroute_batch_check","description":"Batch form of `ghostroute_check`: one verdict per subject, aligned to\ninput order. The batch is validated whole before anything is charged,\nrun or signed: an empty or non-array `subjects`, or any invalid subject,\nfails the entire batch with 400 `invalid_request` (the message names\n`subjects[i]`), and more than 50 subjects fails it with 413\n`payload_too_large`. A `{ok:false, error}` entry appears inline only\nwhen the check for an already-valid subject fails at runtime; the other\nsubjects still re","inputSchema":{"type":"object","required":["subjects"],"properties":{"receipt":{"type":"boolean","default":false,"description":"When `true`, issue a signed, persisted GhostRoute receipt per subject."},"subjects":{"type":"array","items":{"type":"string"},"example":["api.mistral.ai","1.1.1.1"],"maxItems":50,"minItems":1}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":245,"tokensAfter":245},{"name":"ghostroute_cert_lookup","fixed":{"name":"ghostroute_cert_lookup","description":"Returns the five most recent CT certificate observations GhostRoute has\nrecorded for a domain (issuer CA, its jurisdiction, validity), newest\nfirst. The certificate leg of the sovereignty check, on its own.\n\nUse this tool when:\n- You want to know which CA has been issuing certificates for a domain.\n- You are checking whether a domain's cert issuer sits in the jurisdiction it claims.\n\nInputs:\n- `domain` (path, required): a hostname.\n\nReturns:\n- `domain`, `observations[]` (newest first, at most 5;","inputSchema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":183,"tokensAfter":183},{"name":"ghostroute_check","fixed":{"name":"ghostroute_check","description":"GhostRoute is TunnelMind's fourth lens: routing-integrity / sovereignty\nverification. It answers \"is this infrastructure where it claims to be,\nowned by who it claims, routing where it says — and does that match the\nsovereign jurisdiction it asserts?\" It resolves the originating ASN owner,\nRPKI validity, the certificate-issuing CA's jurisdiction, and matches the\nsubject against a curated AI-infrastructure corpus to recover any\nsovereignty CLAIM (e.g. an \"EU-sovereign\" AI service), then scores re","inputSchema":{"type":"object","required":["entity"],"properties":{"entity":{"type":"string","description":"An IPv4/IPv6 address, domain, ASN (`AS####`), or cert SHA-1/256 to check."},"receipt":{"type":"boolean","default":false,"description":"When `true`, issues a signed, persisted GhostRoute receipt (`GR-YYYY-NNNNNNN`) instead of an ephemeral verdict."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":254,"tokensAfter":254},{"name":"health_check","fixed":{"name":"health_check","description":"Returns a minimal status object confirming the API is alive. Use this to verify\nconnectivity before chaining other calls, or as a liveness check in a workflow.\n\nUse this tool when:\n- You need to verify the API is reachable before starting a multi-step investigation.\n- A prior call failed with a 503 or 504 and you want to confirm the service recovered.\n- You are debugging connectivity from a new environment.\n\nDo NOT use this tool when:\n- You want actual tracker data — use `get_domain` or `search`","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":166,"tokensAfter":166},{"name":"list_domains","fixed":{"name":"list_domains","description":"Returns a paginated list of domains from the tracker database. Results are ordered\nalphabetically by domain name and support cursor-based pagination for full traversal.\nFiltering by category and minimum score allows targeted data extraction.\n\nUse this tool when:\n- You want to enumerate all known ad-tech or analytics domains above a risk threshold.\n- You need a dataset of tracker domains for offline analysis.\n- You are paginating through a category to build a block list.\n\nDo NOT use this tool whe","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":50,"maximum":100,"minimum":1},"cursor":{"type":"string"},"category":{"enum":["ad_tech","analytics","social","fingerprinting","content","cdn","other"],"type":"string"},"min_score":{"type":"integer","maximum":100,"minimum":0}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":238,"tokensAfter":238},{"name":"list_entities","fixed":{"name":"list_entities","description":"Returns a paginated list of corporate entities in the TunnelMind surveillance\ndatabase. Includes data categories, estimated data value, and industry classification.\nUseful for enumerating the surveillance ecosystem by sector.\n\nUse this tool when:\n- You want to enumerate all entities in a specific industry (e.g., all ad-tech companies).\n- You need a dataset of surveillance entities for analysis or reporting.\n- You are building a comprehensive surveillance landscape map.\n\nDo NOT use this tool when","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":50,"maximum":100,"minimum":1},"cursor":{"type":"string"},"industry":{"type":"string","example":"ad_tech"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":206,"tokensAfter":206},{"name":"list_subscriptions","fixed":{"name":"list_subscriptions","description":"Returns the caller's active and inactive subscriptions (signing_key redacted). Requires an API key.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":54,"tokensAfter":54},{"name":"receipt_lookup","fixed":{"name":"receipt_lookup","description":"P72 unified receipt ledger (ADR-010): every receipt-issuing surface\n(cross-lens verify, tracker verify, verdict, profile, explain,\nGhostRoute, Sigil/ATAP, compliance export) records the exact signed\ndocument it returned, keyed by one ID space.\n\nUse this tool when:\n- An agent holds a receipt and wants to confirm TunnelMind logged it\n  (existence + canonical hash) before trusting it in an audit trail.\n- The owning customer wants to re-fetch a receipt body by id.\n\nInputs:\n- `id` (path, required): t","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":179,"tokensAfter":179},{"name":"revoke_api_key","fixed":{"name":"revoke_api_key","description":"Permanently deactivates the API key used to make this request. This action is\nirreversible. After revocation, the key will return 401 on all subsequent calls.\n\nUse this tool when:\n- You want to rotate your API key (revoke old, then provision a new one).\n- You believe your key has been compromised.\n\nDo NOT use this tool when:\n- You want to check quota — use `get_api_key` instead.\n- You intend to keep using the API — this is permanent.\n\nInputs:\n- No body or query parameters. Auth is from the `Auth","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":168,"tokensAfter":168},{"name":"search","fixed":{"name":"search","description":"Searches both the domains table and the entities table simultaneously. Returns\nmatching domains (by domain name) and entities (by name or slug) in a single\nresponse. Minimum 2 characters, maximum 100 characters.\n\nUse this tool when:\n- You have a partial name and need to identify what tracker or entity it belongs to.\n- You want to find all TunnelMind records related to a company name like \"Google\" or \"Oracle\".\n- You are resolving an ambiguous domain (e.g., does `criteo.com` appear in the tracker ","inputSchema":{"type":"object","required":["q"],"properties":{"q":{"type":"string","example":"google","maxLength":100,"minLength":2}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":189,"tokensAfter":189},{"name":"sigil_atap_ait_status","fixed":{"name":"sigil_atap_ait_status","description":"Returns an AIT's status, chain head hash, event count, pending-event\ncount, per-tier event counts, and the anchored-bid coverage ratio.\n","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":77,"tokensAfter":77},{"name":"status_history","fixed":{"name":"status_history","description":"One sample per 20-minute monitor sweep. `uptime_pct` is the share of\nsweeps in which every fail point was green (the strictest read);\n`per_monitor` lists only monitors that failed at least once in the\nwindow. History begins at feature deploy and is never extrapolated\nbackwards — an empty window returns `uptime_pct: null`, not 100.\n","inputSchema":{"type":"object","properties":{"days":{"type":"integer","default":30,"maximum":90,"minimum":1}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":137,"tokensAfter":137},{"name":"submit_feedback","fixed":{"name":"submit_feedback","description":"Close the loop: after you acted on a TunnelMind verdict, tell us how it\nwent. Reports aggregate per node into an advisory second opinion that any\ncaller can read back via `GET /v1/feedback/{node}`.\n\nAdvisory only. In v0 a negative aggregate does NOT silently lower the\nfused trust score — it's a human-weighable signal beside the verdict, not\nan automatic reweight.\n\nUse this tool when:\n- You acted on a verdict and want to record the real-world outcome\n  (honored, defrauded, no issue) to help futur","inputSchema":{"type":"object","required":["node","outcome"],"properties":{"node":{"type":"string","example":"doubleclick.net"},"note":{"type":"string","maxLength":500},"outcome":{"enum":["positive","negative","neutral"],"type":"string","example":"negative"},"receipt_id":{"type":"string","example":"rcpt_abc123"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":242,"tokensAfter":242},{"name":"tollbooth_export","fixed":{"name":"tollbooth_export","description":"Free bulk read of the commons — the raw record is never paywalled. Every\nrow is a tollbooth document exactly\nas its site signed it (Ed25519 over RFC 8785 JCS, key = the row's own\n`site`), wrapped in a `_commons` envelope naming the tier and vouching\ndomain. Nothing in a row requires trusting TunnelMind.\n\nUse this tool when:\n- You want the raw record behind the stats, or to verify it yourself.\n- You are building your own exhibit or comparison over attested sites.\n\nReturns:\n- `rows[]`: `{_commons:","inputSchema":{"type":"object","properties":{"day":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"UTC day, YYYY-MM-DD. Defaults to yesterday."},"kind":{"enum":["receipts","reports"],"type":"string","default":"receipts"},"tier":{"enum":["attested","all"],"type":"string","default":"attested"},"limit":{"type":"integer","default":200,"maximum":5000,"minimum":1,"description":"Rows to return (JSON form defaults to 200; the NDJSON download at the same URL defaults to 5000)."},"format":{"enum":["json"],"type":"string","default":"json","description":"json for the {ok,data} envelope (what this tool reads); omit for the NDJSON download."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":337,"tokensAfter":337},{"name":"tollbooth_stats","fixed":{"name":"tollbooth_stats","description":"The public read over the Conduct Log Commons: which agents knocked on\nattested tollbooth sites in the last 7 days, what they did when offered\npaid access, and what they would have paid. First-party monitors and\ncredential-scanning recon are classified and EXCLUDED from the headline\n(reported separately, never conflated). Attested tier only — keys a\ndomain has vouched for via /.well-known/tollbooth-site.json.\n\nUse this tool when:\n- You want to know how AI crawlers actually behave when a site asks","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":167,"tokensAfter":167},{"name":"verdict_lookup","fixed":{"name":"verdict_lookup","description":"The reconciliation layer in one call. Where `cross_lens_verify` answers\n\"what is this network destination,\" `verdict_lookup` answers a different,\nsharper question about a key-addressed ACTOR: **does what this key claims\nabout itself match what the network has seen it do?**\n\nIt fuses two sides:\n- **claim** — what the key can prove about itself: its `attestation_tier`\n  across roots of trust (bare Ed25519 self-attestation → a RATS/EAT\n  hardware/platform attestation). TunnelMind owns no silicon an","inputSchema":{"type":"object","required":["key"],"properties":{"eat":{"type":"string","description":"A RATS/EAT compact JWS (EdDSA) attesting this key, signed by a trusted anchor."},"key":{"type":"string","description":"The actor's Ed25519 public key, as hex (64 chars, optional 0x),\nbase64url (43 chars, unpadded), or did:key (did:key:z6Mk…).\n"},"sig":{"type":"string","description":"Base64 Ed25519 signature over `nonce`, proving control of the key."},"nonce":{"type":"string","description":"Binding nonce for a bare-Ed25519 self-attestation (paired with `sig`)."},"claims":{"type":"string","description":"URL-encoded JSON array of raw claim objects, e.g.\n`[{\"type\":\"ed25519-self\",\"signature\":\"…\",\"nonce\":\"…\"},{\"type\":\"eat\",\"token\":\"…\"}]`.\nOverrides the `nonce`/`sig`/`eat` convenience params when present.\n"},"subject":{"type":"string","description":"An ip / domain / ASN / entity_slug the key claims to act as. Drives the\nconduct (graph behavior) side of the reconciliation. Omit for a\nclaim-only verdict.\n"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":444,"tokensAfter":444}],"toolsChanged":48,"tokensSaved":0,"todo":[{"tool":"attributes_lookup","params":["node"]},{"tool":"audit_export","params":["to","from","limit"]},{"tool":"cancel_task","params":["task_id"]},{"tool":"compliance_configure","params":["regime","enabled","export_formats","retention_days"]},{"tool":"create_free_key","params":["email"]},{"tool":"create_subscription","params":["node","events","callback_url"]},{"tool":"delete_subscription","params":["id"]},{"tool":"get_analyst_config","params":["surface"]},{"tool":"get_entity","params":["slug"]},{"tool":"get_receipt","params":["receipt_id"]},{"tool":"get_self_view","params":["receipt"]},{"tool":"get_subscription","params":["id"]},{"tool":"get_task","params":["task_id"]},{"tool":"get_website_history","params":["domain"]},{"tool":"ghostroute_ai_lookup","params":["entity"]},{"tool":"ghostroute_asn_lookup","params":["asn"]},{"tool":"ghostroute_batch_check","params":["subjects"]},{"tool":"ghostroute_cert_lookup","params":["domain"]},{"tool":"ghostroute_ct_alerts","params":["limit"]},{"tool":"ghostroute_ct_proofs","params":["limit","domain"]},{"tool":"ghostroute_verify","params":["receipt_id"]},{"tool":"intel_agent","params":["domain"]},{"tool":"intel_http","params":["domain"]},{"tool":"intel_inject","params":["domain"]},{"tool":"intel_optout","params":["domain"]},{"tool":"intel_robots","params":["domain"]},{"tool":"intel_stack","params":["domain"]},{"tool":"list_domains","params":["limit","cursor","category","min_score"]},{"tool":"list_entities","params":["limit","cursor","industry"]},{"tool":"receipt_log_consistency_proof","params":["first","second"]},{"tool":"receipt_log_inclusion_proof","params":["tree_size","leaf_index","receipt_id"]},{"tool":"receipt_lookup","params":["id"]},{"tool":"search","params":["q"]},{"tool":"sigil_ads_txt_history","params":["limit","since","domain"]},{"tool":"sigil_atap_ait_status","params":["id"]},{"tool":"sigil_atap_register_ait","params":["profile","agent_type","expires_at","constraints","capabilities","attestation_policy"]},{"tool":"sigil_atap_roll_block","params":["ait"]},{"tool":"sigil_atap_witness","params":["ait","payload","event_type"]},{"tool":"sigil_receipt_generate","params":["ait","format"]},{"tool":"sigil_score_batch","params":["entity_ids"]},{"tool":"sigil_score_entity","params":["entity_id"]},{"tool":"sigil_verify_adscert","params":["domain"]},{"tool":"sigil_verify_app_bundle","params":["platform","bundle_id","claimed_developer"]},{"tool":"sigil_verify_domain","params":["domain"]},{"tool":"sigil_verify_ip_type","params":["ip"]},{"tool":"sigil_verify_supply_chain","params":["schain","app_bundle","site_domain"]},{"tool":"sigil_verify_supply_path","params":["supply_path"]},{"tool":"sigil_verify_token","params":["token"]},{"tool":"snapshot_data","params":["date"]},{"tool":"snapshot_diff","params":["date"]},{"tool":"snapshot_manifest","params":["date"]},{"tool":"status_history","params":["days"]},{"tool":"stream_task","params":["task_id"]},{"tool":"submit_feedback","params":["node","note","outcome","receipt_id"]},{"tool":"tollbooth_export","params":["kind","tier"]},{"tool":"tollbooth_sites","params":["tier"]},{"tool":"tracker_verify","params":["node","receipt"]},{"tool":"verify_agent","params":["ip","ua"]},{"tool":"verify_agent_signature","params":["path","method","scheme","authority","signature","signature_agent","signature_input"]},{"tool":"verify_receipt","params":["receipt_id"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}