As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Use a elicitação com seu gateway AgentCore
A elicitação é um recurso de MCP que permite que um servidor MCP solicite informações adicionais do cliente durante uma chamada de ferramenta. Quando uma ferramenta precisa de confirmação do usuário, autenticação ou entrada adicional para continuar, o servidor envia uma solicitação de elicitação de volta ao cliente. AgentCore O Gateway encaminha solicitações de elicitação de alvos do servidor MCP para seus clientes, substituindo a solicitação por um identificador id gerado pelo gateway.
Pré-requisitos
Para usar a elicitação com seu gateway, você deve ter:
-
Sessões habilitadas (versão 2025-11-25 e anterior) — A elicitação requer suporte de sessão. Consulte Usar sessões MCP com seu gateway. Para versões 2026-07-28 posteriores, você não precisa adicionar sessionConfiguration ao seu gateway, pois essas versões não têm estado.
-
Streaming de resposta ativado (versão 2025-11-25 e anterior) — As solicitações de elicitação são enviadas como blocos de Server-Sent Eventos (SSE) durante uma conexão aberta. streamingConfiguration.enableResponseStreamingDefina como true no seu gatewayprotocolConfiguration.mcp. Para a versão 2026-07-28 e posterior, você não precisa ativar o streaming de respostas. Essas versões fornecem elicitação por meio do padrão de várias solicitações de ida e volta (MRTR) em vez de uma solicitação iniciada pelo servidor no fluxo de resposta. Para obter mais informações, consulte Várias solicitações de ida e volta na documentação do Model Context Protocol.
-
Tipo de alvo do servidor MCP — A elicitação só é suportada para alvos do servidor MCP. A elicitação se origina do servidor MCP e é encaminhada pelo gateway para o cliente.
-
O cliente declara a capacidade de elicitação — O cliente deve declarar suporte à elicitação para que o gateway encaminhe solicitações de elicitação. Para a versão 2025-11-25 e anteriores, o cliente declara esse suporte na initialize solicitação. Para a versão 2026-07-28 e posterior, o cliente declara os recursos para cada solicitação no _meta campo (io.modelcontextprotocol/clientCapabilities).
Modos de elicitação suportados
AgentCore O gateway suporta três modos de elicitação definidos pela especificação MCP:
| Modo |
Description |
|
Modo de formulário
|
O servidor envia um formulário estruturado com campos para o cliente preencher. Usado para coletar confirmações, preferências ou dados de entrada do usuário. A solicitação permanece aberta enquanto aguarda a resposta.
|
|
Modo URL (baseado em solicitação)
|
O servidor envia uma URL que o usuário deve visitar para concluir uma ação (normalmente autenticação). A solicitação permanece aberta enquanto aguarda a conclusão da ação.
|
|
Modo URL (baseado em exceções)
|
O servidor lança um URLElicitationRequiredError contendo um URL. A solicitação é fechada, o usuário conclui a ação na URL e o cliente repete a chamada da ferramenta original.
|
Negociação de capacidades
O gateway só declara suporte de elicitação para um alvo de servidor MCP se:
-
O cliente declarou apoio à elicitação. Para a versão 2025-11-25 e anteriores, o cliente declara isso duranteinitialize. Para a versão 2026-07-28 e posterior, o cliente a declara para cada solicitação em_meta.
-
A versão do protocolo MCP suporta o modo de elicitação. formo modo requer uma versão 2025-03-26 ou posterior. urlos modos exigem uma versão 2025-11-25 ou posterior.
-
O gateway corresponde aos recursos específicos de elicitação declarados pelo cliente (formulário, url ou ambos).
O fluxo descrito aqui se aplica à versão 2025-11-25 e anteriores, em que o servidor envia elicitation/create como uma solicitação iniciada pelo servidor no fluxo SSE aberto. Para a versão 2026-07-28 e versões posteriores, a elicitação usa o padrão de várias solicitações de ida e volta (MRTR). O servidor retorna um resultado provisório e o cliente repete a solicitação original com a entrada coletada. Para obter mais informações, consulte Várias solicitações de ida e volta na documentação do Model Context Protocol.
-
O cliente envia uma tools/call solicitação com o Mcp-Session-Id cabeçalho.
-
O gateway encaminha a chamada da ferramenta para o alvo do servidor MCP.
-
O alvo abre um fluxo SSE e envia uma elicitation/create solicitação como primeiro evento.
-
O gateway encaminha a elicitation/create solicitação para o cliente no fluxo SSE, substituindo a solicitaçãoid.
-
O cliente apresenta o formulário ao usuário e coleta a resposta.
-
O cliente envia uma nova solicitação com a resposta de elicitação (ação: accept oudecline) usando a mesma. Mcp-Session-Id
-
O gateway encaminha a resposta para o alvo do servidor MCP.
-
O alvo reconhece com HTTP 202 Accepted.
-
O alvo conclui a chamada da ferramenta e envia o resultado final no fluxo SSE original.
-
O gateway encaminha o resultado final para o cliente e fecha o stream.
Fluxo de elicitação do modo URL (baseado em exceções)
-
O cliente envia uma tools/call solicitação com o Mcp-Session-Id cabeçalho.
-
O gateway encaminha a chamada da ferramenta para o alvo do servidor MCP.
-
O alvo gera um URLElicitationRequiredError JSON-RPC erro, contendo o URL e um ID de elicitação.
-
O gateway encaminha o URLElicitationRequiredError para o cliente, substituindo a solicitaçãoid.
-
O cliente redireciona o usuário para a URL fornecida para concluir a ação (normalmente autenticação OAuth).
-
Depois que o usuário concluir a ação, o cliente repetirá a solicitação originaltools/call.
-
O gateway encaminha a nova tentativa para o alvo. O alvo conclui a chamada da ferramenta desde que a elicitação do URL foi atendida.
-
O Gateway encaminha o resultado final da ferramenta para o cliente.
Chamadas de ferramentas paralelas com elicitações
Um cliente pode iniciar várias tools/call solicitações na mesma sessão, mesmo quando uma elicitação estiver pendente. Cada elicitação é rastreada de forma independente por sua. id Ao enviar uma resposta de elicitação, o cliente deve incluir a mesma id que foi enviada pelo gateway na elicitation/create solicitação.
Orientação para desenvolvedores de destino do servidor MCP
Os alvos do servidor MCP que enviam solicitações de elicitação devem agrupar as chamadas de elicitação em blocos try-catch e tratar o caso em que o cliente não oferece suporte à elicitação. Se o cliente do gateway não declarou a capacidade de elicitação, o gateway não a declarará ao destino. Se o alvo enviar uma elicitação de qualquer maneira, o gateway retornará um erro -32601 (Método não encontrado) para o alvo.
Os servidores devem implementar um caminho alternativo (como usar valores padrão ou ignorar a operação) quando a elicitação não estiver disponível.
Protegendo o estado da solicitação (versão 2026-07-28 e posterior)
Na versão 2026-07-28 e posterior, a elicitação usa o padrão de múltiplas solicitações de ida e volta (MRTR), que transporta uma opacidade requestState entre o cliente e o destino do servidor MCP. Proteger esse valor é uma responsabilidade compartilhada: o gateway o autoriza e o encaminha sem armazená-lo, enquanto o destino do servidor MCP deve validá-lo e impedir que um usuário repita o estado de solicitação de outro usuário. Para ver o modelo completo de responsabilidade compartilhada e as diretrizes de proteção que seu servidor MCP deve seguir, consulte Protegendo o estado da solicitação para elicitação e amostragem nas considerações sobre o alvo do servidor MCP.
Tratamento de erros
| Cenário |
Erro |
Description |
|
O cliente envia uma resposta de elicitação quando nenhuma elicitação está pendente
|
JSON-RPC -32600(Solicitação inválida)
|
Nenhuma elicitação correspondente encontrada para esta sessão.
|
|
O cliente envia uma resposta de elicitação com uma id que não corresponde a uma elicitação pendente
|
JSON-RPC -32600(Solicitação inválida)
|
Eles id devem corresponder ao enviado pelo gateway na elicitation/create solicitação.
|
|
Interrupções de conexão entre o gateway e o destino do servidor MCP
|
JSON-RPC erro com DependencyFailedException
|
O cliente deve tentar novamente a solicitação de chamada da ferramenta original.
|
|
Interrupções de conexão entre o cliente e o gateway
|
N/A
|
A elicitação pendente é eliminada. O cliente deve tentar novamente a chamada da ferramenta.
|
|
O servidor MCP envia elicitação, mas o gateway não declarou suporte
|
JSON-RPC -32601(Método não encontrado)
|
Retornado ao destino do servidor MCP. Consulte Solução de problemas.
|
|
Gateway-authored a elicitação requer uma capacidade que o cliente não declarou (versão 2026-07-28 e posterior)
|
JSON-RPC -32021(Falta a capacidade necessária do cliente), HTTP 400
|
Na versão 2026-07-28 e posterior, o gateway retorna esse código em vez de-32601. Isso acontece quando o cliente não declarou a capacidade necessária em sua solicitação_meta.
|
Solução de problemas
Erro: “Erro ao chamar a ferramenta 'sample_tool': Método não encontrado:” elicitation/create
Esse erro ocorre quando um alvo do servidor MCP envia uma solicitação de elicitação, mas o cliente do gateway não declarou a capacidade de elicitação. Para a versão 2025-11-25 e versões anteriores, o cliente declara esse recurso duranteinitialize. Para a versão 2026-07-28 e posterior, o cliente a declara para cada solicitação no _meta campo. O gateway retorna um erro -32601 (Método não encontrado) para o destino. O alvo pode retornar isso como um erro de execução da ferramenta para o cliente.
Para resolver:
-
Se você for o desenvolvedor do servidor MCP: Adicione o tratamento de erros às suas chamadas de elicitação. Implemente um caminho alternativo quando a elicitação não for suportada:
try:
result = await context.session.create_elicitation(
message="Confirm this action?",
requested_schema={"type": "object", "properties": {"confirm": {"type": "boolean"}}}
)
except Exception as e:
# Fallback when client doesn't support elicitation
logger.warning(f"Elicitation not supported: {e}")
result = default_action()
-
Se você for o desenvolvedor do cliente gateway: para versões anteriores 2025-11-25 e versões anteriores, certifique-se de que seu cliente declare a capacidade de elicitação durante: initialize
{
"capabilities": {
"elicitation": {
"form": {},
"url": {}
}
}
}
Erro: “Falta a capacidade necessária do cliente” (-32021)
Na versão 2026-07-28 e posterior, o gateway retorna um -32021 erro (HTTP400) quando uma elicitação criada pelo gateway exige um recurso não declarado. Como essas versões não têm estado e não têm initialize aperto de mão, o cliente declara recursos em cada solicitação. Para resolver esse erro, inclua o recurso de elicitação no _meta campo (io.modelcontextprotocol/clientCapabilities) da solicitação em cada solicitação que possa acionar uma elicitação.
Exemplos de código
No modo formulário, o servidor envia um esquema estruturado para o cliente preencher. A solicitação permanece aberta enquanto aguarda a resposta.
exemplo
- Python requests package (2025-11-25 and earlier)
-
Nessas versões, o cliente declara a capacidade de elicitação durante initialize e a elicitação chega como uma elicitation/create solicitação no fluxo SSE aberto. Defina o MCP-Protocol-Version cabeçalho para uma versão compatível com seu gateway.
import requests
import json
import sseclient
gateway_url = "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp"
headers = {
"Content-Type": "application/json",
"Accept": "text/event-stream",
"Authorization": "Bearer YOUR_ACCESS_TOKEN"
}
# Step 1: Initialize with elicitation capability
init_response = requests.post(gateway_url, headers=headers, json={
"jsonrpc": "2.0",
"id": "init-request",
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {"elicitation": {"form": {}, "url": {}}},
"clientInfo": {"name": "my-agent", "version": "1.0.0"}
}
})
session_id = init_response.headers["Mcp-Session-Id"]
headers["Mcp-Session-Id"] = session_id
headers["MCP-Protocol-Version"] = "2025-06-18"
# Step 2: Call tool (streaming response)
response = requests.post(gateway_url, headers=headers, json={
"jsonrpc": "2.0",
"id": "tool-call-1",
"method": "tools/call",
"params": {
"name": "use_aws",
"arguments": {"command": "aws s3 rm s3://my-bucket/important-file"}
}
}, stream=True)
# Step 3: Process SSE events
client = sseclient.SSEClient(response)
for event in client.events():
data = json.loads(event.data)
if data.get("method") == "elicitation/create":
elicitation_id = data["id"]
print(f"Form elicitation received: {data['params']['message']}")
# Step 4: Send elicitation response
requests.post(gateway_url, headers=headers, json={
"jsonrpc": "2.0",
"id": elicitation_id,
"result": {"action": "accept", "content": {"confirm": True}}
})
elif "result" in data:
print(f"Tool result: {data['result']}")
break
- Python requests package (2026-07-28)
-
Na versão2026-07-28, a elicitação usa o padrão de várias solicitações de ida e volta em vez de uma solicitação iniciada pelo servidor no fluxo SSE. O cliente declara a capacidade de elicitação _meta em cada solicitação. Se a ferramenta precisar de entrada, a resposta será um input_required resultado contendo inputRequests e opacorequestState. O cliente coleta a entrada e repete a solicitação original com uma nova idinputResponses, a e a não modificada. requestState As sessões e o initialize aperto de mão não são usados. Seu gateway supportedVersions deve incluir2026-07-28.
import requests
gateway_url = "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp"
META = {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {"name": "my-agent", "version": "1.0.0"},
"io.modelcontextprotocol/clientCapabilities": {"elicitation": {"form": {}, "url": {}}}
}
headers = {
"Content-Type": "application/json",
"Accept": "application/json, text/event-stream",
"Authorization": "Bearer YOUR_ACCESS_TOKEN",
"MCP-Protocol-Version": "2026-07-28",
"Mcp-Method": "tools/call",
"Mcp-Name": "use_aws"
}
arguments = {"command": "aws s3 rm s3://my-bucket/important-file"}
# Step 1: Call the tool, declaring the elicitation capability in _meta
response = requests.post(gateway_url, headers=headers, json={
"jsonrpc": "2.0",
"id": "tool-call-1",
"method": "tools/call",
"params": {"name": "use_aws", "arguments": arguments, "_meta": META}
}).json()
result = response["result"]
if result.get("resultType") == "input_required":
# Step 2: Fulfill each input request (form elicitation)
input_responses = {}
for key, input_request in result.get("inputRequests", {}).items():
print(f"Form elicitation received: {input_request['params']['message']}")
input_responses[key] = {"action": "accept", "content": {"confirm": True}}
# Step 3: Retry the tool call with a new id, the input responses,
# and the requestState echoed back unmodified
retry_params = {"name": "use_aws", "arguments": arguments, "_meta": META,
"inputResponses": input_responses}
if "requestState" in result:
retry_params["requestState"] = result["requestState"]
response = requests.post(gateway_url, headers=headers, json={
"jsonrpc": "2.0",
"id": "tool-call-2",
"method": "tools/call",
"params": retry_params
}).json()
result = response["result"]
print(f"Tool result: {result}")
- MCP Client
-
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
import asyncio
async def elicitation_handler(request):
"""Handle form elicitation requests from the server."""
print(f"Elicitation: {request.params.message}")
return {"action": "accept", "content": {"confirm": True}}
async def use_elicitation(url, token):
headers = {"Authorization": f"Bearer {token}"}
async with streamablehttp_client(url=url, headers=headers) as (
read_stream, write_stream, _
):
async with ClientSession(
read_stream, write_stream,
elicitation_handler=elicitation_handler
) as session:
await session.initialize()
result = await session.call_tool(
name="use_aws",
arguments={"command": "aws s3 rm s3://my-bucket/important-file"}
)
print(f"Tool result: {result}")
return result
asyncio.run(use_elicitation(
url="https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp",
token="YOUR_ACCESS_TOKEN"
))
- Strands MCP Client
-
from mcp.client.streamable_http import streamablehttp_client
from mcp.types import ElicitResult
from strands import Agent
from strands.tools.mcp import MCPClient
mcp_url = "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp"
access_token = "YOUR_ACCESS_TOKEN"
async def elicitation_callback(context, params):
"""Handle form elicitation requests from the MCP server target."""
print(f"Elicitation: {params.message}")
user_response = get_user_input(params) # Your UI logic
return ElicitResult(action="accept", content=user_response)
mcp_client = MCPClient(
lambda: streamablehttp_client(
mcp_url, headers={"Authorization": f"Bearer {access_token}"}
),
elicitation_callback=elicitation_callback,
)
with mcp_client:
agent = Agent(tools=mcp_client.list_tools_sync())
response = agent("Delete the file s3://my-bucket/important-file using AWS CLI")
print(response)
- LangGraph MCP Client
-
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain_mcp_adapters.callbacks import Callbacks, CallbackContext
from langchain.agents import create_agent
from mcp.shared.context import RequestContext
from mcp.types import ElicitRequestParams, ElicitResult
async def on_elicitation(
mcp_context: RequestContext,
params: ElicitRequestParams,
context: CallbackContext,
) -> ElicitResult:
"""Handle elicitation requests from MCP servers."""
print(f"[{context.server_name}] Elicitation: {params.message}")
# Prompt user for input based on params.requestedSchema
return ElicitResult(
action="accept",
content={"confirm": True},
)
client = MultiServerMCPClient(
{
"gateway": {
"url": "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp",
"transport": "http",
"headers": {"Authorization": "Bearer YOUR_ACCESS_TOKEN"},
}
},
callbacks=Callbacks(on_elicitation=on_elicitation),
)
tools = await client.get_tools()
agent = create_agent("claude-sonnet-4-20250514", tools)
result = await agent.ainvoke(
{"messages": [{"role": "user", "content": "Delete s3://my-bucket/important-file"}]}
)
Exemplo de modo URL
No modo URL, o servidor envia uma URL que o usuário deve visitar para concluir uma ação (normalmente autenticação OAuth). A solicitação permanece aberta enquanto espera que o usuário conclua a ação no URL.
exemplo
- Python requests package (2025-11-25 and earlier)
-
Nessas versões, a elicitação de URL chega como uma elicitation/create solicitação no fluxo SSE aberto em uma sessão MCP. Defina o MCP-Protocol-Version cabeçalho para uma versão compatível com seu gateway.
import requests
import json
import sseclient
import webbrowser
gateway_url = "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp"
headers = {
"Content-Type": "application/json",
"Accept": "text/event-stream",
"Authorization": "Bearer YOUR_ACCESS_TOKEN",
"MCP-Protocol-Version": "2025-11-25",
"Mcp-Session-Id": "session-abc123def456"
}
# Call tool that triggers URL elicitation
response = requests.post(gateway_url, headers=headers, json={
"jsonrpc": "2.0",
"id": "tool-call-2",
"method": "tools/call",
"params": {
"name": "access_github_repo",
"arguments": {"repo": "my-org/my-repo"}
}
}, stream=True)
# Process SSE events
client = sseclient.SSEClient(response)
for event in client.events():
data = json.loads(event.data)
if data.get("method") == "elicitation/create":
elicitation_id = data["id"]
url = data["params"]["url"]
print(f"URL elicitation: {data['params']['message']}")
# Open browser for user to complete authentication
webbrowser.open(url)
input("Press Enter after completing authentication...")
# Send elicitation response
requests.post(gateway_url, headers=headers, json={
"jsonrpc": "2.0",
"id": elicitation_id,
"result": {"action": "accept"}
})
elif "result" in data:
print(f"Tool result: {data['result']}")
break
- Python requests package (2026-07-28)
-
Na versão2026-07-28, a elicitação de URL chega como input_required resultado por meio do padrão de várias solicitações de ida e volta, em vez de no fluxo SSE. O usuário conclui a ação na URL e, em seguida, o cliente repete a solicitação original com uma nova idinputResponses, a e a não modificada. requestState As sessões não são usadas. Seu gateway supportedVersions deve incluir2026-07-28.
import requests
import webbrowser
gateway_url = "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp"
META = {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {"name": "my-agent", "version": "1.0.0"},
"io.modelcontextprotocol/clientCapabilities": {"elicitation": {"form": {}, "url": {}}}
}
headers = {
"Content-Type": "application/json",
"Accept": "application/json, text/event-stream",
"Authorization": "Bearer YOUR_ACCESS_TOKEN",
"MCP-Protocol-Version": "2026-07-28",
"Mcp-Method": "tools/call",
"Mcp-Name": "access_github_repo"
}
arguments = {"repo": "my-org/my-repo"}
# Step 1: Call the tool, declaring the elicitation capability in _meta
response = requests.post(gateway_url, headers=headers, json={
"jsonrpc": "2.0",
"id": "tool-call-1",
"method": "tools/call",
"params": {"name": "access_github_repo", "arguments": arguments, "_meta": META}
}).json()
result = response["result"]
if result.get("resultType") == "input_required":
# Step 2: Open the browser for the user to complete each URL elicitation
input_responses = {}
for key, input_request in result.get("inputRequests", {}).items():
params = input_request["params"]
print(f"URL elicitation: {params['message']}")
webbrowser.open(params["url"])
input("Press Enter after completing authentication...")
input_responses[key] = {"action": "accept"}
# Step 3: Retry the tool call with a new id, the input responses,
# and the requestState echoed back unmodified
retry_params = {"name": "access_github_repo", "arguments": arguments, "_meta": META,
"inputResponses": input_responses}
if "requestState" in result:
retry_params["requestState"] = result["requestState"]
response = requests.post(gateway_url, headers=headers, json={
"jsonrpc": "2.0",
"id": "tool-call-2",
"method": "tools/call",
"params": retry_params
}).json()
result = response["result"]
print(f"Tool result: {result}")
- MCP Client
-
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
import asyncio
import webbrowser
async def elicitation_handler(request):
"""Handle URL elicitation by opening the browser."""
if hasattr(request.params, 'url') and request.params.url:
print(f"Opening URL for authentication: {request.params.url}")
webbrowser.open(request.params.url)
input("Press Enter after completing authentication...")
return {"action": "accept"}
# Form mode fallback
return {"action": "accept", "content": {}}
async def use_url_elicitation(url, token):
headers = {"Authorization": f"Bearer {token}"}
async with streamablehttp_client(url=url, headers=headers) as (
read_stream, write_stream, _
):
async with ClientSession(
read_stream, write_stream,
elicitation_handler=elicitation_handler
) as session:
await session.initialize()
result = await session.call_tool(
name="access_github_repo",
arguments={"repo": "my-org/my-repo"}
)
print(f"Tool result: {result}")
return result
asyncio.run(use_url_elicitation(
url="https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp",
token="YOUR_ACCESS_TOKEN"
))
- Strands MCP Client
-
from mcp.client.streamable_http import streamablehttp_client
from mcp.types import ElicitResult
from strands import Agent
from strands.tools.mcp import MCPClient
import webbrowser
mcp_url = "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp"
access_token = "YOUR_ACCESS_TOKEN"
async def elicitation_callback(context, params):
"""Handle URL elicitation by opening the browser."""
if hasattr(params, 'url') and params.url:
print(f"Opening URL: {params.url}")
webbrowser.open(params.url)
input("Press Enter after completing authentication...")
return ElicitResult(action="accept")
return ElicitResult(action="accept", content={})
mcp_client = MCPClient(
lambda: streamablehttp_client(
mcp_url, headers={"Authorization": f"Bearer {access_token}"}
),
elicitation_callback=elicitation_callback,
)
with mcp_client:
agent = Agent(tools=mcp_client.list_tools_sync())
response = agent("Access the my-org/my-repo GitHub repository")
print(response)
- LangGraph MCP Client
-
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain_mcp_adapters.callbacks import Callbacks, CallbackContext
from langchain.agents import create_agent
from mcp.shared.context import RequestContext
from mcp.types import ElicitRequestParams, ElicitResult
import webbrowser
async def on_elicitation(
mcp_context: RequestContext,
params: ElicitRequestParams,
context: CallbackContext,
) -> ElicitResult:
"""Handle URL elicitation by opening the browser."""
if params.url:
print(f"[{context.server_name}] Opening URL: {params.url}")
webbrowser.open(params.url)
input("Press Enter after completing authentication...")
return ElicitResult(action="accept")
return ElicitResult(action="accept", content={})
client = MultiServerMCPClient(
{
"gateway": {
"url": "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp",
"transport": "http",
"headers": {"Authorization": "Bearer YOUR_ACCESS_TOKEN"},
}
},
callbacks=Callbacks(on_elicitation=on_elicitation),
)
tools = await client.get_tools()
agent = create_agent("claude-sonnet-4-20250514", tools)
result = await agent.ainvoke(
{"messages": [{"role": "user", "content": "Access the my-org/my-repo GitHub repository"}]}
)