Prozorro について
Prozorroは、ウクライナの公共調達データを分析するMCPサーバーとコマンドラインツールです。指定地域のデータをローカルDBに同期し、APIキーやLLM呼び出しなしで入札、供給業者、競合、計画、リスクを分析できます。
主な機能
- 01地域と期間を指定した公開データの同期
- 02入札と今後の調達計画の検索
- 03買い手、供給業者、競合の分析
- 04市場指標の算出とリスク兆候の検出
- 05MCPサーバーまたはコマンドラインでの利用
活用シーン
- 01地域別の募集中入札と期限の確認
- 02入札前に調達計画を調査
- 03供給業者の落札実績と競合記録の比較
- 04確認が必要な調達パターンの発見
MCP 対応
ローカルサーバーはstdioまたはストリーミングHTTPで、調達検索と分析のツールをMCPクライアントに公開します。大半のツールはローカルDBを読み取り、stdioサーバーではデータ同期と保存済み検索の管理もできます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
prozorro-mcp
Prozorro(ウクライナの公共調達システム)のMCPサーバーおよびコマンドラインツールです。選択した地域の公式オープンデータをローカルに保存します。その後、AI アシスタント (Claude、Cursor、VS Code Copilot など)やCLI単独で、次のような質問ができます。
- 「リヴィウ州で試薬の入札を募集中の案件はどれですか?締め切りはいつですか?」
- 「来月、私の地域の病院は何を購入する予定ですか?まだ入札になっていない計画を表示してください。」
- 「この地域で小麦粉の入札を最も多く落札しているのは誰ですか?1キログラムあたりの価格はいくらですか?」
- 「通常、どの事業者(EDRPOU 12345678)と競合していますか?その事業者に対する勝率はどのくらいですか?」
- 「この発注者に懸念事項はありますか?入札者が1社だけの案件や、特定の供給業者に支出の大半が集中している案件などです。」
すべての数値はデータからコードで算出し、アシスタントはテキストを作成するだけです。APIキーは不要です。Prozorro APIは公開されており、このツールからLLMが呼び出されることはありません。
開発者以外の方向けのウクライナ語のステップ別ガイド:docs/guide.uk.md。
1分で試す(同梱デモ、同期不要)
uv(または通常の pip install prozorro-mcp)が必要です。
uvx prozorro-mcp search --demo --query борошно --status any
デモには、リヴィウ州の1週間分(2026年10月5日〜12日)の実際のスナップショットが含まれています。入札案件は5,479件で、そのうち1,120件に公開入札があり、今後の計画は1,619件です。連絡担当者の情報は削除されています。
Claude Desktop:ワンクリック拡張機能
prozorro-mcp.mcpbをダウンロードして開くか、設定 → 拡張機能にドラッグしてください。Claude DesktopがPythonとパッケージを自動でインストールするため、ほかにインストールするものはなく、設定ファイルを編集する必要もありません。インストール画面で、対象の州(例:Львівська, Волинська)と過去のデータを取得する日数を入力してください。
地域データはバックグラウンドでダウンロードされます。最初のダウンロードが完了するまでは、Claudeはデータの準備ができていないことを伝え、進行状況を表示します。設定を空欄のままにすると、Claudeが対象の州とダウンロードする日数を尋ねます。起動するたびに、前回からの変更分が取得されます。後から地域を追加するには、Claudeに 「過去2週間分のヴォルィーニ州をダウンロードして」 と尋ねてください。
ほかのAIクライアントへの接続
サーバーはstdio経由でローカル実行します。使用するクライアントを選んでください。
Claude Code
claude mcp add prozorro -- uvx prozorro-mcp serve
拡張機能を使わないClaude Desktop:設定 → 開発者 → 設定を編集。ファイルはWindowsでは
%APPDATA%\Claude\claude_desktop_config.json、macOSでは
~/Library/Application Support/Claude/claude_desktop_config.jsonです。
{
"mcpServers": {
"prozorro": {
"command": "uvx",
"args": ["prozorro-mcp", "serve"]
}
}
}
Cursor(~/.cursor/mcp.json)、Windsurf、Cline、その他のクライアント:Claude Desktopと同じmcpServersブロックを使用します。
VS Code(.vscode/mcp.json):
{
"servers": {
"prozorro": {
"type": "stdio",
"command": "uvx",
"args": ["prozorro-mcp", "serve"]
}
}
}
まずデモで試すには、"serve"の後に"--demo"を追加してください。設定を編集した後は、クライアントを再起動してください。
ブラウザー版のChatGPTとclaude.aiは、HTTPS経由のリモートサーバーにのみ接続できます。HTTPモードを参照してください。
自分のデータを同期する
uvx prozorro-mcp sync --region Львівська --days 7
- 地域は、どの表記でも使用できます:
Львів、львовская、Lviv、Kyiv city、Київська。複数指定する場合は、--regionを繰り返します。軍事部隊は法律により住所が非公開のため、入札には地域がありません。--region "без регіону"を指定して追加してください。 - 初回同期では、変更フィードを新しい変更から順にさかのぼって取得するため、現在受付中の入札は最初の数分で取り込まれ、期間の開始位置で停止します。データ量の多い州では、1週間分のデータの取得に約20分かかります(Lvivの場合、入札約5,500件と同数の計画で、ディスク上では約350 MB)。ほとんどの時間は公開 API の応答待ちで、API には一度に5件のリクエストを送信し、再試行も行いながら、負荷をかけないようにアクセスします。対象のカテゴリーだけに絞るには、
--cpv 33(または--cpv реактиви)を指定します。 - 次回以降の実行(オプションなしの
prozorro-mcp sync)では、前回の実行以降に変更されたデータだけを取得します。Ctrl+C で安全に中断できます。コマンドを再実行すると、中断したところから続行します。 - サーバーからの同期:
prozorro-mcp serve --sync-on-startを実行すると、クライアントの起動時にバックグラウンドで変更分を取得します(対象範囲を広げるには--regionと--daysを追加します)。初回同期の前は、データツールは州と期間をユーザーに確認するよう求めるno_dataを返します。同期中の結果にはsync_in_progressが付与されます。 - ステータス:
prozorro-mcp statusで同期済みの範囲を確認できます。データは~/.prozorro-mcp/data.dbに保存されます。保存先を変更するにはPROZORRO_MCP_DBを設定します。
AI クライアントなしで使う
同じ数値をテーブル、CSV(キリル文字を保ったまま Excel で開けます)、または JSON で取得できます。uv tool install prozorro-mcp でコマンドを一度インストールしてから、次を実行します。
prozorro-mcp search --cpv реактиви --region Львівська # open tenders, nearest deadline first
prozorro-mcp plans --query "лабораторні" --budget-min 100000 # upcoming purchases
prozorro-mcp flags --buyer 05498849 # red flags for one buyer
prozorro-mcp watch add "реактиви Львів" --cpv 33696 --region Львівська
prozorro-mcp digest --since 24h --format csv --out digest.csv # what is new for your saved searches
ガイドに従って Task Scheduler または cron で毎朝 sync と digest を実行すれば、ウェブサイトを開かずに新しい入札の一覧を毎日確認できます。
ツール
11個のツールは、ローカルデータベースの読み取りのみを行います。各ツールには readOnlyHint: true、destructiveHint: false、idempotentHint: true、openWorldHint: false が設定されています。さらに3個のツールはローカルの stdio サーバーでのみ使用でき、HTTP モードでは使用できません。それぞれの動作に応じてマークされています。sync_data はデータをダウンロードし(readOnlyHint: false、openWorldHint: true)、watch_add は検索を保存し、watch_remove は検索を削除します(destructiveHint: true)。サーバーは、ユーザーの同意を得てからダウンロードを開始するようアシスタントに求めます。
| ツール | 返される内容 |
|---|---|
coverage | 同期済みの地域、期間、件数、最終同期日時。追加分を同期するコマンドも表示します |
find_entity | 名前の一部から、買い手と供給業者の EDRPOU コードを検索します |
search_tenders | 単語、CPV、地域、ステータス、金額、締切、公開日で入札を検索します |
get_tender | 1件の入札の品目、ロット、すべての入札、落札者、直接リンク付きの書類を返します |
market_overview | 件数と金額、競争率、平均入札者数、単価のばらつき、主な買い手と落札者を返します |
supplier_profile | 落札実績、買い手、CPV、落札率、値引率の中央値を返します |
buyer_profile | 購入品目、購入先、手続きの内訳、単独入札率を返します |
competitors | 同じ入札に参加する事業者と、直接対決のスコアを返します |
upcoming_plans | まだ入札が行われていない年間計画の品目を返します |
red_flags | 以下の4つの警告項目を、それぞれ根拠とリンク付きで返します |
watch_digest | 保存済みの検索条件に一致する新しい入札を返します |
sync_data | 地域またはより長い期間のデータのバックグラウンドダウンロードを開始します。進行状況は coverage で確認できます |
watch_add、watch_remove | チャットから watch_digest 用の検索を保存または削除します |
別の州や過去の期間など、同期されていないデータが必要な質問では、その旨と正確な sync コマンドが結果に表示されます。「何も存在しない」ように見える空のリストは返しません。
数値の定義
- 公開中の入札:ステータスが
active.tenderingまたはactive.enquiriesで、最終同期時点で締切を過ぎていないものです。Prozorroではステータスの変更が遅れることがあります。 - 競争的な手続き:公開入札、基準額未満、価格提示、競争的対話、フレームワーク選定などの種類です。
reporting(直接契約)とnegotiationは競争的な手続きではありません。全リストはsrc/prozorro_mcp/models.pyにあります。 - 決定済み入札:有効な落札がある入札です。
- 単価:落札額 ÷ 数量です。品目がちょうど1つの入札のみを対象に計算し、CPVコード全体と単位ごとに集計するため、キログラムとトンを比較することはありません。それ以外の入札は
excludedとしてカウントされます。 - 落札率:落札した決定済み入札数 ÷ 応札した決定済み入札数です。応札内容はオークション後にのみ公開されます。
- 割引率:(予定額 − 落札額)÷ 予定額です。ロットのない競争的な入札が対象です。
注意すべき兆候
フラグは詳しく確認する理由であり、不正行為の証拠ではありません。
| フラグ | ルール(デフォルト値はパラメーターです) |
|---|---|
single_bidder | 応札者1社のみで終了した競争的な手続き |
supplier_concentration | 少なくとも5件の落札があり、買い手の落札総額の50%超を1社の供給業者が獲得 |
price_above_median | 比較可能な入札(CPVと単位が同じもの)が少なくとも5件あり、単価が中央値を30%以上上回る |
short_tender_period | 入札期間が7日未満(公開入札)、15日未満(EU)、3日未満(基準額未満、価格提示)。これは経験則であり、法的な適合性確認ではありません。戒厳令の規則は頻繁に変更されます |
評価
キーやネットワークなしで実行でき、すべてコードで計算されます:prozorro-mcp eval --suite all。最新の結果はevals/RESULTS.mdにあります。
- フラグ:中央値を上回る割合が29%と30%の場合や、金額がちょうど半分の場合など、閾値に近い陰性例を含む35件のラベル付きケースがあります。すべてのフラグで適合率と再現率は1.0です。
- 地域とCPVの語句:94種類の表記のうち、98.9%を認識します。認識できなかった1件は結果に示されています。
- 照合:分析結果の買い手別およびカテゴリー別の合計を、デモスナップショットの生JSONを独立して再集計した結果と照合します。集計は35件で、不一致は0件です。
HTTP モード
prozorro-mcp serve --http --host 127.0.0.1 --port 8000 # MCP endpoint: http://127.0.0.1:8000/mcp
同じツールをストリーミング可能なHTTP経由で提供します。ChatGPTまたはclaude.aiからアクセスするには、HTTPS対応のリバースプロキシ(Caddy、nginx)の背後に配置してください。バージョン1には認証機能がありません。データは公開されており、読み取り専用です。公開する前にプロキシでレート制限を設定してください。
制限事項
- ローカルコピー:必要なデータを同期してください。ウクライナ全域の1か月分は公開APIへのリクエストが約10万件となるため、ローカルでの通常の利用を想定したものではありません。
- 期間は最終更新を意味します:同期では、直近N日間に変更された入札を取得します。引き続き更新されている古い入札も含まれます。
- 非公開の住所:軍事部隊の入札にはProzorro上で地域情報がありません(
--region "без регіону"を参照)。 - CPVの語句検索は公式のДК 021名称と照合します。語句の範囲が広すぎる場合は、コードの接頭辞を指定してください。ツールは使用したカテゴリーを表示します。
開発
python -m venv .venv && .venv/bin/pip install -e ".[dev]" # Windows: .venv\Scripts\pip
pytest -q # 228 tests, no network: recorded API responses and built tenders
ruff check .
python scripts/capture_fixtures.py # refresh the recorded API responses
python scripts/build_demo.py # rebuild the demo snapshot (live sync, about 20 minutes)
python scripts/build_mcpb.py # the Claude Desktop extension (needs Node for the official packer)
コードは役割ごとに分かれています:api(フィードクライアント)→ sync → store(SQLite)→ analytics(すべての数値)→ server(MCP)と cli。normalizeは地域とCPVを処理します。
ロードマップ
- v2:契約変更によって価格が上昇した契約を対象とする
price_raised_after_signingフラグ。契約変更の同期が必要です。 - 今後:ChatGPTとclaude.ai向けのホスト型HTTPインスタンス、別サービスとしてのTelegramまたはメール通知、EDR登録簿に基づく企業所有者情報。
- 予定なし:「落札の可能性」や「推奨入札」。事実を装った推測になってしまいます。
お問い合わせ
ご意見、アイデア、求人、カスタムプロジェクト(n8n、MCP、AI自動化):[email protected]。バグ報告や機能リクエストはIssuesで歓迎します。
データとクレジット
入札データと計画データは、公開されているProzorro APIから取得しています。ДК 021 (CPV)の名称と地域リストは、ProzorroUKR/standards(Apache-2.0)から取得しています。詳しくはNOTICEをご覧ください。
MIT License.
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。