notes-mcp
by LEZIMAN
README.md
# notes-mcp
> 把一个或多个 markdown 笔记目录变成一个 **MCP 知识助手 server**——不只「查得到」笔记,更把笔记变成**可用的结果**(讲解 / 复习提纲 / 自测题 / 对比表……),让所有支持 MCP 的 AI 工具(Claude Desktop / Cursor / 自写 agent)直接复用。
>
> **一处实现,处处可用。**
---
## 这是什么
`notes-mcp` 是一个基于 [MCP 协议](https://modelcontextprotocol.io)(Model Context Protocol,Anthropic 2024-11 开放协议)的**知识库 AI 助手**。你给它**一个或多个** markdown 笔记目录(笔记分散在多处也没关系),它:
1. **自动建库**:扫目录 → 切块 → 向量嵌入(语义)+ 关键词索引(BM25)
2. **标准化暴露**:按 MCP 协议把「查笔记」的能力(tools / resources / prompts)暴露出去
3. **Web UI**:React 前端 + Spring Boot 后端,浏览器直接对话,支持多 Provider
4. **多 Provider**:本地 Ollama + OpenAI + 自定义 OpenAI 兼容端点(DeepSeek / Groq / vLLM 等)
5. **任意 client 复用**:Claude Desktop、Cursor、MCP inspector、自写 agent……任何 MCP client 接上就能查
> 💡 比喻:**USB-C 之于设备,notes-mcp 之于「笔记 + AI 工具」**——笔记方按标准协议供给,AI 工具方按标准协议消费。
---
## 解决什么问题
作为一个 AI 方向的学习者,我积累了大量 markdown 笔记(LLM / Transformer / RAG / ReAct / LangGraph……)。问题是:
| 痛点 | 现状 | notes-mcp 怎么解 |
|---|---|---|
| 笔记越多越难找 | 全文搜索没语义、查不到「意思相近」的 | **hybrid search**(语义 + 关键词融合) |
| 工具碎片化 | Cursor / Claude / Obsidian 各不知道我的笔记 | 笔记封成 **MCP server**,所有工具统一查 |
| 每接一个工具要重做 RAG | 每个 agent 各写一套检索 | **一处实现,处处可用**(MCP 核心卖点) |
| 答案没出处 | LLM 可能瞎编 | 结果**带溯源**(来源文件 + 标题) |
| 本地 + 云端切换 | 免费时用本地,复杂任务用付费 API | **一键切换 Provider**(Ollama / OpenAI / 自定义) |
---
## 怎么工作
```
你的 markdown 笔记目录
│ notes-mcp server 启动时自动建库
▼
┌────────────────────────────────────┐
│ notes-mcp server(FastMCP) │
│ · Chroma 向量库(语义检索) │
│ · BM25 索引(关键词检索) │
│ · SQLite 增量状态(只更新变化) │
│ │
│ 暴露三大原语: │
│ Tools / Resources / Prompts │
└────────────────────────────────────┘
│ MCP 协议(stdio)
▼
┌──────────────────────────────────────────────┐
│ Spring Boot 后端(port 8000) │
│ · ProviderRouter(多 Provider 路由) │
│ · ChatHistoryService(对话记录 SQLite) │
│ · MCP client(调用 notes-mcp 工具) │
└──────────────────────────────────────────────┘
│ REST API(/api/*)
▼
┌──────────────────────────────────────────────┐
│ React 前端(port 5173) │
│ · 三栏布局(侧边栏/对话/信息) │
│ · 设置中心(Provider/模型/笔记目录) │
│ · 学习模式(讲解/复习/自测/对比) │
│ · 笔记详情页(Markdown 渲染) │
│ · 对话记录持久化 │
└──────────────────────────────────────────────┘
```
**核心思想**:笔记库 = 一个标准 MCP server,工具供给与 AI 工具解耦。前端直接对话,底层通过 ProviderRouter 无缝切换本地/云端模型。
---
## 提供什么
### MCP 三大原语(协议层)
| 原语 | 名称 | 谁控制 | 干什么 |
|---|---|---|---|
| **Tool** | `search_notes(query)` | 🤖 模型 | **hybrid 检索**(语义 + BM25 + RRF 融合),返回带出处 |
| **Tool** | `get_note(title)` | 🤖 模型 | 按标题取整篇笔记(支持 H1 标题和文件名) |
| **Tool** | `list_topics()` | 🤖 模型 | 列出所有笔记标题/主题 |
| **Resource** | `notes://stats` | 📦 应用 | 知识库统计(笔记数、chunk 数、模型) |
| **Resource** | `notes://note/{title}` | 📦 应用 | 模板 URI:按标题取单篇 |
| **Prompt** | `explain / review / quiz / compare` | 👤 用户 | 讲解 / 复习 / 自测 / 对比——**Prompts 是应用层核心** |
### Web API(REST 层)
| 端点 | 方法 | 说明 |
|---|---|---|
| `/api/chat` | POST | 智能对话(支持 sessionId 持久化) |
| `/api/search` | GET | 直接搜索笔记 |
| `/api/notes/{title}` | GET | 取笔记原文 |
| `/api/notes/tree` | GET | 笔记文件夹树结构 |
| `/api/topics` | GET | 笔记标题列表 |
| `/api/stats` | GET | 知识库统计 |
| `/api/settings` | GET/PUT | 获取/更新完整配置 |
| `/api/models` | GET | 当前 Provider 可用模型 |
| `/api/models/select` | POST | 切换模型 |
| `/api/models/refresh` | POST | 刷新模型列表 |
| `/api/provider/select` | POST | 切换 Provider |
| `/api/sessions` | GET/POST | 会话列表/新建 |
| `/api/sessions/{id}` | GET/DELETE | 获取/删除会话 |
---
## 技术亮点
1. **完整 Web UI**——React 三栏布局 + 设置中心 + 学习模式 + 笔记详情 + 对话记录
2. **多 Provider 支持**——Ollama 本地 / OpenAI / 自定义端点(DeepSeek, Groq, vLLM...),一键切换
3. **Hybrid Search**——语义(bge-m3)+ 关键词(BM25 + jieba)+ RRF 融合
4. **增量建库**——SQLite 追踪 mtime/hash,只更新变化的笔记
5. **溯源**——每条结果带来源文件 + 标题
6. **对话持久化**——SQLite 存储会话和消息,支持历史查看
7. **双传输**——stdio(本地 MCP)+ Streamable HTTP(远程)
---
## 快速开始
### 前置条件
- Java 17+、Maven 3.9+
- Python 3.10+、Node.js 18+
- Ollama(本地模型)或 API Key(OpenAI / DeepSeek)
### 1. Python MCP Server
```bash
cd notes-mcp
python -m venv venv && venv\Scripts\activate
pip install -r requirements.txt
pip install -e .
cp .env.example .env
# 编辑 .env:NOTES_DIR=d:/你的笔记目录
python -m notes_mcp index # 首次建库
```
### 2. Spring Boot 后端
```bash
cd web/backend
mvn spring-boot:run
# 启动在 http://localhost:8000
```
### 3. React 前端
```bash
cd web/frontend
npm install
npm run dev
# 启动在 http://localhost:5173
```
### 4. 配置 Settings
打开浏览器访问 `http://localhost:5173` → 点击右上齿轮图标 → 设置笔记目录、选择 Provider(Ollama/OpenAI/自定义)、选择模型。
### 接到 Claude Desktop
```json
{
"mcpServers": {
"notes-mcp": {
"command": "python",
"args": ["-m", "notes_mcp", "serve", "--transport", "stdio"]
}
}
}
```
---
## 项目结构
```
notes-mcp/
├── notes_mcp/ # Python MCP Server
│ ├── server.py # FastMCP:三大原语 + lifespan 建库
│ ├── indexer.py # 增量建库(Chroma + BM25 + SQLite)
│ ├── search.py # Hybrid 检索(RRF 融合)
│ ├── embedder.py # OllamaEmbedder(bge-m3)
│ ├── chunker.py # Markdown 切块
│ ├── cli.py # CLI:serve / index / query
│ └── config.py # 读 .env
├── web/
│ ├── backend/ # Spring Boot 后端
│ │ └── src/main/java/com/notesmcp/backend/
│ │ ├── ProviderRouter.java # 多 Provider 路由
│ │ ├── SettingsService.java # 配置管理
│ │ ├── ChatHistoryService.java # 对话记录 SQLite
│ │ ├── ChatController.java # /api/chat
│ │ ├── NotesController.java # /api/notes/*
│ │ ├── SettingsController.java # /api/settings/*
│ │ ├── SessionController.java # /api/sessions/*
│ │ └── ...
│ └── frontend/ # React 前端
│ └── src/
│ ├── components/ # Header/Sidebar/ChatArea/SettingsDrawer/...
│ ├── pages/ # HomePage/NoteDetailPage/DashboardPage/LearningPage
│ └── api/ # API 客户端(client.ts + settings.ts)
├── agent.py # 消费侧 LangGraph agent(命令行)
├── settings.json # 多 Provider 配置(运行时可切换)
├── docs/ # 设计文档 + 开发规范 + 踩坑记录
├── tests/ # pytest(96 tests)
└── scripts/dev.py # 统一开发命令(lint/type/test/coverage)
```
---
## 开发
```bash
# Python 端
python scripts/dev.py lint # ruff 检查
python scripts/dev.py type # mypy 类型检查
python scripts/dev.py test # pytest(96 tests)
# Java 端
cd web/backend && mvn compile
# 前端
cd web/frontend && npx tsc --noEmit && npx vite build
```
提交前检查清单见 [开发规范](./docs/03-实现/开发规范.md)。
---
## 与学习笔记的关系
这个项目是 **AI 学习工作区**「Agent 核心」线的工程落地(项目实战 P3):
| 笔记 | 在本项目哪里用到 |
|---|---|
| MCP 协议精读 | 三大原语、Host/Client/Server、双传输 |
| RAG / Embedding & 切块 | hybrid search、切块策略、embedding、溯源 |
| LangGraph | 消费侧 agent 的 ReAct 状态机 |
---
*项目状态:✅ Phase 3b 完成——Python MCP Server + Spring Boot 后端 + React 前端 + 多 Provider + 对话记录 · 2026-07-20*
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues