Skip to main content
Glama
ambit1977

Google Tag Manager MCP Server

by ambit1977

update_trigger

Modify existing triggers in Google Tag Manager by updating settings like filters, event conditions, and timing parameters to refine when tags fire.

Instructions

既存のトリガーを更新します。filter、autoEventFilter、waitForTagsなどのすべての設定を更新できます。

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
accountIdYesアカウントID
containerIdYesコンテナID
workspaceIdYesワークスペースID
triggerIdYesトリガーID
nameNoトリガー名
typeNoトリガータイプ
customEventFilterNoカスタムイベントフィルタ(CUSTOM_EVENTタイプ用)
filterNoフィルタ(linkClick、clickなどのタイプ用)
autoEventFilterNo自動イベントフィルタ(linkClickタイプ用)
waitForTagsNoタグの待機を有効化(linkClickタイプ用)
checkValidationNoバリデーションチェック(linkClickタイプ用)
waitForTagsTimeoutNoタグ待機タイムアウト(ミリ秒、linkClickタイプ用)
formIdNoフォームID(formSubmissionタイプ用)
formClassesNoフォームクラス(formSubmissionタイプ用)
verticalThresholdNo垂直スクロール閾値(パーセント、scrollDepthタイプ用)
horizontalThresholdNo水平スクロール閾値(パーセント、scrollDepthタイプ用)
selectorNoCSSセレクタ(elementVisibilityタイプ用)
visiblePercentageThresholdNo表示割合閾値(パーセント、elementVisibilityタイプ用)
continuousTimeMinMillisecondsNo連続表示時間(ミリ秒、elementVisibilityタイプ用)
videoIdNoYouTube動画ID(youtubeVideoタイプ用)
enableTriggerOnVideoStartNo動画開始時に発火(youtubeVideoタイプ用)
enableTriggerOnVideoProgressNo動画再生中に発火(youtubeVideoタイプ用)
enableTriggerOnVideoCompleteNo動画完了時に発火(youtubeVideoタイプ用)
enableTriggerOnVideoPauseNo動画一時停止時に発火(youtubeVideoタイプ用)
enableTriggerOnVideoSeekNo動画シーク時に発火(youtubeVideoタイプ用)
intervalNoインターバル(ミリ秒、timerタイプ用)
limitNo発火回数の上限(timerタイプ用)
startTimerOnNoタイマー開始タイミング(timerタイプ用、例: "windowLoad", "domReady")

