Skip to main content
Glama
PiwikPRO

Piwik PRO MCP Server

Official
by PiwikPRO

🤖 Piwik PRO MCP Server (beta)

A Model Context Protocol (MCP) server built with the official MCP Python SDK that lets you control Piwik PRO Analytics resources.

🎇 Features

💬 Query API — Have a conversation with your analytics data

Turn questions into insights. The Query API lets you explore your analytics data using natural language. Ask about visitors, page views, conversions, and more without navigating complex dashboards or building reports manually.

  • Run flexible queries with custom date ranges and filters

  • Discover available dimensions and metrics

  • Get answers to analytics questions in seconds

📊 Manage Analytics

Keep your analytics setup organized without leaving your the conversation with your AI assistant:

  • Annotations — Add notes to mark important events, campaigns, or changes

  • Goals — Set up and manage conversion tracking

  • Custom dimensions — Extend your tracking with custom data points

🏷️ Control Tag Manager

Manage your tracking setup without touching your website code:

  • Tags — Create and configure tracking tags

  • Triggers — Define when and where tags fire

  • Variables — Store and reuse dynamic values

  • Version control — Publish changes when you're ready

🎯 Build audiences with Data Activation (DA)

Build and manage your audience segments:

  • Create targeted audiences based on user behavior

  • Update segmentation rules in real time

⚙️ Configuration and settings

Fine-tune your Piwik PRO setup:

  • App management — Organize your sites and apps

  • Tracker settings — Configure tracking behavior globally or for each app

  • Container settings — Access installation code and container configuration

Related MCP server: Google Webmaster MCP

🚀 Quickstart

Go to your account's API credentials page: https://ACCOUNT.piwik.pro/profile/api-credentials, then generate new credentials.

You will need these three variables for the MCP configuration:

  • PIWIK_PRO_HOST - Your piwik host, ACCOUNT.piwik.pro

  • PIWIK_PRO_CLIENT_ID - Client ID

  • PIWIK_PRO_CLIENT_SECRET - Client Secret

MCP Client configuration

All of these MCP clients use a JSON file to store the MCP configuration. The file name and location vary by client.

  • Claude Desktop

    • Go to Settings -> Developer -> Edit Configto open the folder containing claude_desktop_config.json.

    • Apply one of the snippets from below.

    • Restart the application.

  • Cursor - The official documentation

  • Claude Code - The official documentation

To use Piwik PRO MCP server, you need to install uv or docker.

Copy the configuration of your preferred option and enter the required environment variables.

Option #1 - UV

If you don't have uv, check the official installation guide.

{
  "mcpServers": {
    "piwik-pro-analytics": {
      "command": "uvx",
      "args": ["piwik-pro-mcp"],
      "env": {
        "PIWIK_PRO_HOST": "ACCOUNT.piwik.pro",
        "PIWIK_PRO_CLIENT_ID": "CLIENT_ID",
        "PIWIK_PRO_CLIENT_SECRET": "CLIENT_SECRET"
      }
    }
  }
}

You can enter environment variables directly in the MCP configuration, but storing them in a separate file is more secure. Create a .piwik-pro-mcp.env file and add configuration to it:

# .piwik.pro.mcp.env
PIWIK_PRO_HOST=ACCOUNT.piwik.pro
PIWIK_PRO_CLIENT_ID=CLIENT_ID
PIWIK_PRO_CLIENT_SECRET=CLIENT_SECRET

Refer to this file through --env-file argument:

{
  "mcpServers": {
    "piwik-pro-analytics": {
      "command": "uvx",
      "args": [
        "piwik-pro-mcp",
        "--env-file",
        "/absolute/path/to/.piwik-pro-mcp.env"
      ]
    }
  }
}

Option #2 - Docker

You need to have Docker installed. See the official installation guide.

{
  "mcpServers": {
    "piwik-pro-analytics": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "ghcr.io/piwikpro/mcp:latest"],
      "env": {
        "PIWIK_PRO_HOST": "ACCOUNT.piwik.pro",
        "PIWIK_PRO_CLIENT_ID": "CLIENT_ID",
        "PIWIK_PRO_CLIENT_SECRET": "CLIENT_SECRET"
      }
    }
  }
}

You can enter environment variables directly in the MCP configuration, but storing them in a separate file is more secure. Create a .piwik-pro-mcp.env file and add the configuration to it:

# .piwik.pro.mcp.env
PIWIK_PRO_HOST=ACCOUNT.piwik.pro
PIWIK_PRO_CLIENT_ID=CLIENT_ID
PIWIK_PRO_CLIENT_SECRET=CLIENT_SECRET

Refer to this file through --env-file argument:

{
  "mcpServers": {
    "piwik-pro-analytics": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "--env-file",
        "/absolute/path/to/.piwik-pro-mcp.env",
        "ghcr.io/piwikpro/mcp:latest"
      ]
    }
  }
}

Restart your MCP client to apply configuration changes.

🪄 First Use

You're all set! The server starts in safe mode by default, so you can explore your analytics data without worrying about accidental changes.

Try these prompts to get started:

List my Piwik PRO apps.

List tags in <NAME> app.

What were the top 10 pages last week?

Show me conversion trends from the last month.

Ready to make changes?

Once you're comfortable, disable safe mode to enable t create, update, and delete operations:

PIWIK_PRO_SAFE_MODE=0

Then try prompts like:

In app <NAME>, add a new tag that shows alert("hello") on every page.

Copy the tag <NAME> from app <APP> to all apps with the <PREFIX> prefix.

Other options

  • PIWIK_PRO_TELEMETRY (default 1): Controls anonymous usage telemetry. Set this to 0 to disable it.

  • PIWIK_PRO_TM_RESOURCE_CHECK (default 1): Enables Tag Manager template validation. Set to 0 to bypass when experimenting with custom templates.

  • PIWIK_PRO_ALLOW_INSECURE_HOST (default 0): Rejects explicit http:// values for PIWIK_PRO_HOST. Set to 1 only for local/dev instances that cannot use HTTPS.

🔒 Security

The default stdio transport is recommended for MCP clients such as Cursor and Claude Desktop.

If you use the optional streamable-http transport, be aware that the server does not authenticate incoming MCP requests. All tools are accessible to anyone who can reach the endpoint, within the limits of the configured Piwik PRO API token. Do not expose the HTTP server to the public internet. See the Development Guide — HTTP Transport for details.

🔈 Feedback

We value your feedback and questions. If you have suggestions, run into issues, or want to request a feature, open an issue on our GitHub Issues page. Your feedback helps us improve the project and support the community.

📡 Telemetry

We collect anonymous telemetry data to help us understand how the MCP server is used and to improve its reliability and features. This telemetry includes information about which MCP tools are invoked and whether the result is a success or an error, but it doesn't include any personal data, tool arguments, or sensitive information.

We use this data only to identify issues, prioritize improvements, and provide the best possible experience for all users.

If you prefer not to send telemetry data, you can opt out at any time by adding the following environment variable PIWIK_PRO_TELEMETRY=0 to your MCP server configuration.

📚 Documentation

Document

Description

Available Tools

Complete reference for all MCP tools

Development Guide

Setup, running, testing, and architecture

Contributing

How to contribute to the project

Available Tools

40 tools
activations_attributes_listA
Read-only

List all CDP attributes available for audience creation.

    This tool returns structured attribute objects containing all available attributes
    for the specified app. Each AttributeSummary object includes:
    - column_id: Unique identifier for the attribute
    - column_name: Human-readable name
    - column_type: Data type (string, number, datetime, etc.)
    - supported_operators: List of operators valid for this column type
    - value_selectors: Supported selectors (first, last, any, none)
    - value_format: CRITICAL - Format requirements and examples for condition values
    - column_category: Categories the attribute belongs to
    - scope: Whether it's an event or profile attribute
    - immutable: Whether the attribute is read-only
    - event_data_key: Key for imported data or tracker dimension

    This information is essential for creating audience conditions with correct
    column_id, operators, value_selectors, and most importantly - correct value formats.

    Args:
        app_id: UUID of the app to list attributes for

    Returns:
        AttributeListMCPResponse containing:
        - attributes: List of AttributeSummary objects with structured metadata
        - total: Total number of attributes available
    
ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYesTotal number of attributes available
attributesYesList of CDP attributes with metadata

TDQS

A4.4/5.0
Behavior4/5

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

The description details the output structure beyond the readOnlyHint annotation, but does not cover other behavioral aspects like error handling or pagination.

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?

Well-structured with front-loaded purpose, but includes detailed bullet points that may be partially redundant with the output schema.

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

Completeness4/5

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

Adequate coverage for a simple list tool with one parameter; missing details on error scenarios but sufficient for typical use.

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

Parameters5/5

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

The schema has 0% coverage, but the description adds full semantic meaning for app_id, specifying it as a UUID and its purpose.

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 'List all CDP attributes available for audience creation' with a specific verb and resource, distinguishing it from sibling tools that focus on analytics, apps, or audiences.

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

Usage Guidelines4/5

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

It clearly states the tool is essential for creating audience conditions, but does not explicitly mention when not to use or list alternatives.

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

analytics_annotations_getB
Read-only

Get a user annotation by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes
annotation_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already provide readOnlyHint: true, indicating safe read. Description adds no further behavioral context (e.g., auth needs, error states). Acceptable but minimal contribution beyond annotations.

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?

Single sentence, no redundancies. Could benefit from a brief note on parameters, but overall conciseness is good. Not overly succinct to the point of harm.

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

Completeness3/5

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

Output schema exists, reducing need to describe return values. However, the tool has two required parameters with no description; the description fails to clarify 'app_id' context. Adequate for a simple getter but incomplete for full agent understanding.

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

Parameters2/5

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

Schema description coverage is 0%, requiring description to compensate. However, description only mentions 'by ID', ignoring 'app_id'. It does not explain the role of 'app_id' or the format of 'annotation_id', leaving meaning unclear.

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?

Description clearly states verb 'Get' and resource 'user annotation' with modifier 'by ID', distinguishing it from sibling 'analytics_annotations_list' which lists multiple annotations. No ambiguity.

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

Usage Guidelines2/5

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

No guidance on when to use this tool vs alternatives like 'analytics_annotations_list'. Agent must infer from name alone. Lacks explicit context or exclusion criteria.

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

analytics_annotations_listB
Read-only
    List user annotations for an app.

    Args:
        app_id: App UUID
        date_from: Optional start date (YYYY-MM-DD)
        date_to: Optional end date (YYYY-MM-DD)
        limit: Max number of items
        offset: Number of items to skip

    Returns:
        Annotations list and metadata
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
app_idYes
offsetNo
sourceNoall
date_toNo
date_fromNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesList of annotations
metaNoMetadata such as total count

TDQS

B3.1/5.0
Behavior3/5

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

The description lists parameters and notes a return value, which adds some behavioral context beyond the readOnlyHint annotation. However, it omits the 'source' parameter and does not describe pagination behavior or result limits.

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 description is concise and structured with Args and Returns sections. It has no fluff, though it could be slightly more front-loaded with the core purpose.

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

Completeness2/5

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

Given 6 parameters and a complex schema, the description is incomplete: it does not cover the 'source' parameter, lacks usage guidance, and provides minimal detail on the return value (only 'Annotations list and metadata').

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

Parameters3/5

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

With 0% schema description coverage, the description partially compensates by providing date format (YYYY-MM-DD) and semantics for limit/offset. However, it fails to mention the 'source' parameter, leaving its purpose unclear.

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

Purpose4/5

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

The description clearly states the verb 'list' and resource 'user annotations for an app'. It distinguishes from the sibling 'analytics_annotations_get' which retrieves a single annotation, but does not explicitly call out the difference.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives, such as when to filter by source or date range. There is no mention of prerequisites or context.

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

analytics_custom_dimensions_getA
Read-only
    Get a specific custom dimension by ID.

    Note: The scope parameter is required to determine which API to query.
    If you don't know the scope, use analytics_custom_dimensions_list() first
    to find the dimension and its scope.

    Args:
        dimension_id: Custom Dimension UUID
        website_id: Website/App UUID
        scope: Dimension scope (required for API routing):
               - "session" or "event": Query standard custom dimensions API
               - "product": Query product custom dimensions API

    Returns:
        CustomDimensionItem (for session/event) or ProductCustomDimensionItem (for product)

    Raises:
        RuntimeError: If dimension not found or API request fails
    
ParametersJSON Schema
NameRequiredDescriptionDefault
scopeYes
website_idYes
dimension_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Discloses RuntimeError for failures and different return types per scope, adding value beyond the readOnlyHint annotation.

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

Conciseness5/5

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

Well-structured with sections for note, args, returns, raises; each sentence is informative and earns its place.

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?

Covers all necessary details for a 3-param tool with output schema; no gaps remain.

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

Parameters5/5

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

With 0% schema coverage, the description fully explains each parameter (UUIDs, enum values, routing effects), compensating completely.

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 clearly states it gets a custom dimension by ID and explains the scope-based API routing. It is distinct from siblings like list and get_slots.

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?

Explicitly advises using list() first if scope is unknown, providing clear when-to-use guidance and an alternative.

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

analytics_custom_dimensions_get_slotsA
Read-only
    Get slot availability statistics for all dimension types.

    This endpoint provides information about how many dimension slots are available,
    used, and remaining for each scope (session, event, and product).

    Args:
        website_id: Website/App UUID

    Returns:
        Slot statistics for all dimension scopes with the following info for each:
        - available: Total number of slots available
        - used: Number of slots currently in use
        - left: Number of slots remaining

    Raises:
        RuntimeError: If API request fails
    
ParametersJSON Schema
NameRequiredDescriptionDefault
website_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true, and the description adds disclosure of return fields (available, used, left) and raises RuntimeError on API failure. This provides behavioral context beyond the annotation.

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 description is well-structured with sections for Args, Returns, and Raises, making it easy to scan. It is concise yet informative, with no redundant content.

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?

The description fully covers the tool's purpose, input, output, and error conditions. With a simple one-parameter input and existing output schema, nothing essential is missing.

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?

With 0% schema description coverage, the description compensates by explaining the sole parameter website_id as 'Website/App UUID'. This adds meaningful semantic value not present in the input schema.

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 clearly states the tool 'Get slot availability statistics for all dimension types', specifying the resource and action. It distinguishes itself from sibling analytics tools by focusing on slot availability rather than dimensions or metrics.

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool versus alternatives like analytics_custom_dimensions_list. The description does not mention prerequisites or context for use.

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

