Leer un recurso desde una AgentCore puerta de enlace
Para leer un recurso específico, realice una solicitud POST al punto final MCP de la puerta de enlace y especifique resources/read el método en el cuerpo de la solicitud y el URI del recurso:
POST /mcp HTTP/1.1
Host: ${GatewayEndpoint}
Content-Type: application/json
Authorization: ${Authorization header}
${RequestBody}
Reemplace los siguientes valores:
-
${GatewayEndpoint}— La URL de la puerta de enlace, tal como se proporciona en la respuesta de la CreateGatewayAPI.
-
${Authorization header}— Las credenciales de autorización del proveedor de identidad al configurar la autorización entrante.
-
${RequestBody}— La carga útil JSON del cuerpo de la solicitud, tal como se especifica en los recursos de lectura del Model Context Protocol (MCP). resources/readIncluya como method e incluya el uri del recurso.
La respuesta devuelve una contents matriz en la que cada entrada incluye urimimeType, y text (para contenido de texto) o blob (contenido binario codificado en base64).
La resources/read operación envía la solicitud en directo al servidor MCP descendente. El URI del recurso es el URI sin procesar devuelto por resources/list (sin prefijo de destino).
Cuando varios destinos muestran el mismo URI de recurso, la puerta de enlace enruta la solicitud al objetivo con el resourcePriority valor más bajo.
El uri parámetro se transfiere al servidor MCP de destino descendente sin necesidad de desinfectarlo. El URI de un recurso proporcionado por el usuario podría contener un extremo URL malicioso destinado a atacar a la SSRF o a intentar leer las rutas de los sistemas de archivos locales (por ejemplo,). file:///etc/passwd Valide los URI de los recursos comparándolos con una lista permitida de esquemas y patrones de URI esperados antes de realizar la llamada. resources/read Utilice únicamente los URI devueltos por servidores MCP resources/list de destino confiables.
Ejemplos de código para leer un recurso
Para ver ejemplos de lectura de un recurso desde la puerta de enlace, seleccione uno de los siguientes métodos:
ejemplo
- curl
-
-
La siguiente solicitud curl muestra un ejemplo de solicitud para leer un recurso con un URI config://app-settings a través de una puerta de enlace con el IDmygateway-abcdefghij.
curl -X POST \
https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"jsonrpc": "2.0",
"id": "read-resource-request",
"method": "resources/read",
"params": {
"uri": "config://app-settings"
}
}'
- Python requests package
-
-
import requests
import json
def read_resource(gateway_url, access_token, resource_uri):
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {access_token}"
}
payload = {
"jsonrpc": "2.0",
"id": "read-resource-request",
"method": "resources/read",
"params": {
"uri": resource_uri
}
}
response = requests.post(gateway_url, headers=headers, json=payload)
return response.json()
# Example usage
gateway_url = "https://${GatewayEndpoint}/mcp" # Replace with your actual gateway endpoint
access_token = "${AccessToken}" # Replace with your actual access token
result = read_resource(
gateway_url,
access_token,
"config://app-settings" # Replace with the resource URI from resources/list
)
print(json.dumps(result, indent=2))
- MCP Client
-
-
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
from pydantic import AnyUrl
import asyncio
async def execute_mcp(
url,
token,
resource_uri,
headers=None
):
default_headers = {
"Authorization": f"Bearer {token}"
}
headers = {**default_headers, **(headers or {})}
async with streamablehttp_client(
url=url,
headers=headers,
) as (
read_stream,
write_stream,
callA,
):
async with ClientSession(read_stream, write_stream) as session:
# 1. Perform initialization handshake
print("Initializing MCP...")
_init_response = await session.initialize()
print(f"MCP Server Initialize successful! - {_init_response}")
# 2. Read specific resource
print(f"Reading resource: {resource_uri}")
resource_response = await session.read_resource(uri=AnyUrl(resource_uri))
for content in resource_response.contents:
print(f"URI: {content.uri}, MIME: {content.mimeType}")
if hasattr(content, 'text') and content.text:
print(f"Text: {content.text}")
elif hasattr(content, 'blob') and content.blob:
print(f"Blob (base64): {content.blob[:100]}...")
return resource_response
async def main():
url = "https://${GatewayEndpoint}/mcp"
token = "your_bearer_token_here"
resource_uri = "config://app-settings"
await execute_mcp(
url=url,
token=token,
resource_uri=resource_uri
)
if __name__ == "__main__":
asyncio.run(main())
- Strands MCP Client
-
-
NOTA: La compatibilidad con los recursos del SDK de Strands puede variar. Utilice el enfoque de cliente MCP mencionado anteriormente para obtener la resources/read implementación más confiable.
from strands.tools.mcp.mcp_client import MCPClient
from mcp.client.streamable_http import streamablehttp_client
def create_streamable_http_transport(mcp_url: str, access_token: str):
return streamablehttp_client(mcp_url, headers={"Authorization": f"Bearer {access_token}"})
def run_agent(mcp_url: str, access_token: str):
mcp_client = MCPClient(lambda: create_streamable_http_transport(mcp_url, access_token))
with mcp_client:
result = mcp_client.read_resource_sync(uri="config://app-settings")
print(result)
run_agent(<MCP URL>, <Access token>)
- LangGraph MCP Client
-
-
NOTA: El soporte de recursos LangGraph del adaptador MCP puede variar. Utilice el enfoque de cliente MCP mencionado anteriormente para obtener la implementación más confiableresources/read.
import asyncio
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
from pydantic import AnyUrl
async def read_resource(url, token, resource_uri):
headers = {"Authorization": f"Bearer {token}"}
async with streamablehttp_client(url=url, headers=headers) as (
read_stream, write_stream, callA
):
async with ClientSession(read_stream, write_stream) as session:
await session.initialize()
response = await session.read_resource(uri=AnyUrl(resource_uri))
for content in response.contents:
if hasattr(content, 'text') and content.text:
print(f"{content.uri}: {content.text}")
elif hasattr(content, 'blob') and content.blob:
print(f"{content.uri}: <blob, {len(content.blob)} chars base64>")
asyncio.run(read_resource(
"https://${GatewayEndpoint}/mcp",
"${AccessToken}",
"config://app-settings"
))
Errores
La resources/read operación puede devolver los siguientes tipos de errores:
-
Errores devueltos como parte del código de estado HTTP:
-
AuthenticationError
-
La solicitud falló debido a que las credenciales de autenticación no son válidas.
Código de estado HTTP: 401
-
AuthorizationError
-
La persona que llama no tiene permiso para leer el recurso.
Código de estado HTTP: 403
-
ResourceNotFoundError
-
El URI del recurso especificado no existe o ningún objetivo lo expone.
Código de estado HTTP: 404
-
ValidationError
-
El URI proporcionado tiene un formato incorrecto o falta.
Código de estado HTTP: 400
-
InternalServerError
-
Se ha producido un error interno del servidor.
Código de estado HTTP: 500
-
Errores de MCP. Para obtener más información sobre estos tipos de errores, consulte los recursos de la documentación del Model Context Protocol (MCP).