Cherry Studio 通过只读 SQLite MCP 对接思源笔记

这篇帖子是上篇帖子的续集:

Cherry Studio 通过 MCP 对接思源笔记

评论区的朋友提醒了我一个大问题:

image

这两天想了很多办法,最终确认,至少在 Cherry Studio 里,官方给的 SQLite MCP 示例(就是上篇帖子里那个)没办法从根源上禁止修改和增删行为。

但在寻求办法的过程中,另一个 MCP Server 引起了我的注意:

https://github.com/hannesrudolph/sqlite-explorer-fastmcp-mcp-server

image

它只提供了三个工具:

  • read_query(查询)
  • list_tables(列出表名)
  • describe_table(描述表)

根本就没有修改和增删内容的功能。

这不开搞?

然后一通搞就搞通了。

先看效果:

image

我让它加一个字段,它却用的是查询工具,然后反馈没有权限。

这下彻底放心用了!

下面是教程部分。


1. 安装 uv 和 node.js

具体参考上篇,就不赘述了。

虽然 node.js 在这个 MCP 里不是必须的,但顺便装了吧,除非你不想用别的 MCP 了。

2. 安装 fastmcp

这个项目只多一个依赖:fastmcp==0.4.1

直接 pip 就行了:

# 1. 打开 Powershell # 2. 输入下面的命令 pip install fastmcp==0.4.1

注意!这里必须开代理,否则拉不下来!

3. 准备 MCP Server 本体

这个 MCP Server 和上篇里的不一样,要事先准备。

点这个链接应该就能下载了:

https://github.com/hannesrudolph/sqlite-explorer-fastmcp-mcp-server/archive/refs/heads/main.zip

下载不了就去项目仓库(开头提到的 GitHub 链接)里下载:

image

然后解压出来,找到里面的 sqlite_explorer.py,记下它的路径。

4. 添加 MCP 服务器

有了上篇的基础,这篇就讲简单点。

4.1 命令框

uv

上篇说只支持 uvx,这次发现好像 uv 也支持。

然后上篇要用绝对路径的原因找到了,其实是 Cherry Studio 的环境变量没更新,重启 Cherry Studio 就好了。

4.2 参数框

run --with fastmcp --with uvicorn fastmcp run sqlite_explorer.py 路径 # 这行填你之前记下的路径

4.3 环境变量框

SQLITE_DB_PATH=思源数据库路径 # 等于号后面换成你思源数据库路径,上篇讲了在哪

最后长这样:

image

点确定,应该就成了。

使用部分就不讲了,和上篇一样,把上篇的 MCP Server 换成这篇的就行了。

最后感谢热心网友的提醒 🙏

2025.03.19 更新

感谢评论区大神提供的方法!将 sqlite_explorer.py 中的第 96 行的 return [dict(row) for row in results if row is not None] 改成 return [str(dict(row)) for row in results if row is not None] 可以解决搜索结果里中文以编码形式呈现的问题。

改动前:

image.png

改动后:

image.png

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    24975 引用 • 102877 回帖 • 1 关注
  • MCP
    5 引用 • 53 回帖
