{"slug": "make-com-has-an-mcp-endpoint-now-the-auth-token-goes-in-the-url-and-3-other-the", "title": "Make.com has an MCP endpoint now. The auth token goes in the URL — and 3 other walls the docs skip", "summary": "A developer connecting an AI agent to Make.com's API encountered four undocumented issues: Cloudflare blocking Python's default User-Agent, scenarios being scoped to teams rather than organizations, unescaped newline characters in JSON blueprints requiring strict=False parsing, and the MCP endpoint requiring the auth token in the URL path instead of a header.", "body_md": "I already let my AI agent read and repair my self-hosted n8n workflows. So when a client's Make.com scenario started misfiring — duplicate WhatsApp order notifications, fired in bursts — my first instinct wasn't to log into the web UI. It was: *can I give the agent the same remote access to Make that it has to n8n?*\n\nMake.com shipped both a REST API and an MCP endpoint. So yes. But getting from \"they have an API\" to \"my agent is connected and patching a live scenario blueprint\" meant walking into four undocumented walls. Here they are, in the order they hit me.\n\nMy first call was a throwaway Python script — `urllib.request`\n\nto `GET /api/v2/users/me`\n\n. It came back **403**.\n\nNot 401 (bad auth). 403. The token was fine. The request never reached Make's application layer — Cloudflare's WAF bounced it on the User-Agent. The default `Python-urllib/3.x`\n\nUA is on a block list.\n\nThe fix is unglamorous: use `curl`\n\n(whose UA sails through) and pipe the body into Python only for parsing.\n\n```\nT=$(security find-generic-password -s make-api-token -a \"$USER\" -w)\ncurl -s -H \"Authorization: Token $T\" \\\n  \"https://eu2.make.com/api/v2/users/me\" | python3 -m json.tool\n```\n\nTwo things worth noting even in this tiny snippet:\n\n`Authorization: Token <token>`\n\n— `Bearer`\n\n. (Hold that thought; it comes back.)The object hierarchy is Organization → Team → Scenario. Natural assumption: list scenarios by the org you're in.\n\n```\nGET /api/v2/scenarios?organizationId=<org>   → not what you want\nGET /api/v2/scenarios?teamId=<team>          → ✅\n```\n\n`/scenarios`\n\nis scoped to a **team**, not an organization. So the real discovery sequence is:\n\n```\nGET /organizations\nGET /teams?organizationId=<org>\nGET /scenarios?teamId=<team>\n```\n\nSkip the middle call and you'll spend ten minutes convinced your token lacks scope, when it's just keyed on the wrong ID.\n\nThe whole point was to *fix* the scenario, and on Make the editable definition is the blueprint:\n\n```\nGET   /api/v2/scenarios/{id}/blueprint     # read it\nPATCH /api/v2/scenarios/{id}               # write it back, blueprint as a JSON string\n```\n\nI pulled the blueprint, piped it through `jq`\n\n, and got a parse error. The JSON was, by the spec, invalid.\n\nThe cause: the scenario sends Hebrew WhatsApp messages, and the message templates contain **raw, unescaped newline characters** inside string values. Strict JSON forbids literal control characters in strings; Make emits them anyway.\n\n`jq`\n\nrefuses. So does Python's default `json.loads`\n\n. The escape hatch is one keyword:\n\n``` python\nimport json, sys\nblueprint = json.loads(sys.stdin.read(), strict=False)  # tolerate raw control chars\n```\n\n`strict=False`\n\ntells the parser to accept the control characters instead of throwing. Once it's a Python object you can edit the module you care about, re-serialize, and PATCH it back as a string.\n\nThis was the one that cost me the most time, because everything *looked* right.\n\nMake exposes an MCP server. I added it to my agent the way I add every other remote MCP — URL plus an `Authorization: Bearer`\n\nheader. **404.** Not 401. 404, as if the endpoint didn't exist.\n\nIt doesn't — not at the path I was using. The Make MCP doesn't authenticate via header at all. The token goes **in the URL path**:\n\n```\nhttps://eu2.make.com/mcp/u/<token>/stateless\n```\n\nHeader auth on `/mcp`\n\n: 404. Token baked into the path on `/mcp/u/<token>/stateless`\n\n: 200, connected.\n\nThat's an awkward shape if you care about not pasting secrets into config files — a URL with a live token in it is exactly the kind of string that ends up committed. The way out is to assemble the URL at launch time from the Keychain, so the token is never written to disk:\n\n```\n// MCP server entry\n{\n  \"command\": \"bash\",\n  \"args\": [\n    \"-c\",\n    \"exec mcp-remote \\\"https://eu2.make.com/mcp/u/$(security find-generic-password -s make-api-token -a $USER -w)/stateless\\\"\"\n  ]\n}\n```\n\n`mcp-remote`\n\nbridges the streamable HTTP endpoint to a local stdio MCP server. The `$(...)`\n\nruns every launch, so the config on disk contains a Keychain lookup, never the token itself. Same pattern I use for other path-token services.\n\nFour walls — a WAF User-Agent block, a team-vs-org ID, control characters in \"valid\" JSON, and path-based MCP auth — and on the other side the agent can do, remotely and unattended, what used to mean opening the Make UI and clicking through a scenario by hand: list orgs and teams, pull a misbehaving scenario's blueprint, diff it, and PATCH the fix.\n\nNone of these are in the quickstart. All four are the difference between \"they have an API\" and \"it actually works.\" If you're wiring an AI agent into Make.com, start with `curl`\n\n(not your HTTP library), scope `/scenarios`\n\nby team, parse blueprints with `strict=False`\n\n, and put the MCP token in the path.\n\n*I build WhatsApp bots and business automation for companies — self-hosted n8n, Make.com, WAHA, the works. More war stories and guides at Achiya Automation.*", "url": "https://wpnews.pro/news/make-com-has-an-mcp-endpoint-now-the-auth-token-goes-in-the-url-and-3-other-the", "canonical_source": "https://dev.to/achiya-automation/makecom-has-an-mcp-endpoint-now-the-auth-token-goes-in-the-url-and-3-other-walls-the-docs-skip-1el2", "published_at": "2026-06-14 16:26:58+00:00", "updated_at": "2026-06-14 16:40:38.996803+00:00", "lang": "en", "topics": ["developer-tools", "ai-agents"], "entities": ["Make.com", "Cloudflare", "n8n", "Python", "jq", "MCP", "Keychain"], "alternates": {"html": "https://wpnews.pro/news/make-com-has-an-mcp-endpoint-now-the-auth-token-goes-in-the-url-and-3-other-the", "markdown": "https://wpnews.pro/news/make-com-has-an-mcp-endpoint-now-the-auth-token-goes-in-the-url-and-3-other-the.md", "text": "https://wpnews.pro/news/make-com-has-an-mcp-endpoint-now-the-auth-token-goes-in-the-url-and-3-other-the.txt", "jsonld": "https://wpnews.pro/news/make-com-has-an-mcp-endpoint-now-the-auth-token-goes-in-the-url-and-3-other-the.jsonld"}}