Implementation Reference

  • MCP tool handler for 'update_trigger'. Fetches existing trigger data, merges with provided arguments handling special logic for different trigger types (e.g., formSubmission, scrollDepth), preserves fingerprint, and calls GTMClient.updateTrigger to perform the API update.
    case 'update_trigger': {
      // 既存のトリガーデータを取得
      const existingTrigger = await this.gtmClient.getTrigger(
        args.accountId,
        args.containerId,
        args.workspaceId,
        args.triggerId
      );
    
      // 更新データを構築(指定されたパラメータで上書き)
      const triggerData = {
        name: args.name !== undefined ? args.name : existingTrigger.name,
        type: args.type !== undefined ? args.type : existingTrigger.type,
      };
    
      // カスタムイベントフィルタ
      if (args.customEventFilter !== undefined) {
        triggerData.customEventFilter = args.customEventFilter;
      } else if (existingTrigger.customEventFilter) {
        triggerData.customEventFilter = existingTrigger.customEventFilter;
      }
    
      // フィルタ
      if (args.filter !== undefined) {
        triggerData.filter = args.filter;
      } else if (existingTrigger.filter) {
        triggerData.filter = existingTrigger.filter;
      }
    
      // 自動イベントフィルタ
      if (args.autoEventFilter !== undefined) {
        triggerData.autoEventFilter = args.autoEventFilter;
      } else if (existingTrigger.autoEventFilter) {
        triggerData.autoEventFilter = existingTrigger.autoEventFilter;
      }
    
      // タグ待機設定
      if (args.waitForTags !== undefined) {
        triggerData.waitForTags = {
          type: 'boolean',
          value: args.waitForTags
        };
      } else if (existingTrigger.waitForTags) {
        triggerData.waitForTags = existingTrigger.waitForTags;
      }
    
      // バリデーションチェック
      if (args.checkValidation !== undefined) {
        triggerData.checkValidation = {
          type: 'boolean',
          value: args.checkValidation
        };
      } else if (existingTrigger.checkValidation) {
        triggerData.checkValidation = existingTrigger.checkValidation;
      }
    
      // タグ待機タイムアウト
      if (args.waitForTagsTimeout !== undefined) {
        triggerData.waitForTagsTimeout = {
          type: 'template',
          value: String(args.waitForTagsTimeout)
        };
      } else if (existingTrigger.waitForTagsTimeout) {
        triggerData.waitForTagsTimeout = existingTrigger.waitForTagsTimeout;
      }
    
      // formSubmission用の処理
      if (triggerData.type === 'formSubmission') {
        if (args.formId !== undefined || args.formClasses !== undefined) {
          triggerData.filter = [];
          if (args.formId !== undefined) {
            triggerData.filter.push({
              type: 'contains',
              parameter: [
                {
                  type: 'template',
                  key: 'arg0',
                  value: '{{Form ID}}'
                },
                {
                  type: 'template',
                  key: 'arg1',
                  value: args.formId
                }
              ]
            });
          } else if (existingTrigger.filter) {
            // 既存のForm IDフィルタを保持
            const formIdFilter = existingTrigger.filter.find(f => 
              f.parameter?.some(p => p.value === '{{Form ID}}')
            );
            if (formIdFilter) {
              triggerData.filter.push(formIdFilter);
            }
          }
          if (args.formClasses !== undefined) {
            triggerData.filter.push({
              type: 'contains',
              parameter: [
                {
                  type: 'template',
                  key: 'arg0',
                  value: '{{Form Classes}}'
                },
                {
                  type: 'template',
                  key: 'arg1',
                  value: args.formClasses
                }
              ]
            });
          } else if (existingTrigger.filter) {
            // 既存のForm Classesフィルタを保持
            const formClassesFilter = existingTrigger.filter.find(f => 
              f.parameter?.some(p => p.value === '{{Form Classes}}')
            );
            if (formClassesFilter) {
              triggerData.filter.push(formClassesFilter);
            }
          }
        } else if (existingTrigger.filter) {
          triggerData.filter = existingTrigger.filter;
        }
      }
    
      // scrollDepth用の処理
      if (triggerData.type === 'scrollDepth') {
        if (args.verticalThreshold !== undefined || args.horizontalThreshold !== undefined) {
          triggerData.parameter = [
            {
              type: 'template',
              key: 'verticalThresholdUnits',
              value: 'PERCENT'
            },
            {
              type: 'template',
              key: 'verticalThreshold',
              value: String(args.verticalThreshold !== undefined ? args.verticalThreshold : 
                (existingTrigger.parameter?.find(p => p.key === 'verticalThreshold')?.value || 25))
            }
          ];
          if (args.horizontalThreshold !== undefined) {
            triggerData.parameter.push(
              {
                type: 'template',
                key: 'horizontalThresholdUnits',
                value: 'PERCENT'
              },
              {
                type: 'template',
                key: 'horizontalThreshold',
                value: String(args.horizontalThreshold)
              }
            );
          } else if (existingTrigger.parameter) {
            const horizontalThreshold = existingTrigger.parameter.find(p => p.key === 'horizontalThreshold');
            if (horizontalThreshold) {
              triggerData.parameter.push(
                {
                  type: 'template',
                  key: 'horizontalThresholdUnits',
                  value: 'PERCENT'
                },
                horizontalThreshold
              );
            }
          }
        } else if (existingTrigger.parameter) {
          triggerData.parameter = existingTrigger.parameter;
        }
      }
    
      // elementVisibility用の処理
      if (triggerData.type === 'visible' || triggerData.type === 'elementVisibility') {
        triggerData.type = 'visible';
        if (args.selector !== undefined || args.visiblePercentageThreshold !== undefined || args.continuousTimeMinMilliseconds !== undefined) {
          triggerData.parameter = [
            {
              type: 'template',
              key: 'selector',
              value: args.selector !== undefined ? args.selector : 
                (existingTrigger.parameter?.find(p => p.key === 'selector')?.value || '')
            },
            {
              type: 'template',
              key: 'visiblePercentageThreshold',
              value: String(args.visiblePercentageThreshold !== undefined ? args.visiblePercentageThreshold :
                (existingTrigger.parameter?.find(p => p.key === 'visiblePercentageThreshold')?.value || 50))
            },
            {
              type: 'template',
              key: 'continuousTimeMinMilliseconds',
              value: String(args.continuousTimeMinMilliseconds !== undefined ? args.continuousTimeMinMilliseconds :
                (existingTrigger.parameter?.find(p => p.key === 'continuousTimeMinMilliseconds')?.value || 0))
            }
          ];
        } else if (existingTrigger.parameter) {
          triggerData.parameter = existingTrigger.parameter;
        }
      }
    
      // youtubeVideo用の処理
      if (triggerData.type === 'youtubeVideo') {
        if (args.enableTriggerOnVideoStart !== undefined || args.enableTriggerOnVideoProgress !== undefined ||
            args.enableTriggerOnVideoComplete !== undefined || args.enableTriggerOnVideoPause !== undefined ||
            args.enableTriggerOnVideoSeek !== undefined || args.videoId !== undefined) {
          triggerData.parameter = [
            {
              type: 'template',
              key: 'enableTriggerOnVideoStart',
              value: String(args.enableTriggerOnVideoStart !== undefined ? args.enableTriggerOnVideoStart :
                (existingTrigger.parameter?.find(p => p.key === 'enableTriggerOnVideoStart')?.value || false))
            },
            {
              type: 'template',
              key: 'enableTriggerOnVideoProgress',
              value: String(args.enableTriggerOnVideoProgress !== undefined ? args.enableTriggerOnVideoProgress :
                (existingTrigger.parameter?.find(p => p.key === 'enableTriggerOnVideoProgress')?.value || false))
            },
            {
              type: 'template',
              key: 'enableTriggerOnVideoComplete',
              value: String(args.enableTriggerOnVideoComplete !== undefined ? args.enableTriggerOnVideoComplete :
                (existingTrigger.parameter?.find(p => p.key === 'enableTriggerOnVideoComplete')?.value || false))
            },
            {
              type: 'template',
              key: 'enableTriggerOnVideoPause',
              value: String(args.enableTriggerOnVideoPause !== undefined ? args.enableTriggerOnVideoPause :
                (existingTrigger.parameter?.find(p => p.key === 'enableTriggerOnVideoPause')?.value || false))
            },
            {
              type: 'template',
              key: 'enableTriggerOnVideoSeek',
              value: String(args.enableTriggerOnVideoSeek !== undefined ? args.enableTriggerOnVideoSeek :
                (existingTrigger.parameter?.find(p => p.key === 'enableTriggerOnVideoSeek')?.value || false))
            }
          ];
          if (args.videoId !== undefined) {
            triggerData.filter = [
              {
                type: 'equals',
                parameter: [
                  {
                    type: 'template',
                    key: 'arg0',
                    value: '{{Video ID}}'
                  },
                  {
                    type: 'template',
                    key: 'arg1',
                    value: args.videoId
                  }
                ]
              }
            ];
          } else if (existingTrigger.filter) {
            triggerData.filter = existingTrigger.filter;
          }
        } else {
          if (existingTrigger.parameter) {
            triggerData.parameter = existingTrigger.parameter;
          }
          if (existingTrigger.filter) {
            triggerData.filter = existingTrigger.filter;
          }
        }
      }
    
      // timer用の処理
      if (triggerData.type === 'timer') {
        if (args.interval !== undefined || args.limit !== undefined || args.startTimerOn !== undefined) {
          triggerData.parameter = [
            {
              type: 'template',
              key: 'interval',
              value: String(args.interval !== undefined ? args.interval :
                (existingTrigger.parameter?.find(p => p.key === 'interval')?.value || 1000))
            },
            {
              type: 'template',
              key: 'limit',
              value: String(args.limit !== undefined ? args.limit :
                (existingTrigger.parameter?.find(p => p.key === 'limit')?.value || 1))
            },
            {
              type: 'template',
              key: 'startTimerOn',
              value: args.startTimerOn !== undefined ? args.startTimerOn :
                (existingTrigger.parameter?.find(p => p.key === 'startTimerOn')?.value || 'windowLoad')
            }
          ];
        } else if (existingTrigger.parameter) {
          triggerData.parameter = existingTrigger.parameter;
        }
      }
    
      // その他のタイプのパラメータを保持
      if (!triggerData.parameter && existingTrigger.parameter) {
        triggerData.parameter = existingTrigger.parameter;
      }
    
      // fingerprintを保持(更新に必要)
      if (existingTrigger.fingerprint) {
        triggerData.fingerprint = existingTrigger.fingerprint;
      }
    
      return {
        content: [
          {
            type: 'text',
            text: JSON.stringify(
              await this.gtmClient.updateTrigger(
                args.accountId,
                args.containerId,
                args.workspaceId,
                args.triggerId,
                triggerData
              ),
              null,
              2
            ),
          },
        ],
      };
    }
  • Input schema definition for the 'update_trigger' tool, defining parameters for GTM trigger update including IDs and type-specific configurations.
    inputSchema: {
      type: 'object',
      properties: {
        accountId: {
          type: 'string',
          description: 'アカウントID',
        },
        containerId: {
          type: 'string',
          description: 'コンテナID',
        },
        workspaceId: {
          type: 'string',
          description: 'ワークスペースID',
        },
        triggerId: {
          type: 'string',
          description: 'トリガーID',
        },
        name: {
          type: 'string',
          description: 'トリガー名',
        },
        type: {
          type: 'string',
          description: 'トリガータイプ',
        },
        customEventFilter: {
          type: 'array',
          description: 'カスタムイベントフィルタ(CUSTOM_EVENTタイプ用)',
        },
        filter: {
          type: 'array',
          description: 'フィルタ(linkClick、clickなどのタイプ用)',
        },
        autoEventFilter: {
          type: 'array',
          description: '自動イベントフィルタ(linkClickタイプ用)',
        },
        waitForTags: {
          type: 'boolean',
          description: 'タグの待機を有効化(linkClickタイプ用)',
        },
        checkValidation: {
          type: 'boolean',
          description: 'バリデーションチェック(linkClickタイプ用)',
        },
        waitForTagsTimeout: {
          type: 'number',
          description: 'タグ待機タイムアウト(ミリ秒、linkClickタイプ用)',
        },
        // formSubmission用
        formId: {
          type: 'string',
          description: 'フォームID(formSubmissionタイプ用)',
        },
        formClasses: {
          type: 'string',
          description: 'フォームクラス(formSubmissionタイプ用)',
        },
        // scrollDepth用
        verticalThreshold: {
          type: 'number',
          description: '垂直スクロール閾値(パーセント、scrollDepthタイプ用)',
        },
        horizontalThreshold: {
          type: 'number',
          description: '水平スクロール閾値(パーセント、scrollDepthタイプ用)',
        },
        // elementVisibility用
        selector: {
          type: 'string',
          description: 'CSSセレクタ(elementVisibilityタイプ用)',
        },
        visiblePercentageThreshold: {
          type: 'number',
          description: '表示割合閾値(パーセント、elementVisibilityタイプ用)',
        },
        continuousTimeMinMilliseconds: {
          type: 'number',
          description: '連続表示時間(ミリ秒、elementVisibilityタイプ用)',
        },
        // youtubeVideo用
        videoId: {
          type: 'string',
          description: 'YouTube動画ID(youtubeVideoタイプ用)',
        },
        enableTriggerOnVideoStart: {
          type: 'boolean',
          description: '動画開始時に発火(youtubeVideoタイプ用)',
        },
        enableTriggerOnVideoProgress: {
          type: 'boolean',
          description: '動画再生中に発火(youtubeVideoタイプ用)',
        },
        enableTriggerOnVideoComplete: {
          type: 'boolean',
          description: '動画完了時に発火(youtubeVideoタイプ用)',
        },
        enableTriggerOnVideoPause: {
          type: 'boolean',
          description: '動画一時停止時に発火(youtubeVideoタイプ用)',
        },
        enableTriggerOnVideoSeek: {
          type: 'boolean',
          description: '動画シーク時に発火(youtubeVideoタイプ用)',
        },
        // timer用
        interval: {
          type: 'number',
          description: 'インターバル(ミリ秒、timerタイプ用)',
        },
        limit: {
          type: 'number',
          description: '発火回数の上限(timerタイプ用)',
        },
        startTimerOn: {
          type: 'string',
          description: 'タイマー開始タイミング(timerタイプ用、例: "windowLoad", "domReady")',
        },
      },
      required: ['accountId', 'containerId', 'workspaceId', 'triggerId'],
    },
  • src/index.js:405-531 (registration)
    Tool registration in the ListToolsRequest handler, defining name, description, and schema for 'update_trigger'.
    {
      name: 'update_trigger',
      description: '既存のトリガーを更新します。filter、autoEventFilter、waitForTagsなどのすべての設定を更新できます。',
      inputSchema: {
        type: 'object',
        properties: {
          accountId: {
            type: 'string',
            description: 'アカウントID',
          },
          containerId: {
            type: 'string',
            description: 'コンテナID',
          },
          workspaceId: {
            type: 'string',
            description: 'ワークスペースID',
          },
          triggerId: {
            type: 'string',
            description: 'トリガーID',
          },
          name: {
            type: 'string',
            description: 'トリガー名',
          },
          type: {
            type: 'string',
            description: 'トリガータイプ',
          },
          customEventFilter: {
            type: 'array',
            description: 'カスタムイベントフィルタ(CUSTOM_EVENTタイプ用)',
          },
          filter: {
            type: 'array',
            description: 'フィルタ(linkClick、clickなどのタイプ用)',
          },
          autoEventFilter: {
            type: 'array',
            description: '自動イベントフィルタ(linkClickタイプ用)',
          },
          waitForTags: {
            type: 'boolean',
            description: 'タグの待機を有効化(linkClickタイプ用)',
          },
          checkValidation: {
            type: 'boolean',
            description: 'バリデーションチェック(linkClickタイプ用)',
          },
          waitForTagsTimeout: {
            type: 'number',
            description: 'タグ待機タイムアウト(ミリ秒、linkClickタイプ用)',
          },
          // formSubmission用
          formId: {
            type: 'string',
            description: 'フォームID(formSubmissionタイプ用)',
          },
          formClasses: {
            type: 'string',
            description: 'フォームクラス(formSubmissionタイプ用)',
          },
          // scrollDepth用
          verticalThreshold: {
            type: 'number',
            description: '垂直スクロール閾値(パーセント、scrollDepthタイプ用)',
          },
          horizontalThreshold: {
            type: 'number',
            description: '水平スクロール閾値(パーセント、scrollDepthタイプ用)',
          },
          // elementVisibility用
          selector: {
            type: 'string',
            description: 'CSSセレクタ(elementVisibilityタイプ用)',
          },
          visiblePercentageThreshold: {
            type: 'number',
            description: '表示割合閾値(パーセント、elementVisibilityタイプ用)',
          },
          continuousTimeMinMilliseconds: {
            type: 'number',
            description: '連続表示時間(ミリ秒、elementVisibilityタイプ用)',
          },
          // youtubeVideo用
          videoId: {
            type: 'string',
            description: 'YouTube動画ID(youtubeVideoタイプ用)',
          },
          enableTriggerOnVideoStart: {
            type: 'boolean',
            description: '動画開始時に発火(youtubeVideoタイプ用)',
          },
          enableTriggerOnVideoProgress: {
            type: 'boolean',
            description: '動画再生中に発火(youtubeVideoタイプ用)',
          },
          enableTriggerOnVideoComplete: {
            type: 'boolean',
            description: '動画完了時に発火(youtubeVideoタイプ用)',
          },
          enableTriggerOnVideoPause: {
            type: 'boolean',
            description: '動画一時停止時に発火(youtubeVideoタイプ用)',
          },
          enableTriggerOnVideoSeek: {
            type: 'boolean',
            description: '動画シーク時に発火(youtubeVideoタイプ用)',
          },
          // timer用
          interval: {
            type: 'number',
            description: 'インターバル(ミリ秒、timerタイプ用)',
          },
          limit: {
            type: 'number',
            description: '発火回数の上限(timerタイプ用)',
          },
          startTimerOn: {
            type: 'string',
            description: 'タイマー開始タイミング(timerタイプ用、例: "windowLoad", "domReady")',
          },
        },
        required: ['accountId', 'containerId', 'workspaceId', 'triggerId'],
      },
    },
  • GTMClient helper method that performs the actual Google Tag Manager API update for a trigger using the googleapis library.
    async updateTrigger(accountId, containerId, workspaceId, triggerId, triggerData) {
      await this.ensureAuth();
      const response = await this.tagmanager.accounts.containers.workspaces.triggers.update({
        path: `accounts/${accountId}/containers/${containerId}/workspaces/${workspaceId}/triggers/${triggerId}`,
        requestBody: triggerData
      });
      return response.data;
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ambit1977/GTM-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server