에이전시 아키텍처: 자체 MCP 에코시스템 구축, 보안 및 확장

발행: (2025년 12월 11일 오전 05:44 GMT+9)
11 min read
원문: Dev.to

Source: Dev.to

당신의 에이전트가 열린 문인가? MCP 보안의 현실

MCP 서버를 공개 URL에 배포하는 순간—내부 테스트용이라 할지라도—당신을 대신해 동작을 실행할 수 있는 엔드포인트가 노출됩니다. 그 서버가 Gmail이나 CRM에 연결돼 있다면, 유출된 URL만으로도 누구든지 당신의 이메일을 읽거나 리드 목록을 확인할 수 있습니다. 보안은 선택적 기능이 아니라 기본 기반입니다.

2단계 인증 전략

n8n 기반 MCP 서버를 보호하려면 은폐에 의존할 수 없습니다. Header Authentication 같은 엄격한 헤더 인증이 필요합니다.

서버‑사이드 잠금

n8n 안에서 MCP 클라이언트 인증을 설정합니다. 기본값인 “None”을 그대로 두지 마세요. Header Auth 로 전환하고 header(보통 표준 API 규격에 맞춤)와 value(고엔트로피 비밀번호 또는 토큰)를 정의합니다.

클라이언트‑사이드 핸드셰이크

복잡성은 주로 클라이언트 설정(예: Claude Desktop)에서 발생합니다. config.json 파일은 스토리지가 서버와 어떻게 통신할지를 결정합니다. 인증 인자를 추가할 때 흔히 발생하는 실수는 JSON 구문 오류입니다. 구조는 정확히 맞춰야 합니다:

{
  "mcpServers": {
    "n8n": {
      "command": "npx",
      "args": [
        "-y",
        "...",
        "--header",
        "Authorization=Bearer YOUR_SECURE_TOKEN"
      ]
    }
  }
}

인사이트

팀 내에서 접근을 공유할 경우, 자격 증명을 공유 저장소에 하드코딩하지 마세요. 환경 변수나 보안 금고를 사용합니다. 자격 증명을 교체할 때는 Claude Desktop 같은 클라이언트가 새로운 헤더를 인식하려면 완전 재시작이 필요함을 기억하세요.

“모든 것” 인터페이스: SaaS 사일로 연결

Zapier와 같이 6,000개 이상의 통합을 제공하는 플랫폼을 무시하고 휠을 다시 만들 필요가 있나요? 다른 자동화 플랫폼을 당신의 MCP 서버에 대한 sub‑processor 로 취급하세요.

SSE 엔드포인트 브리지

Zapier MCP 클라이언트 도구를 n8n 서버에 통합하면 다음과 같은 에이전시 체인을 만들 수 있습니다:

LLM/Client → n8n Server → Zapier via Server‑Sent Events (SSE)

이를 통해 “오후 5시에 내 개와의 미팅을 캘린더에 추가해줘” 혹은 “X에게 이메일 초안을 작성해줘” 같은 자연어 명령이 가능해집니다.

컨텍스트 딜레마

주요 실패 모드 중 하나는 시간적 환각입니다. LLM에게 “오늘 미팅을 잡아줘”라고 요청하면, 모델의 학습 데이터 컷오프(예: 2023)와 현실이 충돌해 “오늘”이 언제인지 모르게 됩니다.

해결책

System Prompt에 동적 컨텍스트를 주입합니다:

Date and Time: {{ $now }}

현재 타임스탬프를 하드코딩하면 모든 하위 도구가 공유된 시간 현실에 고정돼, 과거 몇 년 전 날짜에 미팅을 잡는 일을 방지합니다.

360도 지식: RAG 파이프라인

메모리가 없는 에이전트는 단순 계산기일 뿐입니다. 시니어 수준 어시스턴트를 만들려면 자동으로 업데이트되는 Retrieval‑Augmented Generation (RAG) 가 필요합니다. 아래는 벡터 데이터베이스(Pinecone)를 활용해 정적 파일을 활성 지식으로 전환하는 파이프라인 예시입니다.

인제스트 워크플로

목표: 터치 없는 지식 관리. PDF를 Google Drive 폴더에 넣으면 임베딩이 자동 업데이트됩니다.

트리거

특정 폴더(예: “Tesla Earnings”)에서 File Created 이벤트를 모니터링하는 Google Drive 노드.

다운로드

