mcpField
P
pp-eu-tenders

pp-eu-tenders

github.com/mvanhornマーケティング・グロース2.1k51 回インストール今日更新
リポジトリ

pp-eu-tenders について

pp-eu-tendersは、EU公共調達データを扱う営業担当者、入札者、調査担当者向けのCLIスキルです。TED公告検索とローカルSQLite分析を組み合わせ、リード抽出、入札順位付け、市場分析を行います。

主な機能

  1. 01TED公告と落札情報の検索
  2. 02落札企業から営業リストを作成
  3. 03期限と適合度による入札順位付け
  4. 04発注者、落札者、市場集中度の分析
  5. 05調達動向とカテゴリ変化の追跡

活用シーン

  1. 01落札情報から連絡先候補を探す
  2. 02締切前に入札案件を優先順位付け
  3. 03入札前に発注者の落札履歴を調べる
  4. 04調達分野の競争状況を測る

MCP 対応

READMEには`eu-tenders-pp-mcp`バイナリへの言及があり、MCPサーバーとして設定する例もあります。データディレクトリ設定はホスト環境から渡します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mvanhorn/printing-press-library --skill pp-eu-tenders

インストール後、Claude Code で/pp-eu-tendersを入力して読み込まれたか確認します。

詳細

EU Tenders — Printing Press CLI

前提条件:CLI をインストールする

このスキルは eu-tenders-pp-cli バイナリを使用します。**このスキルのコマンドを実行する前に、CLI がインストールされていることを必ず確認してください。**インストールされていない場合は、先にインストールしてください。

  1. Printing Press インストーラーを使ってインストールします。バイナリの既定のインストール先は、macOS/Linux では $HOME/.local/bin、Windows では %LOCALAPPDATA%\Programs\PrintingPress\bin です。
    npx -y @mvanhorn/printing-press-library install eu-tenders --cli-only
    
  2. 確認します:eu-tenders-pp-cli --version
  3. 表示されたインストール先ディレクトリが、このスキルを実行するエージェント/ランタイムの $PATH に含まれていることを確認します。

npx でのインストールに失敗した場合(Node がない、オフラインなど)は、Go を使った直接インストールに切り替えてください(Go 1.26.6 以降が必要です)。インストール先は $GOPATH/bin(既定では $HOME/go/bin)なので、代わりにそのディレクトリを $PATH に追加してください。

go install github.com/mvanhorn/printing-press-library/library/sales-and-crm/eu-tenders/cmd/eu-tenders-pp-cli@latest

インストール後に --version が「command not found」と表示する場合、ランタイムからバイナリのディレクトリを $PATH 経由で参照できていません。確認が成功するまで、スキルのコマンドを実行しないでください。

TED の公告をローカルの SQLite ストアに同期し、落札公告から見込み顧客リストを作成します。TED が情報を掲載している場合、落札者ごとにメールアドレス、電話番号、VAT ID も含まれます。スコアと締切の切迫度で公募案件を順位付けし、集中度、発注者、落札者、勢い、CPV の変動を分析します。API キーは不要です。

この CLI の使用場面

EU の公共入札案件を探したい場合、公共契約の落札者を分析したい場合、または契約の落札者から B2B 見込み顧客リストを作成したい場合に、この CLI を使用します。TED データを使った定期的な営業先の開拓、入札案件の優先順位付け、調達市場の調査に適しています。

使用しない場面

次の場合は、この CLI を使用しないでください。

  • eSender として TED に公告を提出または公開する場合
  • TED に公開されていない、各国の基準額未満の入札案件
  • 調達手続きに関する法律上の助言

独自の機能

これらの機能は、この API を扱う他のツールでは利用できません。

落札者からの見込み顧客獲得
  • leads — 建設契約を落札したばかりの企業に連絡できる見込み顧客リストを取得します。TED が情報を掲載している場合は、落札企業ごとに 1 行で、メールアドレス、電話番号、都市、VAT/HRB ID に加え、契約金額と建設内容を含みます。

    生の公告ではなく、公共契約の落札者から営業先を獲得したいエージェントに適しています。

    eu-tenders-pp-cli leads --country DEU --cpv 45 --days 30 --region DE2 --agent
    
  • winner — 公共契約を落札する企業 1 社のプロフィールを表示します。落札履歴、契約総額、発注者、地域、最新の連絡先情報を確認できます。

    見込み顧客に連絡する前や、競合企業を評価する際に使用します。

    eu-tenders-pp-cli winner "Johann Bunte" --country DEU --agent
    
