Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Utilisez l'élicitation avec votre passerelle AgentCore
L'élicitation est une fonctionnalité MCP qui permet à un serveur MCP de demander des informations supplémentaires au client lors d'un appel à l'outil. Lorsqu'un outil nécessite une confirmation de l'utilisateur, une authentification ou une saisie supplémentaire pour continuer, le serveur renvoie une demande d'élicitation au client. AgentCore Gateway transmet les demandes d'élicitation provenant des cibles du serveur MCP à vos clients, en les remplaçant par un identifiant généré par la passerelle. id
Conditions préalables
Pour utiliser l'élicitation avec votre passerelle, vous devez disposer des éléments suivants :
-
Sessions activées (version 2025-11-25 et antérieures) — Elicitation nécessite la prise en charge des sessions. Consultez la section Utiliser des sessions MCP avec votre passerelle. Pour les versions 2026-07-28 et les versions ultérieures, vous n'avez pas besoin sessionConfiguration d'ajouter à votre passerelle, car ces versions sont sans état.
-
Streaming de réponses activé (version 2025-11-25 et antérieures) : les demandes d'élicitation sont envoyées sous forme de segments d' Server-Sent événements (SSE) lors d'une connexion ouverte. streamingConfiguration.enableResponseStreamingRéglez-le true sur celui de votre passerelleprotocolConfiguration.mcp. Pour les versions 2026-07-28 et les versions ultérieures, il n'est pas nécessaire d'activer le streaming des réponses. Ces versions fournissent l'élicitation via le modèle de requêtes multi-aller-retour (MRTR) au lieu d'une demande initiée par le serveur sur le flux de réponse. Pour plus d'informations, consultez la section Demandes aller-retour multiples dans la documentation du Model Context Protocol.
-
Type de cible de serveur MCP : l'élicitation n'est prise en charge que pour les cibles de serveur MCP. L'élicitation provient du serveur MCP et est transmise au client via la passerelle.
-
Le client déclare une capacité d'élicitation — Le client doit déclarer la prise en charge de l'élicitation pour que la passerelle puisse transmettre les demandes d'élicitation. Pour la version 2025-11-25 et les versions antérieures, le client déclare cette prise en charge dans la initialize demande. Pour les versions 2026-07-28 et les versions ultérieures, le client déclare des fonctionnalités pour chaque requête dans le _meta champ (io.modelcontextprotocol/clientCapabilities).
Modes d'élicitation pris en charge
AgentCore Gateway prend en charge trois modes d'élicitation définis par la spécification MCP :
| Mode |
Description |
|
Mode formulaire
|
Le serveur envoie un formulaire structuré contenant des champs que le client doit remplir. Utilisé pour collecter les confirmations, les préférences ou les données d'entrée des utilisateurs. La demande reste ouverte en attendant la réponse.
|
|
Mode URL (basé sur les demandes)
|
Le serveur envoie une URL que l'utilisateur doit consulter pour effectuer une action (généralement une authentification). La demande reste ouverte en attendant la fin de l'action.
|
|
Mode URL (basé sur les exceptions)
|
Le serveur lance un message URLElicitationRequiredError contenant une URL. La demande se ferme, l'utilisateur termine l'action sur l'URL et le client tente à nouveau l'appel d'outil d'origine.
|
Négociation des capacités
La passerelle déclare la prise en charge de l'élicitation à une cible de serveur MCP uniquement si :
-
Le client a déclaré un support d'élicitation. Pour la version 2025-11-25 et les versions antérieures, le client le déclare pendantinitialize. Pour les versions 2026-07-28 et les versions ultérieures, le client le déclare pour chaque demande dans_meta.
-
La version du protocole MCP prend en charge le mode d'élicitation. formle mode nécessite une version 2025-03-26 ou une version ultérieure. urlles modes nécessitent une version 2025-11-25 ou une version ultérieure.
-
La passerelle correspond aux capacités d'élicitation spécifiques déclarées par le client (formulaire, URL ou les deux).
Le flux décrit ici s'applique à la version 2025-11-25 et aux versions antérieures, où le serveur envoie elicitation/create une requête initiée par le serveur sur le flux SSE ouvert. Pour les versions 2026-07-28 et les versions ultérieures, l'élicitation utilise plutôt le modèle de requêtes multi-aller-retour (MRTR). Le serveur renvoie un résultat provisoire et le client réessaie la demande d'origine avec les données collectées. Pour plus d'informations, consultez la section Demandes aller-retour multiples dans la documentation du Model Context Protocol.
-
Le client envoie une tools/call demande avec l'Mcp-Session-Iden-tête.
-
Gateway transmet l'appel d'outil à la cible du serveur MCP.
-
La cible ouvre un flux SSE et envoie une elicitation/create demande en tant que premier événement.
-
Gateway transmet la elicitation/create demande au client sur le flux SSE, en remplaçant la demandeid.
-
Le client présente le formulaire à l'utilisateur et recueille la réponse.
-
Le client envoie une nouvelle demande avec la réponse d'élicitation (action : accept oudecline) en utilisant la même. Mcp-Session-Id
-
Gateway transmet la réponse à la cible du serveur MCP.
-
La cible accuse réception avec HTTP 202 Accepted.
-
La cible termine l'appel à l'outil et envoie le résultat final sur le flux SSE d'origine.
-
Gateway transmet le résultat final au client et ferme le flux.
Flux d'élicitation en mode URL (basé sur les exceptions)
-
Le client envoie une tools/call demande avec l'Mcp-Session-Iden-tête.
-
Gateway transmet l'appel d'outil à la cible du serveur MCP.
-
La cible renvoie un JSON-RPC message URLElicitationRequiredError d'erreur contenant l'URL et un ID d'élicitation.
-
Gateway le transmet URLElicitationRequiredError au client en remplaçant la demandeid.
-
Le client redirige l'utilisateur vers l'URL fournie pour terminer l'action (généralement l'authentification OAuth).
-
Une fois que l'utilisateur a terminé l'action, le client réessaie la tools/call demande initiale.
-
Gateway transmet la nouvelle tentative à la cible. La cible termine l'appel à l'outil puisque l'élicitation de l'URL a été exécutée.
-
Gateway transmet le résultat final de l'outil au client.
Appels d'outils parallèles avec élicitations
Un client peut lancer plusieurs tools/call demandes au cours de la même session, même si une demande est en attente. Chaque élicitation est suivie indépendamment par son. id Lors de l'envoi d'une réponse d'élicitation, le client doit inclure la même réponse id que celle envoyée par la passerelle dans la elicitation/create demande.
Conseils pour les développeurs de cibles de serveurs MCP
Les cibles des serveurs MCP qui envoient des demandes d'élicitation doivent encapsuler les appels d'élicitation dans des blocs trycatch et gérer le cas où le client ne prend pas en charge l'élicitation. Si le client de la passerelle n'a pas déclaré de capacité d'élicitation, la passerelle ne la déclare pas à la cible. Si la cible envoie quand même une élicitation, la passerelle renvoie une erreur -32601 (Méthode introuvable) à la cible.
Les serveurs doivent implémenter un chemin de secours (par exemple en utilisant des valeurs par défaut ou en sautant l'opération) lorsque l'élicitation n'est pas disponible.
Sécurisation de l'état de la demande (version 2026-07-28 et versions ultérieures)
Sur les versions 2026-07-28 et les versions ultérieures, l'élicitation utilise le modèle MRTR (multi-aller-retour requests), qui crée une opacité requestState entre votre client et la cible de votre serveur MCP. La sécurisation de cette valeur est une responsabilité partagée : la passerelle l'autorise et la transmet sans la stocker, tandis que la cible de votre serveur MCP doit la valider et empêcher un utilisateur de rejouer l'état de la demande d'un autre utilisateur. Pour connaître le modèle de responsabilité partagée complet et les directives de protection que votre serveur MCP doit suivre, consultez la section Sécurisation de l'état de la demande pour l'élicitation et l'échantillonnage dans les considérations relatives à la cible du serveur MCP.
Gestion des erreurs
| Scénario |
Erreur |
Description |
|
Le client envoie une réponse d'élicitation lorsqu'aucune sollicitation n'est en attente
|
JSON-RPC -32600(Demande non valide)
|
Aucune demande correspondante n'a été trouvée pour cette session.
|
|
Le client envoie une réponse d'élicitation avec une réponse id qui ne correspond pas à une sollicitation en attente
|
JSON-RPC -32600(Demande non valide)
|
idIl doit correspondre à celui envoyé par la passerelle dans la elicitation/create demande.
|
|
Interruptions de connexion entre la passerelle et la cible du serveur MCP
|
JSON-RPC erreur avec DependencyFailedException
|
Le client doit réessayer la demande d'appel d'outil d'origine.
|
|
Interruptions de connexion entre le client et la passerelle
|
N/A
|
L'élicitation en attente est nettoyée. Le client doit réessayer d'appeler l'outil.
|
|
Le serveur MCP envoie une élicitation mais la passerelle n'a pas déclaré le support
|
JSON-RPC -32601(Méthode introuvable)
|
Retourné à la cible du serveur MCP. Consultez la section Résolution des problèmes.
|
|
Gateway-authored l'élicitation nécessite une capacité que le client n'a pas déclarée (version 2026-07-28 et versions ultérieures)
|
JSON-RPC -32021(fonctionnalité client requise manquante), HTTP 400
|
Sur les versions 2026-07-28 et versions ultérieures, la passerelle renvoie ce code à la place de-32601. Cela se produit lorsque le client n'a pas déclaré la capacité requise dans sa demande_meta.
|
Résolution des problèmes
Erreur : « Erreur lors de l'appel de l'outil 'sample_tool' : méthode introuvable : » elicitation/create
Cette erreur se produit lorsqu'une cible de serveur MCP envoie une demande d'élicitation mais que le client de la passerelle n'a pas déclaré de capacité d'élicitation. Pour la version 2025-11-25 et les versions antérieures, le client déclare cette fonctionnalité pendantinitialize. Pour les versions 2026-07-28 et les versions ultérieures, le client le déclare pour chaque demande dans le _meta champ. La passerelle renvoie une erreur -32601 (Méthode introuvable) à la cible. La cible peut renvoyer cette erreur au client sous la forme d'une erreur d'exécution de l'outil.
Pour résoudre le problème :
-
Si vous êtes le développeur du serveur MCP : ajoutez la gestion des erreurs lors de vos appels d'élicitation. Implémentez un chemin de repli lorsque l'élicitation n'est pas prise en charge :
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 vous êtes le développeur du client Gateway : pour la version 2025-11-25 et les versions antérieures, assurez-vous que votre client déclare la capacité d'élicitation pendant : initialize
{
"capabilities": {
"elicitation": {
"form": {},
"url": {}
}
}
}
Erreur : « Capacité client requise manquante » (-32021)
Sur les versions 2026-07-28 et les versions ultérieures, la passerelle renvoie une -32021 erreur (HTTP400) lorsqu'une élicitation créée par la passerelle nécessite une capacité non déclarée. Comme ces versions sont apatrides et ne nécessitent pas d'établissement initialize de liens, le client déclare des fonctionnalités dans chaque demande. Pour résoudre cette erreur, incluez la capacité d'élicitation dans le _meta champ de la requête (io.modelcontextprotocol/clientCapabilities) pour chaque requête susceptible de déclencher une élicitation.
Exemples de code
En mode formulaire, le serveur envoie un schéma structuré que le client doit remplir. La demande reste ouverte dans l'attente de la réponse.
Exemple
- Python requests package (2025-11-25 and earlier)
-
Sur ces versions, le client déclare la capacité d'élicitation pendantinitialize, et l'élicitation arrive sous forme de elicitation/create requête sur le flux SSE ouvert. Définissez l'MCP-Protocol-Versionen-tête sur une version prise en charge par votre passerelle.
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)
-
Dans la version2026-07-28, l'élicitation utilise le modèle de requêtes aller-retour multiples au lieu d'une demande initiée par le serveur sur le flux SSE. Le client déclare la capacité d'élicitation à chaque _meta demande. Si l'outil nécessite une saisie, la réponse est un input_required résultat contenant des résultats inputRequests et est opaquerequestState. Le client rassemble l'entrée et réessaie la demande d'origine avec une nouvelle demande idinputResponses, la et la non modifiée. requestState Les sessions et la initialize poignée de main ne sont pas utilisées. Votre passerelle supportedVersions doit inclure2026-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"}]}
)
Exemple de mode URL
En mode URL, le serveur envoie une URL que l'utilisateur doit consulter pour effectuer une action (généralement l'authentification OAuth). La demande reste ouverte en attendant que l'utilisateur termine l'action sur l'URL.
Exemple
- Python requests package (2025-11-25 and earlier)
-
Sur ces versions, l'élicitation d'URL arrive sous la forme d'une elicitation/create requête sur le flux SSE ouvert au sein d'une session MCP. Définissez l'MCP-Protocol-Versionen-tête sur une version prise en charge par votre passerelle.
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)
-
Sur la version2026-07-28, l'élicitation d'URL arrive en input_required conséquence via le modèle de demandes aller-retour multiples plutôt que sur le flux SSE. L'utilisateur effectue l'action sur l'URL, puis le client tente à nouveau la demande d'origine avec une nouvelle demande idinputResponses, la et la non requestState modifiée. Les sessions ne sont pas utilisées. Votre passerelle supportedVersions doit inclure2026-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"}]}
)