{"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-09-09T21:29:22","modified_gmt":"2026-09-09T19:29:22","slug":"claude-code-gtm-integrations-mcp-server-context-cost","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/claude-code-gtm-integrations-mcp-server-context-cost\/","title":{"rendered":"GTM Integrations for Claude Code: Three MCP Servers, Their Tool Count and Their Context Cost"},"content":{"rendered":"<p>A Google Tag Manager container is a JSON document that decides which scripts a website loads and when. Changing it from a prompt means handing a language model write access to that document. The interesting question is not whether that works \u2014 it does \u2014 but what exactly the model is allowed to touch, and what the connection costs before a single tag is written.<\/p>\n<p>Three integrations were measured for this article on 9 September 2026: three MCP servers, each started over stdio with <code>npx<\/code> on a Raspberry Pi 5 with Node 20.19.2 and asked for its tool list, plus the Tag Manager API v2 that all of them sit on. The numbers below come from those runs and from the API&#8217;s own discovery document, not from the READMEs.<\/p>\n<figure class=\"lw-diagram\">\n<img src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/gtm-integrationen-en.png\" width=\"1120\" height=\"580\" decoding=\"async\" loading=\"lazy\"\n     alt=\"The path of a change from a prompt through Claude Code and an MCP server to the Tag Manager API, a workspace and the live container, with the publish step marked; below it three measured MCP servers with their tool count and the size of their tool list as bars, and the seven OAuth scopes with the number of methods each covers\"><figcaption>The route a change takes, the size of three measured tool lists, and how the 106 API methods spread across seven scopes.<\/figcaption><\/figure>\n<h2>Three ways a container reaches the model<\/h2>\n<p>Claude Code knows nothing about Tag Manager on its own. Everything it can do with a container arrives through one of three routes, and only two of them add a capability.<\/p>\n<p>An <strong>MCP server<\/strong> is a process that Claude Code starts and talks to over stdio or HTTP. It publishes a list of tools, and each tool appears in the session under the name <code>mcp__&lt;server&gt;__&lt;tool&gt;<\/code>. That name is what permission rules and hooks match on later, which is the reason it is worth knowing.<\/p>\n<p>The <strong>API through the shell<\/strong> needs no server at all. An access token and <code>curl<\/code> are enough, and the model writes the request itself. Nothing is added to the context up front, and nothing is hidden behind a wrapper either \u2014 the trade is convenience against transparency.<\/p>\n<p>A <strong>skill or slash command<\/strong> adds no capability whatsoever. It carries a recipe: a naming convention, a review checklist, the order in which a trigger has to exist before a tag can reference it. It changes what the model does with the other two routes, never what it may do. Confusing the two is the most common misreading of the word &#8220;integration&#8221; here.<\/p>\n<h2>What sits underneath: 106 methods, seven scopes, one workspace<\/h2>\n<p>Every route ends at the same place. The Tag Manager API v2 discovery document, revision 20260902 and 270,858 bytes long, describes <strong>106 methods across 18 resources<\/strong>: 38 GET, 38 POST, 15 PUT and 15 DELETE.<\/p>\n<p>Ten of those resources live inside a workspace \u2014 tags, triggers, variables, built-in variables, folders, templates, clients, transformations, zones and the gtag configuration. A workspace is a draft. Nothing written into it reaches a single visitor, no matter how wrong it is.<\/p>\n<p>Two further steps stand between the draft and the live site. <code>workspaces.create_version<\/code> freezes a workspace into a container version, and <code>versions.publish<\/code> makes that version live. The scope <code>tagmanager.publish<\/code> covers exactly <strong>two of the 106 methods<\/strong>: the publish call and <code>environments.reauthorize<\/code>. Every other thing an integration can do is, by construction, invisible to visitors until a separate call says otherwise.<\/p>\n<pre><code># Reading tags: the path carries account, container and workspace.\n# A workspace id is mandatory - there is no route to the live tags.\nACC=6012345678; CONT=123456789; WS=42\ncurl -s -H \"Authorization: Bearer $TOKEN\" \\\n  \"https:\/\/tagmanager.googleapis.com\/tagmanager\/v2\/accounts\/$ACC\/containers\/$CONT\/workspaces\/$WS\/tags\"\n\n# Without a token every method answers the same way:\n# {\"error\":{\"code\":401,\"status\":\"UNAUTHENTICATED\",\n#   \"details\":[{\"reason\":\"CREDENTIALS_MISSING\"}]}}<\/code><\/pre>\n<p>Fifteen of the API&#8217;s schemas carry a <code>fingerprint<\/code>, a value that changes whenever the entity changes. An update that sends a stale fingerprint is refused rather than allowed to overwrite an edit somebody made in the browser meanwhile.<\/p>\n<h2>Three MCP servers, three cuts through the same API<\/h2>\n<table>\n<tr>\n<th>Server<\/th>\n<th>Tools<\/th>\n<th>tools\/list<\/th>\n<th>\u2248 tokens<\/th>\n<th>Shape<\/th>\n<\/tr>\n<tr>\n<td><code>google-tag-manager-mcp-server<\/code> 5.1.1<\/td>\n<td>18<\/td>\n<td>108,201 B<\/td>\n<td>27,000<\/td>\n<td>one tool per entity, action as a parameter<\/td>\n<\/tr>\n<tr>\n<td><code>gtm-mcp<\/code> 1.0.0<\/td>\n<td>104<\/td>\n<td>49,656 B<\/td>\n<td>12,400<\/td>\n<td>roughly one tool per API method<\/td>\n<\/tr>\n<tr>\n<td><code>@theethosteam\/gtm-mcp<\/code> 1.1.1<\/td>\n<td>33<\/td>\n<td>19,797 B<\/td>\n<td>4,900<\/td>\n<td>task-shaped, five recipes and a raw call<\/td>\n<\/tr>\n<\/table>\n<p>The first packs the whole API behind 18 tools. Seventeen of them take an <code>action<\/code> parameter carrying 101 actions in total, of which 38 only read; <code>gtm_tag<\/code> alone covers create, get, list, update, remove and revert. The eighteenth, <code>gtag_destination<\/code>, only lists.<\/p>\n<p>The second is close to a one-to-one mapping of the API: 104 tools against 106 methods, 37 of them named <code>get_\u2026<\/code> or <code>list_\u2026<\/code>.<\/p>\n<p>The third does not follow the API shape at all. Beside the ordinary calls it carries five recipes \u2014 <code>gtm_recipe_ga4_config<\/code>, <code>gtm_recipe_ga4_event<\/code>, <code>gtm_recipe_meta_pixel<\/code> and two trigger recipes \u2014 and a 215-byte escape hatch named <code>gtm_raw<\/code> for everything the other 32 tools do not reach.<\/p>\n<p>A fourth candidate never started. <code>@yoryoboy\/gtm-mcp<\/code> 4.1.0 stopped with <code>Missing required configuration: DATABASE_URL, DB_ENCRYPTION_KEY<\/code>, because it is built as a hosted multi-tenant service with a PostgreSQL store behind it, not as a local process. Publication on npm with &#8220;MCP server&#8221; in the description is no promise that a package runs on a workstation.<\/p>\n<h2>The context price is not in the tool count<\/h2>\n<p>The three tool lists differ in size by a factor of 5.5, and the order does not follow the number of tools. The 18-tool server sends 108,201 bytes of definitions, the 33-tool server 19,797.<\/p>\n<p>Two tools account for nearly half of the largest list: <code>gtm_version<\/code> at 28,212 bytes and <code>gtm_workspace<\/code> at 24,594, together 48.8 per cent of 108,201. The cause is the ContainerVersion resource. It embeds tags, triggers, variables, clients, folders, zones, templates, transformations and the gtag configuration, so a fully typed schema of it is necessarily large \u2014 and it is sent whether or not a version is ever touched.<\/p>\n<p>This is not a one-off cost at connection time. Tool definitions belong to the request, so they travel with every turn of the session. Two consequences follow. Connecting several servers of this shape at once fills a sizeable part of a context window before any work begins. And a server with looser schemas is not automatically the weaker choice: a wrong field type is caught by the API within a second, while a precise schema is paid for on every single turn.<\/p>\n<h2>What an integration may change is decided by the token<\/h2>\n<p>All three servers authenticate against Google in the same way, and the real guard rail is the OAuth scope. The largest server&#8217;s default asks for all seven, publishing and container deletion included \u2014 visible in its <code>src\/constants\/scopes.ts<\/code> as a flat list.<\/p>\n<p>The set can be narrowed. The server reads <code>GTM_SCOPES<\/code> from its environment and splits it on spaces or commas. That narrowing works in <strong>one of the three authentication modes only<\/strong>. In the source, <code>createAuthFromEnv<\/code> hands the parsed scopes to the service-account branch alone; the refresh-token branch receives client id, secret and refresh token, and the access-token branch receives the token. A refresh token already carries the scopes it was minted with, so <code>GTM_SCOPES<\/code> standing next to it changes nothing and reports nothing.<\/p>\n<pre><code>{\n  \"mcpServers\": {\n    \"gtm\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"google-tag-manager-mcp-server\"],\n      \"env\": {\n        \"GOOGLE_SERVICE_ACCOUNT_KEY\": \"{...}\",\n        \"GTM_SCOPES\": \"https:\/\/www.googleapis.com\/auth\/tagmanager.readonly\"\n      }\n    }\n  }\n}<\/code><\/pre>\n<p>A second gate sits inside Tag Manager itself. A service account only reaches a container after its address has been added there as a user, and that permission is graded per container: read, edit, approve, publish. An account with edit rights and a publish scope still cannot publish.<\/p>\n<p>The third gate is on the Claude Code side and matches on the tool name. A deny rule on <code>mcp__gtm__gtm_version<\/code> takes the publishing tool out of reach even where the token would allow the call, and a <code>PreToolUse<\/code> hook on the same name can demand a confirmation instead. Three independent gates, and the useful arrangement is to close the outermost one \u2014 the token \u2014 because it is the only one that also holds when the container is reached from somewhere other than this session.<\/p>\n<h2>Where it goes wrong<\/h2>\n<p><strong>Update replaces, it does not merge.<\/strong> Fifteen of the 18 tool descriptions state it themselves: any field left out of the payload is deleted. A model that sends only the field it wants to change strips the rest of the tag. Eleven of the tools additionally require the fingerprint of the state they last read, which forces a read before every write and turns a careless edit into an error message instead of a loss.<\/p>\n<p><strong>A tag is not a flat object.<\/strong> Its settings live in a <code>parameter<\/code> array of key, type and value, with eight types in the enumeration \u2014 <code>template<\/code>, <code>integer<\/code>, <code>boolean<\/code>, <code>list<\/code>, <code>map<\/code>, <code>triggerReference<\/code>, <code>tagReference<\/code> and the unspecified one \u2014 where <code>list<\/code> and <code>map<\/code> nest further parameters inside themselves. This structure, not the tag name, is where generated payloads go wrong.<\/p>\n<pre><code>{\n  \"name\": \"GA4 - purchase\",\n  \"type\": \"gaawe\",\n  \"parameter\": [\n    { \"type\": \"template\", \"key\": \"eventName\", \"value\": \"purchase\" },\n    { \"type\": \"tagReference\", \"key\": \"measurementId\",\n      \"value\": \"GA4 Configuration\" },\n    { \"type\": \"list\", \"key\": \"eventParameters\", \"list\": [\n      { \"type\": \"map\", \"map\": [\n        { \"type\": \"template\", \"key\": \"name\",  \"value\": \"value\" },\n        { \"type\": \"template\", \"key\": \"value\", \"value\": \"{{DLV - value}}\" }\n      ]}\n    ]}\n  ],\n  \"firingTriggerId\": [\"17\"]\n}<\/code><\/pre>\n<p><strong>&#8220;GTM&#8221; is ambiguous on the package registry.<\/strong> A search for <code>gtm-mcp<\/code> returns servers for go-to-market frameworks alongside the Tag Manager ones; <code>@shashwatgtmalpha\/craft-gtm-mcp<\/code> lists <code>go-to-market<\/code> among its keywords, and <code>growth-mcp<\/code> describes itself as an &#8220;open-source GTM MCP server&#8221; without meaning Tag Manager at all. The keyword list separates the two faster than the description does.<\/p>\n<h2>What this does not solve<\/h2>\n<p>None of these integrations can tell whether a tag actually fires. <code>quick_preview<\/code> compiles a workspace into a preview version; it does not load a page, and it says nothing about a data layer that arrives too late. The judgement about correctness stays with a preview session in a browser, exactly as before.<\/p>\n<p>Neither does the API record why something changed. A container version carries a name and a description, and both stay empty unless they are filled in the same call \u2014 which makes the version description the cheapest place to record which prompt caused which change, and the first thing to go missing when a tag is created in a hurry.<\/p>\n<p>And the file route has not become obsolete. An exported container is a single JSON file, and reviewing it against a diff needs no token, no scope and no server. For a change that is written by a model and read by a human, the export remains the shorter path \u2014 the API&#8217;s advantage begins where the change has to be applied, not where it has to be understood.<\/p>\n<div class=\"lw-quellen\">\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/v2\" target=\"_blank\" rel=\"noopener noreferrer\">Tag Manager API v2 \u2014 Overview<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/v2\/authorization\" target=\"_blank\" rel=\"noopener noreferrer\">Authorizing Requests to the Tag Manager API<\/a><\/li>\n<li><a href=\"https:\/\/docs.claude.com\/en\/docs\/claude-code\/mcp\" target=\"_blank\" rel=\"noopener noreferrer\">Connect Claude Code to tools via MCP<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Changing a Tag Manager container from a prompt means handing a language model an OAuth token. Three MCP servers were started over stdio on 9 September 2026 and asked for their tool list: 18, 33 and 104 tools, and between 20 and 108 kilobytes of definitions that travel with every request. Underneath all three sits the same API with 106 methods, seven scopes and exactly two calls that reach the live container.<\/p>\n","protected":false},"author":1,"featured_media":17842,"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>GTM Integrations for Claude Code: Three MCP Servers, Their Tool Count and Their Context Cost - Lukas Wojcik - Blog<\/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\/claude-code-gtm-integrations-mcp-server-context-cost\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GTM Integrations for Claude Code: Three MCP Servers, Their Tool Count and Their Context Cost - Lukas Wojcik - Blog\" \/>\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\/claude-code-gtm-integrations-mcp-server-context-cost\/\" \/>\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=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-17821-claude-code-gtm-integrations-mcp-ser-n.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=\"luky\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"luky\" \/>\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\\\/claude-code-gtm-integrations-mcp-server-context-cost\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/claude-code-gtm-integrations-mcp-server-context-cost\\\/\"},\"author\":{\"name\":\"luky\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"GTM Integrations for Claude Code: Three MCP Servers, Their Tool Count and Their Context Cost\",\"datePublished\":\"2026-09-13T07:20:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/claude-code-gtm-integrations-mcp-server-context-cost\\\/\"},\"wordCount\":1518,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/claude-code-gtm-integrations-mcp-server-context-cost\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-17821-claude-code-gtm-integrations-mcp-ser-n.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\\\/claude-code-gtm-integrations-mcp-server-context-cost\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/claude-code-gtm-integrations-mcp-server-context-cost\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/claude-code-gtm-integrations-mcp-server-context-cost\\\/\",\"name\":\"GTM Integrations for Claude Code: Three MCP Servers, Their Tool Count and Their Context Cost - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/claude-code-gtm-integrations-mcp-server-context-cost\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/claude-code-gtm-integrations-mcp-server-context-cost\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-17821-claude-code-gtm-integrations-mcp-ser-n.png\",\"datePublished\":\"2026-09-13T07:20:00+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\\\/claude-code-gtm-integrations-mcp-server-context-cost\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/claude-code-gtm-integrations-mcp-server-context-cost\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/claude-code-gtm-integrations-mcp-server-context-cost\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-17821-claude-code-gtm-integrations-mcp-ser-n.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-17821-claude-code-gtm-integrations-mcp-ser-n.png\",\"width\":1200,\"height\":630,\"caption\":\"GTM Integrations for Claude Code: Three MCP Servers, Their Tool Count and Their Context Cost\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/cloud-ai\\\/claude-code-gtm-integrations-mcp-server-context-cost\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"GTM Integrations for Claude Code: Three MCP Servers, Their Tool Count and Their Context Cost\"}]},{\"@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\":\"luky\",\"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\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"],\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/author\\\/luky\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"GTM Integrations for Claude Code: Three MCP Servers, Their Tool Count and Their Context Cost - Lukas Wojcik - Blog","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\/claude-code-gtm-integrations-mcp-server-context-cost\/","og_locale":"en_US","og_type":"article","og_title":"GTM Integrations for Claude Code: Three MCP Servers, Their Tool Count and Their Context Cost - Lukas Wojcik - Blog","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\/claude-code-gtm-integrations-mcp-server-context-cost\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-13T07:20:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-17821-claude-code-gtm-integrations-mcp-ser-n.png","type":"image\/png"}],"author":"luky","twitter_card":"summary_large_image","twitter_misc":{"Written by":"luky","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/claude-code-gtm-integrations-mcp-server-context-cost\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/claude-code-gtm-integrations-mcp-server-context-cost\/"},"author":{"name":"luky","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"GTM Integrations for Claude Code: Three MCP Servers, Their Tool Count and Their Context Cost","datePublished":"2026-09-13T07:20:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/claude-code-gtm-integrations-mcp-server-context-cost\/"},"wordCount":1518,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/claude-code-gtm-integrations-mcp-server-context-cost\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-17821-claude-code-gtm-integrations-mcp-ser-n.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\/claude-code-gtm-integrations-mcp-server-context-cost\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/claude-code-gtm-integrations-mcp-server-context-cost\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/claude-code-gtm-integrations-mcp-server-context-cost\/","name":"GTM Integrations for Claude Code: Three MCP Servers, Their Tool Count and Their Context Cost - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/claude-code-gtm-integrations-mcp-server-context-cost\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/claude-code-gtm-integrations-mcp-server-context-cost\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-17821-claude-code-gtm-integrations-mcp-ser-n.png","datePublished":"2026-09-13T07:20:00+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\/claude-code-gtm-integrations-mcp-server-context-cost\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/claude-code-gtm-integrations-mcp-server-context-cost\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/claude-code-gtm-integrations-mcp-server-context-cost\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-17821-claude-code-gtm-integrations-mcp-ser-n.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-17821-claude-code-gtm-integrations-mcp-ser-n.png","width":1200,"height":630,"caption":"GTM Integrations for Claude Code: Three MCP Servers, Their Tool Count and Their Context Cost"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/claude-code-gtm-integrations-mcp-server-context-cost\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"GTM Integrations for Claude Code: Three MCP Servers, Their Tool Count and Their Context Cost"}]},{"@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":"luky","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":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"],"url":"https:\/\/www.lukaswojcik.com\/blog\/author\/luky\/"}]}},"_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":1,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/17821\/revisions"}],"predecessor-version":[{"id":17866,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/17821\/revisions\/17866"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/17842"}],"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}]}}