MCP文档处理器
用于读取、创建和管理PDF、DOCX和Excel文档的MCP(模型上下文协议)服务器。专为需要使用专业样式、自动分类和智能文档管理处理文档的AI代理而构建。
部分 LeanZero 生态系统。
特性
- 阅读任何文档 --PDF、DOCX和Excel,支持基于图像的PDF的OCR
- 创建精美的文档 --DOCX、Markdown和Excel,具有8种风格预设(包括“类似claude”的现代专业外观),正确呈现项目符号/编号列表、区块引用、超链接、代码块和嵌入在Markdown内容中的表格
- 通用读取和上传桥 --两者皆有
read-doc并且创建工具接受HTTPS URL+承载身份验证,因此任何Forge应用程序、Cloudflare Worker、AWS Lambda、Express服务器或其他后端都可以插入.doc处理器;你可以随心所欲地构建接收器。CogniRunner的Jira连接桥是参考实现,但模式是通用的。 现有的本地文件调用者不受影响。 - 精简或冗长的输出 --
clientHint参数允许宿主应用程序请求简洁的面向人类的消息或完整的代理元数据响应。 - 文件DNA --自动应用样式、页眉和页脚的项目级标识系统
- 自动分类 --将文档分为6类(合同、技术、业务、法律、会议、研究),并将其组织到子文件夹中
- 蓝图系统 --从现有文档中提取的结构模板或从重复模式中自动学习的结构模板
- 漂移检测 --通过基于指纹的比较来监控文档随时间的结构变化
- 族系跟踪 --自动来源链,记录哪些源文档通知了每个创建的文档
- 防止重复 --原子文件锁定和基于注册表的标题匹配以防止覆盖
- 文档注册库 --所有已创建文档的可搜索索引,包括类别、标签和标题过滤
工具
服务器通过MCP协议公开13个工具。每个工具都使用 action 或 mode 子操作参数(如适用)。
| 工具 | 动作/模式 | 描述 |
|---|---|---|
read-doc | summary, indepth, focused | 阅读和分析PDF、DOCX或Excel文件。概述;深入提取全文和元数据;专注地回答特定的问题。来源可以是本地 filePath 或遥控器 url + authHeader --看 从远程URL读取. |
detect-format | -- | 根据用户查询、标题和可选内容预览推荐文档格式和色调(markdown/docx/excel)。打电话之前 create-* 当未指定格式时。 |
create-doc | -- | 使用段落、表格、页眉、页脚和样式创建Word DOCX。支持模拟运行预览。 |
create-markdown | -- | 创建Markdown文档。 |
create-excel | -- | 创建具有多个工作表和样式的Excel XLSX工作簿。 |
edit-doc | append, replace | 编辑现有的DOCX文件。Append通过XML修补保留格式;替换会覆盖内容。 |
edit-excel | append-rows, append-sheet, replace-sheet | 编辑现有Excel工作簿。 |
list-documents | -- | 按类别、标记或标题搜索和筛选文档注册表。 |
list-templates | -- | 列出可用的蓝图模板 create-doc 可以验证。 |
dna | init, get, evolve, save-memory, delete-memory | 管理文档DNA——项目的自动样式和身份系统。 |
blueprint | learn, list, delete | 管理结构蓝图。期间自动学习 dna evolve 或从现有文档中手动提取。 |
drift-monitor | watch, check | 注册文档以监控和检测随时间推移的结构变化。 |
get-lineage | -- | 追踪任何文档的来源链--哪些来源通知了它,以及从中得出了什么 |
注: 以前版本的所有旧工具名称(get-doc-summary,get-doc-indepth,get-doc-focused,init-dna,get-dna,evolve-dna,save-memory,delete-memory,learn-blueprint,list-blueprints,watch-document,check-drift,search-registry)被接受为向后兼容的别名。
面向人类的用户界面输出精美(clientHint)
create-doc, create-markdown,以及 create-excel 接受可选 clientHint 参数:
"interactive"→ 响应消息是单行(`Created:
);像这样健谈的田野 enforcement, styleConfig, lineage, memoriesApplied` 省略。当最终用户直接读取响应时使用此功能(例如CogniRunner在Jira注释中显示结果)。
"agent"→ 用于AI消费的所有元数据的详细响应。这是默认行为。"auto"→ 对输入形状运行启发式,然后回退到MCP_CLIENT_TYPEenv var,然后"agent".
集 MCP_CLIENT_TYPE=interactive 在MCP服务器的环境中进行 "auto" 决心在所有通话中进行互动。
通用远程读取桥——从任何经过身份验证的端点读取文件
read-doc 适用于本地文件或由Bearer标头保护的远程HTTPS URL。远程形状是 镜像 下面的上传桥——同样的接线合同,同样的安全保证,同样的通用理念。文档处理器不在乎另一边是什么;任何返回JSON信封的HTTPS端点都可以工作。
参考实施: CogniRunner --伪造web触发器,将Jira附件暴露给本地LM Studio推理,这是一种一次性功能。将其用作您自己桥梁的模板。
决策:何时启动?
远程读取路径发生火灾 if and only if两者都有 url 和 authHeader 通过(以及 filePath 不是)。否则 read-doc 像以前一样在本地路径上工作。 现有的本地文件调用者100%不受影响。
调用形状
{
"url": "https://your-receiver.example/attachments/123?t=",
"authHeader": "Bearer ",
"mode": "summary"
}电线合同
预期端点将返回HTTP 200 Content-Type: application/json 以及以下主体:
{
"data": "",
"filename": "invoice.pdf",
"mimeType": "application/pdf",
"size": 256832
}read-doc 解码base64有效载荷,将其写入下唯一的每次调用临时目录 os.tmpdir(),运行现有的PDF/DOCX/XLSX提取管道,并在之后清理temp-dir(即使管道抛出)。
安全保障
与上传桥相同——完整列表见下一节。简言之:
- 仅HTTPS,无重定向,4xx上无自动重试,从未记录身份验证标头,在日志中编辑URL令牌,30秒超时,有效载荷大小上限为
READ_DOC_MAX_BYTES(默认值为50 MB)。
构建自己的远程读取源
它与上传接收器相反,因此下一节中相同的Forge/Express框架也适用。对于Forge,而不是向 /rest/api/3/issue/{key}/attachments,从 /rest/api/3/attachment/content/{id} base64将响应编码为上述JSON信封形状。CogniRunner仓库具有完整的模式。
mcp.json 例子
{
"mcpServers": {
"doc-processor": {
"command": "node",
"args": ["/absolute/path/to/mcp-doc-processor/src/index.js"],
"env": {
"READ_DOC_MAX_BYTES": "52428800",
"WRITE_DOC_MAX_BYTES": "26214400",
"MCP_CLIENT_TYPE": "agent"
}
}
}
}承载模型的应用程序(CogniRunner、您自己的Forge应用程序、具有额外上下文的Claude Desktop、内部post函数等)注入每次调用 url/authHeader 用于阅读或 uploadUrl/uploadAuthHeader 用于写入模型的提示符。doc处理器永远看不到应用程序,它只是发出有线合约。
通用上传桥——将文件附加到任何经过身份验证的端点
create-doc, create-markdown,以及 create-excel 可以选择上传他们刚刚写入的文件 任何HTTPS端点 它实现了一个小的、定义明确的合同。使用此功能:
- 将生成的文档附加到Jira问题(Atlassian Forge)
- 通过Slack bot lambda将生成的工作簿放入Slack频道
- 通过微型代理将生成的markdown文件推送到GitHub issue
- 将生成的PDF发送到Cloudflare R2/S3签名的URL接收器
- 连接到您的内部文档管理系统
文档处理者不知道也不关心另一边是什么。它只说了一个定义明确的电汇合同;你可以随心所欲地构建接收器。
参考实施: CogniRunner --一个Forge应用程序,它公开了每个问题的一次性上传功能,因此LM Studio模型可以将生成的文档附加回Jira票证。CogniRunner网络触发器约为150行,如果你正在构建自己的接收器,值得一读。
决策:何时启动?
上传桥起火 if and only if两者都有 uploadUrl 和 uploadAuthHeader 他们出现在通话中。否则,该工具的行为与以前完全一样——在本地写入文件,返回路径,响应中没有与上传相关的字段。 现有呼叫者和“正常”代理流100%不受影响。
| 呼叫者通过 | 行为 |
|---|---|
两者都没有 uploadUrl 也不 uploadAuthHeader | 只写本地。响应中没有与上传相关的字段。(默认) |
| 两者皆有 | 本地写作 然后 上传。响应增益 uploaded, uploadAttachment, uploadStatus, uploadError. |
| 只有一次 | 本地写入成功。响应已 uploaded: false, uploadError: "uploadUrl and uploadAuthHeader must be provided together". fetch 从未被召唤。 |
模型决定每次通话。如果你的应用程序将上传凭据注入模型的上下文(系统提示或每个工具的额外参数),模型就会使用它们。如果你不这样做,模型会忽略这些字段——没有什么可以填写的。
电线合同
请求(文档处理者→ 你的接收器)
POST
Authorization:
Content-Type: application/json
Accept: application/json
{
"data": "",
"filename": "q1-2026-strategy.docx",
"mimeType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"size": 27834
}成功响应(您的接收器→ 文档处理器)
HTTP 200, Content-Type: application/json:
{
"success": true,
"attachment": {
"id": "",
"filename": "q1-2026-strategy.docx",
"size": 27834,
"mimeType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"content": ""
}
}这 attachment.content 字段是模型交互模式响应消息中显示的内容——它应该是一个可用的URL(例如Jira附件内容URL),以便最终用户获得一个工作链接。
doc处理器允许任何2xx JSON形状——如果 attachment 它使用了整个身体,但建议使用上述严格的形状。
故障响应
文档处理器将这些逐字显示为 uploadError 和 不自动重试:
| 状态 | 含义 |
|---|---|
| 400 | 信封格式错误 |
| 401 | 承载不匹配 |
| 404 | 令牌过期/消耗(一次性) |
| 413 | 有效载荷对接收器来说太大 |
| 415 | 不允许的mimeType/扩展名 |
| 502 | 接收器的上游(如Jira)发生故障 |
| 500 | 接收器意外错误 |
接收器不得以3xx响应-- fetch 配置了 redirect: "error" 并在任何重定向时中止。
SENDER(文档处理器)提供的安全保证
- 仅限HTTPS。 无
https://URL之前被拒绝fetch被称为。 - 没有重定向。
redirect: "error"--接收器必须直接响应。 - 在任何4xx/5xx上都不会自动重试。 一次性语义是端到端的。
uploadAuthHeader从未记录 在任何级别。- 统一资源定位符
?t=令牌已被编辑 在日志输出中,只发出主机+路径。 - 没有缓存。 字节、URL、auth标头仅在一次调用期间有效。
- 有效载荷大小有限。 上限由
WRITE_DOC_MAX_BYTESenv-var(默认值为25 MB)。 - 60秒超时 在上传获取时。
- 上传失败时保留本地文件 --您的呼叫者可以重试或回退到本地路径。
您的收款人应提供什么
- 具有有效证书的HTTPS端点。
- 如果您使用URL+承载对(按请求造币、使用TTL存储、消费时删除、恒定时间承载比较),则具有一次性功能语义。
- 不要使用3xx——返回4xx/5xx和JSON正文。
- 在接收方验证文件扩展名;不要相信信封
mimeType该领域具有权威性。 - 审核上传事件日志(调用者、目标、文件名、字节)。
构建自己的接收器
Atlassian Forge网络触发器(CogniRunner模式)
接收JSON信封,验证一次性功能,通过以下方式转发到Jira的附件端点 api.asApp().requestJira().骨架(~50行):
import api, { route } from "@forge/api";
import storage from "@forge/kvs";
import FormData from "form-data";
import { timingSafeEqual } from "node:crypto";
export async function serveAttachmentUpload(request) {
const token = request.queryParameters?.t?.[0];
if (!token) return { statusCode: 404, body: "" };
const auth = request.headers?.authorization?.[0] || "";
if (!auth.startsWith("Bearer ")) return { statusCode: 401, body: "" };
const bearer = auth.slice(7);
const cap = await storage.get(`uploadcap:${token}`);
await storage.delete(`uploadcap:${token}`); // single-use: consume BEFORE any work
if (!cap || cap.expiresAt 25 * 1024 * 1024) return { statusCode: 413, body: "" };
const allowed = new Set([".pdf", ".docx", ".xlsx", ".md", ".txt", ".csv"]);
const ext = (envelope.filename.match(/\.[^.]+$/) || [""])[0].toLowerCase();
if (!allowed.has(ext)) return { statusCode: 415, body: "" };
const form = new FormData();
form.append("file", buf, { filename: envelope.filename, contentType: envelope.mimeType, knownLength: buf.length });
const jiraResp = await api.asApp().requestJira(
route`/rest/api/3/issue/${cap.issueKey}/attachments`,
{ method: "POST", body: form, headers: { Accept: "application/json", "X-Atlassian-Token": "no-check" } },
);
if (!jiraResp.ok) return { statusCode: 502, body: '{"error":"jira upstream failed"}' };
const created = (await jiraResp.json())[0];
return {
statusCode: 200,
headers: { "Content-Type": ["application/json"] },
body: JSON.stringify({
success: true,
attachment: {
id: created.id,
filename: created.filename,
size: created.size,
mimeType: created.mimeType,
content: created.content,
},
}),
};
}Express服务器(用于本地测试或非Forge用例)
import express from "express";
import { randomUUID } from "node:crypto";
const app = express();
app.use(express.json({ limit: "30mb" }));
const TOKEN = "test-token-123";
const BEARER = "Bearer test-bearer-456";
app.post("/upload", (req, res) => {
if (req.query.t !== TOKEN) return res.status(404).end();
if (req.headers.authorization !== BEARER) return res.status(401).end();
const { data, filename, mimeType, size } = req.body;
if (!data) return res.status(400).json({ error: "missing data" });
const buf = Buffer.from(data, "base64");
if (buf.length > 25 * 1024 * 1024) return res.status(413).end();
// Persist the file or forward it somewhere — your call.
console.log(`Received ${filename} (${mimeType}, ${size} bytes)`);
res.json({
success: true,
attachment: {
id: randomUUID(),
filename,
size: buf.length,
mimeType,
content: `https://your-storage.example/files/${filename}`,
},
});
});
app.listen(8443);(对于生产,通过真正的cert-doc处理器在前面终止TLS,拒绝非HTTPS。)
调用shape(您在模型的工具参数中输入的内容)
{
"title": "Q1 2026 Engineering Strategy",
"paragraphs": ["..."],
"uploadUrl": "https://your-receiver.example/upload?t=",
"uploadAuthHeader": "Bearer ",
"uploadFilename": "q1-2026-strategy.docx",
"clientHint": "interactive"
}这 uploadFilename 是可选的,并覆盖默认值(本地文件的基名)。当防重复自动为本地文件名添加后缀,并且您仍然希望接收器端有一个干净的名称时,这很有用。
响应形状(尝试上传时)
处理程序将四个字段附加到其正常响应中 仅当尝试上传时 (当提供了两个上传参数时)。对于没有上传参数的“正常”代理调用,这些字段都不会出现。
| 字段 | 类型 | 描述 | |
|---|---|---|---|
uploaded | 布尔值 | true 如果2xx, false 如果有错误路径 | |
uploadAttachment | object | null | 无论接收者返回什么 attachment |
uploadStatus | number | null | 来自接收方的HTTP状态码 |
uploadError | string | null | 上传失败时的错误消息 |
在 clientHint: "interactive" 模式下,响应消息折叠为一行:
- 成功: `Created and uploaded:
→ `
- 失败: `Created locally at
; upload failed: `
快速开始
安装
npm installMCP配置
添加到您的MCP客户端配置中(例如。, mcp.json, cline_mcp_settings.json或同等):
{
"mcpServers": {
"doc-processor": {
"command": "node",
"args": ["/absolute/path/to/mcp-doc-processor/src/index.js"],
"env": {}
}
}
}使用Vision OCR(云)
{
"mcpServers": {
"doc-processor": {
"command": "node",
"args": ["/absolute/path/to/mcp-doc-processor/src/index.js"],
"env": {
"Z_AI_API_KEY": "your-api-key"
}
}
}
}跑步
npm start服务器使用MCP JSON-RPC协议通过stdio进行通信。它被设计为由MCP客户端启动,而不是交互式运行。
风格预设
八个内置预设控制文档排版、间距和表格格式。通用的默认设置 create-doc 呼叫是 claude-like.
| 预设 | 字体 | 主体尺寸 | 关键特征 |
|---|---|---|---|
claude-like | 卡利布里 | 11磅 | 违约。 现代的蓝色口音、宽敞的空白、正确的项目符号/编号列表、区块引用、超链接、内联表——看起来像是一个精致的克劳德聊天答案,以文档的形式呈现 |
minimal | Arial | 11pt | 干净,瑞士风格,微妙的边界,浅斑马条纹 |
professional | Garamond | 11pt | Serif,对齐,小写标题,双倍行距标题 |
technical | Arial/Segoe UI | 11pt | 左对齐,层次结构强,表格对比度高 |
legal | Times New Roman | 12磅 | 双倍行距、带下划线的标题,无装饰元素 |
business | Calibri/Calibri Light | 11pt | 蓝色重音调色板,标题居中,底部有边框 |
casual | Verdana/Trebuchet MS | 12磅 | 暖橙色口音,友好的时事通讯风格 |
colorful | Segoe UI | 11pt | 紫青色渐变色调,充满活力的表头 |
当未指定任何预设时,类别会自动选择适当的预设:
| 类别 | 自动选择预设 |
|---|---|
| 合同 | 合法 |
| 法律 | 合法 |
| 技术 | 技术 |
| 商业 | |
| 会议 | 专业 |
| 研究 | 专业 |
增强型造型系统
增强的样式系统通过 src/tools/styling.js 模块:
颜色常量
该系统包括20多个命名颜色常数,以实现一致的样式:
| 颜色名称 | 十六进制代码 | 用法 |
|---|---|---|
WHITE | FFFFFF | 背景、主要文本 |
BLACK | 1A1A1A | 主文本,深色元素 |
BLUE | 2563EB | 主要口音,链接 |
GREEN | 22C55E | 成功状态、积极指标 |
RED | EF4444 | 错误状态、警告 |
YELLOW | EAB308 | 亮点、关注 |
ORANGE | F97316 | 暖色调 |
PURPLE | A855F7 | 创意口音 |
TEAL | 14B8A6 | 次要口音 |
INDIGO | 6366F1 | 专业口音 |
GRAY_50 | F9FAFB | 浅色背景 |
GRAY_100 | F3F4F6 | 微妙的背景 |
GRAY_200 | E5E7EB | 边框、分隔符 |
GRAY_300 | D1D5DB | 浅色边框 |
GRAY_400 | 9CA3AF | 次要文本 |
GRAY_500 | 6B7280 | 第三级文本 |
GRAY_600 | 4B5563 | 次要内容 |
GRAY_700 | 374151 | 主要内容 |
GRAY_800 | 1F2937 | 深色内容 |
GRAY_900 | 111827 | 最暗的元素 |
页面布局辅助工具
| 助手 | 目的 |
|---|---|
PAGE_WIDTH | 标准页面宽度(英寸)(8.5英寸) |
CONTENT_WIDTH | 内容区域宽度(6.5英寸) |
MARGIN_TOP | 顶部边距(1英寸) |
MARGIN_BOTTOM | 底边(1英寸) |
MARGIN_LEFT | 左边距(1“) |
MARGIN_RIGHT | 右边距(1“) |
标题助手
| 助手 | 目的 |
|---|---|
heading1(text) | 主文档标题(标题1样式) |
heading2(text) | 章节标题(标题2样式) |
heading3(text) | 小节标题(标题3样式) |
文本格式辅助工具
| 助手 | 目的 |
|---|---|
para(text) | 标准段落 |
bold(text) | 粗体文本 |
normal(text) | 具有可选样式的普通文本 |
spacer(height) | 垂直间距 |
divider() | 水平规则 |
列出帮助者
| 助手 | 目的 |
|---|---|
bulletItem(text) | 项目符号列表项 |
subBulletItem(text) | 嵌套项目符号列表项 |
桌子助手
| 助手 | 目的 |
|---|---|
infoTable(data) | 具有专业风格的信息表 |
gapTable(data) | 行间距表 |
statusBadge(text, status) | 状态指示器徽章 |
页面设置助手
| 助手 | 目的 |
|---|---|
createHeader(text, alignment) | 文档标题 |
createFooter(text, alignment) | 文档页脚 |
createPageProperties() | 页面布局属性 |
文件DNA
文件DNA(.document-dna.json)是一个项目级配置文件,它自动在此服务器创建的所有文档中应用一致的样式。
运作原理
- 初始化 --快跑
dna行动起来init使用您的公司名称、首选样式、页眉和页脚默认值创建DNA文件。 - 自动应用 --每一个
create-doc调用会检查DNA,并将其默认值应用于任何未明确提供的字段(页眉、页脚、样式预设)。 - 使用跟踪 --每次文档创建都会记录类别、样式和任何替代,以构建使用情况配置文件。
- 进化 --快跑
dna行动起来evolve分析使用模式。当系统检测到强烈趋势时(例如,“80%的文档使用业务预设”),系统会建议突变。使用apply: true自动应用顶级建议。 - 自动学习蓝图 --在演化过程中,会自动检测重复的文档结构并将其保存为蓝图。未来具有匹配模式的文档将获得
blueprintMatch回复中的建议。
存储器系统
使用 dna 行动起来 save-memory 存储文档首选项(例如,“合同始终使用1英寸的边距”)。记忆保存在DNA文件中,可供AI代理用于上下文。
继承
DNA支持三级继承:系统默认值(硬编码)\<项目DNA(.document-dna.json)\<用户DNA(.document-user.json).缺失的字段会延伸到下一个级别。
环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
Z_AI_API_KEY | -- | 视觉OCR服务的API密钥(同时检查 ZAI_API_KEY, ANTHROPIC_AUTH_TOKEN) |
Z_AI_BASE_URL | 自动检测 | 覆盖视觉API的基本URL |
Z_AI_VISION_MODEL | glm-4.6v | 视觉模型名称 |
Z_AI_TIMEOUT | 300000 | 请求超时(毫秒) |
SKIP_TABLE_EXTRACTION | true | 在PDF处理过程中跳过从图像中提取表格 |
READ_DOC_MAX_BYTES | 52428800 (50 MB) | 可接受的最大解码有效载荷大小 read-doc URL获取路径。在文件具体化之前,具有较大主体的请求会被拒绝。 |
WRITE_DOC_MAX_BYTES | 26214400 (25 MB) | 最大文件大小 create-* 工具将POST到远程 uploadUrl读取上限的一半,因为Forge网络触发器有效载荷限制更严格。 |
测试
npm test # Markdown format router (custom-assert)
npm run test:read-doc # read-doc URL-fetch — 14 tests (node:test)
npm run test:schemas # MCP schema invariants + detect-format E2E — 6 tests (node:test)
npm run test:render # parseMarkdownToDocx + create-doc round-trip — 15 tests (node:test)
npm run test:upload # uploadFileToTarget + create-doc upload integration — 18 tests (node:test)
npm run test:all # Run all five suites in sequence
npm run lint:no-console-log # Fail if any src/ file uses console.log (corrupts MCP stdio)生成的文件
服务器生成多个配置和数据文件:
.document-dna.json
记录DNA配置文件,其中存储:
- 项目级样式默认值(样式预设、类别、页眉/页脚)
- 使用统计(类别、样式、文档计数)
- 存储系统(保存的文档首选项)
- 自动学习文档结构
此文件由自动管理 dna 工具,不应手动编辑。
.document-blueprints.json
蓝图存储库,存储:
- 提取的文档结构
- 截面模式和要求
- 样式预设关联
- 创建时间戳
蓝图是通过以下方式创建的 blueprint action:'learn' 或在过程中自动学习 dna evolve.
docs/registry.json
文档注册表包含:
- 所有创建的带有元数据的文档
- 类别、标签和描述
- 血统追踪信息
- 创建和更新的时间戳
.document-user.json (可选)
从项目DNA继承的用户级DNA。允许在不影响团队设置的情况下进行个人覆盖。
建筑
mcp-doc-processor/
src/
index.js # MCP server entry, tool definitions, dispatch
tools/ # Tool handlers (one file per tool)
services/ # Business logic (lineage, drift, blueprints, OCR)
parsers/ # File-type parsers (PDF, DOCX, Excel)
utils/ # Shared utilities (logger, registry, DNA, categorizer)
docs/ # Generated documents (organized by category)
test/ # Test suites
logs/ # Server logs
.document-dna.json # Document DNA configuration
.document-blueprints.json # Blueprint repository
docs/registry.json # Document registry
.document-user.json # Optional user-level DNA依赖项
| 包装 | 用途 |
|---|---|
@modelcontextprotocol/sdk | MCP服务器SDK |
docx | DOCX生成 |
jszip | ZIP/DOCX XML操作 |
mammoth | DOCX文本提取 |
marked | Markdown标记化用于内联格式化 |
pdf-parse | PDF文本提取 |
xlsx | Excel读取 |
xlsx-js-style | 带样式的Excel编写 |
许可证
看 许可证 了解详情。