analytics_custom_dimensions_listA
Read-only
    List custom dimensions, optionally filtered by scope.

    Args:
        website_id: Website/App UUID
        scope: Optional scope filter:
               - "session": Returns only session-scoped dimensions
               - "event": Returns only event-scoped dimensions
               - "product": Returns only product dimensions
               - None (default): Returns both standard and product dimensions separately
        limit: Maximum number of rows to return (default: 10, min: 1, max: 100000)
               Note: Only applies to standard dimensions (session/event). Product dimensions
               are not paginated by the API.
        offset: Number of rows to skip (default: 0, min: 0)
               Note: Only applies to standard dimensions (session/event).

    Returns:
        - If scope is "session" or "event": CustomDimensionsList (filtered by scope)
        - If scope is "product": ProductCustomDimensionsList
        - If scope is None: UnifiedCustomDimensionsList with both standard and product dimensions

    Raises:
        RuntimeError: If API request fails
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
scopeNo
offsetNo
website_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true. Description adds behavioral details about pagination limits for standard vs product dimensions and return types per scope, but omits authentication or rate limit info.

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?

Well-structured with args/returns/raises, front-loaded purpose, but somewhat verbose. Could be slightly more concise.

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?

Covers all parameter behavior, return types per scope, edge cases (product pagination), and error handling. Output schema exists, so return value explanation is adequate.

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

Parameters5/5

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

Input schema has 0% description coverage; description compensates with full explanations for scope enum, limit/offset defaults and special behavior for product dimensions.

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?

Description clearly states it lists custom dimensions with optional scope filter. Distinguishes from sibling tools like analytics_custom_dimensions_get (single dimension) and analytics_dimensions_list (different resource type).

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

Usage Guidelines4/5

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

Provides guidance on scope parameter usage and defaults, but does not explicitly state when not to use or mention alternatives among siblings.

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

analytics_dimensions_details_listA
Read-only
    List details of provided dimensions.

    Args:
        website_id: UUID of the website/app to get dimensions for
        dimensions: list of dimension names

    Returns:
        The list of all available dimensions with details

    Important: Use enum_values object values instead of keys for queries.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
dimensionsYes
website_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dimensionsYes
custom_channel_groupingsYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=true, so the description only adds the return type information and the important note. It does not disclose other behaviors like pagination or authentication requirements, but annotations cover the safety profile.

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 description is structured with an Args section and a Returns section, making it easy to parse. However, it is slightly verbose and could be trimmed for conciseness.

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

Completeness3/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 does not need to detail return structure heavily. However, it only vaguely says 'list of all available dimensions with details,' leaving the nature of 'details' unclear. The tool has two simple parameters, so completeness is adequate but not rich.

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

Parameters2/5

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

The input schema has 0% description coverage. The description mentions `website_id` as a UUID and `dimensions` as a list of dimension names, but this adds minimal meaning beyond the parameter names. It does not provide detailed semantics or formats.

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 clearly states 'List details of provided dimensions,' specifying the verb (List), resource (dimensions details), and scope (via input). It distinguishes from the sibling `analytics_dimensions_list` which likely lists dimension names only.

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

Usage Guidelines4/5

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

The description includes an important usage note about using enum_values object values instead of keys. While it does not explicitly state when to use this tool versus alternatives, the context of the sibling tools and the purpose implies it is for detailed dimension information.

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

analytics_dimensions_listA
Read-only
    List available dimensions for analytics queries.

    Returns all dimensions that can be used as columns in analytics_query_execute.
    To get details use `analytics_dimensions_details_list`
    The format of the response:
    ```
    {"dimensions": [{column_id: column_name}],
    "custom_channel_groupings": [{custom_channel_grouping_id: column_name}]}
    ```
    Args:
        website_id: UUID of the website/app to get dimensions for

    Returns:
        DimensionsList with all available dimensions and custom channel groupings
    
ParametersJSON Schema
NameRequiredDescriptionDefault
website_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dimensionsYes
custom_channel_groupingsYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already indicate `readOnlyHint=true`, and the description does not contradict this. It adds the response format and parameter meaning, but does not disclose potential authorization needs or rate limits, which are not critical given the read-only nature.

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

Conciseness5/5

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

The description is concise, well-structured, and front-loaded. It uses backticks for code references and clearly separates Args and Returns. Every sentence adds value.

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

Completeness4/5

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

For a simple list tool with an output schema, the description adequately covers the purpose, parameter, response format, and sibling relation. It lacks mention of potential errors or permissions, but given the tool's simplicity, it is largely complete.

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?

With 0% schema description coverage, the description compensates by clearly explaining that `website_id` is a UUID of the website/app. This adds meaning beyond the schema's type-only definition.

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 clearly states the tool lists available dimensions for analytics queries, uses a specific verb-resource pair, and differentiates from the sibling `analytics_dimensions_details_list` by directing users to that tool for details.

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

Usage Guidelines4/5

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

The description provides clear context that dimensions are for use in `analytics_query_execute` and points to `analytics_dimensions_details_list` for more details. However, it does not explicitly state when not to use this tool or compare to other siblings like `analytics_metrics_list`.

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

analytics_goals_getA
Read-only
    Get a specific goal by ID.

    Args:
        goal_id: Goal UUID
        website_id: Website/App UUID

    Returns:
        Goal resource
    
ParametersJSON Schema
NameRequiredDescriptionDefault
goal_idYes
website_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations include readOnlyHint=true, indicating a safe read operation. The description adds minimal behavioral context beyond that, stating it returns a 'Goal resource'. This is adequate but not exceptional.

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

Conciseness5/5

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

The description is concise with three lines: purpose, arguments, and returns. No extraneous words, effectively front-loaded.

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

Completeness4/5

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

Given the existence of an output schema (indicated by context signals) and the straightforward nature of a get-by-ID operation, the description sufficiently covers the tool's functionality. Minor edge cases (e.g., missing IDs) are not addressed but are standard for such tools.

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?

With 0% schema description coverage, the description compensates by labeling parameters as 'Goal UUID' and 'Website/App UUID', adding meaningful context beyond type 'string'.

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 explicitly states 'Get a specific goal by ID', using a clear verb and resource. It naturally distinguishes itself from the sibling 'analytics_goals_list' which retrieves multiple goals.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives, when not to use it, or any prerequisites. The agent must infer usage solely from the verb 'Get'.

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

analytics_goals_listA
Read-only
    List all goals for a website.

    Use this before goal conversion queries when the user names a specific goal.
    Match the goal by exact name in `data[].attributes.name`, then use the goal's
    `id` as the `goal_uuid` filter value in `analytics_query_execute`. Do not put
    `goal_uuid` in query columns when filtering to a single goal.

    Args:
        website_id: Website/App UUID
        limit: Maximum number of rows to return (default: 10, min: 1, max: 100000)
        offset: Number of rows to skip (default: 0, min: 0)

    Returns:
        Goals list with metadata. Each goal has `id` (UUID) and `attributes.name`.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
website_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesList of goals
metaNoMetadata such as total count

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds valuable workflow context: exact name matching in data[].attributes.name, using the returned id as goal_uuid, and the warning not to include goal_uuid in query columns. Minor ambiguity remains because 'List all goals' could suggest unbounded results while the default limit is 10.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, then provides a focused workflow, parameter notes, and return shape. Every sentence serves a purpose, and the Args section is compact despite covering all three parameters.

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?

Given the output schema exists, the description still provides enough context on parameters, return shape, and downstream usage to let an agent select and invoke the tool correctly. It covers the full workflow from listing goals to querying them, which is sufficient for this tool's complexity.

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

Parameters5/5

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

Schema description coverage is 0%, but the Args section fully compensates by documenting all three parameters: website_id as Website/App UUID, limit with default/min/max, and offset with default/min. This adds real semantic meaning beyond the bare schema.

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 opens with 'List all goals for a website,' which clearly states the verb, resource, and scope. It also distinguishes this tool from siblings like analytics_goals_get by framing it as the list operation used to resolve a named goal to an ID.

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

Usage Guidelines4/5

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

The description explicitly says 'Use this before goal conversion queries when the user names a specific goal' and explains the exact workflow: match by name, then use the ID in analytics_query_execute. It does not explicitly describe when not to use it or compare it to analytics_goals_get, so it falls just short of the full alternatives/exclusions bar.

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

analytics_metrics_details_listA
Read-only
    List details of provided metrics.

    Returns all metrics that can be used as columns in analytics_query_execute.

    Args:
        website_id: UUID of the website/app to get metrics for
        metrics: list of metric names

    Returns:
        The list of all available metrics with details
    
ParametersJSON Schema
NameRequiredDescriptionDefault
metricsYes
website_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
metricsYes
calculated_metricsYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true, so the description's job is light. It adds context that the returned metrics are 'all available metrics with details' and usable as columns, which is valuable beyond the annotation. No contradictions.

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 description is structured with an Args section and is clear, though slightly verbose with the 'Returns:' line. It is front-loaded with the main purpose and uses minimal words.

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

Completeness4/5

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

Given the output schema exists and parameters are explained, the description covers what the tool does, its inputs, and output. It could mention differentiation from analytics_metrics_list, but overall sufficient.

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 0%, so description must explain parameters. It does so by defining website_id as 'UUID of the website/app' and metrics as 'list of metric names', adding meaning beyond the schema's titles.

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 clearly states the verb 'List details' and the resource 'provided metrics', and distinguishes from sibling tools like analytics_metrics_list by specifying it returns all metrics usable as columns in analytics_query_execute.

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

Usage Guidelines4/5

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

The description explains the tool returns metrics that can be used as columns for query execution, implying when to use it. However, it does not explicitly mention when not to use or provide alternative tools, such as analytics_metrics_list for just names.

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

analytics_metrics_listA
Read-only
    List available metrics for analytics queries.

    Returns all metrics that can be used as columns in analytics_query_execute.
    The format of the response:
    ```
    {"metrics": [{metric_id: metric_name}], ...}, "calculated_metrics": [{calculated_metric_id: column_name}]
    ```

    Args:
        website_id: UUID of the website/app to get metrics for

    Returns:
        MetricsList with all available metrics
    
ParametersJSON Schema
NameRequiredDescriptionDefault
website_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
metricsYes
calculated_metricsYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, and the description adds the response format and return type, providing additional behavioral context beyond the annotations.

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 description is concise and front-loaded with purpose, though includes a code block and Args/Returns sections that could be slightly trimmed.

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

Completeness4/5

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

Given an output schema exists, the description provides a sufficient overview of return format and type, making it complete for a simple list endpoint.

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

Parameters3/5

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

With 0% schema coverage, the description adds minimal meaning by stating website_id is a UUID, but does not elaborate on its purpose or formatting beyond the schema.

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 clearly states the tool lists available metrics for analytics queries and specifies they can be used as columns in analytics_query_execute, distinguishing it from sibling tools like analytics_dimensions_list.

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

Usage Guidelines4/5

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

The description implies use before executing queries by stating it returns metrics for analytics_query_execute, but no explicit when-not or alternatives are given.

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

analytics_query_executeA
Read-only
    Execute an analytics query against Piwik PRO.

    Query planning rules:

    - Use `columns` only for values that should appear in the result, be grouped by,
    aggregated, or sorted.
    - Use `filters` for values that narrow the dataset, such as exact names, IDs,
    countries, devices, campaigns, pages, goals, or other conditions.
    - If the user asks "for X", "named X", "only X", or "with ID X", X is usually
    a filter, not a selected column.
    - If the user asks "by X", "per X", "which X", or "compare X", X is usually
    a selected column/grouping dimension.
    - For day-level results, use `timestamp` with `transformation_id="to_date"`.
    - For highest/top/most/lowest questions, always set `order_by` on the target
    metric column index (zero-based), not on the grouping dimension.
    - For period-level summaries (overall bounce rate, total sessions, average
    duration for a date range) without "per day", "by day", "daily", or "which day",
    do not group by `timestamp`. Use one query with metrics only.
    - `session_total_time` is a dimension: use `transformation_id="average"` for
    average session duration. Metrics such as `bounce_rate` and `sessions` cannot
    be transformed.
    - Call `analytics_query_execute` once after selecting validated columns,
    filters, date range, limit, and ordering. Re-run it only if the previous query
    failed or the result is insufficient to answer.

    Goal conversion queries:
    - Call `analytics_goals_list` first to resolve a goal name to its UUID (`data[].id`).
    - Restrict results to one goal with a `goal_uuid` filter, not a `goal_uuid` column:
      {"column_id": "goal_uuid", "condition": {"operator": "eq", "value": "<goal-id>"}}
    - Never add `goal_uuid` to `columns` when the user asks about one specific goal.
    - Typical columns: `timestamp` with `to_date`, plus `goal_conversions`.
    - For "highest/most conversions on which day", always set `order_by` on the
    `goal_conversions` column index with `"desc"`.

    Multi-period comparisons (e.g. month vs month, before vs after):
    - Run one `analytics_query_execute` call per period with the same `columns`,
    `limit`, and `order_by`.
    - Rank positions are per period: row #3 in January is not rank #3 in February.
    - Compare periods by matching the grouping dimension value (e.g. `event_url`),
    not by row index.
    - Report rank changes as "Jan #X → Feb #Y" using each period's own ranking.
    - Pages in only one period's top-N are new or removed; quote session counts
    exactly as returned for each period.

    REQUIRED WORKFLOW - You must follow these steps in order:

    Before calling this tool, always call:
    - analytics_dimensions_details_list for every dimension used in columns or filters
    - analytics_metrics_details_list for every metric used in columns, metric_filters, or ordering

    For day-level grouping, use:
    {"column_id": "timestamp", "transformation_id": "to_date"}
    Do not use raw {"column_id": "timestamp"} when the user asks for a day/date.

    1. Call `analytics_dimensions_list` to get available dimension IDs
    2. Call `analytics_metrics_list` to get available metric IDs
    3. Call `analytics_dimensions_details_list` for details on dimensions you plan to use
    4. Call `analytics_metrics_details_list` for details on metrics you plan to use
    5. Call this tool with validated column_ids and transformation_ids

    Column IDs and transformation IDs must exactly match values returned by the list and
    details endpoints. Guessing or inventing IDs will cause query failures.

    DO NOT RUN THIS TOOL BEFORE CHECKING DIMENSIONS AND METRICS DETAILS!
    Important: Metrics cannot be transformed. Only dimensions accept transformation_id.

    ---

    Args:
        website_id: UUID of the website/app to query
        columns: List of column definitions. Each column is a dict with:
            - column_id (required): Dimension or metric ID from the list endpoints
                (in case of calculated metric use always string "calculated_metric",
                in case of custom channel grouping use always string "custom_channel_grouping")
            - transformation_id (optional): Aggregation function from details endpoint
                (e.g., "sum", "count", "unique_count")
                Note: Only dimensions support transformations. Metrics cannot be transformed.
            - calculated_metric_id: only for calculated metrics
            - custom_channel_grouping_id: only for custom channel groupings
            - dimension_value_grouping_id: only for transformation_id = 'dimension_value_grouping'
            - event_type: optional int value only for transformed dimension with scope = 'product'
                Allowed values:
                Order: 9, Abandoned cart: 10, Product detail view: 22, Add to cart: 23, Remove from cart: 24

        date_from: Start date in YYYY-MM-DD format
        date_to: End date in YYYY-MM-DD format
        relative_date: Alternative to date_from/date_to. Options:
            today, yesterday, last_week, last_month, last_year, last_X_days
            last_X_days must be in range 1 <= X <= 365
            For periods beyond the last year use date_from and date_to

        filters: Optional dimension filter group with structure:
            {"operator": "and"|"or", "conditions": [...]}

            Each condition:
            {"column_id": "...", "condition": {"operator": "<op>", "value": ...}}

            Goal example (single named goal only):
            {"operator": "and", "conditions": [
                {"column_id": "goal_uuid", "condition": {"operator": "eq", "value": "<goal-id>"}}
            ]}
            Use the goal UUID from `analytics_goals_list` (`data[].id`), not the goal name.

            Filter operators:
            - String: eq, neq, contains, not_contains, starts_with, ends_with, matches, not_matches
            - Numeric: gt, gte, lt, lte
            - Null checks: empty, not_empty

            Note: Some operators only work with specific data types.
            Check dimension/metric details for type compatibility before filtering.
        metric_filters: as arg 'filters' but for metrics
        offset: Rows to skip (default: 0)
        limit: Max rows to return (default: 100, max: 100000)
        order_by: List of [column_index, "asc"|"desc"] pairs. Column indices are
            zero-based positions in `columns`. For highest/top questions, sort by the
            metric being optimized (e.g. columns [timestamp.to_date, goal_conversions]
            -> order_by [[1, "desc"]]).

    ---

    Reference:
    - Dimension IDs: analytics_dimensions_list
    - Metric IDs: analytics_metrics_list
    - Dimension details (transformations, types): analytics_dimensions_details_list
    - Metric details (types): analytics_metrics_details_list
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
columnsYes
date_toNo
filtersNo
order_byNo
date_fromNo
website_idYes
relative_dateNo
metric_filtersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesQuery results
statusYesExecution status
messageYesStatus message

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description reveals crucial behavioral constraints: metrics cannot be transformed, timestamp needs transformation_id='to_date', order_by indexes are zero-based, goal_uuid must be a filter not a column, multi-period queries should be run once per period, and rank positions are per period. No contradiction with annotations.

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 description is long but well-organized with clear headings, bullet lists, and an explicit numbered workflow. It earns most of its length, though there is some redundancy between the 'Before calling' paragraph and the numbered steps, so it is not maximally concise.

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?

