[Client] HttpTransport resumes an Amp-suspended Fiber with a JSON-RPC error
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 45/100
- issue の種類
- バグ
- 明瞭さ
- おおむね明確
- 活発さ
- 活発
- 技術スタック
- php, symfony
- 領域
- api, backend, networking
調査の方向性
src/Client/Transport/HttpTransport.php から始めて connect()、send()、processFiber() を追跡し、その後、レポートに記載された v0.7.1、v0.8.1、main の挙動を比較します。Amp ベースの PSR-18 クライアントを明示的に注入し、初期化タイムアウトを設定して再現します。Amp によって suspend された Fibers が MCP エラーで再開されないこと、またはサポートされていないクライアントが文書化され、関連するエラーで拒否されることが完了の条件です。
索引モデルが issue の本文から書いたものです。
説明
Describe the bug
HTTP MCP initialization fails with a type error when the HTTP request uses Amp:
HTTP request failed: Amp\Internal\FutureIterator::consume(): Return value must be of type ?array, Mcp\Schema\JsonRpc\Error returned
The suspected cause is competing ownership of the same Fiber. HttpTransport::processFiber() checks whether the active Fiber is suspended, then resumes it with a JSON-RPC response or timeout error. However, an Amp-backed PSR-18 client can suspend that Fiber during sendRequest(), before the SDK reaches its own response wait. The timeout error then reaches Amp's suspension instead of the SDK's response wait.
To Reproduce
Observed in a CLI application using mcp/sdk v0.7.1, with HTTP client discovery left enabled. Three separate HTTP MCP servers fail during initialization, each after approximately 30 seconds.
Steps to isolate the suspected integration conflict:
- Use the SDK HTTP transport with Symfony's
Psr18Client, explicitly backed byAmpHttpClient, so backend selection does not depend on the host's cURL capabilities. - Configure an HTTP MCP endpoint and an initialization timeout.
- Connect through the SDK client.
- Observe whether the SDK resumes the Fiber while Amp is waiting for HTTP I/O, causing the type error above when the initialization timeout expires.
These isolation steps are proposed, not a separately executed minimal reproduction. The application failure and logs below are observed. We have not yet reproduced the failure with an explicitly injected Amp client or rerun it on v0.8.1.
Expected behavior
The HTTP transport must not resume a Fiber suspended by the injected HTTP client. Initialization should complete, or fail with the relevant transport or initialization error, without passing a JSON-RPC object into Amp's internal suspension.
If Fiber-suspending PSR-18 clients are unsupported, that restriction should be documented and enforced rather than failing with an unrelated return-type error.
Logs
Sanitized excerpts from the same application session on 2026-09-09. Each failure was for a different HTTP MCP server:
21:55:26.003694Z MCP server discovery failed
HTTP request failed: Amp\Internal\FutureIterator::consume(): Return value must be of type ?array, Mcp\Schema\JsonRpc\Error returned
21:55:56.000764Z MCP server discovery failed
HTTP request failed: Amp\Internal\FutureIterator::consume(): Return value must be of type ?array, Mcp\Schema\JsonRpc\Error returned
21:56:26.000375Z MCP server discovery failed
HTTP request failed: Amp\Internal\FutureIterator::consume(): Return value must be of type ?array, Mcp\Schema\JsonRpc\Error returned
Additional context
Application dependency lock:
mcp/sdk: v0.7.1, commit785fc3b9b7006ecc8a73322c939d96a4a7154345symfony/http-client: v8.1.5amphp/amp: v3.1.3amphp/http-client: v5.3.6revolt/event-loop: v1.0.9
Relevant source:
- SDK v0.7.1 HttpTransport:
connect()starts an active Fiber.send()calls the PSR-18 client inside it.processFiber()resumes the active Fiber with a JSON-RPC error when a pending request times out. - Amp v3.1.3 FutureIterator:
consume(): ?arrayreturns the value supplied to its event-loop suspension. Receiving an MCP error object here matches the observed exception. - SDK v0.8.1 HttpTransport: source inspection shows the same unconditional resume of a suspended active Fiber. The same logic was also present on
mainwhen checked on 2026-09-09. This is source evidence, not a runtime reproduction on those revisions.
Explicitly injecting Symfony's Psr18Client backed by CurlHttpClient is a proposed application workaround. It has not yet been validated for this failure. It would avoid the Amp path but would not fix Fiber ownership in the SDK.
A search of upstream issues and PRs for Amp, amphp, FutureIterator, and fiber did not find a matching report. PR #425 addresses HTTP status handling, not this suspension conflict.
- 主要言語
- PHP
- スター
- 1.6k
- フォーク
- 173
- 平均マージ
- 2日 49分
- マージ済み PR(30日)
- 23
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
modelcontextprotocol/php-sdk のほかの issue
-
[Server] Handler type uses bare Closure, hard to decorate RegistryInterface under strict PHPStan オープンServer
難易度 1/5 1時間未満 初心者へのやさしさ 78/100
modelcontextprotocol/php-sdk#468 · コメント 2 件 ·
-
needs confirmation needs maintainer action Server
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
modelcontextprotocol/php-sdk#398 · リアクション 1 件 ·
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
modelcontextprotocol/php-sdk#370 ·
-
enhancement
難易度 4/5 3〜5日 初心者へのやさしさ 55/100
modelcontextprotocol/php-sdk#510 · コメント 1 件 ·
-
bug P2 Server
難易度 4/5 3〜5日 初心者へのやさしさ 68/100
modelcontextprotocol/php-sdk#498 · コメント 2 件 ·
modelcontextprotocol/php-sdk の issue をすべて見る
似ている issue
-
sync-en
難易度 1/5 1〜3時間 初心者へのやさしさ 85/100
-
[6.x]: "Cannot use object of type stdClass as array" loading Users index (regression of #19182) オープン
難易度 1/5 1時間未満 初心者へのやさしさ 90/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
getgrav/grav-plugin-api#45 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
RSS-Bridge/rss-bridge#5098 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
phingofficial/phing#2025 ·