domain_infoLABSCO SUMMARY
The graph you already collected, questioned in English.
The value is in the offensive-query library and the system prompt behind it: the assistant is told to load the battle-tested Cypher templates before writing its own, and never to call something an admin without checking group memberships and admincount first. Read the security note before you point it anywhere real — BloodHound data sent through this tool reaches your LLM provider's servers, so the README steers it at lab ranges and training, not production AD.
What it is
A server that connects an LLM to BloodHound Community Edition and BloodHound Enterprise over their REST API and Neo4j graph: 13 composite tools, 10 reference resources, and a bloodhound_assistant system prompt tuned for offensive-security analysis.
What you get
- Thirteen composite tools instead of a sprawl of endpoints — each takes an info_type parameter to pick what comes back, which keeps the tool surface small and the token cost down
- domain_info covers a whole domain: users, groups, computers, OUs, GPOs, dc_syncers, foreign_admins, foreign_group_members and linked_gpos among its info_type options
- user_info, group_info and computer_info answer the privilege questions directly — sessions, memberships, admin_rights, rdp_rights, dcom_rights, ps_remote_rights, sql_admin_rights, constrained_delegation, and the controllers/controllables both directions
- graph_analysis runs shortest_path between two principals, edge_composition to see why an edge exists, and search
- adcs_info returns certificate templates and esc_paths for the ADCS ESC1–ESC13 escalations
- cypher_query runs raw Cypher (run) and manages saved queries (saved_list, saved_get), backed by a bloodhound://cypher/offensive-queries library of templates for DCSync, Kerberoasting, GPO abuse, delegation, ADCS, shadow credentials and NTLM relay
- custom_nodes and file_upload handle OpenGraph and collection ingest: model non-AD infrastructure as custom node types, and upload a SharpHound or AzureHound ZIP by path or as base64 bytes, single-shot or across a start_job / upload_bytes_to_job / end_job sequence
- data_quality (stats, platform_list, platform_info) and asset_groups (list, members, custom_selectors) round out the read surface
- Ten resources the model loads on demand without spending API calls — Cypher reference, AD and Azure quick references and full methodologies, ADCS ESC guides, and OpenGraph schema examples
Requirements
A BloodHound CE or Enterprise instance with data loaded, and an API token pair from its Administration → API Tokens page held in BLOODHOUND_TOKEN_ID and BLOODHOUND_TOKEN_KEY, with the host in BLOODHOUND_DOMAIN. Python 3.11+ and uv; the published launch line is uvx --from git+https://github.com/mwnickerson/bloodhound_mcp bloodhound-mcp. It defaults to https on 443 — BLOODHOUND_PORT and BLOODHOUND_SCHEME override that, and BLOODHOUND_VERIFY_TLS=false exists only for a trusted lab with a self-signed certificate. At startup it makes a signed read-only call to /api/v2/self and refuses to serve if the credentials, connectivity or TLS fail, timing out after 10 seconds.
Setup effort
One command plus a key — uvx --from git+https://github.com/mwnickerson/bloodhound_mcp bloodhound-mcp, then supply credentials
USE CASES
Getting oriented in an unfamiliar domain
Ask what domains BloodHound holds and who the Domain Admins are, then let it enumerate the users, groups and computers that matter before you decide where to look harder.
Working out what one account can reach
Name a user and get the rights that account actually holds — admin, RDP, PS-Remoting, SQL admin, delegation — plus the sessions on it and everything it controls, without hand-writing the traversal.
Finding the path to Domain Admins
Ask for the shortest path from a foothold to a high-value target, then have it explain why each edge is there rather than trusting the line on faith.
Hunting a specific escalation
Go after one technique — kerberoastable users with admincount set, ADCS ESC1 templates, GPO abuse — by pulling the matching template from the offensive-query library and running it as Cypher.
Getting a fresh collection into the graph
Hand it a SharpHound or AzureHound ZIP by path or as base64 bytes and let it run the upload, or open a job and stream several files in before closing it.
Modelling infrastructure AD does not describe
Use OpenGraph to add custom node types for cloud resources or databases, upsert the extension schema first, then ingest the data so it lives in the same graph as the directory.
13 tools
Listed in project docs. Your client may show a different list.
user_infogroup_infocomputer_infoou_infogpo_infograph_analysisadcs_infocypher_querydata_qualityasset_groupscustom_nodesfile_uploadBEFORE YOU INSTALL
What to know first
Tools you get
13 tools named in the project's documentation.
Requires
- Python 3.11+ and uv
- A BloodHound CE or Enterprise instance with data loaded
- BLOODHOUND_DOMAIN, BLOODHOUND_TOKEN_ID and BLOODHOUND_TOKEN_KEY — set in the client blocks
Where it runs
All 3 documented clients run the server on your machine.
INSTALLATION
Connect your client
Server setup
uvx --from git+https://github.com/mwnickerson/bloodhound_mcp bloodhound-mcpMCP Clients
Claude Desktop
{
"mcpServers": {
"bloodhound_mcp": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/mwnickerson/bloodhound_mcp",
"bloodhound-mcp"
],
"env": {
"BLOODHOUND_DOMAIN": "<YOUR_BLOODHOUND_INSTANCE>.domain.com",
"BLOODHOUND_TOKEN_ID": "<YOUR_BLOODHOUND_TOKEN_ID>",
"BLOODHOUND_TOKEN_KEY": "<YOUR_BLOODHOUND_TOKEN_KEY>"
}
}
}
}The API token ID and key are created in BloodHound under Administration → API Tokens. The server defaults to https on port 443 (BLOODHOUND_PORT and BLOODHOUND_SCHEME override that) and refuses to start if the credentials, connection or TLS check fail.
Claude Code
{
"mcpServers": {
"bloodhound_mcp": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"git+https://github.com/mwnickerson/bloodhound_mcp",
"bloodhound-mcp"
],
"env": {
"BLOODHOUND_DOMAIN": "<YOUR_BLOODHOUND_INSTANCE>.domain.com",
"BLOODHOUND_TOKEN_ID": "<YOUR_BLOODHOUND_TOKEN_ID>",
"BLOODHOUND_TOKEN_KEY": "<YOUR_BLOODHOUND_TOKEN_KEY>"
}
}
}
}The API token ID and key are created in BloodHound under Administration → API Tokens. The server defaults to https on port 443 (BLOODHOUND_PORT and BLOODHOUND_SCHEME override that) and refuses to start if the credentials, connection or TLS check fail.
Codex
[mcp_servers.bloodhound_mcp]
command = "uvx"
args = ["--from", "git+https://github.com/mwnickerson/bloodhound_mcp", "bloodhound-mcp"]
[mcp_servers.bloodhound_mcp.env]
BLOODHOUND_DOMAIN = "<YOUR_BLOODHOUND_INSTANCE>.domain.com"
BLOODHOUND_TOKEN_ID = "<YOUR_BLOODHOUND_TOKEN_ID>"
BLOODHOUND_TOKEN_KEY = "<YOUR_BLOODHOUND_TOKEN_KEY>"Add it to ~/.codex/config.toml (or .codex/config.toml for one project). The API token ID and key are created in BloodHound under Administration → API Tokens. The server defaults to https on port 443 (BLOODHOUND_PORT and BLOODHOUND_SCHEME override that) and refuses to start if the credentials, connection or TLS check fail.