For a complex 10-parameter analytics execution tool, the description covers query planning, prerequisites, date handling, filtering, transformations, ordering, goal conversion flows, multi-period comparisons, and limits. Since an output schema exists, omission of return-value details is acceptable; the description is highly complete.

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

Parameters5/5

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

Schema description coverage is 0%, but the Args section compensates fully by explaining all 10 parameters, including columns dict fields, filters structure with operators, relative_date options, order_by structure, and offset/limit defaults. It adds meaning far beyond the raw JSON schema.

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 opens with a precise verb+resource statement: 'Execute an analytics query against Piwik PRO.' It clearly distinguishes itself from the sibling list/get analytics tools by focusing on query execution, and it states its role in the workflow ('Call this tool with validated column_ids and transformation_ids').

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?

The description provides explicit when-to-use rules, including a required workflow calling analytics_dimensions_list/metrics_list/details before executing, and says 'DO NOT RUN THIS TOOL BEFORE CHECKING DIMENSIONS AND METRICS DETAILS!'. It also gives re-run policy and uses 'columns vs filters' heuristics to guide query construction, making tool selection and invocation unambiguous.

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

apps_getA
Read-only

Get detailed information about a specific app.

    Args:
        app_id: UUID of the app to retrieve

    Returns:
        Dictionary containing detailed app information including:
        - id: App UUID
        - name: App name
        - urls: List of URLs where the app is available
        - app_type: Type of application
        - timezone: App timezone
        - currency: App currency
        - e_commerce_tracking: Whether e-commerce tracking is enabled
        - delay: App delay in milliseconds
        - gdpr_enabled: Whether GDPR is enabled
        - gdpr_user_mode_enabled: Whether GDPR user mode is enabled
        - privacy_cookie_domains_enabled: Whether privacy cookie domains are enabled
        - privacy_cookie_expiration_period: Privacy cookie expiration period in seconds
        - privacy_cookie_domains: Privacy cookie domains list
        - gdpr_data_anonymization: Whether GDPR data anonymization is enabled
        - sharepoint_integration: Whether SharePoint integration is enabled
        - gdpr_data_anonymization_mode: GDPR data anonymization mode
        - privacy_use_cookies: Whether privacy mode uses cookies
        - privacy_use_fingerprinting: Whether privacy mode uses fingerprinting
        - cnil: Whether CNIL integration is enabled
        - session_id_strict_privacy_mode: Whether strict privacy mode is enabled
        - real_time_dashboards: Whether real-time dashboards are enabled
        - created_at: App creation datetime
        - updated_at: App last update datetime

    For more tracking details use `tracker_settings_app_get`.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesApp UUID
cnilNoWhether CNIL integration is enabled
nameYesApp name
urlsYesList of URLs where the app is available
delayNoApp delay in milliseconds
app_typeNoType of application
currencyNoApp currency
timezoneNoApp timezone
created_atNoCreation timestamp
updated_atNoLast update timestamp
gdpr_enabledNoWhether GDPR is enabled
e_commerce_trackingNoWhether e-commerce tracking is enabled
privacy_use_cookiesNoWhether privacy mode uses cookies
real_time_dashboardsNoReal-time dashboards enabled
gdpr_user_mode_enabledNoWhether GDPR user mode is enabled
privacy_cookie_domainsNoList of privacy cookie domains
sharepoint_integrationNoWhether SharePoint integration is enabled
gdpr_data_anonymizationNoGDPR data anonymization setting
privacy_use_fingerprintingNoWhether privacy mode uses fingerprinting
gdpr_data_anonymization_modeNoGDPR data anonymization mode
privacy_cookie_domains_enabledNoWhether privacy cookie domains are enabled
session_id_strict_privacy_modeNoWhether session ID strict privacy mode is enabled
privacy_cookie_expiration_periodNoPrivacy cookie expiration period in seconds

TDQS

A4.8/5.0
Behavior4/5

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

Annotations declare readOnlyHint: true, so the read-only nature is already known. The description adds value beyond that by detailing the return fields (e.g., id, name, urls, etc.), which provides transparency about what the tool returns. It does not mention any side effects or permissions, but none are expected for a read operation.

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

Conciseness5/5

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

The description is well-structured with intro, args, returns, and a usage tip. It is front-loaded with the purpose and each sentence earns its place. No redundant or unnecessary information.

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?

Given one parameter and an implied output schema (detailed in returns), the description is fully complete. It covers what the tool does, what to pass, what you get back, and provides a pointer to a related tool for deeper details.

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

Parameters5/5

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

The single parameter 'app_id' is described as 'UUID of the app to retrieve' in the Args section, which adds specificity beyond the schema's generic type 'string' and title 'App Id'. Since schema description coverage is 0%, the description fully compensates.

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 starts with 'Get detailed information about a specific app,' which clearly states the verb and resource. It distinguishes itself from sibling tools like apps_list by specifying retrieval of a single app by ID, and even suggests an alternative tool (tracker_settings_app_get) for more tracking details.

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?

The description includes an explicit alternative: 'For more tracking details use tracker_settings_app_get.' This clearly guides when to use this tool versus another. The context of 'specific app' versus listing all apps is implied, aiding correct invocation.

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

apps_listA
Read-only

List apps from Piwik PRO analytics.

    Retrieves a list of applications (websites/apps) that are being tracked
    in the Piwik PRO analytics platform.

    Args:
        limit: Maximum number of apps to return (default: 100, max: 1000)
        offset: Number of apps to skip (default: 0)
        search: Search query to filter apps by name

    Returns:
        Dictionary containing app list and metadata including:
        - apps: List of app objects with id, name, urls, timezone, currency, etc.
        - total: Total number of apps available
        - limit: Number of apps requested
        - offset: Number of apps skipped
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
searchNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
appsYesList of app objects with id, name, urls, timezone, currency, etc.
limitYesNumber of apps requested
totalYesTotal number of apps available
offsetYesNumber of apps skipped

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true, indicating a safe read operation. The description adds valuable context about pagination (limit, offset) and return structure, which goes beyond the annotation. It does not mention any side effects, which is consistent with read-only behavior.

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 description is well-structured with Args and Returns sections. It is clear but slightly verbose with redundant first line. Overall efficient and easy to parse.

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?

Given the tool's simplicity and the presence of an output schema, the description covers all necessary aspects: purpose, parameters, and return values. It includes pagination details and metadata fields, making it complete for an agent to use correctly.

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

Parameters5/5

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

Schema coverage is 0%, so no parameter descriptions exist in the schema. The description fully compensates by explaining limit (max 1000), offset (skipping), and search (filter by name), adding meaning beyond types and defaults.

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

Purpose4/5

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

The description clearly states it lists apps from Piwik PRO analytics and explains it retrieves tracked applications. It uses a specific verb and resource. However, it does not explicitly differentiate from sibling tools like apps_get, though the verb 'list' implies it's for multiple apps.

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

Usage Guidelines3/5

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

The description provides implied usage context for listing apps but lacks explicit guidance on when to use this tool versus alternatives (e.g., apps_get for single app). No when-not or alternative references are given.

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

audiences_getA
Read-only

Get detailed information about a specific audience.

    Args:
        app_id: UUID of the app
        audience_id: UUID of the audience to retrieve

    Returns:
        Dictionary containing detailed audience information including:
        - id: Audience UUID
        - name: Audience name
        - description: Audience description
        - membership_duration_days: Duration in days for audience membership
        - version: Audience version
        - definition: Audience definition with conditions
        - author_email: Email of the audience author
        - is_author: Whether current user is the author
        - created_at: Audience creation datetime
        - updated_at: Audience last update datetime
    
ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes
audience_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesAudience UUID
nameYesAudience name
versionYesAudience version
is_authorYesWhether current user is the author
created_atNoCreation timestamp
definitionYesAudience definition with conditions
updated_atNoLast update timestamp
descriptionYesAudience description
author_emailYesEmail of the audience author
membership_duration_daysYesMembership duration in days

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description's 'get' aligns and adds no contradiction. It transparently lists return fields, providing behavioral context beyond annotations.

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 description is structured with Args and Returns, front-loading the purpose. It is moderately concise, though the full field list may be redundant given the output schema exists. Still efficient.

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

Completeness4/5

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

Given the presence of an output schema, the description covers purpose, parameters, and returns adequately. It lacks error handling notes but is sufficient for a standard retrieval tool.

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?

With 0% schema description coverage, the description compensates by explaining each parameter as 'UUID of the app' and 'UUID of the audience to retrieve,' adding meaningful semantics beyond the bare type.

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 clearly states 'Get detailed information about a specific audience,' using a specific verb and resource. It distinguishes itself from sibling tools like 'audiences_list' by targeting a single audience.

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

Usage Guidelines3/5

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

The description implies usage for retrieving one audience by IDs but does not explicitly state when to use this over the list tool or provide exclusions. Basic guidance is present but lacks explicit context.

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

audiences_listA
Read-only

List audiences from Piwik PRO CDP.

    Retrieves a list of audiences that are configured in the Piwik PRO
    Customer Data Platform for the specified app.

    Args:
        app_id: UUID of the app to list audiences for

    Returns:
        Dictionary containing audience list including:
        - audiences: List of audience objects with id, name, description, etc.
        - total: Total number of audiences available
    
ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYesTotal number of audiences available
audiencesYesList of audiences

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, making the read-only nature clear. The description adds return structure (audiences list and total), providing useful behavioral context beyond annotations.

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

Conciseness5/5

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

The description is brief and front-loaded with the main purpose. The Args/Returns structure is clear and adds no superfluous text.

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

Completeness4/5

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

Given the simplicity of the tool (one parameter, list output) and the presence of an output schema (not shown), the description adequately covers purpose, parameter, and return format. Minor omission: no mention of pagination or limits.

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 description coverage is 0%, so the description must explain the parameter. It describes app_id as 'UUID of the app to list audiences for', adding meaning that the schema lacks.

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 clearly states 'List audiences from Piwik PRO CDP' and specifies it retrieves a list for a given app. This distinguishes it from sibling tools like audiences_get, which likely retrieves a single audience.

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

Usage Guidelines3/5

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

The description indicates usage with a required app_id but does not explicitly state when to use list vs. get tools. Context from sibling names implies differentiation, but no direct guidance is given.

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

container_settings_get_installation_codeA
Read-only
    Get installation code for an app.

    Args:
        app_id: UUID of the app

    Returns:
        Object with a single field:
        - code: Installation code string

    Examples:
        container_settings_get_installation_code(app_id="00000000-0000-4000-8000-000000000000")
    
ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
codeNoInstallation code snippet

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true, indicating a safe read operation. The description adds the return shape but no additional behavioral traits like permissions, rate limits, or side effects. It meets the baseline but does not go beyond.

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 description is well-structured with Args, Returns, and Examples sections. The key purpose sentence is front-loaded. It could be more concise, but the format is clear and not overly long.

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?

For a simple, single-parameter read-only tool, the description covers input, output, and an example. With the likely output schema available, this is fully adequate for an agent to use the tool correctly.

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?

The schema has 0% coverage, but the description adds 'UUID of the app' and an example with a UUID string, clarifying the expected format beyond the plain 'string' type. This adds significant meaning.

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

Purpose4/5

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

The description clearly states the tool's purpose with 'Get installation code for an app.' The purpose is specific and the resource is identified. However, it does not differentiate from sibling tools like container_settings_list, missing explicit distinction.

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

