본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 15. 10:38

Make.com에 MCP 엔드포인트가 추가되었습니다. 인증 토큰은 URL에 포함되며, 문서에서 누락된 3가지 장벽들

요약

Make.com이 REST API와 MCP 엔드포인트를 출시함에 따라, AI 에이전트를 통한 시나리오 제어가 가능해졌습니다. 하지만 실제 구현 과정에서 Cloudflare WAF 차단, 잘못된 ID 계층 구조 사용 등 문서에 명시되지 않은 기술적 장벽들이 존재합니다.

핵심 포인트

  • Make.com API 호출 시 Python 기본 User-Agent는 Cloudflare에 의해 차단될 수 있음
  • 인증 방식은 Bearer가 아닌 'Authorization: Token <token>' 형식을 사용함
  • 시나리오 목록 조회 시 organizationId가 아닌 teamId를 사용해야 함
  • 보안을 위해 API 토큰은 셸 히스토리에 남지 않도록 Keychain 등을 활용해야 함

저는 이미 제 AI 에이전트가 제가 셀프 호스팅(self-hosted)하는 n8n 워크플로우를 읽고 수정할 수 있도록 설정해 두었습니다. 그래서 고객의 Make.com 시나리오가 오작동하기 시작했을 때 — WhatsApp 주문 알림이 중복으로 발송되거나 폭발적으로 발생하는 등의 문제 — 저의 첫 번째 본능은 웹 UI에 로그인하는 것이 아니었습니다. 대신 다음과 같은 생각이 들었습니다: 내 에이전트에게 n8n에 부여했던 것과 동일한 Make 원격 액세스 권한을 줄 수 있을까?

Make.com은 REST API와 MCP 엔드포인트를 모두 출시했습니다. 따라서 가능합니다. 하지만 "API가 있다"는 사실에서 "내 에이전트가 연결되어 실행 중인 시나리오 블루프린트(blueprint)를 패치한다"는 단계로 나아가는 과정은 문서화되지 않은 네 가지 장벽을 마주해야 함을 의미했습니다. 제가 마주친 순서대로 그 장벽들을 소개합니다.

장벽 1: API가 Cloudflare 뒤에 있으며, 당신의 User-Agent를 거부합니다

저의 첫 번째 호출은 간단한 Python 스크립트였습니다 — urllib.request를 사용하여 GET /api/v2/users/me를 호출했습니다. 결과는 403이었습니다.

401(인증 오류)이 아니었습니다. 403이었습니다. 토큰은 문제가 없었습니다. 요청이 Make의 애플리케이션 계층에 도달하기도 전에, Cloudflare의 WAF(Web Application Firewall)가 User-Agent를 근거로 요청을 튕겨냈습니다. 기본 Python-urllib/3.x UA(User-Agent)는 차단 목록(block list)에 올라와 있습니다.

해결 방법은 별로 멋지지는 않습니다: curl(UA가 통과되는)을 사용하고, 파싱을 위해서만 본문(body)을 Python으로 파이프(pipe)하는 것입니다.

T=$(security find-generic-password -s make-api-token -a "$USER" -w)
curl -s -H "Authorization: Token $T" \
  "https://eu2.make.com/api/v2/users/me" | python3 -m json.tool

이 작은 코드 조각에서도 주목할 만한 두 가지 사항이 있습니다:

  • 인증은 Authorization: Token <token> 형식을 사용합니다 — Bearer아닙니다. (이 점을 기억해 두세요. 나중에 다시 언급됩니다.)
  • 토큰은 절대 직접 타이핑하거나 출력(echo)하지 않습니다. 토큰은 macOS Keychain에 저장되어 호출 시점에 읽어옵니다. 셸 히스토리(shell history)에 남는 비밀 정보는 이미 유출된 비밀 정보나 다름없습니다.

장벽 2: 시나리오 목록을 불러오려면 organizationId가 아닌 teamId가 필요합니다

객체 계층 구조는 Organization(조직) → Team(팀) → Scenario(시나리오) 순입니다. 자연스러운 가정은 자신이 속한 조직(org)을 기준으로 시나리오를 나열하는 것입니다.

GET /api/v2/scenarios?organizationId=<org>   → 원하는 결과가 아님
GET /api/v2/scenarios?teamId=<team>          → ✅

/scenarios는 조직이 아닌 팀(team) 단위로 범위(scope)가 지정되어 있습니다. 따라서 실제 탐색 순서는 다음과 같습니다:

GET /organizations
GET /teams?organizationId=<org>
GET /scenarios?teamId=<team>

중간 호출 단계를 건너뛰면, 토큰에 권한 범위 (scope)가 부족하다고 10분 동안 확신하며 시간을 허비하게 될 것입니다. 사실은 단지 잘못된 ID를 키(key)로 사용했을 뿐인데 말이죠.

장벽 3: 블루프린트 (blueprint) JSON 파싱 실패 — 당신의 코드 문제가 아닙니다

핵심 목적은 시나리오 (scenario)를 '수정'하는 것이었고, Make에서 편집 가능한 정의는 블루프린트 (blueprint)입니다:

