Skip to main content
Glama

PixelFlow

Suggest triggers

suggest_triggers
Read-onlyIdempotent

Suggest the conversion triggers a site still needs: which events are tracked today, and one proposal per gap. It uses what PixelFlow knows about the site and the observations passed in; it does not load the website or read code. A url proposal carries arguments ready for create_trigger. An integration proposal carries connect arguments for get_connect_link. A click or submit proposal carries no create_trigger arguments: the agent builds them from the site's code, a connected builder's element data, or the live page in its own browser tool. When none of these yields the selector, call get_connect_link with the proposal's connect arguments, so the user picks the element on the website with the Visual Tagger. Refused until site setup has passed verify. Use it when setting up conversion tracking, or when the user asks what else they could track.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "site_id": "<site_id>"
    },
    "name": "suggest_triggers"
  }
}

Input Schema

NameRequiredDescriptionDefault
goalNoWhat a visitor does that earns the business money: buy a product, book a call or appointment, send a lead form, sign up, or donate. Omit when unknown; the result then includes a question to ask.
eventsNoLimit proposals to these events, such as Subscribe. Names are in list_supported_values's `events`.
site_idYesSite to act on, as returned by list_sites.
observationsNoForms, buttons, links, pages, or integrations the agent found in the site's code, on a page, or heard from the user. They decide which events are proposed and how; PixelFlow does not check them, and nothing in them is written to a trigger. Observations outrank what PixelFlow infers.

Output Schema

