n8n으로 MCP 서버 만들기 — AI Agent와 무엇이 다른가
이 글과 연결된 글 보기
드래그로 이동 · 휠/두 손가락으로 확대 · 방향키로 글 선택 · 0으로 맞춤. 실선: 본문 링크, 점선: 시리즈·주제의 대표 연결.표시된 글 7편 목록
같은 캘린더 도구 6개를 두 가지 방식으로 열어볼 수 있습니다. 하나는 MCP Server Trigger에 연결해 Claude Desktop 같은 외부 MCP 클라이언트가 도구를 직접 호출하게 하는 방법이고, 다른 하나는 AI Agent 노드에 그대로 연결해 워크플로우 안에서 판단부터 실행까지 끝내는 방법입니다. 이 워크플로우는 두 캔버스를 나란히 만들어 둔 비교용 예제라, 직접 열어보면 n8n MCP 서버가 정확히 무엇을 대신해주는지, 그리고 언제 MCP로 노출하고 언제 Agent 안에 넣을지가 보입니다.
이 워크플로우 하나로 보여줄 수 있는 것
면접에서 "MCP 써보셨어요?"라는 질문을 받으면, 대부분 Claude나 Cursor 같은 클라이언트에서 남이 만든 MCP 서버에 접속해본 경험을 말합니다. 이 워크플로우는 그 반대편, 즉 내가 만든 워크플로우를 MCP 서버로 만들어본 경험을 보여줍니다.
캔버스 하나에 똑같은 도구 6개가 두 번 연결돼 있습니다. 위쪽은 MCP Server Trigger, 아래쪽은 AI Agent입니다. 이 구성에서 드러나는 역량은 세 가지입니다.
- MCP 서버로 노출하기 — n8n 워크플로우 자체를 외부 클라이언트가 호출할 수 있는 MCP 서버로 만들어본 경험
- AI Agent에 도구 직접 연결하기 — 채팅 트리거 하나로 판단과 실행이 워크플로우 안에서 완결되게 설계해본 경험
- 같은 도구를 두 방식으로 재사용하며 기준 세우기 — 같은 설정의 노드를 어느 쪽에 붙이든 똑같이 동작한다는 걸 직접 확인한 경험
세 번째가 이 워크플로우의 핵심입니다. n8n에서 어떤 노드를 AI가 쓸 수 있는 도구로 만드는 건 트리거 종류가 아니라 연결(ai_tool)과 파라미터 안의 $fromAI() 표현식입니다. 이 두 가지만 갖추면 그 노드는 MCP Server Trigger에도, Agent 노드에도 똑같이 붙일 수 있습니다.
배경 — 인프런 강의용으로 짠 비교 캔버스
이 워크플로우는 데이터팝콘 n8n 인스턴스에 인프런 강의 태그가 붙은 채로 남아 있습니다. 캔버스 맨 위 스티키 노트에는 "⬆️ MCP vs. ⬇️ AI Agent — 서로 비교해보세요"라는 메모가 적혀 있어서, 처음부터 두 방식을 나란히 놓고 비교하도록 설계했다는 걸 알 수 있습니다.
두 캔버스가 하는 일은 같습니다. 사용자가 회의 일정을 잡아 달라고 요청하면, 캘린더에 일정을 만들거나 조회·수정·삭제하고, 필요하면 웹 검색까지 하는 비서 역할입니다. 다른 건 그 요청이 어디서 오느냐입니다. 설치나 기본 노드 조작법은 n8n으로 반복업무 자동화 포트폴리오 만들기에서 이미 다뤘으니, 이 글에서는 MCP와 Agent의 차이에만 집중합니다.
구조 — Trigger / Task / Target
- Trigger — MCP 캔버스는 외부 MCP 클라이언트의 호출, Agent 캔버스는 채팅 메시지 수신
- Task — 두 캔버스 모두 같은 도구 6개(일정 생성 2종·조회·수정·삭제·웹 검색)를 씁니다. MCP 캔버스는 도구를 그대로 노출만 하고, Agent 캔버스는 Agent 노드가 그중 무엇을 언제 쓸지 판단합니다
- Target — MCP 캔버스는 호출한 클라이언트에게 도구 실행 결과를 돌려주고, Agent 캔버스는 채팅 응답으로 돌려줍니다
만들기
1. 도구 노드부터 — 캘린더 5개, 검색 1개
MCP든 Agent든 시작은 같습니다. 무엇을 시킬지부터 도구로 만들어야 합니다. 이 워크플로우는 Google Calendar 노드를 도구 모드로 다섯 번, SerpAPI 노드를 한 번 씁니다.
- 참석자 있는 일정 생성 — attendees와 summary를 채워 이벤트 생성
- 참석자 없는 일정 생성 — 혼자 쓰는 일정
- 일정 조회 — 기간을 지정해 getAll
- 일정 삭제 — eventId로 삭제
- 일정 수정 — eventId와 새 시작·종료 시각으로 업데이트
- 웹 검색(SerpAPI) — 캘린더 밖의 질문에 답할 때 쓰는 검색 도구. SerpApi는 2026년 8월 기준 월 250회까지 무료입니다(공식 가격)
파라미터는 실제 값 대신 $fromAI()로 채워져 있습니다. 참석자 있는 일정 생성 노드를 보면 이렇습니다.
"start": "={{ $fromAI(\"eventStart\") }}",
"end": "={{ $fromAI(\"eventEnd\") }}",
"additionalFields": {
"attendees": ["={{ $fromAI(\"eventAttendeeEmail\") }}"],
"summary": "={{ $fromAI(\"eventTitle\") }}"
}
$fromAI()는 이 필드의 값을 미리 정해두지 않고 실행 시점에 AI가 채워 넣는다는 뜻입니다. 괄호 안 문자열은 그 값에 붙는 이름표라, 도구를 호출하는 쪽(Agent의 언어모델이든, 외부 MCP 클라이언트든)이 이 이름을 보고 무엇을 채워야 하는지 판단합니다. 같은 설정의 노드가 MCP와 Agent 양쪽에서 똑같이 동작하는 이유가 여기 있습니다. 노드 자체는 누가 부르는지 모르고, ai_tool로 연결된 곳에서 값을 받아 실행할 뿐입니다. (실제로 이 워크플로우는 두 캔버스마다 도구를 따로 만들어 뒀는데, 그 이유와 부담은 뒤의 한계에서 다룹니다.)
2. MCP Server Trigger — 워크플로우를 서버로 열기
MCP Server Trigger 노드는 일반 트리거와 다르게 동작합니다. 이벤트를 받아 다음 노드로 데이터를 흘려보내는 대신, 도구 노드에만 연결되고 그 도구들을 호출 가능한 목록으로 클라이언트에 보여줍니다. 이 워크플로우에서는 Path를 MCP로 직접 지정했는데, 비워두면 n8n이 무작위 문자열로 자동 생성합니다.
도구 노드 6개를 ai_tool로 트리거에 연결하면 끝입니다. Agent 노드와 달리 언어모델도, 시스템 프롬프트도 필요 없습니다. 어떤 도구를 언제 쓸지 판단하는 몫이 이 워크플로우가 아니라 서버에 접속한 클라이언트(그리고 그 클라이언트가 쓰는 언어모델) 쪽으로 넘어가기 때문입니다.
노드 패널에는 Test URL과 Production URL이 따로 뜹니다. 개발 중에는 Test URL로 충분하지만, 실제로 클라이언트에 등록해서 쓰려면 워크플로우를 Active로 켜서 Production URL을 발급받아야 합니다.
3. AI Agent — 같은 도구를 안에서 판단하게
아래쪽 캔버스는 Chat Trigger로 시작합니다. 메시지가 오면 "Calendar Agent"라는 이름의 Agent 노드로 들어가고, 시스템 메시지에는 이렇게 적혀 있습니다.
# Overview
You are a calendar assistant. Your responsibilities include creating, getting, and deleting events in the user's calendar.
Calendar Management Tools
- Use "Create Event with Attendee" when an event includes a participant.
- Use "Create Event" for solo events.
- Use "Get Events" to fetch calendar schedules when requested.
- Use "Delete Event" to delete an event. You must use "Get Events" first to get the ID of the event to delete.
- Use "Update Event" to update an event. You must use "Get Events" first to get the ID of the event to update.
## Final Notes
Here is the current date/time: {{ $now }} (KST)
If a duration for an event isn't specified, assume it will be one hour.
마지막 두 줄이 실무적으로 눈여겨볼 부분입니다. 날짜를 하드코딩하는 대신 {{ $now }}로 현재 시각을 프롬프트에 매번 주입하고, 지속 시간이 빠졌을 때의 기본값(1시간)까지 시스템 메시지에 못 박아 뒀습니다. 언어모델이 "내일"이나 "다음 주 화요일" 같은 상대적 표현을 정확한 날짜로 바꾸려면 지금이 언제인지부터 알아야 하는데, 이 한 줄이 그 문제를 해결합니다.
같은 도구 6개가 이번에는 Agent 노드에 ai_tool로 바로 연결됩니다. 언어모델은 OpenRouter Chat Model 노드가 연결돼 있습니다. Agent 노드는 이 시스템 메시지와 사용자의 채팅을 언어모델에 넘겨, 어떤 도구를 어떤 순서로 부를지 그때그때 판단합니다. MCP 캔버스와 정확히 대칭되는 지점이 여기입니다. MCP 쪽은 판단을 클라이언트에게 맡기고, Agent 쪽은 판단을 워크플로우 안에 둡니다.
4. Claude Desktop 같은 MCP 클라이언트에 등록하기
MCP Server Trigger를 켠 것만으로는 아무 일도 일어나지 않습니다. 이 서버에 접속할 클라이언트를 따로 설정해야 합니다. 원본 캔버스의 스티키 노트에는 Claude 데스크톱 앱의 설정 > 개발자 메뉴에서 claude_desktop_config.json을 아래처럼 바꾸라는 안내가 남아 있습니다.
{
"mcpServers": {
"n8n": {
"command": "npx",
"args": ["-y", "supergateway", "--sse", "http://localhost:5678/mcp/MCP/sse"]
}
}
}
이 방법은 supergateway라는 별도 패키지로 SSE 연결을 중계하는 방식입니다. 다만 n8n 공식 문서를 2026년 8월 기준으로 확인해보면, 지금은 supergateway 대신 mcp-remote를 쓰는 방식을 안내합니다.
{
"mcpServers": {
"n8n": {
"command": "npx",
"args": ["mcp-remote", "<MCP_URL>", "--header", "Authorization: Bearer ${AUTH_TOKEN}"],
"env": { "AUTH_TOKEN": "<MCP_BEARER_TOKEN>" }
}
}
}
<MCP_URL>에는 2번에서 확인한 Production URL을 넣습니다. 공식 문서에 따르면 MCP Server Trigger는 Bearer Auth와 Header Auth 두 인증 방식을 지원하는데, 인증을 켰다면 여기서 발급받은 토큰을 <MCP_BEARER_TOKEN> 자리에 넣으면 됩니다. Claude 외의 MCP 클라이언트도 이 Production URL을 그대로 등록해서 씁니다(설정 파일 형식은 클라이언트마다 다를 수 있으니 각 클라이언트 문서를 확인하세요).
원본 캔버스에 남아 있는 흔적
두 가지가 눈에 띕니다.
첫째, Agent 캔버스 옆에 언어모델 노드가 두 개 더 떠 있습니다. OpenAI Chat Model과 DeepSeek Chat Model인데, 둘 다 어디에도 연결돼 있지 않습니다. 실제로 Agent에 물린 모델은 OpenRouter Chat Model 하나뿐입니다. 다른 모델로 먼저 테스트해보고 최종적으로 OpenRouter로 정리한 흔적으로 보이는데, 지워지지 않고 캔버스에 그대로 남아 있습니다.
둘째, 위에서 본 supergateway 방식은 이 워크플로우가 처음 만들어진 2025년 4월 무렵의 안내로 보입니다. 지금 공식 문서가 mcp-remote를 권장하는 걸 보면, MCP 클라이언트를 연결하는 방법도 이 프로토콜만큼이나 빠르게 바뀌고 있다는 뜻입니다. 캔버스에 적힌 방법을 그대로 따라 하기 전에, 공식 문서의 최신 버전을 한 번 더 확인하는 습관이 필요합니다.
한계
- 인증이 비어 있습니다 — 이 워크플로우의 MCP Server Trigger 노드에는 Path만 지정돼 있고 Bearer Auth나 Header Auth는 설정돼 있지 않습니다. 강의 데모라 넘어간 것으로 보이지만, URL만 아는 사람은 누구나 이 캘린더 도구를 호출할 수 있다는 뜻이기도 합니다. 실제로 쓰려면 반드시 인증을 켜야 합니다.
- 채팅 트리거도 공개 상태입니다 — Chat Trigger의 Public 옵션이 켜져 있어, 로그인 없이도 누구나 채팅 URL에 접근해 캘린더를 조작할 수 있습니다. 마찬가지로 데모용 설정이고, 운영에 쓰려면 접근 제한이 필요합니다.
- 도구를 두 번 관리해야 합니다 — 캔버스 두 개가 같은 도구 6개를 각각 따로 갖고 있습니다. 이름 끝에
1이 붙은 노드들이 그 흔적입니다. 캘린더 도구 하나를 고치면 두 캔버스 모두에서 고쳐야 합니다. 두 방식을 동시에 운영하려면 도구 정의를 한곳에 모아 서브워크플로우로 공유하는 편이 낫습니다.
포트폴리오·면접 포인트
포트폴리오에는 이 워크플로우를 그대로 옮기기보다, 이미 만들어 둔 다른 워크플로우 하나를 MCP Server Trigger로 열어 Claude Desktop에서 실제로 호출해보는 쪽을 권합니다. 어떤 워크플로우든 ai_tool로 연결할 수 있는 노드가 있다면 그대로 MCP 서버가 됩니다.
면접에서 "MCP와 AI Agent 중 언제 뭘 쓰나요?"라는 질문에는 이렇게 답할 수 있습니다. 워크플로우 하나에서만 판단이 끝나면 Agent 노드에 도구를 직접 넣고, Claude Desktop이나 다른 워크플로우처럼 여러 클라이언트가 같은 도구를 재사용해야 하면 MCP로 노출합니다. 재사용 범위가 기준이라는 걸 실제로 만들어보고 답하는 것과, 개념만 아는 것의 차이는 면접관도 바로 알아봅니다.
다음 액션
이 시리즈에는 Supabase에 쌓은 문서로 답하는 RAG 챗봇 편도 있고, 구내식당 식단표를 분석하는 편도 있습니다. 식단 분석 편의 캔버스에도 MCP Server Trigger가 곁가지로 붙어 있는데, 그 편에서는 자세히 다루지 않고 이 편으로 넘겨 뒀습니다. 이번 글이 그 갈림길에 대한 답입니다.
다음 편은 iOS 단축어로 시리에게 말을 걸면 응급실 병상 현황을 알려주는 음성 에이전트입니다. 지금까지 채팅이나 폼으로 받던 입력이 음성으로 바뀌지만, 뒤에서 도구를 판단하고 실행하는 구조는 이 편의 Agent 캔버스와 같습니다.
