<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Halemo GPA</title>
    <description>The latest articles on DEV Community by Halemo GPA (@halemogpa).</description>
    <link>https://dev.to/halemogpa</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F858792%2Fa3df56f8-6bac-4353-a3fb-932d15a744d8.png</url>
      <title>DEV Community: Halemo GPA</title>
      <link>https://dev.to/halemogpa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/halemogpa"/>
    <language>en</language>
    <item>
      <title>Your MCP server doesn't need to put all its tools in the model's context</title>
      <dc:creator>Halemo GPA</dc:creator>
      <pubDate>Mon, 03 Aug 2026 21:04:49 +0000</pubDate>
      <link>https://dev.to/halemogpa/your-mcp-server-doesnt-need-to-put-all-its-tools-in-the-models-context-3g</link>
      <guid>https://dev.to/halemogpa/your-mcp-server-doesnt-need-to-put-all-its-tools-in-the-models-context-3g</guid>
      <description>&lt;p&gt;I built an MCP server that lets an AI agent use my own WhatsApp: search chats, send messages, transcribe voice notes, all self-hosted so my message history never leaves my box. But the most interesting problem turned out to have nothing to do with WhatsApp. It was the number of tools.&lt;/p&gt;

&lt;p&gt;The tax nobody mentions&lt;/p&gt;

&lt;p&gt;MCP injects every tool definition into the model's context on every request, whether or not the request uses them. My server grew to 96 tools. That's roughly 20k tokens sitting in context before the model has done anything.&lt;/p&gt;

&lt;p&gt;The token cost was the annoying part, but not the real one. When I handed the model all 96 tools at once, it got worse at picking the right one, not better. More options, more room to be wrong.&lt;/p&gt;

&lt;p&gt;Progressive disclosure&lt;/p&gt;

&lt;p&gt;The obvious move, dropping tools, loses capability. So instead: serve a small hot core directly, and keep the long tail reachable through search.&lt;/p&gt;

&lt;p&gt;The model now sees 29 core tools plus two meta-tools:&lt;/p&gt;

&lt;p&gt;find_tool(query) ranks the full 96-tool library and returns names, descriptions, and parameter signatures.&lt;br&gt;
call_tool(name, arguments) dispatches into any of them.&lt;br&gt;
Always-on cost drops from ~20k to ~8k tokens, and nothing is removed, everything is one search away. Retrieval is lexical by default (IDF + stemming + a synonym map) and blends in embeddings if a provider key is present.&lt;/p&gt;

&lt;p&gt;The part that will bite you&lt;/p&gt;

&lt;p&gt;call_tool dispatches inside the process, past the middleware chain that normally runs on a tool call. So it has to re-apply what that chain would have done: per-tool scope enforcement and audit logging. Skip that and your retrieval layer quietly becomes a scope-bypass and an audit hole. A tool router that skips your authorization is worse than no router.&lt;/p&gt;

&lt;p&gt;Measure it, don't vibe it&lt;/p&gt;

&lt;p&gt;"It feels better" isn't a number. There's a small labeled eval (natural-language task to gold tool, deterministic labels) that scores whether retrieval lands on the right tool. Lexical caps around 75% recall@8 on adversarial phrasing; hybrid pushes it higher. The eval is small and mine, so treat it as a direction, not a proof.&lt;/p&gt;

&lt;p&gt;Takeaway&lt;/p&gt;

&lt;p&gt;If you're wiring an LLM into a big API, the tool list is a first-class design problem, not an afterthought. Serve a core, make the rest searchable, mirror your auth into the dispatch path, and put a number on the retrieval.&lt;/p&gt;

&lt;p&gt;Code, the eval harness, and the design notes: &lt;a href="https://github.com/HalemoGPA/whatsapp-mcp-server" rel="noopener noreferrer"&gt;https://github.com/HalemoGPA/whatsapp-mcp-server&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>python</category>
      <category>llm</category>
    </item>
    <item>
      <title>Smart Home Project</title>
      <dc:creator>Halemo GPA</dc:creator>
      <pubDate>Sun, 22 May 2022 01:23:26 +0000</pubDate>
      <link>https://dev.to/halemogpa/my-first-project-2edm</link>
      <guid>https://dev.to/halemogpa/my-first-project-2edm</guid>
      <description>&lt;p&gt;I am going to share the full details of  structured, designed and  documented 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  Smart Home project
&lt;/h2&gt;

&lt;p&gt;It took much effort to do all the stuff required to document everything in the project. It would be pleasure if it helped anyone.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Anyone is free to use this as reference.&lt;/p&gt;

&lt;p&gt;If you know anyone who has a project similar to this, Be initiative and send it to him.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Check the repo &lt;a href="https://github.com/HalemoGPA/SmartHome"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DwbWR6CQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eab97lm83xlrg3oht3ki.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DwbWR6CQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eab97lm83xlrg3oht3ki.jpg" alt="Smart Home Project Banner" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>arduino</category>
      <category>webdev</category>
      <category>discuss</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
