Lire une ressource depuis une AgentCore passerelle
Pour lire une ressource spécifique, envoyez une requête POST au point de terminaison MCP de la passerelle et spécifiez resources/read comme méthode dans le corps de la demande et l'URI de la ressource :
POST /mcp HTTP/1.1
Host: ${GatewayEndpoint}
Content-Type: application/json
Authorization: ${Authorization header}
${RequestBody}
Remplacez les valeurs suivantes :
-
${GatewayEndpoint}— L'URL de la passerelle, telle que fournie dans la réponse de l'CreateGatewayAPI.
-
${Authorization header}— Les informations d'autorisation fournies par le fournisseur d'identité lorsque vous configurez l'autorisation entrante.
-
${RequestBody}— La charge utile JSON du corps de la requête, telle que spécifiée dans la section Reading resources in the Model Context Protocol (MCP). Inclure resources/read comme method et inclure le uri de la ressource.
La réponse renvoie un contents tableau dans lequel chaque entrée inclut le urimimeType, et text (pour le contenu texte) ou blob (le contenu binaire codé en base64).
L'resources/readopération transmet la demande en direct au serveur MCP en aval. L'URI de ressource est l'URI brut tel que renvoyé par resources/list (pas de préfixe cible).
Lorsque plusieurs cibles exposent le même URI de ressource, la passerelle achemine la demande vers la cible ayant la resourcePriority valeur la plus faible.
Le uri paramètre est transmis à la cible du serveur MCP en aval sans désinfection. Un URI de ressource fourni par l'utilisateur peut contenir un point de terminaison d'URL malveillant destiné à des attaques SSRF ou à une tentative de lecture des chemins de systèmes de fichiers locaux (par exemple,). file:///etc/passwd Validez les URI des ressources par rapport à une liste autorisée de schémas et de modèles d'URI attendus avant d'appeler. resources/read Utilisez uniquement les URI renvoyés par resources/list des cibles de serveurs MCP fiables.
Exemples de code pour lire une ressource
Pour voir des exemples de lecture d'une ressource depuis la passerelle, sélectionnez l'une des méthodes suivantes :
Exemple
- curl
-
-
La requête curl suivante montre un exemple de demande pour lire une ressource avec un URI config://app-settings via une passerelle avec l'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
-
-
REMARQUE : La prise en charge des ressources du SDK Strands peut varier. Utilisez l'approche client MCP ci-dessus pour une resources/read mise en œuvre la plus fiable possible.
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
-
-
REMARQUE : La prise en charge des ressources de l'adaptateur LangGraph MCP peut varier. Utilisez l'approche client MCP ci-dessus pour une resources/read mise en œuvre la plus fiable possible.
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"
))
Erreurs
L'resources/readopération peut renvoyer les types d'erreurs suivants :
-
Erreurs renvoyées dans le cadre du code d'état HTTP :
-
AuthenticationError
-
La demande a échoué en raison d'informations d'authentification non valides.
Code d'état HTTP : 401
-
AuthorizationError
-
L'appelant n'est pas autorisé à lire la ressource.
Code d'état HTTP : 403
-
ResourceNotFoundError
-
L'URI de ressource spécifié n'existe pas ou n'est exposé par aucune cible.
Code d'état HTTP : 404
-
ValidationError
-
L'URI fourni est mal formé ou absent.
Code d'état HTTP : 400
-
InternalServerError
-
Une erreur interne du serveur s’est produite.
Code d'état HTTP : 500
-
Erreurs MCP. Pour plus d'informations sur ces types d'erreurs, consultez les ressources de la documentation MCP (Model Context Protocol).