mcpField
P
pdf-letter-mcp

pdf-letter-mcp

ローカル
github.com/bitterdev生産性11 週間前に更新

pdf-letter-mcp について

pdf-letter-mcpは、構造化されたレター情報から印刷用PDFを生成するローカルMCPサーバーです。窓付き封筒に合うDIN 5008の配置を備え、固定レイアウトでオフライン生成する業務に適しています。

主な機能

  1. 01DIN 5008レイアウト
  2. 02PDF生成とプレビュー
  3. 03ローカル保存の差出人プロファイル
  4. 04署名画像の処理
  5. 05多言語テキストと住所規則
  6. 06改ページと継続ページのヘッダー

活用シーン

  1. 01DLまたはC6/C5窓付き封筒向けレターの作成
  2. 02印刷前の住所位置の確認
  3. 03差出人情報と署名画像の再利用
  4. 04対応言語でのレター生成

MCP 対応

レターの作成とプレビュー、署名画像の処理、DIN 5008の寸法確認、言語とフォントの一覧取得を行うツールをMCPクライアントに公開します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"bitterdev-pdf-letter": {
"command": "npx",
"args": [
"-y",
"pdf-letter-mcp"
],
"env": {
"PDF_LETTER_OUTPUT_DIR": "<PDF_LETTER_OUTPUT_DIR>",
"PDF_LETTER_FONT_DIR": "<PDF_LETTER_FONT_DIR>"
}
}
}
}
起動コマンドnpx -y pdf-letter-mcp
設定が必要な環境変数
PDF_LETTER_OUTPUT_DIRDirectory for generated letter PDFs, defaults to the system temp directory
PDF_LETTER_FONT_DIRAdditional font directory searched when a font family is resolved by name

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmpdf-letter-mcp1.0.3

ツール

7

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
bodystringはいレターのテキスト。空行で段落を区切り、"- " で箇条書き、"1. " で番号付きリストを開始します。**太字** と *斜体* に対応し、"\pagebreak" で強制的に改ページします。
datestringいいえISO 日付(2026-07-24)、"today"、または自由形式のテキスト。デフォルトは "today" です。
marksarrayいいえ宛先欄の上にある備考欄。最大 3 行。例:["Einschreiben"]。
placestringいいえ「場所、日付」の行に記載する場所。
copyToarrayいいえ
localestringいいえ固定テキストと日付形式の言語。対応:de、en、fr、es、it、nl、pt、pl、tr、da、sv、cs。"en-US" などの地域タグも受け付けます。デフォルトは "de" です。
senderobjectいいえ差出人。受取人の上に小さな返信先住所として印字されます。プロフィールを使用しない場合のみ必要です。プロフィールがある場合は常にプロフィールが優先されます。
sender.webstringいいえ
sender.citystringいいえ
sender.namestringいいえ
sender.emailstringいいえ
sender.phonestringいいえ
sender.regionstringいいえ米国、カナダ、オーストラリア形式の住所で使用する州または県。
sender.streetstringいいえ通り名と番地。
sender.companystringいいえ
sender.countrystringいいえISO 3166-1 alpha-2 コード(推奨)または国名。
sender.postalCodestringいいえ
sender.addressLinesarrayいいえ手動指定し、この住所の他のすべてのフィールドを置き換えます。
sender.postOfficeBoxstringいいえ住所の番地の代わりに使用します。例:"Postfach 12 34 56"。
sender.additionalLinestringいいえ部署、"c/o"、階数。
sender.salutationLinestringいいえ氏名の上に独立して記載する行。例:"Herrn"、"Frau"、"Firma"。
closingstringいいえデフォルトは、該当するロケールの結びの言葉です。
profilestringいいえ差出人の識別情報。こちらのマシン上のプロフィールファイルから取得します(list_profiles を参照)。プロフィールには住所、返信先住所の行、署名画像が含まれます。手入力の代わりにこれを使用してください。
subjectstringいいえ件名の行。DIN 5008 の規定に従い、"Betreff:" ラベルなしで印字されます。
metadataobjectいいえ
metadata.titlestringいいえ
metadata.authorstringいいえ
metadata.subjectstringいいえ
metadata.keywordsarrayいいえ
dateStyleenumいいえデフォルトは "numeric"(24.07.2026)です。numeric | long | iso
overwritebooleanいいえカウンターを付加せず、既存のファイルを上書きします。デフォルトは false です。
recipientobjectはい封筒の窓から見えるよう、DIN 5008 の宛先欄に配置する宛名。
recipient.webanyいいえ
recipient.cityanyいいえ
recipient.nameanyいいえ
recipient.emailanyいいえ
recipient.phoneanyいいえ
recipient.regionanyいいえ
recipient.streetanyいいえ
recipient.companyanyいいえ
recipient.countryanyいいえ
recipient.postalCodeanyいいえ
recipient.addressLinesanyいいえ
recipient.postOfficeBoxanyいいえ
recipient.additionalLineanyいいえ
recipient.salutationLineanyいいえ
signatureobjectいいえ結びの言葉の下に置く署名。画像はレンダラーによって拡大縮小され、配置されます。印字された氏名の上の空行に重ねられ、紙の署名と同じように結びの言葉にも意図的に重なります。この重なりは意図されたもので、補正してはいけません。
signature.namestringいいえ署名の下に印字する氏名。
signature.pathstringいいえPNG または JPEG ファイルへのパス。他の形式にはオプションの依存関係 sharp が必要です。
signature.trimbooleanいいえ画像の周囲の白い余白をトリミングします(sharp が必要です)。
signature.titlestringいいえ氏名の下に記載する役職または職能。
signature.base64stringいいえbase64 または data URL 形式の画像データ。path の代わりに指定できます。
signature.prefixstringいいえ署名の上の行。例:"i. A." または "ppa."。
signature.inkColorstringいいえインクの色を変更します。例:"#1a1a1a"(sharp が必要です)。
signature.removeBackgroundbooleanいいえスキャンした署名の白い紙の背景を透明にします(sharp が必要です)。
signature.backgroundThresholdnumberいいえremoveBackground の輝度しきい値。デフォルトは 0.85 です。
enclosuresarrayいいえ
outputPathstringいいえ出力先の PDF パス。デフォルト:PDF_LETTER_OUTPUT_DIR(または一時ディレクトリ)に、件名から生成した名前を付けたもの。
salutationstringいいえデフォルトでは、該当ロケールの一般的な呼びかけを使用します。
returnBase64booleanいいえPDF を base64 形式でも返します。デフォルトは false です。
subjectLinesarrayいいえ件名のすぐ下に追加する太字の行。一般的なドイツ語の手紙では、ここに参照情報を記載します。例:["Zeichen: 535 B 335D028418", "Kunden-Nummer: 335D028418"]。
countryDisplayenumいいえ国名の行を印字するタイミング。デフォルトは "auto"(外国の宛先に限る)。auto | always | never
returnAddressLinestringいいえ宛先の上に記載する返信先住所の行。差出人情報から生成され、"" を渡すと非表示になります。

