一个模型上下文协议(MCP)服务器,封装了多个Craft文档API,并使其能够被像Perplexity AI、Claude Desktop、VS Code和Cursor这样的AI助手访问。
注意: 这是一个开源项目。欢迎贡献!
📚 快速链接: 快速开始 | 贡献指南 | AWS部署 | 状态
此MCP服务器提供了一个统一接口,用于同时搜索和读取多个Craft文档的内容。它在配置的文档之间聚合结果,优雅地处理失败情况,使其非常适合查询分布式知识库。
5个MCP工具:
list_documents - 列出所有配置的Craft文档search_all_notes - 跨所有文档进行聚合搜索search_document - 在特定文档中搜索read_document - 读取整个文档结构read_block - 根据ID读取特定区块双传输模式:
强大的错误处理:
简易配置:
克隆仓库:
git clone https://github.com/mattymil/craft-mcp-wrapper.git
cd craft-mcp-wrapper
安装依赖:
npm install
配置你的Craft文档(参见下面的配置部分)
构建项目:
npm run build
为了与MCP客户端稳定生产使用,部署到系统全局位置:
# 构建项目
npm run build
# 部署到生产位置
sudo mkdir -p /usr/local/lib/craft-wrapper
sudo cp -r build config.json package.json node_modules /usr/local/lib/craft-wrapper/
然后配置你的MCP客户端以使用/usr/local/lib/craft-wrapper/build/index.js作为入口点。
优点:
config.json)编辑config.json以添加你的Craft文档分享链接:
{
"documents": [
{
"name": "我的笔记",
"apiEndpoint": "https://connect.craft.do/links/YOUR_SHARE_LINK_1/api/v1"
},
{
"name": "项目文档",
"apiEndpoint": "https://connect.craft.do/links/YOUR_SHARE_LINK_2/api/v1"
}
]
}
要添加更多文档:
/api/v1.env)复制.env.example到.env并根据需要进行配置:
# 传输模式:"stdio"或"sse"
MCP_TRANSPORT=stdio
# SSE模式配置(仅当MCP_TRANSPORT=sse时使用)
PORT=3000
SSE_ENDPOINT=/sse
# 可选:SSE身份验证的API密钥
# MCP_API_KEY=your-secret-key-here
# 性能调整
# 最大响应大小(默认:1048576 = 1MB)
# 较大的值可能会导致慢速连接下的stdio阻塞
MAX_RESPONSE_SIZE=1048576
性能配置:
MAX_RESPONSE_SIZE - JSON响应的最大字节数(默认:1MB)
对于本地AI助手如Claude Desktop或Perplexity(本地版):
npm start
这将以stdio模式启动服务器,通过标准输入/输出通信。
对于远程连接或测试:
npm run start:sse
或者明确指定:
node build/index.js --sse
服务器将在端口3000上启动(可通过PORT环境变量配置),具有以下端点:
http://localhost:3000/ssehttp://localhost:3000/messageshttp://localhost:3000/health使用serverless-offline测试Lambda函数:
npm run offline
这将在http://localhost:3000启动一个本地API网关模拟器
文件更改时自动重新加载:
# Stdio模式
npm run dev
# SSE模式
npm run dev:sse
作为AWS Lambda函数部署服务器,使用API Gateway。
配置AWS CLI:
aws configure
提供您的AWS访问密钥ID、秘密访问密钥和默认区域。
AWS凭证: 确保您有权创建:
部署到默认阶段(dev):
npm run deploy
部署到特定阶段:
# 开发
npm run deploy:dev
# 生产
npm run deploy:prod
部署后,Serverless框架将输出:
npm run info
# 实时跟踪日志
npm run logs
# 阶段特定日志
npm run logs:dev
npm run logs:prod
# 移除默认阶段
npm run remove
# 移除特定阶段
npm run remove:dev
npm run remove:prod
在serverless.yml中设置环境变量或通过命令行设置:
# 设置API密钥用于认证
export MCP_API_KEY="your-secret-key"
npm run deploy
或编辑serverless.yml:
provider:
environment:
MCP_API_KEY: ${env:MCP_API_KEY, 'default-key'}
serverless.yml中的默认设置:
根据需要修改这些设置。
部署后,您的Lambda提供了REST API:
https://{api-id}.execute-api.{region}.amazonaws.com/
端点:
GET /health - 健康检查
curl https://{api-id}.execute-api.{region}.amazonaws.com/health
GET /tools - 列出可用工具
curl https://{api-id}.execute-api.{region}.amazonaws.com/tools
POST /tools/call - 执行工具
curl -X POST https://{api-id}.execute-api.{region}.amazonaws.com/tools/call \
-H "Content-Type: application/json" \
-d '{"name": "list_documents", "arguments": {}}'
注意: Lambda部署使用简单的REST API而不是完整的MCP协议。对于MCP协议支持(Perplexity所需),请使用本地stdio或SSE服务器。
AWS Lambda:
API Gateway:
示例: 每月10,000次请求,512MB,平均执行时间为3秒:
⚠️ 重要: Perplexity需要通过stdio模式的完整MCP协议。使用本地服务器,而非Lambda。
stdio配置: 添加到Perplexity的MCP设置:
{
"mcpServers": {
"craft-wrapper": {
"command": "node",
"args": ["/usr/local/lib/craft-wrapper/build/index.js"]
}
}
}
对于开发/自定义安装,替换为您的项目路径:
{
"mcpServers": {
"craft-wrapper": {
"command": "node",
"args": ["/path/to/your/craft-mcp-wrapper/build/index.js"]
}
}
}
注意: MCP_TRANSPORT环境变量默认为stdio,除非您在.env文件中更改了默认设置,否则不需要指定。
添加到~/Library/Application Support/Claude/claude_desktop_config.json(macOS):
{
"mcpServers": {
"craft-wrapper": {
"command": "node",
"args": ["/usr/local/lib/craft-wrapper/build/index.js"]
}
}
}
对于开发/自定义安装,替换为您的项目路径。
对于兼容MCP的扩展,配置服务器路径在您的工作区设置中:
{
"mcp.servers": {
"craft-wrapper": {
"command": "node",
"args": ["/usr/local/lib/craft-wrapper/build/index.js"]
}
}
}
对于开发/自定义安装,替换为您的项目路径。
如果使用远程SSE模式(仅限本地服务器):
服务器URL:http://your-server:3000/sse
带有认证(如果设置了MCP_API_KEY):
http://your-server:3000/sse?api_key=your-secret-key-here
Lambda部署提供了一个REST API,用于不需要MCP协议的自定义集成:
基础URL: https://{api-id}.execute-api.{region}.amazonaws.com
示例 - 列出文档:
curl -X POST https://YOUR-API-ID.execute-api.us-east-1.amazonaws.com/tools/call \
-H "Content-Type: application/json" \
-d '{"name": "list_documents", "arguments": {}}'
示例 - 搜索所有笔记:
curl -X POST https://YOUR-API-ID.execute-api.us-east-1.amazonaws.com/tools/call \
-H "Content-Type: application/json" \
-d '{
"name": "search_all_notes",
"arguments": {
"query": "领导力",
"caseSensitive": false
}
}'
响应格式:
{
"success": true,
"result": {
// 工具特定的结果数据
}
}
list_documents列出所有配置的Craft文档。
参数: 无
示例响应:
{
"documents": [
{
"name": "我的笔记",
"apiEndpoint": "https://connect.craft.do/links/YOUR_SHARE_LINK_1/api/v1"
},
{
"name": "项目文档",
"apiEndpoint": "https://connect.craft.do/links/YOUR_SHARE_LINK_2/api/v1"
}
],
"count": 2
}
用例: 在搜索之前发现可用文档。
search_all_notes跨所有配置的文档同时搜索。
参数:
query(字符串,必需) - 搜索模式caseSensitive(布尔值,可选) - 区分大小写的搜索(默认:false)示例JSON-RPC请求:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "search_all_notes",
"arguments": {
"query": "领导力",
"caseSensitive": false
}
},
"id": 1
}
示例响应:
{
"query": "领导力",
"caseSensitive": false,
"totalResults": 5,
"documentsSearched": 2,
"results": [
{
"documentName": "笔记",
"results": [
{
"block": { "id": "...", "content": "..." },
"documentName": "笔记"
}
]
},
{
"documentName": "Bonhoeffer笔记",
"results": [...]
}
]
}
用例: 在整个Craft知识库中查找内容,而无需知道哪个文档包含它。
search_document在特定的Craft文档中搜索。
参数:
documentName(字符串,必需) - 文档名称query(字符串,必需) - 搜索模式caseSensitive(布尔值,可选) - 区分大小写的搜索(默认:false)示例JSON-RPC请求:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "search_document",
"arguments": {
"documentName": "笔记",
"query": "会议记录",
"caseSensitive": false
}
},
"id": 2
}
用例: 当你知道哪个文档包含信息时进行有针对性的搜索。
read_document读取Craft文档的整个结构。
参数:
documentName(字符串,必需) - 文档名称maxDepth(数字,可选) - 块层次的最大深度示例JSON-RPC请求:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "read_document",
"arguments": {
"documentName": "笔记",
"maxDepth": 3
}
},
"id": 3
}
用例: 为分析或导出检索完整的文档结构。
read_block根据ID读取特定的块。
参数:
documentName(字符串,必需) - 文档名称blockId(字符串,必需) - 块ID示例JSON-RPC请求:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "read_block",
"arguments": {
"documentName": "笔记",
"blockId": "block-123-abc"
}
},
"id": 4
}
用例: 当你有一个从先前搜索获得的块ID时检索特定内容。
此服务器针对与Perplexity等AI助手的快速stdio通信进行了优化:
查看stderr输出以获取性能数据:
[PERF] 2024-01-15T10:30:45.123Z search_all_notes 245ms size=15234bytes
[PERF] 2024-01-15T10:30:50.456Z read_document 1200ms size=524288bytes