View a markdown version of this page

Use a elicitação com seu gateway AgentCore - Base da Amazônia AgentCore

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Use a elicitação com seu gateway AgentCore

A elicitação é um recurso de MCP que permite que um servidor MCP solicite informações adicionais do cliente durante uma chamada de ferramenta. Quando uma ferramenta precisa de confirmação do usuário, autenticação ou entrada adicional para continuar, o servidor envia uma solicitação de elicitação de volta ao cliente. AgentCore O Gateway encaminha solicitações de elicitação de alvos do servidor MCP para seus clientes, substituindo a solicitação por um identificador id gerado pelo gateway.

Pré-requisitos

Para usar a elicitação com seu gateway, você deve ter:

  • Sessões habilitadas (versão 2025-11-25 e anterior) — A elicitação requer suporte de sessão. Consulte Usar sessões MCP com seu gateway. Para versões 2026-07-28 posteriores, você não precisa adicionar sessionConfiguration ao seu gateway, pois essas versões não têm estado.

  • Streaming de resposta ativado (versão 2025-11-25 e anterior) — As solicitações de elicitação são enviadas como blocos de Server-Sent Eventos (SSE) durante uma conexão aberta. streamingConfiguration.enableResponseStreamingDefina como true no seu gatewayprotocolConfiguration.mcp. Para a versão 2026-07-28 e posterior, você não precisa ativar o streaming de respostas. Essas versões fornecem elicitação por meio do padrão de várias solicitações de ida e volta (MRTR) em vez de uma solicitação iniciada pelo servidor no fluxo de resposta. Para obter mais informações, consulte Várias solicitações de ida e volta na documentação do Model Context Protocol.

  • Tipo de alvo do servidor MCP — A elicitação só é suportada para alvos do servidor MCP. A elicitação se origina do servidor MCP e é encaminhada pelo gateway para o cliente.

  • O cliente declara a capacidade de elicitação — O cliente deve declarar suporte à elicitação para que o gateway encaminhe solicitações de elicitação. Para a versão 2025-11-25 e anteriores, o cliente declara esse suporte na initialize solicitação. Para a versão 2026-07-28 e posterior, o cliente declara os recursos para cada solicitação no _meta campo (io.modelcontextprotocol/clientCapabilities).

Modos de elicitação suportados

AgentCore O gateway suporta três modos de elicitação definidos pela especificação MCP:

Modo Description

Modo de formulário

O servidor envia um formulário estruturado com campos para o cliente preencher. Usado para coletar confirmações, preferências ou dados de entrada do usuário. A solicitação permanece aberta enquanto aguarda a resposta.

Modo URL (baseado em solicitação)

O servidor envia uma URL que o usuário deve visitar para concluir uma ação (normalmente autenticação). A solicitação permanece aberta enquanto aguarda a conclusão da ação.

Modo URL (baseado em exceções)

O servidor lança um URLElicitationRequiredError contendo um URL. A solicitação é fechada, o usuário conclui a ação na URL e o cliente repete a chamada da ferramenta original.

Negociação de capacidades

O gateway só declara suporte de elicitação para um alvo de servidor MCP se:

  1. O cliente declarou apoio à elicitação. Para a versão 2025-11-25 e anteriores, o cliente declara isso duranteinitialize. Para a versão 2026-07-28 e posterior, o cliente a declara para cada solicitação em_meta.

  2. A versão do protocolo MCP suporta o modo de elicitação. formo modo requer uma versão 2025-03-26 ou posterior. urlos modos exigem uma versão 2025-11-25 ou posterior.

  3. O gateway corresponde aos recursos específicos de elicitação declarados pelo cliente (formulário, url ou ambos).

Fluxo de elicitação no modo de formulário

nota

