mcpField
F
falzmarke

falzmarke

ローカル
falzmarke.com生産性1今日更新

falzmarke について

falzmarkeはMarkdownの内容をDIN 5008準拠のビジネスレターとしてPDF/Aにし、完成したPDFのレイアウトを測定します。CLI、Claudeスキル、MCP対応クライアントを通じて、再現性と検証性のあるビジネス文書を作成できます。

主な機能

  1. 01MarkdownからPDF/Aのビジネスレターを生成
  2. 02DIN 5008準拠のレイアウト描画
  3. 03完成PDFの幾何寸法を測定
  4. 04機械可読レポートと終了コード
  5. 05ブランド設定を再利用する送信者プロファイル
  6. 06CLI、Claudeスキル、MCPから利用

活用シーン

  1. 01Markdownからビジネスレターを作成
  2. 02印刷前に折り目と宛先欄の位置を確認
  3. 03CIでレターの描画と検証を実行
  4. 04MCP対応クライアントからレターを作成

MCP 対応

stdio経由のMCPサーバーを提供し、クライアントからレターの描画と検証を行えます。`falzmarke mcp`コマンドで起動します。

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"blitzsicht-falzmarke": {
"command": "uvx",
"args": [
"falzmarke"
]
}
}
}
起動コマンドuvx falzmarke

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

パッケージ
pypifalzmarke0.10.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

falzmarke — AIで、感覚ではなく規格に沿って手紙を作成。MarkdownからDIN 5008準拠の手紙をPDF/Aとして組版し、ミリ単位で検証します。

CI Release License: MIT Python 3.11+ DIN 5008


ほかのツールはPDFを生成します。falzmarkeは仕上がりを検証します。

内容をMarkdownで記述します。falzmarkeはそれをDIN 5008:2020準拠のビジネスレターとしてPDF/Aに組版し、その後、完成したPDFを計測します。折り位置が105.0 mmにない場合は、だいたい合っているだけの手紙を出すのではなく、処理をエラーで終了します。


動作の様子

ターミナルにサンプルレターのMarkdownが表示された後、falzmarke renderが実行され、PDFとプレビューが書き出されます。続いて計測レポートが表示され、適合した寸法の数を示す行で終了します。

実際のCLIをvhsで記録したものです。 スクリプトはdocs/marke/video/readme.tapeにあります。 テストでは記録内容を新たに実行した結果と照合し、実際には存在しないターミナル画面がここに表示されないようにしています(tests/test_tape.py)。


出力されるもの

レターヘッド、宛先欄、情報ブロック、件名

そして、その後に検証される内容です。各実行で出力されるレポートの抜粋です。

OK    Falzmarke 1, y: soll 105.00 ist 105.00 (tol ±0.3)
OK    Infoblock, x-links: soll 125.00 ist 125.00 (tol ±0.5)
OK    Betreff, y-Oberkante: soll 98.47 ist 97.91 (tol -1.75/+0.6)
OK    Abstand Betreff → Anrede (2 Leerzeilen): soll 12.70 ist 12.70 (tol ±0.2)

これは、ジオメトリレポートの34行のうち4行です。動画では、残りがどのように生成されるかを示しています。線が用紙上を進み、測定された各高さで停止します。測定結果が示す位置で停止します。この検証では、測定値がそのまま位置を表します。

用紙の横にテキストボックスが配置されたサンプルレター。緑色の水平線が用紙の上から下へ移動し、順に8か所で停止します。返送先表示は46,26ミリメートル、情報ブロックは50,34、宛先の1行目は62,69、最終行は77,86、件名は98,45、折り目マーク1は105,00、穴あけマークは148,50、折り目マーク2は210,00です。停止するたびに、検証名、目標値、測定値、許容誤差、「適合」の文字が横に表示されます。最後には8本すべての線が同時に用紙上に表示され、横に「34項目中34項目の検証に適合」と表示されます。

34項目のジオメトリ検証のうち、8項目は用紙上の高さを確認します。残りは幅、間隔、ページ上の位置を持たない特性を測定します。上にある35という数は、これより1つ多く数えています。render の後、CLIはPDF/Aへの準拠も確認しますが、それはミリメートル単位の位置では表せません。どちらの数も正しく、数えているものが異なります。

動画内の数値は一つも手入力されていません。すべて verify --json から取得され、tests/test_messfilm.py が動画を新しい測定実行の結果と照合します。誰かが折り目マークを2 mmずらすと、該当する停止位置が赤くならなければなりません。そうならない場合、テストは失敗します。

上のレポートの1行目には、プレビュー画像ではほとんど見えない線について記載されています。線の太さは0,25 ptです。拡大すると、該当箇所は次のように見えます。

