The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Google Tag Manager MCP Server listing page.
An interface to the Google Tag Manager API over MCP, in two flavours: a hosted server with Google OAuth built in, and a local CLI that runs on your own credentials.
npm workspace with one app and two published packages:
| Path | Package | What it is |
|---|---|---|
apps/worker | (private) | The hosted Cloudflare Worker at gtm-mcp.stape.ai: Google OAuth, the approval flow, the public pages, session removal. |
packages/cli | google-tag-manager-mcp-server | The npm package: a local MCP server over stdio, authenticating with credentials you supply. |
packages/core | google-tag-manager-mcp-core | Every GTM tool and schema, independent of how credentials are obtained. |
Tools reach Google through a GtmAuthProvider (getAccessToken(): Promise<string>) rather than through any particular session, which is what lets the same tool set back both servers — and a private one with your own auth. See the core package README.
This server comes in two flavours: Hosted server and Local CLI. Both give you the same 18 GTM tools; the difference is who handles Google auth.
| Hosted server | Local CLI | |
|---|---|---|
| Auth | Google OAuth in your browser, handled for you | You supply a service account key, refresh token, or access token |
| Data | Passes through gtm-mcp.stape.ai | Only ever leaves your machine |
| Setup | None | Set one environment variable |
If you're a contributor testing an unreleased change rather than just using the tools, skip everything below and see Test your changes locally instead.
Pick your client below. The hosted server needs the mcp-remote bridge on clients whose MCP support doesn't complete Google's OAuth flow natively; where a client does that itself, it connects straight to https://gtm-mcp.stape.ai/mcp.
Hosted server — Claude Desktop connects to remote HTTP MCP servers natively, no bridge needed. Go to Settings → Connectors → Add custom connector, set the name to gtm-mcp-server and the URL to https://gtm-mcp.stape.ai/mcp, then save. Click the new connector to complete the Google OAuth flow in the browser window that opens.
mcp-remoteis also possible for the hosted server, for anyone who'd rather configure it through the JSON config file (Settings -> Developer -> Edit Config) instead of the Connectors UI — less recommended, but still supported:
Local CLI — no OAuth flow, no data through anyone else's server, you supply a service account key or a refresh token. Open Settings -> Developer -> Edit Config and add:
See the CLI README for every credential option.
Claude Code speaks HTTP directly, including the OAuth handshake, so the hosted server needs no bridge.
Hosted server:
A browser window opens for the Google OAuth flow the first time a tool is used. Run /mcp inside Claude Code to confirm it connected.
Local CLI:
Both write into .mcp.json / your Claude Code MCP config.
VS Code's MCP client supports HTTP servers and their OAuth flow natively, no mcp-remote needed. Add this to .vscode/mcp.json:
Hosted server:
Local CLI:
GitHub Copilot Chat in VS Code uses VS Code's own MCP client, so it reads the same .vscode/mcp.json file — see VS Code above. No separate configuration is needed.
Copilot CLI also completes OAuth natively for remote HTTP servers. Add this to ~/.copilot/mcp-config.json:
Hosted server:
Local CLI:
See GitHub's docs for the equivalent copilot mcp add subcommand.
Cursor speaks HTTP directly too, no mcp-remote needed. Add this to .cursor/mcp.json (project-level) or ~/.cursor/mcp.json (global — Settings → MCP → Add new global MCP server):
Hosted server:
A browser window opens for the Google OAuth flow the first time a tool is used.
Local CLI:
Antigravity's own OAuth support for remote HTTP servers doesn't reliably reach a token to the server yet (antigravity-cli#25), so use mcp-remote for the hosted server here too. Add this to ~/.gemini/config/mcp_config.json (global) or .agents/mcp_config.json (workspace-local) — accessible from the editor's agent panel via … → MCP Servers → Manage MCP Servers → View raw config:
Hosted server:
Local CLI:
https://gtm-mcp.stape.ai/mcp.ChatGPT only reaches servers over the public internet, it can't spawn a local process — so there's no Local CLI option here, only the hosted server.
Any other MCP-compatible client that expects a stdio-style command/args config can use the same mcp-remote block for the hosted server:
Or the local CLI directly, with your credentials:
MCP Server Name Length Limit
Some MCP clients (like Cursor AI) have a 60-character limit for the combined MCP server name + tool name length. If you use a longer server name in your configuration (e.g., gtm-mcp-server-your-additional-long-name), some tools may be filtered out.
To avoid this issue:
gtm-mcp-server)Clearing MCP Cache
If you're connecting through mcp-remote (Antigravity, or Claude Desktop configured that way), it stores all the credential information inside ~/.mcp-auth (or wherever your MCP_REMOTE_CONFIG_DIR points to). If you're having persistent issues, try running:
Then, restart your MCP client.
Which workflow you need depends on what you changed. Most changes are in the first category — reach for the second only if you're touching the Worker itself.
packages/core or packages/cliThis is the tool logic itself (schemas, GTM API calls, error handling) — almost everything you'd fix or add lives here. You don't need a Google Cloud OAuth client or any Worker setup: build from source and run the CLI directly with credentials you already have.
Point your MCP client at the local build instead of npx — same credential
options as the Claude Desktop Local CLI example above, an access
token from the OAuth Playground is
the fastest way to test a single change:
See the CLI README for every credential option.
apps/workerOnly needed for the hosted server's own code: the OAuth flow, routing, session
handling, the approval and status pages. This runs that code on your own machine
against your own Google Cloud OAuth credentials instead of gtm-mcp.stape.ai.
http://localhost:8788/callback. (You can leave Authorized JavaScript origins empty — this flow is server-side only, no browser JS calls Google directly.)Copy the example file and fill in the values from the previous step:
.dev.vars is git-ignored — it's only used locally and never committed.
npm run build compiles the core package the Worker bundles against; npm run dev starts the Worker on http://localhost:8788.
Claude Desktop's Custom Connectors need a publicly reachable URL, so mcp-remote is the only option for pointing at localhost:
Restart Claude Desktop. A browser window will open for the Google OAuth flow; log in with the account you added as a test user in step 1.
Note: if you've previously connected to the hosted server (or switch back and forth between local and hosted), clear mcp-remote's cache first (see Troubleshooting above) and fully restart your MCP client, otherwise it may reuse a stale/cached connection.
Versions and changelogs are managed with Changesets. Along with a change that should ship, add:
On merge to main the release workflow opens a "Version Packages" PR; merging that PR publishes to npm, core first and then the CLI that depends on it. The Worker is private and never published — it deploys from main on every push.
Pull requests run all of the above plus a Worker bundle check, and flag changes to a published package that arrive without a changeset.
Both @modelcontextprotocol/sdk and agents are pinned to exact versions in apps/worker. The SDK identifies tool schemas with instanceof, so the whole workspace has to resolve a single copy, and agents releases pin the SDK version they were built against. Bump them together and deploy deliberately.
The MCP Server for Google Tag Manager is developed and maintained by Stape Team under the Apache 2.0 license.