Avo MCP tools reference
Every tool except list_workspaces operates on a workspace. Pass workspaceId as a parameter; stdio clients can also set the WORKSPACE_ID environment variable.
Tools are grouped below by intent. Each tool lists the OAuth scope required. Write tools (workflow, save_items) require the write scope, which is requested as a separate consent step on first use.
The MCP maps five canonical tools to agent intents:
Entry point
list_workspaces— find your workspace IDs
Discover (read)
search— find items by meaning or by structural filter
Understand (read)
get— full details for any tracking plan item (or a branch overview / code snippets)
Change (write)
save_items— create, update, remove, or archive events, properties, event variants, property bundles, and metrics on a branch
Progress (write)
workflow— create a branch or update its description
Transitional (read — kept while its replacement ships)
list_branches— browse branches (planned: folded intosearch(type:"branch"))
list_workspaces
Scope: read
List the Avo workspaces the authenticated user has access to.
Parameters: None
Returns: One row per workspace: name, workspace ID, and the user’s role.
Call this first to discover workspace IDs before invoking any workspace-scoped tool.
list_branches
Scope: read
Transitional. This tool stays available while branch enumeration is being folded into search with type: "branch". Until that ships, use list_branches to enumerate branches.
Browse branches in a workspace with filtering and pagination. Results are paginated newest-first.
Parameters:
| Parameter | Required | Description |
|---|---|---|
workspaceId | No | Workspace ID |
branchStatuses | No | Filter by status. Valid values: Draft, ReadyForReview, ChangesRequested, Approved, Merged, Closed, Open. Defaults to open/active branches only. |
pageSize | No | Results per page (1–50, default 25) |
pageToken | No | Pagination token from a previous response |
branchName | No | Substring match on branch name (case-insensitive) |
creatorEmail | No | Filter by creator email |
creatorUserId | No | Filter by creator user ID |
reviewerEmail | No | Filter by reviewer email |
reviewerUserId | No | Filter by reviewer user ID |
collaboratorEmail | No | Filter by collaborator email |
collaboratorUserId | No | Filter by collaborator user ID |
createdAfter | No | ISO 8601 date — only branches created after |
createdBefore | No | ISO 8601 date — only branches created before |
impactedSourceId | No | Filter to branches affecting a specific source |
Returns: Compact per-branch summary — name, status, ID, creator email — plus a nextPageToken when more results are available. Call get with type: "branch" and include: ["overview"] for full resolved data.
To find “my branches,” pass your own email as creatorEmail or reviewerEmail. The tool does not auto-inject your identity into the filter.
By default Merged and Closed branches are excluded. Pass branchStatuses: ["Merged"] (or any other value) to include them.
Common errors: workspace access denied, invalid pageSize, invalid date format.
get
Scope: read
Universal item-details tool. Look up a single tracking plan item by ID or exact name, read a branch’s overview and code snippets, or enumerate workspace-level entities. Defaults to the main branch.
Parameters:
| Parameter | Required | Description |
|---|---|---|
type | Yes | Item type. One of: event, property, metric, category, propertyBundle, source, destination, groupType, eventVariant, branch, workspaceConfig. |
id | Varies by type | The item’s unique ID. Required for event, property, metric, category, propertyBundle, eventVariant unless name is provided. Optional for source/destination/groupType (omit both id and name to enumerate). Optional for branch (defaults to the active branch context if omitted). Not used by workspaceConfig. |
name | Varies by type | Exact name match. Alternative to id for most types. May return multiple matches for ambiguous names (especially properties) — use search for fuzzy lookup. |
variantId | For eventVariant | The variant ID. Combined with id (the base event ID). |
include | For branch | Array of branch facets to return: overview, changes, code_snippets. Combine changes and code_snippets for an implementer-ready picture of the branch. |
sourceId | When include contains code_snippets | Source ID to scope the code snippets to. |
branchId | No | Branch to look up on. Defaults to main. branchId takes precedence over branchName. |
branchName | No | Alternative to branchId. |
includePropertyDetails | No | Events only. When true, includes full property definitions (type, constraints, allowed values). Defaults to false, which returns only property ID + name references. |
includeArchived | No | When true (default), includes archived items in results. When false, only active items. |
workspaceId | No | Workspace ID |
Returns: Full details for the item, shaped per item type.
type: "event" \| "property" \| "metric" \| "category" \| "propertyBundle" \| "eventVariant"— the item’s full definition.type: "source" \| "destination" \| "groupType"— a single entity whenid/nameis provided, or a workspace-level list when both are omitted.type: "branch"— branch facets requested viainclude.overviewreturns resolved emails for the creator, reviewers, and collaborators, branch status, impacted source IDs, and description.changesreturns the structured diff (new, modified, and deleted events with their properties and descriptions).code_snippetsreturns per-event code diffs for the source named insourceId— exact unified diffs for Avo Codegen sources and illustrative pseudocode for manually-instrumented sources.type: "workspaceConfig"— the workspace’s event/property naming conventions and casing rules, plus custom field definitions and the list of recognized PII types. Use this before proposing new events or properties so names match the workspace’s audit rules.
Common errors: item not found, ambiguous name (returns multiple matches — narrow by ID), sourceId missing for include: ["code_snippets"], workspace access denied.
search
Scope: read
Find tracking plan items in one of two modes — the mode is selected automatically by which parameters you pass. Combining query with structural filters returns 400. For ID-based lookups use get.
- Semantic search — pass
queryto find items by meaning across events, properties, metrics, categories, property bundles, and event variants. Uses vector similarity, not keyword matching —"user signed up"matchesAccount CreatedorRegistration Completed. - Structured listing — omit
queryand pass filters to enumerate exact matches with keyset pagination.
Parameters shared across modes:
| Parameter | Required | Description |
|---|---|---|
itemType | No | Filter by type: event (default), property, metric, category, propertyBundle, or eventVariant. |
maxResults | No | Semantic mode: 1–20, default 10. Filter mode: 1–500, default 10. |
workspaceId | No | Workspace ID. |
Semantic mode (pass query):
| Parameter | Required | Description |
|---|---|---|
query | Yes | Natural language search query. |
Semantic search is performed against the main branch only. The semantic index may lag slightly for very recently created or updated items.
Filter mode (omit query, pass any of the filter fields):
| Parameter | Required | Description |
|---|---|---|
tags | No | Filter by tag. |
categories | No | Filter by category name. |
sources | No | Filter by source name. Does not apply to metrics. |
eventNames | No | Filter by event name. With itemType: "property", returns properties on those events. |
variantNames | No | Filter by event variant name. |
properties | No | With itemType: "event", returns events referencing any of these properties. |
includeVariants | No | With itemType: "event", interleaves each event’s variants in the result set. |
stakeholders | No | Filter by stakeholder. |
owners | No | Filter by owner. |
destinations | No | Filter by destination name. |
type | No | With itemType: "event", filter by event type. |
nameMapping | No | Filter by destination-name-mapping. Tagged object: { kind: "any" } (items with any mapping) or { kind: "matchesAny", names: [...], includeNoMapping?: bool } (items whose mapped name is in names; with includeNoMapping: true items without a mapping rule also pass). Omitting nameMapping means no filter on mapping. |
branchId | No | Branch to enumerate on. Defaults to main. |
branchName | No | Alternative to branchId. |
pageToken | No | Pagination token from a previous response. |
Multiple values inside one array are OR’d; values across different filter keys are AND’d.
Returns: Ranked results with rank, name, type, item ID, relevance percentage, and a truncated description (80 characters). Filter-mode responses include a nextPageToken when more results are available.
{
"results": [
{
"rank": 1,
"name": "Account Created",
"itemType": "event",
"itemId": "evt-9f2b…",
"relevance": 0.91,
"description": "Sent when a new account is successfully created."
},
{
"rank": 2,
"name": "Signup Started",
"itemType": "event",
"itemId": "evt-3c11…",
"relevance": 0.87,
"description": "Sent when the user opens the signup screen."
}
]
}Semantic search requires Avo Intelligence Smart Search to be enabled in your workspace. Workspace admins can enable it in Workspace Settings. If you don’t have admin access, ask a workspace admin to enable it. Filter-mode listing does not require Smart Search.
workflow
Scope: write
Write access is in general beta — enabled for every workspace, no need to request access. Email support@avo.app if you hit anything unexpected.
Branch-lifecycle write operations. Currently supports two actions:
create_branch— open a new branch.update_branch_description— set the description on an existing open branch.
Parameters:
| Parameter | Required | Description |
|---|---|---|
action | Yes | The workflow action. One of: create_branch, update_branch_description. |
branchName | For create_branch; alternative to branchId for update_branch_description | Name for the new branch (create_branch), or the existing branch’s name (update_branch_description). |
branchId | Alternative to branchName for update_branch_description | ID of the existing branch to update. Provide exactly one of branchId or branchName. |
description | For update_branch_description | The new description text. |
workspaceId | No | Workspace ID |
Returns: For create_branch: the new branch’s branchId, branchName, and a branchUrl that opens it in the Avo web app. For update_branch_description: confirmation with the resolved branchId and the updated description.
A branch is a draft workspace for tracking-plan changes, analogous to a git branch. All write operations via the MCP happen on a branch — save_items requires a branchId that exists. The MCP never merges to main; open the branch in the Avo app to review and merge.
Common errors: missing write scope (re-authorize with write), workspace access denied, unsupported action value, both branchId and branchName provided (update_branch_description requires exactly one).
save_items
Scope: write
Write access is in general beta — enabled for every workspace, no need to request access. Email support@avo.app if you hit anything unexpected.
Batch create, update, remove, and archive events, properties, event variants, property bundles, and metrics on a branch. A single call can mix item types and operations, and can cross-reference new items via temporary IDs.
Top-level parameters:
| Parameter | Required | Description |
|---|---|---|
branchId | Yes | The branch to write to. Get it from workflow (action: "create_branch"). |
items | Yes | Array of items to apply. Each item is typed by its type field and has an op (default create). |
workspaceId | No | Workspace ID |
The request is capped at 100 items per call.
Item shape
Every item shares these fields:
| Field | Type | Notes |
|---|---|---|
op | "create" | "update" | "remove" | "archive" | Defaults to "create". Not every op applies to every type — see “Supported ops” below. |
type | "event" | "property" | "event_variant" | "property_bundle" | "metric" | Required. |
name | string | Required on create for events, properties, property bundles, and metrics. Cosmetic on event_variant items and on update/remove of other types. |
tempId | string | Create only. Declares a temporary handle (e.g. "prop1"). Reference it elsewhere in the same call as "$tmp:prop1". The server allocates a real ID and resolves all $tmp: references before writing. |
eventId | string | Required on update / remove of events. |
propertyId | string | Required on update / remove of properties. |
propertyBundleId | string | Required on update / remove of property bundles. |
metricId | string | Required on update / archive of metrics. |
baseEventId | string | Required for event_variant items — the parent event’s ID. |
variantId | string | Required on update of event_variant. On create, provide either variantId directly or a tempId on the same item. |
nameSuffix | string | Required on create of event_variant — suffix appended to the parent event name (e.g. buy_now produces click / buy_now). |
description | string | Create-only. Event / property / bundle / metric description. |
Supported ops by type:
| Type | create | update | remove | archive |
|---|---|---|---|---|
event | ✅ | ✅ | ❌ (see “Not yet implemented”) | — |
property | ✅ | ✅ | ✅ (archives the property + cascades references) | — |
event_variant | ✅ | ✅ | ❌ (see “Not yet implemented”) | — |
property_bundle | ✅ | ✅ | ✅ (archives the bundle) | — |
metric | ✅ | ✅ | — | ✅ |
Create-event fields:
| Field | Notes |
|---|---|
properties | Array of property IDs (or $tmp: refs) to attach. |
propertyBundles | Array of property bundle IDs (or $tmp: refs) to attach to the event. |
sources | Array of source IDs to include the event in. Find source IDs with get (type: "source" with id/name omitted to enumerate). |
Create-property fields:
| Field | Notes |
|---|---|
propertyType | string, int, long, float, bool, object, any (aliases like integer, boolean, double accepted). |
sendAs | event, user, or system. |
eventConfigs | (optional) Per-event/per-source property settings on a fresh property. On create, only events: { kind: "allEvents" } entries are accepted — per-event-scoped entries are rejected because the property isn’t attached to any event yet. See “Per-event property settings (eventConfigs)” below. |
Create-event_variant fields:
| Field | Notes |
|---|---|
attachProperties | Array of property IDs (or $tmp: refs) to attach to the variant. |
overrides | Component-level overrides. Each entry: { propertyId, pinned } or { propertyId, allowed }. pinned and allowed are mutually exclusive per override. |
bundleOverrides | Bundle IDs to attach to the variant as property bundles. |
Create-property_bundle fields:
| Field | Notes |
|---|---|
addProperties | Property IDs (or $tmp: refs) to include in the bundle. |
attachToEvents | Event IDs (or $tmp: refs) the new bundle should be attached to. |
Create-metric fields:
| Field | Notes |
|---|---|
metricType | Required. One of Funnel, EventSegmentation, Proportion, Retention, CustomEvent, Cohort. Immutable after create — archive and recreate to change. |
items | Required for non-cohort metrics. Array of metric items referencing events by eventId (or $tmp: ref), with optional baseEventId for event variants. |
cohortConditions | Required for Cohort metrics. Array of conditions referencing events by eventId (or $tmp: ref) and optional propertyId. |
Update-event fields: (require eventId)
| Field | Notes |
|---|---|
set.description | New event description. |
addProperties / removeProperties | Property IDs (or $tmp: refs) to associate / disassociate. |
addPropertyBundles / removePropertyBundles | Property bundle IDs (or $tmp: refs) to attach / detach. |
addSources / removeSources | Source IDs to include / exclude. |
Update-event_variant fields: (require baseEventId + variantId)
| Field | Notes |
|---|---|
set.nameSuffix | New variant suffix. |
set.description | New variant description. |
attachProperties / removeProperties | Property IDs to attach / detach from this variant. |
addComponentOverrides | Override specs to add or replace. Same shape as create overrides. |
removeComponentOverrides | Property IDs whose overrides should be cleared. |
Update-property fields: (require propertyId)
| Field | Notes |
|---|---|
set.description | New property description. |
set.propertyType | New type. Same value set as create: string, int, long, float, bool, object, any (aliases like integer, boolean, double accepted). |
addAllowedValues | Top-level on the item, not inside set. String values to add to a string-typed property’s allowed list. |
removeAllowedValues | Top-level on the item, not inside set. Values not in the current list are silently no-ops. |
eventConfigs | Top-level on the item. Per-event/per-source property settings — change presence, pin a value, or restrict allowed values per event. See “Per-event property settings (eventConfigs)” below. |
Update-property_bundle fields: (require propertyBundleId)
| Field | Notes |
|---|---|
set.name | Rename the bundle. |
set.description | New bundle description. |
addProperties / removeProperties | Property IDs (or $tmp: refs) to add / remove from the bundle. Bundle-to-event attachment is managed from the event side via addPropertyBundles / removePropertyBundles on event-update items. |
Update-metric fields: (require metricId)
| Field | Notes |
|---|---|
setName | Rename the metric. |
setDescription | New metric description. |
addItems / removeItems | For non-cohort metrics, add or remove metric items. |
addCohortConditions / updateCohortConditions / removeCohortConditions | For Cohort metrics, manage the cohort condition list. |
Remove-property: (require propertyId)
{ op: "remove", type: "property", propertyId: "..." } archives the property on the branch and cascades removal references on every event that uses it, mirroring the Avo UI. The action is destructive but reversible from the Avo app. If you only have the property name, look up the ID first with get or search so that any name-conflict ambiguity is surfaced before the mutation runs.
Remove-property_bundle: (require propertyBundleId)
{ op: "remove", type: "property_bundle", propertyBundleId: "..." } archives the bundle on the branch.
Archive-metric: (require metricId)
{ op: "archive", type: "metric", metricId: "..." } archives the metric on the branch.
Per-event property settings (eventConfigs)
eventConfigs is a top-level array on an update-property item (and, restricted to events: { kind: "allEvents" }, on a create-property item). Each entry adjusts how the property behaves on a specific event or across all events:
setPresence— change presence toalwaysSent,sometimesSent, orneverSent. Can be scoped per source.setPinnedValue— pin a value for the property. Withevents: { kind: "onEvent" }pins per-event; withevents: { kind: "allEvents" }pins property-wide.restrictAllowedValues— change the property’s allowed value list for an event. Carries avaluesChangedelta:addValues(non-empty),removeValues, orclear(no payload).
eventConfigs entries reference pre-existing events — a same-batch create-event item isn’t visible to eventConfigs yet, so create the event in an earlier call (or the same batch, ordered before the property update that references it).
Not yet implemented. The following return a NotYetImplemented error from the server:
op: "remove"oneventitems (archiving events)op: "remove"onevent_variantitemsset.sendAsonop: "update"ofpropertyitems —sendAsis immutable after create
Everything else works today: create / update events, properties, event variants, property bundles, metrics; archive properties, bundles, metrics; per-event property settings via eventConfigs.
Temporary IDs (tempId / $tmp:)
To reference a newly-created item from another item in the same call, declare a tempId on the create item and reference it elsewhere as "$tmp:<name>":
tempIdis create-only — setting it on anupdate,remove, orarchivereturns an error.tempIdnames must be unique within a singlesave_itemscall.$tmp:references are resolved in these array fields:properties,addProperties,removeProperties,attachProperties,propertyBundles,addPropertyBundles,removePropertyBundles,attachToEvents,addSources,removeSources,bundleOverrides; insideoverrides[].propertyId/addComponentOverrides[].propertyId; and within nested metric fields (items[].metricId/eventId/baseEventId,cohortConditions[].eventId/propertyId). Source and destination IDs must be real IDs —save_itemsdoes not create those entity types.- If a
$tmp:ref names a tempId that wasn’t declared on any item, the server returns a validation error.
Example: create a new event with a new property in one call
{
"branchId": "br-abc123",
"items": [
{
"op": "create",
"type": "property",
"tempId": "checkout_method",
"name": "Checkout Method",
"propertyType": "string",
"sendAs": "event",
"description": "How the user completed checkout"
},
{
"op": "create",
"type": "event",
"name": "Checkout Completed",
"description": "Fired when the user finishes checkout",
"properties": ["$tmp:checkout_method"],
"sources": ["src-web", "src-ios"]
}
]
}The server allocates a real ID for checkout_method, attaches the new property to the new Checkout Completed event, and includes the event in the Web and iOS sources — all atomically.
Example: add allowed values to an existing property
{
"branchId": "br-abc123",
"items": [
{
"op": "update",
"type": "property",
"propertyId": "prop-abc123",
"addAllowedValues": ["Buy Now", "Subscribe"]
}
]
}Response
Returns a structured result with:
createdEntities,updatedEntities,removedEntities,archivedEntities— each entry hasname,entityId, andentityType(event,property,event_variant,property_bundle, ormetric).errors— per-item validation or audit errors, each with the item index, name, and a message.warnings— non-fatal notices, same shape as errors.success— overall boolean.
{
"success": true,
"createdEntities": [
{ "name": "Checkout Method", "entityId": "prop-9d44…", "entityType": "property" }
],
"updatedEntities": [
{ "name": "Checkout Completed", "entityId": "evt-3f01…", "entityType": "event" }
],
"removedEntities": [],
"errors": [],
"warnings": []
}Common errors:
- Missing
writescope — the client must re-authorize withwrite. branchId is required/items is required— malformed request.tempId is only valid on create items— don’t settempIdonupdateorremove.Duplicate tempId "<name>"— eachtempIdmust be unique across items in the batch.Unknown $tmp: reference— a$tmp:ref names a tempId that wasn’t declared.<idField> is required for <op> <entity> items— missingeventId/propertyId/baseEventId/variantId.too many items (got N, max 100)— batch is over the 100-item cap.NotYetImplemented— one of the unsupported operations above.- Per-item audit-pipeline validation failures (e.g. illegal name, duplicate property, etc.) — returned inside the
errorsarray rather than failing the whole call.