README.md
Enables dynamic tool discovery and loading for Claude using search algorithms.
MCP Tool Search Server
The Problem: When you give Claude 50+ tools, two things break:
- Context bloat - Tool definitions eat 10-20K tokens, leaving less room for actual work
- Selection accuracy - Claude gets confused and picks wrong tools when there are too many
The Solution: Instead of loading all tools upfront, Claude searches for tools and loads only what it needs.
Without Tool Search: With Tool Search:
┌─────────────────────┐ ┌─────────────────────┐
│ Load 100 tools │ │ Load 1 search tool │
│ (20K tokens) │ │ (200 tokens) │
│ │ │ │
│ Claude picks wrong │ │ Claude searches: │
│ tool 30% of time │ │ "weather" → 2 tools │
│ │ │ │
│ Context nearly full │ │ 95% context free │
└─────────────────────┘ └─────────────────────┘
How It Works
- You register your tools with this server (via REST API)
- Claude gets access to search tools (
tool_search_bm25,tool_search_semantic,tool_search_regex) - When Claude needs a tool, it searches → gets back tool names → uses them
Three search methods:
- BM25 - Keyword matching ("weather" finds
get_weather,get_forecast) - Semantic - Meaning-based ("send a message" finds
send_email) - Regex - Pattern matching (
get_.*finds all getter tools)
Deploy to Heroku
Or manually:
heroku create my-tool-search
heroku buildpacks:set heroku/python
git push heroku main
heroku ai:models:create claude-4-sonnet --as INFERENCE
Register Your Tools
curl -X POST https://your-app.herokuapp.com/tools \
-H "Content-Type: application/json" \
-d '{
"name": "get_weather",
"description": "Get current weather for a location",
"input_schema": {
"type": "object",
"properties": {"location": {"type": "string"}},
"required": ["location"]
}
}'
Test It
export INFERENCE_KEY=$(heroku config:get INFERENCE_KEY -a my-tool-search)
export INFERENCE_URL=$(heroku config:get INFERENCE_URL -a my-tool-search)
curl -s "$INFERENCE_URL/v1/agents/heroku" \
-H "Authorization: Bearer $INFERENCE_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-4-sonnet",
"messages": [{"role": "user", "content": "Find tools for checking weather"}],
"tools": [{"type": "mcp", "name": "mcp-tool-search/tool_search_semantic"}]
}'
API Reference
| Endpoint | Description |
|---|---|
POST /tools |
Register a tool |
GET /tools |
List all tools |
DELETE /tools/{name} |
Remove a tool |
GET /health |
Health check |
MCP Tools
| Tool | Use Case |
|---|---|
tool_search_bm25 |
Find tools by keywords |
tool_search_semantic |
Find tools by meaning |
tool_search_regex |
Find tools by pattern |
list_all_tools |
List all registered tools |
Tools (4)
tool_search_bm25Find tools by keywords using BM25 algorithm.tool_search_semanticFind tools by meaning using semantic search.tool_search_regexFind tools by pattern matching.list_all_toolsList all registered tools in the catalog.Environment Variables
INFERENCE_KEYrequiredAPI key for the inference serviceINFERENCE_URLrequiredURL for the inference serviceConfiguration
claude_desktop_config.json
{"mcpServers":{"mcp-tool-search":{"command":"uv","args":["--directory","/path/to/mcp-tool-search","run","mcp-tool-search"],"env":{"INFERENCE_KEY":"your-key","INFERENCE_URL":"your-url"}}}}Try it
→Find tools for checking weather using semantic search.
→Search for all tools that match the pattern 'get_.*' using regex.
→Use BM25 search to find a tool for sending emails.
→List all registered tools currently available in the catalog.