Skip to main content
Glama
PNX89

QUENCHZ

by PNX89

QUENCHZ

stdio の MCP サーバーは、コンテキストを共有する呼び出し元が一つであることから、四つのものを無償で手に入れる。トランスポートがリモートになると、そのひとつひとつが決定事項となり、そのすべてがここで公開の上で決定され、Python ツリーの外部から証明される。

CI Python TypeScript client License: MIT Data: ECB

あなたが書いていない呼び出し元に MCP ツールを提供する。その四つとは audience(対象者)、reach(到達範囲)、budget(予算)、coverage(カバレッジ)であり、それぞれが、レビューアが失敗を観察できるテストによって反証可能である。

{
  "observations": [
    ["2026-03-30", 1.1484],
    ["2026-03-31", 1.1498],
    ["2026-04-01", 1.1605],
    ["2026-04-02", 1.1525],
    ["2026-04-07", 1.1557],
    ["2026-04-08", 1.1706],
    ["2026-04-09", 1.1685],
    ["2026-04-10", 1.1711]
  ],
  "coverage": {
    "requested_from": "2026-03-30",
    "requested_to": "2026-04-10",
    "requested_calendar_days": 12,
    "expected_observations": 8,
    "delivered_observations": 8,
    "delivered_from": "2026-03-30",
    "delivered_to": "2026-04-10",
    "absent": {
      "target_closed": 4,
      "not_yet_published": 0,
      "no_such_observation": 0,
      "before_the_series": 0
    },
    "window_still_open": false,
    "body_completed_at": "2026-08-26T12:00:00Z",
    "source": "ECB statistics."
  },
  "source": "ECB statistics."
}

12暦日が要求され、8日が返ってきた、そして応答は完全である。聖金曜日、イースターマンデー、週末は欠落ではなく閉場であり、ベンダーのペイロードはそれらのいずれについても何も語らない。その違いを見分けるには公表カレンダーと壁時計が必要であり、それが coverage ブロックの役割である: [src/quenchz/coverage.py]。

それはすべてをモデル化するわけではない。不在の原因として名前の付いた三つと、系列が存在する前の日付に対する四つ目を再構成する。誰も考えつかなかった五つ目は、真の欠落として数えられるだろう。証明書はデフォルトのない必須フィールドであるため、観測値を返すツールは証明書なしでは応答できない。

出典: ECB 統計。

要求した十二日、届いた八日

上記の証明書は、データの横に書かれた要約ではない。それは戻り値の必須フィールドであり、応答から読み取るのではなく公表カレンダーから再構成される。応答にはそれが含まれていないからである。

field

回答内容

requested_calendar_days

呼び出し元が要求した内容

expected_observations

カレンダーが期日としている内容

delivered_observations

到着した内容

absent.target_closed

市場が閉場していた

absent.not_yet_published

本日期日であり、まだ公開されていない

absent.no_such_observation

期日は来ていたのに遅れており、誰かが知るべきである

absent.before_the_series

系列が始まっていなかったため、元々期日は存在しない

最後の行は、1990年の期間を求めるレビューを受けて追加された。1990年にはユーロは存在しなかった。証明書は expected_observations: 261 と答え、261 すべてを真の欠落として数えたが、これは利用可能な答えの中でも最悪のものだ。何も期日がなかった日に、261件の欠落レートを確信を持って報告するものだからである。

Related MCP server: OPNsense MCP

何にも到達しない有効なトークン

信頼された発行者によって発行され、正しく署名され、有効期限が切れておらず、正しいスコープを持ち、異なるリソース宛てに作られたトークンは、ここでは何にも到達しない。

そのチェックは手で書かなければならない。SDK は AccessToken に RFC 8707 の resource フィールドを持つが、それを何とも比較しない。BearerAuthBackend はベアラー接頭辞、真偽値、有効期限をチェックし、その後 resource をそのまま素通しする。SDK は、発行するトークンを発行者に audience 限定にするよう指示するが、リソースサーバーがそのように限定されていることをチェックすることについてはまったく語らない。SDK が依然としてそのように振る舞うことを二つのテストが検証している。そのため、もしリリースがその強制を始めた場合、この主張は静かに誤りになるのではなく、派手に崩れる。

