MCP Finder:我的个人工具路由器
我创建这个项目是为了解决一个简单的问题: 我有太多的MCP工具,我不知道该用哪一个。
我创建了这个“路由器”,而不是手动搜索文档或猜测哪个服务器有合适的工具。我只是简单地问了它一个问题,它告诉我该使用哪种工具。
运作原理
当我问这样的问题时 *“扫描我的docker镜像以查找安全问题”*,以下是幕后发生的事情:
- 意向分析:首先,系统会查看我的查询以了解我想要什么。它检查我是否要求“本地”、“免费”的东西,或者我是否需要特定类型的工具(如“安全”或“数据库”)。
- 搜索:它搜索我的目录(
mcpfinder.sqlite)使用两种方法:
- 关键词:将查询中的单词与工具描述相匹配。 - 含义(嵌入):匹配 *概念* 将我的查询添加到工具中(因此“图片”与“图像”匹配)。
- 评分:它根据每个工具的匹配程度为其打分。它甚至为最适合我当前编辑器的工具(如Cursor)提供了额外的好处。
- AI重新排名:最后,它将最优秀的候选人发送到一个小型AI模型(GPT-4o-mini)。人工智能像人类一样观察它们,选择最好的一个,并解释 *为什么*.
数据流
我保持简单。我的数据保存在CSV文件中,应用程序从快速的SQLite数据库中读取。
- 真相的来源:
db.csv
- 这是我手动添加或编辑工具的地方。这只是一个电子表格。
- 数据库:
mcpfinder.sqlite
- 该应用程序不会直接读取CSV(速度太慢)。相反,我将数据加载到这个SQLite数据库中。 - 文件 mcp_suggester/load_mcp_csv_to_sqlite.py 处理此转换。
我如何设置它
1.先决条件
我需要安装Python。然后我安装依赖项:
pip install -r requirements.txt2.环境变量
我需要告诉应用程序我的数据库在哪里,并给它一个OpenAI密钥(用于理解含义和重新排序等“智能”部分)。
$env:MCP_CATALOG_DB = ""
$env:OPENAI_API_KEY = "sk-..."3.运行它
我可以直接运行服务器进行测试:
python -m mcp_suggester.server4.使用Web UI(可选)
如果你想要一个可视化界面来测试查询,你可以使用Streamlit应用程序:
streamlit run ui_app.py这将打开一个浏览器窗口,您可以在其中:
- 在文本框中键入您的查询
- 使用滑块调整设置(结果数量、候选池大小)
- 通过良好的格式、推理和可粘贴的复制示例查看结果
无需单独运行服务器——UI应用程序直接调用逻辑。
在游标中使用它
这是最好的部分。我将这个“路由器”连接到Cursor,这样我就可以在编码时使用它。
- 打开 光标设置 > 主控程序.
- 添加新的MCP服务器:
- 类型: command - 命令: python - 参数: -m mcp_suggester.server - 环境:添加我的 PYTHONPATH, MCP_CATALOG_DB,以及 OPENAI_API_KEY.
现在,在Cursor Chat中,我只需键入:
“找到一个工具将此应用程序部署到Kubernetes”
它用我需要的确切工具进行响应(例如。, Helm -> deploy_application).
项目结构
mcp_suggester/:核心逻辑。
- server.py:Cursor对话的入口点。 - scoring.py:对工具进行排名的数学。 - intent.py:找出我想要什么的逻辑。
db.csv:我的工具清单。mcpfinder.sqlite:应用程序实际读取的数据库。
我如何衡量质量
我不只是猜测搜索是否有效。我有一个测试套件 evaluation/ 文件夹来证明这一点。
eval_dataset.csv:这是我对系统的“考试”。它包含27个真实世界的问题(如 *“找到一个部署到Kubernetes的工具”*)以及确切的工具 *应该* 成为最佳答案。evaluate.py:这个脚本通过三种不同的策略来回答这些问题,看看哪一个会赢。
结果
当我运行基准测试时(python evaluation/evaluate.py),以下是我通常看到的:
- 仅关键字搜索:约60%的准确率。
- 当我使用与工具描述不同的单词时(例如,当工具说“图像”时,要求提供“图片”),它就会失败。
- 混合搜索(关键字+含义):~55%至60%的准确率。
- 更好地理解概念,但有时会被类似的工具混淆。
- 混合+人工智能重新排名: ~70%+精度.
- 这就是为什么LLM是必不可少的。它通过“思考”结果来缩小差距。
AI到底在做什么
你可能会想, *“为什么我需要法学硕士学位?我不能搜索吗?”*
当系统找到20个可能的工具时,它会将前3-5个发送给LLM(GPT-4o-mini),并给出非常具体的提示。LLM是 不 只是总结。它扮演着法官的角色。
以下是它对每个查询所做的操作:
- 它读取文档:它查看工具的描述、参数和功能。
- 它检查约束:如果我要求一个“本地”工具,它会检查该工具是否实际在本地运行。
- 它解释了“为什么”:它为自己的选择写了一个人类可读的理由。
- *坏*:“得分:0.9” - *良好(法学硕士)*:“这个工具是最合适的,因为它专门处理Kubernetes部署,而你要求部署工具。”
最后一步至关重要。它将原始数据库搜索变成了一个有用的助手,可以解释它的想法。
证据
这是评估脚本输出的快照。您可以看到“混合+LLM”策略是如何击败其他策略的:
Lexical-only (TF-IDF)
---------------------
Precision@1: 0.593
Precision@3: 0.667
Recall@3: 0.611
MRR: 0.668
Hybrid (Lexical + Embedding + Intent)
-------------------------------------
Precision@1: 0.519
Precision@3: 0.667
Recall@3: 0.648
MRR: 0.599
Hybrid + LLM Rerank
-------------------
Precision@1: 0.700
Precision@3: 0.741
Recall@3: 0.725
MRR: 0.704- Precision@11号答案正确的频率。
- Recall@3:我在前3个结果中找到了多少个正确答案。
- 平均倒数排名:正确答案为“有多高”的分数。越高越好。
______________________________________________________________________
演示
观看演示视频,了解MCP Finder的实际操作:
观看演示视频 (点击下载/查看)
注: GitHub markdown不支持内联视频播放。上面的链接将允许您下载和观看视频。
______________________________________________________________________
我接下来要带这个去哪里
现在,这是一个坚实的原型。但要做到这一点 “企业就绪” 适合工业生产,以下是我的计划:
1.抛弃CSV,转而使用真实数据库
目前,我手动编辑CSV文件。在真实的生产环境中,我会将其移动到 PostgreSQL 随着 pgvector.
- 为什么?:它处理数百万个工具,支持并发用户,并原生进行矢量搜索。不再同步脚本!
2.自动摄入
我不应该手动添加工具。我想建立一个 爬虫 它监视GitHub存储库或MCP注册表。
- 流量:
1. 爬网程序检测到新的MCP服务器版本。 1. 它刮 README.md 和 tool 定义。 1. LLM会自动生成描述、标签和示例查询。 1. 它会自动将新工具推送到数据库。
3.管理仪表板和分析
我需要一个用户界面来查看发生了什么。
- 策展人模式:批准/拒绝爬虫发现的新工具。
- 分析:查看用户正在搜索什么。如果每个人都搜索“Kubernetes”但没有结果,我知道我需要添加更多的Kubernetes工具。
4.反馈回路
系统应该从使用中学习。
- 如果我搜索“deploy”并始终选择“Helm”而不是“Kubernetes CLI”,系统应该会学习该偏好,并在下次自动将Helm排名更高。
______________________________________________________________________
