Skip to main content
Glama

SiYuan MCP Server

by porkll
README_zh.md10.9 kB
# 思源笔记 MCP 服务器 [English](./README.md) | 中文 为思源笔记提供的模型上下文协议(MCP)服务器,让 Claude、Cursor 等 AI 助手能够无缝地与你的思源笔记交互。 ## ⚠️ 重要声明 本项目代码主要由 AI 辅助开发,仅进行了功能性测试,未对所有代码进行完整审查。使用本项目前,请充分了解并接受以下内容: - 代码可能存在未发现的问题或潜在风险 - 请在使用前进行必要的代码审查和测试 - 使用者需自行承担使用本项目所产生的风险和责任 - 建议在生产环境使用前进行充分的验证 **请谨慎使用,并对自己的选择负责。** --- ## ✨ 特性 - 🚀 完整的 MCP(模型上下文协议)实现 - 📝 15 个核心工具,全面支持思源笔记操作 - 🔍 统一搜索(内容、文件名、标签及组合搜索) - 📁 文档管理(创建、读取、更新、移动、树形结构) - 📅 今日笔记支持,自动创建 - 📚 笔记本操作 - 📸 快照管理(备份和恢复) - 🏷️ 标签管理(列出、替换) - 💻 TypeScript 编写,提供完整类型定义 - 🌐 支持 Claude Desktop、Cursor 等所有 MCP 兼容客户端 ## 📦 安装 ### 方式一:从源码安装(推荐) ```bash # 克隆仓库 git clone https://github.com/porkll/siyuan-mcp.git cd siyuan-mcp # 安装依赖 npm install # 构建项目 npm run build # 全局安装 npm install -g . ``` ### 方式二:从 npm 安装 ```bash # 全局安装 npm install -g @porkll/siyuan-mcp # 或使用 npx(无需安装) npx @porkll/siyuan-mcp ``` 全局安装后,`siyuan-mcp` 命令将全局可用。 ## 🔧 配置 ### 前置条件 1. **获取思源笔记 API Token:** - 打开思源笔记 - 进入 设置 → 关于 → API Token - 复制 Token 2. **确保思源笔记正在运行:** - 默认地址:`http://127.0.0.1:6806` - 如果使用不同端口,请相应调整 `baseUrl` ### 在 Cursor 中配置 编辑 MCP 配置文件 `~/.cursor/mcp.json`: ```json { "mcpServers": { "siyuan-mcp": { "command": "npx", "args": [ "-y", "@porkll/siyuan-mcp", "stdio", "--token", "你的_API_TOKEN", "--baseUrl", "http://127.0.0.1:6806" ] } } } ``` **注意**:如果你全局安装了包,可以使用 `"command": "siyuan-mcp"` 替代 `"command": "npx"`。 ### 在 Claude Desktop 中配置 编辑配置文件: - **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json` - **Windows**: `%APPDATA%\Claude\claude_desktop_config.json` ```json { "mcpServers": { "siyuan-mcp": { "command": "npx", "args": [ "-y", "@porkll/siyuan-mcp", "stdio", "--token", "你的_API_TOKEN", "--baseUrl", "http://127.0.0.1:6806" ] } } } ``` **注意**:如果你全局安装了包,可以使用 `"command": "siyuan-mcp"` 替代 `"command": "npx"`。 ### 验证安装 配置完成后,重启你的 MCP 客户端(Cursor/Claude Desktop),然后尝试: - "列出我的所有思源笔记本" - "搜索包含'项目计划'的文档" - "在工作笔记本中创建一个会议记录" - "显示最近修改的5个文档" ## 🛠️ 可用的 MCP 工具 配置完成后,你可以通过自然语言与思源笔记交互。服务器提供 15 个核心工具: ### 🔍 搜索 - **unified_search** - 统一搜索工具:支持按内容、文件名、标签或任意组合搜索 ### 📄 文档操作 - **get_document_content** - 获取文档的 Markdown 内容 - **create_document** - 创建新文档 - **append_to_document** - 追加内容到现有文档 - **update_document** - 更新(覆盖)文档内容 - **move_documents** - 移动一个或多个文档到新位置 - **get_document_tree** - 获取指定深度的文档树结构 ### 📅 今日笔记 - **append_to_daily_note** - 追加到今日笔记(如需要会自动创建) ### 📚 笔记本管理 - **list_notebooks** - 列出所有笔记本 - **get_recently_updated_documents** - 获取最近更新的文档 ### 📸 快照管理 - **create_snapshot** - 创建数据快照用于备份 - **list_snapshots** - 列出可用的快照 - **rollback_to_snapshot** - 回滚到指定快照 ### 🏷️ 标签管理 - **list_all_tags** - 列出工作空间中的所有标签 - 支持按前缀过滤(`prefix` 参数) - 支持按层级限制(`depth` 参数,从1开始,标签用 `/` 分隔层级) - **batch_replace_tag** - 批量替换或删除标签 ### 使用示例 用自然语言向你的 AI 助手提问: ``` "列出我的所有思源笔记本" "搜索关于机器学习的文档" "在工作笔记本中创建一个名为'项目想法'的新文档" "显示最近修改的10个文档" "追加'会议记录:讨论了第四季度目标'到今天的日记" "在进行重大更改前创建一个快照" "'项目'笔记本的树形结构是什么?" "将文档 X 移动到工作笔记本的根目录" "将文档 X 和 Y 移动到文档 Z 下面" ``` ## 📖 工具参数参考 ### move_documents 移动一个或多个文档到新位置。 **参数:** - `from_ids` (string[]) - **必需**。要移动的文档 ID 数组 - 对于单个文档,使用包含一个元素的数组:`["20210101000000-abc1234"]` - 对于多个文档:`["20210101000000-abc1234", "20210102000000-def5678"]` - `to_parent_id` (string) - **选项 1**:目标父文档 ID。文档将作为子文档移动到此文档下。不能与 `to_notebook_root` 同时使用。 - `to_notebook_root` (string) - **选项 2**:目标笔记本 ID。文档将移动到此笔记本的根目录(顶级)。不能与 `to_parent_id` 同时使用。 **重要:** 必须提供恰好一个目标:`to_parent_id` 或 `to_notebook_root`。 **示例:** ```typescript // 移动单个文档到笔记本根目录 { from_ids: ["20210101000000-abc1234"], to_notebook_root: "20210101000000-notebook1" } // 移动多个文档到另一个文档下 { from_ids: ["20210101000000-abc1234", "20210102000000-def5678"], to_parent_id: "20210103000000-parent99" } ``` ### batch_replace_tag 批量替换所有文档中标签的出现。 **参数:** - `old_tag` (string) - **必需**。要替换的标签名(不带 # 符号) - `new_tag` (string) - **必需**。新标签名(不带 # 符号,使用空字符串表示删除) **示例:** ```typescript // 替换标签 { old_tag: "项目", new_tag: "工作项目" } // 删除标签 { old_tag: "已弃用", new_tag: "" } ``` ## 🔧 高级:作为 TypeScript 库使用 虽然主要设计为 MCP 服务器,你也可以在自己的项目中将此包作为 TypeScript 库使用: ```typescript import { createSiyuanTools } from '@porkll/siyuan-mcp'; // 创建实例 const siyuan = createSiyuanTools('http://127.0.0.1:6806', 'your-token'); // 搜索操作 const files = await siyuan.searchByFileName('关键词', 10); const blocks = await siyuan.searchByContent('内容', 20); // 文档操作 const content = await siyuan.getFileContent(documentId); await siyuan.createFile('notebookId', '/路径/文档', '# 标题\n\n内容'); await siyuan.appendToFile(documentId, '新内容'); await siyuan.overwriteFile(documentId, '替换的内容'); // 今日笔记 await siyuan.appendToDailyNote('notebookId', '今天我学到了...'); // 笔记本操作 const notebooks = await siyuan.listNotebooks(); // SQL 查询 const results = await siyuan.search.query(` SELECT * FROM blocks WHERE type='d' AND content LIKE '%关键词%' ORDER BY updated DESC LIMIT 10 `); // 直接 API 访问 await siyuan.block.insertBlockAfter(blockId, '新块内容'); await siyuan.document.moveDocument(['doc1', 'doc2'], 'targetNotebookId'); const tree = await siyuan.document.getDocTree('notebookId', 2); ``` ### 类型定义 包含完整的 TypeScript 类型: ```typescript import type { SiyuanConfig, SiyuanApiResponse, Block, Notebook, NotebookConf, DocTreeNode, SearchOptions } from '@porkll/siyuan-mcp'; ``` ## 💻 开发 ### 设置 ```bash # 克隆并安装 git clone https://github.com/yourusername/siyuan-mcp.git cd siyuan-mcp npm install # 构建 npm run build # 监听模式(自动重新构建) npm run watch # 代码检查 npm run lint # 格式化 npm run format ``` ### 手动测试 ```bash # 手动启动 stdio 服务器 npm run mcp:stdio -- --token YOUR_TOKEN --baseUrl http://127.0.0.1:6806 # 启动 HTTP 服务器(用于 Web 客户端) npm run mcp:http -- --token YOUR_TOKEN --port 3000 --baseUrl http://127.0.0.1:6806 ``` ## 🏗️ 架构 ``` siyuan-mcp/ ├── src/ # 核心 TypeScript 库 │ ├── api/ # 思源 API 客户端 │ ├── types/ # 类型定义 │ └── utils/ # 辅助工具 ├── mcp-server/ # MCP 服务器实现 │ ├── bin/ # CLI 入口点 │ ├── core/ # MCP 服务器核心 │ ├── handlers/ # 工具处理器 │ └── transports/ # Stdio/HTTP 传输 └── dist/ # 编译后的 JavaScript ``` ## 🔧 技术栈 - **语言**: TypeScript 5.3+ - **运行时**: Node.js 18+ - **模块系统**: ES Modules - **MCP SDK**: @modelcontextprotocol/sdk - **协议**: MCP(模型上下文协议) ## ❓ 常见问题 ### 如何获取思源 API Token? 1. 打开思源笔记 2. 进入 设置 → 关于 → API Token 3. 复制 Token ### 如何找到笔记本 ID? 询问你的 MCP 客户端:"列出我的所有思源笔记本",它会显示 ID。 或者通过编程方式: ```typescript const notebooks = await siyuan.listNotebooks(); console.log(notebooks.map(nb => `${nb.name}: ${nb.id}`)); ``` ### 服务器无法工作,应该检查什么? 1. 思源笔记是否正在运行?(默认:http://127.0.0.1:6806) 2. API Token 是否正确? 3. 配置后是否重启了 MCP 客户端? 4. 检查 MCP 客户端中的日志 ### 可以使用不同的思源端口吗? 可以!只需更新 `baseUrl` 参数: ```json "--baseUrl", "http://127.0.0.1:YOUR_PORT" ``` ### 是否支持远程思源实例? 支持!将 `baseUrl` 指向你的远程实例: ```json "--baseUrl", "http://your-server.com:6806" ``` ## 🤝 贡献 欢迎贡献!请随时提交问题和拉取请求。 ## 📄 许可证 Apache-2.0 ## 🔗 相关项目 - [思源笔记](https://github.com/siyuan-note/siyuan) - 思源笔记官方仓库 - [Model Context Protocol](https://modelcontextprotocol.io/) - MCP 文档 - [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk) - 官方 MCP SDK ## 🙏 致谢 本项目主要由 AI 辅助开发,基于优秀的[思源笔记](https://github.com/siyuan-note/siyuan)项目构建。

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/porkll/siyuan-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server