Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, email [email protected] and we’ll put it right.

TunnelMind Data API

REMOTE · MCP-DATA.TUNNELMIND.AI · SCANNED AUG 3

Tracker / Sigil / Cross-lens — every TunnelMind Data API operation as one MCP surface.

+2 this week 57 Trust /100
Trust breakdown (6 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →

Endpoint Security46
Transport & Reachability100
Schema Quality & AI Usability71
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 25227 tokens (~277/item across 91 items; 91 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management27
  • Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage81
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 44% of tool parameters carry a description.Partial
Capabilities40
  • Spec-recency check failed: implements MCP spec 2025-03-26; the latest is 2026-07-28. See how to fix → Fail
Install

Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.

remote · mcp-data.tunnelmind.ai

# add to Claude Code
claude mcp add --transport http ai-tunnelmind-data https://mcp-data.tunnelmind.ai/mcp
# ~/.codex/config.toml
[mcp_servers.ai-tunnelmind-data]
url = "https://mcp-data.tunnelmind.ai/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ai-tunnelmind-data": {
      "type": "remote",
      "url": "https://mcp-data.tunnelmind.ai/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add ai-tunnelmind-data --url https://mcp-data.tunnelmind.ai/mcp --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  ai-tunnelmind-data:
    url: "https://mcp-data.tunnelmind.ai/mcp"
// mcp.json
{
  "mcpServers": {
    "ai-tunnelmind-data": {
      "type": "http",
      "url": "https://mcp-data.tunnelmind.ai/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 3 Aug 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

  • 1 Aug 26 +2
    • New tool “get_freshness” functional
  • 31 Jul 26 −1
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 30 Jul 26 −1
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 29 Jul 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

  • 27 Jul 26 +1
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 26 Jul 26 54

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 3 Aug 2026 · Probed https://mcp-data.tunnelmind.ai/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=tunnelmind.ai CN=WE1,O=Google Trust Services,C=US 23 Jul 2026 21 Oct 2026 ECDSA 256 ECDSA-SHA256 8e8d6c7751215d560e14d00ac6d97c79
SANs: tunnelmind.ai, mcp-data.tunnelmind.ai, *.mcp-data.tunnelmind.ai
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b
DNSSEC insecure

Validation of mcp-data.tunnelmind.ai. Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
ai. present 3799 8 Verified
tunnelmind.ai. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp-data.tunnelmind.ai/mcp Verified 200
http (plaintext) http://mcp-data.tunnelmind.ai/mcp Inconclusive 404
MCP tools — 91 exposed · ~25,153 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.

Tool Tokens
receipt_lookup ~305

P72 unified receipt ledger (ADR-010): every receipt-issuing surface (cross-lens verify, tracker verify, verdict, profile, explain, GhostRoute, Sigil/ATAP, compliance export) records the exact signed document it returned, keyed by one ID space. Use this tool when: - An agent holds a receipt and wants to confirm TunnelMind logged it (existence + canonical hash) before trusting it in an audit trail. - The owning customer wants to re-fetch a receipt body by id. Inputs: - `id` (path, required): the unified `receipt_id` (UUIDv7, `GR-YYYY-NNNNNNN`, or `ATAP-RCPT-…`) or a lens-native alias. Returns: - Always: `receipt_id`, `lens`, `payload_hash` (`0x` + SHA-256 of the RFC 8785 canonicalization of the stored document), `key_id`, `attestation_strength`, `issued_at`, and `leaf_index` (null until the transparency-log sequencer enrolls the row). - Owner only (authenticated caller matching the receipt's customer): `subject` and the full stored `receipt` document. Receipt bodies are never public. Cost: - Counts as one request against the daily rate limit. Latency: - Typical: <300ms (one Supabase read).

NameTypeReqDescription
idstringyes

No output schema declared.

No examples provided.

revoke_api_key ~210

Permanently deactivates the API key used to make this request. This action is irreversible. After revocation, the key will return 401 on all subsequent calls. If you have an active Stripe subscription, you must separately cancel it at stripe.com — revoking the key does not cancel billing. Use this tool when: - You want to rotate your API key (revoke old, then provision a new one). - You believe your key has been compromised. Do NOT use this tool when: - You want to check quota — use `get_api_key` instead. - You intend to keep using the API — this is permanent. Inputs: - No body or query parameters. Auth is from the `Authorization: Bearer` header. Returns: - `revoked`: true. - `note`: reminder about Stripe subscription cancellation. Cost: - Free. Does not count against the daily request limit. Latency: - Typical: <150ms, p99: <400ms.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

scan_injection ~434

Runs a curated signature corpus over a piece of untrusted text — content an agent is about to consume, a retrieved document, a tool result, an email body — and returns the matched injection patterns plus a bounded 0..1 risk score. This is a signal, never a policy decision: the caller decides what to do with a flagged input. Detected classes: instruction_override (ignore/override previous rules), role_reassignment (you are now DAN / developer mode), exfiltration (leak the system prompt or a secret to a URL), tool_smuggling (covertly invoke a tool, delete/destroy data), boundary_spoof (fake system/assistant turn delimiters). Input is normalized first to blunt cheap evasions (zero-width characters, smart quotes, whitespace padding). Use this tool when: - You are an agent about to feed retrieved or third-party text into a model and want to check it for embedded instructions first. - You are triaging why a tool description or web page looks suspicious. Do NOT use this tool when: - You want a trust verdict on a domain or entity — use `cross_lens_verify`. - You want to scan a whole MCP server's tools — use `scan_mcp`. Inputs: - `text` (body, required): the untrusted text to scan. Max 200,000 chars. Returns: - `flagged`: true if any signature matched. - `score`: bounded 0..1 risk score (saturating — one high-severity hit is already strongly flagged; many hits approach but never exceed 1). - `severity_max`: highest severity among matches (`high`/`medium`/`low`) or null. - `classes`: distinct injection classes matched. - `matches`: each matched signature `{ id, class, severity, excerpt }`. Cost: - Free. No API key required. Pure edge computation, no external calls. Latency: - Typical <20ms.

NameTypeReqDescription
textstringyesUntrusted text to scan for injection signatures.

No output schema declared.

No examples provided.

scan_mcp ~378

Connect to a caller-supplied MCP server (Streamable-HTTP transport), read its advertised tools, and run the injection corpus over every tool name / description / input schema — plus a capability heuristic that flags broad, dangerous powers (shell execution, filesystem write, credential access, arbitrary network, destructive DB ops). Returns a per-tool safety report. A caution to review, never a verdict. This is a single-target, caller-initiated scan. It is NOT a crawler and does not follow links or enumerate other servers. Loopback / private / internal hosts are rejected. Use this tool when: - You are about to connect an agent to a third-party MCP server and want to inspect its tools for embedded instructions or excessive powers first. Do NOT use this tool when: - You only have a blob of text — use `scan_injection`. - You want a trust verdict on a domain or entity — use `cross_lens_verify`. Inputs: - `url` (body, required): the MCP server endpoint (http/https). Returns: - `server`: `{ name, version }` reported by the server, if any. - `tools_scanned`: number of tools inspected. - `flagged_count`: tools with an injection hit or a flagged capability. - `risk`: worst per-tool risk across the server (`high`/`medium`/`low`/`none`). - `score`: max injection score across tools (0..1). - `tools`: per tool `{ name, risk, injection{...}, capabilities[] }`. Cost: - Free. No API key required. Latency: - Bounded by the target server's handshake; typically <2s.

NameTypeReqDescription
urlstringyesMCP server endpoint (Streamable-HTTP). http or https.

No output schema declared.

No examples provided.

search ~315

Searches both the domains table and the entities table simultaneously. Returns matching domains (by domain name) and entities (by name or slug) in a single response. Minimum 2 characters, maximum 100 characters. Use this tool when: - You have a partial name and need to identify what tracker or entity it belongs to. - You want to find all TunnelMind records related to a company name like "Google" or "Oracle". - You are resolving an ambiguous domain (e.g., does `criteo.com` appear in the tracker DB?). Do NOT use this tool when: - You know the exact domain — use `get_domain` instead (faster, more complete). - You know the exact entity slug — use `get_entity` instead. - You want to browse by category or industry — use `list_domains` or `list_entities`. Inputs: - `q` (query, required): Search string, 2-100 characters. Matched against domain names and entity names/slugs. Returns: - `domains`: array of matching domain records (list item format). - `entities`: array of matching entity records (list item format). - Both arrays may be empty if no matches found. No pagination — results are capped at 20 per type. Cost: - Free tier: included in 50 req/day. Pro/enterprise: included in plan. Latency: - Typical: <200ms, p99: <500ms.

NameTypeReqDescription
qstringyes

No output schema declared.

No examples provided.

sigil_ads_txt_history ~171

Returns a publisher's ads.txt change log — one entry per crawl in which its authorized-seller set changed. A publisher quietly adding a reseller line is a real fraud signal; this is how a buyer audits supply over time. Inputs: - `domain` (path, required): publisher domain. - `since` (query, optional): ISO date / date-time lower bound on `observed_at`. - `limit` (query, optional): max entries — default 50, max 200. Returns `changes[]`, newest first — each with `observed_at`, `added_count`, `removed_count`, `additions`, `removals`, `directive_changes`.

NameTypeReqDescription
domainstringyes
limitinteger
sincestring

No output schema declared.

No examples provided.

sigil_atap_ait_status ~52

Returns an AIT's status, chain head hash, event count, pending-event count, per-tier event counts, and the anchored-bid coverage ratio.

NameTypeReqDescription
idstringyes

No output schema declared.

No examples provided.

sigil_atap_register_ait ~175

Registers an ATAP v0.1 AIT for a media-buying agent under the `sigil:media_buyer:v1` profile. Sigil validates the capability set and constraints against the published profile, signs the AIT as the witness (`OAI-2026-0000201`), stores it, and returns the signed token. Sigil is the ATAP witness — there is no kernel observer. See https://github.com/TunnelMind/atap-profiles.

NameTypeReqDescription
agent_typestring
attestation_policyobjectyes
capabilitiesarrayyes
constraintsobjectyes
expires_atstringyes
operatorstringyesThe agent operator's canonical OAI.
profilestringyes

No output schema declared.

No examples provided.

sigil_atap_roll_block ~55

Rolls every not-yet-blocked Witness Event for an AIT into one signed ATAP Attestation Block with a profile `period_summary`, chained onto the prior block.

NameTypeReqDescription
aitstringyes

No output schema declared.

No examples provided.

sigil_atap_witness ~206

Ingests one agent-reported event (`bid:submitted`, `bid:won`, `bid:lost`, `budget:decremented`) into an AIT's hash-chained attestation log. Sigil validates the payload (rejecting any PII per ATAP §7.6), classifies the evidence tier — `anchored` if a `bid:submitted` cites a valid Sigil token issued for this AIT and matching the bid's supply path, otherwise `asserted` — derives any `constraint:violated` events, then chains and signs each event. `supply:verified` / `supply:rejected` are witness-emitted by `sigil_verify_supply_path`, never accepted here — that is what makes the `witnessed` tier non-bypassable.

NameTypeReqDescription
aitstringyes
event_typestringyes
payloadobjectyes

No output schema declared.

No examples provided.

sigil_receipt_generate ~174

Assembles the ATAP v0.1 §7.5 Receipt ZIP for an AIT — the signed Receipt (`manifest.json`), the AIT, the Attestation Block chain, the witness public key, a tier-graded `summary.json`, the bundled `verify.sh` reference verifier, and the witness events + sigil_tokens as profile artifacts. Any pending events are rolled into a final block first. The ZIP verifies offline — unpack it and run `verify.sh`; keys are at https://tunnelmind.ai/atap/keys. The summary grades every event as `witnessed`, `anchored`, or `asserted` and reports the anchored-bid coverage ratio.

NameTypeReqDescription
aitstringyes
formatstring

No output schema declared.

No examples provided.

sigil_score_batch ~98

Scores up to 200 entities in one round-trip — built for agents evaluating many supply sources during campaign setup. Per-item parse failures are returned inline; the batch never fails as a whole. An optional `weights` object re-weights every entity in the call.

NameTypeReqDescription
entity_idsarrayyes
weightsobjectOptional custom weights: an object of `{ type: { component: weight } }`.

No output schema declared.

No examples provided.

sigil_score_entity ~239

Returns the pre-computed 0.0–1.0 trust score for one entity, its component breakdown, and the 14-day trend. Scores are refreshed daily by a database job — this endpoint never recomputes from raw data, so it is fast and deterministic. `entity_id` is `{entity_type}:{key}` — e.g. `publisher:nytimes.com` or `ssp:pubmatic.com`. Entity types: `publisher`, `ssp`, `dsp`, `app_bundle` (publishers and SSPs are scored today). v1 evaluates structural components only (`ads_txt_health`, `supply_chain_directness`, `historical_stability` for publishers; `supply_reach`, `directness` for SSPs). The `not_evaluated` list names spec components without an enrichment path yet. Optional `weights` query param (URL-encoded JSON) re-weights the stored components for this call.

NameTypeReqDescription
entity_idstringyes
weightsstringURL-encoded JSON: an object of `{ type: { component: weight } }`.

No output schema declared.

No examples provided.

sigil_score_weights ~65

Returns the active, versioned default weights used to combine an entity's trust-score components, plus the list of spec components that are not yet evaluated. Pass a custom `weights` object to `sigil_score_batch` to re-weight without changing the defaults.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

sigil_traverse ~244

Reconstructs the supply paths for a publisher domain from Sigil's own crawl and returns them ITEMIZED — distinct from `sigil_verify_supply_chain` (which verifies a schain the caller brings) and from `signal_dark_pool_risk` (which returns only aggregate counts). Every SSP the publisher declares it sells through is joined to that SSP's identity and classified two-sided against the SSP's sellers.json: `corroborated` (seat present), `contradicted` (SSP crawled but seller_id absent — real risk), `unchecked` (SSP not yet crawled — not risk). Each returned path also carries `resells_to`, one level of downstream reseller expansion. The list is ordered riskiest-first (contradicted, then reseller) so a truncated page is still the most useful; the `supply_paths` counts are always over the FULL set. `in_supply_graph:false` when the domain is not a known publisher.

NameTypeReqDescription
domainstringyesPublisher hostname to traverse.
limitintegerMax paths returned (default 200, hard cap 500).

No output schema declared.

No examples provided.

sigil_verify_ads_txt ~709

Confirms whether an SSP/exchange is authorized to sell a publisher's inventory according to that publisher's ads.txt. This is a cache lookup against ads.txt files crawled daily across the top 10,000 publisher domains — it does NOT fetch the publisher's ads.txt live, so it is fast and adds no latency to a real-time bidding decision. Use this tool when: - You are an ad-buying agent and want to confirm, pre-bid, that a supply path (publisher → exchange → seller_id) is legitimate. - You are detecting domain spoofing or unauthorized resale in a bid stream. - You want to check whether a seller is listed DIRECT or RESELLER. Do NOT use this tool when: - You want a full supply-path trust score — that endpoint is Sigil P31. - You want surveillance tracker data for the domain — use `get_domain`. Inputs: - `publisher_domain` (body, required): Publisher domain, e.g. `nytimes.com`. A `www.` prefix and scheme/path are stripped automatically. - `exchange_domain` (body, required): The exchange/SSP domain as it appears in ads.txt, e.g. `google.com`, `amazon-adsystem.com`. - `seller_id` (body, required): The publisher's seller/account ID at that exchange, e.g. `pub-4177862836555934`. Matched exactly. - `seller_type` (body, optional): `DIRECT` or `RESELLER`. When supplied it is checked against the ads.txt entry; a mismatch is reported as a warning. - `resolve_chain` (body, optional): When true, a matched RESELLER entry is cross-checked against the exchange's sellers.json (one authoritative hop). Returns: - `verified`: true (entry found), false (confidently not listed), or null (ads.txt could not be retrieved — indeterminate). - `confidence`: `high` | `degraded` | `low` | `unknown`. - `seller_entry`: the matched ads.txt line (line number, raw text, parsed fields) when `verified` is true; otherwise null. - `ads_txt_parse_status`, `ads_txt_last_parsed`, `stale`: provenance of the cached crawl this answer is derived from. - `reseller_chain`: empty unless `resolve_cha…

NameTypeReqDescription
exchange_domainstringyesExchange/SSP domain as listed in ads.txt
publisher_domainstringyesPublisher domain (www. prefix and scheme stripped)
resolve_chainbooleanWhen true, a matched RESELLER entry is cross-checked against the exchange's sellers.json
seller_idstringyesPublisher's seller/account ID at the exchange
seller_typestringOptional — checked against the ads.txt entry

No output schema declared.

No examples provided.

sigil_verify_ads_txt_batch ~367

Runs up to 100 ads.txt verifications in a single call — the endpoint an ad-buying agent uses for pre-bid checks across a whole campaign's supply. Each item is the same shape as `sigil_verify_ads_txt`. Per-item validation failures are reported inline; the batch never fails as a whole. Publisher records are fetched once per unique domain. Use this tool when: - You are evaluating many supply paths at once (campaign setup, SPO sweep). - You want one round-trip instead of N calls to `sigil_verify_ads_txt`. Inputs: - `items` (body, required): Array of 1–100 verification requests, each `{ publisher_domain, exchange_domain, seller_id, seller_type? }`. - `resolve_chain` (body, optional): Applies to every item — when true, a matched RESELLER entry is cross-checked against the exchange's sellers.json. Returns: - `count`: number of result entries (matches `items` length, in order). - `verified_count`: how many resolved to `verified: true`. - `results`: array aligned to `items`. Each entry is either a verification result with `ok: true` and `input_index`, or `{ ok: false, input_index, error, message }` for an invalid item. Cost: - Counts as one request against the daily rate limit. Latency: - Typical: <150ms. With `resolve_chain: true`, add one sellers.json fetch per unique exchange (edge-cached 12h after the first fetch).

NameTypeReqDescription
itemsarrayyes1–100 verification requests
resolve_chainbooleanResolve reseller chains for every RESELLER item

No output schema declared.

No examples provided.

sigil_verify_adscert ~166

Reports whether a domain publishes ads.cert (IAB Tech Lab Authenticated Connections) DNS records — a readiness signal showing the domain supports cryptographically authenticated ad-tech connections. This is not signature verification: ads.cert is pairwise, so verifying a signed bid request requires Sigil to be a delegated participant (a future build). DNS-only and stateless. Inputs: - `domain` (query, required): Domain to check. Returns: - `adscert_ready`: true | false | null (DNS lookup failed). - `adscert_records`: TXT values at `_adscert.{domain}`. - `delegation_records`: TXT values at `_delegated._adscert.{domain}`.

NameTypeReqDescription
domainstringyes

No output schema declared.

No examples provided.

sigil_verify_app_bundle ~233

Verifies that a mobile or CTV app bundle ID actually exists in the relevant app store — used to detect bundle spoofing in bid requests. Platform support (v1): - `ios`: verified live via Apple's iTunes Lookup API. - `android`: verified live via the Google Play store listing page. - `ctv_*` / `web`: no public store API — returns verified=null. Inputs: - `bundle_id` (body, required): e.g. `com.nytimes.NYTimes`. - `platform` (body, required): ios | android | ctv_roku | ctv_fire | ctv_samsung | ctv_lg | ctv_vizio | web. - `claimed_developer` (body, optional): checked against the store listing. Returns: - `verified`: true | false | null (not checkable on this platform). - `store_listing`: name, developer, developer_match, store_url.

NameTypeReqDescription
bundle_idstringyes
claimed_developerstring
platformstringyes

No output schema declared.

No examples provided.

sigil_verify_domain ~240

Confirms a publisher controls a domain by checking for a DNS TXT record the owner publishes under `_tunnelmind.{domain}`. A DNS record can only be set by whoever controls the zone, so its presence proves control — a stronger signal than ads.txt, which is just a file anything in the request path can serve. Use this tool when: - You want proof a publisher actually owns the domain it claims. - You are distinguishing publishers who have opted into Sigil verification. Inputs: - `domain` (query, required): Publisher domain. `www.` and scheme stripped. Returns: - `verified`: true (record found), false (absent), or null (DNS lookup failed). - `expected`: the exact TXT record the owner must publish to verify. - `found_records`: TXT values currently present at `_tunnelmind.{domain}`. - `checked_at`: ISO 8601 timestamp of the live DNS lookup. Cost: - Counts as one request against the daily rate limit. Latency: - Typical: <300ms (one DNS-over-HTTPS lookup).

NameTypeReqDescription
domainstringyes

No output schema declared.

No examples provided.

sigil_verify_ip_type ~417

Classifies an IPv4 or IPv6 address by network type — the high-value ad-fraud signal being datacenter traffic posing as residential or living-room (CTV) devices. IP→ASN resolution uses Team Cymru's public service; the ASN is then classified by its registered organization name. It also cross-references the Scry attacker-observation corpus to detect anonymizing EGRESS — the thing a rotating-residential proxy provider is built to hide. A residential- or mobile-looking IP that Scry has observed acting as a hostile actor is a residential-proxy exit node (home devices don't scan honeypots); tor and vpn egress are named outright. It also identifies the proxy COMPANY by network: if the IP's ASN belongs to a known VPN/anonymizing-egress provider (X4BNet's curated list), the verdict is `vpn` and `scry_signals` carries `vpn_provider_asn` — even when Scry has never observed the IP acting. Datacenter and residential proxy verdicts still require observed conduct. PRIVACY: the IP is used for lookup only — never logged, never stored. The Scry cross-reference is likewise a read-only corpus lookup. Inputs: - `ip` (query, required): IPv4 or IPv6 address. Returns: - `ip_type`: datacenter | residential | mobile | unknown. - `confidence`: high | medium | low. - `asn`, `asn_name`: the resolved autonomous system. - `proxy_suspected`: boolean — the IP is an anonymizing egress. - `proxy_type`: tor | vpn | residential_proxy | datacenter_proxy | null. - `scry_signals`: evidence strings from the corpus (actor_class, threat feeds, observation counts); empty when the IP is unknown to Scry. Latency: - Typical: 100-250ms (DNS + a parallel corpus lookup).

NameTypeReqDescription
ipstringyes

No output schema declared.

No examples provided.

sigil_verify_supply_chain ~352

The bid-time contract. Pass the SupplyChain object from an OpenRTB bid request (`source.ext.schain`) verbatim, plus the originating site domain or app bundle. Sigil verifies, per node and in aggregate: - origin ads.txt — the publisher's ads.txt authorizes node[0] (asi + sid). - per node — the node's `asi` sellers.json declares the node's `sid`. - owner-domain — node[0]'s sellers.json seller `domain` matches the publisher's ads.txt OWNERDOMAIN / MANAGERDOMAIN (spec §3.5.1). - `schain.complete` — an incomplete chain caps the verdict at `warn`. OpenRTB field mapping: `site.domain` → `site_domain`; `app.bundle` → `app_bundle`; `source.ext.schain` → `schain`. An app_bundle origin's ads.txt check is `not_evaluated` pending app-ads.txt resolution. Returns a per-node result array, an aggregate `verdict` (pass/warn/fail/unknown), `recommendations`, and a signed `sigil_token`.

NameTypeReqDescription
app_bundlestring
buyerobjectOptional. When present and the verdict is not `fail`, Sigil opportunistically records a `buys_through` edge linking the buyer entity to the resolved DSP. Side-effect persistence only — never affects…
schainobjectyes
site_domainstring

No output schema declared.

No examples provided.

sigil_verify_supply_path ~392

The core Sigil pre-bid call. Submit a supply path; Sigil composes its individual checks into one trust verdict and returns a signed `sigil_token` the agent can attach to its bid as proof of verification. Checks composed: - `ads_txt` — exchange authorized in the publisher's ads.txt. - `datacenter_ip` — is the IP a datacenter posing as a real user. - `fraud_signals` — is the IP in Scry's attacker-intelligence corpus. - `bundle_verified` — does the app bundle exist in its store. - `domain_authenticity` / `entity_reputation` — reserved, not evaluated in v1. Each evaluated check yields pass/warn/fail; `trust_score` is their weighted mean (override `weights` per request); `verdict` is pass/warn/fail/unknown (override `thresholds`). PRIVACY: `ip_address` is used for lookup only — never logged, never stored, never placed in the sigil_token. `geo` is accepted but unused. Returns: `trust_score` (0-1 or null), `verdict`, `checks`, `recommendations`, `sigil_token` (signed, 5-minute lifetime).

NameTypeReqDescription
buyerobjectOptional. When present and the verdict is not `fail`, Sigil opportunistically records a `buys_through` edge linking the buyer entity to the resolved DSP. Side-effect persistence only — never affects…
supply_pathobjectyes
thresholdsobject{ pass, fail } verdict cutoffs
weightsobjectPer-check weight overrides

No output schema declared.

No examples provided.

sigil_verify_token ~97

Verifies the authenticity and expiry of a `sigil_token` returned by `sigil_verify_supply_path`. Anyone can call this — no key needed; Sigil verifies the Ed25519 signature server-side. Tokens live 5 minutes. Returns `valid` (boolean), `reason` (when invalid: malformed / expired / bad_signature / unsigned), and the decoded `payload`.

NameTypeReqDescription
tokenstringyes

No output schema declared.

No examples provided.

signal_dark_pool_risk ~142

Reconciles every sell path a publisher declares (`sells_through`) against each SSP's own sellers.json (`exchange_seat`) and keeps three classes strictly separate: `corroborated` (seat present), `contradicted` (SSP crawled but seller_id absent — real risk), and `unchecked` (SSP not yet crawled — excluded from risk, lowers confidence). Combined with publisher-side ads.txt opacity. Two-sided corroboration is the cross-lens moat — it catches unauthorized resale a one-sided ads.txt read cannot.

NameTypeReqDescription
domainstringyesPublisher hostname.

No output schema declared.

No examples provided.

signal_halo_score ~133

Scores an entity by the trust character of its neighbours — the SSPs its publishers sell through and the DSPs it buys through. Reports neighbour counts, mean/min neighbour trust, and how many neighbours are adversary-classified (P46). `derived.halo_score` (0–100, or null when no neighbour has a computed trust) is mean neighbour trust dragged down by adversary-neighbour share. Evidence about an entity's company, not a persisted verdict — no profile poisoning.

NameTypeReqDescription
entity_slugstringyesStable kebab-case entity identifier.

No output schema declared.

No examples provided.

signal_team_signal ~109

Surfaces other entities that operate as a coordinated team with this one: they share a NARROWLY-held direct seller account (2–8 entities — network house accounts shared by hundreds are separated into `house_accounts_excluded`, not counted) or co-own an exchange seat. `derived.team_signal` (0–100) is a coordination magnitude over teammate count, shared-account breadth, and co-owned seats.

NameTypeReqDescription
entity_slugstringyesStable kebab-case entity identifier.

No output schema declared.

No examples provided.

signal_tracker_density ~158

Observed component counts first, a labelled derived roll-up second. The components — `data_categories`, supply-surface counts (ssp + publisher + dsp + owns_seat + buys_through), and corroborating `sources` — are facts. `derived.tracker_density` (0–100) is a weighted blend of those counts, not a measurement; `data_cost_usd` is deliberately excluded (non-zero only for a curated seed, so weighting by it would fabricate precision). Anchors the `surveillance_bigtech` adversary class for the cross-lens classifier.

NameTypeReqDescription
entity_slugstringyesStable kebab-case entity identifier ([a-z0-9-], 1–255 chars).

No output schema declared.

No examples provided.

snapshot_data ~53

The exact bytes the manifest's sha256 commits to. Content-Type `application/x-ndjson`; rows ordered by domain. Verify: `sha256(body) == manifest.sha256`.

NameTypeReqDescription
datestringyes

No output schema declared.

No examples provided.

snapshot_diff ~36

JSONL diff vs the previous snapshot — apply +/~/- lines instead of re-pulling the corpus.

NameTypeReqDescription
datestringyes

No output schema declared.

No examples provided.

snapshot_manifest ~186

P4 corpus replication, the OPA "push data into the PDP" pattern. A daily snapshot of the domain corpus (domain, score, category, fingerprinting, entity) is published as deterministic JSONL with a manifest carrying row_count, sha256 over the exact bytes, a diff summary vs the previous day, and an Ed25519-signed Receipt v1.0 committed to the transparency log — a PDP that replicates the data can verify offline that it loaded exactly what was published. `date` is `YYYY-MM-DD` or `latest`. Retention: 14 days. Fetch the rows from `data_url`, apply increments from `diff_url` (`{"op":"+"|"~"|"-"}` per line), re-pull the full file when the manifest marks the diff truncated.

NameTypeReqDescription
datestringyes

No output schema declared.

No examples provided.

status_history ~96

One sample per 20-minute monitor sweep. `uptime_pct` is the share of sweeps in which every fail point was green (the strictest read); `per_monitor` lists only monitors that failed at least once in the window. History begins at feature deploy and is never extrapolated backwards — an empty window returns `uptime_pct: null`, not 100.

NameTypeReqDescription
daysinteger

No output schema declared.

No examples provided.

stream_task ~285

Opens a persistent SSE connection that emits events as the task progresses. The stream closes automatically when the task reaches a terminal state or after ~90 seconds (timeout). Heartbeat comments are sent every ~15 seconds to keep the connection alive through proxies. Event types: - `status` — emitted when status changes (pending → running → complete/failed) - `result` — emitted on `complete` with the full result payload - `error` — emitted on `failed`, `cancelled`, or `expired` with error info - SSE comment (`: heartbeat`) — keepalive, no data Use this tool when: - You want real-time progress without polling. - You are in an environment that supports SSE (EventSource API). Do NOT use this tool when: - You want a simple one-shot status check — use `get_task` instead. - Your HTTP client doesn't support streaming responses. Inputs: - `task_id` (path, required): 26-char ULID. Returns: - SSE stream (`text/event-stream`). Each event is `event: <type>\\ndata: <json>\\n\\n`. Cost: - Free. Counts as one request against rate limits when the stream opens. Latency: - First event: <200ms. Stream duration: up to 90s.

NameTypeReqDescription
task_idstringyes

No output schema declared.

No examples provided.

submit_feedback ~275

Close the loop: after you acted on a TunnelMind verdict, tell us how it went. Reports aggregate per node into an advisory second opinion that any caller can read back via `GET /v1/feedback/{node}`. Advisory only. In v0 a negative aggregate does NOT silently lower the fused trust score — it's a human-weighable signal beside the verdict, not an automatic reweight. Use this tool when: - You acted on a verdict and want to record the real-world outcome (honored, defrauded, no issue) to help future callers. Inputs: - `node` (body, required): the subject — ip, domain, asn, or entity slug. - `outcome` (body, required): one of `positive`, `negative`, `neutral`. - `receipt_id` (body, optional): the verdict receipt this outcome refers to. - `note` (body, optional): free-text context, max 500 chars. Returns the updated advisory aggregate `{ node, counts, total, score, signal }`. Cost: - Free. Requires an API key (authenticated callers only).

NameTypeReqDescription
nodestringyes
notestring
outcomestringyes
receipt_idstring

No output schema declared.

No examples provided.

tracker_verify ~368

The Tracker lens-owned verify surface: a per-node verdict over the normalized DDG Tracker Radar / IAB TCF / Disconnect.me corpus, with an optional signed TunnelMind Receipt v1.0. This is the single-lens ground truth the fused `POST /v1/verify` cites for its tracker block. Use this tool when: - You need to know whether a domain is tracking/surveillance infrastructure and which entity operates it, without the full cross-lens fusion. - You want a signed, offline-verifiable receipt for that single-lens answer. Inputs: - `node` (path, required): a domain (e.g. `doubleclick.net`) or an entity slug (e.g. `google`). IPs and ASNs are not indexable by this lens. - `receipt` (query, optional): `true` attaches a Receipt v1.0 envelope. Returns: - `tracking`: true (in the tracker corpus), false (queried, absent), or null (not answerable — ip/asn node or backend unavailable; see `reason`). - `tracker`: the lens record — domain {category, prevalence, score 0-100} plus operating entity {slug, name, parent_company, industry, sources}, or entity + top_domains when queried by slug. - `checked_at`: ISO 8601 timestamp of the corpus read. - `receipt`: TunnelMind Receipt v1.0 (Ed25519, JCS) when requested. Cost: - Counts as one request against the daily rate limit. Latency: - Typical: <100ms (one or two D1 reads at the edge).

NameTypeReqDescription
nodestringyes
receiptboolean

No output schema declared.

No examples provided.

traction ~271

Live traction numbers computed from sources the Worker owns: the hash-chained D1 audit log (7-day call volume, distinct identified callers, top operations), the stored-receipt table, and Stripe (succeeded charges → paying customers, gross USD). Ed25519-signed with the same attestation envelope as /v1/status so the numbers can be replayed to an auditor. Use this tool when: - You are evaluating whether anyone actually uses and pays for this API. - You need a signed, re-checkable statement of usage rather than a claim. Returns: - `traction.usage`: calls_7d, identified_callers_7d, anonymous_calls_7d, top_operations_7d — or available:false with a reason. - `traction.receipts`: stored receipt counts (total / 7d). - `traction.revenue`: paying_customers, succeeded_charges, gross_usd, `truncated` flag when the Stripe page is partial. - `attestation`: Ed25519 signature over the canonicalized traction block. Cost: - Counts as one request against the daily rate limit. Cached 1h. Latency: - Typical: <100ms cached; up to ~2s on a cache miss (one Stripe read).

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

verdict_lookup ~667

The reconciliation layer in one call. Where `cross_lens_verify` answers "what is this network destination," `verdict_lookup` answers a different, sharper question about a key-addressed ACTOR: **does what this key claims about itself match what the network has seen it do?** It fuses two sides: - **claim** — what the key can prove about itself: its `attestation_tier` across roots of trust (bare Ed25519 self-attestation → a RATS/EAT hardware/platform attestation). TunnelMind owns no silicon and reads every root; the tier is always *measured/anchored*, never self-asserted (a token claiming a higher tier than its trust anchor is trusted to assert is capped down). - **conduct** — what the graph has seen the key's subject do (Scry × Sigil × GhostRoute), supplied via the optional `subject` parameter. The response carries `reconciliation.contradictions` (e.g. a key that attests `silicon-root` but behaves as a low-trust node → `claim_exceeds_conduct`; a presented claim that fails to verify → `unverified_claim`; claims presented with no proof of key control → `key_control_unproven`), a `claim_vs_conduct_delta`, and a `verdict {tier, reputation, flags, confidence}`. Keys are linked to an identity ONLY when the actor cryptographically proves control — never inferred from behavioral correlation. An EAT that attests a *different* subject key is rejected, not silently merged. The verdict is published as a self-verifying receipt: given the receipt bytes + the witness public keys carried inline, anyone re-derives the verdict and checks log inclusion OFFLINE with `scripts/verify-verdict.mjs` — no call back to TunnelMind. A bare, unattested key still gets a verdict (at `self-asserted` tier); attestation is never required to participate.

NameTypeReqDescription
claimsstringURL-encoded JSON array of raw claim objects, e.g. `[{"type":"ed25519-self","signature":"…","nonce":"…"},{"type":"eat","token":"…"}]`. Overrides the `nonce`/`sig`/`eat` convenience params when present…
eatstringA RATS/EAT compact JWS (EdDSA) attesting this key, signed by a trusted anchor.
keystringyesThe actor's Ed25519 public key, as hex (64 chars, optional 0x), base64url (43 chars, unpadded), or did:key (did:key:z6Mk…).
noncestringBinding nonce for a bare-Ed25519 self-attestation (paired with `sig`).
sigstringBase64 Ed25519 signature over `nonce`, proving control of the key.
subjectstringAn ip / domain / ASN / entity_slug the key claims to act as. Drives the conduct (graph behavior) side of the reconciliation. Omit for a claim-only verdict.

No output schema declared.

No examples provided.

verify_agent ~507

Reconciles a claimed bot User-Agent against the operator's OWN published IP-range feed (Googlebot, GPTBot, OAI-SearchBot, ChatGPT-User, PerplexityBot, Perplexity-User, Bingbot). A User-Agent is trivial to forge; membership in the operator's published CIDR ranges is not. This exposes the common attack: a scraper sending `User-Agent: Googlebot` from an IP in none of Google's ranges. Use this tool when: - A request claims to be a search/AI crawler and you must decide whether to trust that claim before serving, allowing, or logging it. - You are separating genuine declared agents from impersonators. Inputs: - `ip` (path, required): the IPv4 or IPv6 address to check. - `ua` (query, optional): the claimed User-Agent string. Omit to ask only "is this IP a known published bot range?". Returns: - `verdict`: one of - `verified` — the IP is inside the agent's published range (UA, if given, agrees). It genuinely is that bot. - `spoofed` — the UA claims a verifiable bot but the IP is in none of its published ranges. Impersonation. - `mismatch` — the IP is a real bot's range, but the UA names a different bot. - `unverifiable` — the UA names a real agent whose operator publishes no authoritative IP feed (e.g. Anthropic's ClaudeBot). Neither confirmed nor denied — never reported as spoofed. - `unknown` — no recognized bot UA and the IP is in no known range. - `is_verified_agent`, `is_spoofed`: booleans for the two actionable cases. - `agent`, `agent_label`, `matched_agent`, `claimed_agent`: the resolved identities. - `reason`: one-line explanation of the verdict. - `feeds_as_of_ms`: when the published ranges were last refreshed. Cost: - Counts as one request against the daily rate limit. Latency: - Typical: <50ms (one KV read + CIDR match). First call after a deploy may take ~1s if it has to warm the range cache.

NameTypeReqDescription
ipstringyes
uastring

No output schema declared.

No examples provided.

verify_agent_signature ~595

Neutral third-party Web Bot Auth verification. An origin — or the PDP deciding for it — received a request from a claimed agent carrying the Web Bot Auth headers (Signature, Signature-Input, Signature-Agent). Relay those headers here, plus the authority the request was addressed to, and TunnelMind verifies the Ed25519 signature against the agent's own published key directory (https://<agent>/.well-known/http-message-signatures-directory). Facts, not a verdict: `state: verified` means "this signature cryptographically verifies against that directory" — whether to trust the agent behind it is your policy engine's call. Use this tool when: - A request claims a cryptographic agent identity (Signature-Agent header present) and you must check the claim before serving it. - You want signature verification independent of your CDN — or you are not behind a CDN that implements Web Bot Auth at all. Inputs (JSON body): - `signature` (required): the received Signature header value. - `signature_input` (required): the received Signature-Input header value. - `signature_agent` (required): the received Signature-Agent header value (quoted https origin). - `authority` (required): the host the request was addressed to. - `method`, `path`, `scheme` (optional): only needed if the signature's covered components include them. Returns: - `state`: one of - `verified` — Ed25519 signature verifies against a key in the agent's published directory. - `invalid_signature` — key found, signature does not verify (tampered or forged). - `unknown_key` — directory reachable but contains no key with the claimed thumbprint. - `directory_unreachable` — the claimed key directory did not answer; an honest degraded state, not evidence of forgery. - `expired` — the signature's `expires` timestamp has passed. - `malformed` — headers do not parse as a Web Bot Auth signature. - `key_id`: the claimed RFC 7638 JWK thumbprint. - `directory_url`: the resolved well-known dir…

NameTypeReqDescription
authoritystringyes
methodstring
pathstring
schemestring
signaturestringyes
signature_agentstringyes
signature_inputstringyes

No output schema declared.

No examples provided.

verify_receipt ~341

Tamper-detection verification for TunnelMind surveillance receipts. Submit the receipt ID, the SHA-256 content hash, and the Ed25519 signature from the receipt document. The registry compares these against what was recorded at issuance time. Returns VALID if both match exactly, INVALID with a specific mismatch reason otherwise. Use this tool when: - You received a surveillance receipt document and want to verify it hasn't been altered. - You are programmatically checking receipt authenticity in an agent workflow. - You want to prove to a third party that a receipt is genuine. Do NOT use this tool when: - You only want to check existence — use `get_receipt` instead (no body required). Inputs: - `receipt_id` (body, required): The receipt's ID field from the document. - `content_hash` (body, required): SHA-256 hex hash of the receipt JSON. Max 256 chars. - `signature` (body, required): Ed25519 signature from the receipt document. Max 512 chars. Returns: - `valid`: boolean. True only if both hash and signature match exactly. - `status`: `VALID` or `INVALID`. - `message`: human-readable explanation. On INVALID, specifies whether the hash mismatched, the signature mismatched, or both. Cost: - Free. No API key required. Latency: - Typical: <100ms, p99: <300ms.

NameTypeReqDescription
content_hashstringyesSHA-256 hex hash of the receipt JSON content
receipt_idstringyes
signaturestringyesEd25519 signature from the receipt document

No output schema declared.

No examples provided.

x402_echo ~501

Validates an agent's x402 v1 client implementation against a TunnelMind surface end-to-end. Two operating modes: - `mode: "demo"` — HMAC over a nonce against a publicly-published secret. Does not move USDC. Smoke proves the WIRE works, not money movement. - `mode: "x402"` — real Coinbase facilitator dispatch (gated on operator wallet provisioning; currently returns "facilitator not configured"). Without an `X-PAYMENT` header, the endpoint returns HTTP 402 with a standards- compliant `accepts[]` array (USDC on Base, $0.001). With a valid `X-PAYMENT` header (base64-encoded payment payload), echoes the request body and returns an `X-PAYMENT-RESPONSE` settlement header. Use this tool when: - You are validating your agent's x402 v1 client implementation against a real public endpoint. - You want to demonstrate the full 402 → retry → settle wire end-to-end. Do NOT use this tool when: - You need a real paid operation — no TunnelMind production endpoint is gated behind x402 yet. Inputs: - `X-PAYMENT` (header, optional): base64(JSON) per the x402 v1 spec. Without it, a 402 challenge is returned. - Request body (optional): any JSON object to be echoed back on successful payment. Returns: - On no header: HTTP 402 + `{ x402Version, accepts: [...] }`. - On valid payment: HTTP 200 + `{ ok: true, data: { echoed, paid_micro_usdc, x402 } }` and an `X-PAYMENT-RESPONSE` header carrying the settlement record. - On invalid payment: HTTP 402 + `{ error: "invalid payment", reason }`. Discovery: - `https://tunnelmind.ai/.well-known/x402.json` carries the public demo secret and the HMAC construction recipe. Cost: - Free in demo mode (no USDC moved). $0.001 USDC in real-mode (when activated). Latency: - Typical <100ms (demo mode); real mode is bounded by facilitator latency.

NameTypeReqDescription
X-PAYMENTstringbase64(JSON) payment payload per the x402 v1 spec. Absent → 402 challenge.

No output schema declared.

No examples provided.