sovena
缙云文采 Sovena
English | 简体中文
Zotero → Markdown 语义文献包 → 向量检索:面向各学科学术研究的本地文献流处理系统(人文、社科、理工、医学等均有大量影印/扫描资料的领域尤其受益),并以 MCP(Model Context Protocol)服务的形式暴露给任意本地/远程 AI 客户端。
「缙云」取自北碚缙云山——西南大学所在地;「文采」兼含二义:既是采撷文献之精华,亦是文章之华采。 「采撷远古之花兮,以酿造吾人之蜜。」——吴宓(执教西南大学二十八年)
应用场景
文献综述与写作:把 Zotero 里的文献(含影印古籍、扫描版 PDF)批量转成带书页页码的 Markdown,AI 客户端引用时可精确溯源到页
跨库语义检索:对几百篇文献用自然语言提问(如「音色的声学测量方法有哪些」),而不是逐篇翻找关键词
古籍/影印本数字化:扫描版 PDF 自动走 OCR 通道,还原标题、表格、双栏版式为结构化文本
Zotero 之外的资料:电子书库、散装 PDF、讲义等任意文件夹,做成同样可检索的临时资料包(adhoc)
AI 深度阅读外脑:Claude Desktop / Cherry Studio / Trae 等客户端经 MCP 直接查你的文献库,回答带出处
远程协作:服务端部署在任意满足运行条件的电脑上(家中/实验室/云端均可),其他电脑在 AI 客户端里填服务端 URL 即可使用
Related MCP server: zotero-mcp-lite
核心能力
能力 | 说明 |
Zotero 深度接入 | 分类/条目/标注读取(本地 API,无需 Web API key);附带 Zotero 插件(.xpi,分类/条目右键直达) |
文献全文转换 | 附件批量转为 AI 友好 Markdown,含【书页页码】标注(PDF Page Labels 与 OCR 页码双重来源) |
扫描/影印件 OCR | Unlimited-OCR 结构化识别,MLX / GGUF(llama-server)双后端,全平台、可远程 |
向量语义检索 | LanceDB + 任意 OpenAI 兼容 embedding 服务(本地或远程商用平台) |
增量处理 | 条目 version + 附件指纹(mtime)双重检测,只处理新增/变更内容 |
一键启动 |
|
非 Zotero 资料 | 电子书库、散装 PDF、讲义等任意文件/文件夹,做成同样可检索的临时资料包(adhoc) |
远程部署 | 服务端起一次,其他电脑填 URL 即可(如 Tailscale 组网) |
任务调度/资源守卫 | OCR 并发=1、内存守卫、模型按需加载/释放,不会把电脑跑死 |
架构
Zotero(本地API) ─┐
├─ Pipeline.prepare ─┬─ L1 文本路(pymupdf) ─┐
任意文件/文件夹 ─┘ (增量) ├─ L2 OCR路(MLX/GGUF) ├─ 语义包(content.md+meta.json)
└─ anydoc(非PDF) ┘ │
LanceDB 向量索引
(embedding: 本地/远程 OpenAI 兼容服务)
│
┌──────────────────────────────────────┤
│ │
Web 监管台(:8765) MCP 端点(/mcp)
(HTMX/原生JS) (本地 & Tailscale 远程 AI 客户端)L1 文本路:有文本层的 PDF → pymupdf 提取,页码标注优先用 PDF Page Labels(书页页码,非物理页序)
L2 OCR 路:扫描/影印件 → Unlimited-OCR 结构化识别(MLX / GGUF 双后端),页码优先级:OCR 识别的 page_number > PDF Page Label > 物理页序
非 PDF:docx / epub / html / txt / md / xlsx / pptx 等 → anydoc / trafilatura
检索:任意 OpenAI 兼容 embedding 服务(本地 mlx-lm / Ollama,或百炼 / OpenRouter 等远程平台)+ LanceDB 本地向量库
OCR 引擎与模型部署
sovena 的 OCR 通道使用 Unlimited-OCR(百度开源,MIT 协议,模型权重在 HuggingFace baidu/Unlimited-OCR):DeepSeek-V2 MoE 解码器 + SAM/CLIP 双视觉塔的文档 OCR 模型,能整篇识别多页扫描件并还原标题/表格/版式。
支持两种后端,输出同为结构化格式,下游转换无感知:
后端 | 运行方式 | 适用平台 |
| 本仓库 | Apple Silicon Mac |
| OpenAI 兼容接口:llama-server / vLLM 服务 GGUF 量化版 | 任意平台(Windows / Linux / Intel Mac,纯 CPU 亦可) |
后端一:MLX(Apple Silicon,默认)
从 HuggingFace 下载 MLX 权重(LoJexLLM/Unlimited-OCR-MLX):
huggingface-cli download LoJexLLM/Unlimited-OCR-MLX \
--local-dir ~/models/Unlimited-OCR-MLX默认就落在 sovena 的默认路径(~/models/Unlimited-OCR-MLX),无需任何配置。放到其他位置则在 .env 指定:
SOVENA_OCR_MODEL=/path/to/Unlimited-OCR-MLX后端二:GGUF(任意电脑,含无 GPU 的 Windows/Linux)
Unlimited-OCR 有社区 GGUF 量化版(HuggingFace sahilchachra/Unlimited-OCR-GGUF,需下载主模型如 Unlimited-OCR-Q4_K_M.gguf(约 3.2GB)+ 视觉投影器 mmproj-Unlimited-OCR-F16.gguf),用 llama.cpp 的 llama-server 起一个本地服务即可:
# 1. 下载模型(二选一)
huggingface-cli download sahilchachra/Unlimited-OCR-GGUF \
Unlimited-OCR-Q4_K_M.gguf mmproj-Unlimited-OCR-F16.gguf --local-dir ./ocr-models
# 国内可用 ModelScope 或镜像加速
# 2. 启动 OpenAI 兼容服务(8080 端口,任意平台;含 GPU 加速则加对应参数)
llama-server -m ocr-models/Unlimited-OCR-Q4_K_M.gguf \
--mmproj ocr-models/mmproj-Unlimited-OCR-F16.gguf \
--host 127.0.0.1 --port 8080
# 3. sovena 侧启用 http 后端(项目根目录 .env)
echo 'SOVENA_OCR_API=http://127.0.0.1:8080/v1' >> .env也可用 vLLM 等任何能跑该 GGUF 的 OpenAI 兼容服务(模型名不同时加 SOVENA_OCR_MODEL_NAME=...;有鉴权加 SOVENA_OCR_API_KEY=...)。OCR 服务甚至可以部署在另一台有 GPU 的机器上,sovena 填它的地址即可。
提示:Q4 量化约 3GB,16GB 内存的普通电脑即可运行。sovena 按需调用(逐页请求),不在 sovena 进程内占内存。
Embedding 服务(检索用,必须)——任意 OpenAI 兼容 /embeddings 接口均可,二选一:
本地(推荐,免费私密):用 mlx-lm(Apple 官方 MLX 生态的推理服务,MIT):
uv tool install mlx-lm # 或 pip install mlx-lm
huggingface-cli download Qwen/Qwen3-Embedding-4B --local-dir ~/models/Qwen3-Embedding-4B
mlx_lm.server --model ~/models/Qwen3-Embedding-4B --port 8080
# 起一个 OpenAI 兼容 /v1/embeddings 服务,即 sovena 的默认地址 http://localhost:8080/v1Ollama / vLLM 等其他 OpenAI 兼容本地方案同理(地址不同时设 SOVENA_EMBED_API)
远程商用平台(不想本地跑模型):阿里云百炼 / OpenRouter / SiliconFlow 等,只需在
.env填 API 地址与密钥:
# 示例:阿里云百炼(OpenAI 兼容端点)
SOVENA_EMBED_API=https://dashscope.aliyuncs.com/compatible-mode/v1
SOVENA_EMBED_API_KEY=sk-你的密钥
SOVENA_EMBED_MODEL=text-embedding-v4注意:更换 embedding 服务/模型后向量维度与语义空间会变化,已有索引需重建(sovena 检测到维度不匹配会明确提示;删除
_lancedb目录后重新「准备」各分类,或勾选「全量重建」)。
快速开始
要求:任意电脑均可部署,核心流程只需 Python ≥ 3.12(Windows / macOS / Linux 通用)。OCR 通道二选一:Apple Silicon 用默认 MLX 后端(零配置);其他平台(或想用 GPU 服务器跑 OCR)用 GGUF 后端(见上节「后端二」)。全程只需复制粘贴命令。
第 1 步:装 uv(Python 包管理器,一次性)
打开「终端」(启动台搜索「终端」或 Terminal),粘贴:
curl -LsSf https://astral.sh/uv/install.sh | sh装完后关闭终端,重新打开(让命令生效)。验证:uv --version 能出版本号即可。
第 2 步:装 Zotero 并保持运行
到 zotero.org 下载安装 Zotero 7+,导入你的文献
sovena 通过 Zotero 的本地 API 读取(Zotero 打开着就自动可用,无需任何设置)
附件可以是「导入的附件」或「链接附件」,两种都支持
第 3 步:准备模型服务(检索必需 + OCR 可选)
embedding 服务(检索必需),二选一:
本地(推荐):mlx-lm(Apple 官方 MLX 生态,MIT)——
uv tool install mlx-lm,下载模型并mlx_lm.server --model <模型目录> --port 8080起服务(完整命令见上节「Embedding 服务」)。Ollama / vLLM 等其他 OpenAI 兼容方案同理远程平台(不在本地跑模型):阿里云百炼 / OpenRouter 等,在项目根目录建
.env填地址与密钥(见上节「Embedding 服务」的示例)
OCR 模型(仅扫描件需要,Apple Silicon):从 HuggingFace 下载 Unlimited-OCR-MLX 到 ~/models/Unlimited-OCR-MLX(命令见上节「后端一」,sovena 需要时会自己加载/释放)
非 Apple Silicon 电脑做 OCR:改用「GGUF 后端」——下载 Unlimited-OCR-GGUF + 跑 llama-server,配置见上节「后端二」。 只想快速体验、暂时不检索?模型服务可以后补,先跳过做第 4-5 步。
第 4 步:获取 sovena 并安装依赖
git clone https://github.com/<you>/sovena.git
cd sovena
uv sync # 自动下载全部依赖(首次约 1.3GB,需要几分钟)非 Apple Silicon 电脑(Windows / Linux / Intel Mac):MLX 相关依赖仅在 MLX OCR 后端用到,
uv sync在这些平台会自动跳过或用 CPU 兼容版本安装;文本 PDF、非 PDF 文档转换、检索等核心功能,以及 GGUF 后端的 OCR,均可正常使用。
第 5 步:一键启动
uv run sovena看到 Uvicorn running on http://0.0.0.0:8765 即成功。浏览器打开 http://localhost:8765:
「性能监控」页的圆点是绿色 → 服务正常
「Zotero 文献流」下拉框能看到你的分类 → Zotero 连通
用完在终端按 Control + C 停止。服务不常驻、不开机自启,重操作内部串行调度(OCR 并发=1、内存守卫),不会把电脑跑死。
第 6 步(可选):个人路径配置
默认数据存在 ~/sovena_data。想放别处(如移动硬盘),在项目根目录建 .env 文件:
echo 'SOVENA_ROOT=/Volumes/你的盘/sovena_data' > .env.env 已被 git 忽略,写个人路径不会进仓库。
第 7 步:跑第一个任务
Web 台「Zotero 文献流」→ 选一个小分类(如 5 条文献)→「启动准备」→ 切到「性能监控」看进度。完成后去「语义检索」问个问题试试。
常见问题
现象 | 解决 |
提示 | 第 1 步的 uv 没装好或没重开终端 |
提示端口被占用 | 旧服务没关: |
「Zotero 连接失败」 | Zotero 没打开,或装的是旧版(需 7.0+) |
检索报错/无结果 | embedding 服务没开/密钥不对(本地 mlx-lm 或远程平台),或该分类还没「准备」过;换过 embedding 模型需重建索引 |
OCR 报模型错误 | MLX 后端:没下载 |
机器风扇狂转 | 正常:OCR 任务较重;任务结束模型会自动卸载 |
第 8 步(可选):AI 客户端接入(其他电脑同样适用)
任意支持 MCP streamable-http 的客户端(Claude Desktop、Cherry Studio、Trae 等)填入:
{
"mcpServers": {
"sovena": { "url": "http://localhost:8765/mcp" }
}
}远程(其他电脑)部署:服务端 SOVENA_HOST=0.0.0.0 启动(默认),客户端把 URL 换成 http://<服务器IP或Tailscale主机名>:8765/mcp 即可。Web 监管台「设置」页可一键复制/下载当前部署的配置 JSON。
Zotero 插件(可选)
dist/sovena-plugin-<version>.xpi 是可安装到 Zotero 7+(含 9/10) 的客户端插件,让 Zotero 内直达 sovena:
分类右键 → 「sovena:准备/更新语义包(增量)」
条目右键 → 「sovena:把附件加入临时语义包」(所选条目的本地文件附件走 adhoc 流程)
工具菜单 sovena → 打开监管台 / 服务端地址设置 / 复制 MCP 客户端配置 / 连接检查
安装:Zotero → 工具 → 插件 → 右上角齿轮 → Install Plugin From File… → 选择 dist/sovena-plugin-0.1.0.xpi。默认连 http://localhost:8765;其他电脑在「工具 → sovena → 服务端地址…」填 sovena 服务器地址即可。
重新打包插件(修改 zotero-plugin/ 后):
bash zotero-plugin/build.sh # 产出 dist/sovena-plugin-<version>.xpi环境变量
所有配置均可用环境变量设置;推荐在项目根目录建一个 .env 文件(已被 .gitignore 忽略,适合放个人路径),服务启动时自动加载:
SOVENA_ROOT=/Volumes/your-disk/zotero_AI
SOVENA_ZOTERO_API=http://localhost:23119/api变量 | 默认值 | 说明 |
|
| 语义文献包根目录(个人部署建议在 |
|
| Zotero 本地 API |
|
| 服务监听地址 |
|
| 服务端口 |
|
| embedding 服务地址(本地 mlx-lm/Ollama 或远程平台) |
| (空) | embedding 服务密钥(远程商用平台必填) |
|
| embedding 模型名 |
|
| 向量库目录 |
|
| OCR 后端: |
|
| MLX 后端模型目录 |
| (空) | http 后端服务地址(如 |
|
| http 后端模型名 |
| (空) | http 后端鉴权 key(如有) |
|
| 内存守卫阈值(MB),低于则推迟新任务 |
使用
Zotero 文献流(增量)
Web 台选择分类 →「启动准备」;或让 AI 客户端调用 MCP 工具 sovena_prepare。重复执行自动增量:仅处理新增/变更条目(Zotero version 变化或附件 mtime 变化),索引按条目级增删。勾选「全量重建」可强制重来。
adhoc 临时资料(任意文件/文件夹)
把电子书库、散装 PDF、讲义等做成可检索语义包:
Web 台:「临时资料包」卡片填路径(多个用换行或
;分隔)→ 提交,之后可与 Zotero 分类一起被语义检索MCP:
sovena_adhoc_process(paths=["/path/to/E_book/某子目录"], name="我的书库")REST:
POST /api/adhoc/submit{"paths": [...], "name": "..."}
支持 pdf/epub/docx/html/txt/md/xlsx/pptx 等;扫描版 PDF 自动走 OCR;同样支持增量(源文件 mtime 不变则跳过)。
MCP 工具一览
分类 | 工具 |
Zotero 读取 |
|
文献流 |
|
adhoc |
|
任务/运维 |
|
注:Zotero 本地 API 为只读,故不提供写操作工具。
语义包目录结构
$SOVENA_ROOT/
<分类名>/
_manifest.json # 分类级清单(增量依据)
<作者>_<年份>_<标题>/
meta.json # Zotero 元数据 + 转换统计
content.md # AI 友好 markdown(含【书页页码】标注)
adhoc/
<资料包名>/
_manifest.json
<文件名slug>/
meta.json
content.md
_lancedb/ # 向量库REST API 概览
方法 | 路径 | 说明 |
GET |
| Zotero 分类 + adhoc 包及准备状态 |
GET |
| 运行配置、系统状态(内存/CPU/磁盘/任务) |
GET |
| 服务端目录列表(Web 路径选择器用) |
POST |
| 提交 prepare 任务(collection/limit/use_ocr/rebuild) |
POST |
| 提交 adhoc 任务(paths/name/use_ocr/recursive) |
GET |
| 任务列表/详情(含日志),POST |
GET |
| 语义检索(可限定 collection) |
GET |
| 清单 |
GET |
| 内容/元数据 |
GET |
| 系统状态、MCP 客户端配置 |
项目结构
sovena/
main.py # 一键启动入口
sovena/
server.py # 服务总入口(Web + MCP 同进程,自动加载 .env)
web.py / webui.html # Web 监管台(分区 Tab + 路径选择器)
mcp_server.py # MCP 工具集
zotero_collector.py # Zotero 本地 API 采集(附件 4 路解析)
pipeline.py # prepare 流水线(增量)
adhoc.py # 任意资料临时处理
converter.py # L1/L2/anydoc 转换
indexer.py # 分块 + 向量化 + LanceDB
packager.py # 语义包落盘
jobs.py # 任务调度(内存守卫/OCR 并发=1)
zotero-plugin/ # Zotero 客户端插件源码(bootstrap 结构)
dist/ # 构建产物(sovena-plugin-<version>.xpi)
ocr_port/ # Unlimited-OCR-MLX(MLX OCR 引擎)
.env # 本地个人配置(可选,不入库)致谢
sovena 站在以下项目肩膀上,深表感谢:
Unlimited-OCR(百度,MIT)— 文档 OCR 模型本体;
ocr_port/代码移植自 mlx-vlm 社区的 MLX 实现;MLX 权重(LoJexLLM 整理格式)与 GGUF 量化版(sahilchachra)均来自 HuggingFace 社区;http 后端经 llama.cpp(MIT)的 llama-server 运行cookjohn/zotero-mcp — 项目灵感来源之一
Zotero(AGPL)— 文献管理本体与本地 API
PyMuPDF(AGPL)— PDF 文本提取与页码标签
LanceDB(Apache-2.0)— 本地向量库
FastMCP(MIT)— MCP 服务框架
anydoc(firecrawl-anydoc)— docx/epub 等非 PDF 文档转换
trafilatura(Apache-2.0)— 网页正文提取
mlx-lm(Apple ml-explore,MIT)— 本地 embedding 推理服务(
mlx_lm.server,OpenAI 兼容 API)uv(Astral,MIT)— Python 包管理
License
MIT © Sovena contributors、西南大学·艺术人类学研究所、西南大学·中国音乐心理健康研究所;作者:石丰恺(sfklc@hotmail.com)
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables semantic search and conversational querying across a personal research library of PDFs, DOCX, and other documents using a vector database. It provides tools for document summarization, finding related papers, and high-accuracy retrieval for AI clients like Claude Desktop.
- AlicenseAqualityDmaintenanceEnables AI assistants to search, read, and manage Zotero references locally with customizable research workflows.94MIT
- FlicenseNot gradedqualityDmaintenanceEnables semantic search across scientific papers in your Zotero library with hybrid search, incremental indexing, and cross-encoder reranking.
- AlicenseNot gradedqualityDmaintenanceMCP server that connects AI assistants to your Zotero library, enabling full-text PDF extraction and metadata search.MIT
Related MCP Connectors
Search and reason over your Obsidian-style Markdown vault, right from ChatGPT.
Serve a folder of Markdown notes as an MCP server: hybrid search, reading, and sourced answers.
Search arXiv/Semantic Scholar/OpenAlex + medical evidence (PubMed/Europe PMC) + LaTeX/PDF tools.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/sfk8815-create/sovena'
If you have feedback or need assistance with the MCP directory API, please join our Discord server