O fluxo descrito aqui se aplica à versão 2025-11-25 e anteriores, em que o servidor envia elicitation/create como uma solicitação iniciada pelo servidor no fluxo SSE aberto. Para a versão 2026-07-28 e versões posteriores, a elicitação usa o padrão de várias solicitações de ida e volta (MRTR). O servidor retorna um resultado provisório e o cliente repete a solicitação original com a entrada coletada. Para obter mais informações, consulte Várias solicitações de ida e volta na documentação do Model Context Protocol.

  1. O cliente envia uma tools/call solicitação com o Mcp-Session-Id cabeçalho.

  2. O gateway encaminha a chamada da ferramenta para o alvo do servidor MCP.

  3. O alvo abre um fluxo SSE e envia uma elicitation/create solicitação como primeiro evento.

  4. O gateway encaminha a elicitation/create solicitação para o cliente no fluxo SSE, substituindo a solicitaçãoid.

  5. O cliente apresenta o formulário ao usuário e coleta a resposta.

  6. O cliente envia uma nova solicitação com a resposta de elicitação (ação: accept oudecline) usando a mesma. Mcp-Session-Id

  7. O gateway encaminha a resposta para o alvo do servidor MCP.

  8. O alvo reconhece com HTTP 202 Accepted.

  9. O alvo conclui a chamada da ferramenta e envia o resultado final no fluxo SSE original.

  10. O gateway encaminha o resultado final para o cliente e fecha o stream.

Fluxo de elicitação do modo URL (baseado em exceções)

  1. O cliente envia uma tools/call solicitação com o Mcp-Session-Id cabeçalho.

  2. O gateway encaminha a chamada da ferramenta para o alvo do servidor MCP.

  3. O alvo gera um URLElicitationRequiredError JSON-RPC erro, contendo o URL e um ID de elicitação.

  4. O gateway encaminha o URLElicitationRequiredError para o cliente, substituindo a solicitaçãoid.

  5. O cliente redireciona o usuário para a URL fornecida para concluir a ação (normalmente autenticação OAuth).

  6. Depois que o usuário concluir a ação, o cliente repetirá a solicitação originaltools/call.

  7. O gateway encaminha a nova tentativa para o alvo. O alvo conclui a chamada da ferramenta desde que a elicitação do URL foi atendida.

  8. O Gateway encaminha o resultado final da ferramenta para o cliente.

Chamadas de ferramentas paralelas com elicitações

Um cliente pode iniciar várias tools/call solicitações na mesma sessão, mesmo quando uma elicitação estiver pendente. Cada elicitação é rastreada de forma independente por sua. id Ao enviar uma resposta de elicitação, o cliente deve incluir a mesma id que foi enviada pelo gateway na elicitation/create solicitação.

Orientação para desenvolvedores de destino do servidor MCP

Importante

Os alvos do servidor MCP que enviam solicitações de elicitação devem agrupar as chamadas de elicitação em blocos try-catch e tratar o caso em que o cliente não oferece suporte à elicitação. Se o cliente do gateway não declarou a capacidade de elicitação, o gateway não a declarará ao destino. Se o alvo enviar uma elicitação de qualquer maneira, o gateway retornará um erro -32601 (Método não encontrado) para o alvo.

Os servidores devem implementar um caminho alternativo (como usar valores padrão ou ignorar a operação) quando a elicitação não estiver disponível.

Protegendo o estado da solicitação (versão 2026-07-28 e posterior)

Na versão 2026-07-28 e posterior, a elicitação usa o padrão de múltiplas solicitações de ida e volta (MRTR), que transporta uma opacidade requestState entre o cliente e o destino do servidor MCP. Proteger esse valor é uma responsabilidade compartilhada: o gateway o autoriza e o encaminha sem armazená-lo, enquanto o destino do servidor MCP deve validá-lo e impedir que um usuário repita o estado de solicitação de outro usuário. Para ver o modelo completo de responsabilidade compartilhada e as diretrizes de proteção que seu servidor MCP deve seguir, consulte Protegendo o estado da solicitação para elicitação e amostragem nas considerações sobre o alvo do servidor MCP.

Tratamento de erros

Cenário Erro Description

O cliente envia uma resposta de elicitação quando nenhuma elicitação está pendente

JSON-RPC -32600(Solicitação inválida)

Nenhuma elicitação correspondente encontrada para esta sessão.

O cliente envia uma resposta de elicitação com uma id que não corresponde a uma elicitação pendente

JSON-RPC -32600(Solicitação inválida)

Eles id devem corresponder ao enviado pelo gateway na elicitation/create solicitação.

Interrupções de conexão entre o gateway e o destino do servidor MCP