Usage Guidelines3/5

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

An example and parameter/return description imply usage, but no guidance on when to use this tool versus alternatives or when not to use it. The context is straightforward, but explicit exclusions or contexts are missing.

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

container_settings_listA
Read-only
    Get container settings for an app.

    Args:
        app_id: UUID of the app

    Returns:
        JSON:API response with settings list in 'data' and pagination in 'meta'.

    Examples:
        container_settings_list(app_id="00000000-0000-4000-8000-000000000000")
    
ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesList of settings resources

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already indicate read-only. Description adds return format (JSON:API with pagination) and example. No contradiction, but limited additional behavioral context.

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

Conciseness5/5

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

Concise and well-structured: one-line summary, Args, Returns, Examples. Every sentence adds value with no redundancy.

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

Completeness4/5

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

For a simple read-only list tool, the description covers purpose, parameter, and return format. Lacks mention of authentication or error handling, but output schema exists to cover details.

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

Parameters3/5

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

Schema has no description for 'app_id' (0% coverage). Description adds 'UUID of the app' and an example, which adds meaning but could include more constraints or format details.

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 clearly states the action ('Get') and resource ('container settings for an app'). It is specific and distinct from siblings like 'container_settings_get_installation_code'.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives. No when-to-use or when-not-to-use instructions are provided.

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

operations_getA
Read-only

Get a Tag Manager async operation by ID.

    Use this tool to check the status of background operations started by
    publish, restore, snapshot, copy, export, import, and similar Tag Manager actions.

    Args:
        app_id: UUID of the app
        operation_id: UUID of the operation

    Returns:
        Dictionary containing operation details including:
        - data.id: Operation UUID
        - data.type: Always ``operation``
        - data.attributes.operation_type: Operation kind (e.g. ``publish``,
          ``create_snapshot``, ``import/version``)
        - data.attributes.state: Lifecycle state (``created``, ``started``,
          ``completed``, or ``failed``)
        - data.attributes.parameters: Input parameters for the operation;
          shape depends on ``operation_type`` (e.g. ``target_app_id`` and
          ``source_version_id`` for ``import/version``)
        - data.attributes.summary: Result summary when available; may
          contain ``tags``, ``triggers``, and ``variables`` lists. Each
          entry maps source and target resource IDs/names and includes
          ``is_renamed`` when a name changed during import or copy.
          When working with versions it can contain following fields:
          ``export_file_id``, ``version_id``, ``version_type``,
          ``version_major``, ``version_minor``, ``change_type``.
        - data.attributes.created_at: When the operation was created
        - data.attributes.started_at: When processing started (if started)
        - data.attributes.completed_at: When the operation finished
          successfully (if completed)
        - data.attributes.failed_at: When the operation failed (if failed)
        - data.attributes.updated_at: Last update timestamp
    
ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes
operation_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations provide readOnlyHint, and the description adds comprehensive behavioral details: lifecycle states, field shapes, and conditions for when fields are present. No contradictions with annotations.

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

Conciseness5/5

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

The description is well-structured with Args and Returns sections, front-loaded with purpose, and concise. Every sentence adds value without redundancy.

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?

Given the tool's simplicity (2 parameters, output schema present), the description is complete. It details return fields comprehensively, including optional nested data and example shapes.

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 description coverage is 0%, but the description explains parameters as 'UUID of the app' and 'UUID of the operation', adding meaning beyond type and title. Sufficient for two simple parameters.

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 clearly states it retrieves a Tag Manager async operation by ID, specifying the verb 'Get' and resource 'async operation'. It distinguishes from sibling tools by focusing on background operation status checking.

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

Usage Guidelines4/5

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

The description explicitly lists when to use this tool (checking status of operations started by publish, restore, etc.), providing clear context. It doesn't explicitly state when not to use, but the specific use case is well-defined.

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

tags_getA
Read-only

Get detailed information about a specific tag.

    Related Tools:
        - tags_list_triggers(app_id, tag_id) - Get triggers attached to this tag
        - variables_list(app_id) - Discover valid variable names used by tag fields
    
ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes
tag_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the description's addition of 'Get detailed information' is consistent but doesn't add new behavioral details. No contradictions.

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 description is concise with two sentences and a list. The list includes function signatures which add useful context but also some verbosity; still, the structure is clear and front-loaded.

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

Completeness3/5

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

The tool has an output schema (not shown) but lacks parameter descriptions. For a simple get operation, the information is adequate but not thorough. Could benefit from describing what 'detailed information' includes.

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

Parameters2/5

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

Schema description coverage is 0%, and the description does not explain the parameters (app_id, tag_id) beyond their names. The related tools section includes parameter lists for other tools but not for this one, providing no added meaning.

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 clearly states 'Get detailed information about a specific tag', which is a specific verb-resource combination. It distinguishes itself from sibling tools like tags_list (which lists tags) and tags_list_triggers (which gets triggers for a tag).

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

Usage Guidelines4/5

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

The description provides a 'Related Tools' section listing tags_list_triggers and variables_list with their parameters, hinting at alternatives. However, it doesn't explicitly state when to use this tool versus others, leaving some inference to the agent.

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

tags_listA
Read-only

List tags for an app in Piwik PRO Tag Manager.

    Args:
        app_id: UUID of the app
        limit: Maximum number of tags to return (default: 10)
        offset: Number of tags to skip (default: 0)
        filters: Filter by tag name, is_active, template, consent_type, is_prioritized, has_any_triggers
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
app_idYes
offsetNo
filtersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
metaYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already mark this as read-only (readOnlyHint=true). The description adds value by listing filterable fields, but does not disclose additional behavioral traits like rate limits, response structure, or behavior when no tags exist. The annotation reduces the burden, but more detail would improve transparency.

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

Conciseness5/5

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

The description is concise (two sentences plus an Args list) and front-loaded with the main purpose. Every sentence adds value, and the structure is clear. No unnecessary words or repetition.

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

Completeness4/5

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

Given the presence of an output schema (so return values need not be described) and the tool's moderate complexity (4 parameters), the description covers the core functionality and parameter details well. It lacks mention of optional parameters or default behavior, but overall it is sufficiently complete for an AI agent to select and invoke the tool.

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?

With 0% schema description coverage, the description fully compensates by explaining each parameter: 'app_id' as UUID, 'limit' and 'offset' with defaults, and 'filters' with specific filterable fields. This provides meaning beyond the bare schema. However, the 'filters' parameter could be more explicit about its structure (e.g., key-value pairs).

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 clearly states the action ('List tags'), the resource ('tags'), and the context ('for an app in Piwik PRO Tag Manager'). It distinguishes itself from sibling tools like 'tags_get' (single tag) and 'templates_list_tags' (templates) by specifying the resource and scope.

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

Usage Guidelines3/5

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

The description implies usage for listing tags with optional filters, but does not explicitly state when to use this tool versus alternatives like 'tags_get' for individual tags or 'triggers_list_tags' for cross-referencing. No exclusion criteria or context is provided.

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

tags_list_triggersA
Read-only

Get list of triggers attached to a specific tag.

    Args:
        app_id: UUID of the app
        tag_id: UUID of the tag
        limit: Maximum number of triggers to return
        offset: Number of triggers to skip
        sort: Sort order - 'name', '-name', 'created_at', '-created_at', etc.
        name: Filter by trigger name (partial match)
        trigger_type: Filter by trigger type
    
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
sortNo
limitNo
app_idYes
offsetNo
tag_idYes
trigger_typeNo

TDQS

A3.6/5.0
Behavior3/5

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

The description states 'Get list', which is consistent with the annotation 'readOnlyHint: true'. No additional behavioral traits are disclosed beyond the annotation. Since annotations already indicate read-only, the description adds no new transparency, but also does not contradict annotations.

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 description is concise and well-structured with a clear purpose statement and a bullet-like list of parameters. The 'Args:' block is slightly verbose but remains easy to scan. Each sentence serves a purpose, though the parameter list could be more compact.

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

Completeness3/5

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

Given 7 parameters and no output schema, the description adequately explains the input parameters but does not describe the return value or pagination behavior beyond limit/offset. The tool is fairly complex with filtering options, but the description lacks context on response format or usage scenarios.

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?

Despite 0% schema description coverage, the description lists all parameters with brief explanations (e.g., 'UUID of the app', 'Sort order - name, -name, created_at, etc.'). This provides meaningful guidance beyond the bare schema, especially for parameters like 'sort' with examples. However, some explanations are minimal.

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 clearly states 'Get list of triggers attached to a specific tag', which is a specific verb ('Get list') and resource ('triggers attached to a specific tag'). This distinguishes from sibling tools like 'triggers_list' (all triggers) and 'triggers_list_tags' (tags for a trigger).

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. There is no mention of prerequisites, filtering behavior, or comparison to sibling tools. Usage context is entirely implicit.

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

templates_get_tagA
Read-only

Get requirements and usage details for a specific tag template.

    ⚠️ IMPORTANT: You MUST call templates_list_tags() first to get exact template names.
    Do NOT guess template names — use only names returned by templates_list_tags().

    Args:
        template_name: Exact template name as returned by templates_list_tags()

    Workflow:
        1. templates_list_tags() → get exact template names
        2. templates_get_tag(template_name='...') → get requirements (this tool)
        3. tags_create() → create the tag
    
ParametersJSON Schema
NameRequiredDescriptionDefault
template_nameYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, which the description aligns with by stating it 'gets' details. The description adds context about requiring exact names and a workflow, but does not detail the exact return structure (no output schema). Since annotations cover safety, the description adds value with workflow context.

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 description is well-structured with sections, but slightly verbose (e.g., the workflow repeats the same steps). However, every sentence is purposeful and front-loaded with the core purpose. Minor redundancy prevents a 5.

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

Completeness4/5

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

The tool has one parameter and no output schema. The description explains the input requirement and usage flow, but does not detail the output format (e.g., example response). For a simple retrieval tool, the context is solid but missing explicit return details.

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

Parameters5/5

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

The only parameter 'template_name' has 0% schema description coverage. The description compensates fully by specifying it must be an exact name from 'templates_list_tags()', including a workflow example. This adds critical meaning beyond the raw schema.

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 clearly states 'Get requirements and usage details for a specific tag template.' It uses a specific verb ('Get') and resource ('tag template'), distinguishing it from sibling tools like 'templates_list_tags' (for listing) and 'tags_get' (for existing tags).

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?

The description explicitly says 'You MUST call templates_list_tags() first to get exact template names' and provides a numbered workflow. It warns against guessing and specifies the correct usage order, leaving no ambiguity.

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

templates_get_triggerA
Read-only

Get requirements and usage details for a specific trigger template.

    ⚠️ IMPORTANT: You MUST call templates_list_triggers() first to get exact trigger type names.
    Do NOT guess trigger type names — use only names returned by templates_list_triggers().

    Args:
        template_name: Exact trigger type name as returned by templates_list_triggers()

    Workflow:
        1. templates_list_triggers() → get exact trigger type names
        2. templates_get_trigger(template_name='...') → get requirements (this tool)
        3. triggers_create() → create the trigger
    
ParametersJSON Schema
NameRequiredDescriptionDefault
template_nameYes

TDQS

A4.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description adds value by specifying the returned data (requirements/usage details) and the prerequisite. It does not disclose additional behavioral traits but complements annotations well.

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

Conciseness5/5

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

The description is concise yet structured with a clear purpose line, warning section, Args, and Workflow. Every sentence is necessary and well-organized, with no fluff.

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?

Despite having no output schema and simple parameters, the description fully covers the prerequisite workflow and proper parameter sourcing. It references sibling tools and provides complete context for correct invocation.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by stating that template_name must be 'the exact trigger type name as returned by templates_list_triggers()'. This adds critical semantic meaning beyond the schema's type/required declaration.

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 clearly states 'Get requirements and usage details for a specific trigger template,' using a specific verb and resource. This distinguishes it from sibling tools like templates_list_triggers (list) and triggers_get (get instance).

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?

The description explicitly instructs to call templates_list_triggers() first to get exact trigger type names, warns against guessing, and provides a numbered workflow. This gives excellent when-to-use and prerequisite guidance.

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

templates_get_variableA
Read-only

Get requirements, field mutability, and usage details for a specific variable template.

    ⚠️ IMPORTANT: You MUST call templates_list_variables() first to get exact variable type names.
    Do NOT guess variable type names — use only names returned by templates_list_variables().

    Args:
        template_name: Exact variable type name as returned by templates_list_variables()

    Workflow:
        1. templates_list_variables() → get exact variable type names
        2. templates_get_variable(template_name='...') → get requirements (this tool)
        3. variables_create() or variables_update() → create/update the variable
    
ParametersJSON Schema
NameRequiredDescriptionDefault
template_nameYes

TDQS

A4.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true. Description adds context that the tool returns requirements, mutability, and usage details. No contradictions or missing behavioral info beyond annotations.

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

Conciseness5/5

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

Well-structured with a main sentence, bold warning, Args section, and numbered workflow. Every sentence adds value without redundancy.

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?

For a simple lookup tool with one parameter and read-only annotation, the description fully covers what it does, prerequisites, and workflow integration. No missing elements.

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

Parameters5/5

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

Single parameter template_name has no schema description. Description fills the gap by explaining it must be an exact variable type name from templates_list_variables, which is critical for correct usage.

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?

Description clearly states it retrieves requirements, field mutability, and usage details for a specific variable template. Verb 'Get' is specific, and the resource is clearly identified. It distinguishes from siblings like templates_list_variables and other get templates.

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?

Explicitly warns to call templates_list_variables first and not to guess variable type names. Provides a step-by-step workflow showing how this tool fits with list and create/update tools.

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

templates_list_tagsA
Read-only

List all available tag templates for use with tags_create.

    ⚠️ IMPORTANT: You MUST call this tool before calling templates_get_tag() or tags_create()
    to discover exact template names. Do NOT guess template names.

    Workflow:
        1. templates_list_tags() → get exact template names
        2. templates_get_tag(template_name='...') → get requirements for chosen template
        3. tags_create() → create the tag
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the description does not need to restate that. It adds that the tool lists 'available' templates and must be called first, but does not disclose any further behavioral details (e.g., pagination, sorting, or output format). This is adequate but minimal given the annotations.

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

Conciseness5/5

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

The description is concise: two sentences plus a formatted workflow. Every sentence adds value, the warning is appropriately emphasized, and the structure is front-loaded with the core purpose.

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

Completeness4/5

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

