关于 Model Context Protocol ( MCP ) Python server to use with continue.dev
面向使用 Obsidian 笔记库的 AI Agent,提供知识检索和网页研究的 MCP 服务。它结合向量与 BM25 搜索,并利用笔记结构、标签和链接组织结果。
主要功能
- 01Obsidian 笔记混合检索
- 02按标签和路径筛选
- 03网页深度研究
- 04索引 Markdown 文件
- 05提供标签与文件夹说明
适用场景
- 01从大型笔记库查找相关内容
- 02针对技术问题开展网络研究
- 03在多个 AI 工具间共享笔记库
MCP 相关
MCP 服务向客户端提供 Obsidian 搜索、网页研究及读取标签和文件夹说明的工具;支持通过 HTTP 供多个 AI 工具访问。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Obsidian 知识库的 Model Context Protocol(MCP)服务
这是一个辅助研究和学习项目,主要聚焦于 AI Agent、信息检索以及 AI 工具评估。
该服务通过搜索和读取工具访问 Obsidian.md 知识库。Obsidian 是一款纯文本 Markdown 编辑器,会将所有笔记文件保存在同一个文件夹中。这种格式使它成为 AI Agent 的理想搭档和知识存储工具。
自 2024 年以来,我一直将 AI 编码 Agent(Claude Code、Cursor)与 Obsidian.md 知识库搭配使用,类似于 Andrej Karpathy LLM Wiki,但比他的方案稍微复杂一些。 由于笔记超过 1500 篇,Agent 经常会漏掉重要信息,因此我决定创建一个了解我所用知识组织方式的搜索工具
提供的功能
网络深度研究
web_research 工具是一种 AI Agent,功能类似于 Perplaxity.ai,可以基于互联网上的公开信息回答问题。它针对技术或学术问题进行了优化。
核心循环:
- 生成网络搜索查询
- 获取搜索结果 URL 中的内容。不尝试绕过机器人防护,但支持多种公开来源:Arxiv.org 文章、Github 仓库、Reddit 论坛、Wikipedia、PDF 文档——针对这些来源采用特殊方式提取信息,例如改用 Reddit API,而不是读取网页;或使用 Github 原始格式,而不是 HTML 页面。
- 使用大模型从获取的结果中提取相关信息,减少主 Agent 的上下文占用
- 反思步骤:分析结果,并决定结束研究还是重复循环以填补知识空白
- 最终答案生成器:创建简短答案、详细说明得出结论的过程,以及支持答案的相关链接
评估结果
为节省成本,评估使用了 Gamini Flash lite 或 GPT 5.4 nano 等小型模型,并仅对部分问题进行了测试。 GAIA dataset - 20 个问题中得分为 60% DRACO dataset - 得分约为 40%,主要是因为答案没有评估标准预期的那么详细
评估代码不在此仓库中,而是内部项目的一部分。该项目面向整个团队的 AI 软件开发工具,旨在优化我的初创公司 Jobsflow.ai 的流程。此工具从该项目移植而来。
Obsidian 知识库 RAG
obsidian_search 是混合向量 + BM25 搜索引擎,主要采用经典 RAG。它针对我使用的知识库组织方式进行了优化
笔记格式假设
我所有的笔记都遵循相同的模式,索引工具会按照预期格式将笔记拆分为块,并生成额外的元数据。该格式由一个专门的 Claude Code 技能强制执行,用于处理所有新笔记。
- Frontmatter 属性:
title- 简短说明笔记的主题description- 用 3-4 句话描述笔记内容。用作摘要,类似于 RAPTOR 对多个块生成的合并摘要tags- 我预先定义了一组标签,从 3 个维度对笔记进行划分:知识领域(ai、programming、finances 等)、笔记类型(article、tutorial、action item 等)和具体主题(编程语言、工具类型、活动)。工具支持检索标签分类体系并按标签筛选
- 笔记内容 - 所有笔记都遵循科学论文的格式,每个章节以一级或二级标题分隔。语义分块会按章节拆分笔记。笔记之间的链接使用 `[[Wikilinks]] 格式,并会提取并存储到数据库中。这使得像图谱一样的导航成为可能
- 笔记大小 - 每篇不超过 200 行
索引
工具会按模式遍历知识库文件夹,并提取所有 Markdown 文件。每个文件都会经过解析,提取 frontmatter 属性,并按标题拆分(不超过 500 个 token),随后连同元信息一起保存到数据库中。区块内容和描述也会以向量嵌入的形式存储。创建区块时不重叠,而是将搜索到的相关结果与相邻区块合并。
此外,还会由大模型根据完整笔记内容生成一个摘要区块,以提高该笔记出现在搜索结果中的几率。
知识库内容发生变化时,或通过命令行显式触发时,都会重新索引。
搜索
查询会经过大模型处理,以生成假设答案。查询本身用于全文搜索,生成的答案则用于向量搜索。这与 qmd markdown search 类似。
数据库搜索结果会通过 Reranker API 调用(Cohere 或 Voiage.ai)进行筛选,也可以使用 LanceDB 的 Reciprocal Rank Fusion。RRFReranker 根据排名位置而非原始分数融合结果,因此无需让向量分数和全文搜索分数保持可比。
第二轮筛选会使用大模型选出与查询相关的区块。结果区块会与其相邻区块合并(例如,选中了笔记中的第 5 个区块,搜索结果就会合并第 4 至第 6 个区块)。
其他筛选条件
要缩小搜索范围,可使用以下可选参数:
tags必须出现在结果中的标签列表path文件路径模式 我有 2 个特殊笔记:包含分类体系的 Tags.md,以及介绍知识库组织方式的 Folders.md。MCP 服务提供了用于读取它们的工具和说明。
评估
我使用了一个简单的评估工具,它会在我的知识库快照上执行查询,并统计预期词语(精确率)和非预期词语(召回率)的数量。总共 25 个问题,F1 分数约为 0.9。
使用方法
该服务只使用单一的大模型 API 提供商。我使用 LiteLLM AI Gateway (LLM Proxy) ,但它也可以与 Openrouter 配合使用。
克隆仓库,从 env.example 创建 .env 文件,然后运行
# Create vault index
uv run --project <local copy> mcps --vault <Vault Folder> --reindex
# run as HTTP MCP Server
uv run --project <local copy> mcps --vault <Vault Folder> --port 1234
使用 HTTP 协议时,所有 AI 工具都可以使用同一个服务。我将它用作所有项目共享的知识库和记忆。
Docker
使用可流式 HTTP 传输,将服务构建并作为独立容器运行:
# Build image
docker build -t mcps:local .
# Run container (vault and secrets are mounted/injected explicitly)
docker run --rm --env-file .env -e VAULT=/vault -v <host-vault-path>:/vault -p 8000:8000 mcps:local
可通过 http://localhost:8000/mcp 访问该服务。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。