レターの左端を切り取った、幅6ミリメートル、高さ4ミリメートルの画像。緑色の破線の補助線が105,00ミリメートルの目標位置を示し、同じ高さで、画像の幅の半分弱にわたる短い黒い折り目マークにつながっています。その横には、拡大箇所を囲む枠を付けた縮小表示の用紙全体があり、その下に測定位置105,00ミリメートルと表示されています。

ここで用紙を折り、窓付き封筒の窓に宛先が見えるようにします。マークの位置が間違っていると、書類の束も間違った位置で折られます。そして、それに気づくのは印刷後です。

問題点

レターテンプレートは、出力が正しいかどうかを検証できません。テンプレートがコピーされ、誰かが行をずらすと、完成した書類の束になって初めて間違いに気づきます。宛先が窓の範囲に収まらず、すべてを印刷し直して封入しなければなりません。自動化割引を利用して差し出す場合は、その送付分の割引も失います。

言語モデルがこの問題をさらに悪化させます。文章をうまく作成できますが、テキストを45,0 mmの位置に配置することはできません。AIに手紙を書かせると、内容は安定して良質でも、レイアウトは安定しません。

レンダラーにも誤りがある可能性があります。このレンダラーも例外ではありません。

そこでfalzmarkeは、3つの要素を分離します。内容はMarkdownで記述するため、読みやすく、バージョン管理もできます。レイアウトはレンダラーが設定し、常に同じ結果になります。そして検証では、レンダラーを信頼するのではなく、完成したPDFを測定します。

Word やプロンプトだけではだめなのですか?

ツールそのものではなく、一般的な作業の流れを比較しています。丁寧に管理されたテンプレートを使えば、多くのことは実現できます。

Word / LibreOffice のテンプレートAI に直接依頼した書状falzmarke
ソースを差分で確認・バージョン管理できる一部可能まれはい — Markdown と YAML
レイアウトを再現できるテンプレートと環境による保証されないはい — 同じレンダラーなら同じ出力
完成した PDF を計測するいいえいいえはい — 35 項目を全ページで計測し、誤差があればエラー
差出人プロフィール手動で管理一貫しないはい — 一度設定すれば、どこでも使えます
検査レポートを機械可読にできるいいえいいえはい — --json と終了コード
PDF/A がデフォルト自動ではない保証されないはい — 追加のフラグなし

得られること

  • 書状が窓付き封筒にぴったり収まります — 宛先欄、折り線マーク、穴あけマークを、設定時の想定ではなく完成した PDF 上で計測します。
  • 変更を追跡できます — Markdown と YAML はテキストファイルです。差分を見れば変更点がわかり、PDF はソースではなく成果物です。
  • 統一された見た目を、さまざまな書状に — プロフィールにはレターヘッド、フッター、ロゴ、色、デフォルト設定をまとめられます。署名も設定でき、書状ごとに上書きできます。
  • エラーを機械可読にできます — 入力、幾何情報、環境の各エラーに専用の終了コードがあり、--json も利用できます。これにより、CI や自動化で実行できます。
  • 長期保存を想定した設計です — 通常は追加のフラグなしで PDF/A-2b が生成されます。ファイルを埋め込む場合(すべての請求書が該当します)は、代わりに PDF/A-3b が生成されます (ADR 0033)。 ファイルが宣言された規格レベルに本当に準拠しているかを確認するのは、このツールではなく、PDF Association のリファレンス実装である veraPDF です。CI ではプッシュのたびに検証します。オプションで PDF/UA-1 も --pdfua で生成でき、同様に検証されます。
  • 会話でもターミナルでも — Claude スキルまたは CLI として、システムへのインストールなしで使えます。

これが正しいと分かる根拠

約束が果たされているかが決まる部分です。そのため、インストール手順より前に記載しています。

  • 測定するのは入力ではなく、完成した PDF です。 verify は生成されたドキュメントを pdfplumber で読み取り、ゾーン、マーク、間隔を目標値と比較します。

  • 重要な検査にはすべて反証テストがあります。 意図的にずらしたレイアウトに対して実行し、 そこで検出されなければなりません。一度も失敗しない検査手段は、証拠にはなりません。 これは上の画像にも当てはまります。画像は、提供されるレイアウトと、マークが 2 mm 低い レイアウトから、それぞれ一度ずつ生成されます。

    同じ範囲を交互に表示する画像。最初の状態では、折りマークが 105.00 ミリメートルの
