TunnelMind Data API
Server Details
Tracker / Sigil / Cross-lens — every TunnelMind Data API operation as one MCP surface.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
Glama MCP Gateway
Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.
Full call logging
Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.
Tool access control
Enable or disable individual tools per connector, so you decide what your agents can and cannot do.
Managed credentials
Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.
Usage analytics
See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.
Tool Definition Quality
Score is being calculated. Check back soon.
Available Tools
43 toolsaudit_exportInspect
Returns NDJSON (one JSON object per line) of audit log entries. Each entry records
the operation called, the identity, hashes of the request and response, duration,
and an Ed25519 signature over the canonical entry JSON. Entries are hash-chained:
each entry's prev_entry_hash is SHA-256 of the previous entry's signature,
making deletion of any entry detectable offline.
Authenticated callers receive only their own entries (identity_sub match).
Admin key holders receive all entries.
Use this tool when:
You want a tamper-evident record of your own API calls.
You are auditing a sequence of requests for compliance or debugging.
You want to verify the audit chain integrity offline.
Do NOT use this tool when:
You are anonymous — authentication is required.
You want task status — use
get_taskinstead.
Inputs:
from(query, optional): ISO 8601 start datetime. Default: 7 days ago.to(query, optional): ISO 8601 end datetime. Default: now.limit(query, optional): Max entries. 1–5000, default 1000.
Returns:
NDJSON stream, one
AuditEntryper line.X-Total-Countresponse header with entry count.X-Took-Msresponse header.
Verify the chain offline:
For each consecutive pair (A, B):
SHA-256(A.signature) == B.prev_entry_hash.For each entry: verify Ed25519 signature against public key in
/.well-known/atap.json.
Cost:
Counts as one request against the daily limit.
Latency:
Typical: <300ms for 1000 entries, p99: <1s.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| from | No | ||
| limit | No |
cancel_taskInspect
Marks the task as cancelled. If the task is already in a terminal state
(complete, failed, expired), returns 409 Conflict. Only the identity
that created the task may cancel it.
Use this tool when:
You submitted a probe with
?async=trueand no longer need the result.You want to free up a pending task before it expires.
Do NOT use this tool when:
The task is already complete — cancellation is not possible.
Inputs:
task_id(path, required): 26-char ULID.
Returns:
task_idandstatus: cancelled.
Cost:
Free.
Latency:
Typical: <150ms.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
cross_lens_verifyInspect
A2 — the cross-lens join. TunnelMind owns both halves of the open-web graph: Scry sees who is on every IP (attacker intelligence, actor class, Augur threat-intel overlap); Sigil sees the supply graph (publishers, SSPs, DSPs, ads.txt + sellers.json + SupplyChain Object). This endpoint fuses them into one verdict on a single node key.
The response contains three blocks:
scry— the single-lens Scry view (transparency).sigil— the single-lens Sigil view (transparency).cross_lens— the fused verdict (the moat).
Fusion math: weighted-mean over evaluated components plus a
co_observation_bonus when both lenses independently flag the node.
Weights and thresholds are per-request overridable.
Lens unavailability is reported in-band: each lens fails independently and the cross_lens block reflects degraded confidence when only one lens has data. Returns 503 only when BOTH lenses are unavailable.
v1 lens coverage matrix:
IP node — Scry: full; Sigil: not_indexed (v2 will reverse-DNS).
Domain node — Scry: deferred; Sigil: full (publisher/ssp/dsp + entity).
entity_slug node — Scry: n/a; Sigil: full (entity + sell/buy presence).
ASN node — Scry: deferred (v2); Sigil: not_indexed.
| Name | Required | Description | Default |
|---|---|---|---|
| ait | No | Optional ATAP AIT id (`AIT-<uuidv7>`). When present, the verdict is wrapped in a witness-tier `cross_lens:verified` event chained onto the AIT and signed by Sigil (witness OAI-2026-0000201). Independent of the AIT, a short-lived signed `sigil_token` is always issued on a successful verify so the caller has a portable proof. | |
| node | Yes | The node to verify. Type is auto-detected: IPv4 address, domain, ASN with optional `AS` prefix, or entity_slug. | |
| weights | No | Per-component weight overrides | |
| thresholds | No | { pass, fail } verdict cutoffs (defaults 0.7 / 0.3) |
generate_ghostroute_certInspect
Resolves the domain to an IP address via DNS-over-HTTPS, geolocates the IP to a country
and ASN, maps it to a jurisdiction class (EU/US/FIVE_EYES/CN/RU/SANCTIONED/UNKNOWN),
and issues a signed jurisdiction certificate. The certificate is stored in the public
registry and can be verified at /ghostroute/{cert_id}.
Use this tool when:
You want to know which legal jurisdiction controls a domain's infrastructure.
You need a verifiable, tamper-evident record of a domain's hosting jurisdiction.
You are assessing GDPR, CLOUD Act, or OFAC transfer risk for a domain.
You want to generate evidence for a privacy impact assessment.
Do NOT use this tool when:
You want to look up an existing certificate — use
get_ghostroute_certinstead.You want tracker category or score data — use
get_domaininstead.You want live HTTP header or security probe — use
intel_httpinstead.
Inputs:
domain(body, required): Fully qualified domain name (e.g.google.com). URLs are accepted and stripped to their host component.
Returns:
certificate_id: Unique cert ID (e.g.gr-20260417-xxxx).certificate: Full certificate document including target IP, country, ASN, jurisdiction, verdict, risk level, and explanatory note.content_hash: SHA-256 of the canonical certificate JSON.signature: Base64 Ed25519 signature (empty string if signing key not configured).signed: Boolean — true if the certificate is cryptographically signed.verify_url: Path to retrieve this certificate from the public registry.
Jurisdiction classes:
EU/GDPR_COMPLIANT— risk: lowUS/FIVE_EYES/FIVE_EYES_MEMBER— risk: mediumCN/RU/AUTHORITARIAN— risk: highSANCTIONED— risk: criticalUNKNOWN/INSUFFICIENT_DATA— risk: unknown
Cost:
Counts as one request against the daily limit.
Performs outbound DNS resolution and IP geolocation on each call (not cached).
Latency:
Typical: 200–600ms (DNS + ASN lookup). p99: <2s.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to probe (URLs are stripped to host component) |
generate_receiptInspect
Looks up each submitted domain in the TunnelMind tracker database, aggregates risk
metrics (avg score, max score, fingerprinters, high-risk domains, entity ownership),
and issues a signed surveillance receipt. The receipt is stored in the public registry
and can be verified at /verify/{receipt_id}.
Use this tool when:
You want a verifiable record of which trackers were observed in a context (page, app, session).
You need a signed evidence artifact for a privacy audit or compliance report.
You want to know the overall surveillance exposure level for a set of domains.
You are generating a receipt to share with a user as evidence of tracker presence.
Do NOT use this tool when:
You want full tracker details per domain — use
get_domaininstead.You want to look up an existing receipt — use
get_receiptinstead.You need live probes (HTTP headers, stack detection) — use
/v1/intel/*instead.
Inputs:
domains(body, required): Array of 1–50 fully qualified domain names. Duplicates are deduplicated. URLs are stripped to host component.domain(body, alternative): Single domain string (shorthand fordomains: [domain]).
Returns:
receipt_id: Unique receipt ID (e.g.rcpt_01JXYZ...).receipt: Full receipt document including domains submitted, tracker findings, high-risk domains, fingerprinters, unique entities, and exposure metrics.content_hash: SHA-256 of the canonical receipt JSON.signature: Base64 Ed25519 signature (empty string if signing key not configured).signed: Boolean — true if the receipt is cryptographically signed.verify_url: Path to retrieve this receipt from the public registry.
Exposure levels: minimal / moderate / high / critical
Based on average tracker score and proportion of high-risk domains (score ≥ 70).
Cost:
Counts as one request against the daily limit regardless of domain count.
Latency:
Typical: <100ms (pure D1 lookup, no outbound probing). p99: <300ms.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Single domain shorthand (alternative to `domains`) | |
| domains | No | Domain names to look up (1–50) |
get_api_keyInspect
Returns the tier, label, masked owner email, creation date, last-used timestamp, today's request count, and daily request limit for the API key used in this request. Useful for agents that need to monitor their own quota consumption.
Use this tool when:
You want to check how many requests your key has used today.
You need to know your current tier or daily limit.
You want to confirm that your API key is active.
Do NOT use this tool when:
You want to manage multiple keys — this endpoint only reflects the calling key.
You need tracker data — use the tracker endpoints instead.
Inputs:
No body or query parameters. Auth is from the
Authorization: Bearerheader.
Returns:
tier: free, supporter, pro, or enterprise.requests_today: integer count from KV (best-effort; resets at UTC midnight).limit_per_day: null for enterprise (unlimited).last_used: ISO 8601 timestamp, may be null if never used.
Cost:
Free. Does not count against the daily request limit.
Latency:
Typical: <150ms, p99: <400ms.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
get_domainInspect
Returns the complete surveillance intelligence record for a domain name. If the domain is in TunnelMind's tracker database (80,000+ entries), the response includes tracker category, risk score, fingerprinting data, cookie persistence, IAB TCF purposes, and the owning corporate entity. If the domain is not in the database, a live probe is automatically run: RDAP registration data, DNS records (MX, SPF, TXT verification tokens), HTTP headers, and CSP third-party actors are fetched fresh from the edge and returned.
Use this tool when:
You need to know whether a specific domain tracks users, and how aggressively.
You are researching who owns a domain and what corporate entity controls it.
You want to check HTTP security headers and third-party services embedded in a site.
You are building a risk score for a domain before routing traffic through it.
Do NOT use this tool when:
You want to search by keyword or category — use
searchinstead.You want all domains for an entity — use
get_entityinstead.You want jurisdiction routing data — use
get_ghostroute_certinstead.
Inputs:
domain(path, required): Domain name. Stripwww.prefix — it is removed automatically. Subdomains are resolved to the parent:ads.doubleclick.net→doubleclick.net. Examples:doubleclick.net,google-analytics.com,intercom.io.
Returns:
Full
DomainRecord. Free tier returns the domain, category, score, prevalence, and entity name. Pro/enterprise additionally returntcf_vendor_id,tcf_purposes,tcf_features, anddisconnect_cats.If the domain is not in the tracker database,
live_lookup: trueis set and RDAP/DNS/HTTP probe results are returned instead of tracker fields.404 if the domain cannot be found via live probe either (unknown TLD, unreachable).
Cost:
Free tier: included in 50 req/day limit. Pro/enterprise: included in plan.
Latency:
Database hit: typical <100ms, p99 <300ms.
Live probe: typical 2-5s, p99 10s (external DNS/HTTP calls).
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain name to look up (www. prefix stripped automatically) |
get_entityInspect
Returns an entity record for a surveillance company or data broker, including its industry, estimated annual data value per user (in USD), categories of personal data collected, and the full list of domains it controls. Free tier returns 5 domains, paid returns up to 200.
Use this tool when:
You want to understand what corporate entity owns or controls a tracker domain.
You need to assess the total surveillance footprint of a company (e.g., Alphabet, Meta, Oracle).
You are building a corporate surveillance graph and need domain-to-entity mapping.
Do NOT use this tool when:
You have a domain and need its category — use
get_domaininstead.You want to browse entities by industry — use
list_entitiesinstead.You are searching for an entity by name — use
searchinstead.
Inputs:
slug(path, required): URL-safe entity identifier (lowercase, hyphens). Examples:alphabet,meta,oracle-data-cloud,the-trade-desk.
Returns:
Full
EntityRecordwith data categories, estimated data cost, and associated domains.domains: array of top-scoring domains (5 for free tier, 200 for paid).Pro/enterprise additionally return
websiteanddescriptionfields.
Cost:
Free tier: included in 50 req/day limit. Pro/enterprise: included in plan.
Latency:
Typical: <150ms, p99: <400ms.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes |
get_ghostroute_certInspect
Returns the proof-of-existence record for a TunnelMind GhostRoute jurisdiction certificate. A GhostRoute certificate is a signed document proving that a user's network traffic was observed routing through specific legal jurisdictions during a defined time window. The full certificate stays on the issuing node; only the metadata, content hash, and signature are stored in this public registry.
Use this tool when:
You have a GhostRoute certificate ID and want to confirm it was genuinely issued by TunnelMind.
You want the GDPR verdict, issuance time, and signing key for a certificate.
You are verifying a certificate's existence before attempting content verification.
Do NOT use this tool when:
You have the full certificate and want to verify its integrity — use
verify_ghostroute_certinstead.You want surveillance receipt verification — use
get_receiptinstead.
Inputs:
cert_id(path, required): GhostRoute certificate ID in formatgr-YYYYMMDD-xxxxxxxxxxxx(e.g.,gr-20260417-a1b2c3d4e5f6). Lowercase hex only.
Returns:
status:FOUNDif the certificate is in the registry.verdict: the GDPR verdict (e.g.,GDPR_VIOLATION_PROBABLE).generated_at: ISO 8601 timestamp.content_hash: SHA-256 hash of the full certificate — compare against your copy.message: instructions for content verification.400 if the cert_id format is invalid.
404 if the certificate is not in the registry.
Cost:
Free. No API key required.
Latency:
Typical: <100ms, p99: <300ms.
| Name | Required | Description | Default |
|---|---|---|---|
| cert_id | Yes |
get_receiptInspect
Returns metadata for a TunnelMind surveillance receipt — a signed document proving
that a specific user's surveillance exposure was observed, measured, and recorded at
a specific time. Does NOT return the receipt's signature (anti-phishing protection).
To verify a receipt's content integrity, use verify_receipt with the hash and
signature from the receipt document itself.
Use this tool when:
You have a receipt ID and want to confirm it was genuinely issued by TunnelMind.
You need the issuance timestamp and signing key ID for a receipt.
You want to check whether a receipt exists before attempting content verification.
Do NOT use this tool when:
You have the full receipt document and want to verify it hasn't been tampered with — use
verify_receiptinstead.You need jurisdiction certificate data — use
get_ghostroute_certinstead.
Inputs:
receipt_id(path, required): The receipt ID from the receipt document. Alphanumeric with hyphens, max 128 characters.
Returns:
status:FOUNDif the receipt is in the registry.generated_at: ISO 8601 timestamp of receipt issuance.signing_key_id: identifier of the Ed25519 key used to sign.schema_version: receipt schema version.message: human-readable summary with instructions for content verification.404 if the receipt ID is not in the registry.
Cost:
Free. No API key required.
Latency:
Typical: <100ms, p99: <300ms.
| Name | Required | Description | Default |
|---|---|---|---|
| receipt_id | Yes |
get_taskInspect
Returns the current status of a task created by an ?async=true intel request.
Poll this endpoint until status is one of: complete, failed, cancelled,
expired. On complete, the result field contains the same payload the sync
endpoint would have returned. On failed, error.message explains the failure.
Use this tool when:
You submitted an intel probe with
?async=trueand need to retrieve the result.You want to check whether a background task finished without opening an SSE stream.
Do NOT use this tool when:
You want real-time event streaming — use
stream_taskinstead.You have no task_id — submit a probe with
?async=truefirst.
Inputs:
task_id(path, required): 26-char ULID returned in the 202 response.
Returns:
status:pending|running|complete|failed|cancelled|expired.result: populated when status iscomplete. Null otherwise.error: populated when status isfailed. Null otherwise.expires_at: tasks expire 1 hour after creation.
Cost:
Free. Does not count against rate limits.
Latency:
Typical: <100ms.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
health_checkInspect
Returns a minimal status object confirming the API is alive. Use this to verify connectivity before chaining other calls, or as a liveness check in a workflow.
Use this tool when:
You need to verify the API is reachable before starting a multi-step investigation.
A prior call failed with a 503 or 504 and you want to confirm the service recovered.
You are debugging connectivity from a new environment.
Do NOT use this tool when:
You want actual tracker data — use
get_domainorsearchinstead.You want to check a specific domain — this returns nothing domain-specific.
Inputs:
None.
Returns:
ok: always true if the API is up.ts: ISO 8601 timestamp of the server's current time.
Cost:
Free. No API key required. Not rate-limited.
Latency:
Typical: <50ms, p99: <200ms.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
intel_agentInspect
Probes a domain for known AI agent integration signals: llms.txt, ai.txt,
/.well-known/ai-plugin.json, openapi.json, swagger.json, MCP manifest, MCP
SSE endpoint. Returns a score based on the count of signals detected. Use this to
assess whether a domain is ready for agent-to-agent interaction.
Use this tool when:
You want to know whether a domain exposes an MCP server or OpenAPI spec for agents.
You are cataloguing the AI-agent-ready surface of a set of domains.
You need to decide whether to attempt programmatic API access to a domain.
Do NOT use this tool when:
You need tracker/surveillance data about the domain — use
get_domaininstead.You need the robots.txt AI crawler policy — use
intel_robotsinstead.You need HTTP security posture — use
intel_httpinstead.
Inputs:
domain(query, required): Domain to probe.
Returns:
Boolean flags per signal (
llms_txt,ai_plugin,openapi,mcp_manifest,mcp_endpoint,mcp_sse).agent_surface_score: integer 0-8, count of signals detected.
Cost:
Free. No API key required.
Latency:
Typical: 2-5s (parallel probes), p99: 8s.
| Name | Required | Description | Default |
|---|---|---|---|
| async | No | When true, return a task handle immediately instead of blocking. Poll get_task for the result. | |
| domain | Yes |
intel_httpInspect
Makes a live HEAD request to the target domain from the Cloudflare edge, follows up to 5 redirects, and returns the full redirect chain, final HTTP status, key response headers, a security header score, and any third-party surveillance actors referenced in the Content-Security-Policy header.
Use this tool when:
You want to verify whether a site enforces HTTPS and HSTS.
You need to inspect what third-party scripts a site loads via its CSP header.
You are assessing a domain's security posture before trusting it.
You want to detect surveillance actors embedded in a site's CSP.
Do NOT use this tool when:
You need tracker database data (category, score, entity) — use
get_domaininstead.You need the technology stack (CMS, framework) — use
intel_stackinstead.You need robots.txt AI crawler policy — use
intel_robotsinstead.
Inputs:
domain(query, required): Domain to probe. Can include or omithttps://. Examples:nytimes.com,https://example.com.
Returns:
reachable: false if the domain did not respond within 6 seconds.redirect_chain: each hop with URL, status code, and Location header.security_headers.score: 0-100 based on presence of HSTS, CSP, X-Content-Type, X-Frame-Options, Referrer-Policy.security_headers.missing: list of headers absent.csp_actors: known surveillance actors detected in the CSP header.error: set if the connection failed.
Cost:
Free. No API key required.
Latency:
Typical: 1-3s (outbound fetch), p99: 6s (timeout). Plan for async if chaining calls.
| Name | Required | Description | Default |
|---|---|---|---|
| async | No | When true, return a task handle immediately instead of blocking. Poll get_task for the result. | |
| domain | Yes |
intel_injectInspect
Fetches a domain's homepage and checks for content patterns that could constitute
prompt injection attacks against AI agents that visit and ingest the page. Signals
include hidden text, invisible divs, <!-- AI: ignore --> style comments, and
known injection patterns.
Use this tool when:
You are vetting a domain before feeding its content into an LLM context.
You want to assess the prompt injection risk of a URL before browsing it with an agent.
You are auditing a set of domains for adversarial AI content.
Do NOT use this tool when:
You want tracker surveillance data — use
get_domaininstead.You want AI training opt-out signals — use
intel_optoutinstead.You want the agent surface (MCP/OpenAPI) — use
intel_agentinstead.
Inputs:
domain(query, required): Domain to scan.
Returns:
injection_signals: list of signal types detected (e.g.,hidden_text,ai_instruction_comment,invisible_div).risk_level:none,low,medium, orhighbased on signal count and type.
Cost:
Free. No API key required.
Latency:
Typical: 2-4s (HTML fetch), p99: 7s.
| Name | Required | Description | Default |
|---|---|---|---|
| async | No | When true, return a task handle immediately instead of blocking. Poll get_task for the result. | |
| domain | Yes |
intel_optoutInspect
Checks a domain for all known AI training data opt-out mechanisms beyond robots.txt:
TDM (Text and Data Mining) reservation headers, <meta name="ai"> tags, Creative
Commons NonCommercial licenses, and other machine-readable opt-out signals.
Use this tool when:
You need to determine whether a domain has opted out of AI training data collection.
You are checking compliance before using a domain's content in a training dataset.
You want a comprehensive opt-out status (robots.txt + TDM + meta tags combined).
Do NOT use this tool when:
You only need robots.txt crawler policy — use
intel_robotsinstead (faster).You need tracker data — use
get_domaininstead.You want injection risk assessment — use
intel_injectinstead.
Inputs:
domain(query, required): Domain to probe.
Returns:
tdm_reservation: true if the domain sends aTDM-Reservation: 1header.noai_meta: true if the HTML contains<meta name="robots" content="noai">.license_detected: string if a CC NonCommercial or similar license is detected, otherwise null.opted_out: true if any opt-out signal is present.
Cost:
Free. No API key required.
Latency:
Typical: 2-4s, p99: 7s.
| Name | Required | Description | Default |
|---|---|---|---|
| async | No | When true, return a task handle immediately instead of blocking. Poll get_task for the result. | |
| domain | Yes |
intel_robotsInspect
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_optoutinstead.You want the full technology stack — use
intel_stackinstead.You need tracker database data — use
get_domaininstead.
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 ifUser-agent: *withDisallow: /is present.raw: first 4096 characters of the robots.txt file.
Cost:
Free. No API key required.
Latency:
Typical: 1-2s, p99: 6s.
| Name | Required | Description | Default |
|---|---|---|---|
| async | No | When true, return a task handle immediately instead of blocking. Poll get_task for the result. | |
| domain | Yes |
intel_stackInspect
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_httpinstead.You want tracker database classification — use
get_domaininstead.You need robots.txt AI policy — use
intel_robotsinstead.
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 | Required | Description | Default |
|---|---|---|---|
| async | No | When true, return a task handle immediately instead of blocking. Poll get_task for the result. | |
| domain | Yes |
list_domainsInspect
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_domaininstead.You are searching by keyword — use
searchinstead.You want domains belonging to a specific company — use
get_entityinstead.
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'snext_cursorfield.
Returns:
Array of domain list items (domain, category, score, prevalence, entity summary).
meta.has_more: true if more pages exist.meta.next_cursor: pass ascursorto get the next page.meta.count: number of results in this page.
Cost:
Free tier: up to 20 results/page, 50 req/day. Pro/enterprise: up to 100 results/page.
Latency:
Typical: <200ms, p99: <500ms.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| category | No | ||
| min_score | No |
list_entitiesInspect
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_entityinstead.You are searching by entity name — use
searchinstead.You need domain-level data — use
list_domainsinstead.
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'snext_cursor.
Returns:
Array of entity list items (slug, name, parent_company, industry, data_categories, data_cost_usd).
meta.has_moreandmeta.next_cursorfor pagination.
Cost:
Free tier: up to 20 results/page, 50 req/day. Pro/enterprise: up to 100 results/page.
Latency:
Typical: <150ms, p99: <400ms.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| industry | No |
revoke_api_keyInspect
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_keyinstead.You intend to keep using the API — this is permanent.
Inputs:
No body or query parameters. Auth is from the
Authorization: Bearerheader.
Returns:
revoked: true.note: reminder about Stripe subscription cancellation.
Cost:
Free. Does not count against the daily request limit.
Latency:
Typical: <150ms, p99: <400ms.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
searchInspect
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.comappear in the tracker DB?).
Do NOT use this tool when:
You know the exact domain — use
get_domaininstead (faster, more complete).You know the exact entity slug — use
get_entityinstead.You want to browse by category or industry — use
list_domainsorlist_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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes |
sigil_ads_txt_historyInspect
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 onobserved_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 | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| since | No | ||
| domain | Yes |
sigil_atap_ait_statusInspect
Returns an AIT's status, chain head hash, event count, pending-event count, per-tier event counts, and the anchored-bid coverage ratio.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
sigil_atap_register_aitInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | Yes | ||
| operator | Yes | The agent operator's canonical OAI. | |
| agent_type | No | media-buyer | |
| expires_at | Yes | ||
| constraints | Yes | ||
| capabilities | Yes | ||
| attestation_policy | Yes |
sigil_atap_roll_blockInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ait | Yes |
sigil_atap_witnessInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ait | Yes | ||
| payload | Yes | ||
| event_type | Yes |
sigil_receipt_generateInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ait | Yes | ||
| format | No | full |
sigil_score_batchInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| weights | No | Optional custom weights: an object of `{ type: { component: weight } }`. | |
| entity_ids | Yes |
sigil_score_entityInspect
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 | Required | Description | Default |
|---|---|---|---|
| weights | No | URL-encoded JSON: an object of `{ type: { component: weight } }`. | |
| entity_id | Yes |
sigil_score_weightsInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
sigil_verify_adscertInspect
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 | Required | Description | Default |
|---|---|---|---|
| domain | Yes |
sigil_verify_ads_txtInspect
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. Awww.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):DIRECTorRESELLER. 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) whenverifiedis 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 unlessresolve_chain: trueand the matched entry is RESELLER — then it carries the sellers.json cross-check for the seller.warnings: actionable flags, e.g.publisher_not_in_corpus,publisher_has_no_ads_txt,seller_type_mismatch,ads_txt_cache_stale.
Cost:
Counts as one request against the daily rate limit.
Latency:
Typical: <50ms (single cache lookup, no outbound fetch). p99: <120ms.
| Name | Required | Description | Default |
|---|---|---|---|
| seller_id | Yes | Publisher's seller/account ID at the exchange | |
| seller_type | No | Optional — checked against the ads.txt entry | |
| resolve_chain | No | When true, a matched RESELLER entry is cross-checked against the exchange's sellers.json | |
| exchange_domain | Yes | Exchange/SSP domain as listed in ads.txt | |
| publisher_domain | Yes | Publisher domain (www. prefix and scheme stripped) |
sigil_verify_ads_txt_batchInspect
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 (matchesitemslength, in order).verified_count: how many resolved toverified: true.results: array aligned toitems. Each entry is either a verification result withok: trueandinput_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).
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | 1–100 verification requests | |
| resolve_chain | No | Resolve reseller chains for every RESELLER item |
sigil_verify_app_bundleInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | ||
| bundle_id | Yes | ||
| claimed_developer | No |
sigil_verify_domainInspect
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 | Required | Description | Default |
|---|---|---|---|
| domain | Yes |
sigil_verify_ip_typeInspect
Classifies an IPv4 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.
PRIVACY: the IP is used for lookup only — never logged, never stored.
Inputs:
ip(query, required): IPv4 address. IPv6 is not yet supported.
Returns:
ip_type: datacenter | residential | mobile | unknown.confidence: high | medium | low.asn,asn_name: the resolved autonomous system.scry_signals: reserved for Scry corpus cross-reference (empty in v1).
Latency:
Typical: 100-250ms (two live DNS lookups).
| Name | Required | Description | Default |
|---|---|---|---|
| ip | Yes |
sigil_verify_supply_chainInspect
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
asisellers.json declares the node'ssid.owner-domain — node[0]'s sellers.json seller
domainmatches the publisher's ads.txt OWNERDOMAIN / MANAGERDOMAIN (spec §3.5.1).schain.complete— an incomplete chain caps the verdict atwarn.
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 | Required | Description | Default |
|---|---|---|---|
| buyer | No | 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 the verdict or response shape, silent on every failure path. Requires `entity_slug` plus one of `dsp_domain` / `dsp_id`. | |
| schain | Yes | ||
| app_bundle | No | ||
| site_domain | No |
sigil_verify_supply_pathInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| buyer | No | 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 the verdict or response shape, silent on every failure path. Requires `entity_slug` plus one of `dsp_domain` / `dsp_id`. | |
| weights | No | Per-check weight overrides | |
| thresholds | No | { pass, fail } verdict cutoffs | |
| supply_path | Yes |
sigil_verify_tokenInspect
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 | Required | Description | Default |
|---|---|---|---|
| token | Yes |
stream_taskInspect
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 oncompletewith the full result payloaderror— emitted onfailed,cancelled, orexpiredwith error infoSSE 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_taskinstead.Your HTTP client doesn't support streaming responses.
Inputs:
task_id(path, required): 26-char ULID.
Returns:
SSE stream (
text/event-stream). Each event isevent: <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 | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
verify_ghostroute_certInspect
Tamper-detection verification for GhostRoute jurisdiction certificates. Submit the certificate ID, the SHA-256 content hash, and the Ed25519 signature from the certificate document. The registry compares these against what was recorded at issuance time. Returns VALID if both match exactly.
Use this tool when:
You received a GhostRoute certificate and want to verify it hasn't been altered.
You need to confirm a certificate's verdict is authentic and unmodified.
You are programmatically attesting to a certificate's validity in an agent workflow.
Do NOT use this tool when:
You only want to confirm existence — use
get_ghostroute_certinstead.You want receipt verification — use
verify_receiptinstead.
Inputs:
certificate_id(body, required): ID from the certificate document. Max 128 chars.content_hash(body, required): SHA-256 hex hash of the certificate JSON. Max 256 chars.signature(body, required): Ed25519 signature from the certificate. Max 512 chars.
Returns:
valid: true only if both hash and signature match.status:VALIDorINVALID.verdict: the GDPR verdict string from the certificate.message: on INVALID, specifies whether hash or signature mismatched.
Cost:
Free. No API key required.
Latency:
Typical: <100ms, p99: <300ms.
| Name | Required | Description | Default |
|---|---|---|---|
| signature | Yes | ||
| content_hash | Yes | ||
| certificate_id | Yes |
verify_receiptInspect
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_receiptinstead (no body required).You want jurisdiction certificate verification — use
verify_ghostroute_certinstead.
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:VALIDorINVALID.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.
| Name | Required | Description | Default |
|---|---|---|---|
| signature | Yes | Ed25519 signature from the receipt document | |
| receipt_id | Yes | ||
| content_hash | Yes | SHA-256 hex hash of the receipt JSON content |
Claim this connector by publishing a /.well-known/glama.json file on your server's domain with the following structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"maintainers": [{ "email": "your-email@example.com" }]
}The email address must match the email associated with your Glama account. Once published, Glama will automatically detect and verify the file within a few minutes.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!