TunnelMind Data API
REMOTE · MCP-DATA.TUNNELMIND.AI
Tracker / Sigil / Cross-lens — every TunnelMind Data API operation as one MCP surface.
Available components
Last scanned (6 hours ago)
Scores higher than 53% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Security
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 → Why this is hard to score →
Endpoint Security51
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation not fully verified: no authorisation is required to call this server, and 106 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
- HTTPS enforcement could not be verified: the plaintext port answered with HTTP 404, which proves neither a plaintext path nor enforcement. View diagnostics → Unverified
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability75
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 32450 tokens (~306/item across 106 items; 106 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 Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage84
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 52% of tool parameters carry a description.Partial
Tool Safety25
- Injection-marker check failed: the description of tool "scan_injection" contains an instruction override, the text "override previous rules", at byte 378 of that field. See how to fix → Fail
- 0 of 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "revoke_api_key" implies "revoke" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 107 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities40
- Spec-recency check failed: implements MCP spec 2025-03-26; the latest is 2026-07-28. See how to fix → Fail
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.
- 5 Nov 26 0
- Tool “get_changes” rewrote its description, which is the text the model reads security
- Tool “get_pricing” rewrote its description, which is the text the model reads security
- Tool “get_self_view” rewrote its description, which is the text the model reads security
- Tool “get_website_history” rewrote its description, which is the text the model reads security
- New tool “ledger_search” functional
- New tool “station_health” functional
- 26 Oct 26 0
- Tool “check_receipt_revoked” rewrote its description, which is the text the model reads security
- Tool “generate_receipt” rewrote its description, which is the text the model reads security
- Tool “profile_entity” rewrote its description, which is the text the model reads security
- 23 Oct 26 0
- Tool “attributes_lookup” rewrote its description, which is the text the model reads security
- 21 Oct 26 0
- Tool “create_free_key” rewrote its description, which is the text the model reads security
- Tool “get_domain” rewrote its description, which is the text the model reads security
- Tool “get_entity” rewrote its description, which is the text the model reads security
- Tool “ghostroute_batch_check” rewrote its description, which is the text the model reads security
- Tool “list_domains” rewrote its description, which is the text the model reads security
- Tool “list_entities” rewrote its description, which is the text the model reads security
- Tool “revoke_api_key” rewrote its description, which is the text the model reads security
- Tool “search” rewrote its description, which is the text the model reads security
- 19 Oct 26 +2
- HSTS header: fail → pass ▲ security
- 18 Oct 26 0
- Tool “ghostroute_verify” rewrote its description, which is the text the model reads security
- Tool “scan_mcp” rewrote its description, which is the text the model reads security
- Tool “sigil_atap_register_ait” rewrote its description, which is the text the model reads security
- Tool “sigil_atap_roll_block” rewrote its description, which is the text the model reads security
- Tool “sigil_atap_witness” rewrote its description, which is the text the model reads security
- Tool “sigil_receipt_generate” rewrote its description, which is the text the model reads security
- Tool “sigil_score_batch” rewrote its description, which is the text the model reads security
- Tool “sigil_verify_ads_txt_batch” rewrote its description, which is the text the model reads security
- Tool “sigil_verify_supply_path” rewrote its description, which is the text the model reads security
- Tool “verify_agent_signature” rewrote its description, which is the text the model reads security
- New tool “ghostroute_batch_check” functional
- New tool “ghostroute_cert_lookup” functional
- “sigil_verify_supply_path” added an optional parameter “ait” cosmetic
- “cross_lens_verify” reworded the description of “ait” cosmetic
- “preflight_should_i_act” reworded the description of “ait” cosmetic
- “scan_mcp” reworded the description of “url” cosmetic
- 4 Oct 26 0
- Tool “sigil_verify_app_bundle” rewrote its description, which is the text the model reads security
- 3 Oct 26 0
- Tool “sigil_verify_app_bundle” rewrote its description, which is the text the model reads security
- New tool “get_demand_aggregate” functional
- New tool “get_pricing” functional
- New tool “get_referral” functional
- New tool “get_referral_log” functional
- New tool “get_tool_registry” functional
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 5 Nov 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 | 20 Sept 2026 | 19 Dec 2026 | ECDSA 256 | ECDSA-SHA256 | e286a2188114239213510efdc936b2b5 |
| 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 |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of mcp-data.tunnelmind.ai. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| ai. | present | 1814, 3799 | 8, 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 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=31536000; includeSubDomains |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | no-referrer |
Background: How OAuth 2.1 works in the 2026 MCP spec →
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 |
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. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
intel_robots ~383
Retrieves the target domain's `robots.txt` file and parses it for AI crawler disallow rules. Specifically detects policies for known AI crawlers (GPTBot, ClaudeBot, CCBot, Bytespider, etc.) and returns a structured summary of the crawling policy. Use this tool when: - You need to know whether a domain has opted out of AI training data collection. - You want to check if a specific AI crawler is blocked before citing the domain. - You are building a dataset of AI-accessible vs AI-blocked domains. Do NOT use this tool when: - You want training opt-out signals beyond robots.txt (TDM reservation, noai meta) — use `intel_optout` instead. - You want the full technology stack — use `intel_stack` instead. - You need tracker database data — use `get_domain` instead. Inputs: - `domain` (query, required): Domain to probe. Returns: - `robots_txt_found`: false if the domain returned 404 or the file is empty. - `ai_crawlers_blocked`: list of AI crawler user-agent names that are disallowed. - `all_blocked`: true if `User-agent: *` with `Disallow: /` is present. - `raw`: first 4096 characters of the robots.txt file. Cost: - Free. No API key required. Latency: - Typical: 1-2s, p99: 6s.
| Name | Type | Req | Description |
|---|---|---|---|
| async | boolean | – | When true, return a task handle immediately instead of blocking. Poll get_task for the result. |
| domain | string | yes | – |
| receipt | boolean | – | When true, attach a signed Receipt v1.0 committed to the transparency log. Additive — a signing failure never costs you the observation (ADR-014). |
No output schema declared.
No examples provided.
intel_stack ~348
Fetches up to 32KB of the domain's HTML and response headers from the edge, then fingerprints the content for known CMS platforms, JavaScript frameworks, CDN providers, and analytics tools. Detection is based on meta generator tags, script src patterns, response headers, and cookie names. Use this tool when: - You need to know what CMS (WordPress, Drupal, Shopify) a site runs. - You are assessing a domain's infrastructure before a security review. - You want to identify analytics or marketing tools a site embeds. Do NOT use this tool when: - You want HTTP headers and security posture — use `intel_http` instead. - You want tracker database classification — use `get_domain` instead. - You need robots.txt AI policy — use `intel_robots` instead. Inputs: - `domain` (query, required): Domain to fingerprint. Returns: - `cms`: detected content management system, or null. - `frameworks`: JavaScript/backend frameworks detected. - `cdn`: CDN provider detected, or null. - `analytics`: analytics and tracking tools detected. - `meta_generators`: raw meta generator tag values. Cost: - Free. No API key required. Latency: - Typical: 2-4s (HTML fetch), p99: 7s.
| Name | Type | Req | Description |
|---|---|---|---|
| async | boolean | – | When true, return a task handle immediately instead of blocking. Poll get_task for the result. |
| domain | string | yes | – |
| receipt | boolean | – | When true, attach a signed Receipt v1.0 committed to the transparency log. Additive — a signing failure never costs you the observation (ADR-014). |
No output schema declared.
No examples provided.
ledger_search ~1,199
One public search over the receipt sources, newest first. Not `/v1/search` (that is the domain search). Use this tool when: - you want to find a TunnelMind change by ref, kind or summary. - you want one newest-first view of TunnelMind's changes and the attested tollbooth commons. - you want a past day's signed station-health rows (`source=weather-health`). Three public sources, and only these: - `changes` — the receipts ledger, lens `config` with `change:*` and `toolset:*` subjects (the same set as `GET /v1/changes`; a `kind` narrows it to one), mapped like `GET /v1/changes` so a row reads as a change, not a hash. - `commons` — tollbooth receipts from attested sites only. - `weather-health` — the signed station-health rows (lens `wx-health`), read from the public weather relay one CLOSED UTC day at a time. Every row is verified under the pinned weather key; a day that fails verification degrades the whole source. No row from the open (current) UTC day enters: the live 5-minute answer is `station_health` (`GET /v1/weather/station/{icao}/health`). The default view (no `source`) is `changes` + `commons` only and makes no relay call; weather-health rows appear only with `source=weather-health`. API-verdict receipts (cross_lens, preflight, scry, self, …) are NOT public: ADR-010 keeps them hashes-only, so they are not in this ledger. The weather-health rows are not API-verdict receipts: they are TunnelMind's own judgements over public NWS observations, already public on the relay. Searchable, NOT downloadable: `limit` is at most 100, there is no NDJSON, no `format=` and no day dump. Bulk goes through the tollbooth export. Changes rows carry public fields only — no receipt body, no `customer_id`. Commons rows carry the signed tollbooth document verbatim (`receipt`, or `receipt_unreadable: true` when the stored document does not parse). Weather-health rows carry the signed health receipt verbatim (`receipt`) with its `day`, `station`, `verdict`, `rules…
| Name | Type | Req | Description |
|---|---|---|---|
| before | string | – | Only rows strictly older than this ISO 8601 instant (timezone required). A time filter, not a paging cursor; cannot be combined with `cursor`. |
| cursor | string | – | Opaque paging cursor: pass `next_cursor` from the previous page, unchanged, with the same other filters. 1-256 base64url characters encoding JSON `{t, s, i}` (the last row's issued_at, source and id)… |
| day | string | – | Only rows issued on this UTC day (YYYY-MM-DD). Not in the future. |
| kind | string | – | Only changes of this kind. Applies to the `changes` source only. |
| limit | integer | – | Maximum rows returned, 1-100. |
| q | string | – | Substring to match (changes — subject or summary; commons — path class; weather-health — station or flag id). 0-100 chars of letters, digits, space and `._:/#@-`. |
| receipt | boolean | – | When true, attach a signed Receipt v1.0 over the result (not logged to the receipts ledger). Additive — a signing failure never costs you the observation (ADR-014). |
| source | string | – | Only this source. Omit for the default view, `changes` + `commons` (weather-health only when asked for). |
No output schema declared.
No examples provided.
list_domains ~425
Returns a paginated list of domains from the tracker database. Results are ordered alphabetically by domain name and support cursor-based pagination for full traversal. Filtering by category and minimum score allows targeted data extraction. Use this tool when: - You want to enumerate all known ad-tech or analytics domains above a risk threshold. - You need a dataset of tracker domains for offline analysis. - You are paginating through a category to build a block list. Do NOT use this tool when: - You need data for a specific domain — use `get_domain` instead. - You are searching by keyword — use `search` instead. - You want domains belonging to a specific company — use `get_entity` instead. Inputs: - `category` (query, optional): Filter by surveillance category. One of: `ad_tech`, `analytics`, `social`, `fingerprinting`, `content`, `cdn`, `other`. - `min_score` (query, optional): Integer 0-100. Exclude domains scoring below this value. - `limit` (query, optional): Number of results per page. Max 100 (paid), 20 (free). Default 50. - `cursor` (query, optional): Pagination cursor from the previous response's `next_cursor` field. Returns: - Array of domain list items (domain, category, score, prevalence, entity summary). - `meta.has_more`: true if more pages exist. - `meta.next_cursor`: pass as `cursor` to get the next page. - `meta.count`: number of results in this page. Cost: - Free tier: up to 20 results/page. Anonymous (no key): 10/min, 100/day. Free key: 50/day. Pro/enterprise: up to 100 results/page, included in plan. Latency: - Typical: <200ms, p99: <500ms.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | – |
| cursor | string | – | – |
| limit | integer | – | – |
| min_score | integer | – | – |
No output schema declared.
No examples provided.
list_entities ~360
Returns a paginated list of corporate entities in the TunnelMind surveillance database. Includes data categories, estimated data value, and industry classification. Useful for enumerating the surveillance ecosystem by sector. Use this tool when: - You want to enumerate all entities in a specific industry (e.g., all ad-tech companies). - You need a dataset of surveillance entities for analysis or reporting. - You are building a comprehensive surveillance landscape map. Do NOT use this tool when: - You need the full profile of a specific entity — use `get_entity` instead. - You are searching by entity name — use `search` instead. - You need domain-level data — use `list_domains` instead. Inputs: - `industry` (query, optional): Filter by industry classification. Examples: `ad_tech`, `analytics`, `data_broker`, `social`, `crm`. - `limit` (query, optional): Results per page. Max 100 (paid), 20 (free). Default 50. - `cursor` (query, optional): Pagination cursor from previous response's `next_cursor`. Returns: - Array of entity list items (slug, name, parent_company, industry, data_categories, data_cost_usd). - `meta.has_more` and `meta.next_cursor` for pagination. Cost: - Free tier: up to 20 results/page. Anonymous (no key): 10/min, 100/day. Free key: 50/day. Pro/enterprise: up to 100 results/page, included in plan. Latency: - Typical: <150ms, p99: <400ms.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | – |
| industry | string | – | – |
| limit | integer | – | – |
No output schema declared.
No examples provided.
list_subscriptions ~29
Returns the caller's active and inactive subscriptions (signing_key redacted). Requires an API key.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
preflight_should_i_act ~527
The single call an agent makes before transacting with a destination on the open web. Composes the cross-lens verdict with a bounded Tracker-presence bonus, maps the adjusted trust score to a tri-state decision (`allow` / `caution` / `deny`), and returns a 5-minute signed consultation receipt (`sigil_token` with `sub: preflight:consulted`). The receipt is the load-bearing artifact: the agent attaches it to its action log as cryptographic proof that the destination was consulted before action. The decision itself is commodity-shaped; the *receipt of having asked* is what accountability requires. When `ait` is supplied, the consultation additionally chains a witness-tier `preflight:consulted` event onto the ATAP AIT, signed by OAI-2026-0000201 — turning the consultation into a hash-chained, replayable artifact. Tracker presence applies a bounded `+0.05` trust bonus before decision mapping (capped at 1.0). Absence is never a penalty — most of the open web is not in the tracker corpus and that's expected. Defaults: `allow >= 0.70`, `caution >= 0.40`, else `deny`. Thresholds are overridable per request; weights are inherited from cross_lens_verify.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_id | string | – | Caller's stable agent identifier, recorded in the receipt. Validated against /^[A-Za-z0-9._:-]{1,128}$/. |
| ait | string | – | Optional ATAP AIT id. When present, chains a witness-tier `preflight:consulted` event onto the AIT. Requires `Authorization: Bearer <holder_secret>` (issued once at AIT registration); nothing is appe… |
| intent | string | – | Free-form context — recorded in the receipt, never affects the decision. Validated against /^[A-Za-z0-9._:-]{1,64}$/. |
| node | string | yes | IPv4/IPv6 address, domain, ASN with optional `AS` prefix, or entity_slug. |
| thresholds | object | – | Optional overrides; must satisfy 0 <= caution < allow <= 1. |
No output schema declared.
No examples provided.
profile_entity ~417
At least one of `ip`, `domain` or `entity` is required. Call this before routing traffic, bidding on inventory, or trusting a counterparty. It fuses ALL THREE TunnelMind lenses for one subject — Scry (attacker intelligence + threat feeds + open ports), Sigil (ad-supply-chain position + trust score + ATAP witness count), and Tracker (DDG/IAB catalog + prevalence + categories) — into a single confidence-scored profile plus a signed P38 receipt. The `cross_lens.hits` field tells you if the same infrastructure appears in attack data AND supply-chain data — that's your highest-confidence signal, and the one no siloed competitor can give you. `cross_lens.flags` surfaces the actionable highlights (`cross_lens_overlap:scry+sigil`, `in_threat_intel:...`, `high_prevalence_tracker`, `corroborated_by_N_lenses`). Confidence weighting: each lens contributes a base score; a 1.5× multiplier applies when ≥2 lenses corroborate the same subject; and the Scry contribution is weighted by the attestation tier of the sensors that observed it (silicon_root 1.0 → self_asserted 0.5). Bounded [0,1] and carried into the receipt. Unlike `cross_lens_verify` (one node → one verdict) and `cross_lens_lookup` (one node → raw three-lens view), profile_entity takes the SUBJECT as any combination of ip / domain / entity and returns the richest fused detail for a pre-transaction decision. At least one of ip / domain / entity is required.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | – | Domain of the subject (Sigil + Tracker lenses). |
| entity | string | – | entity_slug of the subject (Sigil + Tracker lenses). |
| ip | string | – | IPv4 or IPv6 address of the subject (Scry lens). |
No output schema declared.
No examples provided.
receipt_log_consistency_proof ~81
Proves the log at size `second` is an append-only extension of the log at size `first` — history was never rewritten. Returns both roots and the proof path. Verify offline with `scripts/verify-log.mjs consistency <proof.json>`.
| Name | Type | Req | Description |
|---|---|---|---|
| first | integer | yes | – |
| second | integer | yes | – |
No output schema declared.
No examples provided.
receipt_log_inclusion_proof ~155
Proves a specific receipt (by unified `receipt_id`, lens alias, or raw `leaf_index`) is included in the tree at `tree_size` (default: the latest STH's). Returns `leaf_hash`, the `audit_path`, the recomputed `root_hash`, and the matching STH. What this proves: the receipt in your hand is byte-identical to the one sequenced into the log — not that the observation inside it was correct (ADR-010). Verify offline with `scripts/verify-log.mjs inclusion <proof.json>`.
| Name | Type | Req | Description |
|---|---|---|---|
| leaf_index | integer | – | – |
| receipt_id | string | – | – |
| tree_size | integer | – | – |
No output schema declared.
No examples provided.
receipt_log_sth ~128
P72 RFC 6962 transparency log over the unified receipt ledger (ADR-010). The STH commits to the entire log: `tree_size`, `root_hash` (`0x` + SHA-256), `timestamp`, and an Ed25519 signature (with `key_id` and embedded public key) over the RFC 8785 canonicalization of the body. Hashes only — receipt bodies are never on this surface. Verify offline with `scripts/verify-log.mjs sth` (zero TunnelMind library code) against the published receipt-signing key.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
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).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | – |
No output schema declared.
No examples provided.
revoke_api_key ~185
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. 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`: confirmation that the key is permanently revoked. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| text | string | yes | Untrusted text to scan for injection signatures. |
No output schema declared.
No examples provided.
scan_mcp ~481
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. The target must be https on port 443 or 8443 at a public hostname: IP literals (in any encoding), loopback / private / internal / special-use names, and credentials in the URL are rejected, and every redirect hop is checked against the same rules. Replies are read for at most 5 s and 1 MB. 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 (https, port 443 or 8443). 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. Rate-limited like every anonymous route (10/min, 100/day per IP; more with a key). Latency: - Bounded by the target server's handshake; typically <2s.
| Name | Type | Req | Description |
|---|---|---|---|
| url | string | yes | MCP server endpoint (Streamable-HTTP). https only, port 443 or 8443, public hostname. |
No output schema declared.
No examples provided.
search ~325
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: - Anonymous (no key): 10/min, 100/day. Free key: 50/day. Pro/enterprise: included in plan. Latency: - Typical: <200ms, p99: <500ms.
| Name | Type | Req | Description |
|---|---|---|---|
| q | string | yes | – |
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`.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | yes | – |
| limit | integer | – | – |
| since | string | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | – |
No output schema declared.
No examples provided.
sigil_atap_register_ait ~292
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. The response carries `holder_secret` **once** (32 random bytes, base64url; only its SHA-256 is stored). It is what every later write to this AIT — `sigil_atap_witness`, `sigil_atap_roll_block`, `sigil_receipt_generate` — must present as `Authorization: Bearer`. Lose it and the AIT is frozen; register a new one. `operator_status` is `asserted`: Sigil signs the AIT but does not verify that the holder controls the operator OAI it names.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_type | string | – | – |
| attestation_policy | object | yes | – |
| capabilities | array | yes | – |
| constraints | object | yes | – |
| expires_at | string | yes | – |
| operator | string | yes | The agent operator's canonical OAI. |
| profile | string | yes | – |
No output schema declared.
No examples provided.
sigil_atap_roll_block ~141
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. **Holder authentication (2026-10-16).** Writes to an AIT's chain require `Authorization: Bearer <holder_secret>`, the secret `sigil_atap_register_ait` returns once. 401 without it, 403 if it does not match. AITs registered before holder authentication have no secret and are frozen for writes (403): register a new AIT to continue.
| Name | Type | Req | Description |
|---|---|---|---|
| ait | string | yes | – |
No output schema declared.
No examples provided.
sigil_atap_witness ~292
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. **Holder authentication (2026-10-16).** Writes to an AIT's chain require `Authorization: Bearer <holder_secret>`, the secret `sigil_atap_register_ait` returns once. 401 without it, 403 if it does not match. AITs registered before holder authentication have no secret and are frozen for writes (403): register a new AIT to continue.
| Name | Type | Req | Description |
|---|---|---|---|
| ait | string | yes | – |
| event_type | string | yes | – |
| payload | object | yes | – |
No output schema declared.
No examples provided.
sigil_receipt_generate ~260
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. **Holder authentication (2026-10-16).** Writes to an AIT's chain require `Authorization: Bearer <holder_secret>`, the secret `sigil_atap_register_ait` returns once. 401 without it, 403 if it does not match. AITs registered before holder authentication have no secret and are frozen for writes (403): register a new AIT to continue.
| Name | Type | Req | Description |
|---|---|---|---|
| ait | string | yes | – |
| format | string | – | – |
No output schema declared.
No examples provided.
sigil_score_batch ~204
Scores up to 200 entities in one round-trip — built for agents evaluating many supply sources during campaign setup. Per-item parse failures (e.g. a bad domain) are returned inline, with one exception: a malformed `app_bundle` id rejects the whole batch with 400. An optional `weights` object re-weights every entity in the call. Cost: - Each entity costs one rate-limit unit (the first is the request itself). A batch larger than the remaining budget is refused whole with 429 and charges nothing beyond that first unit, so the effective maximum per call is min(200, remaining + 1): anonymous 10/min, free 50/day, supporter 500/day, pro 5,000/day, enterprise unlimited.
| Name | Type | Req | Description |
|---|---|---|---|
| entity_ids | array | yes | – |
| weights | object | – | Optional 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.
| Name | Type | Req | Description |
|---|---|---|---|
| entity_id | string | yes | – |
| weights | string | – | URL-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.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | yes | Publisher hostname to traverse. |
| limit | integer | – | Max paths returned (default 200, hard cap 500). |
No output schema declared.
No examples provided.
sigil_verify_ads_txt ~756
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…
| Name | Type | Req | Description |
|---|---|---|---|
| exchange_domain | string | yes | Exchange/SSP domain as listed in ads.txt |
| publisher_domain | string | yes | Publisher domain (www. prefix and scheme stripped) |
| receipt | boolean | – | When true, attach a signed Receipt v1.0 committed to the transparency log. Additive — the response shape is otherwise unchanged, and a signing failure never costs you the verdict (ADR-014). |
| resolve_chain | boolean | – | When true, a matched RESELLER entry is cross-checked against the exchange's sellers.json |
| seller_id | string | yes | Publisher's seller/account ID at the exchange |
| seller_type | string | – | Optional — checked against the ads.txt entry |
No output schema declared.
No examples provided.
sigil_verify_ads_txt_batch ~441
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: - Each item costs one rate-limit unit (the first is the request itself). A batch larger than the remaining budget is refused whole with 429 and charges nothing beyond that first unit, so the effective maximum per call is min(100, remaining + 1): anonymous 10/min, free 50/day, supporter 500/day, pro 5,000/day, enterprise unlimited. Latency: - Typical: <150ms. With `resolve_chain: true`, add one sellers.json fetch per unique exchange (edge-cached 12h after the first fetch).
| Name | Type | Req | Description |
|---|---|---|---|
| items | array | yes | 1–100 verification requests |
| resolve_chain | boolean | – | Resolve 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}`.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | yes | – |
No output schema declared.
No examples provided.
sigil_verify_app_bundle ~422
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. null means one of two things: the platform has no store API (confidence `low`, warning `no_store_api_available`), or the store lookup failed (confidence `degraded`, warning `store_api_unavailable`, with `reason`). - `reason`: why the store lookup failed — http_<status> | timeout | network_<error name> | bad_response. Present only on the degraded path. When the relay was also tried and failed it is `<worker reason>+relay_<relay reason>`, e.g. `http_403+relay_timeout`. - `source` (iOS only): `worker` | `relay`. When the Worker's own iTunes lookup ends in http_403, http_429 or network_* and the relay is configured, the lookup is retried once through TunnelMind's relay; `relay` means the relay was consulted (success or failure). - `store_listing`: name, developer, developer_match, store_url.
| Name | Type | Req | Description |
|---|---|---|---|
| bundle_id | string | yes | – |
| claimed_developer | string | – | – |
| platform | string | yes | – |
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).
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | yes | – |
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).
| Name | Type | Req | Description |
|---|---|---|---|
| ip | string | yes | – |
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`.
| Name | Type | Req | Description |
|---|---|---|---|
| app_bundle | string | – | – |
| buyer | object | – | Optional. 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… |
| schain | object | yes | – |
| site_domain | string | – | – |
No output schema declared.
No examples provided.
sigil_verify_supply_path ~663
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). Overriding `weights` or `thresholds` still returns the score and verdict, but no token: `sigil_token` is null and `token_withheld` is `custom_scoring`.
| Name | Type | Req | Description |
|---|---|---|---|
| ait | string | – | Optional ATAP AIT id (`AIT-<uuidv7>`). When present, the `sigil_token` is bound to the AIT and a witness-tier `supply:verified` / `supply:rejected` event is chained onto it (when publisher_domain, ex… |
| buyer | object | – | Optional. 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… |
| receipt | boolean | – | When true, attach a signed Receipt v1.0 committed to the transparency log. Additive — the response shape is otherwise unchanged, and a signing failure never costs you the verdict (ADR-014). |
| supply_path | object | yes | – |
| thresholds | object | – | { pass, fail } verdict cutoffs |
| weights | object | – | Per-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`.
| Name | Type | Req | Description |
|---|---|---|---|
| token | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | yes | Publisher 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.
| Name | Type | Req | Description |
|---|---|---|---|
| entity_slug | string | yes | Stable 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.
| Name | Type | Req | Description |
|---|---|---|---|
| entity_slug | string | yes | Stable 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.
| Name | Type | Req | Description |
|---|---|---|---|
| entity_slug | string | yes | Stable 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`.
| Name | Type | Req | Description |
|---|---|---|---|
| date | string | yes | – |
No output schema declared.
No examples provided.
snapshot_diff ~36
JSONL diff vs the previous snapshot — apply +/~/- lines instead of re-pulling the corpus.
| Name | Type | Req | Description |
|---|---|---|---|
| date | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| date | string | yes | – |
No output schema declared.
No examples provided.
station_health ~265
Signed station-health row for a settlement station; see /docs Live is paid, history is free. The live answer is a flat price via x402 when the answer is fresh. Every paid live answer is a signed row that also appears in the next UTC day's public file (`v1/health/<D>.jsonl` on the weather relay, searchable via `ledger_search` with `source=weather-health`), so anyone can check a paid answer for free the next day. A stale answer is always free (`verdict: stale` with a `reason`), including `live_token_missing` (the Worker has no live-relay token) and `relay_403` (the relay refused the live read).
| Name | Type | Req | Description |
|---|---|---|---|
| X-PAYMENT | string | – | base64(JSON) x402 payment. Only a fresh answer is ever charged, and only when the paid tools flag is on. |
| icao | string | yes | ICAO code of a weather settlement station, case-insensitive. An unknown code answers 404 with the valid codes in `stations`. |
| receipt | boolean | – | When true, attach a signed Receipt v1.0 over the answer (not logged to the receipts ledger). A signing failure never costs you the answer. |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| days | integer | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| task_id | string | yes | – |
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).
| Name | Type | Req | Description |
|---|---|---|---|
| node | string | yes | – |
| note | string | – | – |
| outcome | string | yes | – |
| receipt_id | string | – | – |
No output schema declared.
No examples provided.
tollbooth_export ~308
Free bulk read of the commons — the raw record is never paywalled. Every row is a tollbooth document exactly as its site signed it (Ed25519 over RFC 8785 JCS, key = the row's own `site`), wrapped in a `_commons` envelope naming the tier and vouching domain. Nothing in a row requires trusting TunnelMind. Use this tool when: - You want the raw record behind the stats, or to verify it yourself. - You are building your own exhibit or comparison over attested sites. Returns: - `rows[]`: `{_commons: {tier, domain, received_at}, receipt | snapshot}`. - `rows_returned`, `limit`, `capped` (true when the day has more than `limit`). Cost: - Counts as one request against the daily rate limit. Past days cached 1h. Latency: - Typical: <200ms cached; up to ~1s on a cache miss for a busy day.
| Name | Type | Req | Description |
|---|---|---|---|
| day | string | – | UTC day, YYYY-MM-DD. Defaults to yesterday. |
| format | string | – | json for the {ok,data} envelope (what this tool reads); omit for the NDJSON download. |
| kind | string | – | – |
| limit | integer | – | Rows to return (JSON form defaults to 200; the NDJSON download at the same URL defaults to 5000). |
| tier | string | – | – |
No output schema declared.
No examples provided.
tollbooth_sites ~186
Membership of the commons: every signing key that has reported, the domain that vouched for it (by serving the key in its /.well-known/tollbooth-site.json), and when it was last re-checked. Attested only by default; tier=all adds unattested keys with the domain they CLAIMED but that did not (yet) vouch for them. Use this tool when: - You want to know whose data is in the exhibit, or whether a given site reports. - You are verifying an export row's `site` key against a domain. Returns: - `sites[]`: site (public key), domain, status, attested_at, last_checked_at, first_seen_at. Cost: - Counts as one request against the daily rate limit. Latency: - Typical: <100ms.
| Name | Type | Req | Description |
|---|---|---|---|
| tier | string | – | – |
No output schema declared.
No examples provided.
tollbooth_stats ~257
The public read over the Conduct Log Commons: which agents knocked on attested tollbooth sites in the last 7 days, what they did when offered paid access, and what they would have paid. First-party monitors and credential-scanning recon are classified and EXCLUDED from the headline (reported separately, never conflated). Attested tier only — keys a domain has vouched for via /.well-known/tollbooth-site.json. Use this tool when: - You want to know how AI crawlers actually behave when a site asks them to pay. - You need the current commons membership (sites by tier) and the export pointers. Returns: - `headline`: agents, requests, would_have_paid_usd, robots_respecting_agents. - `named_ai` / `other` / `attack_recon`: per-agent rows with sampled paths. - `receipts`: identity-bearing conduct receipts by type. - `commons`: tier, sites {attested, unattested}, export + attest pointers. Cost: - Counts as one request against the daily rate limit. Not cached. Latency: - Typical: 300–1200ms (two D1 reads over the last 7 days).
Input schema present but exposes no named parameters.
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).
| Name | Type | Req | Description |
|---|---|---|---|
| node | string | yes | – |
| receipt | boolean | – | – |
No output schema declared.
No examples provided.
How do I install the TunnelMind Data API MCP server?
TunnelMind Data API is a hosted endpoint at https://mcp-data.tunnelmind.ai/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · mcp-data.tunnelmind.ai
claude mcp add --transport http ai-tunnelmind-data 'https://mcp-data.tunnelmind.ai/mcp'
What is the TunnelMind Data API MCP server?
TunnelMind Data API is an MCP server listed in the public MCP registry as ai.tunnelmind/data. Tracker / Sigil / Cross-lens, every TunnelMind Data API operation as one MCP surface. This page covers its hosted endpoint (https://mcp-data.tunnelmind.ai/mcp).
Is the TunnelMind Data API MCP server safe to use?
TunnelMind Data API scores 68 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the TunnelMind Data API MCP server expose?
TunnelMind Data API exposes 106 tools: health_check, get_domain, list_domains, get_entity, list_entities, and 101 more. Their descriptions and schemas cost roughly 32,376 tokens of context every time the server is loaded.
Does the TunnelMind Data API MCP server require authentication?
No. We connected to TunnelMind Data API without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the TunnelMind Data API MCP server still maintained?
TunnelMind Data API is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.