Given the tool has no parameters, a read-only annotation, and no output schema, the description covers the necessary context: purpose, prerequisite, and workflow. However, it omits any hint about the return format (e.g., list of names or objects), which could be useful. Still, it is largely complete for this simple tool.

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?

The input schema has zero parameters with 100% schema description coverage. Per guidelines, a baseline of 4 is appropriate. The description does not need to add parameter semantics since none exist.

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 clearly states the tool lists all available tag templates for use with tags_create. It distinguishes from sibling tools like templates_get_tag and templates_list_triggers by explicitly mentioning the workflow and the prerequisite role.

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?

The description explicitly instructs the agent to call this tool before templates_get_tag or tags_create, warns against guessing names, and provides a clear three-step workflow. This leaves no ambiguity about when and why to use it.

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

templates_list_triggersA
Read-only

List all available trigger templates for use with triggers_create.

    ⚠️ IMPORTANT: You MUST call this tool before calling templates_get_trigger() or triggers_create()
    to discover exact trigger type names. Do NOT guess trigger type names.

    Workflow:
        1. templates_list_triggers() → get exact trigger type names
        2. templates_get_trigger(template_name='...') → get requirements for chosen type
        3. triggers_create() → create the trigger
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so no contradiction. Description adds valuable context about the necessity of discovery and workflow steps, but does not reveal additional behavioral traits beyond what annotations provide.

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

Conciseness5/5

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

Description is concise, with front-loaded purpose and a clear warning followed by a numbered workflow. Every sentence adds value, no wasted words.

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?

For a parameterless list tool with no output schema, the description fully explains its purpose, why it's needed, and how to use it in sequence with sibling tools. No gaps.

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?

Input schema has zero parameters, so baseline is 4. Description does not need to add parameter details, and it appropriately describes the tool as listing all available templates.

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?

Description clearly states it lists all trigger templates for use with triggers_create, specifying a specific verb and resource. It distinguishes from sibling tools like templates_get_trigger and templates_list_tags by stating its role in the workflow.

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?

Explicitly instructs to call this tool before templates_get_trigger or triggers_create, provides a numbered workflow, and warns against guessing trigger type names. Clearly communicates when and why to use this tool.

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

templates_list_variablesA
Read-only

List all available variable templates for use with variables_create and variables_update.

    ⚠️ IMPORTANT: You MUST call this tool before calling templates_get_variable() or variables_create()
    to discover exact variable type names. Do NOT guess variable type names.

    Workflow:
        1. templates_list_variables() → get exact variable type names
        2. templates_get_variable(template_name='...') → get requirements for chosen type
        3. variables_create() or variables_update() → create/update the variable
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

The description adds workflow context beyond the annotations (readOnlyHint=true). It explains that the tool discovers exact variable type names, which is useful behavioral context. No contradictions with annotations.

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 description is slightly lengthy but well-structured with headings, emojis, and bullet points. Every sentence adds value, though some redundancy exists between the IMPORTANT note and the workflow steps.

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

Completeness4/5

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

The description covers the tool's purpose and integration into a workflow. It doesn't specify the return format, but the tool is simple with no parameters and no output schema, so the description is sufficiently complete for an agent to understand when and how to use it.

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?

With 0 parameters, schema coverage is 100%. The description adds value by explaining that the tool returns exact variable type names needed for subsequent steps. Baseline 4 applies.

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 clearly states the verb 'list' and the resource 'variable templates', and explains its use with 'variables_create' and 'variables_update'. It distinguishes from sibling tools like 'templates_list_tags' and 'templates_list_triggers'.

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?

Explicitly instructs that this tool MUST be called before 'templates_get_variable' or 'variables_create', provides a step-by-step workflow, and warns against guessing variable type names. This sets clear usage context and alternatives.

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

tools_parameters_getA
Read-only

Get JSON schema for tool parameters.

    This tool provides parameter discovery for MCP tools that use JSON attributes.
    It returns the complete JSON schema including field types, descriptions,
    validation rules, and examples for tools that have been refactored to use
    the simplified JSON attributes interface.

    Args:
        tool_name: Name of the MCP tool to get parameters for (e.g., "apps_update")

    Returns:
        Dictionary containing JSON schema for the tool's parameters including:
        - type: Object type definition
        - properties: Field definitions with types and descriptions
        - required: List of required fields (usually empty for update tools)
        - definitions: Enum and complex type definitions

    Example Usage:
        schema = tools_parameters_get("apps_update")
        # Returns complete JSON schema with all 19 available fields

    Raises:
        ValueError: If tool_name is not recognized
    
ParametersJSON Schema
NameRequiredDescriptionDefault
tool_nameYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and description adds that it raises ValueError for unrecognized tool names, which is behavioral context beyond the annotation. No contradictions.

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 description is well-structured with sections for Args, Returns, Example, Raises, but slightly verbose. The purpose is front-loaded, and each section adds value.

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

Completeness4/5

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

Given no output schema, the description explains return structure in detail and includes exception info. For a simple tool with one parameter, it is fairly complete.

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

Parameters5/5

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

The input schema has 0% description coverage for the only parameter, but the description provides a clear explanation: 'tool_name: Name of the MCP tool to get parameters for (e.g., "apps_update")', adding essential meaning.

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 clearly states 'Get JSON schema for tool parameters' and explains it returns complete JSON schema for MCP tools. It distinguishes from sibling tools which perform different operations like listing or getting data.

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

Usage Guidelines4/5

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

The description provides example usage and mentions it's for tools using JSON attributes interface. However, it doesn't explicitly state when not to use or compare with alternatives.

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

tracker_settings_app_getA
Read-only

Get effective tracker settings for a specific app.

    Args:
        app_id: UUID of the app
        detailed: When true, include raw app-specific and global inputs alongside resolved settings

    Returns:
        Dictionary containing:
        - settings: Resolved effective tracker settings for the app
        - app_settings: Raw app-level settings when detailed=true
        - global_settings: Raw global settings when detailed=true

        Resolution rules:
        - app-specific scalar and boolean values override global values
        - null app scalar and boolean values fall back to global values
        - app array values are merged with global array values, preserving app values first
        - use tracker_settings_global_update to change global defaults explicitly
    
ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes
detailedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
settingsYesResolved effective settings for the app
app_settingsNoRaw app-specific settings as returned by the app tracker settings endpoint
global_settingsNoRaw global tracker settings used as defaults for the app

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description adds detailed behavioral context including resolution rules for scalar, boolean, and array values, and explains the effect of the 'detailed' parameter. This provides rich transparency without contradicting annotations.

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 description is well-structured with clear sections for Args, Returns, and Resolution rules, and front-loads the purpose. While comprehensive, it could be slightly more concise without losing clarity.

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?

Given the tool's moderate complexity (2 params, 1 required), no output schema, and the presence of sibling tools, the description thoroughly covers the purpose, behavior, parameters, and resolution logic, making it complete for effective usage.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by explaining both parameters: 'app_id' as UUID of the app and 'detailed' controlling the inclusion of raw inputs. It also details the return structure, adding meaning beyond the schema.

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 clearly states 'Get effective tracker settings for a specific app', using a specific verb and resource. It distinguishes itself from the sibling tool 'tracker_settings_global_get' which gets global settings, ensuring no ambiguity.

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

Usage Guidelines4/5

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

The description provides clear context on when to use the tool and explains resolution rules, but it does not explicitly state when not to use it or list alternative tools. It mentions an alternative 'tracker_settings_global_update' for changing global defaults, but lacks explicit exclusion for other siblings.

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

tracker_settings_global_getA
Read-only

Get global tracker settings.

    Returns:
        Dictionary containing global tracker settings including:
        - anonymize_visitor_geolocation_level: Geolocation anonymization level
        - anonymize_visitor_ip_level: IP anonymization level (0-4)
        - campaign_*_params: Campaign tracking parameters
        - session_* settings: Session handling configuration
        - excluded_ips: List of IPs excluded from tracking
        - excluded_user_agents: User agents excluded from tracking
        - site_search_query_params: Site search query parameters
        - site_search_category_params: Site search category parameters
        - updated_at: Last modification timestamp
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlsNoValid URLs for the app
updated_atNoLast modification timestamp
excluded_ipsNoIPs excluded from tracking
set_ip_trackingNoEnable IP tracking
exclude_crawlersNoExclude crawler bots
use_session_hashNoUse session hash for non-anonymous events
keep_url_fragmentNoKeep URL fragment in tracking
campaign_id_paramsNoCampaign ID parameters
campaign_name_paramsNoCampaign name parameters
exclude_unknown_urlsNoExclude unknown URLs
excluded_user_agentsNoUser agent strings excluded from tracking
campaign_medium_paramsNoCampaign medium parameters
campaign_source_paramsNoCampaign source parameters
campaign_content_paramsNoCampaign content parameters
campaign_keyword_paramsNoCampaign keyword parameters
session_max_event_countNoMaximum events per session
site_search_query_paramsNoSite search query parameters
anonymize_visitor_ip_levelNoAnonymize 'n' octets of visitor IP addresses
use_anonymous_session_hashNoUse session hash for anonymous events
site_search_category_paramsNoSite search category parameters
session_max_duration_secondsNoMaximum session duration in seconds
session_limit_exceeded_actionNoSession limit exceeded action
tracking_fingerprint_disabledNoDisable tracking fingerprint
fingerprint_based_on_anonymized_ipNoFingerprint based on anonymized IP
strip_site_search_query_parametersNoStrip site search query parameters
anonymize_visitor_geolocation_levelNoGeolocation anonymization level
enable_fingerprinting_across_websitesNoEnable fingerprinting across websites
create_new_visit_when_campaign_changesNoCreate new visit when campaign changes
url_query_parameter_to_exclude_from_urlNoURL query parameters to exclude
create_new_visit_when_website_referrer_changesNoCreate new visit when referrer changes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true. The description adds value by listing the returned dictionary keys, providing specific behavioral context beyond annotations.

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

Conciseness5/5

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

The description is a single concise paragraph with bullet-pointed return fields, no wasted words, and the purpose is front-loaded.

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?

Given zero parameters and an existing output schema, the description provides comprehensive details about the return structure, making the tool's behavior fully understood.

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?

Input schema has 0 parameters, so baseline is 4. The description explains the output in detail, which covers the only semantic need.

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 clearly states 'Get global tracker settings' and lists the returned fields, specifying the resource and scope. It distinguishes from sibling 'tracker_settings_app_get' by indicating global vs app-specific.

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

Usage Guidelines3/5

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

No explicit guidance on when to use this tool versus alternatives like 'tracker_settings_app_get'. However, the context implies it is for global settings, and the tool is straightforward with no parameters, so usage is self-explanatory.

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

triggers_getA
Read-only

Get detailed information about a specific trigger.

    Related Tools:
        - triggers_list_tags(app_id, trigger_id) - See what tags are assigned to this trigger
    
ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes
trigger_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations provide readOnlyHint=true, aligning with the description's 'Get' action. However, beyond safety, the description adds no behavioral context (e.g., error handling, authentication requirements). The description does not contradict annotations.

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 description is short (two sentences) and front-loaded with the main action. The related tools note adds utility without redundancy. It is appropriately concise.

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

Completeness3/5

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

For a simple get-by-ID operation with an output schema, the description is minimally adequate but lacks parameter context and error scenarios. It covers the core purpose but leaves gaps for an AI agent.

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

Parameters2/5

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

Schema description coverage is 0%, and the description does not explain the two required parameters (app_id, trigger_id). The description adds no meaning beyond the schema, which already provides minimal info.

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 uses the specific verb 'Get' and resource 'detailed information about a specific trigger', clearly distinguishing it from sibling tools like triggers_list (which lists triggers) and triggers_list_tags (which lists tags).

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

Usage Guidelines3/5

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

The description mentions a related tool (triggers_list_tags) but does not provide explicit guidance on when to use this tool versus alternatives like triggers_list or triggers_get with other contexts. Usage is implied but not clearly scoped.

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

triggers_listA
Read-only

List triggers for an app in Piwik PRO Tag Manager.

    Args:
        app_id: UUID of the app
        limit: Maximum number of triggers to return (default: 10)
        offset: Number of triggers to skip (default: 0)
        filters: Optional filter keys: name, trigger_type, has_any_tags,
            has_any_condition_with_audience, condition_with_audience_id.
            For page-view triggers use trigger_type `page_view` (not `pageview`).
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
app_idYes
offsetNo
filtersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
metaYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, which the description is consistent with — no contradiction. The description adds modest behavioral context: available filter keys and the pageview gotcha, which hints at how the underlying API behaves. However, it doesn't go deeper into pagination limits, sorting, or rate-limit considerations. Acceptable given annotations cover the safety profile.

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

Conciseness5/5

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

Tight one-sentence summary followed by clean, scannable Args documentation. No fluff, no repetition of the schema, and every sentence earns its place. The format makes it easy for an agent to parse quickly.

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

Completeness4/5

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

An output schema exists, so the description doesn't need to explain return values — and it doesn't. For a straightforward list operation with read-only annotations, the description plus schema cover requirements, parameters, and a key gotcha. Minor gaps: no mention of maximum limit values or default sort order, but nothing substantial is missing for a tool of this complexity.

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 0%, so the description carries the entire documentation burden — and it delivers. It documents the semantic meaning of all 4 parameters and, critically, lists the valid filter keys for the opaque 'filters' object (which the schema leaves as additionalProperties: true). The page_view tip adds value. Would be a 5 with filter value types (e.g., is has_any_tags a boolean or tag ID?).

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

Purpose4/5

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

Clear verb+resource+scope: 'List triggers for an app in Piwik PRO Tag Manager.' This clearly signals a read/list operation and implies the scope. It's distinguishable from siblings like triggers_get (singular) and tags_list_triggers by name and context, though it doesn't explicitly name them or their differentiators.

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

Usage Guidelines3/5

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

No explicit when-to-use or when-not-to-use guidance, and no named alternatives despite siblings like triggers_get and tags_list_triggers existing. However, the filter documentation and the tip about using 'page_view' (not 'pageview') provide useful value-format guidance that helps an agent use this tool correctly. As such, it earns above a 2 for basic usage context that implies when this list tool is appropriate.

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

triggers_list_tagsA
Read-only

