View a markdown version of this page

Gunakan elicitation dengan gateway Anda AgentCore - Batu Dasar Amazon AgentCore

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Gunakan elicitation dengan gateway Anda AgentCore

Elicitation adalah fitur MCP yang memungkinkan server MCP untuk meminta informasi tambahan dari klien selama panggilan alat. Ketika alat membutuhkan konfirmasi pengguna, otentikasi, atau input tambahan untuk melanjutkan, server mengirimkan permintaan elicitation kembali ke klien. AgentCore Gateway meneruskan permintaan elicitasi dari target server MCP ke klien Anda, mengganti permintaan id dengan pengenal yang dihasilkan gateway.

Prasyarat

Untuk menggunakan elicitation dengan gateway Anda, Anda harus memiliki:

  • Sesi diaktifkan (versi 2025-11-25 dan sebelumnya) - Elicitation memerlukan dukungan sesi. Lihat Menggunakan sesi MCP dengan gateway Anda. Untuk versi 2026-07-28 dan yang lebih baru, Anda tidak perlu menambahkan sessionConfiguration ke gateway Anda, karena versi ini bersifat stateless.

  • Streaming respons diaktifkan (versi 2025-11-25 dan sebelumnya) - Permintaan elicitasi dikirim sebagai potongan Acara Server-Sent (SSE) selama koneksi terbuka. Set streamingConfiguration.enableResponseStreaming el ke true dalam gateway AndaprotocolConfiguration.mcp. Untuk versi 2026-07-28 dan yang lebih baru, Anda tidak perlu mengaktifkan streaming respons. Versi ini memberikan elicitasi melalui pola permintaan multi pulang pergi (MRTR) alih-alih permintaan yang diprakarsai server pada aliran respons. Untuk informasi selengkapnya, lihat Per mintaan multi pulang- pergi dalam dokumentasi Model Context Protocol.

  • Jenis target server MCP — Elicitation hanya didukung untuk target server MCP. Elisitasi berasal dari server MCP dan diteruskan melalui gateway ke klien.

  • Klien menyatakan kemampuan elicitation — Klien harus menyatakan dukungan untuk elicitation untuk gateway untuk meneruskan permintaan elicitation. Untuk versi 2025-11-25 dan sebelumnya, klien menyatakan dukungan ini dalam initialize permintaan. Untuk versi 2026-07-28 dan yang lebih baru, klien menyatakan kemampuan untuk setiap permintaan di _meta bidang (io.modelcontextprotocol/clientCapabilities).

Mode elicitasi yang didukung

AgentCore Gateway mendukung tiga mode elicitasi yang ditentukan oleh spesifikasi MCP:

Modus Deskripsi

Mode formulir

Server mengirimkan formulir terstruktur dengan bidang untuk diisi klien. Digunakan untuk mengumpulkan konfirmasi pengguna, preferensi, atau data input. Permintaan tetap terbuka sambil menunggu tanggapan.

Mode URL (berbasis permintaan)

Server mengirimkan URL yang harus dikunjungi pengguna untuk menyelesaikan tindakan (biasanya otentikasi). Permintaan tetap terbuka sambil menunggu tindakan selesai.

Mode URL (berbasis pengecualian)

Server melempar URL URLElicitationRequiredError yang berisi. Permintaan ditutup, pengguna menyelesaikan tindakan di URL, dan klien mencoba lagi panggilan alat asli.

Negosiasi kemampuan

Gateway hanya mendeklarasikan dukungan elicitation ke target server MCP jika:

  1. Klien menyatakan dukungan elicitasi. Untuk versi 2025-11-25 dan sebelumnya, klien menyatakan ini selamainitialize. Untuk versi 2026-07-28 dan yang lebih baru, klien mendeklarasikannya untuk setiap permintaan di_meta.

  2. Versi protokol MCP mendukung mode elicitation. formmode membutuhkan versi 2025-03-26 atau yang lebih baru. urlmode memerlukan versi 2025-11-25 atau yang lebih baru.

  3. Gateway cocok dengan kemampuan elicitation spesifik yang dinyatakan oleh klien (formulir, url, atau keduanya).

Aliran elicitasi mode formulir

catatan

