MatchAwards について
MatchAwardsは、米国政府の契約、助成金、求人、過去の受賞情報を検索する読み取り専用MCPサーバーです。企業の実績照会や案件評価、提携候補の概要作成も、アカウントやAPIキーなしで行えます。
主な機能
- 01契約・助成金・求人の検索
- 02案件詳細と連絡先の取得
- 03受賞情報と企業履歴の検索
- 04案件と提携候補の評価
- 05出典リンク付きの構造化結果
活用シーン
- 01条件に合う募集中の契約や助成金の検索
- 02企業の公開受賞履歴の確認
- 03入札案件の評価と提携候補の特定
MCP 対応
MCPクライアントに読み取り専用の検索、照会、評価ツールを提供します。stdioでローカル実行できるほか、ホスト型エンドポイントhttps://matchawards.com/mcpから利用できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://matchawards.com/mcpclaude mcp add --transport http matchawards-matchawards https://matchawards.com/mcp{"mcpServers":{"matchawards-matchawards":{"type":"http","url":"https://matchawards.com/mcp"}}}Cursor で開く{"servers":{"matchawards-matchawards":{"type":"http","url":"https://matchawards.com/mcp"}}}VS Code で開く{"mcpServers":{"matchawards-matchawards":{"type":"http","url":"https://matchawards.com/mcp"}}}{"mcpServers":{"matchawards-matchawards":{"serverUrl":"https://matchawards.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
10| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| open | any | いいえ | true(デフォルト):回答期限が今日以降(米国東部時間)の案件のみ。期限がない案件は終了済みとして扱います。false:終了済みの案件も含めます。 |
| type | any | いいえ | 連邦または州の契約に絞り込みます。空欄の場合は両方を対象にします。 |
| limit | integer | いいえ | 返す結果の数。1~50。 |
| naics | any | いいえ | 6 桁の NAICS コードを最大 10 個、カンマ区切りで指定します。例:'236220' または '541511,541512'。公告は独自のコードで一致します(matched_naics に一致したコードが示されます)。また、MatchAwards の AI が提案したコードで一致する場合もあります。そのコードは ai_matched_naics に記載されるため、「AI 提案による一致」と呼んでください。不明なコードは無視されます。 |
| state | any | いいえ | 2 文字の米国州コード。例:'VA'。州情報のない連邦公告が多いため、このフィルターではそれらを除外します。 |
| agency | any | いいえ | 機関名。例:'Department of Veterans Affairs'。最も近い MatchAwards の機関に照合し、結果の注記に該当機関を記載します。 |
| cursor | any | いいえ | 前回の応答に含まれる next_cursor。次のページを取得するには、同じフィルターとともに渡します。 |
| keyword | any | いいえ | 2~100 文字。タイトルのみを対象に一致させます。 |
| set_aside | any | いいえ | 優先枠コード。例:'SBA' または 'SDVOSBC'。連邦契約のみが対象です。 |
| posted_within_days | any | いいえ | 過去 N 日以内に掲載された案件のみ。1~180(デフォルトは 180)。 |
詳細
MatchAwards MCP サーバー
MatchAwards は、AI エージェントが継続的に更新される政府・企業の契約、助成金、求人、受賞情報、連携の機会に直接アクセスできるようにします。
これは MatchAwards 用の Model Context Protocol サーバーです。Claude、Cursor、VS Code などの MCP クライアントから、米国の政府契約案件、助成金、求人、および過去の契約・助成金の受賞情報を検索できます。データの読み取りのみを行い、アカウントも API キーも必要ありません。
ツール
| ツール | 返される内容 | プロンプトの例 |
|---|---|---|
search_contracts | 連邦および州の契約案件。フィルター:NAICS(最大 10 コード)、州、キーワード、優先枠、連邦のみまたは州のみ、過去 N 日以内に掲載、募集中のみ、機関名、1~50 件の結果、ページング。 | 「過去 1 週間に掲載された、バージニア州の募集中の屋根工事契約を探してください。」 |
search_grants | 連邦政府の助成金および資金提供の機会。フィルター:NAICS、キーワード、過去 N 日以内に掲載、募集中のみ、1~50 件の結果、ページング(助成金の告知には州情報がありません)。 | 「募集中のブロードバンド助成金はありますか?」 |
search_jobs | 過去 30 日間の求人情報。フィルター:NAICS、州、キーワード、過去 N 日以内に掲載、1~50 件の結果、ページング。 | 「過去 7 日間に掲載されたテキサス州の電気技師の求人を表示してください。」 |
get_opportunity | 1 件の案件の全記録:検索結果の行に加え、説明、公開されている連絡先(氏名と役職)、および MatchAwards にデータがある場合は AI 生成のメモ(ai:適合性、根拠、下請けおよび大手元請け企業の観点、概要)。AI 生成であることが明記されます。 | 「2 件目の結果について、誰に連絡すればよいですか?」 |
lookup_naics | 「サイバーセキュリティ」などの語句、または 2~6 桁のコード接頭辞から NAICS コードを検索し、各コードの matchawards.com 上のページを返します。1~25 コード。 | 「サイバーセキュリティコンサルティングに該当する NAICS コードは何ですか?」 |
search_awards | 過去の連邦契約の受賞情報と助成金の受賞情報:受賞者(名称、UEI、DUNS)、金額、日付、機関、NAICS、優先枠、場所、入札依頼、契約番号および CFDA 番号、matchawards.com と SAM.gov または USAspending へのリンク。フィルター:種類、NAICS、機関名、州、受賞者名、UEI、キーワード、過去 N 日以内の受賞(最大 1,095 日)、1~50 件の結果、ページング。 | 「過去 1 年間に NAICS 541512 の VA 契約を獲得したのはどの企業ですか?」 |
get_company | UEI による 1 社の受賞履歴:名称、所在地(市、州、国)、契約と助成金の合計、最初と最後の受賞日、上位の NAICS コードと機関、直近 10 件の受賞情報。連絡先情報はありません。 | 「UEI C3KXNLTAAY98 の受賞履歴を表示してください。」 |
assess_opportunity | 1 件の案件の適格性評価概要:残り日数(米国東部時間)、募集中か終了済みか、優先枠と NAICS(ユーザーの my_set_aside と my_naics に一致するかどうかも表示)、AI 生成のメモ、類似する最新の受賞情報 5 件(同じ NAICS かつ同じ機関のもの。該当する機関に受賞情報がない場合は全機関が対象。過去 3 年間の最新 150 件までを対象とし、sample に取得した日付と全件を読み取ったかどうかを記載)、類似業務を受注した上位 5 社(件数、次いで合計金額の順)、受賞金額の四分位数、および対象範囲に関する注記。 | 「最初の結果に入札すべきでしょうか? 当社は NAICS 336413 の中小企業です。」 |
find_teaming_partners | 類似する受賞情報を持つ最大 10 社。取得した最新の記録(sample)を基に選出します(案件の州内で同じ NAICS、次に同じ機関で検索。どちらも該当がなく、受賞情報の取得枠が残っている場合は全地域で NAICS を検索)。UEI で重複を除外し、件数、次いで最新の受賞情報、次いで合計金額の順に順位付けし、記録を基に作成した why の説明を各社に付けます。記録に UEI がない企業は uei: null として掲載し、履歴を参照できない旨を注記します。role(sub、prime、any)を指定すると、受賞件数が同じ企業の中で、通常の受賞金額が小さい企業または大きい企業を先に表示します。公開されている受賞情報のみを使用します。連絡先やプロフィールへのリンクはありません。 | 「あの空軍の告知について、どの企業と提携できそうですか?」 |
agency フィルターには名前を指定します。サーバーは MatchAwards の機関一覧から名前を検索し(完全一致を優先し、次に名前が指定した文字列で始まるもの、その後は API の順序に従います)、現時点では最適な一致のみで絞り込みます。結果の note にはその機関名と、ほかに一致した候補を最大3件(1つの部門が複数の機関アカウントを持つ場合があります)記載します。一致するものがない場合は、すべての機関を対象に検索し、その旨を note に記載します。検索結果は10分間キャッシュされます。 |
受賞記録は不完全な場合があるため(特に連邦政府の受賞記録)、すべての受賞結果にその旨が記載されます。2つの簡易ツールは、企業が類似の業務を受注したことがあると説明し、現職の受注企業とは決して表現しません。呼び出し1回につき、案件のリクエストは最大1回、受賞記録のリクエストは最大6回(クエリあたり最大3回で、クエリ間で共有)行い、6秒以内に処理します。いずれかの上限によって検索が途中で終了した場合、取得できた情報を回答し、warning を付けます。sample には、集計の基になった受賞記録の件数と日付、および一致するすべての記録を読み込んだかどうかが記載されます。助成金の受賞記録では、タイトルが受給者名になっているため、モデルには代わりに受賞者名と CFDA 番号を見出しにするよう指示します。
すべてのツールは読み取り専用で、アカウントは不要です。各ツールには readOnlyHint、idempotentHint、タイトル、および(_meta 内の)securitySchemes: [{"type": "noauth"}] が宣言されています。結果は構造化されています。各ツールは outputSchema を公開し、structuredContent を返すほか、テキストのみを読み取るクライアント向けに同じ JSON をテキストとして返します。すべての結果には matchawards.com の url(連邦政府の公告の場合は sam_url も)が含まれ、サーバーはモデルにそれらを Markdown リンクとして表示するよう指示します。matchawards.com へのリンクには、リクエスト元の AI ホストを示す utm_source、utm_medium、utm_campaign パラメーター(例:utm_source=chatgpt)が付加されます。ほかのサイトへのリンクは変更されません。
1.0.4 の変更点
- Claude で結果カードが表示されるようになりました。Claude は独自のサンドボックスドメインのみを受け付けるため、Claude では
_meta.ui.domainを省略し、ほかのホストには引き続きhttps://matchawards.comを指定します。
1.0.3 の変更点
- ホスト型サーバー:使用統計の行のデフォルト保持期間を180日に変更しました(従来は365日)。
MATCHAWARDS_USAGE_RETENTION_DAYSで設定します。
1.0.2 の変更点
- モデルが選んだ ID を指定して1回呼び出す新しいツール
show_resultsからカードを表示します。検索ツールはデータのみを返します。カード(results-v2.html)では行をその場で展開でき、「これについて質問」ボタンがあります。 naicsで絞り込まれた結果には、一致した指定コードが表示されます。matched_naicsは記録自体のコードを示し、契約公告ではai_matched_naicsが MatchAwards の AI による提案コードを示します。- matchawards.com へのリンクに、AI ホストを示す UTM パラメーターが付加されます。
- ホスト型サーバー:共有上限は1分あたり1200リクエストです。また、
/metricsにツールのレイテンシー、個別の呼び出し元数、クライアント数が追加されます。
1.0 の変更点
search_by_naicsを削除しました。search_contracts、search_grants、search_jobsは、単独で同じnaicsフィルターを受け付けます。find_contactsを削除しました。get_opportunityは、レコードのほかの情報とともに公開されている連絡先を返します。- 結果は構造化出力(
outputSchemaとstructuredContent)です。API に後から追加されたフィールドは、スキーマで宣言された場合にのみ結果に含まれます。MatchAwards に AI 生成のメモがある場合、get_opportunityは AI 生成と明記したaiを返し、ない場合は null を返します。 - ツールのアノテーションはクローズドワールド(
openWorldHint: false)です。ツールが読み取るのは MatchAwards のカタログのみです。 - 新しいツール:
lookup_naics、search_awards、get_company、assess_opportunity、find_teaming_partners。search_contractsではagency名を指定できます。
カード
MCP Apps を表示するホスト(ChatGPT、Claude)では、回答ごとにインラインカードが1つ表示されます。検索後、モデルは選んだ契約または助成金の ID を最大10件指定して show_results を呼び出し、カードにはそのうち最大8件が、タイトル、機関、場所、連邦/州/助成金のバッジ、期限(残り日数、期限切れ、または固定の期限なし)、優先枠、NAICS コードとともに表示されます。表示できなかった ID(見つからなかったもの、求人、または MatchAwards がビジー状態で取得できなかったもの)は、リストの下に件数が表示されます。検索ツールはカードを表示せず、データのみを返します。行をクリックすると詳細(掲載日、募集要項、担当部署、NAICS、優先枠)が展開されます。「Ask about this」ボタンをクリックすると、その案件の詳細をモデルに尋ねることができ、「Open on MatchAwards」リンクをクリックすると、そのページが開きます。カードは自己完結型の HTML リソース ui://matchawards/results-v2.html(text/html;profile=mcp-app)で、外部のスクリプトやスタイル、ネットワークリクエストはないため、CSP では何も許可されません。ツールの structuredContent のみを表示し、カード自体がツールを呼び出すことはありません。
その他のツールは、カードを表示せずに構造化された結果を返します。
カードはデフォルトで無効です。MATCHAWARDS_WIDGETS=1 を設定すると、リソースと、それを参照する show_results(_meta.ui.resourceUri)が一覧表示されます。その他のツールの結果は、設定の有無にかかわらず同じです。tests/widget_harness/ には、ブラウザーでカードを確認するためのサンプル結果付きの最小限のホストページがあります。
ホスト型
ホスト型エンドポイントは https://matchawards.com/mcp で稼働しています。URL を指定してリモート MCP サーバー(コネクター)として追加します。インストールもキーも必要ありません。
- ChatGPT:URL
https://matchawards.com/mcpを指定して、カスタムコネクターを追加します。 - Claude(claude.ai または Claude Desktop):Settings、Connectors の順に開き、同じ URL を指定してカスタムコネクターを追加します。Claude Code:
claude mcp add --transport http matchawards https://matchawards.com/mcp。 - Cursor:
mcp.jsonに{"mcpServers": {"matchawards": {"url": "https://matchawards.com/mcp"}}}を設定します。
ホスト型エンドポイントは同じツールを提供します。クライアントアドレスごと(IPv6 は /64 ごと)に毎分30リクエスト、5秒ごとに10リクエスト、IPv6 の /48 ごとに毎分120リクエスト、全クライアント合計で毎分1200リクエスト(ChatGPT の共有プールは600)に制限されています。制限を超えると、Retry-After を含む HTTP 429 が返されます。
インストール
サーバーは uv に同梱されている uvx で実行します。
Claude Desktop
これを claude_desktop_config.json(macOS:~/Library/Application Support/Claude/claude_desktop_config.json、Windows:%APPDATA%\Claude\claude_desktop_config.json)に追加してから、Claude Desktop を再起動します。
{
"mcpServers": {
"matchawards": {
"command": "uvx",
"args": ["matchawards-mcp"]
}
}
}
Claude Code
claude mcp add matchawards -- uvx matchawards-mcp
Cursor
これを ~/.cursor/mcp.json(すべてのプロジェクト)または .cursor/mcp.json(1つのプロジェクト)に追加します。
{
"mcpServers": {
"matchawards": {
"command": "uvx",
"args": ["matchawards-mcp"]
}
}
}
VS Code
これをワークスペース内の .vscode/mcp.json に追加します。
{
"servers": {
"matchawards": {
"type": "stdio",
"command": "uvx",
"args": ["matchawards-mcp"]
}
}
}
その他のクライアント
stdio サーバーを起動できる MCP クライアントであれば、どれでも動作します。コマンドは uvx matchawards-mcp です。
OpenClaw
integrations/openclaw-plugin には、ホスト型エンドポイントを呼び出す9つのツールを備えたネイティブ OpenClaw プラグイン(ClawHub の @matchawards/openclaw-plugin)と、エージェントに curl を使った公開 REST API を案内する ClawHub スキル matchawards が含まれています。どちらも読み取り専用で、アカウントは不要です。プラグインの tools.json は、このサーバーのツール一覧から生成され(integrations/openclaw-plugin/scripts/gen_tools.py)、テストスイートでは、最新の状態でない場合に失敗します。
HTTP サーバーを自分で実行する
matchawards-mcp --http を実行すると、ステートレスな Streamable HTTP(JSON 応答、セッションなし、SSE なし)で同じツールを http://127.0.0.1:8765/mcp に提供します:
uvx matchawards-mcp --http
curl -s http://127.0.0.1:8765/mcp -H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' -H 'MCP-Protocol-Version: 2025-06-18' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
リクエストは次の順に処理されます:
- 連続するスラッシュと末尾のスラッシュは正規化されるため、
/mcp/と//mcpは/mcpとして扱われます。/mcpと/healthz以外のパスには 404 を返します。 GET /healthzはokを返し、レート制限の対象外です。HostヘッダーがMATCHAWARDS_ALLOWED_HOSTS(または127.0.0.1、localhost)に含まれていない場合は、メソッドにかかわらず 421 を返します。- 処理されるのは
POST /mcpのみです。GET、DELETE、OPTIONSには 405 を返します(SSE ストリームなし、セッションなし、CORS なし)。 - POST には
Content-Lengthが必要です(指定がない場合は 411)。64 KB を超える本文には 413 を返します。 - クライアントごと(OpenAI のアドレスからアクセスする ChatGPT ユーザーごと)にレート制限を適用し、その後、サーバー全体の上限を適用します。制限に達すると、
Retry-Afterを付けて 429 を返します。
クライアントはソケットアドレスです。ただし、ソケットアドレスが MATCHAWARDS_TRUSTED_PROXIES に含まれている場合は、X-Real-IP ヘッダーを使用します(IPv6 は /64 単位でキーが設定され、同じ /48 内のすべての /64 が MATCHAWARDS_RATE_PER_PREFIX_MIN を共有します)。X-Real-IP を設定するリバースプロキシの背後で実行し、ポートを直接公開しないでください。制限値はプロセスごとにメモリ内に保持されます。以下の変数のいずれかに不正な値があると、起動時にサーバーが停止します。ログにはリクエストごとに 1 行(メソッド、パス、ステータス、所要時間、ハッシュ化されたクライアントキー)が記録され、ヘッダーや本文は記録されません。
ChatGPT からの呼び出しは OpenAI の共有エグレスアドレス(公開リスト。パッケージに同梱され、毎日更新されます。更新に失敗した場合は最後に取得できたリストを保持します)から届くため、1 つのアドレスを多くのユーザーが共有します。このため、IP 単位の制限では全員がまとめて制限されます。これらのアドレスからのリクエストに限り、x-openai-subject(ChatGPT のユーザーごとの ID。キー付きハッシュとしてのみ保持)単位で制限され、すべての ChatGPT トラフィックが MATCHAWARDS_EGRESS_PER_MIN を共有します。このヘッダーを含まないリクエストは、そのプール内でのみカウントされます。他のアドレスから届いたヘッダーは無視され、User-Agent は使用されません。
Docker では、ホスト上の nginx はループバックではなく compose ネットワークのゲートウェイからコンテナに接続するため、そのアドレスを正確に指定してください。次のコマンドで確認し、たとえば次のように設定します。
MATCHAWARDS_HTTP_HOST=0.0.0.0
MATCHAWARDS_TRUSTED_PROXIES=127.0.0.1/32,::1/128,172.18.0.1/32
172.16.0.0/12 のような広範なプライベート範囲を信頼しないでください。内部ネットワークと重複する可能性があり、その範囲内の任意のホストが独自のレート制限キーを指定できてしまいます。
設定
| 変数 | デフォルト | 用途 |
|---|---|---|
MATCHAWARDS_API_BASE | https://matchawards.com | API のベース URL です。開発時のみ変更してください。 |
MATCHAWARDS_HTTP_HOST | 127.0.0.1 | --http のみ:リッスンするアドレスです。 |
MATCHAWARDS_HTTP_PORT | 8765 | --http のみ:リッスンするポートです。 |
MATCHAWARDS_RATE_PER_MIN | 30 | --http のみ:クライアントごとの 1 分あたりのリクエスト数です。 |
MATCHAWARDS_RATE_BURST | 10 | --http のみ:クライアントごとの 5 秒あたりのリクエスト数です。 |
MATCHAWARDS_RATE_PER_PREFIX_MIN | 120 | --http のみ:同じ /48 内のすべての IPv6 /64 を合わせた 1 分あたりのリクエスト数です。 |
MATCHAWARDS_GLOBAL_PER_MIN | 1200 | --http のみ:すべてのクライアントを合わせた 1 分あたりのリクエスト数です。MATCHAWARDS_EGRESS_PER_MIN を上回る必要があります(そうでない場合、サーバーは起動しません)。 |
MATCHAWARDS_RATE_PER_SUBJECT_MIN | 30 | --http のみ:ChatGPT ユーザーごとの 1 分あたりのリクエスト数です(x-openai-subject。OpenAI のエグレスアドレスからのアクセスのみ)。 |
MATCHAWARDS_RATE_SUBJECT_BURST | 10 | --http のみ:ChatGPT ユーザーごとの 5 秒あたりのリクエスト数です。 |
MATCHAWARDS_EGRESS_PER_MIN | 600 | --http のみ:すべての ChatGPT トラフィックを合わせた 1 分あたりのリクエスト数です。 |
MATCHAWARDS_GLOBAL_API_PER_MIN | 900 | --http のみ:サーバー全体の 1 分あたりの API 呼び出し数です(検索 1 回につき最大 3 回呼び出すことがあります)。上限を超えると、ツールは API を呼び出さず、「MatchAwards is busy, retry in N seconds」と応答します。 |
MATCHAWARDS_TRUSTED_PROXIES | 127.0.0.1/32,::1/128 | --http のみ:X-Real-IP ヘッダーを信頼するプロキシ(CIDR、カンマ区切り)です。デフォルトではループバックのみです。 |
MATCHAWARDS_ALLOWED_HOSTS | matchawards.com,staging.matchawards.com | --http のみ:受け入れる Host ヘッダー(カンマ区切り)です(127.0.0.1 と localhost は常に受け入れられます)。 |
MATCHAWARDS_USAGE_DB | /data/usage.db | --http のみ:利用統計用の SQLite ファイルです。ディレクトリが存在しない、または書き込み不可の場合、サーバーは警告を 1 回記録し、何も記録しません。 |
MATCHAWARDS_USAGE_SALT | unset | --http のみ:ChatGPT 呼び出し元のフィンガープリント用のシークレットです。未設定の場合、フィンガープリントは保存されません。 |
MATCHAWARDS_METRICS_TOKEN | unset | --http のみ:/metrics 用の Bearer トークンです。未設定の場合、メトリクスリスナーは起動しません。 |
MATCHAWARDS_METRICS_HOST | 127.0.0.1 | --http のみ:メトリクスリスナーのアドレスです。 |
MATCHAWARDS_METRICS_PORT | 9765 | --http のみ:メトリクスリスナーのポートです。 |
MATCHAWARDS_USAGE_RETENTION_DAYS | 180 | --http のみ:利用統計の行を保持する日数です。 |
MATCHAWARDS_WIDGETS | unset | 1:結果カードを提供します(「Cards」を参照)。未設定の場合、カードリソースも show_results もありません。 |
使用状況の統計(ホストモード)
--http を使用すると、サーバーは使用状況の統計を SQLite ファイル(MATCHAWARDS_USAGE_DB、WAL モード)に保持します。stdio モードでは何も記録されません。書き込みは 2 つのバックグラウンドスレッドで実行され、ベストエフォートです。書き込みに失敗しても mcp_ledger_errors_total にカウントされるだけで、リクエストが失敗することはありません。MATCHAWARDS_USAGE_RETENTION_DAYS 日(デフォルトは 180 日)より古い行は、1 日に最大 1 回削除されます。
記録される内容:
- ツール呼び出し:ツールに到達した呼び出しごとに 1 行記録します。内容は、時刻、ツール名、結果(
ok、invalid_input、upstream_error、bad_response(ツールが読み取れない応答)、upstream_timeout(API が時間切れになりました。再試行してください)、partial(assess_opportunityまたはfind_teaming_partnersが応答しましたが、リクエストまたは時間制限により賞の検索が途中で終了)、rate_limited_upstream、busy、internal_error)、クライアントのネットワーク(IPv4 /24 または IPv6 /48)、User-Agent(先頭 200 文字)、その種類(openai-mcp、claude-user、claude、cursor、…、proberまたはother)、およびレイテンシです。レート制限によって停止された呼び出しはメトリクスにカウントされますが、行は記録されません。SDK がツールの実行前に拒否した引数についても、行は記録されません。ただし、トランスポートの表ではtools/callとしてカウントされます。 - トランスポート(1 日ごと):クライアントネットワーク、JSON-RPC メソッド(既知の MCP メソッドのみ。それ以外はすべて
_other)、clientInfoの名前とバージョンごとに 1 つのカウンターを記録し、最後に確認した User-Agent も保存します。リクエストボディがストリーミングされる間に、initializeボディの先頭 8 KiB、またはparams._meta(2026-07-28 のクライアント)からclientInfoを読み取ります。ボディはバッファリングされません。クライアントネットワークごと、1 日あたりのカウンターは最大 50 個です。それを超えた分は_otherにまとめられます。 - ChatGPT の呼び出し元:
MATCHAWARDS_USAGE_SALTが設定されており、ChatGPT の送信元 IP アドレスからのリクエストにx-openai-subject(ChatGPT の匿名ユーザーごとの ID)が含まれている場合、ツール呼び出しの行にその値の 16 桁の 16 進数 HMAC-SHA256 を保存し、ChatGPT の呼び出し元の数を集計します(統計ではopenai-mcpファミリーのみ)。他のアドレスからのx-openai-subjectは無視されます。x-openai-sessionは会話ごとに変わるため、使用しません。
記録されない内容:ツールの引数(検索語、ID)、リクエストまたはレスポンスのボディ、クライアントの完全なアドレス、ヘッダーの生の値。
統計を確認するには:
matchawards-mcp stats --days 7 # --db PATH to read another file
ツールと結果ごとのツール呼び出し数、ファミリーごとの呼び出し数、実際の呼び出しとプローバーおよび独自のテスト(matchawards-test/ UA)の内訳、(プローバーと独自のテストを除く)クライアントネットワークの数、ChatGPT のフィンガープリントの数、メソッドごとのトランスポートリクエスト数、および clientInfo の名前の上位を出力します。Docker では、docker exec <container> matchawards-mcp stats --days 1 を実行します。
メトリクス
MATCHAWARDS_METRICS_TOKEN が設定されている場合、同じプロセス内の 2 つ目のリスナー(MATCHAWARDS_METRICS_HOST:MATCHAWARDS_METRICS_PORT、デフォルトは 127.0.0.1:9765)が、Prometheus テキスト形式で GET /metrics を提供します。認証には Authorization: Bearer <token> が必要です(指定がない場合は 401)。/mcp ポートでは /metrics は提供されません(404)。プロキシからの X-Real-IP を信頼するため、ネットワーク上では Prometheus がスクレイプするメトリクスポートのみを公開してください。すべてのメトリクスはメモリ上に保存され、再起動時にリセットされます。すべてのラベル値は固定の集合から取得され、クライアントアドレス、サブジェクト、引数が使われることはありません。
mcp_tool_calls_total{tool,outcome}(カウンター):ツール呼び出し(使用状況台帳には呼び出しごとに 1 行が書き込まれます)。mcp_tool_duration_seconds{tool}(ヒストグラム、バケットは 0.1 0.25 0.5 1 2.5 5 10 20 30 秒):同じ呼び出しのツール呼び出しレイテンシ。mcp_requests_total{method}(カウンター):JSON-RPC メソッド別に/mcpで処理されたリクエスト。mcp_rejected_total{reason}(カウンター):rate_limit_client、rate_limit_prefix、rate_limit_subject、rate_limit_egress、rate_limit_global、size、host、path、method。mcp_agent_requests_total{family}(カウンター):User-Agent ファミリー別に処理されたリクエスト。mcp_clients_total{client}(カウンター):clientInfo.nameによるinitializeリクエストを、chatgpt、claude、cursor、vscode、n8n、matchawards、mcp-inspector、other、unknownに分類します。mcp_distinct_callers{kind,window}(ゲージ。windowは1hまたは24h):一意なclientネットワーク(/24 または /48。プローブと独自のテストは除外)と、一意な ChatGPT ユーザー(chatgpt_subject:ChatGPT のエグレスアドレスからのリクエストに含まれるx-openai-subject)。プロセスごとのソルト付きハッシュとして保持され、種別ごとに最大 100,000 件です。一意な呼び出し元のゲージは再起動時にリセットされるため、24h の値が完全になるのは起動から 24 時間後です。mcp_distinct_evictions_total{kind}(カウンター):上限を超えないように削除された一意な呼び出し元のキー(新しいネットワークまたはサブジェクトが大量に押し寄せた場合にのみゼロ以外になります)。この値がゼロより大きい間、一意な呼び出し元の数は下限値です。呼び出し元がサブジェクトまたはネットワークを切り替えると、ほかの呼び出し元が追い出される可能性があります。mcp_ledger_errors_total(カウンター):書き込みに失敗した使用状況台帳の記録。
運用上の注意
- コンテナーを再構築してもファイルが保持されるよう、
/dataにボリュームをマウントするか、MATCHAWARDS_USAGE_DBを設定してください。 - ChatGPT のフィンガープリントを使用するには、nginx からコンテナーに
x-openai-subjectを渡す必要があります(ヘッダーがクリアされない限り、デフォルトで渡されます)。また、MATCHAWARDS_USAGE_SALTを設定して安定した値に保ってください。新しいソルトを設定すると、新しいフィンガープリントが生成されます。 - Docker の場合は、
MATCHAWARDS_METRICS_HOST=0.0.0.0を設定し、メトリクスポートは内部ネットワークでのみ公開してください。
データ
データは、matchawards.com から取得した米国連邦および州の契約案件、助成金、求人、連邦契約の落札情報、助成金の採択情報です。公開投稿のみを返し、各結果には matchawards.com の該当ページへのリンクが含まれます。
- 契約案件と助成金の検索では、デフォルトで募集中の項目が返されます。回答期限が米国東部時間で本日以降のものです。期限が設定されていない項目は締め切り済みとして扱われます。
- 求人検索の対象期間は過去30日間です。
- 結果は新しい順に表示されます。
has_moreが true の場合、モデルはcursorを指定して次のページを取得できます。 - フィルターが絞り込まれている場合(特定の機関や珍しい名称など)、該当する結果がないまま最新のレコードをスキャンし、さらに古いレコードが残っていることがあります。その場合、結果の
warningにその旨と、続行に使うcursorが示されます。 - 検索の最初のリクエストに失敗した場合、ツールはエラーを返します。後続ページの取得に失敗した場合は、すでに取得した行を返し、停止した理由を
warningに示します。 - 予期しない形式の結果行は除外され、その件数が
warningに記録されます。残りの検索結果は返されます。 - 各 API 呼び出しは10秒でタイムアウトします。
- API には IP ごとのレート制限があります。1分あたり60リクエストに加え、5秒あたり20リクエストのバースト制限があります。フィルターが絞り込まれて結果が少ない場合、1回の検索呼び出しで最大3件のリクエストを使用することがあり、機関名の照会にさらに1件使用する場合があります(キャッシュ期間は10分です)。制限に達すると、ツールは待機すべき秒数を示すエラーを返します。
開発
python -m venv .venv
.venv/bin/pip install -e ".[test]"
.venv/bin/pytest
テストではネットワークへの呼び出しは行いません。
tests/golden/prompts.json には、クライアントでツール選択を手動確認するためのプロンプトと、モデルが選択すべきツール(またはなし)が記載されています。
ライセンス
MIT。LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。