ReferenceAvo MCPTools reference

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

Reading the plan

  • get — get item details by ID or exact name
  • search — semantic similarity search

Reading a specific branch

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:

ParameterRequiredDescription
workspaceIdNoWorkspace ID
branchStatusesNoFilter by status. Valid values: Draft, ReadyForReview, ChangesRequested, Approved, Merged, Closed, Open. Defaults to open/active branches only.
pageSizeNoResults per page (1–50, default 25)
pageTokenNoPagination token from a previous response
branchNameNoSubstring match on branch name (case-insensitive)
creatorEmailNoFilter by creator email
creatorUserIdNoFilter by creator user ID
reviewerEmailNoFilter by reviewer email
reviewerUserIdNoFilter by reviewer user ID
collaboratorEmailNoFilter by collaborator email
collaboratorUserIdNoFilter by collaborator user ID
createdAfterNoISO 8601 date — only branches created after
createdBeforeNoISO 8601 date — only branches created before
impactedSourceIdNoFilter 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:

ParameterRequiredDescription
branchIdOne of branchId or branchNameBranch ID (takes precedence over name)
branchNameOne of branchId or branchNameBranch name — best-match, prioritizes open branches
workspaceIdNoWorkspace 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:

ParameterRequiredDescription
branchIdOne of branchId or branchNameBranch ID
branchNameOne of branchId or branchNameBranch name
workspaceIdNoWorkspace ID
sourceIdNoFilter 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, run avo 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:

ParameterRequiredDescription
sourceIdYesSource ID. Use get_sources to find source IDs.
branchIdOne of branchId or branchNameBranch ID
branchNameOne of branchId or branchNameBranch name
workspaceIdNoWorkspace 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 pull for 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:

ParameterRequiredDescription
workspaceIdNoWorkspace ID
branchIdNoBranch ID. Defaults to the main branch.
branchNameNoBranch 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:

ParameterRequiredDescription
typeYesItem type. One of: event, property, metric, category, propertyBundle, source, destination, groupType, eventVariant.
idOne of id or nameThe item’s unique ID.
nameOne of id or nameExact name match. May return multiple matches for ambiguous names (especially properties) — use search for fuzzy lookup.
variantIdFor eventVariantThe variant ID. Combined with id (the base event ID).
branchIdNoBranch to look up on. Defaults to main. branchId takes precedence over branchName.
branchNameNoAlternative to branchId.
includePropertyDetailsNoEvents only. When true, includes full property definitions (type, constraints, allowed values). Defaults to false, which returns only property ID + name references.
includeArchivedNoWhen true (default), includes archived items in results. When false, only active items.
workspaceIdNoWorkspace 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.


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:

ParameterRequiredDescription
queryYesNatural language search query
workspaceIdNoWorkspace ID
itemTypeNoFilter by type: event, property, metric, category, or propertyBundle
maxResultsNoNumber 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:

ParameterRequiredDescription
actionYesThe workflow action. Supported: create_branch.
branchNameYesName for the new branch.
workspaceIdNoWorkspace 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:

ParameterRequiredDescription
branchIdYesThe branch to write to. Get it from workflow/create_branch or list_branches.
itemsYesArray 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).
workspaceIdNoWorkspace ID

The request is capped at 100 items per call.

Item shape

Every item shares these fields:

FieldTypeNotes
op"create" | "update" | "remove"Defaults to "create". remove is not supported for event_variant.
type"event" | "property" | "event_variant"Required.
namestringRequired on create for events and properties. Cosmetic (optional and ignored on writes) for event_variant items.
tempIdstringCreate 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.
eventIdstringRequired on update / remove of events.
propertyIdstringRequired on update / remove of properties.
baseEventIdstringRequired for event_variant items — the parent event’s ID.
variantIdstringRequired 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).
nameSuffixstringRequired on create of event_variant — suffix appended to the parent event name (e.g. buy_now produces click / buy_now).
descriptionstringCreate-only. Event / property description.

Create-event fields:

FieldNotes
propertiesArray of property IDs (or $tmp: refs) to attach.
sourcesArray of source IDs to include the event in. Find source IDs with get_sources.

Create-property fields:

FieldNotes
propertyTypestring, int, long, float, bool, object, any (aliases like integer, boolean, double accepted).
sendAsevent, user, or system.

Create-event_variant fields:

FieldNotes
attachPropertiesArray of property IDs (or $tmp: refs) to attach to the variant.
overridesComponent-level overrides. Each entry: { propertyId, pinned } or { propertyId, allowed }. pinned and allowed are mutually exclusive per override.
bundleOverridesBundle IDs to attach to the variant as property bundles.

Update-event fields: (require eventId)

FieldNotes
set.descriptionNew event description.
addProperties / removePropertiesProperty IDs (or $tmp: refs) to associate / disassociate.
addSources / removeSourcesSource IDs to include / exclude.

Update-event_variant fields: (require baseEventId + variantId)

FieldNotes
set.nameSuffixNew variant suffix.
set.descriptionNew variant description.
attachProperties / removePropertiesProperty IDs to attach / detach from this variant.
addComponentOverridesOverride specs to add or replace. Same shape as create overrides.
removeComponentOverridesProperty IDs whose overrides should be cleared.

Update-property fields: (require propertyId)

FieldNotes
set.descriptionNew property description.
set.propertyTypeNew type. Same value set as create: string, int, long, float, bool, object, any (aliases like integer, boolean, double accepted).
addAllowedValuesTop-level on the item, not inside set. String values to add to a string-typed property’s allowed list.
removeAllowedValuesTop-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" on event items
  • op: "remove" on event_variant items
  • set.sendAs on op: "update" of property items — sendAs is 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>":

  • tempId is create-only — setting it on an update or remove returns an error.
  • tempId names must be unique within a single save_items call.
  • $tmp: references are resolved in these array fields: properties, addProperties, removeProperties, attachProperties, and inside overrides[].propertyId / addComponentOverrides[].propertyId. Source, destination, and bundle IDs cannot be $tmp: refs — they must be real IDs, since save_items does 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 has name, entityId, and entityType (event, property, or event_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 write scope — the client must re-authorize with write.
  • branchId is required / items is required — malformed request.
  • tempId is only valid on create items — don’t set tempId on update or remove.
  • Duplicate tempId "<name>" — each tempId must 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 — missing eventId / 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 errors array rather than failing the whole call.