Get list of tags assigned to a specific trigger.

    Args:
        app_id: UUID of the app
        trigger_id: UUID of the trigger
        limit: Maximum number of tags to return
        offset: Number of tags to skip
        sort: Sort order - 'name', '-name', 'created_at', '-created_at', etc.
        name: Filter by tag name (partial match)
        is_active: Filter by active status
        template: Filter by tag template
        consent_type: Filter by consent type
        is_prioritized: Filter by prioritized status
    
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
sortNo
limitNo
app_idYes
offsetNo
templateNo
is_activeNo
trigger_idYes
consent_typeNo
is_prioritizedNo

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, which is consistent with 'Get list'. The description adds no additional behavioral context such as pagination details, authorization requirements, or side effects. Given annotations, a 3 is appropriate.

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 description is a single sentence plus a clear docstring-style parameter list. It's efficient and front-loaded, though the parameter list could be more compact.

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

Completeness4/5

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

Given 10 parameters and no output schema, the description covers most parameter semantics. However, it lacks details on return format, pagination behavior, and default sort order, which would be beneficial.

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?

The input schema has 0% description coverage, so the description compensates by explaining each parameter's purpose (e.g., 'Filter by tag name (partial match)'). This adds meaningful context beyond the schema titles.

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 clearly states 'Get list of tags assigned to a specific trigger' with a specific verb and resource. It distinguishes from sibling tools like tags_list (all tags) and tags_list_triggers (triggers for a tag).

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool versus alternatives. The agent must infer usage from the parameter list and tool name, but no 'when not to use' or 'prefer X for Y' is provided.

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

variables_getB
Read-only

Get detailed information about a specific variable.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes
variable_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

B3.3/5.0
Behavior3/5

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

The description is consistent with 'readOnlyHint' annotation. It adds no extra behavioral context beyond the annotation, but the annotation itself covers the safety profile.

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 description is concise, only one sentence. It is front-loaded and contains no unnecessary words.

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

Completeness3/5

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

Given the existence of an output schema and readOnlyHint annotation, the description is minimally sufficient. However, it lacks guidance on usage compared to siblings and does not explain what 'detailed information' entails.

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

Parameters2/5

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

With 0% schema description coverage, the description does not explain the parameters. Although parameter names 'app_id' and 'variable_id' are intuitive, the description adds no meaning beyond the schema.

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 clearly states the tool retrieves detailed information about a specific variable. The verb 'get' and resource 'variable' are explicit, and it distinguishes from 'variables_list' which would list multiple variables.

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

Usage Guidelines2/5

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

No guidance on when to use this tool over siblings like 'variables_list'. No mention of prerequisites or context for using the tool.

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

variables_listA
Read-only

List variables for an app in Piwik PRO Tag Manager.

    Lists custom (user-created) variables for the app. Do not use this tool to
    resolve built-in variable UUIDs for trigger conditions — built-in UUIDs are
    fixed platform-wide and are listed in trigger_base.json →
    conditions_reference.conditions.<key>.builtin_variable_id.

    Args:
        app_id: UUID of the app
        limit: Maximum number of variables to return (default: 10)
        offset: Number of variables to skip (default: 0)
        filters: Optional filter keys: `name`, `variable_type`, and `builtin`
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
app_idYes
offsetNo
filtersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
metaYes

TDQS

A4.7/5.0
Behavior4/5

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

The annotations provide readOnlyHint=true, so the read-only nature is already established. The description adds meaningful behavioral context by clarifying that the tool handles only custom variables and that built-in UUIDs are fixed platform-wide, which helps the agent understand platform behavior beyond the annotation. It does not disclose response details, but the output schema covers that.

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

Conciseness5/5

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

The description is concise yet complete: the verbiage is purposeful, and the 'Do not use' caveat earns its place because it prevents misuse. The Args block is well-organized and makes each parameter easy to find. No obvious fluff or tautology.

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?

Given the tool is a straightforward read-only list operation, the description covers its core limitations in scope, parameter use, and alternative sources for built-in identifiers. Sibling tools like variables_get would naturally be for individual retrieval, but the list semantics are clear. All necessary context is present.

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?

Input schema has no descriptions on properties, so the description must compensate. The Args section documents all four parameters, including the crucial note that filters can use keys 'name', 'variable_type', and 'builtin'. This adds useful meaning beyond the bare schema, though values for each available item are not detailed.

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 clear verb and resource: 'List variables for an app in Piwik PRO Tag Manager.' It further specifies that it lists custom (user-created) variables and explicitly distinguishes this tool from resolving built-in variable UUIDs. This clearly separates it from sibling tools like variables_get and templates_list_variables.

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?

The description gives an explicit exclusion and an alternative: 'Do not use this tool to resolve built-in variable UUIDs for trigger conditions' and points to trigger_base.json → conditions_reference.conditions.<key>.builtin_variable_id. This is strong usage guidance beyond just stating what the tool does.

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

versions_get_draftA
Read-only

Get draft version for an app.

    Args:
        app_id: UUID of the app

    Returns:
        Dictionary containing draft version details including:
        - data: Draft version object with all tags, triggers, variables
        - Version configuration and metadata
    
ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations indicate readOnlyHint=true, so the description adds no behavioral context beyond that. It does not contradict annotations, but also does not disclose permissions, uniqueness, or return format details beyond what's in 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.

Conciseness5/5

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

The description is concise, well-structured with Args and Returns sections, and front-loaded with the core purpose in the first sentence.

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?

For a simple getter with one parameter and an output schema (not shown but referenced), the description covers the return structure and is sufficiently complete for the tool's complexity.

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 has 0% description coverage, but the description adds semantic value by stating 'UUID of the app' for the parameter app_id, which is more informative than the schema's 'App Id' title.

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 clearly states the action ('Get') and the resource ('draft version for an app'), and distinguishes itself from siblings like versions_get_published and versions_list.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives (e.g., when to get draft vs published), nor any preconditions or exclusions.

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

versions_get_publishedA
Read-only

Get published version for an app.

    Args:
        app_id: UUID of the app

    Returns:
        Dictionary containing published version details including:
        - data: Published version object with all active tags, triggers, variables
        - Version configuration and metadata
    
ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, indicating a safe read operation. The description adds behavioral context by detailing the return format (dictionary with data, tags, triggers, variables), going beyond the minimal annotation information.

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

Conciseness5/5

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

The description is concise and well-structured: a one-sentence purpose, followed by structured Args and Returns sections. Every part adds value with no redundancy.

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?

For a simple read-only tool with one parameter, the description covers purpose, parameter semantics, and return shape comprehensively. The presence of an output schema further alleviates the need to describe return values in detail.

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

Parameters5/5

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

Schema coverage is 0%, but the description fully compensates by clearly documenting the single parameter 'app_id' as 'UUID of the app,' adding meaning beyond the schema's type-only definition.

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 clearly states the tool's purpose: 'Get published version for an app.' It uses a specific verb and resource, and distinguishes from siblings like versions_get_draft and versions_list, as it specifically targets the published version.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus its siblings (e.g., versions_get_draft). It lacks explicit context, such as 'use this when you need the active/live version' or 'for draft use versions_get_draft.'

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

versions_listA
Read-only

List versions for an app in Piwik PRO Tag Manager.

    Args:
        app_id: UUID of the app
        limit: Maximum number of versions to return (default: 10)
        offset: Number of versions to skip (default: 0)

    Returns:
        Dictionary containing version list and metadata including:
        - data: List of version objects with id, name, version_type, and timestamps
        - meta: Metadata with pagination information
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
app_idYes
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
metaYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations mark this as readOnlyHint=true, and the description adds that it returns a dictionary with pagination metadata. It does not contradict annotations and provides useful return format details, though it omits potential rate limits or auth requirements.

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 description uses a clear docstring format with Args and Returns sections. It is slightly verbose but well-organized and easy to parse. No unnecessary filler.

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

Completeness4/5

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

With annotations providing readOnlyHint and the description covering parameters and return structure, the description is largely complete for a list tool. Minor gap: no mention of error conditions or behavior when app_id is invalid.

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?

The description adds meanings for all three parameters (app_id, limit, offset) beyond the schema titles, including default values and roles. This compensates for the 0% schema description coverage.

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 clearly states it lists versions for a specific app in Piwik PRO Tag Manager, using the verb 'list' and the resource 'versions'. It distinguishes from siblings like versions_get_draft and versions_get_published by focusing on the full version list.

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

Usage Guidelines3/5

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