JSON-RPC erro com DependencyFailedException

O cliente deve tentar novamente a solicitação de chamada da ferramenta original.

Interrupções de conexão entre o cliente e o gateway

N/A

A elicitação pendente é eliminada. O cliente deve tentar novamente a chamada da ferramenta.

O servidor MCP envia elicitação, mas o gateway não declarou suporte

JSON-RPC -32601(Método não encontrado)

Retornado ao destino do servidor MCP. Consulte Solução de problemas.

Gateway-authored a elicitação requer uma capacidade que o cliente não declarou (versão 2026-07-28 e posterior)

JSON-RPC -32021(Falta a capacidade necessária do cliente), HTTP 400

Na versão 2026-07-28 e posterior, o gateway retorna esse código em vez de-32601. Isso acontece quando o cliente não declarou a capacidade necessária em sua solicitação_meta.

Solução de problemas

Erro: “Erro ao chamar a ferramenta 'sample_tool': Método não encontrado:” elicitation/create

Esse erro ocorre quando um alvo do servidor MCP envia uma solicitação de elicitação, mas o cliente do gateway não declarou a capacidade de elicitação. Para a versão 2025-11-25 e versões anteriores, o cliente declara esse recurso duranteinitialize. Para a versão 2026-07-28 e posterior, o cliente a declara para cada solicitação no _meta campo. O gateway retorna um erro -32601 (Método não encontrado) para o destino. O alvo pode retornar isso como um erro de execução da ferramenta para o cliente.

Para resolver:

  • Se você for o desenvolvedor do servidor MCP: Adicione o tratamento de erros às suas chamadas de elicitação. Implemente um caminho alternativo quando a elicitação não for suportada:

    try: result = await context.session.create_elicitation( message="Confirm this action?", requested_schema={"type": "object", "properties": {"confirm": {"type": "boolean"}}} ) except Exception as e: # Fallback when client doesn't support elicitation logger.warning(f"Elicitation not supported: {e}") result = default_action()
  • Se você for o desenvolvedor do cliente gateway: para versões anteriores 2025-11-25 e versões anteriores, certifique-se de que seu cliente declare a capacidade de elicitação durante: initialize

    { "capabilities": { "elicitation": { "form": {}, "url": {} } } }

Erro: “Falta a capacidade necessária do cliente” (-32021)

Na versão 2026-07-28 e posterior, o gateway retorna um -32021 erro (HTTP400) quando uma elicitação criada pelo gateway exige um recurso não declarado. Como essas versões não têm estado e não têm initialize aperto de mão, o cliente declara recursos em cada solicitação. Para resolver esse erro, inclua o recurso de elicitação no _meta campo (io.modelcontextprotocol/clientCapabilities) da solicitação em cada solicitação que possa acionar uma elicitação.

Exemplos de código

Exemplo de modo de formulário

No modo formulário, o servidor envia um esquema estruturado para o cliente preencher. A solicitação permanece aberta enquanto aguarda a resposta.

exemplo
Python requests package (2025-11-25 and earlier)

Nessas versões, o cliente declara a capacidade de elicitação durante initialize e a elicitação chega como uma elicitation/create solicitação no fluxo SSE aberto. Defina o MCP-Protocol-Version cabeçalho para uma versão compatível com seu gateway.

import requests import json import sseclient gateway_url = "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp" headers = { "Content-Type": "application/json", "Accept": "text/event-stream", "Authorization": "Bearer YOUR_ACCESS_TOKEN" } # Step 1: Initialize with elicitation capability init_response = requests.post(gateway_url, headers=headers, json={ "jsonrpc": "2.0", "id": "init-request", "method": "initialize", "params": { "protocolVersion": "2025-06-18", "capabilities": {"elicitation": {"form": {}, "url": {}}}, "clientInfo": {"name": "my-agent", "version": "1.0.0"} } }) session_id = init_response.headers["Mcp-Session-Id"] headers["Mcp-Session-Id"] = session_id headers["MCP-Protocol-Version"] = "2025-06-18" # Step 2: Call tool (streaming response) response = requests.post(gateway_url, headers=headers, json={ "jsonrpc": "2.0", "id": "tool-call-1", "method": "tools/call", "params": { "name": "use_aws", "arguments": {"command": "aws s3 rm s3://my-bucket/important-file"} } }, stream=True) # Step 3: Process SSE events client = sseclient.SSEClient(response) for event in client.events(): data = json.loads(event.data) if data.get("method") == "elicitation/create": elicitation_id = data["id"] print(f"Form elicitation received: {data['params']['message']}") # Step 4: Send elicitation response requests.post(gateway_url, headers=headers, json={ "jsonrpc": "2.0", "id": elicitation_id, "result": {"action": "accept", "content": {"confirm": True}} }) elif "result" in data: print(f"Tool result: {data['result']}") break
Python requests package (2026-07-28)

