最近大家都在折腾 AI 应用,以前想给大模型接点外部数据(比如读个本地数据库、查个文件),得在各种框架里自己写一堆胶水代码。直到后来 MCP(Model Context Protocol)慢慢成了标准,感觉这套东西有点像给 AI 装了个“USB 接口”。
这周末抽空研究了一下,顺手用 TypeScript 写了个简单的 MCP Server,能让大模型直接去查本地的 SQLite 数据库。这里简单记录一下整个过程。
MCP 大概是个啥
Model Context Protocol 是 Anthropic 搞出来的一套开源标准,现在像 Cursor、Claude Desktop 这些工具基本都支持了。
以前的痛点是,你在 Cursor 里写了个查数据库的插件,换到 Claude 桌面版里就没法用了,得重新搞一套。有了 MCP,你只要按标准写个 Server,这些客户端就能即插即用。
1 | ┌────────────────────────────────────────┐ |
MCP 的三个核心部分
按协议规范,服务端提供的能力大概分成三块:
| 模块 | 是干嘛的 | 一般用来做啥 |
|---|---|---|
| Resources | 给数据提供只读访问 | 让 AI 直接把本地文件、表结构当成上下文阅读 |
| Tools | 定义一些可以执行的函数 | 允许 AI 执行外部动作,比如跑 SQL、调 API |
| Prompts | 预设一些交互模板 | 存一些常用的提示词(比如 Code Review 模版) |
通信方式目前比较常见的是通过 STDIO(标准输入输出)直接调起子进程,这种在本地跑非常快,也省去了鉴权的麻烦。
动手写个 SQLite 的 MCP Server
下面是我用官方的 @modelcontextprotocol/sdk 和 zod 撸的一个简单 Server,目的是让 AI 能够安全地查询本地 SQLite 数据库。
1. 搞定依赖
1 | mkdir mcp-sqlite-server |
tsconfig.json 里记得配好模块解析:
1 | { |
2. 核心代码
建一个 src/index.ts,主要是把 Resources 和 Tools 注册进去:
1 | import { Server } from "@modelcontextprotocol/sdk/server/index.js"; |
有个坑需要注意:用 STDIO 通信的时候,日志必须用 console.error 打到标准错误流。如果用 console.log,会干扰正常的 JSON-RPC 通信,直接报错崩溃。
连上客户端试一试
写完之后,我在 Claude Desktop 的配置文件 claude_desktop_config.json 里加了这段:
1 | { |
重启客户端,直接在输入框里提问:
“请先读取 sqlite://schema 了解有哪些表,然后告诉我系统里有哪些角色的用户?”
它真的顺着去读了结构,自己组装了 SELECT role, count(*) FROM users GROUP BY role 去跑工具,感觉还挺顺的。
一点体会
写完这个 Demo,最大的感触是安全问题。把工具开放给 AI 的时候,权限控制一定要做得死死的。如果是线上的敏感数据,最好能在调用前加个二次确认。
总体来说 MCP 降低了接外部工具的门槛,感兴趣的朋友可以抽空写个小工具接进去玩玩。
评论加载中…