Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Usa la elicitación con tu pasarela AgentCore
La elicitación es una función de MCP que permite a un servidor MCP solicitar información adicional al cliente durante una llamada a una herramienta. Cuando una herramienta necesita la confirmación del usuario, la autenticación o una entrada adicional para continuar, el servidor envía una solicitud de obtención al cliente. AgentCore Gateway reenvía las solicitudes de obtención de los destinos del servidor MCP a sus clientes y reemplaza la solicitud id por un identificador generado por la puerta de enlace.
Requisitos previos
Para usar la elicitación con su puerta de enlace, debe tener:
-
Sesiones habilitadas (versión 2025-11-25 y anteriores): la elicitación requiere soporte de sesión. Consulte Usar sesiones de MCP con su puerta de enlace. Para la versión 2026-07-28 y las versiones posteriores, no es necesario que las añada sessionConfiguration a su puerta de enlace, ya que estas versiones no tienen estado.
-
La transmisión de respuestas está habilitada (versión 2025-11-25 y anteriores): las solicitudes de selección se envían en forma de fragmentos de Server-Sent eventos (SSE) durante una conexión abierta. Configúralo en el de tu puerta de enlacestreamingConfiguration.enableResponseStreaming. true protocolConfiguration.mcp Para la versión 2026-07-28 y posteriores, no es necesario que habilites la transmisión de respuestas. Estas versiones ofrecen la elicitación mediante el patrón de solicitudes de ida y vuelta múltiples (MRTR) en lugar de mediante una solicitud iniciada por el servidor en el flujo de respuestas. Para obtener más información, consulte las solicitudes de ida y vuelta múltiples en la documentación del Model Context Protocol.
-
Tipo de destino del servidor MCP: la elicitación solo se admite para los destinos del servidor MCP. La solicitud se origina en el servidor MCP y se reenvía al cliente a través de la puerta de enlace.
-
El cliente declara su capacidad de obtención: el cliente debe declarar que admite la obtención de solicitudes para que la puerta de enlace pueda reenviar las solicitudes de obtención. En el caso de la versión anterior 2025-11-25 y de la versión anterior, el cliente declara esta compatibilidad en la solicitud. initialize Para la versión 2026-07-28 y versiones posteriores, el cliente declara las capacidades de cada solicitud en el _meta campo (io.modelcontextprotocol/clientCapabilities).
Modos de elicitación compatibles
AgentCore Gateway admite tres modos de elicitación definidos por la especificación MCP:
| Mode |
Description (Descripción) |
|
Modo de formulario
|
El servidor envía un formulario estructurado con campos para que el cliente los complete. Se utiliza para recopilar las confirmaciones, las preferencias o los datos de entrada de los usuarios. La solicitud permanece abierta mientras espera la respuesta.
|
|
Modo URL (basado en solicitudes)
|
El servidor envía una URL que el usuario debe visitar para completar una acción (normalmente, la autenticación). La solicitud permanece abierta mientras espera a que se complete la acción.
|
|
Modo URL (basado en excepciones)
|
El servidor arroja una URL URLElicitationRequiredError que contiene. La solicitud se cierra, el usuario completa la acción en la URL y el cliente vuelve a intentar la llamada a la herramienta original.
|
Negociación de capacidad
La puerta de enlace solo declara su compatibilidad con la elicitación a un servidor MCP de destino si:
-
El cliente declaró su apoyo a la obtención de votos. Para la versión 2025-11-25 y anteriores, el cliente declara esto duranteinitialize. Para la versión 2026-07-28 y posteriores, el cliente lo declara para cada solicitud en_meta.
-
La versión del protocolo MCP admite el modo de obtención. formel modo requiere una versión 2025-03-26 o posterior. urllos modos requieren una versión 2025-11-25 o posterior.
-
La puerta de enlace coincide con las capacidades de obtención específicas declaradas por el cliente (formulario, URL o ambos).
El flujo que se describe aquí se aplica a la versión 2025-11-25 y a las anteriores, en las que el servidor envía elicitation/create una solicitud iniciada por el servidor en la transmisión SSE abierta. Para la versión 2026-07-28 y versiones posteriores, la elicitación utiliza, en cambio, el patrón de solicitudes de ida y vuelta múltiples (MRTR). El servidor devuelve un resultado provisional y el cliente vuelve a intentar la solicitud original con la entrada recopilada. Para obtener más información, consulte las solicitudes de ida y vuelta múltiples en la documentación del Model Context Protocol.
-
El cliente envía una tools/call solicitud con el Mcp-Session-Id encabezado.
-
Gateway reenvía la llamada a la herramienta al servidor MCP de destino.
-
El objetivo abre una transmisión de SSE y envía una elicitation/create solicitud como primer evento.
-
Gateway reenvía la elicitation/create solicitud al cliente en la transmisión de SSE y reemplaza la solicitudid.
-
El cliente presenta el formulario al usuario y recopila la respuesta.
-
El cliente envía una nueva solicitud con la respuesta de obtención (acción: accept odecline) utilizando la mismaMcp-Session-Id.
-
Gateway reenvía la respuesta al servidor MCP de destino.
-
El destino lo confirma con HTTP 202 Accepted.
-
El objetivo completa la llamada a la herramienta y envía el resultado final en la transmisión SSE original.
-
Gateway reenvía el resultado final al cliente y cierra la transmisión.
Flujo de obtención en modo URL (basado en excepciones)
-
El cliente envía una tools/call solicitud con el encabezado. Mcp-Session-Id
-
Gateway reenvía la llamada a la herramienta al servidor MCP de destino.
-
El objetivo muestra un mensaje URLElicitationRequiredError de JSON-RPC error que contiene la URL y un identificador de solicitud.
-
Gateway lo reenvía URLElicitationRequiredError al cliente, reemplazando la solicitud. id
-
El cliente redirige al usuario a la URL proporcionada para completar la acción (normalmente, la autenticación OAuth).
-
Una vez que el usuario completa la acción, el cliente vuelve a intentar la solicitud original. tools/call
-
Gateway reenvía el reintento al objetivo. El objetivo completa la llamada a la herramienta una vez que se completó la búsqueda de la URL.
-
Gateway reenvía el resultado final de la herramienta al cliente.
Llamadas paralelas a herramientas con elicitaciones
Un cliente puede iniciar varias tools/call solicitudes en la misma sesión, incluso cuando una elicitación esté pendiente. Cada solicitud se rastrea de forma independiente por su. id Al enviar una respuesta de obtención, el cliente debe incluir en la solicitud la misma id que envió la elicitation/create pasarela.
Guía para los desarrolladores de servidores objetivo de MCP
Los destinos de los servidores MCP que envían solicitudes de obtención deben agrupar las llamadas en bloques try-catch y gestionar los casos en los que el cliente no admite la obtención. Si el cliente de la puerta de enlace no declaró la capacidad de obtención, la puerta de enlace no la declara al destino. Si el objetivo envía una solicitud de todos modos, la puerta de enlace devuelve un error -32601 (método no encontrado) al objetivo.
Los servidores deben implementar una ruta alternativa (por ejemplo, usar valores predeterminados u omitir la operación) cuando la obtención no esté disponible.
Proteger el estado de la solicitud (versión 2026-07-28 y posteriores)
En la versión 2026-07-28 y versiones posteriores, la elicitación utiliza el patrón de solicitudes de ida y vuelta múltiples (MRTR), que muestra una opacidad requestState entre el cliente y el servidor MCP de destino. Proteger ese valor es una responsabilidad compartida: la puerta de enlace lo autoriza y lo reenvía sin almacenarlo, mientras que el servidor MCP de destino debe validarlo e impedir que un usuario vuelva a reproducir el estado de la solicitud de otro usuario. Para conocer el modelo completo de responsabilidad compartida y las directrices de protección que debe seguir su servidor MCP, consulte Consideraciones sobre cómo proteger el estado de la solicitud para su obtención y muestreo en el destino del servidor MCP.
Gestión de errores
| Escenario |
Error |
Description (Descripción) |
|
El cliente envía una respuesta de solicitud cuando no hay ninguna solicitud pendiente
|
JSON-RPC -32600(Solicitud no válida)
|
No se encontró ninguna elicitación coincidente para esta sesión.
|
|
El cliente envía una respuesta de solicitud con una id que no coincide con una solicitud pendiente
|
JSON-RPC -32600(Solicitud no válida)
|
idDebe coincidir con el enviado por la pasarela en la elicitation/create solicitud.
|
|
Se interrumpe la conexión entre la puerta de enlace y el destino del servidor MCP
|
JSON-RPC error con DependencyFailedException
|
El cliente debe volver a intentar la solicitud de llamada a la herramienta original.
|
|
Se interrumpe la conexión entre el cliente y la puerta de enlace
|
N/A
|
Se ha eliminado la solicitud pendiente. El cliente debe volver a intentar la llamada a la herramienta.
|
|
El servidor MCP envía la solicitud, pero la puerta de enlace no declaró la compatibilidad
|
JSON-RPC -32601(No se encontró el método)
|
Regresó al destino del servidor MCP. Consulte Solución de problemas
|
|
Gateway-authored La obtención requiere una capacidad que el cliente no declaró (versión 2026-07-28 y versiones posteriores)
|
JSON-RPC -32021(Falta la capacidad de cliente requerida), HTTP 400
|
En la versión 2026-07-28 y posteriores, la puerta de enlace devuelve este código en lugar de-32601. Esto ocurre cuando el cliente no declaró la capacidad requerida en su solicitud_meta.
|
Resolución de problemas
Error: «Error al llamar a la herramienta 'sample_tool': no se encontró el método:» elicitation/create
Este error se produce cuando un servidor MCP objetivo envía una solicitud de obtención, pero el cliente de la puerta de enlace no declara la capacidad de obtención. Para la versión 2025-11-25 y las anteriores, el cliente declara esta capacidad durante. initialize Para la versión 2026-07-28 y versiones posteriores, el cliente la declara para cada solicitud del _meta campo. La puerta de enlace devuelve un error -32601 (método no encontrado) al destino. El objetivo puede devolverlo al cliente como un error de ejecución de la herramienta.
Para resolverlo:
-
Si es el desarrollador del servidor MCP: Añada la gestión de errores en sus llamadas de elicitación. Implemente una ruta alternativa cuando no se admita la obtención:
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()
-
Si es el desarrollador del cliente de Gateway: en el caso de la versión 2025-11-25 y anteriores, asegúrese de que su cliente declare la capacidad de obtención de datos durante: initialize
{
"capabilities": {
"elicitation": {
"form": {},
"url": {}
}
}
}
Error: «Falta la capacidad de cliente requerida» () -32021
En la versión 2026-07-28 y posteriores, la puerta de enlace devuelve un -32021 error (HTTP400) cuando una solicitud creada por la puerta de enlace requiere una capacidad no declarada. Como estas versiones no tienen estado ni protocolo de initialize enlace, el cliente declara sus capacidades en cada solicitud. Para resolver este error, incluye la capacidad de elicitación en el _meta campo (io.modelcontextprotocol/clientCapabilities) de la solicitud en cada solicitud que pueda desencadenar una elicitación.
Ejemplos de código
En el modo formulario, el servidor envía un esquema estructurado para que el cliente lo complete. La solicitud permanece abierta mientras espera la respuesta.
ejemplo
- Python requests package (2025-11-25 and earlier)
-
En estas versiones, el cliente declara la capacidad de obtención durante initialize y la obtención llega como una elicitation/create solicitud a la transmisión SSE abierta. Establezca el MCP-Protocol-Version encabezado en una versión compatible con su puerta de enlace.
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)
-
En la versión2026-07-28, la elicitación utiliza el patrón de múltiples solicitudes de ida y vuelta en lugar de una solicitud iniciada por el servidor en la transmisión de SSE. El cliente declara la capacidad de obtención en _meta cada solicitud. Si la herramienta necesita información, la respuesta es un input_required resultado opaco inputRequests requestState y que contiene un resultado. El cliente recopila la entrada y vuelve a intentar la solicitud original con una nueva idinputResponses, la y la no modificada. requestState No se utilizan las sesiones ni el initialize apretón de manos. Su puerta de enlace supportedVersions debe 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"}]}
)
Ejemplo de modo URL
En el modo URL, el servidor envía una URL que el usuario debe visitar para completar una acción (normalmente, la autenticación OAuth). La solicitud permanece abierta mientras espera a que el usuario complete la acción en la URL.
ejemplo
- Python requests package (2025-11-25 and earlier)
-
En estas versiones, la obtención de la URL llega como una elicitation/create solicitud a la transmisión SSE abierta dentro de una sesión de MCP. Establezca el MCP-Protocol-Version encabezado en una versión compatible con su puerta de enlace.
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)
-
En la versión2026-07-28, la obtención de la URL se obtiene como input_required resultado a través del patrón de solicitudes de ida y vuelta múltiples, en lugar de hacerlo a través de la transmisión SSE. El usuario completa la acción en la URL y, a continuación, el cliente vuelve a intentar la solicitud original con una nueva idinputResponses, la y la sin modificar. requestState No se utilizan las sesiones. Su puerta de enlace supportedVersions debe 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"}]}
)