vMCP: accept an access token for the one call its authorization_details names, once
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 35/100
- issue の種類
- 機能追加
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
- 技術スタック
- go
調査の方向性
Start with #7061 and the vMCP authorization and request-handling entry points, then read the linked Mecatl credentials-and-lifecycle.md steps (8) and (9) and implementation.md work list. Trace where tokens, sessions, and tool and list calls are checked, and identify the shared storage used across replicas. Done means the acceptance cases pass, including RFC 8785 hash vectors, single-use jti, open-call messages after token expiry, and unchanged behavior for tokens without authorization_details.
索引モデルが issue の本文から書いたものです。
説明
Part of #6406. Depends on: #7061 (the authorization server puts the mcp_tool_call entry in the token). Related: #6779 (session binding for list methods), #6888 (session bound to act), #6979 (reported operation IDs).
Problem: with the token narrowed to one call by its authorization server, the vMCP must enforce it: a token issued for one tool call with given arguments must not start another call, and must not start the same call twice.
Change: when an access token carries an authorization_details entry of type https://toolhive.dev/mcp_tool_call:
- Tool call: accept a
tools/callonly if its server,params.name, and argument hash match the entry. Compute the hash as the lowercase hex SHA-256 of the RFC 8785 (JCS) serialization ofparams.argumentsas received, or of{}when absent, before any routing, prefix stripping, or rewriting. Refuse arguments that are not I-JSON (RFC 7493). - List call: a token whose entry names a list method accepts only that list call on that server, and cannot start a
tools/call. - Single use: a token's
jtistarts at most one call. Record eachjtiwith the call it started untilexpplus the clock skew or the end of that call, whichever is later, in storage shared by all replicas; refuse a second call with the samejti, including on another replica. - Messages for the open call: accept the session handshake during the token's lifetime, and messages that belong to the call it started (cancellation, progress, elicitation replies, matched by JSON-RPC ID and session) for as long as that call is open, even after the token expires, up to a configured maximum call duration. The token's
explimits only when a call can start. - Refusal: a mismatch or a reused
jtiis refused with 403insufficient_scopeand recorded. - Tokens without the entry behave exactly as today.
Where it runs: a Go check in the vMCP's existing admission seam, next to its open tracking items, before the Cedar check, as a required condition that can only deny more. Cedar can't express the exact-argument check (it has no hash, and arrays are sets), and cedar-go has no extension hook.
Acceptance:
- a
tools/callmatching the entry runs; a different server, tool, or argument set is refused, including arguments that differ only after the vMCP rewrites the request; - a second
tools/callwith the same token is refused, on the same or another replica; - a cancellation or elicitation reply for the open call is accepted after the token expires, and refused once the call has ended or passed the maximum call duration;
- a list-call token cannot start a
tools/call; - the hash matches a shared set of test vectors (number formatting, large and negative numbers, Unicode escapes, key order, nesting, absent
arguments), the same vectors Mecatl's client uses; - tokens without the entry are unaffected.
Context: Mecatl agent identity design, credentials-and-lifecycle.md steps (8) and (9) and implementation.md "ToolHive work list". Tracked in stacklok/mecatl#2570 (phase 2). The Stacklok Enterprise Platform connector gateway needs the same enforcement (stacklok/stacklok-enterprise-platform#5697).
- 主要言語
- Go
- スター
- 2.3k
- フォーク
- 326
- 平均マージ
- 1日 53分
- マージ済み PR(30日)
- 155
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
stacklok/toolhive のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
stacklok/toolhive#6925 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
proxyrunner tool-filter middleware strips SEP-2322 Modern envelope from tools/list, breaking vMCP health checks再び着手できるかも @alex-feel が 46 日前に担当しましたが、オープン中のプルリクエストはありません。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
stacklok/toolhive#6684 · コメント 5 件 · リアクション 1 件 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
-
HttpClientBuilder.Build() ignores HTTP(S)_PROXY (auth-server OAuth/DCR calls bypass forward proxy)対応中かも @schonmann が 37 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
stacklok/toolhive#6671 · コメント 2 件 · リアクション 1 件 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
-
Delete the dead pkg/vmcp/server/adapter package再び着手できるかも @suantea が 30 日前に担当しましたが、オープン中のプルリクエストはありません。 オープンneeds-triage
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
メンテナーはふだん 1 日以内に返信
-
Outgoing strategies differ on no-subject-provider fallback (xaa hard-fails, token_exchange and aws_sts fall back) and it is undocumented再び着手できるかも このイシューのプルリクエストはマージされずにクローズされました。 オープンbug
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
メンテナーはふだん 1 日以内に返信
stacklok/toolhive の issue をすべて見る
似ている issue
-
openshell image: provide /sandbox so the workspace path can be uniform across OpenShell driversオープン
難易度 2/5 1〜3時間 初心者へのやさしさ 77/100
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
jasonfen/terminal-space-program#949 ·
メンテナーはふだん 1 日以内に返信
-
[bug]: scan-all update-schedule does not auto-convert 5-field cron expressions as documented対応中かも @vishnums2k5 が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
goharbor/harbor-cli#1143 · コメント 1 件 ·
メンテナーはふだん 8 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 73/100