破線の目標線上にあり、その下に 105.00 ミリメートルと、この状態で提供されるという
注記が表示されています。2 番目の状態では、マークが大きく下に移動し、目標線は
元の位置に残っています。その下に 107.00 ミリメートルと、ここでは verify が検出する
という注記が表示されています。

    2 つの範囲に違いがなければ、画像にマーク自体が表示されていません。その場合、上の 画像は役に立たず、tests/test_detailbild.py が失敗します。

  • Linux、macOS、Windows で、プッシュのたびに CI を実行します。

  • クリーンインストールのテストでは、この README に記載されたコマンドを実際に実行します。 誰も試したことのないコマンドは記載していません。

  • すべてのサンプル書簡を CI でレンダリングし、測定します。

  • PDF の適合性は、外部のツールで確認します。 このリストにあるそれ以外の検査はすべて、 PDF を生成したものと同じコードで測定しています。これは自己一致の証明であり、適合性の 証明ではありません。veraPDF は書簡を作成しておらず、レンダラーと コードを共有していません。確認するのは、提供するファイル自体が宣言している内容です。 提供するファイルを対象に、チェックサム照合も行い、意図的に不適合にした PDF が検査に 失敗することも反証テストで確認します (scripts/pdf_konformitaet.py)。

  • レイアウトの基盤は vendored で、チェックサムによって保護されています — vendor/README.md。

混同されがちな次の 2 つの主張を、このプロジェクトでは区別しています。

目標値が専門的な根拠に基づいていることと、検証ツールがそこからの逸脱を検出することは 別の事柄です。後者は証明されています。前者には限界があります。

目標値の出典: 寸法と表記規則は、公開されている文書に基づいています(一覧は skill/references/din5008.md)。DIN 5008:2020-03 の原文(正誤表 1:2020-07 を含む)との照合は 未完了です。個別の出典に基づく規則は、警告としてのみ機能します。各規則の根拠については 規則ごとの出典状況を、法的な意味については docs/recht.mdを参照してください。

python3 -m pytest -q

セキュリティ

記載しているのは、コードに書かれており、確認済みの内容だけです。falzmarke は独立した監査を受けていません。セキュリティに関する内容は、Issue ではなく SECURITY.md をご確認ください。

  • 処理はローカルで完結します。 レンダリング経路ではネットワークライブラリをインポートしません。
  • YAML の読み込みには safe_load のみを使用します。埋め込みプロファイルも含め、すべての箇所で同様です。
  • Markdown はノードタイプの許可リストに照らして検証します。リストにないものは、行番号付きのエラーになります。黙ってそのまま通すことはありません。
  • 書簡の本文が Typst コードになることはありません。 エミッターは本文をエスケープ済み文字列として渡すため、特殊文字が構造の外に出ることはありません。
  • プロファイルと書簡のファイルは、それぞれのフォルダー内にとどまります。 ロゴ、署名、独自のレターヘッドからフォルダー外を参照することはできません。シンボリックリンクは解決されます (確認テスト)。
  • Typst の実行は専用のルートディレクトリ内に制限され、システムフォントは無効になっています。
  • プログラムの依存関係はすべて寛容なライセンスのもとで公開されています — THIRD_PARTY_LICENSES.md。
  • CI アクションは、移動可能なタグではなく完全なコミット SHA に固定されています。

リリースアセットの出所は次の方法で確認できます。

gh attestation verify falzmarke.skill --repo blitzsicht/falzmarke

これにより、ファイルがどの実行とコミットに由来するかを確認できますが、ファイルに不具合がないことを証明するものではありません。SHA-256 ハッシュはリリースノートと、その横にある falzmarke.skill.sha256 に記載されています。

60 秒で始める

方法は 4 つあり、それぞれできることが異なります。

方法ネット接続なしでレンダリングサイズ用途
falzmarke.skill をアップロードいいえ。初回実行時にダウンロードします約 0.8 MBclaude.ai — アップロードダイアログの上限は最大 30 MBです
falzmarke-offline.skillはい — Typst コンパイラーが含まれています約 34 MBPyPI にアクセスできないサンドボックス。アップロードダイアログには大きすぎます
pipx / uvxいいえ。初回実行時にダウンロードします約 1 MBターミナル
リポジトリをクローンいいえ。初回実行時にダウンロードします約 1 MBツールの開発への参加

2 つの Skill パッケージの違いは、ファイル 1 つだけです。オフラインパッケージには typst ホイールが vendor/ に含まれていますが、軽量パッケージには含まれていません。2 つに分けている理由については、skill/vendor/README.md をご覧ください。

Claude を使う
  1. falzmarke.skill をダウンロード
  2. Claude の「設定」›「Capabilities」からアップロードします(コード実行に対応したプランが必要です)。 Claude Code では、シンボリックリンクだけで使えます。
    ln -s "$PWD/skill" ~/.claude/skills/falzmarke
    
  3. 「Muster GmbH 宛てに、……についての見積書を作成してください」
ターミナルで使う
uvx falzmarke init brief.md --profil example --betreff "Angebot Nr. 2026-0815"

または、常時インストールすると、以降は falzmarke render brief.md --png だけで使えます。

pipx install falzmarke

パッケージは PyPI で公開されています。未公開の main の内容を使う場合は、引き続き次のアドレスを指定してください。