Na versão2026-07-28, a elicitação usa o padrão de várias solicitações de ida e volta em vez de uma solicitação iniciada pelo servidor no fluxo SSE. O cliente declara a capacidade de elicitação _meta em cada solicitação. Se a ferramenta precisar de entrada, a resposta será um input_required resultado contendo inputRequests e opacorequestState. O cliente coleta a entrada e repete a solicitação original com uma nova idinputResponses, a e a não modificada. requestState As sessões e o initialize aperto de mão não são usados. Seu gateway supportedVersions deve incluir2026-07-28.

import requests gateway_url = "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp" META = { "io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/clientInfo": {"name": "my-agent", "version": "1.0.0"}, "io.modelcontextprotocol/clientCapabilities": {"elicitation": {"form": {}, "url": {}}} } headers = { "Content-Type": "application/json", "Accept": "application/json, text/event-stream", "Authorization": "Bearer YOUR_ACCESS_TOKEN", "MCP-Protocol-Version": "2026-07-28", "Mcp-Method": "tools/call", "Mcp-Name": "use_aws" } arguments = {"command": "aws s3 rm s3://my-bucket/important-file"} # Step 1: Call the tool, declaring the elicitation capability in _meta response = requests.post(gateway_url, headers=headers, json={ "jsonrpc": "2.0", "id": "tool-call-1", "method": "tools/call", "params": {"name": "use_aws", "arguments": arguments, "_meta": META} }).json() result = response["result"] if result.get("resultType") == "input_required": # Step 2: Fulfill each input request (form elicitation) input_responses = {} for key, input_request in result.get("inputRequests", {}).items(): print(f"Form elicitation received: {input_request['params']['message']}") input_responses[key] = {"action": "accept", "content": {"confirm": True}} # Step 3: Retry the tool call with a new id, the input responses, # and the requestState echoed back unmodified retry_params = {"name": "use_aws", "arguments": arguments, "_meta": META, "inputResponses": input_responses} if "requestState" in result: retry_params["requestState"] = result["requestState"] response = requests.post(gateway_url, headers=headers, json={ "jsonrpc": "2.0", "id": "tool-call-2", "method": "tools/call", "params": retry_params }).json() result = response["result"] print(f"Tool result: {result}")
MCP Client
from mcp import ClientSession from mcp.client.streamable_http import streamablehttp_client import asyncio async def elicitation_handler(request): """Handle form elicitation requests from the server.""" print(f"Elicitation: {request.params.message}") return {"action": "accept", "content": {"confirm": True}} async def use_elicitation(url, token): headers = {"Authorization": f"Bearer {token}"} async with streamablehttp_client(url=url, headers=headers) as ( read_stream, write_stream, _ ): async with ClientSession( read_stream, write_stream, elicitation_handler=elicitation_handler ) as session: await session.initialize() result = await session.call_tool( name="use_aws", arguments={"command": "aws s3 rm s3://my-bucket/important-file"} ) print(f"Tool result: {result}") return result asyncio.run(use_elicitation( url="https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp", token="YOUR_ACCESS_TOKEN" ))
Strands MCP Client
from mcp.client.streamable_http import streamablehttp_client from mcp.types import ElicitResult from strands import Agent from strands.tools.mcp import MCPClient mcp_url = "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp" access_token = "YOUR_ACCESS_TOKEN" async def elicitation_callback(context, params): """Handle form elicitation requests from the MCP server target.""" print(f"Elicitation: {params.message}") user_response = get_user_input(params) # Your UI logic return ElicitResult(action="accept", content=user_response) mcp_client = MCPClient( lambda: streamablehttp_client( mcp_url, headers={"Authorization": f"Bearer {access_token}"} ), elicitation_callback=elicitation_callback, ) with mcp_client: agent = Agent(tools=mcp_client.list_tools_sync()) response = agent("Delete the file s3://my-bucket/important-file using AWS CLI") print(response)
LangGraph MCP Client
from langchain_mcp_adapters.client import MultiServerMCPClient from langchain_mcp_adapters.callbacks import Callbacks, CallbackContext from langchain.agents import create_agent from mcp.shared.context import RequestContext from mcp.types import ElicitRequestParams, ElicitResult async def on_elicitation( mcp_context: RequestContext, params: ElicitRequestParams, context: CallbackContext, ) -> ElicitResult: """Handle elicitation requests from MCP servers.""" print(f"[{context.server_name}] Elicitation: {params.message}") # Prompt user for input based on params.requestedSchema return ElicitResult( action="accept", content={"confirm": True}, ) client = MultiServerMCPClient( { "gateway": { "url": "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp", "transport": "http", "headers": {"Authorization": "Bearer YOUR_ACCESS_TOKEN"}, } }, callbacks=Callbacks(on_elicitation=on_elicitation), ) tools = await client.get_tools() agent = create_agent("claude-sonnet-4-20250514", tools) result = await agent.ainvoke( {"messages": [{"role": "user", "content": "Delete s3://my-bucket/important-file"}]} )