GET   /api/v2/scenarios/{id}/blueprint     # 읽기
PATCH /api/v2/scenarios/{id}               # 블루프린트를 JSON 문자열로 다시 쓰기

블루프린트를 가져와 jq로 전달했더니 파싱 에러 (parse error)가 발생했습니다. 스펙 (spec)에 따르면 해당 JSON은 유효하지 않았습니다.

원인은 이렇습니다: 해당 시나리오는 히브리어 WhatsApp 메시지를 전송하는데, 메시지 템플릿 내의 문자열 값 안에 **이스케이프 처리되지 않은 생(raw) 줄바꿈 문자 (newline characters)**가 포함되어 있었습니다. 엄격한 JSON 규격은 문자열 내의 리터럴 제어 문자 (literal control characters)를 금지하지만, Make는 이를 그대로 내보냅니다.

jq는 이를 거부합니다. Python의 기본 json.loads 역시 마찬가지입니다. 탈출구는 단 하나의 키워드뿐입니다:

import json, sys
blueprint = json.loads(sys.stdin.read(), strict=False)  # 생 제어 문자를 허용함

strict=False는 파서 (parser)에게 에러를 던지는 대신 제어 문자를 수용하도록 지시합니다. 일단 Python 객체로 변환되면 원하는 모듈을 편집하고, 다시 직렬화 (re-serialize)하여 문자열 형태로 PATCH 요청을 보낼 수 있습니다.

장벽 4: Bearer 헤더 사용 시 MCP 엔드포인트 404 에러

이것이 저의 시간을 가장 많이 뺏은 문제였습니다. 왜냐하면 모든 것이 '맞아 보였기' 때문입니다.

Make는 MCP 서버를 노출합니다. 저는 다른 모든 원격 MCP를 추가할 때와 마찬가지로 URL과 Authorization: Bearer 헤더를 에이전트 (agent)에 추가했습니다. 결과는 404였습니다. 401 (권한 없음)이 아니라, 마치 엔드포인트가 존재하지 않는 듯한 404 에러가 떴습니다.

실제로 존재하지 않았습니다 — 제가 사용하던 경로에는 말이죠. Make MCP는 헤더를 통해 인증을 수행하지 않습니다. 토큰은 URL 경로 안에 포함되어야 합니다:

[IMG:1]

/mcp 경로에 헤더 인증을 시도하면: 404. /mcp/u/<token>/stateless 경로에 토큰을 경로에 박아 넣으면: 200, 연결 성공.

설정 파일에 비밀 정보(secrets)를 붙여넣지 않는 것을 중요하게 생각한다면 이는 매우 난처한 형태입니다. 활성 토큰이 포함된 URL은 실수로 커밋(commit)되기 딱 좋은 종류의 문자열이기 때문입니다. 해결 방법은 실행 시점에 Keychain(키체인)에서 URL을 조립하여 토큰이 디스크에 절대 기록되지 않도록 하는 것입니다:

// MCP 서버 엔트리
{
  "command": "bash",
...

mcp-remote는 스트리밍 가능한 HTTP 엔드포인트를 로컬 stdio MCP 서버로 연결(bridge)합니다. $(...)는 실행될 때마다 구동되므로, 디스크의 설정 파일에는 Keychain 조회 명령만 포함될 뿐 토큰 자체가 포함되지는 않습니다. 이는 제가 다른 경로 기반 토큰 서비스(path-token services)에서 사용하는 것과 동일한 패턴입니다.

결실 (The payoff)

네 가지 장벽 — WAF User-Agent 차단, 팀 대 조직(team-vs-org) ID, "유효한" JSON 내의 제어 문자(control characters), 그리고 경로 기반 MCP 인증 — 을 넘어서면, 에이전트는 과거에 Make UI를 열고 시나리오를 일일이 수동으로 클릭해야 했던 작업들을 원격으로, 그리고 무인(unattended) 상태로 수행할 수 있습니다. 즉, 조직과 팀 목록을 나열하고, 오작동하는 시나리오의 블루프린트(blueprint)를 가져와서, 이를 비교(diff)한 뒤, 수정 사항을 PATCH로 적용하는 작업입니다.

이 중 어느 것도 퀵스타트(quickstart) 가이드에는 나와 있지 않습니다. 이 네 가지가 바로 "API가 있다"와 "실제로 작동한다" 사이의 차이를 만드는 요소입니다. 만약 Make.com에 AI 에이전트를 연결하고 있다면, (사용 중인 HTTP 라이브러리가 아닌) curl로 시작하고, 팀 단위로 /scenarios 범위를 지정하며, strict=False로 블루프린트를 파싱하고, MCP 토큰을 경로에 넣으십시오.

저는 기업들을 위해 WhatsApp 봇과 비즈니스 자동화(self-hosted n8n, Make.com, WAHA 등 포함)를 구축합니다. 더 많은 실전 사례와 가이드는 Achiya Automation에서 확인하실 수 있습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0