Alur yang dijelaskan di sini berlaku untuk versi 2025-11-25 dan sebelumnya, di mana server mengirim elicitation/create sebagai permintaan yang diprakarsai server pada aliran SSE terbuka. Untuk versi 2026-07-28 dan yang lebih baru, elicitation malah menggunakan pola multi pulang pergi permintaan (MRTR). Server mengembalikan hasil sementara, dan klien mencoba kembali permintaan asli dengan input yang dikumpulkan. Untuk informasi selengkapnya, lihat Per mintaan multi pulang- pergi dalam dokumentasi Model Context Protocol.

  1. Klien mengirim tools/call permintaan dengan Mcp-Session-Id header.

  2. Gateway meneruskan panggilan alat ke target server MCP.

  3. Target membuka aliran SSE dan mengirimkan elicitation/create permintaan sebagai peristiwa pertama.

  4. Gateway meneruskan elicitation/create permintaan ke klien pada aliran SSE, menggantikan permintaanid.

  5. Klien menyajikan formulir kepada pengguna dan mengumpulkan tanggapan.

  6. Klien mengirimkan permintaan baru dengan respons elicitation (action: accept ordecline) menggunakan yang samaMcp-Session-Id.

  7. Gateway meneruskan respons ke target server MCP.

  8. Target diakui dengan HTTP 202 Diterima.

  9. Target menyelesaikan panggilan alat dan mengirimkan hasil akhir pada aliran SSE asli.

  10. Gateway meneruskan hasil akhir ke klien dan menutup aliran.

Alur elicitasi mode URL (berbasis pengecualian)

  1. Klien mengirim tools/call permintaan dengan Mcp-Session-Id header.

  2. Gateway meneruskan panggilan alat ke target server MCP.

  3. Target menampilkan URLElicitationRequiredError JSON-RPC kesalahan, berisi URL dan ID elicitasi.

  4. Gateway meneruskan URLElicitationRequiredError ke klien, menggantikan permintaanid.

  5. Klien mengalihkan pengguna ke URL yang disediakan untuk menyelesaikan tindakan (biasanya otentikasi OAuth).

  6. Setelah pengguna menyelesaikan tindakan, klien mencoba kembali tools/call permintaan asli.

  7. Gateway meneruskan percobaan ulang ke target. Target menyelesaikan panggilan alat sejak elisitasi URL terpenuhi.

  8. Gateway meneruskan hasil alat akhir ke klien.

Panggilan alat paralel dengan elisitasi

Klien dapat memulai beberapa tools/call permintaan dalam sesi yang sama, bahkan saat elicitation tertunda. Setiap elicitasi dilacak secara independen olehnyaid. Saat mengirim respons elicitation, klien harus menyertakan yang sama id yang dikirim oleh gateway dalam elicitation/create permintaan.

Panduan untuk pengembang target server MCP

penting

Target server MCP yang mengirim permintaan elisitasi harus membungkus panggilan elisitasi dalam blok try-catch dan menangani kasus di mana klien tidak mendukung elicitation. Jika klien gateway tidak mendeklarasikan kemampuan elicitation, gateway tidak mendeklarasikannya ke target. Jika target tetap mengirimkan elicitasi, gateway mengembalikan kesalahan -32601 (Metode tidak ditemukan) ke target.

Server harus mengimplementasikan jalur fallback (seperti menggunakan nilai default atau melewatkan operasi) ketika elicitation tidak tersedia.

Mengamankan status permintaan (versi 2026-07-28 dan yang lebih baru)

Pada versi 2026-07-28 dan yang lebih baru, elicitation menggunakan pola permintaan multi pulang pergi (MRTR), yang membawa buram requestState antara klien Anda dan target server MCP Anda. Mengamankan nilai itu adalah tanggung jawab bersama: gateway mengotorisasi dan meneruskannya tanpa menyimpannya, sementara target server MCP Anda harus memvalidasinya dan mencegah satu pengguna memutar ulang status permintaan pengguna lain. Untuk model tanggung jawab bersama penuh dan panduan perlindungan yang harus diikuti server MCP Anda, lihat Mengam ankan status permintaan untuk elisitasi dan pengambilan sampel dalam pertimbangan target server MCP.

Penanganan kesalahan

Skenario Kesalahan Deskripsi

Klien mengirimkan respons elicitasi ketika tidak ada elicitasi yang tertunda

JSON-RPC -32600(Permintaan Tidak Valid)

Tidak ada elicitasi yang cocok ditemukan untuk sesi ini.

Klien mengirimkan respons elicitasi dengan id yang tidak cocok dengan elisitasi yang tertunda

JSON-RPC -32600(Permintaan Tidak Valid)

idHarus cocok dengan yang dikirim oleh gateway dalam elicitation/create permintaan.

Koneksi terputus antara gateway dan target server MCP

JSON-RPC kesalahan dengan DependencyFailedException

Klien harus mencoba lagi permintaan panggilan alat asli.

Koneksi terputus antara klien dan gateway

N/A

Elisitasi yang tertunda dibersihkan. Klien harus mencoba lagi panggilan alat.

Server MCP mengirimkan elicitasi tetapi gateway tidak mendeklarasikan dukungan

