AgentCore 게이트웨이에서 리소스 읽기
특정 리소스를 읽으려면 게이트웨이의 MCP 엔드포인트에 POST 요청을 하고를 요청 본문의 메서드 및 리소스의 URIresources/read로 지정합니다.
POST /mcp HTTP/1.1
Host: ${GatewayEndpoint}
Content-Type: application/json
Authorization: ${Authorization header}
${RequestBody}
다음 값을 교체합니다.
응답은 각 항목에 uri, mimeType및 text (텍스트 콘텐츠의 경우) 또는 blob (base64 인코딩 바이너리 콘텐츠)가 포함된 contents 배열을 반환합니다.
resources/read 작업은 요청을 다운스트림 MCP 서버에 라이브로 프록시합니다. 리소스 URI는에서 반환되는 원시 URI입니다resources/list(대상 접두사 없음).
여러 대상이 동일한 리소스 URI를 노출하면 게이트웨이는 가장 낮은 resourcePriority 값을 가진 대상으로 요청을 라우팅합니다.
uri 파라미터는 삭제 없이 다운스트림 MCP 서버 대상으로 전달됩니다. 사용자가 제공한 리소스 URI에는 SSRF 공격용 악성 URL 엔드포인트가 포함되거나 로컬 파일 시스템 경로(예: file:///etc/passwd)를 읽으려고 시도할 수 있습니다. 를 호출하기 전에 예상 URIs 체계 및 패턴의 허용 목록에 대해 리소스 URI를 검증합니다resources/read. 신뢰할 수 있는 MCP 서버 대상resources/list에서가 반환한 URIs만 사용합니다.
리소스를 읽기 위한 코드 샘플
게이트웨이에서 리소스를 읽는 예를 보려면 다음 방법 중 하나를 선택합니다.
예
- curl
-
-
다음 curl 요청은 ID가 인 게이트웨이를 config://app-settings 통해 URI가 인 리소스를 읽는 요청의 예를 보여줍니다mygateway-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
-
-
참고: Strands SDK 리소스 지원은 다를 수 있습니다. 가장 안정적인 resources/read 구현을 위해 위의 MCP 클라이언트 접근 방식을 사용합니다.
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
-
-
참고: LangGraph MCP 어댑터 리소스 지원은 다를 수 있습니다. 가장 안정적인 resources/read 구현을 위해 위의 MCP 클라이언트 접근 방식을 사용합니다.
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"
))
오류
resources/read 작업은 다음과 같은 유형의 오류를 반환할 수 있습니다.