Exemplo de modo URL

No modo URL, o servidor envia uma URL que o usuário deve visitar para concluir uma ação (normalmente autenticação OAuth). A solicitação permanece aberta enquanto espera que o usuário conclua a ação no URL.

exemplo
Python requests package (2025-11-25 and earlier)

Nessas versões, a elicitação de URL chega como uma elicitation/create solicitação no fluxo SSE aberto em uma sessão MCP. Defina o MCP-Protocol-Version cabeçalho para uma versão compatível com seu gateway.

import requests import json import sseclient import webbrowser gateway_url = "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp" headers = { "Content-Type": "application/json", "Accept": "text/event-stream", "Authorization": "Bearer YOUR_ACCESS_TOKEN", "MCP-Protocol-Version": "2025-11-25", "Mcp-Session-Id": "session-abc123def456" } # Call tool that triggers URL elicitation response = requests.post(gateway_url, headers=headers, json={ "jsonrpc": "2.0", "id": "tool-call-2", "method": "tools/call", "params": { "name": "access_github_repo", "arguments": {"repo": "my-org/my-repo"} } }, stream=True) # Process SSE events client = sseclient.SSEClient(response) for event in client.events(): data = json.loads(event.data) if data.get("method") == "elicitation/create": elicitation_id = data["id"] url = data["params"]["url"] print(f"URL elicitation: {data['params']['message']}") # Open browser for user to complete authentication webbrowser.open(url) input("Press Enter after completing authentication...") # Send elicitation response requests.post(gateway_url, headers=headers, json={ "jsonrpc": "2.0", "id": elicitation_id, "result": {"action": "accept"} }) elif "result" in data: print(f"Tool result: {data['result']}") break
Python requests package (2026-07-28)

Na versão2026-07-28, a elicitação de URL chega como input_required resultado por meio do padrão de várias solicitações de ida e volta, em vez de no fluxo SSE. O usuário conclui a ação na URL e, em seguida, o cliente repete a solicitação original com uma nova idinputResponses, a e a não modificada. requestState As sessões não são usadas. Seu gateway supportedVersions deve incluir2026-07-28.