NameRequiredDescriptionDefault
goalYesGoal the proposals are for: the one passed, or the one PixelFlow could tell from the site. null when unknown.
coverageYesOne row per event recommended for the goal, plus any other event that already has a source.
questionYesWhen goal is null: a question to ask the user, then call again with goal.
proposalsYesWhat to set up, best first.
blocking_rulesYesRefresh protection to save: `when_it_fires`, `rule` (ready for save_blocking_rule).
rules_to_followYesHow to present and create the lines below; follow them. Empty when nothing applies.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / observations / items / properties / source / description
      Previous value: -"Where it was seen: in the site's code or a builder's element data (code), on a rendered page (page), or told by the user (user). Required. A form or button from code is a proposal for create_trigger; from page or user it is a Visual Tagger line with that page_path."New value: +"Where it was seen: in the site's code or a builder's element data (code), on the live page in the agent's browser tool (page), or told by the user (user). Required. A form or button from code or page is a proposal for create_trigger; from user it is a Visual Tagger line with that page_path."
    • changedOutput schema / properties / proposals / items / properties / connect / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "integration": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "With target integration: the integration to connect, such as stripe."
      -      },
      -      "page_path": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "With target visual_tagger: the page where the user picks the element. null when no page is known; ask the user for it."
      -      },
      -      "target": {
      -        "description": "integration: connect a third-party service. visual_tagger: the user picks the element on the website, because no code names it.",
      -        "enum": [
      -          "integration",
      -          "visual_tagger"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "target",
      -      "integration",
      -      "page_path"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "integration": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "With target integration: the integration to connect, such as stripe."
      +      },
      +      "page_path": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "With target visual_tagger: the page where the user picks the element. null when no page is known; ask the user for it."
      +      },
      +      "target": {
      +        "description": "integration: connect a third-party service. visual_tagger: the user picks the element on the website, because neither code nor a live page names it.",
      +        "enum": [
      +          "integration",
      +          "visual_tagger"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "target",
      +      "integration",
      +      "page_path"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  2. Changed43 schema fields changed
    • removedOutput schema / properties / coverage / items / properties / last_event / additionalProperties
      Removed value: -false
    • addedOutput schema / properties / coverage / items / properties / last_event / anyOf
      Added value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "at": {
      +        "format": "date-time",
      +        "type": "string"
      +      },
      +      "is_sent": {
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "at",
      +      "is_sent"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / coverage / items / properties / last_event / properties
      Removed value: -{
      -  "at": {
      -    "format": "date-time",
      -    "type": "string"
      -  },
      -  "is_sent": {
      -    "type": "boolean"
      -  }
      -}
    • removedOutput schema / properties / coverage / items / properties / last_event / required
      Removed value: -[
      -  "at",
      -  "is_sent"
      -]
    • removedOutput schema / properties / coverage / items / properties / last_event / type
      Removed value: -[
      -  "object",
      -  "null"
      -]
    • addedOutput schema / properties / coverage / items / properties / source / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / coverage / items / properties / source / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • addedOutput schema / properties / coverage / items / properties / when_it_fires / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / coverage / items / properties / when_it_fires / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • addedOutput schema / properties / goal / anyOf
      Added value: +[
      +  {
      +    "enum": [
      +      "buy",
      +      "book",
      +      "lead",
      +      "signup",
      +      "donate"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / goal / enum
      Removed value: -[
      -  "buy",
      -  "book",
      -  "lead",
      -  "signup",
      -  "donate",
      -  null
      -]
    • removedOutput schema / properties / goal / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • removedOutput schema / properties / proposals / items / properties / arguments / additionalProperties
      Removed value: -false
    • addedOutput schema / properties / proposals / items / properties / arguments / anyOf
      Added value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "event": {
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "url"
      +        ],
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": "string"
      +      },
      +      "url_params_mapping": {
      +        "additionalProperties": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "event",
      +      "url"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / proposals / items / properties / arguments / properties
      Removed value: -{
      -  "event": {
      -    "type": "string"
      -  },
      -  "type": {
      -    "enum": [
      -      "url"
      -    ],
      -    "type": "string"
      -  },
      -  "url": {
      -    "type": "string"
      -  },
      -  "url_params_mapping": {
      -    "additionalProperties": {
      -      "type": "string"
      -    },
      -    "type": "object"
      -  }
      -}
    • removedOutput schema / properties / proposals / items / properties / arguments / required
      Removed value: -[
      -  "type",
      -  "event",
      -  "url"
      -]
    • removedOutput schema / properties / proposals / items / properties / arguments / type
      Removed value: -[
      -  "object",
      -  "null"
      -]
    • removedOutput schema / properties / proposals / items / properties / conflict / additionalProperties
      Removed value: -false
    • addedOutput schema / properties / proposals / items / properties / conflict / anyOf
      Added value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "existing_source": {
      +        "type": "string"
      +      },
      +      "when_it_fires": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "existing_source",
      +      "when_it_fires"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / proposals / items / properties / conflict / properties
      Removed value: -{
      -  "existing_source": {
      -    "type": "string"
      -  },
      -  "when_it_fires": {
      -    "type": "string"
      -  }
      -}
    • removedOutput schema / properties / proposals / items / properties / conflict / required
      Removed value: -[
      -  "existing_source",
      -  "when_it_fires"
      -]
    • removedOutput schema / properties / proposals / items / properties / conflict / type
      Removed value: -[
      -  "object",
      -  "null"
      -]
    • removedOutput schema / properties / proposals / items / properties / connect / additionalProperties
      Removed value: -false
    • addedOutput schema / properties / proposals / items / properties / connect / anyOf
      Added value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "integration": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "With target integration: the integration to connect, such as stripe."
      +      },
      +      "page_path": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "With target visual_tagger: the page where the user picks the element. null when no page is known; ask the user for it."
      +      },
      +      "target": {
      +        "description": "integration: connect a third-party service. visual_tagger: the user picks the element on the website, because no code names it.",
      +        "enum": [
      +          "integration",
      +          "visual_tagger"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "target",
      +      "integration",
      +      "page_path"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / proposals / items / properties / connect / properties
      Removed value: -{
      -  "integration": {
      -    "description": "With target integration: the integration to connect, such as stripe.",
      -    "type": [
      -      "string",
      -      "null"
      -    ]
      -  },
      -  "page_path": {
      -    "description": "With target visual_tagger: the page where the user picks the element. null when no page is known; ask the user for it.",
      -    "type": [
      -      "string",
      -      "null"
      -    ]
      -  },
      -  "target": {
      -    "description": "integration: connect a third-party service. visual_tagger: the user picks the element on the website, because no code names it.",
      -    "enum": [
      -      "integration",
      -      "visual_tagger"
      -    ],
      -    "type": "string"
      -  }
      -}
    • removedOutput schema / properties / proposals / items / properties / connect / required
      Removed value: -[
      -  "target",
      -  "integration",
      -  "page_path"
      -]
    • removedOutput schema / properties / proposals / items / properties / connect / type
      Removed value: -[
      -  "object",
      -  "null"
      -]
    • addedOutput schema / properties / proposals / items / properties / evidence / properties / source / anyOf
      Added value: +[
      +  {
      +    "enum": [
      +      "code",
      +      "page",
      +      "user"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / proposals / items / properties / evidence / properties / source / enum
      Removed value: -[
      -  "code",
      -  "page",
      -  "user",
      -  null
      -]
    • removedOutput schema / properties / proposals / items / properties / evidence / properties / source / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • removedOutput schema / properties / proposals / items / properties / fallback / additionalProperties
      Removed value: -false
    • addedOutput schema / properties / proposals / items / properties / fallback / anyOf
      Added value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "arguments": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "event": {
      +                "type": "string"
      +              },
      +              "type": {
      +                "enum": [
      +                  "url"
      +                ],
      +                "type": "string"
      +              },
      +              "url": {
      +                "type": "string"
      +              },
      +              "url_params_mapping": {
      +                "additionalProperties": {
      +                  "type": "string"
      +                },
      +                "type": "object"
      +              }
      +            },
      +            "required": [
      +              "type",
      +              "event",
      +              "url"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "prefix_warning": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "type": {
      +        "type": "string"
      +      },
      +      "when_it_fires": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "when_it_fires",
      +      "prefix_warning",
      +      "arguments"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / proposals / items / properties / fallback / properties
      Removed value: -{
      -  "arguments": {
      -    "additionalProperties": false,
      -    "properties": {
      -      "event": {
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "url"
      -        ],
      -        "type": "string"
      -      },
      -      "url": {
      -        "type": "string"
      -      },
      -      "url_params_mapping": {
      -        "additionalProperties": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "event",
      -      "url"
      -    ],
      -    "type": [
      -      "object",
      -      "null"
      -    ]
      -  },
      -  "prefix_warning": {
      -    "type": [
      -      "string",
      -      "null"
      -    ]
      -  },
      -  "type": {
      -    "type": "string"
      -  },
      -  "when_it_fires": {
      -    "type": "string"
      -  }
      -}
    • removedOutput schema / properties / proposals / items / properties / fallback / required
      Removed value: -[
      -  "type",
      -  "when_it_fires",
      -  "prefix_warning",
      -  "arguments"
      -]
    • removedOutput schema / properties / proposals / items / properties / fallback / type
      Removed value: -[
      -  "object",
      -  "null"
      -]
    • addedOutput schema / properties / proposals / items / properties / message / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / proposals / items / properties / message / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • addedOutput schema / properties / proposals / items / properties / prefix_warning / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / proposals / items / properties / prefix_warning / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • addedOutput schema / properties / proposals / items / properties / type / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / proposals / items / properties / type / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • addedOutput schema / properties / question / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / question / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
  3. Changed12 schema fields changed
    • removedInput schema / properties / event_types
      Removed value: -{
      -  "description": "Standard event types to limit the steps, such as Subscribe. Omit for the whole flow",
      -  "items": {
      -    "type": "string"
      -  },
      -  "type": "array"
      -}
    • addedInput schema / properties / events
      Added value: +{
      +  "description": "Limit proposals to these events, such as Subscribe. Names are in list_supported_values's `events`.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • removedInput schema / properties / flow
      Removed value: -{
      -  "description": "buy, book, send a form, sign up, or donate. Omit when you do not know yet",
      -  "type": "string"
      -}
    • addedInput schema / properties / goal
      Added value: +{
      +  "description": "What a visitor does that earns the business money: buy a product, book a call or appointment, send a lead form, sign up, or donate. Omit when unknown; the result then includes a question to ask.",
      +  "enum": [
      +    "buy",
      +    "book",
      +    "lead",
      +    "signup",
      +    "donate"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / observations / description
      Previous value: -"Findings from code or the rendered page. kind is form, button, link, route, or integration. Include path, selector, text, fields, provider, in_iframe, and source { kind: code | page | user, ref }. View-source is not a source. Omit when you have not looked"New value: +"Forms, buttons, links, pages, or integrations the agent found in the site's code, on a page, or heard from the user. They decide which events are proposed and how; PixelFlow does not check them, and nothing in them is written to a trigger. Observations outrank what PixelFlow infers."
    • changedInput schema / properties / observations / items / additionalProperties
      Previous value: -trueNew value: +false
    • addedInput schema / properties / observations / items / properties
      Added value: +{
      +  "form_fields": {
      +    "description": "Input names or labels on a form, such as email, phone. A hint for naming the event; they are not written to the trigger.",
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  "is_in_iframe": {
      +    "description": "Whether the element is inside an iframe. The script cannot see inside one, so such a form comes back as an add_code proposal.",
      +    "type": "boolean"
      +  },
      +  "page_path": {
      +    "description": "Path part of the page URL, such as /contact: the page where the form, button, or link lives. For the page observation type, the page path itself. Query values are dropped.",
      +    "type": "string"
      +  },
      +  "provider": {
      +    "description": "Third-party provider of an integration or an embedded form, such as calendly or typeform.",
      +    "type": "string"
      +  },
      +  "source": {
      +    "description": "Where it was seen: in the site's code or a builder's element data (code), on a rendered page (page), or told by the user (user). Required. A form or button from code is a proposal for create_trigger; from page or user it is a Visual Tagger line with that page_path.",
      +    "enum": [
      +      "code",
      +      "page",
      +      "user"
      +    ],
      +    "type": "string"
      +  },
      +  "text": {
      +    "description": "Visible label of a form's submit control, a button, or a link. A hint for naming the event, such as \"Book a demo\"; it is not compared with the page.",
      +    "type": "string"
      +  },
      +  "type": {
      +    "description": "What was found. page: a page of the site, such as a thank-you page, given in page_path.",
      +    "enum": [
      +      "form",
      +      "button",
      +      "link",
      +      "page",
      +      "integration"
      +    ],
      +    "type": "string"
      +  }
      +}
    • addedInput schema / properties / observations / items / required
      Added value: +[
      +  "type",
      +  "source"
      +]
    • removedInput schema / properties / site
      Removed value: -{
      -  "description": "Domain, id, or external id from list_sites",
      -  "type": "string"
      -}
    • addedInput schema / properties / site_id
      Added value: +{
      +  "description": "Site to act on, as returned by list_sites.",
      +  "type": "integer"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "site"
      -]New value: +[
      +  "site_id"
      +]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "blocking_rules": {
      +      "description": "Refresh protection to save: `when_it_fires`, `rule` (ready for save_blocking_rule).",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "rule": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "groups": {
      +                "items": {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "conditions": {
      +                      "items": {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "interval_in_seconds": {
      +                            "type": "integer"
      +                          },
      +                          "type": {
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "type",
      +                          "interval_in_seconds"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "type": "array"
      +                    }
      +                  },
      +                  "required": [
      +                    "conditions"
      +                  ],
      +                  "type": "object"
      +                },
      +                "type": "array"
      +              },
      +              "mode": {
      +                "enum": [
      +                  "block"
      +                ],
      +                "type": "string"
      +              },
      +              "target": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "target",
      +              "mode",
      +              "groups"
      +            ],
      +            "type": "object"
      +          },
      +          "when_it_fires": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "when_it_fires",
      +          "rule"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "coverage": {
      +      "description": "One row per event recommended for the goal, plus any other event that already has a source.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "event": {
      +            "description": "Event, such as Lead.",
      +            "type": "string"
      +          },
      +          "last_event": {
      +            "additionalProperties": false,
      +            "description": "Latest event received: `at` (date-time) and `is_sent` (boolean). null when none was received recently.",
      +            "properties": {
      +              "at": {
      +                "format": "date-time",
      +                "type": "string"
      +              },
      +              "is_sent": {
      +                "type": "boolean"
      +              }
      +            },
      +            "required": [
      +              "at",
      +              "is_sent"
      +            ],
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "source": {
      +            "description": "What sends it today, such as a submit trigger, stripe, or the platform. null when nothing does.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "status": {
      +            "description": "covered: something sends it today. proposed: a proposal below would send it. gap: recommended for the goal, but nothing can be proposed.",
      +            "enum": [
      +              "covered",
      +              "proposed",
      +              "gap"
      +            ],
      +            "type": "string"
      +          },
      +          "when_it_fires": {
      +            "description": "When that source sends it.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "event",
      +          "status",
      +          "source",
      +          "when_it_fires",
      +          "last_event"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "goal": {
      +      "description": "Goal the proposals are for: the one passed, or the one PixelFlow could tell from the site. null when unknown.",
      +      "enum": [
      +        "buy",
      +        "book",
      +        "lead",
      +        "signup",
      +        "donate",
      +        null
      +      ],
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "proposals": {
      +      "description": "What to set up, best first.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "action": {
      +            "description": "The action the agent performs for an approved proposal. create_trigger: create the trigger. get_connect_link: call it with the arguments in the connect field and show the link with the instructions. add_code: no trigger can track it; make the code change yourself or ask the user, as the message field says.",
      +            "enum": [
      +              "create_trigger",
      +              "get_connect_link",
      +              "add_code"
      +            ],
      +            "type": "string"
      +          },
      +          "arguments": {
      +            "additionalProperties": false,
      +            "description": "url type only: arguments for create_trigger (`type`, `event`, `url`, and `url_params_mapping` when the page URL carries customer data); add site_id and an idempotency_key. null for every other line.",
      +            "properties": {
      +              "event": {
      +                "type": "string"
      +              },
      +              "type": {
      +                "enum": [
      +                  "url"
      +                ],
      +                "type": "string"
      +              },
      +              "url": {
      +                "type": "string"
      +              },
      +              "url_params_mapping": {
      +                "additionalProperties": {
      +                  "type": "string"
      +                },
      +                "type": "object"
      +              }
      +            },
      +            "required": [
      +              "type",
      +              "event",
      +              "url"
      +            ],
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "conflict": {
      +            "additionalProperties": false,
      +            "description": "The event already has a source: `existing_source`, `when_it_fires`.",
      +            "properties": {
      +              "existing_source": {
      +                "type": "string"
      +              },
      +              "when_it_fires": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "existing_source",
      +              "when_it_fires"
      +            ],
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "connect": {
      +            "additionalProperties": false,
      +            "description": "Arguments for get_connect_link. Set when action is get_connect_link, null otherwise.",
      +            "properties": {
      +              "integration": {
      +                "description": "With target integration: the integration to connect, such as stripe.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "page_path": {
      +                "description": "With target visual_tagger: the page where the user picks the element. null when no page is known; ask the user for it.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "target": {
      +                "description": "integration: connect a third-party service. visual_tagger: the user picks the element on the website, because no code names it.",
      +                "enum": [
      +                  "integration",
      +                  "visual_tagger"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "target",
      +              "integration",
      +              "page_path"
      +            ],
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "docs": {
      +            "description": "Help articles: `title` (string) and `url` (string, uri).",
      +            "items": {
      +              "additionalProperties": false,
      +              "properties": {
      +                "title": {
      +                  "type": "string"
      +                },
      +                "url": {
      +                  "format": "uri",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "title",
      +                "url"
      +              ],
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "event": {
      +            "description": "Event the trigger would send, such as Lead.",
      +            "type": "string"
      +          },
      +          "evidence": {
      +            "additionalProperties": false,
      +            "description": "Why the event was proposed.",
      +            "properties": {
      +              "note": {
      +                "description": "The evidence in one sentence, such as \"Form with an email field at /contact\".",
      +                "type": "string"
      +              },
      +              "source": {
      +                "description": "With type observation: that observation's source. null otherwise.",
      +                "enum": [
      +                  "code",
      +                  "page",
      +                  "user",
      +                  null
      +                ],
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "type": {
      +                "description": "site_facts: what PixelFlow knows about the site, such as its platform or a connected integration. observation: an observation passed in this call. observed_path: a page visitors reached recently, such as /thank-you.",
      +                "enum": [
      +                  "site_facts",
      +                  "observation",
      +                  "observed_path"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "type",
      +              "note",
      +              "source"
      +            ],
      +            "type": "object"
      +          },
      +          "fallback": {
      +            "additionalProperties": false,
      +            "description": "Next-best way to track the same event, a url trigger on a page the site is known to have: `type`, `when_it_fires`, `prefix_warning`, and `arguments` (same shape as above).",
      +            "properties": {
      +              "arguments": {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "event": {
      +                    "type": "string"
      +                  },
      +                  "type": {
      +                    "enum": [
      +                      "url"
      +                    ],
      +                    "type": "string"
      +                  },
      +                  "url": {
      +                    "type": "string"
      +                  },
      +                  "url_params_mapping": {
      +                    "additionalProperties": {
      +                      "type": "string"
      +                    },
      +                    "type": "object"
      +                  }
      +                },
      +                "required": [
      +                  "type",
      +                  "event",
      +                  "url"
      +                ],
      +                "type": [
      +                  "object",
      +                  "null"
      +                ]
      +              },
      +              "prefix_warning": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "type": {
      +                "type": "string"
      +              },
      +              "when_it_fires": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "type",
      +              "when_it_fires",
      +              "prefix_warning",
      +              "arguments"
      +            ],
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "message": {
      +            "description": "With action add_code: why no trigger can track the event and how to send it from the site's code instead, such as trackEvent from the Programmatic Tracking API for a form inside an iframe.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "prefix_warning": {
      +            "description": "url type only: other pages of this site the url would also match, because a url trigger matches the path as a prefix, such as /thank-you also matching /thank-you-newsletter. Tell the user before creating it. null when no page shares the prefix.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "type": {
      +            "description": "Type of the trigger to set up: url, click, submit, or an integration name, as in list_triggers. null on an add_code line, which has no trigger.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "when_it_fires": {
      +            "description": "When the event is sent, in one sentence.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "event",
      +          "type",
      +          "action",
      +          "when_it_fires",
      +          "arguments",
      +          "connect",
      +          "message",
      +          "evidence",
      +          "prefix_warning",
      +          "fallback",
      +          "conflict",
      +          "docs"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "question": {
      +      "description": "When goal is null: a question to ask the user, then call again with goal.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "rules_to_follow": {
      +      "description": "How to present and create the lines below; follow them. Empty when nothing applies.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "rules_to_follow",
      +    "goal",
      +    "question",
      +    "coverage",
      +    "proposals",
      +    "blocking_rules"
      +  ],
      +  "type": "object"
      +}
  4. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses that the tool does not load the website or read code, that it is blocked until verify passes, and that observations outrank inferred data and are never written to a trigger. It also explains why iframe forms come back as add_code proposals, which is behavior not inferable from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence front-loads the core purpose and the remainder is organized by proposal type and prerequisite. It is dense but nearly every sentence carries routing or behavioral information; some of the proposal-type walkthrough could be trimmed given the output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description supplies exactly the missing glue: what each proposal variant means operationally and which sibling to call next. Combined with the verify prerequisite and the 'no selector -> connect link' fallback, an agent has everything needed to invoke and act on the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description adds meaning by explaining that observations determine which events are proposed and how, and that proposals' argument payloads depend on observation type and source. It stops short of adding per-parameter detail beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it suggests conversion triggers a site still needs, naming the two outputs (events tracked today, one proposal per gap). It explicitly distinguishes itself from the write siblings create_trigger and get_connect_link by describing how their arguments are carried in proposals rather than executed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit triggers for use ('when setting up conversion tracking, or when the user asks what else they could track') and a hard prerequisite ('Refused until site setup has passed verify'). It also routes the agent through a decision tree: url proposal -> create_trigger, integration proposal -> get_connect_link, click/submit with no selector -> get_connect_link with the Visual Tagger.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.