MCP Discovery: Why Your MCP Server Needs Better Tool Discovery Than You Think (After 85 Production Outages) A developer who built 10+ MCP servers and experienced 85 production outages found that poor tool discovery causes more failures than bad code. The engineer built a fuzzy discovery layer in Java Spring Boot to handle LLM hallucinations of tool names, reducing errors from mismatched tool calls. Honestly, I didn't think tool discovery would be a problem. I've built 10+ MCP servers now, 1,800 hours into my knowledge base project, and after 85 production outages, I can tell you this: bad tool discovery will kill your MCP server before bad code ever does. Let me explain. MCP is pretty straightforward, right? You implement tools/list and tools/call , and you're done. The AI figures it out, the user is happy. Except that's not what actually happens. I've spent three days debugging this one issue: my AI client knew I had a "search knowledge base" tool, but it kept calling the wrong tool name. It kept calling search knowledgebase instead of search papers . I added aliases. I improved descriptions. Nothing worked. Then I realized the real problem: the LLM hallucinates tool names. It doesn't read your tool list—it guesses based on what it thinks the name should be. And when it guesses wrong, your server gets a tool not found error, the AI panics, and the entire conversation dies. I learned this the hard way. Three separate production outages, all because of bad discovery. Today I want to share what I fixed, the code I wrote, and how you can avoid the same pain. Let me count the ways I've messed this up: This is the big one. My tool is called search papers . The LLM thinks "search papers" → search paper singular . Or search knowledge → wrong again. Or find paper → nope. Every time it happens, you get: Error: Tool not found: search paper Available tools: search papers, get paper, ... Then the LLM tries again, gets it wrong again, and eventually gives up. User experience: zero stars. When I started, my tool descriptions were: "description": "Searches papers" That's useless. The LLM doesn't know when to use it. It doesn't know what kind of search it is. It doesn't know what returns. I've had my AI client use my "search" tool when it should have used "get paper by id" because the description was bad. It's not just tool names—it's parameter names too. My parameter is called query , but the LLM keeps passing question or search term . Same problem: error, retry, failure. When I first started, if the tool name was wrong, I just returned an error. That's the spec, right? Well, the spec doesn't say you can't help the LLM find the right tool. After three outages, I built a fuzzy discovery layer into my MCP server. Here's what it looks like in Java Spring Boot: @Component public class McpDiscoveryFilter implements OncePerRequestFilter { private final List