acikpoz について
acikpozは、トルコの公共建設工事単価カタログPDFを構造化データに変換し、積算担当者、請負業者、監査担当者を支援します。ページの配置と価格列の見出しから解析し、未記載の価格を推測で補いません。
主な機能
- 01カタログPDFを構造化pozデータに変換
- 02ページやグループで解析範囲を指定
- 03JSONLとCSVへの出力
- 04カタログ年度間の単価比較
- 05コード、価格、単位の品質検証
- 06未価格項目と解析カバレッジの報告
活用シーン
- 01公式カタログPDFから積算データを作成
- 022年度のカタログ単価変動を比較
- 03積算ワークフロー前に解析品質を確認
- 04エージェント経由でカタログを照会し構造化結果を取得
MCP 対応
オプションのMCP依存関係を導入すると、acikpozはparse_catalog、diff、validateの3ツールを提供します。MCPクライアントはカタログ解析、年度間の変更、品質検査結果を構造化データで取得できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
acikpoz
PDF からデータに変換し、計算に使えるようにしたトルコの公共工事単価。
トルコの公共工事はすべて、政府のカタログに基づいて価格が決まります。ÇŞB (Çevre, Şehircilik ve İklim Değişikliği Bakanlığı)の birim fiyat(単価)冊子には、見積担当者、請負業者、監査担当者が参照する何千もの単価が掲載されています(poz とは、コード、説明、単位、価格の組です)。これらは長大な PDF 形式で提供されます。acikpoz は、そうしたページを決定論的に構造化レコードへと戻し、コスト見積もりや入札準備で、手作業で転記するのではなく、計算できるようにします。
これは言語モデルではなく、規律ある幾何学的処理です。ページ上の単語を視覚的な行にまとめ、固定位置を推測するのではなく、ページヘッダーから価格列の位置を読み取ります。この判断こそが信頼性を支えます。たとえば、Sıhhi Tesisat のように、1 行に 2 つの数値が印刷されているセクションもあります。実際の Birim Fiyat と、別項目の Montaj Bedeli です。単純なパーサーでは、気づかないうちに誤った数値を読み取ってしまいます。acikpoz はヘッダーを読み取るため、正しい列を読み取れます。
入札の 結果 を構造化する ihalent と組み合わせることで、acikpoz はトルコの公共工事経済のもう半分、つまり入札結果の基準となる 価格 を扱います。
決して破らない唯一のルール
価格として扱うのは、カタログの価格列に実際に印刷された数値だけです。型変換せず、隣の数値を借りず、推測もしません。意図的に設けたこのルールには、2 つの帰結があります。
- グループヘッダー poz — 実際の価格を持つサブ項目のカテゴリタイトル(
EVİYELER:など) — 自身の価格はありません。acikpoz はそのfiyatをNoneのままにし、is_group_headerフラグを設定します。ゼロを作り出すことはありません。 - カタログに価格が印刷されていない poz は、欠落として表示・集計され、隠されることはありません。すべての結果で網羅状況が報告されます。価格が付いた poz、ヘッダー、実際に価格が欠落している poz の件数が分かります。
コストツールの価値の半分は、元データに印刷されていない数値を作り出さないことです。これは andon や ihalent と同じ、誠実さを重んじる姿勢です。
インストール
pip install acikpoz # add [mcp] for the MCP server: pip install "acikpoz[mcp]"
クイックスタート
手元にある公式カタログ PDF を指定します(acikpoz に含まれるのはパーサーであり、データではありません)。
acikpoz parse bf2026.pdf --pages 8-20
acikpoz parse bf2026.pdf --json > pozes.jsonl # one poz per line, for pipelines
acikpoz parse bf2026.pdf --csv pozes.csv # Excel-ready (utf-8-sig, Turkish text)
acikpoz parse bf2026.pdf --group 25 # only Sıhhi Tesisat pozes
acikpoz parse bf2026.pdf --priced-only # drop headers and gaps
表形式での表示です。モックアップではなく、公開されている 2026 年版カタログを実際に処理した結果です。
この画像で重要なのは、次の 2 点です。
- 価格欄が
-の行が 3 つあります。カタログに価格が印刷されていないため、acikpoz も価格を出力しません。これらは欠落として数えられ、隣の行の価格で埋められることはありません。 - その後、
validateは解析結果のうち、確信が持てない部分にフラグを付けます。このページでは、5 つの単位(+2000、azami、Yapı、-30°C、2,5)が説明文の断片で、単位欄に入り込んでいます。レイアウトによっては抽出が不完全になるため、ツールは誤った単位を含む見た目だけ整った表を渡すのではなく、そのことを報告します。
再現するには、ページを選ぶだけです。他の条件は同じです。
acikpoz parse bf2026.pdf --pages 400
acikpoz validate bf2026.pdf --pages 400
カタログは省庁の公式ファイルで、こちらで公開されています。画像は scripts/make_demo_svg.py によって再生成されます。このスクリプトは PDF をダウンロードし、CLI と同じコードを実行します。
グレード(excellent/good/fair/poor)は、camelot が精度を示す方法のように、ひと目で分かる信頼度の指標です。good 未満の場合は、出力を信頼する前にページを確認してください。--json では、解析ごとに price_parse_rate と grade が含まれます。
Python から使う場合:
from acikpoz import parse_catalog
result = parse_catalog("bf2026.pdf", pages=range(8, 20))
for p in result.pozes:
if p.is_priced:
print(p.poz_no, p.birim, p.fiyat)
print(result.to_dict()["counts"]) # priced / group_headers / price_gaps
仕組み
- 行。 単語は垂直位置を基準に(数ポイントの許容範囲で)視覚上の行にまとめられ、左から右へ並べ替えられます。
- ヘッダーを基準にした価格欄。 右側(x > 400)にある
Fiyatヘッダーの単語から、価格欄の x 座標を特定します。左欄の説明文に「fiyat」が紛れ込んでいても、価格欄と誤認されることはありません。 - セル。 各ポズ行では、最も左のセルがポズコードです。価格は価格欄の x 座標に最も近い数値形式のトークンで、その左隣に単位があり、残りが説明文です。インデントされた続きの行は説明文に追加されます(次の行に流れ込んだ価格が含まれる場合もあります)。
- グループヘッダー。 説明文が
:で終わる価格なしのポズはカテゴリ名です。欠落として扱わず、フラグを付けます。
2 年分のカタログを比較する
カタログは定期的に再発行されます。積算担当者や監査担当者が手作業で確認するのは、「今年の単価は昨年からどのように変わったか」という点です。acikpoz diff を使うと、ポズコードを基準に 2 年分を結合し、各変更を分類できます。
acikpoz diff bf2025.pdf bf2026.pdf --pages 8-400
acikpoz diff bf2025.pdf bf2026.pdf --tolerance 1 # hide sub-1-TL rounding noise
acikpoz diff bf2025.pdf bf2026.pdf --json
価格の変動(Δ と %Δ)、追加・削除されたポズ、単位の変更、印刷された価格が付いた、または失われたポズに加え、その年の平均価格変動率を報告します。調査した範囲では、ÇŞB カタログの前年比較を行える他のオープンツールはありません。
解析結果を検証する
解析したカタログをコスト見積もりに使う前に、データが適切か確認しておくと役立ちます。acikpoz validate はポズに対して決定論的な品質ルールを適用します。ML も修正も行わず、問題を明らかにするだけです。
acikpoz validate bf2026.pdf --pages 8-400
acikpoz validate bf2026.pdf --json
重複したポズコード、不正な形式のコード、0 以下の価格(エラー)、および単位がない、または既知の単位セットに含まれない価格付きポズ(警告)にフラグを付けます。エラーが 1 件でもあるとゼロ以外の終了コードを返すため、パイプラインのゲートとして使えます(acikpoz validate … && build-estimate)。また、これにより acikpoz は自身の限界を率直に示せます。グループヘッダーに単位が一度だけ印刷され、各行がその単位を引き継ぐセクション(Sıhhi Tesisat)では、行ごとの単位検出が不確実です。validate はそのことを隠さずに報告します。価格、ポズコード、説明文の信頼性は保たれます。
AI エージェントでの acikpoz の使用
MCP サーバー(pip install 'acikpoz[mcp]' の後に acikpoz-mcp を実行)では、3 つのツールを利用できます。
parse_catalog(PDF → 網羅性を正直に示した構造化済みのポーズ)、diff(2 年分のカタログ
→ 分類済みの変更点)、validate(PDF → 品質に関する検出事項)です。エージェントは、解析が必要な文章ではなく、
構造化データを受け取ります。ihalent と組み合わせれば、エージェントは入札の結果と、その評価に使われた
単価の両方を横断して推論できます。
// e.g. Claude Desktop / Claude Code mcp config
{ "mcpServers": { "acikpoz": { "command": "acikpoz-mcp" } } }
対応範囲について、正直に
- 標準的なカタログレイアウトを読み取ります。 見出しに基づく列検出は、一般的な 1 列および 2 列の価格ページに適切に対応します。一方、珍しいレイアウトでは、空欄が増えることがあります。その場合も、見えないように取り繕うのではなく、その旨を報告します。セクションの解析に問題があれば、サンプルを添えて報告する価値のあるバグです。
- 価格データベースではなく、パーサーです。 カタログを同梱または再配布することはありません。公式 PDF を用意すると、acikpoz がそのコピーをデータに変換します。
- 価格は印刷されたとおりの名目価格です。 インフレ調整は組み込まれていません。該当する年を把握したうえで、呼び出し元が分析方法を決めます。
データについて、PDF をここに置いていない理由
ÇŞB のカタログは公式の公開文書ですが、このリポジトリでは再配布していません。含まれるのはパーサーだけで、それ以外はなく、.gitignore により *.pdf は除外されています。公式の入手元から取得したカタログを acikpoz に指定してください。これは、ihalent と同じ方針です。ツールは自分で管理し、データは同梱しません。
このプロジェクトの開発方法
私は建設分野で働く産業エンジニアで、これらのカタログを読んでいます。機械学習ではなく幾何学的な手法を使い、数値を捏造するのではなく欠落を正直に示す解析アプローチを設計し、すべてのコード行をレビューしています。実装を速めるために AI エージェントを多用しており、コミットのトレーラーにもそのことが記されています。品質を保証するのはテストです。実際のページが出力する正確な単語の配置を、2 列の Sıhhi Tesisat の落とし穴やグループ見出しのルールも含めてテストに記録しています。そのため、テストがすべて成功すれば、パーサーが実際のデータを扱えていることを意味します。
関連プロジェクト
- ihalent — トルコの公共調達を理解するための、もう一方のツールです。
acikpozは、作業の「本来の」費用を示す単価カタログを読み取り、ihalentは、落札結果とその割引率を示す入札結果通知を読み取ります。どちらも同じ方針に基づいています。すべての数値を出典まで追跡可能にし、何も捏造しません。
Eren Gülmez によるその他のツール。
ライセンス
MIT — LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。