<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/bloodhound-mcp-one-year-later-what-i-learned-about-mcps-models-and-context-gcdol73vf" -->

---
title: BloodHound MCP, One Year Later: What I Learned About...
description: A year after releasing the first BloodHound MCP server, the author rebuilt it after learning that exposing every API endpoint as a separate tool bloated model...
canonical: https://daily.dev/posts/bloodhound-mcp-one-year-later-what-i-learned-about-mcps-models-and-context-gcdol73vf
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: BloodHound MCP, One Year Later: What I Learned About MCPs, Models, and Context | daily.dev
og:description: A year after releasing the first BloodHound MCP server, the author rebuilt it after learning that exposing every API endpoint as a separate tool bloated model...
og:url: https://daily.dev/posts/bloodhound-mcp-one-year-later-what-i-learned-about-mcps-models-and-context-gcdol73vf
og:image: https://api.daily.dev/og/posts/GCDOL73vf.png
og:image:alt: BloodHound MCP, One Year Later: What I Learned About MCPs, Models, and Context
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# BloodHound MCP, One Year Later: What I Learned About MCPs, Models, and Context

**[SpecterOps](https://daily.dev/sources/specterops)** · 15 min read · 0 upvotes · 0 comments

## Summary

A year after releasing the first BloodHound MCP server, the author rebuilt it after learning that exposing every API endpoint as a separate tool bloated model context and hurt tool-selection quality. Measurements showed the original 100-tool design consumed roughly 19,000 fixed tokens per turn; consolidating into 13 composite tools with an info_type parameter cut that to about 5,700 tokens, a roughly 70% reduction. Other changes include shared error-handling dispatchers that return recoverable error messages listing valid options, moving Cypher and domain knowledge out of the system prompt into on-demand MCP resources, and adding a controlled file_upload tool to support agentic ingestion workflows (including a test where Codex ran a BloodHound collection end to end). The core lesson: MCP design is fundamentally context design, and giving models fewer, better-described tools with clean error recovery beats maximal API coverage.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://specterops.io/blog/2026/06/18/bloodhound-mcp-one-year-later-what-i-learned-about-mcps-models-and-context>

## Questions this post answers

### How much can consolidating MCP tools into composite tools reduce token overhead per turn?

Consolidating from 100 individual tools down to 12-13 composite tools cut fixed per-turn token overhead from about 19,016 tokens to roughly 4,810-5,721 tokens, a reduction of about 70-75%. This overhead includes the tool schema definitions and system prompt that get sent to the model with every request, regardless of which tools are actually called.

_Developers optimizing AI agent context budgets can track MCP design patterns like this on daily.dev._

### Why does exposing one MCP tool per API endpoint hurt LLM performance?

A large tool catalog with many similar entries loads a small API reference manual into the model's context on every request, since every tool definition (name, description, parameter schema) is sent regardless of whether it's used. This wastes tokens that could go toward reasoning and increases the odds of the model over-calling, hedging, or picking an adjacent but wrong tool.

_Anyone building MCP servers can follow evolving tool-design patterns like this on daily.dev._

### Why do LLMs write Cypher queries that fail against BloodHound even when the syntax looks correct?

Models are trained on generic Cypher from across the internet, but BloodHound has its own strict requirements: property names are lowercase (like hasspn, enabled, admincount), object names are often stored uppercase with a domain suffix, DCSync rights target Domain nodes rather than Group nodes, and list properties need COALESCE patterns to avoid null errors. A syntactically valid query can still return wrong or failed results.

_Security engineers pairing LLMs with graph tools like BloodHound can find domain-specific gotchas like this on daily.dev._

## Similar posts on daily.dev

- [Context Engineering for MCP Servers](https://daily.dev/posts/context-engineering-for-mcp-servers-4wx9ee6ee) · Daily Dose of Data Science \| Avi Chawla \| Substack · 2 upvotes · 0 comments
- [Why Do Models Love MCP So Much?](https://daily.dev/posts/why-do-models-love-mcp-so-much--zhmv4gtjt) · Medium · 0 upvotes · 0 comments
- [10 strategies to reduce MCP token bloat](https://daily.dev/posts/10-strategies-to-reduce-mcp-token-bloat-nzmx3qvsg) · The New Stack · 2 upvotes · 0 comments

---

Tags: [#security](https://daily.dev/tags/security), [#ai-agents](https://daily.dev/tags/ai-agents), [#mcp](https://daily.dev/tags/mcp), [#context-engineering](https://daily.dev/tags/context-engineering)

[View this post on daily.dev](https://daily.dev/posts/bloodhound-mcp-one-year-later-what-i-learned-about-mcps-models-and-context-gcdol73vf)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"BloodHound MCP, One Year Later: What I Learned About MCPs, Models, and Context","url":"https://daily.dev/posts/bloodhound-mcp-one-year-later-what-i-learned-about-mcps-models-and-context-gcdol73vf","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/bloodhound-mcp-one-year-later-what-i-learned-about-mcps-models-and-context-gcdol73vf"},"datePublished":"2026-08-23T12:16:31.809Z","dateModified":"2026-08-23T12:18:57.182Z","description":"A year after releasing the first BloodHound MCP server, the author rebuilt it after learning that exposing every API endpoint as a separate tool bloated model...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/103aba083e4634e33b398a6667b1c6fa?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/103aba083e4634e33b398a6667b1c6fa?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"SpecterOps","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"SpecterOps","logo":"https://media.daily.dev/image/upload/s--lR36Z4gn--/f_auto,q_auto/v1787487384/logos/specterops?_a=BAMAMicg0","url":"https://daily.dev/sources/specterops"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/bloodhound-mcp-one-year-later-what-i-learned-about-mcps-models-and-context-gcdol73vf","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"security,ai-agents,mcp,context-engineering","timeRequired":"PT15M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"SpecterOps","item":"https://daily.dev/sources/specterops"},{"@type":"ListItem","position":3,"name":"BloodHound MCP, One Year Later: What I Learned About MCPs, Models, and Context"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/bloodhound-mcp-one-year-later-what-i-learned-about-mcps-models-and-context-gcdol73vf#faq","mainEntity":[{"@type":"Question","name":"How much can consolidating MCP tools into composite tools reduce token overhead per turn?","acceptedAnswer":{"@type":"Answer","text":"Consolidating from 100 individual tools down to 12-13 composite tools cut fixed per-turn token overhead from about 19,016 tokens to roughly 4,810-5,721 tokens, a reduction of about 70-75%. This overhead includes the tool schema definitions and system prompt that get sent to the model with every request, regardless of which tools are actually called. Developers optimizing AI agent context budgets can track MCP design patterns like this on daily.dev."}},{"@type":"Question","name":"Why does exposing one MCP tool per API endpoint hurt LLM performance?","acceptedAnswer":{"@type":"Answer","text":"A large tool catalog with many similar entries loads a small API reference manual into the model's context on every request, since every tool definition (name, description, parameter schema) is sent regardless of whether it's used. This wastes tokens that could go toward reasoning and increases the odds of the model over-calling, hedging, or picking an adjacent but wrong tool. Anyone building MCP servers can follow evolving tool-design patterns like this on daily.dev."}},{"@type":"Question","name":"Why do LLMs write Cypher queries that fail against BloodHound even when the syntax looks correct?","acceptedAnswer":{"@type":"Answer","text":"Models are trained on generic Cypher from across the internet, but BloodHound has its own strict requirements: property names are lowercase (like hasspn, enabled, admincount), object names are often stored uppercase with a domain suffix, DCSync rights target Domain nodes rather than Group nodes, and list properties need COALESCE patterns to avoid null errors. A syntactically valid query can still return wrong or failed results. Security engineers pairing LLMs with graph tools like BloodHound can find domain-specific gotchas like this on daily.dev."}}]}
```

