Google Tag Manager MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GOOGLE_CLIENT_ID | No | Your Google OAuth client ID | |
| GOOGLE_CLIENT_SECRET | No | Your Google OAuth client secret | |
| TAG_MANAGER_READ_ONLY | No | Set to 'true' to enable read-only mode and use only the readonly scope | false |
| GOOGLE_APPLICATION_CREDENTIALS | No | Path to a service account JSON file (Application Default Credentials) | |
| GOOGLE_TAG_MANAGER_REFRESH_TOKEN | No | Refresh token minted for the Tag Manager API |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| check_client_statusA | Check that the Tag Manager client is configured and can authenticate. Returns: Whether credentials resolve, whether the server is in read-only mode, and the OAuth scopes in use. |
| list_accountsA | List the Google Tag Manager accounts this user can access. Start here: every other tool needs an account ID, and the numbers shown in the Tag Manager web UI's URL are not always the API's account IDs. |
| get_accountB | Get one Tag Manager account. |
| update_accountB | Update a Tag Manager account's settings. |
| list_user_permissionsB | List who has access to a Tag Manager account, and at what level. |
| get_user_permissionA | Get one user's access to a Tag Manager account. |
| create_user_permissionB | Grant a user access to a Tag Manager account. |
| update_user_permissionA | Change a user's access to a Tag Manager account. The request replaces the stored access levels rather than merging into them, so send the complete accountAccess and containerAccess you want. |
| delete_user_permissionA | Revoke a user's access to a Tag Manager account. |
| list_containersB | List the containers in a Tag Manager account. |
| get_containerB | Get one Tag Manager container. |
| lookup_containerA | Find a container from its public GTM-XXXXXXX tag ID. Use this when you have a tag ID from a website's source but no account ID. Pass exactly one of the two arguments. |
| get_container_snippetA | Get the HTML install snippet for a container. |
| create_containerC | Create a container in a Tag Manager account. |
| update_containerC | Update a container's settings. |
| delete_containerA | Delete a container, and with it every workspace, tag and version. This cannot be undone through the API, and any site still loading the container's snippet stops receiving tags. |
| combine_containersC | Merge one container into another. |
| move_tag_idA | Move a tag ID out of a container into a newly created one. The inverse of combine_containers: it splits a tag ID off a container that holds several. |
| list_destinationsB | List the Google tag destinations linked to a container. |
| get_destinationA | Get one destination linked to a container. |
| link_destinationA | Link a Google tag destination to a container. The destination is taken from whichever container currently holds it, so this moves rather than copies. |
| list_environmentsA | List a container's environments. Every container has a Live and a Latest environment; the rest are user-created preview targets. |
| get_environmentA | Get one container environment. |
| create_environmentC | Create an environment in a container. |
| update_environmentB | Update a container environment. |
| delete_environmentA | Delete a container environment. The built-in Live and Latest environments cannot be deleted. |
| reauthorize_environmentA | Regenerate an environment's authorization code. Use this when a preview link has leaked: the old code stops working immediately, so anything embedding it must be updated. |
| list_version_headersA | List a container's version history as lightweight headers. Prefer this over fetching versions when you want the history: a header carries the ID, name and entity counts without the full snapshot of every tag in the version. |
| get_latest_version_headerA | Get the header of a container's most recently created version. This is the newest version, which is not necessarily the published one -- use get_live_version for what production is serving. |
| get_versionB | Get one container version, including every entity it contains. |
| get_live_versionA | Get the container version currently published to production. This is what visitors to the site are actually running, which is the right starting point for "what is live right now". |
| update_versionA | Update a container version's name or notes. Only the metadata is editable. A version's entities are a frozen snapshot; to change them, edit a workspace and create a new version. |
| delete_versionA | Delete a container version. Deletion is reversible with undelete_version. The live version cannot be deleted. |
| undelete_versionC | Restore a deleted container version. |
| publish_versionA | Publish a container version to production. This takes effect on the live site immediately, for every visitor, with no staged rollout. The only way back is to publish an earlier version over the top. Confirm the version is the intended one before calling. |
| set_latest_versionA | Set the version that workspaces sync against. This is the baseline used to detect conflicts when a workspace syncs. It does not change what is published. |
| list_workspacesB | List a container's workspaces. A workspace is the draft layer: tags, triggers and variables are edited in one, and nothing reaches production until it becomes a version and that version is published. Every container has a "Default Workspace". |
| get_workspaceC | Get one workspace. |
| get_workspace_statusA | List what a workspace has changed, and what conflicts with the base. Run this before creating a version: it is the diff between the workspace and the container version it was branched from. |
| create_workspaceC | Create a workspace in a container. |
| update_workspaceC | Update a workspace's name or description. |
| delete_workspaceA | Delete a workspace, discarding every change in it. Changes that were never turned into a version are lost. Check get_workspace_status first. |
| sync_workspaceA | Bring a workspace up to date with the latest container version. Unmodified entities are updated in place; anything the workspace also changed comes back as a merge conflict to resolve with resolve_workspace_conflict. |
| resolve_workspace_conflictB | Resolve one merge conflict raised by sync_workspace. |
| quick_preview_workspaceA | Compile a workspace into a throwaway version to check it is valid. Nothing is saved and nothing is published; this is the cheap way to find compiler errors before create_version. |
| create_versionA | Turn a workspace into a container version. The workspace is consumed by this call -- the API deletes it and makes the new version the container's latest. Creating a version does not publish it; use publish_version for that. |
| bulk_update_workspaceA | Apply many entity changes to a workspace in a single call. Use this when creating entities that reference each other -- a tag and the trigger that fires it, say -- since one call keeps them consistent. |
| list_tagsA | List the tags in a workspace. |
| get_tagC | Get one tag from a workspace. |
| create_tagC | Create a tag in a workspace. |
| update_tagA | Update a tag in a workspace. The tag you send replaces the stored one, so read it with get_tag first and send the whole thing back with your edits applied. Omitted fields are cleared, not preserved. |
| delete_tagA | Delete a tag from a workspace. This affects the workspace only. The tag keeps running in production until a version without it is published. |
| revert_tagA | Undo a workspace's changes to one tag. Restores the tag to the state of the container version the workspace was branched from, leaving the workspace's other changes alone. |
| list_triggersA | List the triggers in a workspace. Triggers are referenced by tags through firingTriggerId and blockingTriggerId, so list these before creating a tag. |
| get_triggerA | Get one trigger from a workspace. |
| create_triggerA | Create a trigger in a workspace. Trigger types are Tag Manager's internal codes: "pageview", "domReady", "windowLoaded", "click", "linkClick", "formSubmission", "customEvent", "timer" and so on. Copy the shape from an existing trigger via get_trigger when unsure. |
| update_triggerA | Update a trigger in a workspace. The trigger you send replaces the stored one, so read it with get_trigger first and send the whole thing back with your edits applied. Omitted fields are cleared, not preserved. |
| delete_triggerA | Delete a trigger from a workspace. This affects the workspace only. The trigger stays in production until a version without it is published. |
| revert_triggerA | Undo a workspace's changes to one trigger. Restores the trigger to the state of the container version the workspace was branched from, leaving the workspace's other changes alone. |
| list_variablesB | List the variables in a workspace. Other entities reference these by name in {{double braces}}, so the names here are what tag and trigger parameters point at. |
| get_variableA | Get one variable from a workspace. |
| create_variableA | Create a variable in a workspace. Variable types are Tag Manager's internal codes: "v" is a data layer variable, "c" a constant, "jsm" custom JavaScript, "k" a first-party cookie, "u" a URL variable. Copy the shape from an existing variable via get_variable when unsure. |
| update_variableA | Update a variable in a workspace. The variable you send replaces the stored one, so read it with get_variable first and send the whole thing back with your edits applied. Omitted fields are cleared, not preserved. |
| delete_variableA | Delete a variable from a workspace. This affects the workspace only. The variable stays in production until a version without it is published. |
| revert_variableA | Undo a workspace's changes to one variable. Restores the variable to the state of the container version the workspace was branched from, leaving the workspace's other changes alone. |
| list_built_in_variablesA | List the built-in variables enabled in a workspace. Built-in variables (Page URL, Click Text, and so on) are supplied by Tag Manager and only need enabling. They are separate from the user-defined variables in list_variables. |
| create_built_in_variableB | Enable built-in variables in a workspace. |
| delete_built_in_variableB | Disable built-in variables in a workspace. Anything referencing a disabled variable stops resolving, so check for uses first. |
| revert_built_in_variableB | Undo a workspace's change to one built-in variable. |
| list_foldersB | List the folders in a workspace. |
| get_folderB | Get one folder from a workspace. |
| get_folder_entitiesA | List the tags, triggers and variables inside a folder. |
| create_folderC | Create a folder in a workspace. |
| update_folderB | Update a folder's name or notes. |
| delete_folderA | Delete a folder from a workspace. The entities inside it are not deleted; they are left unfiled. |
| revert_folderC | Undo a workspace's changes to one folder. |
| move_entities_to_folderA | Move tags, triggers and variables into a folder. Pass folder_id "0" to take the entities out of their current folder instead of putting them into one. |
| list_templatesB | List the custom templates in a workspace. |
| get_templateA | Get one custom template, including its sandboxed JavaScript source. |
| create_templateC | Create a custom template in a workspace. |
| update_templateA | Update a custom template in a workspace. The template you send replaces the stored one, so read it with get_template first and send the whole thing back with your edits applied. |
| delete_templateA | Delete a custom template from a workspace. Tags and variables using the template stop working, so check for uses before deleting. |
| revert_templateC | Undo a workspace's changes to one custom template. |
| import_template_from_galleryA | Import a template from the Community Template Gallery. Gallery templates are third-party code that runs on the site, and the import declares the permissions the template asks for -- acknowledge_permissions must be true or the call fails. Review what it requests before importing. |
| list_clientsA | List the clients in a workspace. A web container returns an empty list; clients exist only in server containers. |
| get_clientC | Get one client from a workspace. |
| create_clientA | Create a client in a workspace. Only server containers accept clients. Creating one in a web container fails. |
| update_clientA | Update a client in a workspace. The client you send replaces the stored one, so read it with get_client first and send the whole thing back with your edits applied. Omitted fields are cleared, not preserved. |
| delete_clientA | Delete a client from a workspace. This affects the workspace only. The client stays in production until a version without it is published. |
| revert_clientA | Undo a workspace's changes to one client. Restores the client to the state of the container version the workspace was branched from, leaving the workspace's other changes alone. |
| list_transformationsA | List the transformations in a workspace. A web container returns an empty list; transformations exist only in server containers. |
| get_transformationB | Get one transformation from a workspace. |
| create_transformationA | Create a transformation in a workspace. Only server containers accept transformations. Creating one in a web container fails. |
| update_transformationA | Update a transformation in a workspace. The transformation you send replaces the stored one, so read it with get_transformation first and send the whole thing back with your edits applied. Omitted fields are cleared, not preserved. |
| delete_transformationA | Delete a transformation from a workspace. This affects the workspace only. The transformation stays in production until a version without it is published. |
| revert_transformationA | Undo a workspace's changes to one transformation. Restores the transformation to the state of the container version the workspace was branched from, leaving the workspace's other changes alone. |
| list_zonesA | List the zones in a workspace. A standard (non-360) container returns an empty list. |
| get_zoneB | Get one zone from a workspace. |
| create_zoneA | Create a zone in a workspace. Zones require Tag Manager 360. Creating one in a standard container fails. |
| update_zoneA | Update a zone in a workspace. The zone you send replaces the stored one, so read it with get_zone first and send the whole thing back with your edits applied. Omitted fields are cleared, not preserved. |
| delete_zoneA | Delete a zone from a workspace. This affects the workspace only. The zone stays in production until a version without it is published. |
| revert_zoneA | Undo a workspace's changes to one zone. Restores the zone to the state of the container version the workspace was branched from, leaving the workspace's other changes alone. |
| list_gtag_configsA | List the Google tag configurations in a workspace. These are the gtag.js settings a Google tag applies to its destinations -- the API equivalent of the "Configuration settings" panel on a Google tag. |
| get_gtag_configA | Get one Google tag configuration from a workspace. |
| create_gtag_configB | Create a Google tag configuration in a workspace. |
| update_gtag_configA | Update a Google tag configuration. The config you send replaces the stored one, so read it with get_gtag_config first and send the whole thing back with your edits applied. |
| delete_gtag_configA | Delete a Google tag configuration from a workspace. Unlike every other workspace entity, Google tag configs have no revert method, so this cannot be undone short of discarding the workspace. |
| list_workspace_entitiesA | Read everything configured in a workspace in one call. Fetches tags, triggers, variables and folders, following pagination on each. Prefer this over four separate list calls when you want to understand or audit a container's setup. |
| find_entities_by_nameA | Find tags, triggers and variables by name. The API has no search, so this reads each collection and filters. Use it to turn a name a human used ("the purchase tag") into the ID the other tools need. |
| summarize_containerA | Summarise a container: settings, workspaces and what is live. The quickest answer to "what is this container and what is it running". |
| list_all_containersA | List every container this user can reach, across every account. Answers "what do I have access to" in one call instead of one list_containers per account. An account that cannot be read is reported with its error rather than failing the whole call. |
| publish_workspaceA | Create a container version from a workspace, optionally publishing it. This is the Tag Manager release flow: a workspace becomes a version, and a version is published. Creating the version consumes the workspace either way. publish defaults to false. Passing true releases to the live site immediately, for every visitor -- confirm that is intended before setting it. A version that fails to compile is never published. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 112 tools
The consistent list/get/create/update/delete/revert pattern makes most tools clearly distinct by entity. However, version-related tools (get_version, get_live_version, get_latest_version_header, set_latest_version) and publish-related tools (publish_version, publish_workspace, create_version) could be confused at a glance, though their descriptions disambiguate them well.
Tool names follow a strict verb_noun convention throughout, with consistent CRUD verbs (list/get/create/update/delete/revert) applied per entity. Exceptions like lookup_container, quick_preview_workspace, and summarize_container are also verb-first and clear, so the pattern remains predictable.
112 tools is an extreme count, far beyond the 50+ threshold for a score of 1. While the Google Tag Manager API is broad, exposing full CRUD for a dozen entity types plus many convenience helpers results in an overwhelming surface that would be difficult for an agent to navigate efficiently.
The surface covers the full lifecycle across accounts, permissions, containers, environments, versions, workspaces, and every workspace entity type (tags, triggers, variables, folders, templates, clients, transformations, zones, gtag configs). Convenience tools for searching, summarizing, and bulk operations close most practical gaps.