audience がリストであるトークンも拒否される。PyJWT なら受け入れるだろう。 RFC 7519 は audience をメンバーシップテストとして扱うため、このリソース別のリソースの両方に宛てて作られたトークンはライブラリを通過する。しかしここは通過できない。他のどこかでも有効なトークンは、他のどこかがこの扉に提示できるトークンでもあり、それは RFC 8707 が回避するために存在する状況である。

呼び出し元は、自分が使えないものを知ることもできない。許可されたスコープの外にあるツールはその一覧に存在せず、それでも要求すると、存在しなかった名前を要求した場合と同一のバイト列が返る。これには実際の代償がある。本当にスコープを打ち間違えた人は、本来得られたかもしれないメッセージよりも役に立たないメッセージを受け取る。それでも価値があるのは、SDK 自身のスコープ拒否が Required scope: <name> と答えるからである。これはツールが存在することを確認させ、機能したであろう付与を名指しする。そして、それに対する百回の推測は、サーバーが、見ることを決して許されなかった呼び出し元のために描いた攻撃面の地図になる。

サーバーを起動する

uv sync --dev
uv run pytest

サーバー(自身のトークンをファイルに発行するインプロセス発行者を備えたもの):

uv run python -m quenchz.interop_server --port 8931 --tokens-file tokens.json

署名鍵はメモリ内で生成され、ディスクに触れることはない。すべてのホスト名は RFC 2606 の予約済み .invalid TLD を使用しており、決して名前解決されない。

二人の呼び出し元と、どちらにも見えない一つの予算

ベンダーはどのページにもレート制限を記載しておらず、どの応答にもレート制限ヘッダーを送らず、ステータスコードの中に 429 も挙げていない。したがって、ここで事後対応型のリミッターは不完全なのではなく、不可能である。従来のシグナルはどちらも存在せず、観測できないものに対してバックオフすることはできないからだ。したがって、予算は事前に選択され、自己課されたものである。それはベンダーが強制するいかなるものとも一致せず、一致するという主張もされていない。

単純な設計はソースに残されており、その差は主張ではなく測定になる。同じ到着パターン、両方の設計:

設計

貪欲な呼び出し元が許可された数

静かな呼び出し元がその後に許可された数

共有バケットが一つ

60

60 中 0

それぞれにリザーブ、さらに共有の予備

45

60 中 15、ちょうどそのリザーブ分

拒否された呼び出しもカウントされる。もし拒否が無料なら、それらを同一にするために払われた注意は無駄になる: 呼び出し元はそれらを読む必要すらなく、百の名前を要求して、そのうちどれが自分自身の許可率を動かしたかを見ればよいからだ。

Python の外から証明する

[clients/typescript/src/prove.ts] は、公式の MCP TypeScript SDK を使って実行中のサーバーを、独自の CI ジョブで駆動する。それはテスト対象とコードを一切共有しない。これは重要である。Python のテストスイートと Python サーバーは、プロトコルについて真実でない何かについて互いに合意できてしまうからだ。

16 件のチェック。このリソース用のトークンは 200 で許可される。別のリソース用、二つのリソース用、またはどのリソース用でもないトークンは、401 と Bearer チャレンジで拒否される。許可されていないツールと存在しないツールは、同一のバイト列で拒否される。バーストする呼び出し元は算術が示すところで停止し、静かな呼び出し元は依然としてちょうど自分のリザーブを得る。

その証明自体にも、記録する価値のある欠陥があった。最初のバージョンは connect() が例外を投げたかどうかを尋ね、どんな例外も拒否として扱った。そのため、故意に壊したビルドが検証器を例外発生させ、サーバーが 500 と答えたとき、証明は成功を報告した。すべてに 500 と答えるサーバーは、このページのすべての audience チェックを満たしていたはずだ。現在はステータスを読んでいる。

ベンダーが書き留めるもので、ペイロードが書き留めないもの

ここには三つの時刻があり、クライアントに見えるのはそのうちの二つだけである。

時刻

内容

所在

14:10 CET 頃

中央銀行間のコンセルタシオン

ベンダーの記述

14:15 CET