詳細

pdf-letter-mcp

構造化された手紙データから印刷用PDFを生成する、ローカルのMCPサーバー(stdio)です。レイアウトは固定で、日常的なドイツ語の手紙に対応します。宛先住所はDIN 5008に従って配置され、DLおよびC6/C5の窓付き封筒の窓にぴったり収まります。ウェブサービスや外部APIは不要で、すべてお使いのマシン上でオフライン実行できます。

特長

  • レイアウトは1種類で、バリエーションはありません:差出人住所行、宛先、右揃えの「場所、日付」、参照情報を下に添えた太字の件名ブロック、頭語、本文、結語、署名、同封物
  • 高さ45 mmの住所欄は左端から105 mmの位置で終わり、差出人住所行、備考欄(Einschreiben、Nicht nachsenden)、住所欄を含みます
  • 差出人住所、備考、宛先は住所欄内でバランスよく配置されるため、ブロックが封筒の窓の中に均等に収まり、住所の行数が増えても入ります。addressLayout: "din" を指定すると、固定されたゾーン境界に戻ります
  • ページ区切りでは結語、署名画像、氏名、同封物をまとめて配置し、続きのページには宛先、日付、ページ番号を表示します
  • 件名は住所欄の33 mm下、場所と日付は住所欄の3行上に配置します
  • 折り目マークは105 mmと210 mm、穴あけマークは148.5 mmの位置に表示します
  • 左側にDIN 5008の25 mmの書字余白を設け、住所欄もそれに沿って配置するため、住所、件名、本文の左端が揃います。欄の右端は105 mmの位置に保たれ、幅90 mmの封筒窓の内側に収まります
  • 結語、空行1行、印字する氏名。signature.spaceMm を指定すると、手書き署名用のスペースを広げられます
  • 画像ファイルによる署名:アルファチャンネルを含む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で利用可能なプロフィールを確認できます。プロフィールも差出人も指定されていない場合、差出人を推測して作成するのではなく、手紙の作成を拒否します。

このファイルはリポジトリの外に置きます。profiles.jsonは.gitignoreに含まれています。

レイアウトは固定です

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:強制改ページ
署名

方法は2つあり、どちらも PDF 内では画像として扱われます。

  1. ファイルを直接渡します:signature.path と trim、removeBackground を指定します。スキャン画像はレンダリングのたびに整えられます。
  2. 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 ライセンスが適用されます。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。