2 操作
B3000Kcn 在 2025-03-19 14:20:40 更新了该帖
B3000Kcn 在 2025-03-16 01:28:36 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 不错

  • B3000Kcn

    刚才又发现一个大问题,这篇文章的 MCP Server 搜出来的中文是编码形式 ,大模型读不懂 🤣

    各位大佬有办法解决吗 🤣

    2 回复
  • 要不截下图呢,看下是哪种编码

    1 回复
  • B3000Kcn via Android

    image.png

    是这样的

    我尝试用 cusor 改造这个项目但是失败了 😂 无论怎么调整都是编码形式

    1 回复
  • 我问豆包,它是这样回答的。我也不是很懂哈。

    image.png

  • xnyshu via macOS

    能不能把参数栏窗口拉开截图,我参数一直设置不成功。

    2 回复
  • B3000Kcn 1 评论

    这个框拉不开,你按文章里的参数框填就行,路径换成你自己的

    滚动条下有个小箭头,可以拉的,Mac 版可以,你试试。我换路径不成功。
    xnyshu
  • B3000Kcn 1

    image.png

    我这是 1.1.3 的,你看看是不是没升级的原因

    1 回复
  • Muu 2 2 赞同

    图片.png

    96 行改为 return [str(dict(row)) for row in results if row is not None] 即可

    但是 看了下效果, 不影响大模型读取, 应该也是能看懂的, 我用的 硅基流动的 Qwen/QwQ-32B

    1 回复
  • B3000Kcn

    感谢大神 👍

    一行代码给修好了 😂

    image.png

    1 回复
  • openAI 1 赞同 via Android

    但这样一来就丢失了 idparent_idroot_idhashboxpathhpath 等信息。

    2 回复
  • xnyshu 1 赞同 via macOS

    截屏 2025031922.58.35.png

    成功!

  • B3000Kcn

    还真是

  • xnyshu via macOS

    将 siyuan.db 整个拷贝到另一个文件夹再 MCP,就不用怕修改数据了。

    1 回复
  • B3000Kcn

    我测试的时候就是这么干的 🤣 不嫌麻烦的话也不是不行

    1 回复
  • xnyshu via macOS

    十几秒就能拷贝完,不麻烦,这样放心多了。😄

  • Muu 2 赞同 1 评论

    这个是 sql 构建的问题(LLM) 那个 Py 代码只是执行了下 LLM 生成的 sql, 我改的那行只不过是将返回格式转义了下

    如果 LLM 生成的是 select * .... 那就有那一堆属性 如果 LLM 生成的是 select content 则就只有 content 的信息喽

    好的,明白了。
    openAI
  • artcoreW

    @B3000Kcn 先感谢下作者做了这个方案,不过我尽可能地复制了过程之后发现依旧报错:
    更新服务器失敗:Error invoking remote method'mcp:update-server:McpErr:MCP error-32000:Connection closed

    • 以下步骤我都验证过,没有问题
      • uv 安装
      • nodejs 安装
      • 命令那个框我试过好几种填法,uvx 和 uv 都一样报错,填上 uvx 文件的路径也报错
      • 参数区按照上面的内容填上了服务器文件位置
      • 环境变量填上了数据库位置
      • cherry studio 更新到 1.1.8
    • 20250322154746456.png
    1 回复
  • 这个会涉及到隐私泄露吗?

    1 回复
  • B3000Kcn

    你装了 fastmcp 吗

    1 回复
  • B3000Kcn

    用本地模型就不会

  • artcoreW

    这个也安装了

    1 回复
  • B3000Kcn

    有可能是你 mcp server 路径里有空格?你换个没空格的路径试试

  • ZBS 1 评论

    这个错误信息表明你请求的内容超出了模型的最大上下文长度限制。具体来说:

    最大上下文长度:当前模型的最大上下文长度是 65,536 个 token(token 可以理解为单词或字符的片段)。
    你的请求:你请求的内容长度为 117,634 个 token,远远超过了模型的限制。
    可能的原因
    查询的内容过大:你尝试查询的 /每日工作/2025/3 月 路径下的内容可能包含大量文本或数据,导致总 token 数超过了限制。
    查询方式问题:如果查询返回了过多的数据(例如,大量笔记或记录),也可能导致 token 数超标。

    这个咋整啊

    1 回复
    { "message": "400 This model's maximum context length is 65536 tokens. However, you requested 117874 tokens (117874 in the messages, 0 in the completion). Please reduce the length of the messages or completion.", "status": 400, "error": { "message": "This model's maximum context length is 65536 tokens. However, you requested 117874 tokens (117874 in the messages, 0 in the completion). Please reduce the length of the messages or completion.", "type": "invalid_request_error", "param": null, "code": "invalid_request_error" }, "code": "invalid_request_error", "param": null, "type": "invalid_request_error" }
    ZBS
  • B3000Kcn

    已解决 MCP 回复长度超限问题
    可以限制一下长度

请输入回帖内容 ...