Avo MCP tools reference
Every tool except health_check and 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 capability. 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.
Discovery & navigation
health_check— verify the server is uplist_workspaces— find your workspace IDslist_branches— browse branchesget_sources— find source IDs for a workspace
Reading the plan
Reading a specific branch
get_branch_details— full branch details (resolved emails, impacted sources, status)get_branch_implementation_guide— what changed on a branchget_branch_code_snippets— per-event code diffs for a branch + source
Writing (beta)
workflow— progress the plan forward (e.g. create a branch)save_items— create / update / remove events, properties, event variants on a branch
health_check
Scope: read
Verify the MCP server is running and responsive.
Parameters: None
Returns: A simple OK status.
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
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_branch_details 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_branch_details
Scope: read
Full details for a specific branch.
Parameters:
| Parameter | Required | Description |
|---|---|---|
branchId | One of branchId or branchName | Branch ID (takes precedence over name) |
branchName | One of branchId or branchName | Branch name — best-match, prioritizes open branches |
workspaceId | No | Workspace ID |
Returns:
- Resolved emails for the creator, all reviewers, and all collaborators
- Branch status
- Complete list of impacted source IDs
- Branch description
Use this after list_branches to drill into a specific branch.
Common errors: branch not found, ambiguous branch name, workspace access denied.
get_branch_implementation_guide
Scope: read
High-level implementation guide for a branch — everything an implementer needs to understand what changed.
Parameters:
| Parameter | Required | Description |
|---|---|---|
branchId | One of branchId or branchName | Branch ID |
branchName | One of branchId or branchName | Branch name |
workspaceId | No | Workspace ID |
sourceId | No | Filter to a specific source. Use get_sources to find source IDs. |
Returns:
- Summary: counts of new, modified, and deleted events
- New events: name, description, property list, and whether the source uses Avo Codegen or manual implementation
- Modified events: what changed (name, description, properties) with before/after values
- Deleted events: name, description, properties
- Implementation steps: instructions tailored to the source type (Codegen: check
avo.json, runavo pull, import, implement, validate; Manual: what to add, change, or remove)
When sourceId is provided, the guide filters to changes affecting only that source.
When to use this vs get_branch_code_snippets: Use this tool to understand the scope of changes. Use get_branch_code_snippets when you need the actual code diffs to write implementation code.
get_branch_code_snippets
Scope: read
Per-event code snippets — unified diffs — for all changed events on a branch, for a specific source.
Parameters:
| Parameter | Required | Description |
|---|---|---|
sourceId | Yes | Source ID. Use get_sources to find source IDs. |
branchId | One of branchId or branchName | Branch ID |
branchName | One of branchId or branchName | Branch name |
workspaceId | No | Workspace ID |
Returns: Per-event implementation snippets, including:
- Event status: New, Added (to source), Updated, Removed (from source), or Deleted
- Label:
[Codegen]or[Pseudocode]per event - Diff: exact unified diff between main and the branch for
[Codegen]events; illustrative before/after for[Pseudocode]events - Contextual guidance per event (e.g., run
avo pullfor Codegen, implement manually for pseudocode, remove calls for deleted events)
Codegen vs pseudocode. Avo sources can use Avo Codegen (type-safe generated code pulled via avo pull) or manual implementation (Avo provides pseudocode as reference). [Codegen] events include exact unified diffs; [Pseudocode] events provide illustrative guidance to help you write the implementation manually.
get_sources
Scope: read
List sources in a workspace. Sources represent the different places in your codebase where tracking fires — for example, “iOS App”, “Web App”, or “Backend Service”.
Parameters:
| Parameter | Required | Description |
|---|---|---|
workspaceId | No | Workspace ID |
branchId | No | Branch ID. Defaults to the main branch. |
branchName | No | Branch name. Defaults to the main branch. |
Returns: A table of sources — name, programming language, platform, filename hint, and source ID. Sources with no language or platform configured are flagged.
Call this to find a sourceId before using get_branch_implementation_guide or get_branch_code_snippets.
get
Scope: read
Universal item-details tool. Look up a single tracking plan item by ID or exact name. Defaults to the main branch.
Parameters:
| Parameter | Required | Description |
|---|---|---|
type | Yes | Item type. One of: event, property, metric, category, propertyBundle, source, destination, groupType, eventVariant. |
id | One of id or name | The item’s unique ID. |
name | One of id or name | Exact name match. 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). |
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.
Common errors: item not found, ambiguous name (returns multiple matches — narrow by ID), workspace access denied.
search
Scope: read
Semantic similarity search across events, properties, metrics, categories, and property bundles. Uses vector similarity, not keyword matching — a query like "user signed up" will match Account Created or Registration Completed by meaning.
Parameters:
| Parameter | Required | Description |
|---|---|---|
query | Yes | Natural language search query |
workspaceId | No | Workspace ID |
itemType | No | Filter by type: event, property, metric, category, or propertyBundle |
maxResults | No | Number of results (1–20, default 10) |
Returns: Ranked results with rank, name, type, item ID, relevance percentage, and a truncated description (80 characters).
Search is performed against the main branch only. There is a brief indexing lag for very recently created or updated items.
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.
workflow
Scope: write
Write access is in closed beta. Email support@avo.app to have your workspace enabled.
Progress the tracking plan forward. Currently supports one action: creating a branch.
Parameters:
| Parameter | Required | Description |
|---|---|---|
action | Yes | The workflow action. Supported: create_branch. |
branchName | Yes | Name for the new branch. |
workspaceId | No | Workspace ID |
Returns: The new branch’s branchId, branchName, and a branchUrl that opens it in the Avo web app.
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.
save_items
Scope: write
Write access is in closed beta. Email support@avo.app to have your workspace enabled.
Batch create, update, and remove events, properties, and event variants 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/create_branch or list_branches. |
items | Yes | Array of items to apply. Each item is typed by its type field (event, property, or event_variant) and has an op (create, update, or remove, 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" | Defaults to "create". remove is not supported for event_variant. |
type | "event" | "property" | "event_variant" | Required. |
name | string | Required on create for events and properties. Cosmetic (optional and ignored on writes) for event_variant items. |
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. |
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 (the server resolves the tempId into variantId). |
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 description. |
Create-event fields:
| Field | Notes |
|---|---|
properties | Array of property IDs (or $tmp: refs) to attach. |
sources | Array of source IDs to include the event in. Find source IDs with get_sources. |
Create-property fields:
| Field | Notes |
|---|---|
propertyType | string, int, long, float, bool, object, any (aliases like integer, boolean, double accepted). |
sendAs | event, user, or system. |
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. |
Update-event fields: (require eventId)
| Field | Notes |
|---|---|
set.description | New event description. |
addProperties / removeProperties | Property IDs (or $tmp: refs) to associate / disassociate. |
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. |
Remove-property: (require propertyId)
{ op: "remove", type: "property", propertyId: "..." } archives the property on the branch and cascades a RemovePropertyRefV3 action for every event that references 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.
Not yet implemented. The following return a NotYetImplemented error from the server:
op: "remove"oneventitemsop: "remove"onevent_variantitemsset.sendAsonop: "update"ofpropertyitems —sendAsis immutable after create
Everything else (create events / properties / event-variants; update events and event-variants; update a property’s description, propertyType, or allowed values; remove a property) works today.
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 anupdateorremovereturns an error.tempIdnames must be unique within a singlesave_itemscall.$tmp:references are resolved in these array fields:properties,addProperties,removeProperties,attachProperties, and insideoverrides[].propertyId/addComponentOverrides[].propertyId. Source, destination, and bundle IDs cannot be$tmp:refs — they must be real IDs, sincesave_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— each entry hasname,entityId, andentityType(event,property, orevent_variant).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.
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.