{"id":17821,"date":"2026-09-13T09:20:00","date_gmt":"2026-09-13T07:20:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=17821"},"modified":"2026-10-25T21:26:28","modified_gmt":"2026-10-25T20:26:28","slug":"connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/","title":{"rendered":"Connecting Claude Code to Google Tag Manager: Three MCP Integrations and Their Limits"},"content":{"rendered":"<p>An AI assistant can prepare a Google Tag Manager tag for completed purchases. The integration needs access to the correct container. A container groups tags, triggers and variables; a JSON export describes those settings as text. Access rights matter more than the number of available tools.<\/p>\n<p>This comparison covers three MCP packages. MCP is a protocol through which an assistant can call tools. The original measurement dated 9 September 2026 reports tool counts and response sizes for specific package versions. The original raw logs are unavailable for this review. Those figures remain labelled as historical reports; current API rules and package source code were checked separately.<\/p>\n<figure class=\"lw-diagram\"><img decoding=\"async\" src=\"\/blog\/wp-content\/uploads\/diagrams\/gtmintegrations-reviewed-17821-en-20261025.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"Google scopes, account permissions and Claude Code rules check different parts of access. Tool-list size does not directly measure context use.\"><figcaption>Google scopes, account permissions and Claude Code rules check different parts of access. Tool-list size does not directly measure context use.<\/figcaption><\/figure>\n<h2>Tools, direct API calls and skills<\/h2>\n<p>An MCP server might offer a tool for reading a tag. Claude Code sends the arguments, the server calls the Tag Manager API, and the result comes back. A local server can communicate through its process input and output, called <code>stdio<\/code>; a remote server can use HTTP.<\/p>\n<p>A direct <code>curl<\/code> request needs no MCP server. The API address, access token and data format still need to be correct. Instructions and results consume context through this route too. An access token is a time-limited credential; its OAuth scopes specify the requested kinds of access.<\/p>\n<p>A skill can include instructions, checks and helper scripts. Claude Code skill settings can also pre-approve tool calls. A skill does not create missing Google permissions. The actual tools, credentials and account permissions still determine the available access.<\/p>\n<h2>What the historical sizes mean<\/h2>\n<table>\n<caption>Historical figures from 9 September 2026; raw logs not available for this review.<\/caption>\n<thead>\n<tr>\n<th>Package version<\/th>\n<th>Reported tools<\/th>\n<th>Reported tools\/list bytes<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>google-tag-manager-mcp-server 5.1.1<\/code><\/td>\n<td>18<\/td>\n<td>108201<\/td>\n<\/tr>\n<tr>\n<td><code>gtm-mcp 1.0.0<\/code><\/td>\n<td>104<\/td>\n<td>49656<\/td>\n<\/tr>\n<tr>\n<td><code>@theethosteam\/gtm-mcp 1.1.1<\/code><\/td>\n<td>33<\/td>\n<td>19797<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The byte figures describe the originally reported <code>tools\/list<\/code> response: the descriptions of all offered tools. A definition includes its name, description and input fields. A few tools can therefore require more text than many small tools.<\/p>\n<p>The original comparison describes the first server as a collection of tools by entity type: <code>gtm_tag<\/code>, for example, combines reading and editing through an <code>action<\/code> parameter. The second separates substantially more API calls into individual tools. The checked third package source confirms task recipes and <code>gtm_raw<\/code> for direct API methods.<\/p>\n<p>The earlier figures of roughly 27,000, 12,400 and 4,900 tokens are only rough estimates from byte size, not measurements with a particular model\u2019s tokenizer. Tokens are the text units processed by a model. JSON formatting, character encoding and the tokenizer affect the result.<\/p>\n<p>Claude Code can now use tool search to load MCP definitions when needed. Not every complete definition therefore enters every model request automatically. Settings, client version and platform determine the actual behavior. A 108,201-byte tool list establishes neither a fixed context footprint nor a fixed price per turn.<\/p>\n<p>Prompt caching can reduce the price of repeated inputs that have already been loaded. A cache hit does not reduce the number of context tokens processed. Hits, cache-writing costs and savings depend on the model, request and cache configuration. Actual usage figures are more useful for cost comparisons than byte estimates.<\/p>\n<h2>Drafts and publication<\/h2>\n<p>The public API description retrieved on 25 October 2026 has revision <code>20261021<\/code>. The document contains 270,858 bytes and 106 methods: 38 GET, 38 POST, 15 PUT and 15 DELETE. This counts API methods, not an MCP server\u2019s tools.<\/p>\n<p>A workspace is a draft inside a container. Editing its tag configuration does not automatically replace the published default version. Typically, <code>workspaces.create_version<\/code> first creates a version, and <code>versions.publish<\/code> publishes one. Preview and custom environments require separate consideration.<\/p>\n<p>This workflow does not make other API permissions harmless. Deleting containers, changing user permissions and editing environments are not merely tag drafts. Exactly two methods use the <code>tagmanager.publish<\/code> scope in the checked discovery document. This does not mean every other method lacks consequences for a running system.<\/p>\n<h2>Reading workspace tags and the published version<\/h2>\n<p>Listing a workspace\u2019s tags requires its ID. The published version can instead be read through <code>versions:live<\/code>; that response also contains the version\u2019s tags. The following example only reads data. IDs and token stand for values from an authorized setup.<\/p>\n<pre><code class=\"language-bash\"># Example IDs; TOKEN must contain an authorized access token.\nACC=6012345678\nCONT=123456789\nWS=42\n: &quot;${TOKEN:?Access token required}&quot;\n\n# Draft tags in one workspace\ncurl --silent --show-error --fail-with-body \\\n  --connect-timeout 10 --max-time 30 \\\n  -H &quot;Authorization: Bearer $TOKEN&quot; \\\n  &quot;https:\/\/tagmanager.googleapis.com\/tagmanager\/v2\/accounts\/$ACC\/containers\/$CONT\/workspaces\/$WS\/tags&quot;\n\n# Published version, including its tags; no workspace ID\ncurl --silent --show-error --fail-with-body \\\n  --connect-timeout 10 --max-time 30 \\\n  -H &quot;Authorization: Bearer $TOKEN&quot; \\\n  &quot;https:\/\/tagmanager.googleapis.com\/tagmanager\/v2\/accounts\/$ACC\/containers\/$CONT\/versions:live&quot;\n<\/code><\/pre>\n<p>A missing or expired token and insufficient permissions can produce different errors. One error message is not a guarantee for every API method. <code>--fail-with-body<\/code> exposes HTTP errors through the exit code while retaining the response body; it requires a suitable curl version.<\/p>\n<h2>Three checks on access<\/h2>\n<p>First, the access token needs the required OAuth scope. Second, the associated Google account needs the appropriate Tag Manager permissions. A publishing scope alone does not grant publishing access to an account without that permission. Both checks apply outside Claude Code too.<\/p>\n<p>Third, Claude Code can block particular tool calls or request approval. A rule for <code>mcp__gtm__gtm_version<\/code> applies to that tool. A <code>PreToolUse<\/code> hook can also inspect input fields such as <code>action<\/code>. A hook is a script that returns a decision before the call.<\/p>\n<p>A tool-name rule does not control a separate <code>curl<\/code> call. If the same credentials are accessible through the shell, Google scopes and account permissions still apply there, but that MCP name rule does not. An unrestricted raw-call tool can also substitute for blocked specialized tools. All reachable routes need to be considered together.<\/p>\n<h2>GTM_SCOPES does not affect every authentication mode<\/h2>\n<p>The checked CLI version <code>google-tag-manager-mcp-server@5.1.1<\/code> uses a version range for its core package starting at 2.1.1. In the specifically inspected core 2.1.1, <code>GTM_SCOPES<\/code> reaches token generation only for service-account authentication. Without an explicit selection, seven Tag Manager scopes are requested.<\/p>\n<p>In the refresh-token or access-token branch, the same environment variable does not change existing permissions. Restriction requires a Google credential with the intended scope. The configuration below illustrates only the service-account variant. The key is a placeholder; real keys do not belong in a public repository.<\/p>\n<p>In this configuration, Claude Code expands <code>${GTM_SERVICE_ACCOUNT_KEY}<\/code> from its environment. The value must be the complete service-account key JSON, not a path to a file. The account also needs the appropriate Tag Manager access.<\/p>\n<pre><code class=\"language-json\">{\n  &quot;mcpServers&quot;: {\n    &quot;gtm&quot;: {\n      &quot;command&quot;: &quot;npx&quot;,\n      &quot;args&quot;: [\n        &quot;-y&quot;,\n        &quot;google-tag-manager-mcp-server@5.1.1&quot;\n      ],\n      &quot;env&quot;: {\n        &quot;GOOGLE_SERVICE_ACCOUNT_KEY&quot;: &quot;${GTM_SERVICE_ACCOUNT_KEY}&quot;,\n        &quot;GTM_SCOPES&quot;: &quot;https:\/\/www.googleapis.com\/auth\/tagmanager.readonly&quot;\n      }\n    }\n  }\n}<\/code><\/pre>\n<p>A fixed CLI version makes the comparison easier to reproduce, but does not automatically fix every dependency version. Exact reproduction also requires a recorded dependency resolution. The different MCP packages additionally use different credential names and authentication procedures.<\/p>\n<h2>Changes without accidental data loss<\/h2>\n<p>An update starts by reading the current object. The intended field is then changed and the complete object required by that method is sent. A PUT request is not automatically a partial addition. The particular method and server determine which fields may be omitted.<\/p>\n<p>A <code>fingerprint<\/code> identifies the object state that was read. The API makes this check optional for <code>tags.update<\/code>. If the previous fingerprint is supplied after the stored value has changed, the values no longer match. Without supplying it, that protection is absent. A matching fingerprint still does not prove that a tag configuration is logically correct.<\/p>\n<p>Tag parameters can contain lists and nested objects. A measurement ID, variable reference and tag reference are different values. A current export of the correct tag type is therefore a better starting point than an arbitrary GA4 JSON example. Referenced variables and triggers must also exist in the target container.<\/p>\n<h2>Browser checks and change descriptions<\/h2>\n<p><code>quick_preview<\/code> creates a preview version. The call does not open a website or prove that a purchase event arrives at the right time. Browser checks need to cover triggers, data-layer values and consent states. An additional browser integration can help, but an API call alone does not perform those checks.<\/p>\n<p>A version name and description can record the reason for a change. Those details do not arise automatically from a prompt and can also be changed later through version management. Exports before and after the change additionally show the actual difference. Comparing them needs no further Google credentials once both files are available.<\/p>\n<div class=\"lw-faq\">\n<h2>Questions and answers<\/h2>\n<h3>Is a smaller tool list always better?<\/h3>\n<p>No. Short definitions can provide less guidance about valid inputs. Detailed definitions can prevent mistakes. The task, description quality and actually loaded context matter. No fixed API response time follows from the size.<\/p>\n<h3>Can one tool both read and publish?<\/h3>\n<p>Yes. When actions are bundled, a name-only rule may block both. Checking the action parameter is more precise, but must match the installed server version. A separate publishing tool is easier to block individually.<\/p>\n<h3>Why use a separate workspace?<\/h3>\n<p>A separate draft groups related changes and makes review or disposal easier. Changes from other workspaces can still require synchronization and conflict resolution. <code>workspaces.sync<\/code> supports that synchronization. The number of simultaneous workspaces available depends on the Tag Manager offering.<\/p>\n<h3>What does a failed package start prove?<\/h3>\n<p>A startup error about missing database or key configuration initially establishes only that the attempted start lacked prerequisites. It does not establish that the package can never run locally. Package documentation and required services determine the deployment options.<\/p>\n<\/div>\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/code.claude.com\/docs\/en\/mcp\">https:\/\/code.claude.com\/docs\/en\/mcp<\/a><\/li>\n<li><a href=\"https:\/\/code.claude.com\/docs\/en\/skills\">https:\/\/code.claude.com\/docs\/en\/skills<\/a><\/li>\n<li><a href=\"https:\/\/code.claude.com\/docs\/en\/hooks\">https:\/\/code.claude.com\/docs\/en\/hooks<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/v2\/authorization\">https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/v2\/authorization<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/reference\/rest\/v2\/accounts.containers.versions\/live\">https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/reference\/rest\/v2\/accounts.containers.versions\/live<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/reference\/rest\/v2\/accounts.containers.workspaces.tags\/update\">https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/reference\/rest\/v2\/accounts.containers.workspaces.tags\/update<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/reference\/rest\/v2\/accounts.containers\/delete\">https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/reference\/rest\/v2\/accounts.containers\/delete<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/reference\/rest\/v2\/accounts.containers.environments\/update\">https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/reference\/rest\/v2\/accounts.containers.environments\/update<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/reference\/rest\/v2\/accounts.containers.versions\/update\">https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/reference\/rest\/v2\/accounts.containers.versions\/update<\/a><\/li>\n<li><a href=\"https:\/\/tagmanager.googleapis.com\/$discovery\/rest?version=v2\">https:\/\/tagmanager.googleapis.com\/$discovery\/rest?version=v2<\/a><\/li>\n<li><a href=\"https:\/\/registry.npmjs.org\/google-tag-manager-mcp-core\/2.1.1\">https:\/\/registry.npmjs.org\/google-tag-manager-mcp-core\/2.1.1<\/a><\/li>\n<li><a href=\"https:\/\/registry.npmjs.org\/google-tag-manager-mcp-server\/5.1.1\">https:\/\/registry.npmjs.org\/google-tag-manager-mcp-server\/5.1.1<\/a><\/li>\n<li><a href=\"https:\/\/registry.npmjs.org\/gtm-mcp\/1.0.0\">https:\/\/registry.npmjs.org\/gtm-mcp\/1.0.0<\/a><\/li>\n<li><a href=\"https:\/\/registry.npmjs.org\/@theethosteam\/gtm-mcp\/1.1.1\">https:\/\/registry.npmjs.org\/@theethosteam\/gtm-mcp\/1.1.1<\/a><\/li>\n<li><a href=\"https:\/\/curl.se\/docs\/manpage.html#--fail-with-body\">https:\/\/curl.se\/docs\/manpage.html#&#8211;fail-with-body<\/a><\/li>\n<li><a href=\"https:\/\/platform.claude.com\/docs\/en\/build-with-claude\/prompt-caching\">https:\/\/platform.claude.com\/docs\/en\/build-with-claude\/prompt-caching<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/v2\">https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/v2<\/a><\/li>\n<li><a href=\"https:\/\/docs.claude.com\/en\/docs\/claude-code\/mcp\">https:\/\/docs.claude.com\/en\/docs\/claude-code\/mcp<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Three MCP packages connect Claude Code to Google Tag Manager. The comparison distinguishes historical tool-list sizes from actual context use and explains Google scopes, account permissions and the limits of local tool rules.<\/p>\n","protected":false},"author":1,"featured_media":31269,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[91106,91267,91404],"class_list":["post-17821","post","type-post","status-publish","format-standard","hentry","category-cloud-ai","tag-automation","tag-google-tag-manager","tag-llm"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Connecting Claude Code to Google Tag Manager: Three MCP Integrations and Their Limits | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Three GTM MCP servers measured over stdio: 18, 33 and 104 tools, 20 to 108 kB of definitions, and which OAuth scope may publish.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Connecting Claude Code to Google Tag Manager: Three MCP Integrations and Their Limits | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Three GTM MCP servers measured over stdio: 18, 33 and 104 tools, 20 to 108 kB of definitions, and which OAuth scope may publish.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-13T07:20:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-25T20:26:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-17821.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Connecting Claude Code to Google Tag Manager: Three MCP Integrations and Their Limits\",\"datePublished\":\"2026-09-13T07:20:00+00:00\",\"dateModified\":\"2026-10-25T20:26:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\\\/\"},\"wordCount\":1611,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/klarheit-20261111-17821.png\",\"keywords\":[\"Automation\",\"Google Tag Manager\",\"LLM\"],\"articleSection\":[\"Cloud &amp; AI\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\\\/\",\"name\":\"Connecting Claude Code to Google Tag Manager: Three MCP Integrations and Their Limits | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/klarheit-20261111-17821.png\",\"datePublished\":\"2026-09-13T07:20:00+00:00\",\"dateModified\":\"2026-10-25T20:26:28+00:00\",\"description\":\"Three GTM MCP servers measured over stdio: 18, 33 and 104 tools, 20 to 108 kB of definitions, and which OAuth scope may publish.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/klarheit-20261111-17821.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/klarheit-20261111-17821.png\",\"width\":1200,\"height\":630,\"caption\":\"Connecting Claude Code to Google Tag Manager: Three MCP Integrations and Their Limits\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Connecting Claude Code to Google Tag Manager: Three MCP Integrations and Their Limits\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Connecting Claude Code to Google Tag Manager: Three MCP Integrations and Their Limits | Lukas Wojcik","description":"Three GTM MCP servers measured over stdio: 18, 33 and 104 tools, 20 to 108 kB of definitions, and which OAuth scope may publish.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/","og_locale":"en_US","og_type":"article","og_title":"Connecting Claude Code to Google Tag Manager: Three MCP Integrations and Their Limits | Lukas Wojcik","og_description":"Three GTM MCP servers measured over stdio: 18, 33 and 104 tools, 20 to 108 kB of definitions, and which OAuth scope may publish.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-13T07:20:00+00:00","article_modified_time":"2026-10-25T20:26:28+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-17821.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Connecting Claude Code to Google Tag Manager: Three MCP Integrations and Their Limits","datePublished":"2026-09-13T07:20:00+00:00","dateModified":"2026-10-25T20:26:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/"},"wordCount":1611,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-17821.png","keywords":["Automation","Google Tag Manager","LLM"],"articleSection":["Cloud &amp; AI"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/","name":"Connecting Claude Code to Google Tag Manager: Three MCP Integrations and Their Limits | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-17821.png","datePublished":"2026-09-13T07:20:00+00:00","dateModified":"2026-10-25T20:26:28+00:00","description":"Three GTM MCP servers measured over stdio: 18, 33 and 104 tools, 20 to 108 kB of definitions, and which OAuth scope may publish.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-17821.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-17821.png","width":1200,"height":630,"caption":"Connecting Claude Code to Google Tag Manager: Three MCP Integrations and Their Limits"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/connecting-claude-code-to-google-tag-manager-three-mcp-integrations-and-their-limits\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Connecting Claude Code to Google Tag Manager: Three MCP Integrations and Their Limits"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/17821","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=17821"}],"version-history":[{"count":4,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/17821\/revisions"}],"predecessor-version":[{"id":25489,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/17821\/revisions\/25489"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/31269"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=17821"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=17821"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=17821"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}