入札の優先順位付け
  • score — 締切の切迫度、契約金額、キーワードとの適合度に基づいて公募案件を順位付けし、優先度を付けた入札候補リストを作成します。

    今週、どの公募案件に入札する価値があるか尋ねられた場合に使用します。

    eu-tenders-pp-cli score --country DEU --cpv 45 --keywords Hochbau,Neubau --agent
    
  • incumbents — 公募案件 1 件について、同じ発注者から同じカテゴリーの契約を過去に落札した企業を確認できます。

    提案書を作成する前に、既存の落札企業に対する勝算を判断する際に使用します。

    eu-tenders-pp-cli incumbents 679227-2026 --agent
    
  • deadline-heat — 数日以内に締め切られる入札案件を、緊急度、契約金額、およびその発注者の契約を通常落札する企業数の少なさに基づいて順位付けします。

    締切間際の入札案件の優先順位付けに使用します。

    eu-tenders-pp-cli deadline-heat --country DEU --cpv 45 --days 14 --agent
    
市場および発注者のインテリジェンス
  • buyer — 発注機関のプロフィールを表示します。公告の頻度、CPV の構成、典型的な契約金額、繰り返し落札する企業を確認できます。

    発注機関への入札前や、その機関の落札履歴を調査する際に使用します。

    eu-tenders-pp-cli buyer --name "Stadt München" --show-winners --agent
    
  • concentration — ある分野と国において、落札金額全体のうち各企業が占める割合と、HHI 集中度スコアを確認できます。

    調達市場を支配している企業を特定する際に使用します。

    eu-tenders-pp-cli concentration --country POL --cpv 4523 --top 5 --agent
    
  • win-rate — 発注者ごとに、公告された落札に至った入札案件の数と、落札した企業の数を確認できます。

    対象を絞り込む前に、発注者の開放性を比較する際に使用します。

    eu-tenders-pp-cli win-rate --country DEU --cpv 45 --min-calls 3 --agent
    
  • dark-buyers — 入札案件が公開された落札に結びつくことがほとんどない、または同じ企業への発注が続いている発注機関を特定します。

    調達の健全性をスクリーニングする際に使用します。結果はヒューリスティックな兆候であり、確定的な判断ではありません。

    eu-tenders-pp-cli dark-buyers --country POL --cpv 45 --agent
    
トレンド
  • velocity — 週ごとの公告件数を前年の同じ期間と比較し、調達市場が活発化しているか、落ち着いてきているかを確認できます。

    セクターの需要の変化を見つけるのに役立ちます。

    eu-tenders-pp-cli velocity --country DEU --cpv 45 --window 90d --compare 1y --agent
    
  • cpv-drift — 国の支出構成において、前年比で拡大または縮小している調達カテゴリを確認できます。

    市場規模の推定や政策調査に役立ちます。

    eu-tenders-pp-cli cpv-drift --country FRA --metric value --top 20 --agent
    

コマンドリファレンス

検索と照会(ライブ TED API)

  • eu-tenders-pp-cli notices --query "buyer-country=DEU AND classification-cpv=45000000" — TED 公告をエキスパートクエリで検索します(--fields、--limit、--page、--pagination-mode、--scope)
  • eu-tenders-pp-cli notices get 680471-2026 — 公開番号で公告を取得し、落札者とその連絡先を表示します
  • eu-tenders-pp-cli awards --country DEU --cpv 45 — 落札者、発注者、金額を含む契約落札公告を取得します(--winner、--year、--since)
  • eu-tenders-pp-cli deadline --country DEU --days 14 — 入札期限が N 日以内の、受付中の入札案件を取得します
  • eu-tenders-pp-cli cpv get 45500000 — コードから CPV コードを検索します
  • eu-tenders-pp-cli cpv search(キーワード引数。例:machinery)— キーワードから CPV コードを検索します
  • eu-tenders-pp-cli fields --contains winner — TED エキスパートクエリのフィールド名を取得します

