gofact について
gofactは、フランスのフリーランスや小規模事業者向けのGoツールです。請求書のHTMLとデータからFactur-X PDF/A-3を生成し、生成前にEN 16931ルールを検証します。請求番号のローカル管理やSuperPDPへの送信にも対応します。
主な機能
- 01HTMLとJSONからFactur-X請求書を生成
- 02PDF/A-3にCII XMLを埋め込み
- 03生成前にEN 16931ルールを検証
- 04組織と連続する請求番号をローカル管理
- 05SuperPDPへ請求書を送信
活用シーン
- 01フランスのフリーランス向け適合請求書の作成
- 02MCP経由での請求書作成と管理
- 03生成済み請求書のSuperPDPへの送信
MCP 対応
stdioのMCPサーバーとして、組織、顧客、請求書関連のツールをMCPクライアントに提供します。送信には明示的な確認が必要です。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
gofact
🇫🇷 フランス語版
印刷用 HTML 請求書を、CII EN 16931 XML を埋め込んだ準拠 PDF/A-3 であるFactur-Xに変換する、小型の Go バイナリです。オプションで、フランスの電子請求書プラットフォーム(PDP — plateforme de dématérialisation partenaire)への送信も行います。
フランスのフリーランスや小規模事業者の請求書発行(フランスの電子請求書改革)向けに開発されており、creer-facture スキルを備えた Claude Code プラグインとしても提供されています。
パイプライン
JSON ──EN 16931 rules──▶ rejected if non-compliant (before producing anything)
──gofact──────────▶ factur-x.xml (CII EN 16931)
HTML ──headless Chrome─▶ PDF (identical to Ctrl+P output, backgrounds included)
PDF + XML ──pure Go─────▶ Factur-X (PDF/A-3 + VERBATIM embedding of the XML)
Factur-X ──self-check──▶ re-read (structure + integrity of the embedded XML)
そのまま埋め込み — 重要です。 XML はバイト単位でそのまま埋め込まれます。独自のモデルを通して再シリアライズするアセンブラーでは、拡張フィールドが失われます。特に PDP の電子ルーティングアドレス(BT-34/BT-49)が失われます。gofact は生成した XML に一切手を加えません。
システム依存関係
ブラウザーだけです。
- Chrome、Edge、Brave、または Chromium — HTML → PDF のレンダリング
Linux、macOS、Windows で自動検出されます(Edge はプリインストールされているため、設定は不要です)。サンドボックス化されたパッケージ(snap、flatpak)はスキップされます。gofact から渡される一時ファイルを読み取れないためです。特定の実行ファイルを指定するには、GOFACT_CHROME または -chrome を使用します。
PDF/A-3 の組み立ては Go(pdfcpu)で行われます。Ghostscript、Java、初回起動時のダウンロードは不要です。sRGB ICC プロファイルはバイナリに埋め込まれています。
準拠性
異なるタイミングで、2 つのチェックを行います。
- EN 16931 のビジネスルール:何かを生成する前に、モデルに対して適用されます。準拠していないと判定した請求書の発行は拒否され、ルール識別子(
BR-50、BR-CO-15など)と修正が必要なフィールドが報告されます。 - PDF のセルフチェック:書き込み後にファイルを再読み込みし、Factur-X の構造(
/AF、/OutputIntents、XMP、/EmbeddedFiles)を検証して、埋め込まれた XML と生成した XML がバイト単位で一致することを確認します。
PDF/A-3b への厳密な準拠性は、Mustang 経由で veraPDF を使って継続的インテグレーションで検証されます。ユーザーのマシン上では実行されません。
GOFACT_ORACLE_HTML=facture.html go test -tags=ci ./internal/facturx
ビルド
go build -o gofact .
go test ./...
設定
識別情報やシークレットがハードコードされることはありません。 請求書の発行者、支払い用 IBAN、PDP の認証情報は環境変数から取得されます。
cp .env.example .env # then fill in your own values
gofact は、すでに定義されている変数を上書きせず、次の順に読み込みます。-env で指定したファイル、指定がなければ ./.env、その後に $XDG_CONFIG_HOME/gofact/.env(デフォルトは ~/.config/gofact/.env)です。.env は Git の無視対象です。決してコミットしないでください。
| 変数 | 用途 |
|---|---|
GOFACT_SELLER_NAME | 販売者名。JSON に seller ブロックがない場合は必須です。 |
GOFACT_SELLER_SIRET / GOFACT_SELLER_SIREN | フランスの法人識別子(BT-30)。SIREN は SIRET から導出されます。 |
GOFACT_SELLER_VAT_NUMBER | EU 域内 VAT 番号(BT-31)。293 B の免税制度が適用される場合は空欄にします ⇒ BT-32 = SIREN。 |
GOFACT_SELLER_EMAIL | 販売者のメールアドレス。 |
GOFACT_SELLER_ADDRESS / _POSTAL_CODE / _CITY / _COUNTRY | 郵送先住所(国のデフォルトは FR)。 |
GOFACT_SELLER_ELECTRONIC_ADDRESS / _SCHEME | Peppol ルーティング BT-34。空欄の場合 ⇒ SIREN とスキーム 0225。 |
GOFACT_PAYEE_IBAN | 支払い用 IBAN(BT-84)。空欄の場合 ⇒ 請求書から省略されます。 |
GOFACT_VAT_EXEMPTION_MENTION / _CODE | 免税に関する既定の記載とコード(293 B)。 |
SUPERPDP_CLIENT_ID / SUPERPDP_CLIENT_SECRET / SUPERPDP_BASE | -send 専用の PDP 認証情報(シークレット)。 |
販売者が設定されていない場合、gofact は不完全な請求書を発行せず、明示的にエラーになります。すべての値は、請求書ごとに JSON から上書きすることもできます。
MCP サーバー — AI に話しかけて請求書を作成
gofact mcp は、請求書発行機能を ローカル MCP サーバー(stdio) として公開します。Claude
Desktop、Claude Code、LM Studio、または任意の MCP クライアントから、「ACME 宛てに、2 日分を €600 で請求する請求書を作成して」と伝えるだけで十分です。AI がインターフェースとなり、gofact が請求書番号(連続した法的番号、ロックおよびトランザクションによる割り当て)、EN 16931 への準拠、アーカイブをローカルで保証します。
# Register in Claude Code, for example:
claude mcp add gofact -- /path/to/gofact mcp
ツール:list_organizations、get_organization、init_organization、update_organization、
search_client、get_invoice_template、preview_next_number、list_invoices、
create_invoice、send_invoice(唯一の破壊的なツール — PDP への送信には明示的な確認が必要)、get_invoice_status。プロンプト:nouvelle-facture。
組織(発行事業体)は、それぞれ独立して完結するディレクトリです。.env に事業者情報、numerotation.json に番号登録簿、journal.ndjson に監査ログ、初回発行時に固定される請求書テンプレート、そして請求書そのものが含まれます。CLI で管理するには、gofact org list | init | show を実行します。ツールの応答から秘密情報が外部に出ることはありません。
使用方法(CLI)
# Simplest form: -data and -out derived from the HTML file name
gofact -html "2026011 - Client.html"
# → reads "2026011 - Client.json", writes "2026011 - Client.pdf"
# Explicit paths + XML dump for debugging
gofact -html f.html -data f.json -out f.pdf -xml f.xml
# Options
-env <path> # explicit .env file
-validate=false # skip the self-check of the produced PDF
-chrome <path> # force the Chrome executable
-q # quiet (errors only)
Factur-X が生成されると(-validate を指定した場合は準拠が確認されると)、終了コード 0 が返されます。
PDP への送信(SuperPDP)
gofact は Factur-X PDF を SuperPDP に送信します(OAuth2 クライアント認証情報を使用)。
# generate then submit in one command
gofact -html f.html -send -poll
# submit an already-generated PDF
gofact send -pdf f.pdf -poll
PDP では、請求書の販売者が認証済みアカウントの会社と一致している必要があります (法的識別子 BT-30)。また、発行者と受取人の両方に 電子ルーティングアドレス (BT-34/BT-49、スキーム
0225)が必要です。以下のelectronic_addressを参照してください。-pollを指定すると、ライフサイクルが表示されます(fr:200送信済み →fr:201発行済み →fr:202受領済み)。
JSON 形式(サイドカー)
すべての金額は セント単位(整数)です。販売者、IBAN、VAT 制度、フランスの法定記載事項には デフォルト値(環境変数)が設定されています。JSON には変動する項目のみを記述します。
{
"number": "2026011",
"type": "invoice",
"issue_date": "2026-06-29",
"buyer_reference": "D2026004",
"buyer": {
"name": "ACME SAS",
"siret": "55208131700015",
"email": "[email protected]",
"address": "1 rue de la Paix",
"postal_code": "75002",
"city": "Paris",
"country_code": "FR"
},
"lines": [
{ "name": "Développement", "unit": "day", "quantity": "2.00",
"unit_price_ht_cents": 60000, "amount_ht_cents": 120000 }
]
}
省略可能なフィールド:due_date(デフォルトは「受領時」=発行日)、delivery_date(デフォルトは発行日)、currency(デフォルトは EUR)、vat(デフォルトは 293 B 免税。標準 VAT を適用するには {"exempt": false, "rate_pct": "20.00"} を設定)、seller、iban、title(請求書の件名。登録簿に記録されます)、notes。
注記:フランスの法定記載事項である 3 項目 — 遅延損害金(PMD)、回収費用(PMT)、割引(AAB)— は常に出力されます(BR-FR-05)。notes はこれらに 追加 されます。subject_code のない注記は一般情報(AAI)として出力されます。PMD、PMT、AAB のいずれかを指定した注記は、そのコードのデフォルト記載事項を置き換えます。どの仕様でも、これらを省略することはできません。生成は拒否されます。
PDP ルーティング:seller/buyer では electronic_address(BT-34/BT-49)と electronic_address_scheme(例:"0225")を指定できます。PDP は郵便住所ではなく、これらのアドレスを使ってルーティングします。アドレスが指定されていない場合、各当事者は 0225 スキームを用い、SIRET から導出された SIREN に基づいてルーティングされます。メールアドレス(EM)が使われるのは、法的識別子が不明な場合のみです。メールアドレスはディレクトリに登録されないため、この場合 send_invoice は預託を拒否します。例(販売者の上書き):
"seller": {
"name": "Studio Exemple", "siren": "123456789",
"electronic_address": "123456789", "electronic_address_scheme": "0225"
}
インストール
プリコンパイル済みバイナリ(GitHub リリース、ツールチェーン不要):
curl -fsSL https://raw.githubusercontent.com/kolapsis/gofact/main/install.sh | sh
gofact install -yes # registers the MCP server in the detected clients
gofact install は Claude Desktop、Claude Code、LM Studio、Cursor を検出し、書き込む内容を表示します(デフォルトではドライラン)。変更前にすべてのファイルをバックアップし、-force を指定しない限り、内容が異なるエントリを上書きすることはありません。Windows の場合:install.ps1。
パッケージマネージャー — cask とマニフェストはこのリポジトリにあるため、URL を明示しています(Homebrew の短縮形 brew tap には homebrew-* というリポジトリ名が必要です。また、Homebrew core と Scoop のメインバケットはどちらも人気度のしきい値を設けており、gofact はまだその基準に達していません):
brew tap kOlapsis/gofact https://github.com/kOlapsis/gofact
brew install kOlapsis/gofact/gofact
scoop bucket add gofact https://github.com/kOlapsis/gofact
scoop install gofact
Claude Code プラグイン — このリポジトリはプラグインでもあります:creer-facture スキルと、宣言済みの MCP サーバー:
/plugin marketplace add kolapsis/gofact
/plugin install gofact@gofact
ソースからビルドする場合:go build -o gofact .
組織のデータはローカルディレクトリ(ID、登録情報、請求書)に保存されます。実データが含まれるため、このリポジトリではバージョン管理しません。従来のスキルとの互換性のため、GOFACT_INVOICES_DIR も引き続き使用できます。
既知の制限事項
- レンダリングには Blink ブラウザーが必要です。サンドボックス化されたパッケージ(snap、flatpak)は
$HOMEの外部を読み取れないため、無視されます。 - VAT 税率は単一です。複数税率には対応していません。
- 通貨が EUR 以外の場合、EUR 建ての VAT 換算額(BT-111)は上流で指定する必要があります(モデルの
VATEurフィールド)。現時点では JSON に公開されていません。 - 実装されている PDP は 1 つのみです(SuperPDP)。
ライセンス
GNU AGPL v3 以降 — LICENSE を参照してください。
Copyright (C) 2026 Benjamin Touchard.
gofact はフリーソフトウェアです。Free Software Foundation が公開する GNU Affero General Public License(バージョン 3、またはそれ以降の任意のバージョン)の条件に従って、再配布および変更できます。本ソフトウェアは有用であることを願って配布されますが、商品性や特定目的への適合性についての黙示的な保証を含め、いかなる保証もありません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。