import requests import webbrowser gateway_url = "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp" META = { "io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/clientInfo": {"name": "my-agent", "version": "1.0.0"}, "io.modelcontextprotocol/clientCapabilities": {"elicitation": {"form": {}, "url": {}}} } headers = { "Content-Type": "application/json", "Accept": "application/json, text/event-stream", "Authorization": "Bearer YOUR_ACCESS_TOKEN", "MCP-Protocol-Version": "2026-07-28", "Mcp-Method": "tools/call", "Mcp-Name": "access_github_repo" } arguments = {"repo": "my-org/my-repo"} # Step 1: Call the tool, declaring the elicitation capability in _meta response = requests.post(gateway_url, headers=headers, json={ "jsonrpc": "2.0", "id": "tool-call-1", "method": "tools/call", "params": {"name": "access_github_repo", "arguments": arguments, "_meta": META} }).json() result = response["result"] if result.get("resultType") == "input_required": # Step 2: Open the browser for the user to complete each URL elicitation input_responses = {} for key, input_request in result.get("inputRequests", {}).items(): params = input_request["params"] print(f"URL elicitation: {params['message']}") webbrowser.open(params["url"]) input("Press Enter after completing authentication...") input_responses[key] = {"action": "accept"} # Step 3: Retry the tool call with a new id, the input responses, # and the requestState echoed back unmodified retry_params = {"name": "access_github_repo", "arguments": arguments, "_meta": META, "inputResponses": input_responses} if "requestState" in result: retry_params["requestState"] = result["requestState"] response = requests.post(gateway_url, headers=headers, json={ "jsonrpc": "2.0", "id": "tool-call-2", "method": "tools/call", "params": retry_params }).json() result = response["result"] print(f"Tool result: {result}")
MCP Client
from mcp import ClientSession from mcp.client.streamable_http import streamablehttp_client import asyncio import webbrowser async def elicitation_handler(request): """Handle URL elicitation by opening the browser.""" if hasattr(request.params, 'url') and request.params.url: print(f"Opening URL for authentication: {request.params.url}") webbrowser.open(request.params.url) input("Press Enter after completing authentication...") return {"action": "accept"} # Form mode fallback return {"action": "accept", "content": {}} async def use_url_elicitation(url, token): headers = {"Authorization": f"Bearer {token}"} async with streamablehttp_client(url=url, headers=headers) as ( read_stream, write_stream, _ ): async with ClientSession( read_stream, write_stream, elicitation_handler=elicitation_handler ) as session: await session.initialize() result = await session.call_tool( name="access_github_repo", arguments={"repo": "my-org/my-repo"} ) print(f"Tool result: {result}") return result asyncio.run(use_url_elicitation( url="https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp", token="YOUR_ACCESS_TOKEN" ))
Strands MCP Client
from mcp.client.streamable_http import streamablehttp_client from mcp.types import ElicitResult from strands import Agent from strands.tools.mcp import MCPClient import webbrowser mcp_url = "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp" access_token = "YOUR_ACCESS_TOKEN" async def elicitation_callback(context, params): """Handle URL elicitation by opening the browser.""" if hasattr(params, 'url') and params.url: print(f"Opening URL: {params.url}") webbrowser.open(params.url) input("Press Enter after completing authentication...") return ElicitResult(action="accept") return ElicitResult(action="accept", content={}) mcp_client = MCPClient( lambda: streamablehttp_client( mcp_url, headers={"Authorization": f"Bearer {access_token}"} ), elicitation_callback=elicitation_callback, ) with mcp_client: agent = Agent(tools=mcp_client.list_tools_sync()) response = agent("Access the my-org/my-repo GitHub repository") print(response)
LangGraph MCP Client
from langchain_mcp_adapters.client import MultiServerMCPClient from langchain_mcp_adapters.callbacks import Callbacks, CallbackContext from langchain.agents import create_agent from mcp.shared.context import RequestContext from mcp.types import ElicitRequestParams, ElicitResult import webbrowser async def on_elicitation( mcp_context: RequestContext, params: ElicitRequestParams, context: CallbackContext, ) -> ElicitResult: """Handle URL elicitation by opening the browser.""" if params.url: print(f"[{context.server_name}] Opening URL: {params.url}") webbrowser.open(params.url) input("Press Enter after completing authentication...") return ElicitResult(action="accept") return ElicitResult(action="accept", content={}) client = MultiServerMCPClient( { "gateway": { "url": "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp", "transport": "http", "headers": {"Authorization": "Bearer YOUR_ACCESS_TOKEN"}, } }, callbacks=Callbacks(on_elicitation=on_elicitation), ) tools = await client.get_tools() agent = create_agent("claude-sonnet-4-20250514", tools) result = await agent.ainvoke( {"messages": [{"role": "user", "content": "Access the my-org/my-repo GitHub repository"}]} )