connect('elicitation', $this->clientAnswering( new ElicitResult(ElicitAction::Accept, ['name' => 'Ada']), )); $result = $client->callTool('ask_name'); $this->assertFalse($result->isError); $this->assertInstanceOf(TextContent::class, $result->content[0]); $this->assertSame('accept:Ada', $result->content[0]->text); } #[TestDox('a declined elicitation reaches the tool as a decline, not an error')] public function testDeclinedElicitation(): void { $client = $this->connect('elicitation', $this->clientAnswering( new ElicitResult(ElicitAction::Decline), )); $result = $client->callTool('ask_name'); $this->assertInstanceOf(TextContent::class, $result->content[0]); $this->assertSame('decline:', $result->content[0]->text); } #[TestDox('a client that does not advertise elicitation is not asked')] public function testCapabilityIsVisibleToTheServer(): void { // The tool consults supportsElicitation(), which answers from the // capabilities this client sent during the handshake. $client = $this->connect('elicitation'); $result = $client->callTool('ask_name'); $this->assertInstanceOf(TextContent::class, $result->content[0]); $this->assertSame('unsupported', $result->content[0]->text); } #[TestDox('a client advertising elicitation without a handler fails the tool call')] public function testAdvertisedCapabilityWithoutHandler(): void { // The client answers "method not found", which the gateway raises inside // the tool as a ClientException rather than leaving it waiting. $client = $this->connect( 'elicitation', $this->clientBuilder()->setCapabilities(new ClientCapabilities(elicitation: true)), ); $result = $client->callTool('ask_name'); $this->assertInstanceOf(TextContent::class, $result->content[0]); $this->assertSame('Client does not handle "elicitation/create" requests.', $result->content[0]->text); } private function clientAnswering(ElicitResult $answer): ClientBuilder { $callback = new class($answer) implements ElicitationCallbackInterface { public function __construct(private readonly ElicitResult $answer) { } public function __invoke(ElicitRequest $request): ElicitResult { return $this->answer; } }; return $this->clientBuilder() ->setCapabilities(new ClientCapabilities(elicitation: true)) ->addRequestHandler(new ElicitationRequestHandler($callback)); } }