파일 ID를 사용해 바이너리 데이터를 다운로드합니다.

파서 & 스플리터

  • Binary Data: 원시 PDF는 적절한 파일 유형으로 설정된 기본 데이터 로더 사용.
  • Markdown/JSON: 사전 처리된 데이터(예: LlamaParse를 통해 표 인식 향상)라면 n8n 데이터 로더를 “Binary”에서 “JSON” 모드로 전환합니다. 이 부분이 자주 실패합니다.

청킹

재무 보고서나 밀집된 기술 문서는 Recursive Character Text Splitter가 효과적입니다.
일반 설정: 청크 크기 ~800‑1000 토큰, 50 토큰 오버랩.

Upsert 및 네임스페이스 전략

벡터를 Pinecone의 특정 Namespace에 전송합니다. 모든 임베딩을 하나의 인덱스에 몰아넣지 말고 finance_q3, prompting_guides, hr_policy와 같은 네임스페이스를 사용하세요. 이렇게 하면 LLM이 서로 무관한 도메인을 혼동하는 컨텍스트 블리딩을 방지할 수 있습니다.

검색 연결

MCP 서버 측에 Pinecone Vector Store 도구를 추가하고, Retrieve Document 모드로 설정한 뒤 적절한 네임스페이스에 매핑합니다.

시니어 인사이트

API 기반 채팅 트리거(예: n8n의 기본 채팅 노드)로 접근하면 LLM 자체에 지속성이 없습니다. 워크플로에 Memory Node(Window Buffer 또는 Simple Memory)를 연결하지 않으면 봇이 핸드셰이크 직후 사용자의 이름을 바로 잊어버립니다. Claude Desktop을 통해 MCP를 사용할 경우, 클라이언트가 대화 기록을 관리하므로 서버‑사이드 메모리 노드는 불필요합니다.

범용 어댑터: 누락된 API 통합

n8n은 방대한 사전 구축 노드 라이브러리를 제공하지만, 그것만으로는 한계가 있습니다. 올바르게 래핑하면 모든 API가 MCP 도구가 됩니다.

HTTP Request 패턴

네이티브 노드(예: 날씨, 특정 검색)가 없을 때는 HTTP Request 노드를 사용합니다.

사례 연구: Weather API (GET)

실시간 날씨 정보를 제공:

  • Endpoint: http://api.weatherapi.com/v1/current.json
  • Auth: 제공자의 문서에 따라 API 키를 쿼리 파라미터 또는 헤더에 전달합니다.
  • Dynamic Parameters: 도시 쿼리(q)를 비워두거나 LLM이 사용자 프롬프트에서 채우는 동적 입력에 매핑합니다.

사례 연구: Tavily Search (POST)

일부 API는 복잡한 JSON 본문을 요구합니다. 이를 수동으로 재구성하면 오류가 발생하기 쉽습니다.

cURL 해크

API 문서에서 cURL 예제를 찾습니다. n8n에서는 Import cURL을 사용해 코드를 붙여넣으면 n8n이 자동으로 메서드, 헤더, 본문 구조를 채워줍니다. 정적 값을 AI가 관리하는 동적 표현식으로 교체해 정적인 스크립트 호출을 지능형 도구로 변환합니다.

네이티브를 넘어: 커뮤니티 노드 혁명

n8n의 기본 MCP 통합은 견고하지만 중요한 제한이 있습니다. 외부 표준 MCP 서버(예: GitHub에 호스팅된 Airbnb 서버)에서 도구를 동적으로 나열하고 실행하는 데 어려움을 겪으며, 각 도구를 일일이 정의해야 합니다.

List/Execute 패러다임

n8n‑nodes‑mcp 커뮤니티 노드는 도구 관리에 메타 레이어를 추가합니다.

  • MCP List Tool: 외부 MCP 서버에 연결해 사용 가능한 모든 기능의 JSON 스키마를 반환합니다. LLM에게 “내가 할 수 있는 모든 작업은 이것이다”라고 알려줍니다.
  • MCP Execute Tool: LLM이 행동을 결정하면 이 도구를 호출해 요청을 해당 외부 서비스로 전달합니다.

이 동적 접근 방식은 개별 기능을 미리 정의할 필요를 없애며, 이질적인 API들 간에 진정으로 확장 가능한 에이전시를 구현합니다.

Back to Blog

관련 글

더 보기 »