Strands Agents MCP: 에이전트를 Sume MCP 서버에 연결

MCPClient로 Strands 에이전트를 원격 MCP 서버에 연결하세요. Sume 호스팅 MCP URL과 API 키 헤더를 넣고, tool_filters로 유료 도구를 뺍니다.

읽는 시간 5분Sume
전체 글

Strands Agents는 MCPClient로 MCP 서버에 연결합니다. 원격 서버의 url과 headers를 넘기고 클라이언트를 Agent(tools=[...])에 전달하면, Strands가 서버의 도구를 불러와 다른 도구와 똑같이 에이전트에 넘깁니다. Sume 호스팅 MCP 서버라면 URL은 https://mcp.sume.com/mcp이고 헤더는 Sume API 키를 담은 Authorization: Bearer이며, tool_filters를 쓰면 원하지 않는 한 유료 도구를 빼 둘 수 있습니다.

Strands 쪽 내용은 에이전트를 MCP 도구에 연결하기, MCP 트랜스포트, MCPClient API 레퍼런스에서, Sume 쪽 내용은 MCP OAuth와 API 키, MCP 도구와 게이트, Job과 결과 (영문)에서 가져왔으며, 모두 2026-09-28에 확인했습니다. Strands Agents는 Python과 TypeScript용 오픈 소스 SDK이며, 기본 모델 프로바이더는 Amazon Bedrock입니다. 이 글은 Python을 씁니다. Sume에는 Strands 전용 연동이 없습니다. 에이전트는 다른 원격 MCP 서버와 똑같이 Sume 원격 MCP 서버에 연결하며, Sume 기초 페이지는 호스팅 MCP가 여전히 동작하지만 현재 주 경로는 아니라고 설명합니다.

Strands 에이전트를 Sume MCP 서버에 어떻게 연결하나요?

Strands가 권장하는 방식대로 클라이언트를 에이전트에 바로 넘기세요. 그러면 연결의 수명 주기를 Strands가 대신 관리합니다. url을 설정하면 MCPClient가 Streamable HTTP 트랜스포트를 직접 만들고, headers는 모든 요청에 실려 나갑니다. 키는 프롬프트가 아니라 반드시 환경 변수에서 읽으세요.

import os
from strands import Agent
from strands.tools.mcp import MCPClient

sume = MCPClient(
    url="https://mcp.sume.com/mcp",
    headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
    # Read tools only; add "generate_image" behind an approval step.
    tool_filters={"allowed": ["mcp_health", "tools_list", "jobs_status",
                              "jobs_wait", "jobs_result"]},
)

agent = Agent(tools=[sume])
agent("Call mcp_health and summarize what it reports.")

Sume에 중요한 MCPClient 설정은 무엇인가요?

Strands 트랜스포트 페이지는 MCPClient(lambda: streamablehttp_client(url=..., headers=...)) 형태도 보여 줍니다. MCP Python SDK의 v1.x 소스는 streamablehttp_client를 지원 중단(deprecated)으로 표시하므로("Use streamable_http_client instead"), 위 예제처럼 url을 쓰면 이 헬퍼를 거치지 않습니다.

Strands MCPClient API 레퍼런스와 MCP 트랜스포트, Sume 값은 MCP OAuth와 API 키 기준, 2026-09-28 확인.
인자Strands 문서 설명Sume에서는
urlstreamable HTTP 트랜스포트를 자동으로 구성https://mcp.sume.com/mcp
headers모든 요청에 붙는 HTTP 헤더. url 필요Authorization: Bearer <key> 또는 x-api-key
tool_filtersallowed에 이름이나 정규식 패턴. allowed를 먼저, 그다음 rejected를 적용에이전트에 필요한 도구만
auth머신 간 통신용 client_credentials 그랜트 OAuth동작하지 않음. 현재 Sume 서버는 authorization_code만 받음
auth_provider인터랙티브 authorization_code 그랜트 같은 플로용 임의의 httpx.Auth사람이 브라우저에서 로그인해야 함
startup_timeout서버 초기화를 취소하기까지의 타임아웃. 기본값 30기본값

왜 Strands의 OAuth 옵션 대신 API 키를 쓰나요?

두 OAuth 경로 모두 사람 없이 실행되는 에이전트에 맞지 않기 때문입니다. Strands의 auth 옵션은 OAuth client_credentials 그랜트로 인증하는데, 현재 Sume 서버는 authorization_code 그랜트만 알립니다. auth_provider로는 인터랙티브 authorization_code 플로를 실행할 수 있지만, 누군가 로그인해야 하고, 동의는 Write가 꺼진 상태로 시작하며, 현재 Sume 코드에서 액세스 토큰은 리프레시 토큰 없이 한 시간 동안 유효합니다.

API 키 세션에는 Sume의 전체 호스팅 도구 세트가 보이고, 지출은 키가 속한 워크스페이스로 잡힙니다. 키는 신뢰할 수 있는 서버나 시크릿 저장소에 두고 프론트엔드 코드에는 절대 넣지 말며, 로그나 채팅 기록에 노출되면 교체하세요.

에이전트가 지출하지 않게 하려면 어떻게 하나요?

작업에 필요한 도구만 불러오세요. Python의 tool_filters는 allowed 아래에 적은 도구 이름만 불러오고, rejected 목록은 그다음에 도구를 뺍니다. 에이전트가 지출할 수 있다면 루프에 사람을 넣으세요. 에이전트의 interventions에 넘긴 Strands의 HumanInTheLoop 개입(intervention)은 도구 호출 전에 멈춰서, 누군가 그 호출을 승인하거나 수정하거나 거부할 수 있게 합니다. 핸들러 자체의 allowed_tools에 넣은 도구는 승인을 건너뛰므로, 여기에는 Sume의 읽기 도구만 적으세요. Sume 유료 도구에는 각각 idempotency_key가 필요하고, dry_run=true는 Job을 제출하지 않고 접수 여부와 비용을 미리 보여 주며, max_spend_usd는 값을 보낸 경우에만 호출의 상한이 됩니다. 이 인수들은 모델이 작성하므로, 여러분의 코드가 강제하지는 않습니다. Sume MCP 도구 목록은 도구를 읽기, 쓰기, 유료로 나눠 정리합니다.

Sume 도구 호출은 얼마나 오래 걸릴 수 있나요?

jobs_wait 호출은 최대 55초, timeout_seconds를 생략하면 50초 동안 열려 있습니다. Strands는 긴 작업이 무한정 멈춰 있지 않도록 도구 호출에 타임아웃을 설정하라고 권하므로, 55초보다 넉넉하게 두세요. 클라이언트 쪽 타임아웃은 Job을 취소하지 않고 Job은 계속 실행되며 계속 청구되므로, wait_slice_expired를 받으면 에이전트는 같은 id로 jobs_wait를 다시 호출해야 하고, 유료 create는 절대 다시 제출하면 안 됩니다.

출처

관련 글

연동 카테고리의 다른 글

연동 글 전체 보기

작성자 Sume