ローカルストア(オフライン)

  • eu-tenders-pp-cli sync --country DEU --cpv 45 --since 90d — 入札案件と落札情報を SQLite に同期します(テーブル:notices、notice_winners、notices_fts。--type、--param key=value、--until、--limit、--max-pages、--db)
  • eu-tenders-pp-cli search "Neubau Schule" — 同期済みの案件名、発注者、落札者を全文検索します
  • eu-tenders-pp-cli sql "SELECT buyer_country, COUNT(*) FROM notices GROUP BY 1" — ストアに対して読み取り専用の SELECT を実行します
適切なコマンドを見つける

実行したいことは分かっていても、どのコマンドを使えばよいか分からない場合は、CLI に直接問い合わせてください。

eu-tenders-pp-cli which "<capability in your own words>"

which は自然言語の機能クエリを、この CLI の厳選された機能インデックスから最適なコマンドに対応付けます。終了コード 0 は少なくとも 1 件の一致があることを示し、終了コード 2 は確信できる一致がないことを示します。その場合は --help を使うか、より絞り込んだクエリを試してください。--json(およびその他の機械処理向け形式)でもこの終了コード 2 の仕様は変わらず、標準出力に {"matches":[]} を出力するため、エージェントは不一致を成功と誤認することなく、応答の形式を確認できます。

レシピ

毎週の建設工事落札案件の見込み客
eu-tenders-pp-cli leads --country DEU --cpv 45 --days 7 --new-only --agent --select winner_name,winner_email,winner_phone,winner_city,contract_value,title

以前の --new-only 実行で返されなかった企業のみが対象です。この実行で見つかった企業はローカルの lead_seen テーブルに記録されます。

企業別に見込み客をまとめる
eu-tenders-pp-cli leads --country DEU --cpv 45 --days 90 --group-by company --agent

企業ごとに 1 行で、落札件数と合計金額を示し、落札額の大きい企業から順に並べます。

道路建設を支配しているのは誰か
eu-tenders-pp-cli concentration --country POL --cpv 4523 --top 10 --agent

市場セグメントにおける落札者のシェアと HHI を示します。

入札前に現職の受注企業を確認する
eu-tenders-pp-cli incumbents 679227-2026 --agent

同じ発注者およびカテゴリで過去に落札した企業を確認します。

認証の設定

認証は不要です。

eu-tenders-pp-cli doctor を実行して、セットアップを確認してください。

エージェントモード

任意のコマンドに --agent を追加します。次のオプションに展開されます:--json --compact --no-input --no-color。

グローバルな出力形式フラグは、promoted、novel、sync、--deliver の各パスで共通の仕様を使用します。

  • --json — 標準出力に単一の JSON ドキュメントを出力します(sync の進行状況イベントは標準エラーに出力されます)

  • --compact — 識別情報、ステータス、タイムスタンプの各フィールドを保持します。ドキュメント形式とストリーム形式は変更しません

  • --csv / --plain — 表形式の行を出力します(コレクションのエンベロープは行配列に展開されます)

  • --quiet — エンベロープなしで、各行につき識別値を 1 つ出力します

  • パイプ対応 — 標準出力に JSON、標準エラーにエラーを出力します

  • フィルタリング可能 — --select でフィールドを絞り込めます。ドット区切りのパスでネストした構造にアクセスでき、配列の各要素にも適用されます。詳細な API でコンテキストを小さく保つうえで重要です。

    eu-tenders-pp-cli leads --country DEU --cpv 45 --agent --select winner_name,winner_email,contract_value
    
  • プレビュー可能 — --dry-run で送信せずにリクエストを表示します

  • 非対話型 — プロンプトは表示されず、すべての入力をフラグで指定します

  • 読み取り専用 — 作成、更新、削除、公開、コメント、賛成票、招待、注文、送信など、データを変更するリクエストにはこの CLI を使用しないでください

パスと状態

