使用说明
SQLite MCP Go 实现计划
全程由 CodeX 实现
项目概述
使用 Go 语言开发符合 MCP (Model Context Protocol) 规范的 SQLite 服务器,通过 stdio 传输层与客户端通信。
技术栈
- 语言: Go 1.24
- 数据库驱动:
modernc.org/sqlite@v1.39.1 - 传输层: stdio (标准输入/输出)
- MCP SDK:
github.com/mark3labs/mcp-go@v0.41.1
核心架构
1. 模块划分
├── main.go # 入口,初始化 stdio 传输
├── server/
│ ├── mcp_server.go # MCP 服务器实现
│ ├── transport.go # stdio 传输层封装
│ └── handler.go # 请求路由和处理
├── database/
│ ├── connection.go # 数据库连接管理
│ └── operations.go # 数据库操作封装
└── tools/
└── sqlite_tools.go # 8个工具函数实现
2. MCP 协议实现
- 初始化: 实现
initialize方法,声明服务器能力 - 工具注册: 将 8 个数据库操作注册为 MCP tools
- 请求处理: JSON-RPC 2.0 格式的请求解析和响应
3. stdio 传输层
- 监听
stdin读取 JSON-RPC 请求 - 通过
stdout输出 JSON-RPC 响应 - 使用
stderr输出日志和错误信息 - 实现消息分帧(换行符分隔或长度前缀)
工具实现要点
1. db_info
- 查询
sqlite_master获取元数据 - 返回:数据库路径、表数量、总记录数、数据库大小
2. list_tables
- 查询
SELECT name FROM sqlite_master WHERE type='table' - 过滤系统表,返回用户表列表
3. get_table_schema
- 使用
PRAGMA table_info(tableName)获取列信息 - 返回:列名、类型、是否可空、默认值、主键信息
4. create_record
- 动态构建
INSERT INTO语句 - 使用参数化查询防止 SQL 注入
- 返回插入的
last_insert_rowid
5. read_records
- 根据 conditions 动态构建
WHERE子句 - 支持
LIMIT和OFFSET分页 - 返回 JSON 格式的记录数组
6. update_records
- 动态构建
UPDATE ... SET ... WHERE语句 - 必须提供 conditions 防止误操作
- 返回受影响的行数
7. delete_records
- 构建
DELETE FROM ... WHERE语句 - 强制要求 conditions 参数
- 返回删除的行数
8. query
- 执行任意 SQL(SELECT/INSERT/UPDATE/DELETE)
- 支持参数绑定(values 数组)
- 根据 SQL 类型返回结果集或影响行数
安全考虑
- SQL 注入防护: 全部使用参数化查询
- 权限限制: 可选择性禁用
query工具 - 连接隔离: 每个实例独立数据库连接
- 错误处理: 统一错误格式,不泄露敏感信息
运行流程
- 启动程序,初始化 SQLite 连接
- 监听 stdin,等待 MCP 初始化握手
- 注册 8 个工具及其 schema
- 循环处理
tools/call请求 - 执行对应数据库操作,返回结果
- 优雅关闭数据库连接
配置参数
--db-path: SQLite 数据库文件路径--readonly: 只读模式(可选)--log-level: 日志级别(stderr 输出)
测试策略
- 单元测试:每个工具函数独立测试
- 集成测试:完整 MCP 协议交互测试
- 边界测试:空表、大数据量、特殊字符处理