JSON-RPC -32601(Metode tidak ditemukan)

Kembali ke target server MCP. Lihat Pem ecahan Masalah.

Gateway-authored elicitasi membutuhkan kemampuan yang tidak dinyatakan klien (versi 2026-07-28 dan yang lebih baru)

JSON-RPC -32021(Kehilangan kemampuan klien yang diperlukan), HTTP 400

Pada versi 2026-07-28 dan yang lebih baru, gateway mengembalikan kode ini alih-alih-32601. Ini terjadi ketika klien tidak menyatakan kemampuan yang diperlukan dalam permintaannya_meta.

Pemecahan masalah

Kesalahan: “Kesalahan memanggil alat 'sample_tool': Metode tidak ditemukan:" elicitation/create

Kesalahan ini terjadi ketika target server MCP mengirimkan permintaan elicitation tetapi klien gateway tidak mendeklarasikan kemampuan elicitation. Untuk versi 2025-11-25 dan sebelumnya, klien menyatakan kemampuan ini selamainitialize. Untuk versi 2026-07-28 dan yang lebih baru, klien mendeklarasikannya untuk setiap permintaan di _meta lapangan. Gateway mengembalikan kesalahan -32601 (Metode tidak ditemukan) ke target. Target mungkin mengembalikan ini sebagai kesalahan eksekusi alat ke klien.

Untuk menyelesaikan:

  • Jika Anda adalah pengembang server MCP: Tambahkan penanganan kesalahan di sekitar panggilan elicitasi Anda. Terapkan jalur fallback saat elicitation tidak didukung:

    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()
  • Jika Anda adalah pengembang klien gateway: Untuk versi 2025-11-25 dan yang lebih lama, pastikan klien Anda menyatakan kemampuan elicitation selamainitialize:

    { "capabilities": { "elicitation": { "form": {}, "url": {} } } }

Kesalahan: “Kemampuan klien yang diperlukan hilang” (-32021)

Pada versi 2026-07-28 dan yang lebih baru, gateway mengembalikan -32021 kesalahan (HTTP400) ketika elicitation yang ditulis gateway memerlukan kemampuan yang tidak dideklarasikan. Karena versi ini tidak memiliki status dan tidak memiliki initialize jabat tangan, klien menyatakan kemampuan dalam setiap permintaan. Untuk mengatasi kesalahan ini, sertakan kemampuan elicitasi di _meta bidang permintaan (io.modelcontextprotocol/clientCapabilities) pada setiap permintaan yang mungkin memicu elicitation.

Sampel Kode

Contoh mode formulir

Dalam mode formulir, server mengirimkan skema terstruktur untuk diisi klien. Permintaan tetap terbuka sambil menunggu tanggapan.

contoh
Python requests package (2025-11-25 and earlier)

Pada versi ini, klien menyatakan kemampuan elicitasi selamainitialize, dan elisitasi tiba sebagai elicitation/create permintaan pada aliran SSE terbuka. Atur MCP-Protocol-Version header ke versi yang didukung gateway Anda.

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)

Pada versi2026-07-28, elicitation menggunakan pola permintaan multi pulang-pergi alih-alih permintaan yang diprakarsai server pada aliran SSE. Klien menyatakan kemampuan elicitasi _meta pada setiap permintaan. Jika alat membutuhkan input, responsnya adalah input_required hasil yang berisi inputRequests dan buramrequestState. Klien mengumpulkan input dan mencoba kembali permintaan asli dengan yang baruid, yanginputResponses, dan yang tidak dimodifikasi. requestState Sesi dan initialize jabat tangan tidak digunakan. Gateway Anda supportedVersions harus disertakan2026-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"}]} )

Contoh mode URL

Dalam mode URL, server mengirimkan URL yang harus dikunjungi pengguna untuk menyelesaikan tindakan (biasanya otentikasi OAuth). Permintaan tetap terbuka sambil menunggu pengguna menyelesaikan tindakan di URL.

contoh
Python requests package (2025-11-25 and earlier)

Pada versi ini, elicitasi URL tiba sebagai elicitation/create permintaan pada aliran SSE terbuka dalam sesi MCP. Atur MCP-Protocol-Version header ke versi yang didukung gateway Anda.

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)

Pada versi2026-07-28, elicitasi URL tiba sebagai input_required hasilnya melalui pola permintaan multi pulang-pergi alih-alih pada aliran SSE. Pengguna menyelesaikan tindakan di URL, kemudian klien mencoba kembali permintaan asli dengan yang baruid, yanginputResponses, dan yang tidak requestState dimodifikasi. Sesi tidak digunakan. Gateway Anda supportedVersions harus disertakan2026-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"}]} )