Whispergraph Mcp Server
Description
Open-source, self-hostable MCP server for WhisperGraph — a graph of 7.39B nodes / 39B edges mapping DNS, BGP, GeoIP, WHOIS, and threat intelligence. Six read-only tools (Cypher query + schema introspection + threat assessment), six resources, eight investigation prompts. stdio…
About
Open-source, self-hostable MCP server for WhisperGraph — a graph of 7.39B nodes / 39B edges mapping DNS, BGP, GeoIP, WHOIS, and threat intelligence. Six read-only tools (Cypher query + schema introspection + threat assessment), six resources, eight investigation prompts. stdio and Streamable HTTP transports.
Details
- Author
- whisper-sec
- Downloads
- 130
- Categories
- Other, Security, Knowledge Base, Infrastructure
Jump to
- 7.39 billion nodes and 39 billion edges across 6 infrastructure layers
- 5.6 million threat-intelligence relationships from 40+ feeds and 18 categories
- 20 node labels and 29 edge types updated continuously
- Pivot from any IP, domain, or ASN in a single Cypher query
- Threat-intelligence enrichment with score, level, factors, and sources
- Timestamped WHOIS and BGP history for any indicator
Setting up with Highlight
This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:
- Download and install Highlight from highlightai.com/download
- Navigate to the plugins tab and select "Add Custom Plugin"
-
Configure the plugin with the settings below
Plugin Name
Whispergraph Mcp ServerCommand (node, npx, python, etc.)Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.
- Enable "Start Automatically" if you want the plugin to start when Highlight launches
From the repository
Users interact with Whispergraph Mcp Server via MCP tools (query, explain_indicator, whisper_history, list_labels, describe_label), MCP resources (schema, query guide, stats, quota), and 7 built-in prompt templates for common investigations (e.g., investigate-ip, map-attack-surface, compare-domains). The core method is executing a validated Cypher query that returns structured JSON, enabling one-query answers that would require dozens of traditional API calls.
query
Execute a Cypher query against WhisperGraph - the internet's largest infrastructure graph database (7.39B nodes, 39B edges, 5.6M threat intel edges). Returns JSON with columns, rows, and statistics. Use this tool for any question involving domains, hostnames, IPs, DNS, BGP, GeoIP, web links, email infrastructure, WHOIS, DNSSEC, or threat intelligence. NODE LABELS (20): HOSTNAME (2.6B), IPV4 (619M), IPV6 (820K), PREFIX (2.5M), ASN (116K), ASN_NAME (108K), ORGANIZATION (119M), CITY (54K), TLD (1.7K), COUNTRY (424), RIR (5), DNSSEC_ALGORITHM (8), TLD_OPERATOR (737), REGISTRAR (51K), EMAIL (237M), PHONE (60M), REGISTERED_PREFIX (326K, virtual), ANNOUNCED_PREFIX (1.4M, virtual), FEED_SOURCE (40, virtual), CATEGORY (18, virtual). All nodes have a "name" property. Threat-listed IPV4/IPV6/HOSTNAME nodes also carry: threatScore (Double), threatLevel (NONE/INFO/LOW/MEDIUM/HIGH/CRITICAL), threatSources, threatFirstSeen/threatLastSeen (epoch ms), and 13 boolean flags: isThreat, isAnonymizer, isC2, isMalware, isPhishing, isSpam, isBruteforce, isScanner, isBlacklist, isTor, isProxy, isVpn, isWhitelist. ANNOUNCED_PREFIX adds BGP-enrichment: isMoas, isAnycast, isWithdrawn, wasMoas, hasOriginChanged, threatScore, threatLevel, threatSourceCount, firstSeen, lastSeen. LISTED_IN edges carry firstSeen, lastSeen, weight. KEY EDGES: RESOLVES_TO (HOSTNAME→IPV4/IPV6, forward only), CHILD_OF (child→parent: HOSTNAME→HOSTNAME→TLD), ALIAS_OF (CNAME), NAMESERVER_FOR / MAIL_FOR (NS/MX → domain - to list a domain's MX use (domain)<-[:MAIL_FOR]-(mx)), SPF_INCLUDE/SPF_IP/SPF_A/SPF_MX/SPF_EXISTS/SPF_REDIRECT (SPF policy; SPF_IP targets IPV4|IPV6|PREFIX), LINKS_TO (web hyperlinks, 10.8B), BELONGS_TO (3 semantics: IPV4/IPV6→PREFIX, PREFIX→RIR, FEED_SOURCE→CATEGORY), LOCATED_IN (IPV4/IPV6→CITY only - for country, chain through HAS_COUNTRY), HAS_COUNTRY (ASN/CITY/IPV4/HOSTNAME/PHONE/ANNOUNCED_PREFIX/REGISTERED_PREFIX→COUNTRY), ANNOUNCED_BY (IPV4/IPV6→ANNOUNCED_PREFIX, then ROUTES→ASN), ROUTES (ASN/ANNOUNCED_PREFIX→PREFIX/ASN, virtual), PEERS_WITH (ASN↔ASN, bidirectional, virtual), HAS_NAME (ASN→ASN_NAME, virtual; asn.name is the AS number - the network name lives on the ASN_NAME node), REGISTERED_BY (HOSTNAME/ASN/PREFIX→ORGANIZATION), HAS_REGISTRAR / PREV_REGISTRAR / HAS_EMAIL / HAS_PHONE (WHOIS), LISTED_IN (indicator→feed; threat intel for IPV4/IPV6/HOSTNAME), CONFLICTS_WITH (PREFIX/ANNOUNCED_PREFIX↔ASN, MOAS, bidirectional), OPERATES (TLD_OPERATOR→TLD). TRAVERSAL CHAINS: DNS: HOSTNAME→RESOLVES_TO→IPV4→BELONGS_TO→PREFIX←ROUTES←ASN→HAS_NAME→ASN_NAME BGP-direct: IPV4→ANNOUNCED_BY→ANNOUNCED_PREFIX→ROUTES→ASN GeoIP: HOSTNAME→RESOLVES_TO→IPV4→LOCATED_IN→CITY→HAS_COUNTRY→COUNTRY WHOIS: HOSTNAME→HAS_REGISTRAR→REGISTRAR, HOSTNAME→HAS_EMAIL→EMAIL Threat: IPV4/HOSTNAME→LISTED_IN→FEED_SOURCE→BELONGS_TO→CATEGORY RULES: - Use {name: "value"} or WHERE n.name = "value" for lookups - both indexed - Always include LIMIT on exploration queries (max 500) - shortestPath requires bounded depth: [*1..6] - Never scan FEED_SOURCE or CATEGORY directly - access via LISTED_IN from anchored nodes - STARTS WITH, ENDS WITH ".x", CONTAINS on .name are all indexed and fast - SIGNED_WITH currently returns 0 rows on live data (DNSSEC layer empty) PROCEDURES: CALL explain("indicator") for threat assessment, CALL whisper.history("indicator") for historical WHOIS/BGP data, CALL whisper.variants("name") for typosquatting / brand-protection variant generation, CALL whisper.quota() for rate limits, CALL db.labels() / db.relationshipTypes() / db.schema("json") for schema introspection. EXAMPLES: MATCH (h:HOSTNAME {name: "www.google.com"})-[:RESOLVES_TO]->(ip:IPV4) RETURN h.name, ip.name MATCH (ip:IPV4 {name: "8.8.8.8"})<-[:RESOLVES_TO]-(h:HOSTNAME) RETURN h.name LIMIT 20 MATCH (h:HOSTNAME {name: "google.com"})-[:RESOLVES_TO]->(ip:IPV4)-[:LOCATED_IN]->(c:CITY) RETURN ip.name, c.name MATCH (a:ASN {name: "AS15169"})-[:HAS_NAME]->(n:ASN_NAME) RETURN n.name MATCH (h:HOSTNAME) WHERE h.name ENDS WITH ".go…
list_labels
List all node labels in WhisperGraph with their counts. Use this BEFORE writing a query when you're not sure which label to anchor on. It rules out hallucinated labels (e.g. there is no DOMAIN or FQDN - only HOSTNAME) and tells you which labels are large (HOSTNAME, IPV4) vs small (RIR, COUNTRY). Returns: an array of {label, count} rows. Cached server-side for 5 minutes. Tip: pair with describe_label to verify which properties exist on a label before referencing them in WHERE clauses.
describe_label
Describe a single label: confirm it exists, get its node count, and enumerate the property keys observed on that label. Use this BEFORE writing a query that filters on a specific property. If you write WHERE h.fqdn = "..." but describe_label("HOSTNAME") returns properties = ["name", "threatScore", ...], your query will silently scan the entire label. Verify first. Argument: label (string, required) - uppercase letters, digits, and underscores only. Returns: {name, exists, count, properties[], edgesDoc}. Cached 5 minutes. Tip: edge types are NOT in the response - see the whisper://schema/relationships resource for which edges connect this label to others.
explain_indicator
Run a comprehensive threat assessment on a single indicator. The indicator can be an IPv4, IPv6, hostname, CIDR network, or ASN - the procedure auto-detects the type. Returns a single structured row: { indicator, type, available, cached, found, score, level (NONE/INFO/LOW/MEDIUM/HIGH/CRITICAL), explanation, factors[], sources[] }. For ASN inputs the row also includes a `breakdown` object with composite sub-scores (threatDensityScore, graphMetricsScore, historicalScore, prefixAgeScore). For CIDR inputs the explanation field carries threat-density stats (listed IPs, density %). Prefer this tool over manual ASN→PREFIX→IP→LISTED_IN walks - those time out on large ASNs (AWS, GCP, Azure, Cloudflare). Performance: 3-25ms for IP/domain/network, up to ~80ms for ASN. Argument: indicator (string, required). Allowed characters: letters, digits, '.', '-', ':', '/', '_'. Cypher-special characters are rejected.
whisper_history
Retrieve historical WHOIS or BGP data for a single indicator. The indicator can be an IPv4, IPv6, hostname, CIDR, or ASN - the procedure auto-detects the type. Returns shape varies by indicator type: - IP / prefix (type=routing): { origin, prefix, startTime, endTime, peersSeing } - Domain (type=domain): WHOIS snapshots - { queryTime, createDate, updateDate, expiryDate, registrar, nameServers } - ASN (type=asn): prefix announcement history (slow, ~9s for large ASNs) On upstream failure (the data source is rate-limiting or temporarily down), the row shape is: { available: false, error: "timeout" | ..., retryAfter: <seconds> }. Surface the retryAfter to the user - DO NOT loop on retry. Argument: indicator (string, required). Allowed characters: letters, digits, '.', '-', ':', '/', '_'.
domain_variants
Generate typosquatting / brand-protection variants of a domain or brand name and check which ones actually exist in WhisperGraph. Runs 14 mutation algorithms - character omission, repetition, transposition, QWERTY-adjacent replacement/insertion, vowel-swap, bitsquatting, homoglyph / Unicode confusables, hyphenation, dot insertion/omission, TLD-swap, TLD-addition, and subdomain-add. Unicode input is accepted (and expected) so IDN homoglyph lookalikes resolve correctly. Returns { rows: [...] }. Each row: { variant, method, exists, nodeId, label, confidence (0.3-0.9), confidenceLabel (low/medium/high) }. By default only variants that EXIST as nodes are returned - the registered lookalikes worth investigating. Note that "exists" means registered/observed, NOT malicious: pivot each hit through explain_indicator for a threat verdict. Arguments: - name (string, required) - the domain or brand to mutate, e.g. "google.com". Allowed characters: letters (including Unicode), digits, '.', '-', '_'. - label (string, optional, default HOSTNAME) - node label to check existence against. - includeNonExistent (boolean, optional, default false) - when true, also return generated variants that do NOT exist in the graph (larger, noisier result set). Performance: typically <150ms. Results are capped at 500 rows.
list_recipes
List the whisper.security catalog of ready-made recipes - the full set exposed by this server. Two kinds: - `direct` recipes (keyless) are a single graph procedure: whisper.assess (threat posture), whisper.identify (vendor/operator), whisper.explain, whisper.variants (typosquats), whisper.origins (CDN de-cloak), whisper.history / whisper.history.whois (WHOIS timeline), whisper.walk, whisper.psl.*, whisper.asSet, whisper.lookupTorRelay, db.schema. These run WITHOUT an API key (rate-limited). - `flow` recipes (keyed) are curated multi-step investigations: attack-path, attack-surface, indicator-enrichment, infrastructure-mapping, subdomain-takeover, bgp-hijack-exposure, blast-radius, route-health, typosquat, nameserver-hijack-dns-consistency, map-supply-chain-concentration, discover-ai-agent-infrastructure, build-takedown-evidence-package, indicator, anycast-dns-root-sovereignty. These need a WhisperGraph API key. Each entry returns { slug, title, purpose, category, mode, access, requiresKey, inputs[], params[], columns[], docsUrl }. Run any of them with run_recipe(recipe=<slug>, ...). Optional filters: - mode ("direct" | "flow") - access ("keyless" | "keyed") The catalog is generated from the canonical whisper.security catalog, so this list stays in sync with what the platform ships.
run_recipe
Run a named whisper.security catalog recipe by its slug (see list_recipes for the full set). This is the highest-leverage tool for infrastructure & threat questions: instead of hand-writing Cypher, run the curated recipe. Arguments: - recipe (string, required) - the recipe slug, e.g. "assess", "identify", "indicator-enrichment", "infrastructure-mapping", "attack-path", "subdomain-takeover", "typosquat", "bgp-hijack-exposure". - inputs (object, optional) - the recipe's inputs keyed by name (see the recipe's inputs[] in list_recipes). Examples: {"v":"8.8.8.8"} for assess/identify; {"value":"github.com"} for indicator-enrichment / infrastructure-mapping; {"domain":"paypal.com"} for typosquat; {"country":"BR"} for anycast-dns-root-sovereignty; {"value":"paypal.com","other":"paypa1.com"} for attack-path. Omit to use the recipe's built-in example. - params (object, optional) - flow tuning params, e.g. {"level":"deep"} for attack-surface / infrastructure-mapping / attack-path, {"depth":3} for blast-radius, {"instanceType":"Global"} for anycast-dns-root-sovereignty. Behaviour: - `direct` recipes run keyless and return { success, recipe, mode:"direct", columns[], rows[], statistics }. - `flow` recipes need an API key (WHISPER_API_KEY over stdio, or the relayed X-API-Key / Authorization header over HTTP) and return { success, recipe, mode:"flow", steps[], totalLatencyMs } where each step carries { id, title, columns, rows }. - On an unknown slug or a keyless call to a keyed flow, returns { success:false, error, suggestion } - never throws. Prefer run_recipe over hand-written Cypher whenever a recipe fits the question; fall back to the query tool for bespoke traversals.
Claude Desktop / Cursor
Paste into your MCP client config file to install this server.
{
"mcpServers": {
"whispergraph mcp server": {
"whisper-graph": {
"command": "npx",
"args": [
"-y",
"@whisper-security/whisper-graph-mcp"
],
"env": {
"WHISPER_API_KEY": "your-api-key"
}
}
}
}
}
McpServers
{
"whisper-graph": {
"command": "npx",
"args": [
"-y",
"@whisper-security/whisper-graph-mcp"
],
"env": {
"WHISPER_API_KEY": "your-api-key"
}
}
}
- Query the internet infrastructure graph— run Cypher queries across 46B DNS, IP, ASN, BGP, WHOIS, and web-link nodes withquery.
- Explore available data types— list all node labels and their counts withlist_labels, or inspect a label’s properties withdescribe_label.
- Assess threat posture of an indicator— get a threat score, level, and contributing factors for an IP, hostname, CIDR, or ASN usingexplain_indicator.
- Run pre-built investigation recipes— execute catalog recipes likeassess,identify, orattack-pathviarun_recipewithout writing Cypher.
- Retrieve historical WHOIS or BGP data— look up past registration or routing records for an indicator withwhisper_history.
- Discover typosquatting domains— find brand-protection variants of a domain checked against the live graph usingdomain_variants.
The internet's infrastructure graph for AI agents - 46B nodes and edges mapping DNS, IPs, ASNs, BGP, WHOIS, Web links and threat intel. Sign up programmatically in 2 HTTP calls.
WhisperGraphis an MCP server backed by the world's largest internet-infrastructure graph database -46 billion nodes and edges across 20 entity types, mapping every domain, IP, ASN, prefix, organization, Web link and threat-intelligence listing into a single Cypher-queryable graph. Used by security teams, incident responders, and AI agents for investigation, attribution, brand protection, and infrastructure forensics.
- Programmatic signup in 2 HTTP calls.No browser, no CAPTCHA, no human-in-the-loop. Email verification only. Working API key in ~5 seconds.
- Free trial for everyone, including agents. Paid tiers for higher quotas.
- DNS: resolution, nameservers, MX, SPF chains, DNSSEC
- Routing: ASN ownership, BGP origin history, MOAS conflicts, peering
- Hosting & ownership: registrar, WHOIS contacts, organization mapping
- Threat intel: ~40 feeds across 18 categories,CALL explain()for full threat scoring
- Historical: WHOIS history, BGP route changes
- Web: 10.9B hyperlinks for inter-domain analysis
Learn more:Agent signup·WhisperGraph intro·Cypher API reference·Query guide·Cypher syntax·Functions·Best practices·MCP setup
You need a WhisperGraph API key. Get one either:
- Programmatically(recommended for agents) - seeAgent quickstartbelow.
- Via the dashboard(recommended for humans) -console.whisper.security/sign-up.
Whisper runs a hosted MCP server athttps://mcp.whisper.security. Point any MCP client that supports remote servers at it and authenticate with your API key:
{ "mcpServers": { "whisper": { "url": "https://mcp.whisper.security", "headers": { "Authorization": "Bearer <your_api_key>" } } } }
For local stdio transport, add this to your MCP client config:
{ "mcpServers": { "whisper-graph": { "command": "npx", "args": ["-y", "@whisper-security/whisper-graph-mcp"], "env": { "WHISPER_API_KEY": "your-api-key" } } } }
Self-hosting this repo is for teams who want to run the MCP layer in their own environment. SeeHow to set up.
Get a working API key in two HTTP calls - no browser, no CAPTCHA, no waiting list.
Step 1- start signup (Whisper emails a verification code):
POST https://console.whisper.security/api/signup Content-Type: application/json {"email":"your-agent@example.com","attribution":{"agent_name":"your-agent","source":"<registry-name>"}}
POST https://console.whisper.security/api/signup/verify Content-Type: application/json {"signup_id":"...","code":"..."}
The response containsapi_key,mcp_url,dashboard_url, anddocs_url. Useapi_keyin the MCP config snippet above. Full docs:whisper.security/docs/agent-signup.
list_recipes+run_recipeexpose the entirewhisper.security catalog- 29 curated recipes, no hand-written Cypher required. The vendored catalog (src/catalog/recipes.json) is generated from the canonical source withnpm run sync:catalog, so it tracks the platform.
- Direct recipes (keyless).A single graph procedure that runs without a key (rate-limited):assess(threat posture),identify(vendor/operator),explain,variants,origins(CDN de-cloak),history/history-whois,walk,psl-tldplusone,psl-affiliation,asset,lookup-tor-relay,db-schema.
- Flow recipes (keyed).Curated multi-step investigations that need an API key:attack-path,attack-surface,indicator-enrichment,infrastructure-mapping,subdomain-takeover,bgp-hijack-exposure,blast-radius,route-health,typosquat,nameserver-hijack-dns-consistency,map-supply-chain-concentration,discover-ai-agent-infrastructure,build-takedown-evidence-package,indicator,anycast-dns-root-sovereignty.
// keyless direct recipe { "name": "run_recipe", "arguments": { "recipe": "assess", "inputs": { "v": "185.220.101.33" } } } // keyed multi-step flow (needs WHISPER_API_KEY / X-API-Key) { "name": "run_recipe", "arguments": { "recipe": "indicator-enrichment", "inputs": { "value": "github.com" } } }
Each recipe carries adocsUrl(visible inlist_recipes) linking to its page underwhisper.security/docs.
Six MCP resources: the full schema, the relationship map, a Cypher function reference, a query cookbook, plus livewhisper://statsandwhisper://quota.
Eight investigation-workflow prompt templates:investigate-ip,map-attack-surface,compare-domains,blast-radius,threat-triage,whois-pivot,bgp-investigation,typosquat-sweep.
For remote or team deployments, run the server over Streamable HTTP:
docker run -p 8080:8080 -e MCP_TRANSPORT=http \ ghcr.io/whisper-sec/whisper-graph-mcp:latest
In HTTP mode the serverdoes not authenticate inbound requests- it relays the caller'sX-API-KeyorAuthorization: Bearerheader to the hosted WhisperGraph API, falling back to theWHISPER_API_KEYenvironment variable when no header is present. Put it behind your own gateway if you need access control.
All configuration is via environment variables.
npm install npm run dev # run from source over stdio npm test # unit + integration tests (no secrets needed) npm run build # bundle to dist/ npm run lint # eslint npm run typecheck # tsc --noEmit
Contributions are welcome. SeeCONTRIBUTING.mdand ourCode of Conduct. Security issues: seeSECURITY.md.
Apache-2.0. "Whisper", the Whisper logo, and "WhisperGraph" are trademarks of Whisper Security - seeNOTICE.
Extracts Indicators of Compromise (IoCs) from text and checks their reputation using multiple threat intelligence services.
MCP-native OSINT framework for AI agents. Exposes 9 intelligence tools (email enumeration, username search, breach check, WHOIS, IP intel, subdomain enum, dorks, paste search, phone intel) via Model Context Protocol. Also works as a standalone Python CLI.
Real-time OSINT intelligence platform for global security monitoring.
Performs data enrichment on observables using third-party services via the security-cli Python package.
GeoIP and ASN intelligence for AI agents with country, city, timezone, network ownership and ASN lookups.
An MCP server for memory forensics using the Volatility 3 framework.
A Model Context Protocol (MCP) server implementation that provides seamless integration with the AbuseIPDB API for IP reputation checking and abuse report management.
Allows access to DFIR / forensics data that was analyzed by the open source Autopsy platform
Latvian property portal MCP: search rentals, sales & nightly stays, market stats; owner tools via OAuth. Remote server at https://bezbaseina.lv/mcp
Connect to your CISO Adapt workspace to search, analyse, export, and manage risks and policies with natural language
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.