No explicit guidance on when to use this tool versus alternatives (e.g., versions_get_draft, versions_get_published). The description implies it is for listing all versions, but does not mention exclusions or context.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev0.7.0
    • Addedoperations_get
  2. 1 tool updatev0.5.0
    • Changedapps_get12 fields changed
      • addedOutput schema / properties / cnil
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Whether CNIL integration is enabled",
        +  "title": "Cnil"
        +}
      • addedOutput schema / properties / delay
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "App delay in milliseconds",
        +  "title": "Delay"
        +}
      • addedOutput schema / properties / e_commerce_tracking
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Whether e-commerce tracking is enabled",
        +  "title": "E Commerce Tracking"
        +}
      • addedOutput schema / properties / gdpr_data_anonymization_mode
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "GDPR data anonymization mode",
        +  "title": "Gdpr Data Anonymization Mode"
        +}
      • addedOutput schema / properties / gdpr_user_mode_enabled
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Whether GDPR user mode is enabled",
        +  "title": "Gdpr User Mode Enabled"
        +}
      • addedOutput schema / properties / privacy_cookie_domains
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "List of privacy cookie domains",
        +  "title": "Privacy Cookie Domains"
        +}
      • addedOutput schema / properties / privacy_cookie_domains_enabled
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Whether privacy cookie domains are enabled",
        +  "title": "Privacy Cookie Domains Enabled"
        +}
      • addedOutput schema / properties / privacy_cookie_expiration_period
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Privacy cookie expiration period in seconds",
        +  "title": "Privacy Cookie Expiration Period"
        +}
      • addedOutput schema / properties / privacy_use_cookies
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Whether privacy mode uses cookies",
        +  "title": "Privacy Use Cookies"
        +}
      • addedOutput schema / properties / privacy_use_fingerprinting
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Whether privacy mode uses fingerprinting",
        +  "title": "Privacy Use Fingerprinting"
        +}
      • addedOutput schema / properties / session_id_strict_privacy_mode
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Whether session ID strict privacy mode is enabled",
        +  "title": "Session Id Strict Privacy Mode"
        +}
      • addedOutput schema / properties / sharepoint_integration
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Whether SharePoint integration is enabled",
        +  "title": "Sharepoint Integration"
        +}
  3. 46 tool updatesv0.4.0
    • Removedanalytics_annotations_create
    • Removedanalytics_annotations_delete
    • Removedanalytics_annotations_update
    • Addedanalytics_custom_dimensions_get
    • Addedanalytics_custom_dimensions_get_slots
    • Addedanalytics_custom_dimensions_list
    • Addedanalytics_dimensions_details_list
    • Addedanalytics_dimensions_list
    • Addedanalytics_goals_get
    • Addedanalytics_goals_list
    • Addedanalytics_metrics_details_list
    • Addedanalytics_metrics_list
    • Addedanalytics_query_execute
    • Removedapps_create
    • Removedapps_delete
    • Changedapps_list1 field changed
      • changedInput schema / properties / limit / default
        Previous value: -10New value: +100
    • Removedapps_update
    • Removedaudiences_create
    • Removedaudiences_delete
    • Removedaudiences_update
    • Removedtags_copy
    • Removedtags_create
    • Removedtags_delete
    • Changedtags_get1 field changed
      • addedOutput schema / $defs / TagManagerResource / properties / relationships
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional JSON:API relationships payload",
        +  "title": "Relationships"
        +}
    • Changedtags_list1 field changed
      • addedOutput schema / $defs / TagManagerResource / properties / relationships
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional JSON:API relationships payload",
        +  "title": "Relationships"
        +}
    • Removedtags_update
    • Removedtemplates_list
    • Addedtemplates_list_tags
    • Removedtracker_settings_app_delete
    • Changedtracker_settings_app_get40 fields changed
      • addedInput schema / properties / detailed
        Added value: +{
        +  "default": false,
        +  "title": "Detailed",
        +  "type": "boolean"
        +}
      • addedOutput schema / $defs
        Added value: +{
        +  "AppTrackerSettings": {
        +    "description": "App-specific tracker settings model.",
        +    "properties": {
        +      "anonymize_visitor_geolocation_level": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/GeolocationLevel"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Removes geolocation data more granular than the selected level"
        +      },
        +      "anonymize_visitor_ip_level": {
        +        "anyOf": [
        +          {
        +            "maximum": 4,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Anonymize 'n' octets of visitor IP addresses",
        +        "title": "Anonymize Visitor Ip Level"
        +      },
        +      "campaign_content_params": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "URL parameters used to identify campaign content",
        +        "title": "Campaign Content Params"
        +      },
        +      "campaign_id_params": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "URL parameters used to identify the campaign ID",
        +        "title": "Campaign Id Params"
        +      },
        +      "campaign_keyword_params": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "URL parameters used to identify campaign keywords",
        +        "title": "Campaign Keyword Params"
        +      },
        +      "campaign_medium_params": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "URL parameters used to identify the campaign medium",
        +        "title": "Campaign Medium Params"
        +      },
        +      "campaign_name_params": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "URL parameters used to identify the campaign name",
        +        "title": "Campaign Name Params"
        +      },
        +      "campaign_source_params": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "URL parameters used to identify the campaign source",
        +        "title": "Campaign Source Params"
        +      },
        +      "create_new_visit_when_campaign_changes": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, starts a new session when the campaign name or type changes",
        +        "title": "Create New Visit When Campaign Changes"
        +      },
        +      "create_new_visit_when_website_referrer_changes": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, starts a new session when the referrer name or type changes",
        +        "title": "Create New Visit When Website Referrer Changes"
        +      },
        +      "enable_fingerprinting_across_websites": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, tries to generate a unified visitor ID across different websites",
        +        "title": "Enable Fingerprinting Across Websites"
        +      },
        +      "exclude_crawlers": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, crawler bots are not tracked",
        +        "title": "Exclude Crawlers"
        +      },
        +      "exclude_unknown_urls": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, requests from URLs not listed in the urls collection are discarded",
        +        "title": "Exclude Unknown Urls"
        +      },
        +      "excluded_ips": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "A list of IPs to blacklist from tracking",
        +        "title": "Excluded Ips"
        +      },
        +      "excluded_user_agents": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "A list of user agent strings to exclude from tracking",
        +        "title": "Excluded User Agents"
        +      },
        +      "fingerprint_based_on_anonymized_ip": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, geolocation is based on the anonymized IP",
        +        "title": "Fingerprint Based On Anonymized Ip"
        +      },
        +      "keep_url_fragment": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If false, the URL fragment (part after '#') is removed before tracking",
        +        "title": "Keep Url Fragment"
        +      },
        +      "session_limit_exceeded_action": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/SessionLimitAction"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Defines behavior when a session limit is reached"
        +      },
        +      "session_max_duration_seconds": {
        +        "anyOf": [
        +          {
        +            "maximum": 43200,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "The maximum duration of a session in seconds",
        +        "title": "Session Max Duration Seconds"
        +      },
        +      "session_max_event_count": {
        +        "anyOf": [
        +          {
        +            "maximum": 65535,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "The maximum number of events in a session",
        +        "title": "Session Max Event Count"
        +      },
        +      "set_ip_tracking": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If false, tracker will remove all IP information from the request",
        +        "title": "Set Ip Tracking"
        +      },
        +      "site_search_category_params": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "URL parameters used for site search categories",
        +        "title": "Site Search Category Params"
        +      },
        +      "site_search_query_params": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "URL parameters used for site search keywords",
        +        "title": "Site Search Query Params"
        +      },
        +      "strip_site_search_query_parameters": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, site search parameters are removed from URLs in reports",
        +        "title": "Strip Site Search Query Parameters"
        +      },
        +      "tracking_fingerprint_disabled": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, the tracker will use the fingerprint from the cookie",
        +        "title": "Tracking Fingerprint Disabled"
        +      },
        +      "updated_at": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Timestamp of the object's last modification",
        +        "title": "Updated At"
        +      },
        +      "url_query_parameter_to_exclude_from_url": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "A list of URL query parameters to exclude from tracking",
        +        "title": "Url Query Parameter To Exclude From Url"
        +      },
        +      "urls": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "A list of valid URLs for the app",
        +        "title": "Urls"
        +      },
        +      "use_anonymous_session_hash": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, anonymous events are matched into sessions using a Session Hash",
        +        "title": "Use Anonymous Session Hash"
        +      },
        +      "use_session_hash": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, non-anonymous events are matched into sessions using a Session Hash",
        +        "title": "Use Session Hash"
        +      }
        +    },
        +    "title": "AppTrackerSettings",
        +    "type": "object"
        +  },
        +  "GeolocationLevel": {
        +    "description": "Geolocation anonymization level enumeration.",
        +    "enum": [
        +      "none",
        +      "City",
        +      "Region",
        +      "Country",
        +      "Continent"
        +    ],
        +    "title": "GeolocationLevel",
        +    "type": "string"
        +  },
        +  "GlobalTrackerSettings": {
        +    "description": "Global tracker settings model.",
        +    "properties": {
        +      "anonymize_visitor_geolocation_level": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/GeolocationLevel"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Removes geolocation data more granular than the selected level"
        +      },
        +      "anonymize_visitor_ip_level": {
        +        "anyOf": [
        +          {
        +            "maximum": 4,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Anonymize 'n' octets of visitor IP addresses",
        +        "title": "Anonymize Visitor Ip Level"
        +      },
        +      "campaign_content_params": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "URL parameters used to identify campaign content",
        +        "title": "Campaign Content Params"
        +      },
        +      "campaign_id_params": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "URL parameters used to identify the campaign ID",
        +        "title": "Campaign Id Params"
        +      },
        +      "campaign_keyword_params": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "URL parameters used to identify campaign keywords",
        +        "title": "Campaign Keyword Params"
        +      },
        +      "campaign_medium_params": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "URL parameters used to identify the campaign medium",
        +        "title": "Campaign Medium Params"
        +      },
        +      "campaign_name_params": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "URL parameters used to identify the campaign name",
        +        "title": "Campaign Name Params"
        +      },
        +      "campaign_source_params": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "URL parameters used to identify the campaign source",
        +        "title": "Campaign Source Params"
        +      },
        +      "create_new_visit_when_campaign_changes": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, starts a new session when the campaign name or type changes",
        +        "title": "Create New Visit When Campaign Changes"
        +      },
        +      "create_new_visit_when_website_referrer_changes": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, starts a new session when the referrer name or type changes",
        +        "title": "Create New Visit When Website Referrer Changes"
        +      },
        +      "enable_fingerprinting_across_websites": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, tries to generate a unified visitor ID across different websites",
        +        "title": "Enable Fingerprinting Across Websites"
        +      },
        +      "exclude_crawlers": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, crawler bots are not tracked",
        +        "title": "Exclude Crawlers"
        +      },
        +      "exclude_unknown_urls": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, requests from URLs not listed in the urls collection are discarded",
        +        "title": "Exclude Unknown Urls"
        +      },
        +      "excluded_ips": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "A list of IPs to blacklist from tracking",
        +        "title": "Excluded Ips"
        +      },
        +      "excluded_user_agents": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "A list of user agent strings to exclude from tracking",
        +        "title": "Excluded User Agents"
        +      },
        +      "fingerprint_based_on_anonymized_ip": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, geolocation is based on the anonymized IP",
        +        "title": "Fingerprint Based On Anonymized Ip"
        +      },
        +      "keep_url_fragment": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If false, the URL fragment (part after '#') is removed before tracking",
        +        "title": "Keep Url Fragment"
        +      },
        +      "session_limit_exceeded_action": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/SessionLimitAction"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Defines behavior when a session limit is reached"
        +      },
        +      "session_max_duration_seconds": {
        +        "anyOf": [
        +          {
        +            "maximum": 43200,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "The maximum duration of a session in seconds",
        +        "title": "Session Max Duration Seconds"
        +      },
        +      "session_max_event_count": {
        +        "anyOf": [
        +          {
        +            "maximum": 65535,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "The maximum number of events in a session",
        +        "title": "Session Max Event Count"
        +      },
        +      "set_ip_tracking": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If false, tracker will remove all IP information from the request",
        +        "title": "Set Ip Tracking"
        +      },
        +      "site_search_category_params": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "URL parameters used for site search categories",
        +        "title": "Site Search Category Params"
        +      },
        +      "site_search_query_params": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "URL parameters used for site search keywords",
        +        "title": "Site Search Query Params"
        +      },
        +      "strip_site_search_query_parameters": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, site search parameters are removed from URLs in reports",
        +        "title": "Strip Site Search Query Parameters"
        +      },
        +      "tracking_fingerprint_disabled": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, the tracker will use the fingerprint from the cookie",
        +        "title": "Tracking Fingerprint Disabled"
        +      },
        +      "updated_at": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Timestamp of the object's last modification",
        +        "title": "Updated At"
        +      },
        +      "url_query_parameter_to_exclude_from_url": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "A list of URL query parameters to exclude from tracking",
        +        "title": "Url Query Parameter To Exclude From Url"
        +      },
        +      "use_anonymous_session_hash": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, anonymous events are matched into sessions using a Session Hash",
        +        "title": "Use Anonymous Session Hash"
        +      },
        +      "use_session_hash": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "If true, non-anonymous events are matched into sessions using a Session Hash",
        +        "title": "Use Session Hash"
        +      }
        +    },
        +    "title": "GlobalTrackerSettings",
        +    "type": "object"
        +  },
        +  "SessionLimitAction": {
        +    "description": "Session limit exceeded action enumeration.",
        +    "enum": [
        +      "split_and_exclude",
        +      "just_split"
        +    ],
        +    "title": "SessionLimitAction",
        +    "type": "string"
        +  },
        +  "TrackerSettingsResponse": {
        +    "description": "Flat tracker settings response model.",
        +    "properties": {
        +      "anonymize_visitor_geolocation_level": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Geolocation anonymization level",
        +        "title": "Anonymize Visitor Geolocation Level"
        +      },
        +      "anonymize_visitor_ip_level": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Anonymize 'n' octets of visitor IP addresses",
        +        "title": "Anonymize Visitor Ip Level"
        +      },
        +      "campaign_content_params": {
        +        "description": "Campaign content parameters",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Campaign Content Params",
        +        "type": "array"
        +      },
        +      "campaign_id_params": {
        +        "description": "Campaign ID parameters",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Campaign Id Params",
        +        "type": "array"
        +      },
        +      "campaign_keyword_params": {
        +        "description": "Campaign keyword parameters",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Campaign Keyword Params",
        +        "type": "array"
        +      },
        +      "campaign_medium_params": {
        +        "description": "Campaign medium parameters",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Campaign Medium Params",
        +        "type": "array"
        +      },
        +      "campaign_name_params": {
        +        "description": "Campaign name parameters",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Campaign Name Params",
        +        "type": "array"
        +      },
        +      "campaign_source_params": {
        +        "description": "Campaign source parameters",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Campaign Source Params",
        +        "type": "array"
        +      },
        +      "create_new_visit_when_campaign_changes": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Create new visit when campaign changes",
        +        "title": "Create New Visit When Campaign Changes"
        +      },
        +      "create_new_visit_when_website_referrer_changes": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Create new visit when referrer changes",
        +        "title": "Create New Visit When Website Referrer Changes"
        +      },
        +      "enable_fingerprinting_across_websites": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Enable fingerprinting across websites",
        +        "title": "Enable Fingerprinting Across Websites"
        +      },
        +      "exclude_crawlers": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Exclude crawler bots",
        +        "title": "Exclude Crawlers"
        +      },
        +      "exclude_unknown_urls": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Exclude unknown URLs",
        +        "title": "Exclude Unknown Urls"
        +      },
        +      "excluded_ips": {
        +        "description": "IPs excluded from tracking",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Excluded Ips",
        +        "type": "array"
        +      },
        +      "excluded_user_agents": {
        +        "description": "User agent strings excluded from tracking",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Excluded User Agents",
        +        "type": "array"
        +      },
        +      "fingerprint_based_on_anonymized_ip": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Fingerprint based on anonymized IP",
        +        "title": "Fingerprint Based On Anonymized Ip"
        +      },
        +      "keep_url_fragment": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Keep URL fragment in tracking",
        +        "title": "Keep Url Fragment"
        +      },
        +      "session_limit_exceeded_action": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Session limit exceeded action",
        +        "title": "Session Limit Exceeded Action"
        +      },
        +      "session_max_duration_seconds": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Maximum session duration in seconds",
        +        "title": "Session Max Duration Seconds"
        +      },
        +      "session_max_event_count": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Maximum events per session",
        +        "title": "Session Max Event Count"
        +      },
        +      "set_ip_tracking": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Enable IP tracking",
        +        "title": "Set Ip Tracking"
        +      },
        +      "site_search_category_params": {
        +        "description": "Site search category parameters",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Site Search Category Params",
        +        "type": "array"
        +      },
        +      "site_search_query_params": {
        +        "description": "Site search query parameters",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Site Search Query Params",
        +        "type": "array"
        +      },
        +      "strip_site_search_query_parameters": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Strip site search query parameters",
        +        "title": "Strip Site Search Query Parameters"
        +      },
        +      "tracking_fingerprint_disabled": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Disable tracking fingerprint",
        +        "title": "Tracking Fingerprint Disabled"
        +      },
        +      "updated_at": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Last modification timestamp",
        +        "title": "Updated At"
        +      },
        +      "url_query_parameter_to_exclude_from_url": {
        +        "description": "URL query parameters to exclude",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Url Query Parameter To Exclude From Url",
        +        "type": "array"
        +      },
        +      "urls": {
        +        "description": "Valid URLs for the app",
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Urls",
        +        "type": "array"
        +      },
        +      "use_anonymous_session_hash": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Use session hash for anonymous events",
        +        "title": "Use Anonymous Session Hash"
        +      },
        +      "use_session_hash": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Use session hash for non-anonymous events",
        +        "title": "Use Session Hash"
        +      }
        +    },
        +    "title": "TrackerSettingsResponse",
        +    "type": "object"
        +  }
        +}
      • changedOutput schema / description
        Previous value: -"Response model for tracker settings (supports both global and app-specific)."New value: +"Response model for app tracker settings with optional detailed breakdown."
      • removedOutput schema / properties / anonymize_visitor_geolocation_level
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Geolocation anonymization level",
        -  "title": "Anonymize Visitor Geolocation Level"
        -}
      • removedOutput schema / properties / anonymize_visitor_ip_level
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "integer"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Anonymize 'n' octets of visitor IP addresses",
        -  "title": "Anonymize Visitor Ip Level"
        -}
      • addedOutput schema / properties / app_settings
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/AppTrackerSettings"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Raw app-specific settings as returned by the app tracker settings endpoint"
        +}
      • removedOutput schema / properties / campaign_content_params
        Removed value: -{
        -  "description": "Campaign content parameters",
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Campaign Content Params",
        -  "type": "array"
        -}
      • removedOutput schema / properties / campaign_id_params
        Removed value: -{
        -  "description": "Campaign ID parameters",
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Campaign Id Params",
        -  "type": "array"
        -}
      • removedOutput schema / properties / campaign_keyword_params
        Removed value: -{
        -  "description": "Campaign keyword parameters",
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Campaign Keyword Params",
        -  "type": "array"
        -}
      • removedOutput schema / properties / campaign_medium_params
        Removed value: -{
        -  "description": "Campaign medium parameters",
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Campaign Medium Params",
        -  "type": "array"
        -}
      • removedOutput schema / properties / campaign_name_params
        Removed value: -{
        -  "description": "Campaign name parameters",
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Campaign Name Params",
        -  "type": "array"
        -}
      • removedOutput schema / properties / campaign_source_params
        Removed value: -{
        -  "description": "Campaign source parameters",
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Campaign Source Params",
        -  "type": "array"
        -}
      • removedOutput schema / properties / create_new_visit_when_campaign_changes
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Create new visit when campaign changes",
        -  "title": "Create New Visit When Campaign Changes"
        -}
      • removedOutput schema / properties / create_new_visit_when_website_referrer_changes
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Create new visit when referrer changes",
        -  "title": "Create New Visit When Website Referrer Changes"
        -}
      • removedOutput schema / properties / enable_fingerprinting_across_websites
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Enable fingerprinting across websites",
        -  "title": "Enable Fingerprinting Across Websites"
        -}
      • removedOutput schema / properties / exclude_crawlers
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Exclude crawler bots",
        -  "title": "Exclude Crawlers"
        -}
      • removedOutput schema / properties / exclude_unknown_urls
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Exclude unknown URLs",
        -  "title": "Exclude Unknown Urls"
        -}
      • removedOutput schema / properties / excluded_ips
        Removed value: -{
        -  "description": "IPs excluded from tracking",
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Excluded Ips",
        -  "type": "array"
        -}
      • removedOutput schema / properties / excluded_url_params
        Removed value: -{
        -  "description": "URL parameters excluded from tracking",
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Excluded Url Params",
        -  "type": "array"
        -}
      • removedOutput schema / properties / excluded_user_agents
        Removed value: -{
        -  "description": "User agent strings excluded from tracking",
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Excluded User Agents",
        -  "type": "array"
        -}
      • removedOutput schema / properties / fingerprint_based_on_anonymized_ip
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Fingerprint based on anonymized IP",
        -  "title": "Fingerprint Based On Anonymized Ip"
        -}
      • addedOutput schema / properties / global_settings
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/GlobalTrackerSettings"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Raw global tracker settings used as defaults for the app"
        +}
      • removedOutput schema / properties / keep_url_fragment
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Keep URL fragment in tracking",
        -  "title": "Keep Url Fragment"
        -}
      • removedOutput schema / properties / session_limit_exceeded_action
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Session limit exceeded action",
        -  "title": "Session Limit Exceeded Action"
        -}
      • removedOutput schema / properties / session_max_duration_seconds
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "integer"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Maximum session duration in seconds",
        -  "title": "Session Max Duration Seconds"
        -}
      • removedOutput schema / properties / session_max_event_count
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "integer"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Maximum events per session",
        -  "title": "Session Max Event Count"
        -}
      • removedOutput schema / properties / set_ip_tracking
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Enable IP tracking",
        -  "title": "Set Ip Tracking"
        -}
      • addedOutput schema / properties / settings
        Added value: +{
        +  "$ref": "#/$defs/TrackerSettingsResponse",
        +  "description": "Resolved effective settings for the app"
        +}
      • removedOutput schema / properties / site_search_category_params
        Removed value: -{
        -  "description": "Site search category parameters",
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Site Search Category Params",
        -  "type": "array"
        -}
      • removedOutput schema / properties / site_search_query_params
        Removed value: -{
        -  "description": "Site search query parameters",
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Site Search Query Params",
        -  "type": "array"
        -}
      • removedOutput schema / properties / strip_site_search_query_parameters
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Strip site search query parameters",
        -  "title": "Strip Site Search Query Parameters"
        -}
      • removedOutput schema / properties / tracking_fingerprint_disabled
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Disable tracking fingerprint",
        -  "title": "Tracking Fingerprint Disabled"
        -}
      • removedOutput schema / properties / updated_at
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Last modification timestamp",
        -  "title": "Updated At"
        -}
      • removedOutput schema / properties / url_query_parameter_to_exclude_from_url
        Removed value: -{
        -  "description": "URL query parameters to exclude",
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Url Query Parameter To Exclude From Url",
        -  "type": "array"
        -}
      • removedOutput schema / properties / urls
        Removed value: -{
        -  "description": "Valid URLs for the app",
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Urls",
        -  "type": "array"
        -}
      • removedOutput schema / properties / use_anonymous_session_hash
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Use session hash for anonymous events",
        -  "title": "Use Anonymous Session Hash"
        -}
      • removedOutput schema / properties / use_session_hash
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Use session hash for non-anonymous events",
        -  "title": "Use Session Hash"
        -}
      • removedOutput schema / properties / visitor_geolocation_based_on_anonymized_ip
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Visitor geolocation based on anonymized IP",
        -  "title": "Visitor Geolocation Based On Anonymized Ip"
        -}
      • addedOutput schema / required
        Added value: +[
        +  "settings"
        +]
      • changedOutput schema / title
        Previous value: -"TrackerSettingsResponse"New value: +"TrackerSettingsAppGetResponse"
    • Removedtracker_settings_app_update
    • Changedtracker_settings_global_get3 fields changed
      • changedOutput schema / description
        Previous value: -"Response model for tracker settings (supports both global and app-specific)."New value: +"Flat tracker settings response model."
      • removedOutput schema / properties / excluded_url_params
        Removed value: -{
        -  "description": "URL parameters excluded from tracking",
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Excluded Url Params",
        -  "type": "array"
        -}
      • removedOutput schema / properties / visitor_geolocation_based_on_anonymized_ip
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Visitor geolocation based on anonymized IP",
        -  "title": "Visitor Geolocation Based On Anonymized Ip"
        -}
    • Removedtracker_settings_global_update
    • Removedtriggers_copy
    • Removedtriggers_create
    • Changedtriggers_get1 field changed
      • addedOutput schema / $defs / TagManagerResource / properties / relationships
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional JSON:API relationships payload",
        +  "title": "Relationships"
        +}
    • Changedtriggers_list1 field changed
      • addedOutput schema / $defs / TagManagerResource / properties / relationships
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional JSON:API relationships payload",
        +  "title": "Relationships"
        +}
    • Removedvariables_copy
    • Removedvariables_create
    • Changedvariables_get1 field changed
      • addedOutput schema / $defs / TagManagerResource / properties / relationships
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional JSON:API relationships payload",
        +  "title": "Relationships"
        +}
    • Changedvariables_list1 field changed
      • addedOutput schema / $defs / TagManagerResource / properties / relationships
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional JSON:API relationships payload",
        +  "title": "Relationships"
        +}
    • Removedvariables_update
    • Changedversions_get_draft1 field changed
      • addedOutput schema / $defs / TagManagerResource / properties / relationships
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional JSON:API relationships payload",
        +  "title": "Relationships"
        +}
    • Changedversions_get_published1 field changed
      • addedOutput schema / $defs / TagManagerResource / properties / relationships
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional JSON:API relationships payload",
        +  "title": "Relationships"
        +}
    • Changedversions_list1 field changed
      • addedOutput schema / $defs / TagManagerResource / properties / relationships
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional JSON:API relationships payload",
        +  "title": "Relationships"
        +}
    • Removedversions_publish_draft
  4. 51 tool updatesv1.0.0
    • Changedactivations_attributes_list1 field changed
      • addedInput schema / title
        Added value: +"activations_attributes_listArguments"
    • Addedanalytics_annotations_create
    • Addedanalytics_annotations_delete
    • Addedanalytics_annotations_get
    • Addedanalytics_annotations_list
    • Addedanalytics_annotations_update
    • Changedapps_create1 field changed
      • addedInput schema / title
        Added value: +"apps_createArguments"
    • Changedapps_delete1 field changed
      • addedInput schema / title
        Added value: +"apps_deleteArguments"
    • Changedapps_get1 field changed
      • addedInput schema / title
        Added value: +"apps_getArguments"
    • Changedapps_list1 field changed
      • addedInput schema / title
        Added value: +"apps_listArguments"
    • Changedapps_update1 field changed
      • addedInput schema / title
        Added value: +"apps_updateArguments"
    • Changedaudiences_create1 field changed
      • addedInput schema / title
        Added value: +"audiences_createArguments"
    • Changedaudiences_delete1 field changed
      • addedInput schema / title
        Added value: +"audiences_deleteArguments"
    • Changedaudiences_get1 field changed
      • addedInput schema / title
        Added value: +"audiences_getArguments"
    • Changedaudiences_list1 field changed
      • addedInput schema / title
        Added value: +"audiences_listArguments"
    • Changedaudiences_update1 field changed
      • addedInput schema / title
        Added value: +"audiences_updateArguments"
    • Changedcontainer_settings_get_installation_code1 field changed
      • addedInput schema / title
        Added value: +"container_settings_get_installation_codeArguments"
    • Changedcontainer_settings_list1 field changed
      • addedInput schema / title
        Added value: +"container_settings_listArguments"
    • Changedtags_copy1 field changed
      • addedInput schema / title
        Added value: +"tags_copyArguments"
    • Changedtags_create1 field changed
      • addedInput schema / title
        Added value: +"tags_createArguments"
    • Changedtags_delete1 field changed
      • addedInput schema / title
        Added value: +"tags_deleteArguments"
    • Changedtags_get1 field changed
      • addedInput schema / title
        Added value: +"tags_getArguments"
    • Changedtags_list1 field changed
      • addedInput schema / title
        Added value: +"tags_listArguments"
    • Changedtags_list_triggers1 field changed
      • addedInput schema / title
        Added value: +"tags_list_triggersArguments"
    • Changedtags_update1 field changed
      • addedInput schema / title
        Added value: +"tags_updateArguments"
    • Changedtemplates_get_tag1 field changed
      • addedInput schema / title
        Added value: +"templates_get_tagArguments"
    • Changedtemplates_get_trigger1 field changed
      • addedInput schema / title
        Added value: +"templates_get_triggerArguments"
    • Changedtemplates_get_variable1 field changed
      • addedInput schema / title
        Added value: +"templates_get_variableArguments"
    • Changedtemplates_list1 field changed
      • addedInput schema / title
        Added value: +"templates_listArguments"
    • Changedtemplates_list_triggers1 field changed
      • addedInput schema / title
        Added value: +"templates_list_triggersArguments"
    • Changedtemplates_list_variables1 field changed
      • addedInput schema / title
        Added value: +"templates_list_variablesArguments"
    • Changedtools_parameters_get1 field changed
      • addedInput schema / title
        Added value: +"tools_parameters_getArguments"
    • Changedtracker_settings_app_delete1 field changed
      • addedInput schema / title
        Added value: +"tracker_settings_app_deleteArguments"
    • Changedtracker_settings_app_get1 field changed
      • addedInput schema / title
        Added value: +"tracker_settings_app_getArguments"
    • Changedtracker_settings_app_update1 field changed
      • addedInput schema / title
        Added value: +"tracker_settings_app_updateArguments"
    • Changedtracker_settings_global_get1 field changed
      • addedInput schema / title
        Added value: +"tracker_settings_global_getArguments"
    • Changedtracker_settings_global_update1 field changed
      • addedInput schema / title
        Added value: +"tracker_settings_global_updateArguments"
    • Changedtriggers_copy1 field changed
      • addedInput schema / title
        Added value: +"triggers_copyArguments"
    • Changedtriggers_create1 field changed
      • addedInput schema / title
        Added value: +"triggers_createArguments"
    • Changedtriggers_get1 field changed
      • addedInput schema / title
        Added value: +"triggers_getArguments"
    • Changedtriggers_list1 field changed
      • addedInput schema / title
        Added value: +"triggers_listArguments"
    • Changedtriggers_list_tags1 field changed
      • addedInput schema / title
        Added value: +"triggers_list_tagsArguments"
    • Changedvariables_copy1 field changed
      • addedInput schema / title
        Added value: +"variables_copyArguments"
    • Changedvariables_create1 field changed
      • addedInput schema / title
        Added value: +"variables_createArguments"
    • Changedvariables_get1 field changed
      • addedInput schema / title
        Added value: +"variables_getArguments"
    • Changedvariables_list1 field changed
      • addedInput schema / title
        Added value: +"variables_listArguments"
    • Changedvariables_update1 field changed
      • addedInput schema / title
        Added value: +"variables_updateArguments"
    • Changedversions_get_draft1 field changed
      • addedInput schema / title
        Added value: +"versions_get_draftArguments"
    • Changedversions_get_published1 field changed
      • addedInput schema / title
        Added value: +"versions_get_publishedArguments"
    • Changedversions_list1 field changed
      • addedInput schema / title
        Added value: +"versions_listArguments"
    • Changedversions_publish_draft1 field changed
      • addedInput schema / title
        Added value: +"versions_publish_draftArguments"
  5. 46 tool updates
    • First observedactivations_attributes_list
    • First observedapps_create
    • First observedapps_delete
    • First observedapps_get
    • First observedapps_list
    • First observedapps_update
    • First observedaudiences_create
    • First observedaudiences_delete
    • First observedaudiences_get
    • First observedaudiences_list
    • First observedaudiences_update
    • First observedcontainer_settings_get_installation_code
    • First observedcontainer_settings_list
    • First observedtags_copy
    • First observedtags_create
    • First observedtags_delete
    • First observedtags_get
    • First observedtags_list
    • First observedtags_list_triggers
    • First observedtags_update
    • First observedtemplates_get_tag
    • First observedtemplates_get_trigger
    • First observedtemplates_get_variable
    • First observedtemplates_list
    • First observedtemplates_list_triggers
    • First observedtemplates_list_variables
    • First observedtools_parameters_get
    • First observedtracker_settings_app_delete
    • First observedtracker_settings_app_get
    • First observedtracker_settings_app_update
    • First observedtracker_settings_global_get
    • First observedtracker_settings_global_update
    • First observedtriggers_copy
    • First observedtriggers_create
    • First observedtriggers_get
    • First observedtriggers_list
    • First observedtriggers_list_tags
    • First observedvariables_copy
    • First observedvariables_create
    • First observedvariables_get
    • First observedvariables_list
    • First observedvariables_update
    • First observedversions_get_draft
    • First observedversions_get_published
    • First observedversions_list
    • First observedversions_publish_draft

