블로그 목록으로
#Connectors#MCP#Platform

수백 개의 도구를 MCP로 연결하기: connector-hub 설계

에이전트가 쓸모 있으려면 외부 도구가 필요합니다. vooy가 수십 개 SaaS를 MCP로 표준화해 붙이는 connector-hub의 구조와, 그 과정에서 마주친 함정들.

SSoyeon KimConnectors3 분 분량
목차

에이전트의 가치는 결국 무엇을 할 수 있느냐로 결정됩니다. 캘린더를 잡고, 노션 문서를 읽고, 깃허브 이슈를 열 수 있어야 합니다. 그런데 도구를 하나씩 손으로 붙이기 시작하면, 통합의 수는 곱셈으로 늘어납니다. 이 글은 vooy가 그 폭발을 connector-hub라는 한 계층으로 눌러 담은 이야기입니다.

문제: 도구는 폭발한다

처음에는 Google, Slack, Notion 세 개만 붙이면 될 줄 알았습니다. 6개월 뒤 우리는 30개가 넘는 통합을 관리하고 있었고, 각각이 자기만의 인증 방식, 레이트 리밋, 에러 포맷, 페이지네이션 규칙을 가지고 있었습니다.

각 통합을 에이전트 코드에 직접 박았다면, 모델 루프는 서비스별 분기로 뒤덮였을 겁니다. 우리는 그 사이에 한 겹을 끼워 넣기로 했습니다.

MCP를 공통 분모로

Model Context Protocol은 도구를 모델에 노출하는 방식을 표준화합니다. 우리는 모든 커넥터를 MCP 서버로 구현하기로 했습니다. 내부 도구든, 외부 SaaS 래퍼든, 전부 같은 프로토콜로 말합니다.

hub/connect.ts
const client = await mcp.connect({
  transport: "streamable-http",
  url: connector.endpoint,
  auth: await vault.tokenFor(session.user, connector.id),
});
 
const tools = await client.listTools();
// 모든 커넥터가 동일한 모양의 도구 목록을 돌려준다.

이 결정의 핵심 이득은 에이전트 런타임이 커넥터를 몰라도 된다는 것입니다. 런타임은 MCP 도구 목록만 보고, 그 도구가 노션인지 깃허브인지 신경 쓰지 않습니다.

connector-hub의 구조

connector-hub는 세 가지 일을 합니다.

  • 세션에 어떤 커넥터가 활성화됐는지 추적한다
  • 각 커넥터의 MCP 서버 연결을 풀링한다
  • 사용자별 인증 토큰을 안전하게 주입한다

인증 격리

가장 위험한 부분입니다. 사용자 A의 토큰이 사용자 B의 도구 호출에 새어 들어가면 끝장입니다. 그래서 토큰은 절대 커넥터 코드에 직접 노출되지 않고, 호출 시점에 vault에서 꺼내 요청 스코프로만 주입됩니다.

hub/invoke.ts
async function invoke(call: ToolCall, session: Session) {
  const connector = registry.resolve(call.toolName);
  const token = await vault.tokenFor(session.user, connector.id);
 
  // 토큰은 이 호출 동안만 존재하고, 끝나면 폐기된다.
  return withScopedAuth(token, () => connector.client.call(call));
}

스키마 정규화

각 SaaS의 응답은 제각각입니다. 같은 "사용자" 개념도 Slack은 user.real_name, Google은 names[0].displayName으로 줍니다. 우리는 커넥터마다 얇은 정규화 어댑터를 둬서, 모델에 돌아가는 출력은 항상 일관된 모양이 되도록 했습니다. 모델이 서비스별 응답 구조를 학습하게 두는 건 토큰 낭비이자 오류의 원천입니다.

도구를 모델에 노출하는 비용

여기서 반직관적인 교훈이 나왔습니다. 도구가 많을수록 에이전트는 멍청해집니다. 활성 커넥터의 모든 도구를 한 번에 모델에 던지면, 도구 정의만으로 컨텍스트의 절반을 먹고, 선택 정확도도 떨어졌습니다.

그래서 두 단계로 나눴습니다.

  1. 의도에 따라 관련 커넥터를 먼저 좁힌다 (검색 + 휴리스틱)
  2. 좁혀진 커넥터의 도구만 모델에 노출한다
전략평균 도구 수선택 정확도
전부 노출140+71%
커넥터 선좁힘1294%

무엇을 배웠나

통합을 추가하는 일은 쉽다. 통합을 일관되게 만드는 일이 어렵다.

MCP는 은탄환이 아니었지만, "모든 도구가 같은 프로토콜로 말한다"는 단 하나의 불변식을 강제해 준 것만으로도 충분히 값졌습니다. 그 위에서 인증 격리, 스키마 정규화, 도구 선좁힘은 전부 커넥터와 무관하게 한 번씩만 풀면 되는 문제가 되었습니다.

다음 도구를 붙이는 데 이제 하루가 안 걸립니다. 그게 이 계층이 존재하는 이유입니다.

함께 읽으면 좋은 글