エージェントは、CLI のパス解決機能をランタイム契約の一部として扱ってください。

  • 1 回の呼び出しでパスを変更するには --home <dir> を使用するか、EU_TENDERS_HOME=<dir> を設定して、4 種類すべてのパスを 1 つのルート配下に移動します。

  • 特定の種類のパスだけを別の場所にする必要がある場合に限り、種類ごとの環境変数を使用します:EU_TENDERS_CONFIG_DIR、EU_TENDERS_DATA_DIR、EU_TENDERS_STATE_DIR、EU_TENDERS_CACHE_DIR。

  • 解決の優先順位は、種類ごとの環境変数、--home、EU_TENDERS_HOME、XDG(XDG_CONFIG_HOME、XDG_DATA_HOME、XDG_STATE_HOME、XDG_CACHE_HOME)、プラットフォームのデフォルトの順です。

  • config には config.toml やプロファイルなどの設定が含まれます。data には data.db(notices、notice_winners、notices_fts、lead_seen、learn-loop テーブル)と feedback.jsonl が含まれます。state には teach.log が含まれます。cache には再生成可能な HTTP キャッシュファイルが含まれます。

  • eu-tenders-pp-cli doctor --fail-on warn を実行すると、パスに関する警告を確認できます。agent-context は、解決済みのディレクトリが必要なエージェント向けに、スキーマ v4 の paths ブロックを公開します。

  • MCP の場合は、MCP ホストの設定でパスの変更を指定します。MCP バイナリは CLI フラグを引き継ぎません。

    {
      "mcpServers": {
        "eu-tenders": {
          "command": "eu-tenders-pp-mcp",
          "env": {
            "EU_TENDERS_HOME": "/srv/eu-tenders"
          }
        }
      }
    }
    

フリートでの優先順位:引き継がれた種類ごとの環境変数は、その種類について明示的に指定した --home より優先されます。フリート全体に適用する設定には EU_TENDERS_HOME または種類ごとの環境変数を使用し、--home は単一の呼び出しに限って使用します。環境変数を解除しても、パスの変更は元に戻りません。EU_TENDERS_HOME を解除する前に手動でファイルを移動してください。移動しないと、doctor は以前のルートに残されたストアや設定を見つけられません。

自動学習

この CLI には、自動記録型の学習ループが組み込まれています。CLI が記録を独自に管理します。呼び出しのたびにローカルに記録し、フラグの失敗後に修正した再試行を行うと、flag_alias の候補を自動的に導き出します。また、プレイブックのないクエリ群に対して teach を実行すると、セッションの記録から playbook_candidate を自動的に合成します。必要なのは判断だけです。まず recall を実行し、提示された候補に対応し、最終回答を teach で教え、修正を確認したら playbook amend を実行します。失敗を手動で記録する必要はありません。

ステップ 1:探索の前に recall を実行する

新しいユーザーの質問について、list/search/drill コマンドを実行する前に、その質問を argv または MCP ツールの引数として recall --agent に渡してください。ユーザーが指定したテキストをシェルコマンドラインに埋め込まないでください。

引用符で囲んだ recall "<question>" は、通常の英語に含まれるアポストロフィで動作しなくなります。引用符で囲んだヒアドキュメントは、本文の行が区切り文字と一致すると動作しなくなります。また、このドキュメントではその区切り文字を公開しています。シェルを使わずにファイルへ書き込むツールで質問を書き込み、データとして読み戻してください。

# Write the question verbatim with your file-writing tool (no shell involved).
# Command substitution on a file only ever yields data — the shell never
# parses the file's bytes as syntax.
QUERY=$(cat /path/to/question.txt)
eu-tenders-pp-cli recall "$QUERY" --agent

MCP の使用を推奨します。質問をクエリ引数としてツールに渡してください。ファイルを読み込んだ後の "$QUERY" は argv として安全ですが、質問そのものをコマンドテキストに含めるのは安全ではありません。

レスポンスエンベロープ:

{
  "query": "...",
  "normalized": "<normalized form>",
  "query_entities": ["..."],
  "found": true | false,
  "match_score": 0.0,
  "results": [
    { "resource_id": "...", "resource_type": "...", "venue": "...",
      "confidence": 2, "entity_match": "exact|partial|unknown",
      "source": "taught|preseed|pattern", "warnings": ["..."] }
  ],
  "mismatches": [ /* only when --debug-mismatches */ ],
  "warnings": [ /* top-level */ ],
  "candidates": [
    { "id": 12, "class": "flag_alias | playbook_candidate",
      "summary": "...", "sightings": 3, "last_seen": "...",
      "rationale": "...",
      "next_action": ["<trial command>", "eu-tenders-pp-cli learnings confirm 12"] }
  ],
  "playbook": {
    "query_family": "...",
    "playbook": {
      "steps": [ { "cmd": "<command with {slot} substitution>", "purpose": "..." } ],
      "entity_slots": ["$ENTITY"],
      "expected_tool_calls": 3
    },
    "slots_resolved": { "$ENTITY": { "token": "<live token>", "canonical": "<canonical>" } },
    "notes": "<workarounds + gotchas for this query family>"
  },
  "notes": "<duplicate surface for non-playbook callers>"
}