TDQS

A3.6/5.0

Scored across 40 tools

Disambiguation4/5

Each tool maps to a distinct resource/action (apps, audiences, tags, triggers, variables, versions, templates, settings, analytics queries), and descriptions are unusually detailed. The closest potential confusion is analytics_custom_dimensions_* versus analytics_dimensions_*, but the descriptions and scope parameter make them separable. Overall, an agent can reliably distinguish the tools despite the large count.

Naming Consistency4/5

Most tools follow a predictable `domain_resource_action` snake_case pattern (apps_list, tags_get, triggers_list_tags, tracker_settings_global_get). A few outliers like tools_parameters_get, analytics_dimensions_details_list, and container_settings_get_installation_code break the pattern slightly, and activations_attributes_list uses an awkward plural-plural form. The dominant convention is consistent and readable.

Tool Count3/5

40 tools is a large surface, but it spans three substantial product areas: Analytics, Tag Manager, and CDP/settings. The count is defensible given the platform breadth, but it is heavy and likely burdens tool selection. This feels borderline rather than clearly excessive.

Completeness2/5

The server is heavily read-oriented: it lists/gets apps, tags, triggers, variables, versions, audiences, and templates, and it can execute analytics queries. However, many descriptions reference create/update/publish/import/copy operations such as tags_create, variables_create, apps_update, and publish that are not present in the tool set. Common management workflows therefore dead-end after template discovery or data lookup.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables AI models to interact with Matomo analytics through a complete MCP server implementation. Provides tools for retrieving analytics data, managing sites, and generating reports with zero configuration setup.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to manage Google Tag Manager, Google Search Console, and Google Analytics (GA4) through unified access to tags, search performance data, URL inspection, sitemaps, and analytics reporting.
    8 npm
    ISC