レートが参照する瞬間

ペイロード内TITLE_COMPL として

16:00 CET 頃

レートが実際に公開される時刻

ベンダーの記述のみ

ペイロード自身のメタデータを読み、レートは 14:15 に利用可能だと結論するクライアントは、約2時間の誤差を抱え、毎日午後、まだ公開されていない日を本当の欠落と呼ぶことになる。ペイロードは制約を省略しているだけではない。それは、権威のように見えてしかも使うべきではない別の時刻を運んでいる。

欠落のエンコーディングも変わっていた。それは、行を数えるクライアントを書いて、値を数えるクライアントより 62 大きい数値を得たことで発見された。全系列は 7,140 行 であり、7,078 個の値62 個のプレースホルダー を運んでいる。2012年5月までは、休場日は空の値と OBS_STATUSH の行として到着し、それ以降は行としてまったく到着しない。同じカレンダー、二つのエンコーディング、そしてどちらの時代でも正しいのは値だけを数えることである。

四つの決定と、それぞれの代償

audience は門であり、署名ではない。 代償: 他では有効なトークンはここでは拒否されるため、広いスコープのトークンを保持する呼び出し元は、より狭いトークンを得るために自分の発行者のもとへ戻らなければならない。

スコープはディスパッチ時に拒否され、トランスポートによって拒否されることはない。 代償: スコープを打ち間違えた正規の呼び出し元は、何も教えてくれない拒否を受け取る。

各呼び出し元は、他の誰も使うことのできないリザーブを持つ。 代償: 単独の呼び出し元はそこから何も得られず、もう一方の呼び出し元がたまたまアイドルであるとき、バーストはもはや予算全体を使うことができない。

証明書は必須であり、デフォルトを持たない。 代償: 観測値を返すすべてのツールは証明書を計算しなければならない。何も欠落していなかったという答えのものも含めて。

制限事項

  • 発行者はローカルかつインプロセスである。実際のアイデンティティプロバイダーについては何も主張されていない。ここにあるものはそのようなプロバイダーに近づいたことすらない。

  • 予算は自己課したものである。それは、ベンダーが公開しているいかなる制限にも対応しない。ベンダーは何も公開していないからである。

  • 証明書は、名前の付いた四つの原因を再構成する。考えつかなかった五つ目は真の欠落として数えられる。これは安全な方向ではあるが、完全であることと同じではない。

  • ECB 参照レートは毎日公表される参照値であり、取引可能な価格ではない。ここにあるものはそれらを取引可能な価格として扱わない。オーダーブックも、マッチングエンジンも、実行経路もない。

  • カセットには日付がある。それらは、記録された日にベンダーが返したものを証明するだけで、今日ベンダーが返すものについては何も証明しない。

  • ここにあるものは、ECB の推奨を受けておらず、ECB と提携してもいない。

開発

uv run pytest
uv run python scripts/readme_block.py

このページのすべての数値とすべてのブロックは、tests/test_readme.py によって、それが説明する対象と照合される。上記の応答本文は生成されたものであり、書き写されたものではない。

ライセンス

MIT。LICENSE を参照。

データは、統計の再利用に関する ESCB ポリシー に基づいて再利用される。このポリシーは、無料での利用を三つの条件付きで許可する。出典が引用されていること、統計とメタデータが変更されていないこと、そして第三者のデータが含まれていないことである。その三つはすべて、[tests/test_licence.py] におけるテストであり、約束ではない。出典: ECB 統計。

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enforces fine-grained, context-aware access control on MCP tool calls, with a tamper-evident, replayable audit log that records denials and verifies every decision.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables remote agents to securely read firewall and NAT rules, inspect routing tables and logs, and execute safety-gated mutation plans through a bearer-authenticated MCP endpoint.
    -
  • A
    license
    A
    quality
    C
    maintenance
    Enables policy-governed MCP interactions with deterministic authorization, tenant isolation, minimized PII exposure, and human approval gates for sensitive mutations, while producing structured audit events.
    3
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables MCP clients to govern downstream tool servers by enforcing default-deny authority and attestation on every tool call, with live monitoring, approval, and mid-session revocation.
    3
    Apache 2.0