View a markdown version of this page

Usa l'elicitazione con il tuo gateway AgentCore - Fondamento Amazon AgentCore

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:

  1. 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

  2. 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.

  3. Il gateway corrisponde alle funzionalità di elicitazione specifiche dichiarate dal client (form, url o entrambi).

Flusso di elicitazione in modalità Form

Nota

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.

  1. Il client invia una tools/call richiesta con l'intestazione. Mcp-Session-Id

  2. Il gateway inoltra la chiamata allo strumento alla destinazione del server MCP.

  3. Il target apre un flusso SSE e invia una elicitation/create richiesta come primo evento.

  4. Il gateway inoltra la elicitation/create richiesta al client sullo stream SSE, sostituendo la richiesta. id

  5. Il client presenta il modulo all'utente e raccoglie la risposta.

  6. Il client invia una nuova richiesta con la risposta di elicitazione (azione: accept odecline) utilizzando la stessa. Mcp-Session-Id

  7. Il gateway inoltra la risposta alla destinazione del server MCP.

  8. La destinazione conferma con HTTP 202 Accepted.

  9. Il target completa la chiamata allo strumento e invia il risultato finale sullo stream SSE originale.

  10. Gateway inoltra il risultato finale al client e chiude lo stream.

Flusso di elicitazione in modalità URL (basato su eccezioni)

  1. Il client invia una tools/call richiesta con l'intestazione. Mcp-Session-Id

  2. Il gateway inoltra la chiamata allo strumento alla destinazione del server MCP.

  3. Il target genera un URLElicitationRequiredError messaggio di JSON-RPC errore contenente l'URL e un ID di elicitazione.

  4. Il gateway lo inoltra URLElicitationRequiredError al client, sostituendo la richiesta. id

  5. Il client reindirizza l'utente all'URL fornito per completare l'azione (in genere l'autenticazione OAuth).

  6. Dopo che l'utente ha completato l'azione, il client riprova la richiesta originale. tools/call

  7. Il gateway inoltra il nuovo tentativo alla destinazione. La destinazione completa la chiamata allo strumento poiché l'elicitazione dell'URL è stata completata.

  8. 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

Importante

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

Esempio in modalità modulo

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"}]} )