作者用约230行 Python 写了一个 Actian VectorAI 的 MCP Server,验证了「一次编写、各 AI 客户端通用」协议承诺。工具函数含创建集合、导入文档、向量搜索等6个操作。
MCP 承诺一个服务器、任意 AI 客户端。我通过将 Actian VectorAI DB 接入 Claude 和 Cursor 来验证这一承诺,核心代码只有一个约 230 行的 Python 文件,且在协议层验证了每一项声明,而非凭直觉接受任何结论。构建成果已在 GitHub 公开。
每个向量数据库都有自己的 SDK,每个 AI 助手都有自己的插件格式。想让 Claude 和 Cursor 搜索你的向量数据库?那通常是两个独立的集成方案,而下个月再来一个工具就变成三个了。
MCP 消除了最后这个问题。这是一个开放协议(最初由 Anthropic 提出),让任何支持 MCP 的客户端(Claude Desktop、Claude Code、Cursor,以及未来出现的任何工具)通过标准接口与同一个服务器通信。服务器写一次,每个客户端都能免费使用。
我为 Actian VectorAI DB(一个便携、本地优先的向量数据库)构建了一个小型 MCP 服务器,来验证这个承诺是否真的成立。
六个工具,约 230 行 Python 代码,一个文件:
我最坚持的设计原则:LLM 永远不会看到向量。每个工具的输入输出都是纯字符串、列表和 JSON 字典。嵌入过程在服务器进程内部完成(sentence-transformers 在本地 CPU 上运行 all-MiniLM-L6-v2 模型),所以 Claude 或 Cursor 只需要处理文本、决定何时调用搜索。LLM 不擅长生成 384 个有意义的浮点数,但擅长调用带有 query: str 参数的函数。
Claude / Cursor <--stdio JSON-RPC--> server.py (FastMCP) <--gRPC--> Actian VectorAI DB
│
sentence-transformers
(local, 384-dim embeddings)
这是一个参考实现,规模适合演示场景:单一全局数据库,本地运行,基于演示级数据集(六个句子)构建。
在锁定 get_collection_info 之前,我对照已安装的 actian-vectorai-client==1.0.2 检查了响应内容,而不是纯凭记忆编写代码。点数和状态直接从该调用返回,但向量配置(维度/距离)不在其中,所以 get_collection_info 从两个地方获取数据:gRPC 获取点数和状态,REST API(端口 6573)获取向量配置。
首先,直接针对实时数据库运行 examples/demo.py,纯 Python 调用 SDK:创建集合、摄入六条 FAQ 句子、搜索,然后正确返回结果。
然后使用 fastmcp.Client 通过 stdio JSON-RPC 驱动 server.py,这与 Claude 和 Cursor 使用的路径相同。这验证了 get_collection_info 从 gRPC 和 REST 调用中获取了正确的数据——这些只有在数据流经完整协议路径后才能观察到。
我还故意将服务器指向一个死端口,以确认每个工具都以通俗易懂的英文报错,而不是抛出堆栈跟踪。
在操作系统进程层面,我确认 Cursor 在重新加载后已经生成了 MCP 服务器子进程,证明配置已被识别并正常工作。
最终,通过 MCP 连接调用搜索,对"hackathon 提交截止时间"返回了 {"text": "Submissions close Sunday at 9am."},得分 0.4227。
创建一个名为 notes 的集合。
Collection 'notes' is ready (distance=cosine, dim=384).
向 notes 添加这三个事实:提交截止时间是周日上午 9 点,一等奖是 2000 美元,团队可以有 2-5 名成员。
Inserted 3 document(s) into collection 'notes'.
提交截止时间是什么时候?
[{"score": 0.4777, "payload": {"text": "Submissions close Sunday at 9am."}}],助手将其转化为"截止时间是周日上午 9 点"。
然后是整个练习的核心:在 Cursor 中问同一个问题,切换窗口,再在 Claude Desktop 中问一次。两个客户端之间只有客户端特定的配置块不同。
我选择 Actian VectorAI DB 是因为它本地优先、不依赖云,这在会议 Wi-Fi 上做现场演示时很重要。社区版免费且足以完成整个构建。如果你想自己搭建,Docker 设置说明涵盖了 plain docker run 和 docker-compose.yml 两种方式。
更重要的意义是:一个小型 MCP 服务器、任意 MCP 客户端、自然语言输入、语义搜索输出、模型永远接触不到向量。如果你有 SDK 和值得从 LLM 调用的东西,这就是完整的配方。你可以在这里找到仓库。