Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Usa l'elicitazione con il tuo gateway AgentCore
L'elicitazione è una funzionalità MCP che consente a un server MCP di richiedere informazioni aggiuntive al client durante una chiamata allo strumento. Quando uno strumento richiede la conferma dell'utente, l'autenticazione o un input aggiuntivo per procedere, il server invia una richiesta di elicitazione al client. AgentCore Il gateway inoltra le richieste di elicitazione dalle destinazioni del server MCP ai tuoi clienti, sostituendo la richiesta id con un identificatore generato dal gateway.
Prerequisiti
Per utilizzare l'elicitazione con il gateway, è necessario disporre di:
-
Sessioni abilitate (versione 2025-11-25 e precedenti): l'elicitazione richiede il supporto della sessione. Vedi Usare le sessioni MCP con il tuo gateway. Per 2026-07-28 le versioni successive, non è necessario aggiungerle sessionConfiguration al gateway, poiché queste versioni sono stateless.
-
Streaming di risposta abilitato (versione 2025-11-25 e precedenti): le richieste di elicitation vengono inviate come blocchi di Server-Sent eventi (SSE) durante una connessione aperta. streamingConfiguration.enableResponseStreamingtrueImposta su protocolConfiguration.mcp in quello del tuo gateway. Per 2026-07-28 le versioni successive, non è necessario abilitare lo streaming delle risposte. Queste versioni forniscono l'elicitazione tramite il modello MRTR (Multi Round-Trip Request) anziché una richiesta avviata dal server nel flusso di risposta. Per ulteriori informazioni, consulta Richieste multiple di andata e ritorno nella documentazione del Model Context Protocol.
-
Tipo di destinazione del server MCP: l'elicitazione è supportata solo per le destinazioni del server MCP. L'elicitazione proviene dal server MCP e viene inoltrata al client tramite il gateway.
-
Il client dichiara la capacità di elicitazione: il client deve dichiarare il supporto all'elicitazione affinché il gateway inoltri le richieste di elicitazione. Per le versioni precedenti 2025-11-25 e precedenti, il cliente dichiara questo supporto nella richiesta. initialize Per 2026-07-28 le versioni successive, il client dichiara le funzionalità per ogni richiesta nel _meta campo ()io.modelcontextprotocol/clientCapabilities.
Modalità di elicitazione supportate
AgentCore Gateway supporta tre modalità di elicitazione definite dalla specifica MCP:
| Modalità |
Description |
|
modalità Form
|
Il server invia un modulo strutturato con campi che il cliente deve compilare. Utilizzato per raccogliere conferme, preferenze o dati di input degli utenti. La richiesta rimane aperta in attesa della risposta.
|
|
Modalità URL (basata sulla richiesta)
|
Il server invia un URL che l'utente deve visitare per completare un'azione (in genere l'autenticazione). La richiesta rimane aperta in attesa del completamento dell'azione.
|
|
Modalità URL (basata sulle eccezioni)
|
Il server genera un file URLElicitationRequiredError contenente un URL. La richiesta si chiude, l'utente completa l'azione sull'URL e il client riprova la chiamata allo strumento originale.
|
Negoziazione delle capacità
Il gateway dichiara il supporto per l'elicitazione a una destinazione del server MCP solo se:
-
Il client ha dichiarato il supporto all'elicitazione. Per le versioni precedenti 2025-11-25 e precedenti, il cliente lo dichiara durante. initialize Per 2026-07-28 le versioni successive, il client lo dichiara per ogni richiesta in. _meta
-
La versione del protocollo MCP supporta la modalità di elicitazione. formla modalità richiede una versione 2025-03-26 o successiva. urlle modalità richiedono una versione 2025-11-25 o una versione successiva.
-
Il gateway corrisponde alle funzionalità di elicitazione specifiche dichiarate dal client (form, url o entrambi).
Il flusso qui descritto si applica alla versione 2025-11-25 e alle versioni precedenti, in cui il server invia elicitation/create una richiesta avviata dal server sul flusso SSE aperto. Per le versioni 2026-07-28 successive, l'elicitation utilizza invece il pattern MRTR (Multi Round-Trip Requests). Il server restituisce un risultato provvisorio e il client riprova la richiesta originale con l'input raccolto. Per ulteriori informazioni, vedere Richieste multiple di andata e ritorno nella documentazione del Model Context Protocol.
-
Il client invia una tools/call richiesta con l'intestazione. Mcp-Session-Id
-
Il gateway inoltra la chiamata allo strumento alla destinazione del server MCP.
-
Il target apre un flusso SSE e invia una elicitation/create richiesta come primo evento.
-
Il gateway inoltra la elicitation/create richiesta al client sullo stream SSE, sostituendo la richiesta. id
-
Il client presenta il modulo all'utente e raccoglie la risposta.
-
Il client invia una nuova richiesta con la risposta di elicitazione (azione: accept odecline) utilizzando la stessa. Mcp-Session-Id
-
Il gateway inoltra la risposta alla destinazione del server MCP.
-
La destinazione conferma con HTTP 202 Accepted.
-
Il target completa la chiamata allo strumento e invia il risultato finale sullo stream SSE originale.
-
Gateway inoltra il risultato finale al client e chiude lo stream.
Flusso di elicitazione in modalità URL (basato su eccezioni)
-
Il client invia una tools/call richiesta con l'intestazione. Mcp-Session-Id
-
Il gateway inoltra la chiamata allo strumento alla destinazione del server MCP.
-
Il target genera un URLElicitationRequiredError messaggio di JSON-RPC errore contenente l'URL e un ID di elicitazione.
-
Il gateway lo inoltra URLElicitationRequiredError al client, sostituendo la richiesta. id
-
Il client reindirizza l'utente all'URL fornito per completare l'azione (in genere l'autenticazione OAuth).
-
Dopo che l'utente ha completato l'azione, il client riprova la richiesta originale. tools/call
-
Il gateway inoltra il nuovo tentativo alla destinazione. La destinazione completa la chiamata allo strumento poiché l'elicitazione dell'URL è stata completata.
-
Gateway inoltra il risultato finale dello strumento al cliente.
Chiamate parallele agli strumenti con elicitazioni
Un cliente può avviare più tools/call richieste all'interno della stessa sessione, anche mentre è in sospeso un'elicitazione. Ogni elicitazione viene tracciata indipendentemente dal suo. id Quando invia una risposta di elicitazione, il client deve includere nella richiesta id la stessa inviata dal gateway. elicitation/create
Linee guida per gli sviluppatori target di server MCP
Le destinazioni dei server MCP che inviano richieste di elicitazione devono racchiudere le chiamate di elicitazione in blocchi try-catch e gestire il caso in cui il client non supporti l'elicitazione. Se il client del gateway non dichiara la capacità di elicitazione, il gateway non la dichiara alla destinazione. Se il target invia comunque un'elicitazione, il gateway restituisce un errore -32601 (Method not found) al target.
I server devono implementare un percorso alternativo (ad esempio utilizzando valori predefiniti o saltando l'operazione) quando l'elicitazione non è disponibile.
Protezione dello stato della richiesta (versione 2026-07-28 e successive)
Nelle versioni 2026-07-28 successive, l'elicitation utilizza lo schema MRTR (Multi Round-Trip Request), che comporta un rapporto opaco tra il client e il server di destinazione MCP. requestState La protezione di tale valore è una responsabilità condivisa: il gateway lo autorizza e lo inoltra senza memorizzarlo, mentre la destinazione del server MCP deve convalidarlo e impedire a un utente di ripetere lo stato della richiesta di un altro utente. Per il modello completo di responsabilità condivisa e le linee guida di protezione che il server MCP deve seguire, vedete Proteggere lo stato della richiesta per l'elicitazione e il campionamento nelle considerazioni sulla destinazione del server MCP.
Gestione degli errori
| Scenario |
Errore |
Description |
|
Il client invia una risposta di elicitazione quando non è in corso alcuna elicitazione
|
JSON-RPC -32600(Richiesta non valida)
|
Nessuna elicitazione corrispondente trovata per questa sessione.
|
|
Il cliente invia una risposta all'elicitazione con una risposta id che non corrisponde a un'elicitazione in sospeso
|
JSON-RPC -32600(Richiesta non valida)
|
idDeve corrispondere a quello inviato dal gateway nella elicitation/create richiesta.
|
|
Interruzioni di connessione tra il gateway e la destinazione del server MCP
|
JSON-RPC errore con DependencyFailedException
|
Il cliente deve riprovare la richiesta di chiamata allo strumento originale.
|
|
Interruzioni di connessione tra client e gateway
|
N/A
|
L'elicitazione in sospeso viene cancellata. Il cliente deve riprovare a chiamare lo strumento.
|
|
Il server MCP invia l'elicitazione ma il gateway non ha dichiarato il supporto
|
JSON-RPC -32601(Metodo non trovato)
|
Ritornato alla destinazione del server MCP. Vedere Risoluzione dei problemi.
|
|
Gateway-authored l'elicitazione richiede una funzionalità che il client non ha dichiarato (versione 2026-07-28 e successive)
|
JSON-RPC -32021(Manca la funzionalità richiesta del client), HTTP 400
|
Nella versione 2026-07-28 e successive, il gateway restituisce questo codice anziché-32601. Ciò accade quando il client non ha dichiarato la funzionalità richiesta nella sua richiesta_meta.
|
Risoluzione dei problemi
Errore: «Errore durante la chiamata allo strumento 'sample_tool': metodo non trovato:" elicitation/create
Questo errore si verifica quando una destinazione del server MCP invia una richiesta di elicitazione ma il client del gateway non ha dichiarato la capacità di elicitazione. Per le versioni precedenti 2025-11-25 e precedenti, il client dichiara questa funzionalità durante. initialize Per 2026-07-28 le versioni successive, il client la dichiara per ogni richiesta nel _meta campo. Il gateway restituisce un errore -32601 (Metodo non trovato) alla destinazione. Il target potrebbe restituirlo al client come errore di esecuzione dello strumento.
Per risolvere:
-
Se sei lo sviluppatore del server MCP: aggiungi la gestione degli errori alle chiamate di elicitazione. Implementa un percorso di riserva quando l'elicitazione non è supportata:
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 sei lo sviluppatore del client gateway: per le versioni precedenti 2025-11-25 e precedenti, assicurati che il client dichiari la capacità di elicitazione durante: initialize
{
"capabilities": {
"elicitation": {
"form": {},
"url": {}
}
}
}
Errore: «Funzionalità client richiesta mancante» () -32021
Nella versione 2026-07-28 e successive, il gateway restituisce un -32021 errore (HTTP400) quando un'elicitazione creata dal gateway richiede una funzionalità non dichiarata. Poiché queste versioni sono stateless e non prevedono alcuna initialize stretta di mano, il client dichiara le funzionalità in ogni richiesta. Per risolvere questo errore, includi la funzionalità di elicitazione nel _meta campo (io.modelcontextprotocol/clientCapabilities) della richiesta su ogni richiesta che potrebbe attivare un'elicitazione.
Esempi di codice
In modalità modulo, il server invia uno schema strutturato da compilare al client. La richiesta rimane aperta in attesa della risposta.
Esempio
- Python requests package (2025-11-25 and earlier)
-
In queste versioni, il client dichiara la capacità di elicitazione durante e initialize l'elicitazione arriva come elicitation/create richiesta sul flusso SSE aperto. Imposta l'MCP-Protocol-Versionintestazione su una versione supportata dal tuo 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)
-
Nella versione2026-07-28, l'elicitation utilizza il modello di richieste multiple di andata e ritorno anziché una richiesta avviata dal server sullo stream SSE. Il client dichiara la capacità di elicitazione in ogni richiesta. _meta Se lo strumento necessita di input, la risposta è un input_required risultato contenente inputRequests e opaco. requestState Il client raccoglie l'input e ritenta la richiesta originale con una nuova idinputResponses, la e la non modificata. requestState Le sessioni e l'initializehandshake non vengono utilizzati. Il tuo gateway supportedVersions deve includere2026-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"}]}
)
Esempio di modalità URL
In modalità URL, il server invia un URL che l'utente deve visitare per completare un'azione (in genere l'autenticazione OAuth). La richiesta rimane aperta in attesa che l'utente completi l'azione sull'URL.
Esempio
- Python requests package (2025-11-25 and earlier)
-
In queste versioni, l'elicitazione dell'URL arriva come elicitation/create richiesta sullo stream SSE aperto all'interno di una sessione MCP. Imposta l'MCP-Protocol-Versionintestazione su una versione supportata dal tuo 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)
-
Nella versione2026-07-28, l'elicitazione dell'URL arriva come input_required risultato tramite il modello di richieste multiple di andata e ritorno anziché sullo stream SSE. L'utente completa l'azione sull'URL, quindi il client ritenta la richiesta originale con una nuovaid, la e la non modificata. inputResponses requestState Le sessioni non vengono utilizzate. Il tuo gateway supportedVersions deve includere2026-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"}]}
)