pipx install git+https://github.com/blitzsicht/falzmarke

Typst コンパイラーは Python ホイールとして含まれています。システムへのインストールは不要で、LaTeX、wkhtmltopdf、フォントのインストールも必要ありません。

書簡がたくさんあるリポジトリで使う

書簡をバージョン管理している場合は、プッシュのたびに組版と寸法の検査を実行できます。

- uses: blitzsicht/falzmarke@main
  with:
    briefe: "briefe/*.md"
    profile: "profile"

その後、PDF は実行のアーティファクトとして添付されます。書簡の寸法が指定どおりでない場合は、ファイル名と寸法を示して実行が失敗します。これにより、書簡の一括送付用アーカイブで件名の位置がずれても、受取人ではなくプッシュ時に検出できます。入力項目は action.yml に記載されています。このアクションは PyPI から falzmarke をインストールするため、別のインストール手順は用意していません。実行を再現可能にするには、固定バージョンを指定してください。paket: "falzmarke==0.7.3"。

別の AI クライアントで

falzmarke は MCP に対応しているため、Claude スキルを知らないクライアントでも手紙を作成できます。

pip install 'mcp>=2,<3'          # das SDK ist nicht in der Grundausstattung
falzmarke mcp                    # Server über stdio

サーバーは公式 MCP レジストリに io.github.blitzsicht/falzmarke として登録されています。その上のコメント行は飾りではありません。レジストリはこれを使って、この PyPI パッケージがこのサーバー名に属していることを確認します。その際、PyPI 上のプロジェクト説明を読み込みますが、それがこのファイルです。

4 つのツール:brief_rendern、email_setzen、brief_pruefen、profile_auflisten。 レンダリングするたびに寸法レポートが付属します。PDF を返すだけで、寸法が正しいかどうかを明らかにしないサービスは、ほかの PDF ジェネレーターと変わりません。

コンテナ内での実行方法です。MCP ディレクトリでも同じようにビルドされます。 Dockerfile は ルートディレクトリにあります。

git clone https://github.com/blitzsicht/falzmarke.git && cd falzmarke
docker build -t falzmarke-mcp .
docker run --rm -i falzmarke-mcp   # `-i` ist nötig: der Server liest von stdin

送信者プロフィールは、呼び出し時にオブジェクトとして指定できます。サーバーのファイルシステムにアクセスできないクライアントでも、サーバーにたまたま保存されているプロフィールを使うのではなく、独自の送信者情報を渡せます。

このサービスが行わないこと:送信、保存、配達です。作成と検査を行います (ADR 0029)。

クローンから、インストールせずに実行
git clone https://github.com/blitzsicht/falzmarke.git
cd falzmarke
python3 skill/scripts/bootstrap.py
python3 skill/scripts/falzmarke.py render examples/brief-form-b.md --png

手紙を書く

---
profil: example
empfaenger:
  - Muster GmbH
  - Frau Erika Muster
  - Musterstraße 1
  - 12345 Musterstadt
datum: 2026-08-25
betreff: Angebot Nr. 2026-0815 über die Neugestaltung Ihrer Website
anrede: Sehr geehrte Frau Muster,
anlagen:
  - Angebot 2026-0815
---
vielen Dank für Ihre Anfrage vom 20. August 2026. Anbei erhalten Sie unser Angebot.

Die Umsetzung dauert ab Ihrer Freigabe **sieben Werktage**.
python3 skill/scripts/falzmarke.py render brief.md --png

すべてのフィールドはデータ契約に記載されています。そこにないフィールドがあると、行番号と修正案を示して処理を中断します。黙って破棄することはありません。

手紙本文で許可されているもの

Frontmatter の下に続くテキストはfalzmarke-Markdownであり、 CommonMarkの文書化されたサブセットです。

できることfalzmarke が自動で処理すること
段落、**太字**、*斜体*§ 5 に保護スペースを挿入
箇条書きと番号付きリスト-- を半角ダッシュ – に変換
行末の \ による強制改行"単語" を「単語」に変換
配置指定付きパイプテーブル

