Credential-chain CAN_REACH
Server A reads a credential. Server B uses that credential. An agent reaches B's resources without ever trusting B directly. The marquee detection — config files alone never reveal it.
AgentHound is the BloodHound for MCP/A2A config sprawl. It enumerates MCP servers, A2A agents and AI-agent client configs across an estate, builds a directed trust graph in Neo4j, and uses shortest-path algorithms to surface multi-hop attack paths the configuration files alone never reveal.
curl -sSfL https://raw.githubusercontent.com/adithyan-ak/agenthound/main/install.sh | sh
Maps the trust graph across MCP servers, A2A agents, LiteLLM, Ollama, vLLM, Qdrant, MLflow, Jupyter, Open WebUI, and LangServe.
From discovery to looting, exploitation, and clean rollback — every step writes deterministic IDs into the same Neo4j graph, so the pieces compose without manual stitching.
Enumerate MCP/A2A configs and AI/ML services across hosts.
JSON-RPC initialize probes + A2A agent-card fetches over the wire.
Read-only HTTP credential extraction (LiteLLM master key, Ollama).
Mutate tool descriptions or instruction files. --commit required.
Plant persistence in .cursor/mcp.json & friends.
Idempotent rollback by engagement-id. Receipts gate every mutation.
Embedding-inversion on GGUF weights. Detect fine-tune training signals.
Pre-built detections map to OWASP MCP Top 10 + OWASP Agentic Top 10. Or drop into raw Cypher against the Neo4j graph for ad-hoc threat hunting.
Single-file linters look at one config in isolation. AgentHound builds a directed trust graph across configs, services, and credentials — then runs shortest-path queries to surface multi-hop attack chains across protocols.
Server A reads a credential. Server B uses that credential. An agent reaches B's resources without ever trusting B directly. The marquee detection — config files alone never reveal it.
Transitive paths to filesystem, exec, and database tools across protocol boundaries.
Detects prompt-injection patterns in MCP tool descriptions across scans.
Identifies malicious tools mimicking legitimate names to hijack agent invocations.
Spots supply-chain attacks via description-hash drift between successive scans.
A2A → MCP traversal via host co-location and shared identities — the academically novel paths that span agent meshes and tool servers in one query.
Every poison and implant action persists a Receipt before it mutates anything. revert is idempotent and rolls every destructive action back by engagement-id. Reverters are compile-time mandatory — embedded interface, not optional discipline.
Each module implements a single SDK action interface — Fingerprinter, Looter, Poisoner, Implanter, Extractor, or Enumerator — and registers itself via init(). The collector binary stays lean (~9 MiB) by design.
Discover and parse local MCP/A2A client configs, instruction files, and credentials.
Enumerate MCP servers, tools, resources, prompts, and signals over the wire.
Fetch and parse A2A agent cards over HTTP, including JWS signature verification.
Scan a CIDR / host / file-of-targets for AI/ML services on standard ports.
Discover MCP servers via JSON-RPC initialize probe.
Identify LiteLLM proxy/gateway servers via /health/liveliness.
Extract upstream provider credentials via the LiteLLM master key (GET only).
Identify Ollama LLM servers via /api/version.
Anonymous model inventory + modelfiles; flag-gated weights and embeddings.
Identify vLLM inference servers via /v1/models.
Identify Qdrant vector databases by canonical title + version JSON.
Identify MLflow Tracking Server via the experiments-search API.
Anonymous, GET-only experiment + run metadata extraction from MLflow.
Identify Jupyter Server via /api/status.
Anonymous notebook inventory and active session enumeration.
Identify LangServe (LangChain HTTP API) by OpenAPI title.
Identify Open WebUI; capture its configured Ollama backend.
Rewrite MCP tool descriptions. Reverter mandatory; --commit=false default.
Sentinel-bracketed instruction injection in CLAUDE.md / AGENTS.md / .cursorrules.
Add a malicious MCP server entry to a client config (.cursor/mcp.json, etc).
Detect fine-tune training signals via embedding-layer outlier analysis on GGUF.
The collector is single-binary, ~9 MiB stripped. The server runs Neo4j + Postgres locally and binds 127.0.0.1:8080. No application-layer auth — single-user by design.
Single static Go binary. Linux, macOS, Windows.
# one-liner curl -sSfL https://raw.githubusercontent.com/adithyan-ak/agenthound/main/install.sh | sh # or via Go go install github.com/adithyan-ak/agenthound/collector/cmd/agenthound@latest
Local config discovery is offline-safe.
# local configs only — no network agenthound scan --config # network sweep agenthound scan 10.0.0.0/24 \ --engagement-id ENG-001
Docker Compose brings up Neo4j + Postgres + UI.
# bring up the stack docker compose up -d # ingest scan output agenthound scan --config --output - \ | agenthound-server ingest -