Piwik PRO MCP Server
OfficialPiwik PRO MCP Server lets you control Piwik PRO Analytics, Tag Manager, and Data Activation through MCP tools and natural-language queries.
Analytics querying: Run flexible analytics queries with dimensions, metrics, filters, date ranges, goals, and custom dimensions; list dimension/metric metadata and custom dimension slots.
App management: List and get app details; view global and per-app tracker settings; retrieve container settings and installation code.
Annotations: List and get user/system annotations.
Goals: List and get conversion goals for analytics filtering.
Tag Manager: Manage tags, triggers, variables, versions, and async operations; discover tag/trigger/variable templates; list triggers attached to tags and tags attached to triggers.
Data Activation / CDP: List and get audiences; list CDP attributes for audience building.
Configuration & safety: Safe mode by default, optional telemetry opt-out, and deployment via uv or Docker.
Provides comprehensive analytics and tag management capabilities through Piwik PRO, including app management, tracker configuration, tag manager operations (tags, triggers, variables), customer data platform features for audience management, and version control for analytics implementations.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Piwik PRO MCP Serverlist all tags in my e-commerce app"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
🤖 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.proPIWIK_PRO_CLIENT_ID- Client IDPIWIK_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 containingclaude_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_SECRETRefer 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_SECRETRefer 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=0Then 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(default1): Controls anonymous usage telemetry. Set this to0to disable it.PIWIK_PRO_TM_RESOURCE_CHECK(default1): Enables Tag Manager template validation. Set to0to bypass when experimenting with custom templates.PIWIK_PRO_ALLOW_INSECURE_HOST(default0): Rejects explicithttp://values forPIWIK_PRO_HOST. Set to1only 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 |
Complete reference for all MCP tools | |
Setup, running, testing, and architecture | |
How to contribute to the project |
Available Tools
40 toolsactivations_attributes_listARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Total number of attributes available |
| attributes | Yes | List of CDP attributes with metadata |
TDQS
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.
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.
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.
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.
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.
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_getBRead-only
Get a user annotation by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | ||
| annotation_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
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.
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.
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.
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.
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.
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_listBRead-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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| app_id | Yes | ||
| offset | No | ||
| source | No | all | |
| date_to | No | ||
| date_from | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | List of annotations |
| meta | No | Metadata such as total count |
TDQS
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.
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.
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.
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.
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.
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_getARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| scope | Yes | ||
| website_id | Yes | ||
| dimension_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_slotsARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
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.
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.
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.
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.
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.
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_listARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| scope | No | ||
| offset | No | ||
| website_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_listARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| dimensions | Yes | ||
| website_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| dimensions | Yes | |
| custom_channel_groupings | Yes |
TDQS
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.
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.
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.
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.
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.
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_listARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| dimensions | Yes | |
| custom_channel_groupings | Yes |
TDQS
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.
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.
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.
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.
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.
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_getARead-only
Get a specific goal by ID.
Args:
goal_id: Goal UUID
website_id: Website/App UUID
Returns:
Goal resource
| Name | Required | Description | Default |
|---|---|---|---|
| goal_id | Yes | ||
| website_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
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.
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.
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.
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.
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.
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_listARead-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`.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| website_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | List of goals |
| meta | No | Metadata such as total count |
TDQS
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.
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.
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.
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.
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.
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_listARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| metrics | Yes | ||
| website_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| metrics | Yes | |
| calculated_metrics | Yes |
TDQS
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.
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.
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.
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.
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.
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_listARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| metrics | Yes | |
| calculated_metrics | Yes |
TDQS
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.
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.
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.
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.
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.
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_executeARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| columns | Yes | ||
| date_to | No | ||
| filters | No | ||
| order_by | No | ||
| date_from | No | ||
| website_id | Yes | ||
| relative_date | No | ||
| metric_filters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Query results |
| status | Yes | Execution status |
| message | Yes | Status message |
TDQS
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.
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.
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.
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.
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.
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_getARead-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`.
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | App UUID |
| cnil | No | Whether CNIL integration is enabled |
| name | Yes | App name |
| urls | Yes | List of URLs where the app is available |
| delay | No | App delay in milliseconds |
| app_type | No | Type of application |
| currency | No | App currency |
| timezone | No | App timezone |
| created_at | No | Creation timestamp |
| updated_at | No | Last update timestamp |
| gdpr_enabled | No | Whether GDPR is enabled |
| e_commerce_tracking | No | Whether e-commerce tracking is enabled |
| privacy_use_cookies | No | Whether privacy mode uses cookies |
| real_time_dashboards | No | Real-time dashboards enabled |
| gdpr_user_mode_enabled | No | Whether GDPR user mode is enabled |
| privacy_cookie_domains | No | List of privacy cookie domains |
| sharepoint_integration | No | Whether SharePoint integration is enabled |
| gdpr_data_anonymization | No | GDPR data anonymization setting |
| privacy_use_fingerprinting | No | Whether privacy mode uses fingerprinting |
| gdpr_data_anonymization_mode | No | GDPR data anonymization mode |
| privacy_cookie_domains_enabled | No | Whether privacy cookie domains are enabled |
| session_id_strict_privacy_mode | No | Whether session ID strict privacy mode is enabled |
| privacy_cookie_expiration_period | No | Privacy cookie expiration period in seconds |
TDQS
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.
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.
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.
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.
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.
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_listARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| search | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| apps | Yes | List of app objects with id, name, urls, timezone, currency, etc. |
| limit | Yes | Number of apps requested |
| total | Yes | Total number of apps available |
| offset | Yes | Number of apps skipped |
TDQS
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.
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.
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.
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.
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.
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_getARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | ||
| audience_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Audience UUID |
| name | Yes | Audience name |
| version | Yes | Audience version |
| is_author | Yes | Whether current user is the author |
| created_at | No | Creation timestamp |
| definition | Yes | Audience definition with conditions |
| updated_at | No | Last update timestamp |
| description | Yes | Audience description |
| author_email | Yes | Email of the audience author |
| membership_duration_days | Yes | Membership duration in days |
TDQS
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.
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.
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.
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.
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.
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_listARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Total number of audiences available |
| audiences | Yes | List of audiences |
TDQS
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.
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.
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.
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.
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.
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_codeARead-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")
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | Installation code snippet |
TDQS
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.
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.
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.
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.
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.
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_listARead-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")
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | List of settings resources |
TDQS
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.
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.
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.
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.
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.
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_getARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | ||
| operation_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
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.
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.
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.
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.
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.
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_getARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | ||
| tag_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
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.
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.
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.
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.
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.
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_listARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| app_id | Yes | ||
| offset | No | ||
| filters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
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.
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.
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.
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.
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.
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_triggersARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| sort | No | ||
| limit | No | ||
| app_id | Yes | ||
| offset | No | ||
| tag_id | Yes | ||
| trigger_type | No |
TDQS
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.
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.
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.
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.
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.
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_tagARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| template_name | Yes |
TDQS
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.
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.
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.
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.
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.
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_triggerARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| template_name | Yes |
TDQS
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.
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.
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.
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.
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.
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_variableARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| template_name | Yes |
TDQS
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.
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.
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.
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.
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.
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_tagsARead-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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_triggersARead-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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_variablesARead-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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_getARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| tool_name | Yes |
TDQS
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.
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.
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.
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.
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.
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_getARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | ||
| detailed | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| settings | Yes | Resolved effective settings for the app |
| app_settings | No | Raw app-specific settings as returned by the app tracker settings endpoint |
| global_settings | No | Raw global tracker settings used as defaults for the app |
TDQS
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.
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.
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.
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.
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.
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_getARead-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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| urls | No | Valid URLs for the app |
| updated_at | No | Last modification timestamp |
| excluded_ips | No | IPs excluded from tracking |
| set_ip_tracking | No | Enable IP tracking |
| exclude_crawlers | No | Exclude crawler bots |
| use_session_hash | No | Use session hash for non-anonymous events |
| keep_url_fragment | No | Keep URL fragment in tracking |
| campaign_id_params | No | Campaign ID parameters |
| campaign_name_params | No | Campaign name parameters |
| exclude_unknown_urls | No | Exclude unknown URLs |
| excluded_user_agents | No | User agent strings excluded from tracking |
| campaign_medium_params | No | Campaign medium parameters |
| campaign_source_params | No | Campaign source parameters |
| campaign_content_params | No | Campaign content parameters |
| campaign_keyword_params | No | Campaign keyword parameters |
| session_max_event_count | No | Maximum events per session |
| site_search_query_params | No | Site search query parameters |
| anonymize_visitor_ip_level | No | Anonymize 'n' octets of visitor IP addresses |
| use_anonymous_session_hash | No | Use session hash for anonymous events |
| site_search_category_params | No | Site search category parameters |
| session_max_duration_seconds | No | Maximum session duration in seconds |
| session_limit_exceeded_action | No | Session limit exceeded action |
| tracking_fingerprint_disabled | No | Disable tracking fingerprint |
| fingerprint_based_on_anonymized_ip | No | Fingerprint based on anonymized IP |
| strip_site_search_query_parameters | No | Strip site search query parameters |
| anonymize_visitor_geolocation_level | No | Geolocation anonymization level |
| enable_fingerprinting_across_websites | No | Enable fingerprinting across websites |
| create_new_visit_when_campaign_changes | No | Create new visit when campaign changes |
| url_query_parameter_to_exclude_from_url | No | URL query parameters to exclude |
| create_new_visit_when_website_referrer_changes | No | Create new visit when referrer changes |
TDQS
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.
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.
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.
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.
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.
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_getARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | ||
| trigger_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
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.
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.
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.
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.
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.
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_listARead-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`).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| app_id | Yes | ||
| offset | No | ||
| filters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
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.
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.
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.
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.
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.
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_tagsARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| sort | No | ||
| limit | No | ||
| app_id | Yes | ||
| offset | No | ||
| template | No | ||
| is_active | No | ||
| trigger_id | Yes | ||
| consent_type | No | ||
| is_prioritized | No |
TDQS
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.
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.
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.
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.
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.
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_getBRead-only
Get detailed information about a specific variable.
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | ||
| variable_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
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.
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.
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.
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.
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.
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_listARead-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`
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| app_id | Yes | ||
| offset | No | ||
| filters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
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.
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.
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.
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.
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.
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_draftARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
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.
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.
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.
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.
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.
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_publishedARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
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.
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.
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.
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.
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.
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_listARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| app_id | Yes | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
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.
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.
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.
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.
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.
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 tool update
v0.7.0- Added
operations_get
1 tool update
v0.5.0- Changed
apps_get12 fields changed- added
Output schema / properties / cnilAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Whether CNIL integration is enabled", + "title": "Cnil" +} - added
Output schema / properties / delayAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "App delay in milliseconds", + "title": "Delay" +} - added
Output schema / properties / e_commerce_trackingAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Whether e-commerce tracking is enabled", + "title": "E Commerce Tracking" +} - added
Output schema / properties / gdpr_data_anonymization_modeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "GDPR data anonymization mode", + "title": "Gdpr Data Anonymization Mode" +} - added
Output schema / properties / gdpr_user_mode_enabledAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Whether GDPR user mode is enabled", + "title": "Gdpr User Mode Enabled" +} - added
Output schema / properties / privacy_cookie_domainsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "List of privacy cookie domains", + "title": "Privacy Cookie Domains" +} - added
Output schema / properties / privacy_cookie_domains_enabledAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Whether privacy cookie domains are enabled", + "title": "Privacy Cookie Domains Enabled" +} - added
Output schema / properties / privacy_cookie_expiration_periodAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Privacy cookie expiration period in seconds", + "title": "Privacy Cookie Expiration Period" +} - added
Output schema / properties / privacy_use_cookiesAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Whether privacy mode uses cookies", + "title": "Privacy Use Cookies" +} - added
Output schema / properties / privacy_use_fingerprintingAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Whether privacy mode uses fingerprinting", + "title": "Privacy Use Fingerprinting" +} - added
Output schema / properties / session_id_strict_privacy_modeAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Whether session ID strict privacy mode is enabled", + "title": "Session Id Strict Privacy Mode" +} - added
Output schema / properties / sharepoint_integrationAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Whether SharePoint integration is enabled", + "title": "Sharepoint Integration" +}
46 tool updates
v0.4.0- Removed
analytics_annotations_create - Removed
analytics_annotations_delete - Removed
analytics_annotations_update - Added
analytics_custom_dimensions_get - Added
analytics_custom_dimensions_get_slots - Added
analytics_custom_dimensions_list - Added
analytics_dimensions_details_list - Added
analytics_dimensions_list - Added
analytics_goals_get - Added
analytics_goals_list - Added
analytics_metrics_details_list - Added
analytics_metrics_list - Added
analytics_query_execute - Removed
apps_create - Removed
apps_delete - Changed
apps_list1 field changed- changed
Input schema / properties / limit / defaultPrevious value: -10New value: +100
- Removed
apps_update - Removed
audiences_create - Removed
audiences_delete - Removed
audiences_update - Removed
tags_copy - Removed
tags_create - Removed
tags_delete - Changed
tags_get1 field changed- added
Output schema / $defs / TagManagerResource / properties / relationshipsAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional JSON:API relationships payload", + "title": "Relationships" +}
- Changed
tags_list1 field changed- added
Output schema / $defs / TagManagerResource / properties / relationshipsAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional JSON:API relationships payload", + "title": "Relationships" +}
- Removed
tags_update - Removed
templates_list - Added
templates_list_tags - Removed
tracker_settings_app_delete - Changed
tracker_settings_app_get40 fields changed- added
Input schema / properties / detailedAdded value: +{ + "default": false, + "title": "Detailed", + "type": "boolean" +} - added
Output schema / $defsAdded 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" + } +} - changed
Output schema / descriptionPrevious value: -"Response model for tracker settings (supports both global and app-specific)."New value: +"Response model for app tracker settings with optional detailed breakdown." - removed
Output schema / properties / anonymize_visitor_geolocation_levelRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Geolocation anonymization level", - "title": "Anonymize Visitor Geolocation Level" -} - removed
Output schema / properties / anonymize_visitor_ip_levelRemoved value: -{ - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Anonymize 'n' octets of visitor IP addresses", - "title": "Anonymize Visitor Ip Level" -} - added
Output schema / properties / app_settingsAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/AppTrackerSettings" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Raw app-specific settings as returned by the app tracker settings endpoint" +} - removed
Output schema / properties / campaign_content_paramsRemoved value: -{ - "description": "Campaign content parameters", - "items": { - "type": "string" - }, - "title": "Campaign Content Params", - "type": "array" -} - removed
Output schema / properties / campaign_id_paramsRemoved value: -{ - "description": "Campaign ID parameters", - "items": { - "type": "string" - }, - "title": "Campaign Id Params", - "type": "array" -} - removed
Output schema / properties / campaign_keyword_paramsRemoved value: -{ - "description": "Campaign keyword parameters", - "items": { - "type": "string" - }, - "title": "Campaign Keyword Params", - "type": "array" -} - removed
Output schema / properties / campaign_medium_paramsRemoved value: -{ - "description": "Campaign medium parameters", - "items": { - "type": "string" - }, - "title": "Campaign Medium Params", - "type": "array" -} - removed
Output schema / properties / campaign_name_paramsRemoved value: -{ - "description": "Campaign name parameters", - "items": { - "type": "string" - }, - "title": "Campaign Name Params", - "type": "array" -} - removed
Output schema / properties / campaign_source_paramsRemoved value: -{ - "description": "Campaign source parameters", - "items": { - "type": "string" - }, - "title": "Campaign Source Params", - "type": "array" -} - removed
Output schema / properties / create_new_visit_when_campaign_changesRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Create new visit when campaign changes", - "title": "Create New Visit When Campaign Changes" -} - removed
Output schema / properties / create_new_visit_when_website_referrer_changesRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Create new visit when referrer changes", - "title": "Create New Visit When Website Referrer Changes" -} - removed
Output schema / properties / enable_fingerprinting_across_websitesRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Enable fingerprinting across websites", - "title": "Enable Fingerprinting Across Websites" -} - removed
Output schema / properties / exclude_crawlersRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Exclude crawler bots", - "title": "Exclude Crawlers" -} - removed
Output schema / properties / exclude_unknown_urlsRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Exclude unknown URLs", - "title": "Exclude Unknown Urls" -} - removed
Output schema / properties / excluded_ipsRemoved value: -{ - "description": "IPs excluded from tracking", - "items": { - "type": "string" - }, - "title": "Excluded Ips", - "type": "array" -} - removed
Output schema / properties / excluded_url_paramsRemoved value: -{ - "description": "URL parameters excluded from tracking", - "items": { - "type": "string" - }, - "title": "Excluded Url Params", - "type": "array" -} - removed
Output schema / properties / excluded_user_agentsRemoved value: -{ - "description": "User agent strings excluded from tracking", - "items": { - "type": "string" - }, - "title": "Excluded User Agents", - "type": "array" -} - removed
Output schema / properties / fingerprint_based_on_anonymized_ipRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Fingerprint based on anonymized IP", - "title": "Fingerprint Based On Anonymized Ip" -} - added
Output schema / properties / global_settingsAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/GlobalTrackerSettings" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Raw global tracker settings used as defaults for the app" +} - removed
Output schema / properties / keep_url_fragmentRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Keep URL fragment in tracking", - "title": "Keep Url Fragment" -} - removed
Output schema / properties / session_limit_exceeded_actionRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Session limit exceeded action", - "title": "Session Limit Exceeded Action" -} - removed
Output schema / properties / session_max_duration_secondsRemoved value: -{ - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Maximum session duration in seconds", - "title": "Session Max Duration Seconds" -} - removed
Output schema / properties / session_max_event_countRemoved value: -{ - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Maximum events per session", - "title": "Session Max Event Count" -} - removed
Output schema / properties / set_ip_trackingRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Enable IP tracking", - "title": "Set Ip Tracking" -} - added
Output schema / properties / settingsAdded value: +{ + "$ref": "#/$defs/TrackerSettingsResponse", + "description": "Resolved effective settings for the app" +} - removed
Output schema / properties / site_search_category_paramsRemoved value: -{ - "description": "Site search category parameters", - "items": { - "type": "string" - }, - "title": "Site Search Category Params", - "type": "array" -} - removed
Output schema / properties / site_search_query_paramsRemoved value: -{ - "description": "Site search query parameters", - "items": { - "type": "string" - }, - "title": "Site Search Query Params", - "type": "array" -} - removed
Output schema / properties / strip_site_search_query_parametersRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Strip site search query parameters", - "title": "Strip Site Search Query Parameters" -} - removed
Output schema / properties / tracking_fingerprint_disabledRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Disable tracking fingerprint", - "title": "Tracking Fingerprint Disabled" -} - removed
Output schema / properties / updated_atRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Last modification timestamp", - "title": "Updated At" -} - removed
Output schema / properties / url_query_parameter_to_exclude_from_urlRemoved value: -{ - "description": "URL query parameters to exclude", - "items": { - "type": "string" - }, - "title": "Url Query Parameter To Exclude From Url", - "type": "array" -} - removed
Output schema / properties / urlsRemoved value: -{ - "description": "Valid URLs for the app", - "items": { - "type": "string" - }, - "title": "Urls", - "type": "array" -} - removed
Output schema / properties / use_anonymous_session_hashRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Use session hash for anonymous events", - "title": "Use Anonymous Session Hash" -} - removed
Output schema / properties / use_session_hashRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Use session hash for non-anonymous events", - "title": "Use Session Hash" -} - removed
Output schema / properties / visitor_geolocation_based_on_anonymized_ipRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Visitor geolocation based on anonymized IP", - "title": "Visitor Geolocation Based On Anonymized Ip" -} - added
Output schema / requiredAdded value: +[ + "settings" +] - changed
Output schema / titlePrevious value: -"TrackerSettingsResponse"New value: +"TrackerSettingsAppGetResponse"
- Removed
tracker_settings_app_update - Changed
tracker_settings_global_get3 fields changed- changed
Output schema / descriptionPrevious value: -"Response model for tracker settings (supports both global and app-specific)."New value: +"Flat tracker settings response model." - removed
Output schema / properties / excluded_url_paramsRemoved value: -{ - "description": "URL parameters excluded from tracking", - "items": { - "type": "string" - }, - "title": "Excluded Url Params", - "type": "array" -} - removed
Output schema / properties / visitor_geolocation_based_on_anonymized_ipRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Visitor geolocation based on anonymized IP", - "title": "Visitor Geolocation Based On Anonymized Ip" -}
- Removed
tracker_settings_global_update - Removed
triggers_copy - Removed
triggers_create - Changed
triggers_get1 field changed- added
Output schema / $defs / TagManagerResource / properties / relationshipsAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional JSON:API relationships payload", + "title": "Relationships" +}
- Changed
triggers_list1 field changed- added
Output schema / $defs / TagManagerResource / properties / relationshipsAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional JSON:API relationships payload", + "title": "Relationships" +}
- Removed
variables_copy - Removed
variables_create - Changed
variables_get1 field changed- added
Output schema / $defs / TagManagerResource / properties / relationshipsAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional JSON:API relationships payload", + "title": "Relationships" +}
- Changed
variables_list1 field changed- added
Output schema / $defs / TagManagerResource / properties / relationshipsAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional JSON:API relationships payload", + "title": "Relationships" +}
- Removed
variables_update - Changed
versions_get_draft1 field changed- added
Output schema / $defs / TagManagerResource / properties / relationshipsAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional JSON:API relationships payload", + "title": "Relationships" +}
- Changed
versions_get_published1 field changed- added
Output schema / $defs / TagManagerResource / properties / relationshipsAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional JSON:API relationships payload", + "title": "Relationships" +}
- Changed
versions_list1 field changed- added
Output schema / $defs / TagManagerResource / properties / relationshipsAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional JSON:API relationships payload", + "title": "Relationships" +}
- Removed
versions_publish_draft
51 tool updates
v1.0.0- Changed
activations_attributes_list1 field changed- added
Input schema / titleAdded value: +"activations_attributes_listArguments"
- Added
analytics_annotations_create - Added
analytics_annotations_delete - Added
analytics_annotations_get - Added
analytics_annotations_list - Added
analytics_annotations_update - Changed
apps_create1 field changed- added
Input schema / titleAdded value: +"apps_createArguments"
- Changed
apps_delete1 field changed- added
Input schema / titleAdded value: +"apps_deleteArguments"
- Changed
apps_get1 field changed- added
Input schema / titleAdded value: +"apps_getArguments"
- Changed
apps_list1 field changed- added
Input schema / titleAdded value: +"apps_listArguments"
- Changed
apps_update1 field changed- added
Input schema / titleAdded value: +"apps_updateArguments"
- Changed
audiences_create1 field changed- added
Input schema / titleAdded value: +"audiences_createArguments"
- Changed
audiences_delete1 field changed- added
Input schema / titleAdded value: +"audiences_deleteArguments"
- Changed
audiences_get1 field changed- added
Input schema / titleAdded value: +"audiences_getArguments"
- Changed
audiences_list1 field changed- added
Input schema / titleAdded value: +"audiences_listArguments"
- Changed
audiences_update1 field changed- added
Input schema / titleAdded value: +"audiences_updateArguments"
- Changed
container_settings_get_installation_code1 field changed- added
Input schema / titleAdded value: +"container_settings_get_installation_codeArguments"
- Changed
container_settings_list1 field changed- added
Input schema / titleAdded value: +"container_settings_listArguments"
- Changed
tags_copy1 field changed- added
Input schema / titleAdded value: +"tags_copyArguments"
- Changed
tags_create1 field changed- added
Input schema / titleAdded value: +"tags_createArguments"
- Changed
tags_delete1 field changed- added
Input schema / titleAdded value: +"tags_deleteArguments"
- Changed
tags_get1 field changed- added
Input schema / titleAdded value: +"tags_getArguments"
- Changed
tags_list1 field changed- added
Input schema / titleAdded value: +"tags_listArguments"
- Changed
tags_list_triggers1 field changed- added
Input schema / titleAdded value: +"tags_list_triggersArguments"
- Changed
tags_update1 field changed- added
Input schema / titleAdded value: +"tags_updateArguments"
- Changed
templates_get_tag1 field changed- added
Input schema / titleAdded value: +"templates_get_tagArguments"
- Changed
templates_get_trigger1 field changed- added
Input schema / titleAdded value: +"templates_get_triggerArguments"
- Changed
templates_get_variable1 field changed- added
Input schema / titleAdded value: +"templates_get_variableArguments"
- Changed
templates_list1 field changed- added
Input schema / titleAdded value: +"templates_listArguments"
- Changed
templates_list_triggers1 field changed- added
Input schema / titleAdded value: +"templates_list_triggersArguments"
- Changed
templates_list_variables1 field changed- added
Input schema / titleAdded value: +"templates_list_variablesArguments"
- Changed
tools_parameters_get1 field changed- added
Input schema / titleAdded value: +"tools_parameters_getArguments"
- Changed
tracker_settings_app_delete1 field changed- added
Input schema / titleAdded value: +"tracker_settings_app_deleteArguments"
- Changed
tracker_settings_app_get1 field changed- added
Input schema / titleAdded value: +"tracker_settings_app_getArguments"
- Changed
tracker_settings_app_update1 field changed- added
Input schema / titleAdded value: +"tracker_settings_app_updateArguments"
- Changed
tracker_settings_global_get1 field changed- added
Input schema / titleAdded value: +"tracker_settings_global_getArguments"
- Changed
tracker_settings_global_update1 field changed- added
Input schema / titleAdded value: +"tracker_settings_global_updateArguments"
- Changed
triggers_copy1 field changed- added
Input schema / titleAdded value: +"triggers_copyArguments"
- Changed
triggers_create1 field changed- added
Input schema / titleAdded value: +"triggers_createArguments"
- Changed
triggers_get1 field changed- added
Input schema / titleAdded value: +"triggers_getArguments"
- Changed
triggers_list1 field changed- added
Input schema / titleAdded value: +"triggers_listArguments"
- Changed
triggers_list_tags1 field changed- added
Input schema / titleAdded value: +"triggers_list_tagsArguments"
- Changed
variables_copy1 field changed- added
Input schema / titleAdded value: +"variables_copyArguments"
- Changed
variables_create1 field changed- added
Input schema / titleAdded value: +"variables_createArguments"
- Changed
variables_get1 field changed- added
Input schema / titleAdded value: +"variables_getArguments"
- Changed
variables_list1 field changed- added
Input schema / titleAdded value: +"variables_listArguments"
- Changed
variables_update1 field changed- added
Input schema / titleAdded value: +"variables_updateArguments"
- Changed
versions_get_draft1 field changed- added
Input schema / titleAdded value: +"versions_get_draftArguments"
- Changed
versions_get_published1 field changed- added
Input schema / titleAdded value: +"versions_get_publishedArguments"
- Changed
versions_list1 field changed- added
Input schema / titleAdded value: +"versions_listArguments"
- Changed
versions_publish_draft1 field changed- added
Input schema / titleAdded value: +"versions_publish_draftArguments"
46 tool updates
- First observed
activations_attributes_list - First observed
apps_create - First observed
apps_delete - First observed
apps_get - First observed
apps_list - First observed
apps_update - First observed
audiences_create - First observed
audiences_delete - First observed
audiences_get - First observed
audiences_list - First observed
audiences_update - First observed
container_settings_get_installation_code - First observed
container_settings_list - First observed
tags_copy - First observed
tags_create - First observed
tags_delete - First observed
tags_get - First observed
tags_list - First observed
tags_list_triggers - First observed
tags_update - First observed
templates_get_tag - First observed
templates_get_trigger - First observed
templates_get_variable - First observed
templates_list - First observed
templates_list_triggers - First observed
templates_list_variables - First observed
tools_parameters_get - First observed
tracker_settings_app_delete - First observed
tracker_settings_app_get - First observed
tracker_settings_app_update - First observed
tracker_settings_global_get - First observed
tracker_settings_global_update - First observed
triggers_copy - First observed
triggers_create - First observed
triggers_get - First observed
triggers_list - First observed
triggers_list_tags - First observed
variables_copy - First observed
variables_create - First observed
variables_get - First observed
variables_list - First observed
variables_update - First observed
versions_get_draft - First observed
versions_get_published - First observed
versions_list - First observed
versions_publish_draft
TDQS
Scored across 40 tools
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.
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.
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.
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
Related MCP Connectors
Let AI manage your Google Tag Manager containers — tags, triggers, variables, and more.
- AdLoopOAuthcom.getadloop
Google Ads, GA4 and Tag Manager in your AI client, with a preview before every change.
Read and edit GA4, Search Console and Google Tag Manager from any MCP client. 29 tools.
SEO & marketing toolkit for AI agents: GA4, Search Console, AdSense, GTM, PageSpeed, Trends.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceEnables 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.-
- AlicenseNot gradedqualityBmaintenanceEnables 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 npmISC
- AlicenseNot gradedqualityAmaintenanceEnables interaction with Google Tag Manager through its API with built-in Google OAuth authentication. Allows managing GTM containers, tags, triggers, and variables through natural language.101 npm216Apache 2.0
- AlicenseAqualityCmaintenanceEnables AI assistants to query Google Analytics accounts, properties, and run reports using natural language through the Admin and Data APIs.61Apache 2.0