略語(z. B.)、日付(25. August)、単位(10 %、5 kg)、数値の前に置かれる略記(Tel.、Nr.)は、falzmarke が自動では処理しません。これらのルールについて記載している情報源は、いずれも 1 つを超えないためです。略語と日付については Wikipedia だけが情報源として挙げられており、2 つ目の一次情報源には記載がありません(#31)。そのため、置き換えずに警告します。該当箇所を行番号とともに報告するので、&nbsp; を使って自分でスペースを挿入してください(5&nbsp;km)。複数の情報源で裏付けられているルールについては、 ルールごとの情報源状況の表を参照してください。

リンク、画像、HTML はエラーです。行番号、理由、修正案を示し、黙って処理することはありません。紙の上にリンクはなく、本文中の画像は、その後に測定するレイアウトをずらすためです。

長い手紙では、小見出し(# から ####)、より深い階層の箇条書き、引用ブロック、原文どおりの抜粋を使用できます。Frontmatter で dialekt: "1.1" を指定すると、これらが有効になります。抜粋は文字単位でそのまま残ります。タイポグラフィ上の置換も、改行も、色付けも行わず、その中の内容が実行されることもありません。このフィールドがない場合はバージョン 1.0 が適用され、既存の手紙は変更なくレンダリングされます。

全項目については、falzmarke-Markdownを参照してください。

同じファイルをメールとして

フロントマターに typ: email を指定した文書は、PDFページではなく .eml になります。 同じソース、同じプロファイル、同じ署名です。

falzmarke email nachricht.md --html
OK  geschrieben: nachricht.eml
OK  geschrieben: nachricht.html
OK  verify: 22/22 Prüfungen bestanden

.eml はメールアプリで、.html はブラウザーで開きます。--oeffnen を指定すると、falzmarke は macOS で下書きを作成します。Thunderbird で、差出人、宛先、件名、本文、添付ファイル、送信ボタンがそろった下書きです。検証に合格した後にのみ作成されます。Mac 版 Outlook を使う場合は --programm outlook を指定してください。この方法が検証されていない環境(Windows、Linux、Apple Mail)では、ファイルを渡します。その場合、ファイルは下書きではなく閲覧ウィンドウとして表示されます。これはフォーマットの特性です。検証対象は完成したファイルです。 MIME 構造、format=flowed、スペーススタッフィング、署名区切り行、そして HTML に不適切なものが含まれていないか(スクリプト、外部スタイルシート、トラッキングピクセル、レイアウト用テーブルがないか)を確認します。falzmarke verify --email は、他の場所で作成されたファイルも検証します。

falzmarke は送信しません。 送信コマンドも、送信するオプションもありません。ファイルを作成する人はその内容に責任を負い、ファイルを送信する人は配達と送達証明に責任を負います。これは別々の二つの約束であり、falzmarke が担うのは最初のものだけです (ADR 0034)。下書きの作成はこれに影響せず、それ以上のことは行いません。下書きは作成しますが、送信は決してしません。制御スクリプトに送信コマンドはなく、テストではパッケージ全体を対象にこの点を検証します (ADR 0038)。

ファイルの構造、意図的に含めていないもの、制限については、メール版をご覧ください。四つのサンプルは examples/email/ にあります。

請求書:ZUGFeRD と XRechnung

フロントマターに typ: rechnung を指定した文書は、書簡として組版されると同時に、人には読めないデータセットを含みます。企業向けの請求書は ZUGFeRD XML を埋め込んだ PDF として、官公庁向けの同じ請求書は PDF を含まない純粋な XRechnung XML として出力されます。

falzmarke render rechnung.md                 # PDF/A-3b mit eingebetteter ZUGFeRD-XML
falzmarke xml xrechnung.md -o rechnung.xml   # nur die XML, für eine Behörde

成果物の検収は falzmarke 自身ではなく、CI 内の二つの外部ツールが行います。Mustang 2.26.0 は PDF と埋め込み XML を、それぞれのバージョンの Schematron ルールに照らして検証します。KoSIT Validator 1.6.3 は、公式設定を使って XRechnung を二重に検証します。

falzmarke は計算しません。 ソースから明細、税率、合計額を転記しますが、それらの計算は行いません。請求書番号の採番、記帳、督促、送信は行いません。これが具体的に何を意味し、何を明確に主張していないかについては、falzmarke での請求書をご覧ください。

Urkunden:宛名欄のない文書

合意書、宣言書、証明書:typ: urkunde を指定した文書では、件名の代わりにタイトルが付き、宛名欄はなく、手書きで署名するための線が設けられます。 レターヘッド、フッター、フォント、グリッドは、書簡と同じプロファイルから取得します。

falzmarke render vereinbarung.md   # setzt und misst nach — auch die Unterschriftslinien

本文では、そのための要素が2つ増えます(dialekt: "1.2"):下線の連続が固定長の線になる記入欄と、ヘッダーのない情報テーブルです。seiten_max: 1 を指定すると、文書が1ページに収まらない場合に処理が失敗します。

Urkunde の寸法はツールが定めたもので、DIN 5008 に基づくものではありません — この規格では宛名欄のない用紙について何も定めておらず、上記の書簡向けの寸法もここでは適用されません。文書の形式や有効性について、falzmarke は何も述べません。また、条項も扱いません。具体的な内容については、falzmarke を使った Urkundeをご覧ください。 examples/urkunde/に2つの例があります。

例

標準書簡書留複数ページ
Form BVermerkzoneFolgeseiten
情報ブロック付き Form B追記欄と注記欄ヘッダーとページ番号

このほかに、Form A、海外宛て住所、表、情報ブロックが長い書簡、英語表記の書簡(sprache: en — ドイツ語の寸法、英語の文言)があります — すべての例と完全なレンダリング結果をご覧ください。

制限事項

  • falzmarke-Markdown(CommonMark のサブセット):段落、太字、斜体、箇条書き、番号付きリスト、強制改行、パイプテーブルに対応しています。それ以外は、別の形式で黙って組版するのではなく、行番号を示してエラーになります。
  • 規格に定められた領域のサイズ:宛名は最大6行、注記は最大3行、情報ブロック内の値は最大21文字です。
  • 本文への画像の挿入はできません — ロゴはプロファイルに配置します。
  • DIN 5008 のみ。スイス(SN 010130)とオーストリア(ÖNORM A 1080)は対応予定です (#10)。フロントマターのフィールド norm: はそのために予約されています。
  • 電子署名には対応していません。署名画像は見た目を整えるものであり、証明にはなりません。暗号署名については #14で扱います。

さらに読む

コマンドすべてのサブコマンド、終了コード、検査内容
差出人プロフィールプロフィールの作成、検索順序、独自のレターヘッド
メール版.emlの構成、その内容と制限
falzmarkeで請求書を作成ZUGFeRD、XRechnung、検査内容と対象外の項目
データ契約各Frontmatterフィールドと例
falzmarke Markdown手紙本文でできること
標準寸法と出典目標値とその出典
falzmarkeが主張すること — しないこと標準に関する主張の範囲
リポジトリの構成レイヤー構成、ベンダリング、パッケージがskill/にある理由
ロードマップ作業の順序と、未完了の項目
変更履歴 · リリース変更内容

参加する

バグ報告や提案を歓迎します。CONTRIBUTING.mdをご覧ください。 幾何学的なエラーの場合は、verifyの出力を添付してください。添付がないと、レイアウトと測定のどちらに問題があるのか判断できません。

セキュリティに関する問題は、IssueではなくSECURITY.mdに従って報告してください。

由来と謝辞

Markdownは2004年にJohn GruberがAaron Swartzと共同で設計しました。その仕様はCommonMarkです(John MacFarlaneと協力者によるもの)。falzmarkeは、その文書化されたサブセットである**falzmarke-Markdown**を実装しており、意図的に3点で異なります。HTMLは決してそのまま出力せず、リンクは決して設定せず、ほかにリスト項目がない単独の2. Text行は警告します。その場合も開始番号を保持して設定するため、番号が気付かないうちに振り直されることはありません。

ページレイアウトは、Sematreによるtypst-letter-pro(MIT)に由来し、変更せずにベンダー化しています。チェックサムはvendor/README.mdにあります。falzmarkeはその上の層、つまりデータ契約、プロファイル、Markdown入力、測定機能、スキルを追加しています。

組版にはTypst(Apache-2.0)、解析にはmarkdown-it-py(MIT)、測定にはpdfplumber(MIT)とpypdf(BSD-3)を使用しています。フォントはLibertinusとSource Sans 3(どちらもOFL 1.1)です。PyMuPDF(AGPL-3.0)を置き換えた理由を含む完全な一覧は、THIRD_PARTY_LICENSES.mdにあります。

プログラムの依存関係はすべて許容的なライセンスの下にあります。そのため、falzmarkeはクローズドなシステムにも組み込めます。許容的でないのは、解説動画のレンダリングに使うRemotionだけです。これはプログラムには関与せず、同梱もされません。

DIN 5008はDIN Deutsches Institut für Normung e. V.の規格です。falzmarkeはDINの製品ではなく、DINとは一切関係がなく、認証を受けているとも主張しません。寸法の測定方法はdocs/normmasse.mdに記載されています。

最近の変更

直近2つのバージョンの全文です。CHANGELOG.mdから生成されています。変更はそちらに加えてから、python3 scripts/changelog.pyを実行してください。

v0.10.0 — 25.10.2026
新機能
  • **送信者の文体をプロファイルで指定できるようになりました。**新しいセクションemail.stil:では、person:(ichまたはwir)、独自のfloskeln:、自由記述のhinweise:を設定できます。lintは、文章で別の人称が使われている場合や、独自リストの言い回しが使われている場合に警告します。ただし、引用を一字一句そのまま転載している場合は除きます。hinweise:については形式だけを検査します。内容を読み取るのは文章を作成するモデルです(SKILL.mdの手順4)。falzmarkeは指示を引き継ぎますが、強制はしません(ADR 0053)。

  • Thunderbirdで下書きを作成できるようになりました。falzmarke email … --oeffnenを実行すると、Thunderbirdがインストールされている場合、コマンドライン経由でThunderbirdに下書きを作成します。プロファイルで指定した送信者、宛先、CC、BCC、件名、HTML本文、すべての添付ファイルが引き継がれます。Outlookを使用するのは、選択した場合のみです(--programm outlook)。Outlookはインストールされていてもライセンスがないことが多く、新しいOutlookではプログラム制御にアカウントが表示されないためです。Thunderbirdからは結果が返されません。終了コード0は「受け付けられた」という意味で、コマンドは確認できていないことを明示します。件名、本文、ファイル名に含まれる単一引用符はアポストロフィ’に置き換えられます。添付ファイルのファイル名にカンマが含まれる場合はエラーとなり、ファイルへのフォールバックを行います。署名のロゴはData URIとして本文に含められます。900 000バイトを超えるコマンドは実行せず、その長さを通知します(ADR 0049)。

  • --oeffnenは先に送信済みフォルダーを確認し、下書きはメールボックスに保存します。 過去24時間以内に同じ宛先へ同じ本文、同じバージョン、または同じ件名のメールを送信している場合、falzmarke email … --oeffnenは下書きを作成しません。SCHON GESENDETまたはGEÄNDERTE FASSUNGと報告して、終了コード4で終了します。--trotz-gesendetを指定すると、このチェックを回避できます。ローカルのIMAPプロキシに接続できる場合、Thunderbirdの下書きは送信者の「下書き」フォルダーに完成したメッセージとして保存され、すべてのヘッダーが含まれるため、In-Reply-Toも保持されます。この場合、ウィンドウは開きません。そこに同じ宛先と件名の下書きがすでにある場合、2通目は追加されません(--noch-ein-entwurf)。メールボックスに保存されるのはこの下書き1通だけで、送信、削除、移動は一切行われません。各.emlには、パスやファイル名を含まないソースのチェックサムであるX-Falzmarke-Fassungも設定されます。Thunderbirdは送信時にこの行を破棄するため、送信済みフォルダーでは件名と本文を照合します。終了コード4はこれまで「レンダラーのエラー」を意味していましたが、返されることはありませんでした(ADR 0051)。

  • 5つの状況別例と、削除する表現の一覧。 これまでスタイルリファレンスで扱っていたのは、見積もり、督促、解約、異議申し立てなど、手紙の種類でした。今回、それに加えて、メールの多くが書かれる状況、つまり見積もりへのフォロー、クレームへの返信、価格と値引き、サプライヤー、社内向けの例を掲載しました。さらに、「削除する表現」のセクションを追加し、機械的に聞こえる9つのパターンと、それに似ているものの残すべき例を並べています。決まり文句と同じ基準で、文に意味があるかどうかを判断します。ドイツ語のビジネス文書には当てはまらない英語の文章を人間らしくするガイドライン3つ(ダッシュを使わない、まっすぐな引用符を使う、三段構成を避ける)は、明示的に採用していません。タイポグラフィの処理では、ハーフダッシュと引用符「…」を意図的に使っており、テストでもその理由を守っています。

  • 下書きに含まれる不可視文字を報告します。 クリップボードから貼り付けたゼロ幅文字、ソフトハイフン、双方向テキスト制御文字、異体字セレクターは、これまでチェックされないまま完成した.emlやPDFに含まれていました。lintは該当する行と位置を報告するようになりました。内容は変更しません。falzmarkeがz. B.、§ 7、12 kgのように挿入する箇所にあるノーブレークスペースは報告されません(ADR 0052)。

    アップデート時の注意:これまで問題なかった箇所で、lintがエラーになる場合があります。 目的のない文字は警告ではなくエラーであり、その場合lintは終了コード1で終了します。同じファイルの請求書番号にU+200Bが含まれているケースで比較すると、v0.9.15では0 Fehler、終了コード0でしたが、今回は1 Fehler、終了コード1になります。そのファイルは以前から不正でした。文字は.emlとPDFに見えない状態で含まれていました。ただし、スクリプトやCIでlintを実行している場合、実行が止まるまでこの問題は分かりません。そのため、今回のリリースではバージョン番号の2番目の数字を上げています。

変更点
  • 意味のない表現を8つ追加。 email.floskelが判定するパターンはこれまで7つでしたが、現在は15個です。「注意することが重要です」「要約すると」「今日のような目まぐるしい時代において」「いつでもお気軽にご連絡ください」「この機会に申し上げたいのですが」「ご存じのとおり」「あらかじめお礼申し上げます」「ご検討いただけますと幸いです」を追加しました。採用条件はこれまでどおり厳格です。メッセージの内容を損なわずに、その一文を削除できることが条件です。そのため、「ご質問があればご連絡ください」は対象外で、「いつでも」を加えた表現だけが対象です。空虚なのは強調表現であり、連絡できること自体ではありません。候補のうち2つは明示的に却下し、ソースコード内に理由を記載しています。「〜の範囲で」と「〜だけでなく、〜も」は、内容を伝える場合もあります。それを区別できないパターンを採用すると、ほかのすべての判定への信頼を損ないます。引き続き「実務」のレベルで警告するだけで、内容は変更しません。
修正済み
  • メール本文がメールプログラムの色を継承するようになりました。 ダークテーマの Thunderbird の下書きでは、本文全体がほぼ黒に近い色で濃いグレーの背景に表示されていました。各ブロックに #1a1a1a が指定されており、ダークテーマに切り替える <style> ブロックも反映されていませんでした。本文に文字色も背景色も指定しないようになり、明るいテーマでは明るく、暗いテーマでは暗く、プログラムの色で表示されます。補足テキストは色をグレーにせず、サイズだけ小さくなりました。罫線は白地でも暗い背景でも見やすい中間色のグレーです。持ち込まれた署名は変更されません。テキスト部分も変更されません。

  • メールアドレス、ドメイン、URLが文書内で分割されなくなりました。 送信した文書では「ser-」が行末に来て、その下に「[email protected]」が続いたり、「blitzsicht.com/da-」の下に「tenschutz」が続いたりしていました。これを手入力すると、宛先に届きません。アドレスを含む単語は、末尾に付くカンマやピリオドも含めて、全体が次の行に移るようになりました。それ以外のテキストは引き続き分割されます。この動作は最大60文字まで適用され、証書の両端揃えのブロックでは40文字まで適用されます。表のセルでは、分割できない単語が後ろのテキストをずらすため、アドレスにハイフンを入れず、そこで分割しないようにしています。verify は、件名やセル内、境界をまたぐURLなど、完成したPDFで行末を越えているアドレスも報告するようになりました。このとき、同じ列にある行だけを組み合わせて判定します。

  • falzmarke serie がセミコロン区切りのCSVを読み込めるようになりました。 区切り文字に ; を使ったExcelファイルでは、ヘッダー行全体が1つの列として扱われるため、TypeError が発生していました。ヘッダー行から区切り文字 , または ; を判別するようになりました。それでもデータ行のフィールド数がヘッダーを上回る場合は、serie が読み込んだ区切り文字とともにエラーを報告し、クラッシュしません。

  • Thunderbird が署名を理由に添付ファイルの付け忘れを尋ねなくなりました。 falzmarke の下書きを送信するたびに、「添付ファイルを付け忘れていませんか?」と表示されていました。原因は署名の注意書きに「添付ファイル」という語が含まれていたことです。HTML 署名は moz-signature クラスを持つ要素に置かれるようになり、Thunderbird の添付ファイルリマインダーはこの部分を無視します。メッセージ本文自体に「同封」や「添付ファイル」と書かれている場合は、引き続き Thunderbird が尋ねます。これは意図した動作です。テキスト部分にはすでに署名区切り文字 -- が含まれていました(ADR 0051)。

  • 持ち込まれた署名も、本文と同様に色を継承するようになりました。 email.signatur_html を使うと、ダークテーマの Thunderbird の下書きで、名前、メールリンク、会社名、ラベルが暗い背景に暗い色で表示されていました。署名のダークテーマ用ルールは署名内の独自の <style> に記述されており、下書きには反映されないためです。挿入時に文字色と背景色を取り除き、明るい背景でも暗い背景でも見えにくい罫線は中間色のグレーに変更します。独自の背景色を持つボタンはリンクになります。構成、テキスト、リンク、ロゴは維持され、プロファイルフォルダー内のファイルは変更されません。

  • Thunderbird の下書きに署名が重複して表示されなくなりました。 Thunderbird の送信者アドレスに対応する識別情報に、添付ファイルまたは署名テキストとして署名が設定されている場合、falzmarke email … --oeffnen はプロファイルから取得した署名を下書きに含めず、識別情報とファイル名を1行で示します。標準プロファイルの prefs.js と user.js を読み取り専用で確認し、user.js の設定を優先します。識別情報を特定できない場合は、これまでどおりの動作となり、その理由を示します。.eml と .html には引き続き署名が含まれます(ADR 0050)。

v0.9.15 — 07.10.2026
修正済み
  • 「Rechnung」で略語に関する警告が発生しなくなりました。 これまで lint は、たとえば「unsere Rechnung für …」や「Rechnung Apple」のような場合にも、「Rechnung」が Nr. のような略語であるかのように、その後に保護スペースを必須としていました。付属のサンプルでは、このような警告11件のうち9件が誤検出でした。ルール schreibweise.kuerzel_vor_angabe は、実際の略語の後にのみ警告するようになりました。「Rechnung Nr. 2026-0815」では引き続き警告が出ますが、原因は「Rechnung」ではなく Nr. です。(#386)

これより前に34のバージョンがあります。全履歴は CHANGELOG.md をご覧ください。

ライセンス

MIT

コメント

MCP は初めてですか?

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

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