关于 pdf-letter-mcp
pdf-letter-mcp 是本地 MCP 服务,可将结构化信件数据生成适用于打印的 PDF,并按 DIN 5008 定位地址以适配窗口信封。适合需要固定版式和离线生成信件的工作流。
主要功能
- 01DIN 5008 信件版式
- 02PDF 生成与预览
- 03本地存储发件人配置
- 04签名图片处理
- 05多语言文本与地址规则
- 06分页与续页页眉
适用场景
- 01制作适配 DL 或 C6/C5 窗口信封的信件
- 02打印前预览地址位置
- 03复用发件人信息和签名图片
- 04生成支持语言的信件
MCP 相关
向 MCP 客户端提供创建和预览信件、处理签名、查询 DIN 5008 几何规格以及列出语言和字体的工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y pdf-letter-mcpPDF_LETTER_OUTPUT_DIRDirectory for generated letter PDFs, defaults to the system temp directoryPDF_LETTER_FONT_DIRAdditional font directory searched when a font family is resolved by name本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
7收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| body | string | 是 | 信件文本。空行用于分隔段落,"- " 开始项目符号列表,"1. " 开始编号列表,支持 **粗体** 和 *斜体*,"\pagebreak" 强制分页。 |
| date | string | 否 | ISO 日期(2026-07-24)、"today" 或自由文本。默认值为 "today"。 |
| marks | array | 否 | 地址栏上方的备注区,最多 3 行,例如 ["Einschreiben"]。 |
| place | string | 否 | 用于“地点、日期”行的地点。 |
| copyTo | array | 否 | |
| locale | string | 否 | 固定文本和日期格式的语言。支持:de、en、fr、es、it、nl、pt、pl、tr、da、sv、cs。接受 "en-US" 等区域标签。默认值为 "de"。 |
| sender | object | 否 | 发件人,打印为收件人上方的小号回邮地址行。仅在未使用个人资料时需要;使用个人资料时始终以个人资料为准。 |
| sender.web | string | 否 | |
| sender.city | string | 否 | |
| sender.name | string | 否 | |
| sender.email | string | 否 | |
| sender.phone | string | 否 | |
| sender.region | string | 否 | 州或省,用于美国、加拿大和澳大利亚样式的地址。 |
| sender.street | string | 否 | 街道和门牌号。 |
| sender.company | string | 否 | |
| sender.country | string | 否 | ISO 3166-1 alpha-2 代码(推荐)或普通国家名称。 |
| sender.postalCode | string | 否 | |
| sender.addressLines | array | 否 | 手动覆盖此地址的所有其他字段。 |
| sender.postOfficeBox | string | 否 | 用于替代街道地址,例如 "Postfach 12 34 56"。 |
| sender.additionalLine | string | 否 | 部门、"c/o"、楼层。 |
| sender.salutationLine | string | 否 | 姓名上方的独立一行,例如 "Herrn"、"Frau"、"Firma"。 |
| closing | string | 否 | 默认值为相应语言区域的结尾敬语。 |
| profile | string | 否 | 发件人身份信息,取自此计算机上的个人资料文件(参见 list_profiles)。个人资料提供地址、回邮地址行和签名图像。使用此项代替手动输入发件人。 |
| subject | string | 否 | 主题行,按照 DIN 5008 的要求,不带 "Betreff:" 标签打印。 |
| metadata | object | 否 | |
| metadata.title | string | 否 | |
| metadata.author | string | 否 | |
| metadata.subject | string | 否 | |
| metadata.keywords | array | 否 | |
| dateStyle | enum | 否 | 默认值为 "numeric"(24.07.2026)。numeric | long | iso |
| overwrite | boolean | 否 | 覆盖现有文件,而不是添加计数器。默认值为 false。 |
| recipient | object | 是 | 收件人,位于 DIN 5008 地址栏中,以便显示在信封窗口内。 |
| recipient.web | any | 否 | |
| recipient.city | any | 否 | |
| recipient.name | any | 否 | |
| recipient.email | any | 否 | |
| recipient.phone | any | 否 | |
| recipient.region | any | 否 | |
| recipient.street | any | 否 | |
| recipient.company | any | 否 | |
| recipient.country | any | 否 | |
| recipient.postalCode | any | 否 | |
| recipient.addressLines | any | 否 | |
| recipient.postOfficeBox | any | 否 | |
| recipient.additionalLine | any | 否 | |
| recipient.salutationLine | any | 否 | |
| signature | object | 否 | 结束语下方的签名。渲染器会缩放并放置图像:图像覆盖在打印姓名上方的空白行上,并有意与结束语重叠,就像纸质信件上的签名一样。此重叠是预期效果,不应进行补偿。 |
| signature.name | string | 否 | 签名下方的打印姓名。 |
| signature.path | string | 否 | PNG 或 JPEG 文件的路径。其他格式需要可选依赖 sharp。 |
| signature.trim | boolean | 否 | 裁剪图像周围的白边(需要 sharp)。 |
| signature.title | string | 否 | 姓名下方的职位或职能。 |
| signature.base64 | string | 否 | 以 base64 或 data URL 表示的图像数据,可替代 path。 |
| signature.prefix | string | 否 | 签名上方的一行文字,例如 "i. A." 或 "ppa."。 |
| signature.inkColor | string | 否 | 重新着色墨迹,例如 "#1a1a1a"(需要 sharp)。 |
| signature.removeBackground | boolean | 否 | 将扫描签名的白色纸张背景设为透明(需要 sharp)。 |
| signature.backgroundThreshold | number | 否 | removeBackground 的亮度阈值,默认值为 0.85。 |
| enclosures | array | 否 | |
| outputPath | string | 否 | 目标 PDF 路径。默认值:PDF_LETTER_OUTPUT_DIR(或临时目录)加上根据主题生成的名称。 |
| salutation | string | 否 | 默认使用对应语言区域的通用称呼语。 |
| returnBase64 | boolean | 否 | 同时以 base64 格式返回 PDF,默认值为 false。 |
| subjectLines | array | 否 | 主题下方紧接着的其他粗体行。普通的德国信件通常在此处列出参考信息,例如 ["Zeichen: 535 B 335D028418", "Kunden-Nummer: 335D028418"]。 |
| countryDisplay | enum | 否 | 何时打印国家/地区行,默认值为 "auto"(仅针对外国收件人)。auto | always | never |
| returnAddressLine | string | 否 | 收件人上方的回信地址行。根据发件人生成;传入 "" 可将其隐藏。 |
详细介绍
pdf-letter-mcp
本地 MCP 服务(stdio),可将结构化信函数据转换为可打印的 PDF。仅提供一种固定版式:日常德语信函。收件人地址按 DIN 5008 定位,确保正好落在 DL 和 C6/C5 窗口信封的窗口内。无需 Web 服务或外部 API,所有操作都在你的计算机上离线完成。
功能
- 一种版式,无其他变体:回邮地址行、收件人、右对齐的“地点、日期”、下方带有参考信息的粗体主题栏、称呼、正文、结尾、签名、附件
- 地址栏高 45 mm,底边距左侧 105 mm,包含回邮地址行、备注区(挂号信、请勿转寄)和地址区
- 回邮地址、备注和收件人在地址栏内均匀排布,使整个区块在信封窗口中位置平衡,并能容纳更多地址行。
addressLayout: "din"可切换回固定区域边界 - 分页时将结尾、签名图片、姓名和附件保留在同一页;续页显示收件人、日期和页码
- 主题位于地址栏下方 33 mm 处,地点和日期位于其上方三行处
- 在 105 mm 和 210 mm 处设置折叠标记,在 148.5 mm 处设置打孔标记
- 符合 DIN 5008 的左侧 25 mm 书写边距,地址栏也沿用这一边距,因此地址、主题和正文共用同一左边缘。地址栏的右边缘保持在 105 mm 处,并位于 90 mm 宽的信封窗口内
- 结尾、一个空行、打印姓名。
signature.spaceMm可为手写签名预留更多空间 - 签名图片文件:带 alpha 通道的 PNG 可保留透明度;图片叠加在打印姓名上方的空行处,不会移动文本。扫描件可选裁剪、去除背景和重新着色墨迹
- 多语言:de、en、fr、es、it、nl、pt、pl、tr、da、sv、cs,支持区域设置感知的日期格式和各国地址规则
- 语言感知的断字、粗体/斜体标记、项目符号列表和编号列表,以及带续页页眉的自动分页
- 页码和可绘制 DIN 5008 区域的布局调试模式
- 内嵌 Unicode 字体(DejaVu)、任何已安装的系统字体或
.ttf路径
安装
npm install
npm run build
在 Claude Code 中注册此服务:
claude mcp add pdf-letter -- node "/absolute/path/to/pdf-letter-mcp/dist/src/index.js"
或在 ~/.claude.json / claude_desktop_config.json 中配置:
{
"mcpServers": {
"pdf-letter": {
"command": "node",
"args": ["/absolute/path/to/pdf-letter-mcp/dist/src/index.js"],
"env": {
"PDF_LETTER_OUTPUT_DIR": "~/Documents/Briefe"
}
}
}
}
环境变量
| 变量 | 用途 |
|---|---|
PDF_LETTER_OUTPUT_DIR | 生成的 PDF 的默认目录。默认使用系统临时目录。 |
PDF_LETTER_FONT_DIR | 按名称解析字体系列时搜索的额外目录。 |
PDF_LETTER_FONT | 所有信函使用的字体系列,例如 Arial。默认使用捆绑的 DejaVu Sans。 |
PDF_LETTER_FONT_SIZE | 所有信函的字号,单位为 pt,默认为 11。 |
PDF_LETTER_PROFILES | 发件人资料文件的路径,默认为 ~/.config/pdf-letter-mcp/profiles.json。 |
PDF_LETTER_PROFILE | 当信函未指定资料且文件中没有 defaultProfile 时使用的资料。 |
发件人资料
发件人地址和签名保存在本机文件中,不会放入提示词。信函指定一个资料,服务会原样填入地址、回邮地址行和签名图片。
{
"defaultProfile": "erika",
"profiles": {
"erika": {
"description": "Erika Musterfrau, privat",
"sender": {
"name": "Erika Musterfrau",
"street": "Musterstraße 12",
"postalCode": "12345",
"city": "Musterstadt",
"country": "DE"
},
"place": "Musterstadt",
"locale": "de",
"signature": { "path": "/pfad/zur/unterschrift.png" }
}
}
}
这样,create_letter 只需提供 "profile": "erika" 和内容。资料决定发件人身份:调用中传入的发件人或签名会被资料替换;place、locale 和 closing 则是默认值,信函可以覆盖。list_profiles 会显示可用资料。若既未指定资料,也未提供发件人,则会拒绝生成信函,而不是编造信息。
该文件应保存在仓库之外,.gitignore 中已包含 profiles.json。
布局固定
MCP 工具只接收内容:地址、日期、主题、参考信息、正文、签名、附件。没有用于设置页边距、间距、字体、图像大小或位置的参数,而且客户端发送的未知字段会被丢弃。字体排版是安装级设置(PDF_LETTER_FONT、PDF_LETTER_FONT_SIZE),因此同一安装生成的每封信外观都完全一致。用于公司信头、信息块和页脚的构建模块仍保留在库中,但无法通过 MCP 访问。
工具
| 工具 | 用途 |
|---|---|
create_letter | 排版信件并写入 PDF。返回路径、页数、布局指标和警告。 |
preview_letter | 执行相同的排版但不写入文件,用于检查布局。 |
prepare_signature | 清理扫描的签名(裁剪、透明背景、墨水颜色)并写入 PNG。 |
get_din5008_spec | 返回表格的毫米尺寸。 |
list_locales | 列出支持的语言及其固定文本。 |
list_fonts | 列出内置字体系列,并根据系统已安装字体解析字体名称。 |
create_letter
发件人只会显示在收件人上方的小号回信地址行中。地点和日期右对齐,位于加粗的主题块上方;参考信息紧接在主题下方。
{
"locale": "de",
"sender": {
"name": "Erika Musterfrau",
"street": "Musterstraße 12",
"postalCode": "12345",
"city": "Musterstadt",
"country": "DE"
},
"recipient": {
"company": "Stadtwerke Musterstadt",
"street": "Industriestraße 8",
"postalCode": "12345",
"city": "Musterstadt"
},
"place": "Musterstadt",
"date": "2026-07-24",
"dateStyle": "long",
"subject": "Widerspruch gegen die Jahresabrechnung vom 01.07.2026",
"subjectLines": ["Zeichen: SW-2026-0815", "Kunden-Nummer: 000000000"],
"body": "hiermit widerspreche ich der Jahresabrechnung.\n\n- korrigierte Abrechnung\n- Eingangsbestätigung",
"signature": {
"path": "/pfad/zur/unterschrift.png",
"widthMm": 45,
"removeBackground": true,
"trim": true,
"name": "Erika Musterfrau"
},
"enclosures": ["Kopie der Abrechnung"]
}
除 sender、recipient 和 body 外,所有内容均为可选项。称呼根据收件人推导(Frau 加上 Dr. Erika Mustermann 会生成 Sehr geehrte Frau Dr. Mustermann,),日期默认为今天,结尾敬语使用相应语言环境的默认值。
正文标记
- 空行:新段落
- 单个换行:换行(将
bodyMode设为markdown可改为重新排版) - item或1. item:项目符号列表或编号列表**bold**、*italic*- 单独一行的
\pagebreak:强制分页
签名
有两种方式,最终都会在 PDF 中生成真实图像:
- 直接传入文件:使用
signature.path以及trim和removeBackground。每次渲染时都会清理扫描图。 - 使用
prepare_signature清理一次并复用生成的 PNG。速度更快,还能在将签名放入信件前检查结果。
trim、removeBackground 和 inkColor 需要可选的 sharp 依赖项,该依赖项默认已安装。已有透明背景的 PNG 无需该依赖项即可使用。
图像采用叠加方式:结尾敬语、一个空行和打印的姓名位置保持不变,签名叠在该空行上,并覆盖结尾敬语,就像在纸上签名时覆盖「Mit freundlichen Grüßen」一样。这种重叠是预期效果。
大小和位置由渲染器决定,而非调用方。签名会缩放到大约与结尾敬语行同宽,即约 50 mm;按比例缩放的上限为该宽度的 1.2 倍,高度不超过 28 mm。没有用于设置宽度、高度、偏移或间距的参数,因此无法逐封信调整布局。
验证
npm test # geometry, address rules, typography, rendering
npm run examples # writes sample letters to examples/
examples/ 中包含德语信件、同一封信的英语版本,以及绘制 DIN 5008 区域的调试版本,可据此对照窗口信封检查地址栏的位置。preview_letter 会以 JSON 格式报告相同的测量数据,并在地址过长或无法放入地址栏时给出警告。
许可证
MIT,详见 LICENSE。捆绑的 DejaVu 字体受 Bitstream Vera 和 Arev 许可证约束。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。