ストアが空の場合の短絡処理:ストアに学習内容、プレイブック、候補がまだなく(recall で何も見つからず、learnings list と learnings candidates もどちらも空の場合)、このセッションの残りでは各クエリの負担を避けるため recall を省略してください。何かを教えた後は、再び recall を先に実行してください。

ステップ 2:判断ツリー

candidates、playbook、notes、results[0]、警告の順に読みます。

if Candidates present (warnings include "candidates_present"):
    -> candidates are try-then-confirm, never facts. Follow each candidate's
       two-step next_action verbatim: run the trial command first, then run
       `learnings confirm <id>` only after the trial verified the behavior.
       Reject a wrong candidate with `learnings reject <id>`.
    -> NEVER re-teach something recall surfaced as a candidate; confirm or
       reject that candidate instead of teaching a duplicate.
    -> candidates ride alongside playbooks and resource hits, not instead of
       them; continue with the branches below after acting on them.

if Playbook present:
    -> READ Playbook.notes verbatim FIRST (workarounds + gotchas the CLI surface doesn't expose)
    -> replay Playbook.steps in order, substituting Playbook.slots_resolved entries
       for the entity slot tokens. If a step's slot is unresolved, fall back to
       discovery for that step only.
    -> the Playbook's expected_tool_calls is a budget; if you find yourself running
       materially more, record the divergence via `eu-tenders-pp-cli playbook amend`
       at end-of-session.

elif Notes present (no Playbook):
    -> read Notes verbatim before any discovery step; they carry known gotchas
       for this query family even when no structured choreography exists yet.

elif Found AND Results[0].EntityMatch == "exact" AND Results[0].Confidence >= 2:
    -> skip discovery; fetch live data for Results[*].ResourceID in parallel

elif Found AND Results[0].EntityMatch == "partial":
    -> candidate hint, NOT a hit; read the resource title to validate before trusting

elif (any row in Mismatches[] when --debug-mismatches was passed):
    -> treat as cold start; the stored learning is for a different entity
       (different canonical resolved from query_entities)

else:  // Found == false, no playbook, no notes
    -> cold start; run discovery normally; teach the answer afterward (Step 4).
       If the family has no playbook yet, that teach auto-synthesizes a
       playbook candidate from this session's journal - you do not need to
       record one by hand.

Playbook と Notes は、リソースごとのパスとは別のものです。recall の応答には、Playbook と Results[] のヒットの両方が含まれる場合があります。両方を活用してください。Playbook は実行する手順を示し、リソースのヒットは特定のステップを短絡します。デフォルトでは mismatches をスキップし、コールドスタート時の予期しない結果を調査する場合にのみ --debug-mismatches を渡します。

候補の判断について:learnings confirm <id> は候補を反映する前に、その完全なペイロードを出力します。出力されたペイロードが、検証した動作と一致していることを確認してください。learnings reject <id> は導出シグネチャを tombstone 化し、同じ候補が再び表示されないようにします。エンベロープには、現時点で対応する価値のある少数の候補のみが含まれます。すべての未処理候補は eu-tenders-pp-cli learnings candidates で一覧表示できます。

段階的な機能低下:learnings confirm が不明なコマンドの場合、古いバイナリを使用しています。候補に関するガイダンスは無視し、残りのプロトコルに従ってください。

ステップ 3:常に warnings を読む
  • low_confidence:行が confidence<2 で存在します。スキップ可能な発見ヒットではなく、ヒントとして扱ってください。
  • resource_not_in_store:ローカルストアに、学習内容が参照するリソースがありません。一致検証でエンティティを分類できなかったため、直接取得して再評価してください。
  • cross_alias_match(結果ごと):行は別名で学習されましたが、entity_lookups によって、現在のクエリの正規エンティティと一致しました(例:「USA」での学習が「United States」の recall を満たす場合)。resource_id を信頼してください。
  • similar_shape_different_entity:<canonical>(トップレベル):構造的に一致する行はありますが、その正規エンティティは現在のクエリのものと異なります。コールドスタートとして扱われます。警告にはヒントとして競合する正規エンティティが含まれますが、その行は Results に昇格されません。
  • ambiguous_alias(トップレベル):単一のクエリエンティティが複数の正規エンティティに解決されました(例:「Cards」→ Arizona Cardinals と St. Louis Cardinals)。リソースを確定する前に、コンテキストから曖昧さを明らかにしてください。
  • candidates_present(トップレベル):エンベロープに candidates セクションが含まれています。ほかの対応に進む前に、ステップ 2 の候補分岐で処理してください。
  • トップレベルの no_learnings_for_query_family:Jaccard のしきい値を超える行がテーブルにありません。完全なコールドスタートです。
ステップ 4:応答の確定後、必ず teach & を実行する

学習は無条件に行います。ストアが回答できなかったクエリを解決した後、最終的なリソースのマッピングをバックグラウンドで学習させてください。呼び出し回数のしきい値はなく、学習する「価値」があったかどうかを判断する必要もありません。teach はループの要です。Playbook のないファミリーでは Playbook の合成を開始し、同じ参照先を指す表現は 1 つのファミリーにまとめられるため、重複に近い teach がストアを断片化するのを防ぎます。ユーザー向けの応答を組み立てた後、出力する前に、シェルの & を付けて実行すると、呼び出しはすぐに戻ります。recall と同じ方法でクエリを渡してください(argv/MCP、またはファイル経由で $QUERY を渡します)。質問をコマンドテキストに直接連結しないでください。

QUERY=$(cat /path/to/question.txt)
eu-tenders-pp-cli teach --query "$QUERY" --resource-type <type> --resource <id1> --resource <id2>
# (append shell `&` to background it)

成功時には何も出力されません。エラーは、解決済みの state dir にある teach.log にのみ記録されます。最も具体的なリソースを学習させてください。ユーザーの質問が広範で、具体的な回答を見つけるために親レコードをたどった場合は、親ではなく末端の ID を学習させます。CLI は recall 時の別名間の解決に、あらかじめ登録された entity_lookups を使用するため、ある別名(例:「Niners」)での teach は、別の別名(例:「49ers」、「San Francisco」)での今後のクエリも自動的に満たします。

個人情報ルール:識別情報を取り除いた構造的な質問を学習させてください。学習させるクエリやノートに、氏名、メールアドレス、電話番号、アカウント ID、その他の個人識別情報を決して含めないでください。CLI は teach のクエリをスキャンし、明らかなメールアドレスや電話番号の形式がある場合に警告しますが、処理はブロックしません。警告に頼らず、学習させる前に取り除いてください。

Step 5: プレイブック - 任意フラグ、自動合成

セッションがプレイブックに値するかどうかを判断する必要はありません。プレイブックのないファミリーに対して teach を行うと、セッションのジャーナルから playbook_candidate が自動的に合成され、次のセッションで確認または却下されます。明示的なプレイブックフラグを付けるのは、そのまま記録する価値のある手順をすでに把握している場合に限ってください。CLI で表面化しなかった回避策(暗黙に破棄されるフラグ、文書化されていないパラメーター、ページネーションの工夫、ペイロードに関する注意点など)が該当します。統合された一回の呼び出し形式を優先してください。リソースの学習内容とプレイブックを、同じ teach 呼び出しで記録します。

# Common case: record both the resource learning AND the playbook in one call.
QUERY=$(cat /path/to/question.txt)
eu-tenders-pp-cli teach \
  --query "$QUERY" \
  --resource <id> \
  --playbook-file ~/playbooks/<shape>.json \
  --playbook-notes-file ~/playbooks/<shape>-notes.md
# (append shell `&` to background it)

# Alternate: playbook-only (no resource to record alongside).
QUERY=$(cat /path/to/question.txt)
eu-tenders-pp-cli teach-playbook \
  --query "$QUERY" \
  --playbook-file ~/playbooks/<shape>.json \
  --notes-file ~/playbooks/<shape>-notes.md

プレイブックファイルは steps、entity_slots、expected_tool_calls を含む JSON です。Notes ファイルは注意点をそのまま記載した Markdown です。ファイルを使わない呼び出し元(MCP のみを使うエージェント)は、統合形式の teach では --playbook-json と --playbook-notes を、teach-playbook では --playbook-json と --notes を使い、同じ内容をインラインで渡します。統合形式の teach ではプレイブックフラグは任意です。リソースのみを教える場合は、フラグをすべて省略してください。単独形式の teach-playbook では、プレイブックフラグまたは notes フラグの少なくとも一方を指定する必要があります。両方が空の場合は拒否されます。プレイブックは構造的なクエリファミリー(エンティティを除去したもの)に紐付けられるため、あるエンティティ形状のクエリから学習した手順は、同じ形状の別のクエリすべてに適用されます。リコール時には slots_resolved によって、実際のクエリの正規形がバインドされます。

今後のリコールでプレイブックが見つかった場合は、それを正確な根拠として扱ってください。slots_resolved による置換を使って手順を再実行し、手順にすでに記載されている探索は省略して、どの手順を実行する前にも notes を読んでください。

Step 6: デバッグ応答で修正点が特定された場合の playbook amend &

デバッグプロトコルへの応答で、notes またはプレイブックに記録すべき具体的な修正点(回避策、文書化されていないエンドポイントの形式、古くなったフィールド名、確認されたスキーマの変化、空のペイロードに対する代替手段など)が特定された場合は、ユーザー向けの応答を出す前に playbook amend を実行してください。teach と同じく、実行結果を待たずに処理を進めます。クエリとメモは argv/MCP 引数として渡すか、シェルを介さないファイルツールでそれぞれ書き込んで読み戻してください(QUERY=$(cat ...)、NOTE=$(cat ...))。どちらの文字列もコマンドテキストに埋め込まないでください。

QUERY=$(cat /path/to/question.txt)
NOTE=$(cat /path/to/note.txt)
eu-tenders-pp-cli playbook amend \
  --query "$QUERY" \
  --add-note "$NOTE"
# (append shell `&` to background it)

修正する価値がある内容:このセッションで実際に確認した動作のうち、将来の自分にとって役立つもの。修正する価値がある例:

  • フラグを暗黙に破棄したり、順序を入れ替えたりする CLI インターフェースの回避策。
  • 文書化されていないエンドポイントの形式(レスポンスが {meta, results} でラップされている、ペイロードがドキュメントに記載されているよりも二段深くネストされているなど)。
  • 確認されたスキーマの変化(フィールド名の変更、シーズン間でのインデックスの移動、API が返すカテゴリラベルの小文字化など)。

notes に含めないもの:

  • ユーザーの質問に対する、年やエンティティに固有の回答。それは応答であり、学習内容ではありません。
  • プレイブックが実行時にすでに取得する、チーム、選手、行ごとのデータ。
  • 既存の notes の内容を言い換えた記述。

amend コマンドは、ファミリーの既存の notes にタイムスタンプ付きのマーカー([amend YYYY-MM-DDTHH:MMZ]: <text>)を付けて追記します。複数の amend が蓄積され、監査証跡を確認できます。そのファミリーにプレイブックがまだ存在しない場合、amend は notes のみのプレイブックを作成するため、コールドスタート時の修正も記録されます。

amend ノートにおける PII の取り扱い

playbook amend のノートは、Printing Press の将来のバージョンで共有ナレッジとして上流に反映される可能性を想定して設計されています。後から削除することなく上流への貢献を続けられるよう、ユーザーを特定できる情報を含めないでください。

  • 埋め込まないでください:ユーザーのファイルシステム上のパス、個人用 API キーやトークン、ユーザーのメールアドレス、ユーザーの GitHub ハンドル、または特定のユーザーに紐づく具体的なクエリ履歴。
  • 許容されるもの:エンドポイントの形式、未文書化のフィールド名、API の注意点、確認されたスキーマの変更、CLI の機能に関する回避策、汎用的なページネーションや再試行の手法。

修正がユーザー固有のコンテキストがないと意味をなさない場合は、playbook amend ではなく個人用ノートに記録してください。

ループの測定

eu-tenders-pp-cli learnings stats は、ローカルの learn_events テーブルから、再現率、教示内容の再利用率、playbook の解決率、候補の確認数/却下数を報告します。分母がない間は各率が null になり、すべてのデータはこのマシン内にとどまります。この CLI でループが役立っているかを確認するために使用してください。

学習の無効化
  • 単一のコマンドに --no-learn を指定すると、recall と teach の書き込み処理の両方が短絡されます。学習の蓄積による影響を受けてはならない決定的なエージェントの処理やテストで使用してください。
  • 環境変数に EU_TENDERS_NO_LEARN=true を設定すると、パイプラインが全体で無効になります。

エージェントからのフィードバック

この CLI について気になる点に気づいたら(あなた自身でもエージェントでも)、記録してください。

eu-tenders-pp-cli feedback "the --since flag is inclusive but docs say exclusive"
eu-tenders-pp-cli feedback --stdin < notes.txt
eu-tenders-pp-cli feedback list --json --limit 10

エントリーは、解決済みのデータディレクトリ内の feedback.jsonl にローカル保存されます。EU_TENDERS_FEEDBACK_ENDPOINT が設定され、さらに --send が渡されるか EU_TENDERS_FEEDBACK_AUTO_SEND=true が設定されていない限り、POST されることはありません。デフォルトの動作はローカルのみです。

バグ報告ではなく、意外に感じたことを書いてください。短く、具体的に、1 行で。それが積み重なっていく要素です。

出力の配信

すべてのコマンドで --deliver <sink> を指定できます。出力は標準出力に加えて(または標準出力の代わりに)指定したシンクに送られるため、エージェントはコマンド結果を手作業でパイプに渡すことなくルーティングできます。次の 3 つのシンクがサポートされています。

シンク動作
stdoutデフォルト。標準出力のみに書き込みます
file:<path>出力を <path> にアトミックに書き込みます(一時ファイルを作成してリネーム)。バイナリレスポンスを返すコマンドでは、デコード済みのペイロードバイト列(base64 の JSON エンベロープではありません)を書き込み、標準出力には小さな JSON レシートを出力します。このシンクが設定されていても、--json/--csv は拒否されません
webhook:<url>出力本文を URL に POST します(application/json)

不明なスキームは、サポート対象の一覧を示す構造化エラーで拒否されます。Webhook の失敗時は、ゼロ以外の終了コードを返し、URL と HTTP ステータスを標準エラーに記録します。

名前付きプロファイル

プロファイルは、フラグ値を保存したセットで、呼び出し間で再利用できます。定期実行または繰り返し実行するエージェントが、実行ごとに異なる入力を受け取りながら同じフラグを再利用する場合に使用してください。

eu-tenders-pp-cli profile save briefing --json
eu-tenders-pp-cli --profile briefing leads --country DEU --cpv 45
eu-tenders-pp-cli profile list --json
eu-tenders-pp-cli profile show briefing
eu-tenders-pp-cli profile delete briefing --yes

明示的なフラグは常にプロファイル値より優先され、プロファイル値はデフォルトより優先されます。agent-context は、実行時にエージェントがプロファイルを確認できるよう、すべてのプロファイルを available_profiles の下に一覧表示します。

終了コード

コード意味
0成功
1その他のエラー
2使用方法のエラー(引数が不正)
3リソースが見つかりません
4TED によるアクセス拒否(HTTP 401/403 または HTML のブロックページ)
5API エラー(上流の問題)
7レート制限(待機して再試行)
10設定エラー

引数の解析

$ARGUMENTS を解析します。

  1. 空、help、または --help → eu-tenders-pp-cli --help の出力を表示
  2. install で始まる → mcp で終わる場合は MCP のインストール。それ以外の場合は上記の「前提条件」を参照
  3. その他すべて → 直接使用(CLI コマンドとして --agent を付けて実行)

MCP サーバーのインストール

  1. MCP サーバーをインストールします。
    go install github.com/mvanhorn/printing-press-library/library/sales-and-crm/eu-tenders/cmd/eu-tenders-pp-mcp@latest
    
  2. Claude Code に登録します。
    claude mcp add eu-tenders-pp-mcp -- eu-tenders-pp-mcp
    
  3. 確認します:claude mcp list

直接使用

  1. インストールされているか確認します:which eu-tenders-pp-cli 見つからない場合は、インストールを提案します(このスキルの冒頭にある前提条件を参照してください)。
  2. ユーザーのクエリに最適なコマンドを、上記の「独自の機能とコマンドリファレンス」から選びます。
  3. --agent フラグを付けて実行します:
    eu-tenders-pp-cli leads --country DEU --cpv 45 --agent
    eu-tenders-pp-cli notices --query "buyer-country=DEU" --dry-run --agent
    
  4. 不明な点がある場合は、サブコマンドのヘルプを確認します:eu-tenders-pp-cli leads --help。

コメント