Competitor Tracker & Co. Docs
MCP

MCP tools

The catalog of ~50 tools the Competitor Tracker & Co. MCP server exposes: competitors, changes, snapshots, labels, dispatches and org management, with params.

The MCP server exposes 53 tools across the Competitor Tracker & Co. domains. Each tool forwards your credential to the API, so the scope it names is the scope your token or key must carry. Destructive tools require confirm: true before they run.

See Model Context Protocol for setup and connection details.

Read tools

list_competitors

Read-only

List the current organization's competitor subscriptions, newest first. Returns a page of competitors with their tracked categories and labels, plus a nextCursor for paging. Requires the competitors:read scope.

ParameterRequiredDescription
cursornoOpaque cursor from a previous page's nextCursor.
limitnoMaximum subscriptions to return (1–200, default 50).
searchnoFree-text search over a competitor's name, display name, and URL (case-insensitive substring).

get_competitor

Read-only

Get a single competitor subscription belonging to the current organization by id, including its tracked categories, labels, and billing summary. Requires the competitors:read scope.

ParameterRequiredDescription
idyesThe competitor subscription id.

get_competitor_timeline

Read-only

Get the chronological activity timeline for a competitor (crawls, snapshots, and detected changes). Requires the competitors:read scope.

ParameterRequiredDescription
idyesThe competitor subscription id.

list_pages

Read-only

List the tracked pages for a competitor subscription, optionally filtered by page-type slug (e.g. pricing, product). Requires the pages:read scope.

ParameterRequiredDescription
competitorIdyesThe competitor subscription id whose pages to list.
pageTypenoFilter to these page-type slugs, e.g. ['pricing', 'product']. Unknown slugs match nothing.

get_snapshot

Read-only

Get a single snapshot by id, including signed URLs for its HTML, markdown, and screenshot assets plus the tracked page it was captured from. Requires the snapshots:read scope.

ParameterRequiredDescription
idyesThe snapshot id.

list_snapshots

Read-only

List the snapshots captured for a tracked page, newest first, with a nextCursor for paging. Requires the snapshots:read scope.

ParameterRequiredDescription
trackedPageIdyesThe tracked page id whose snapshots to list.
cursornoOpaque cursor from a previous page's nextCursor.
limitnoMaximum snapshots to return (1–200, default 50).

list_org_changes

Read-only

List the org-wide feed of detected changes across every actively subscribed competitor, newest first. Filter by category, priority, and a [since, until) detection window, or pass count: true for aggregate totals instead of a page of rows. Requires the changes:read scope.

ParameterRequiredDescription
cursornoOpaque cursor from a previous page's nextCursor.
limitnoMaximum changes to return (1–200, default 50).
categoriesnoFilter to these change categories, e.g. ['pricing_changes', 'product_changes'].
prioritiesnoFilter to these priorities ('high', 'medium', 'low').
sincenoOnly changes detected at or after this ISO-8601 timestamp (with offset).
untilnoExclusive upper bound; only changes detected before this ISO-8601 timestamp.
countnoWhen true, return aggregate totals ({ total, byPriority, byCategory }) over the window instead of a page of rows.

list_competitor_changes

Read-only

List detected changes for a single subscribed competitor, newest first, with optional category, priority, and since filters. Requires the changes:read scope.

ParameterRequiredDescription
idyesThe competitor subscription id.
cursornoOpaque cursor from a previous page's nextCursor.
limitnoMaximum changes to return (1–200, default 50).
categoriesnoFilter to these change categories, e.g. ['pricing_changes', 'product_changes'].
prioritiesnoFilter to these priorities ('high', 'medium', 'low').
sincenoOnly changes detected at or after this ISO-8601 timestamp (with offset).

list_snapshot_changes

Read-only

List detected changes attributed to a single snapshot, newest first, with optional category, priority, and since filters. Requires the changes:read scope.

ParameterRequiredDescription
idyesThe snapshot id.
cursornoOpaque cursor from a previous page's nextCursor.
limitnoMaximum changes to return (1–200, default 50).
categoriesnoFilter to these change categories, e.g. ['pricing_changes', 'product_changes'].
prioritiesnoFilter to these priorities ('high', 'medium', 'low').
sincenoOnly changes detected at or after this ISO-8601 timestamp (with offset).

list_labels

Read-only

List the current organization's labels, newest first. Returns a page of labels with their colors, plus a nextCursor for paging. Requires the labels:read scope.

ParameterRequiredDescription
cursornoOpaque cursor from a previous page's nextCursor.
limitnoMaximum labels to return (1–200, default 50).
searchnoFree-text search over the label name (case-insensitive substring).

get_label

Read-only

Get a single label belonging to the current organization by id, including its name and color. Requires the labels:read scope.

ParameterRequiredDescription
idyesThe label id.

get_current_user

Read-only

Read the signed-in user's profile, including their name fields and account timestamps. Requires the account:read scope.

No parameters.

list_my_orgs

Read-only

List every organization the signed-in user is an active member of, with the role they hold and when they joined. Requires the account:read scope.

No parameters.

get_balance

Read-only

Get the current organization's coin balance and a forward-looking renewal summary (paid competitor counts and upcoming charges). Requires the billing:read scope.

No parameters.

list_transactions

Read-only

List the current organization's coin transactions, newest first. Returns a page of transactions with their deltas, running balance, and reason, plus a nextCursor for paging. Requires the billing:read scope.

ParameterRequiredDescription
cursornoOpaque cursor from a previous page's nextCursor.
limitnoMaximum transactions to return (1–200, default 50).

get_org

Read-only

Read the current organization, including the application domain it has claimed (null until one is set). Requires the org:read scope.

No parameters.

list_members

Read-only

List active members of the current organization. Returns a page of members with their roles, plus a nextCursor for paging. Requires the members:read scope.

ParameterRequiredDescription
cursornoOpaque cursor from a previous page's nextCursor.
limitnoMaximum members to return (1–200, default 50).

list_invites

Read-only

List pending invitations for the current organization, newest-first. Requires the invites:read scope.

No parameters.

list_api_keys

Read-only

List the current organization's API keys with their names, scopes, expiry, and last-used time. Secret values are never returned here. Requires the account:read scope.

No parameters.

list_api_key_usage

Read-only

List an API key's usage-log entries, newest first, with method, path, status, scope, and timestamp, plus a nextCursor for paging. Requires the account:read scope.

ParameterRequiredDescription
idyesThe API key id.
cursornoOpaque cursor from a previous page's nextCursor.
limitnoMaximum usage entries to return (1–100, default 25).

list_dispatches

Read-only

List the current organization's notifications, each with its tracked labels, theme, and recipients. Requires the dispatches:read scope.

No parameters.

list_dispatch_deliveries

Read-only

List a notification's email delivery attempts, newest-first, with a nextCursor for paging. Requires the dispatches:read scope.

ParameterRequiredDescription
idyesThe notification id.
cursornoOpaque cursor from a previous page's nextCursor.
limitnoMaximum delivery attempts to return (1–100, default 25).

list_dispatch_engagement

Read-only

List the deliveries and opens recorded for one notification, newest-first, with a nextCursor for paging. Each entry names the recipient, what happened and when it happened. An event is one of delivered, failed or opened. An open also says whether the reader looked like a person or an automated one, and a failure carries a short error saying why the brief never arrived. This is a log rather than a report: it carries no totals and no rates. Requires the dispatches:read scope.

ParameterRequiredDescription
idyesThe notification id.
cursornoOpaque cursor from a previous page's nextCursor.
limitnoMaximum events to return (1–100, default 25).

list_webhooks

Read-only

List the current organization's webhooks with their destination URLs and active state. Requires the dispatches:read scope.

No parameters.

list_webhook_deliveries

Read-only

List a webhook's delivery attempts, newest-first, with a nextCursor for paging. Requires the dispatches:read scope.

ParameterRequiredDescription
idyesThe webhook id.
cursornoOpaque cursor from a previous page's nextCursor.
limitnoMaximum delivery attempts to return (1–100, default 25).

Write tools

subscribe_competitor

Write

Start tracking a new competitor by URL, optionally with a display name and the change categories to track. Requires the competitors:write scope.

ParameterRequiredDescription
urlyesThe competitor's URL, e.g. https://example.com.
displayNamenoA friendly name for this competitor.
trackedCategoriesnoChange categories to track, e.g. ['pricing_changes', 'product_changes'].

update_competitor

Write · Idempotent

Update a competitor's display name and/or the change categories tracked for it. Requires the competitors:write scope.

ParameterRequiredDescription
idyesThe competitor subscription id.
displayNamenoA friendly name, or null to clear it.
trackedCategoriesnoReplacement set of change categories to track.

create_label

Write

Create a new label for the current organization with a name and a color. Requires the labels:write scope.

ParameterRequiredDescription
nameyesShort label name, e.g. 'direct'. Letters, numbers, spaces, dashes, underscores.
coloryesLabel color, one of: gray, red, orange, yellow, green, blue, purple, pink.

update_label

Write · Idempotent

Rename and/or recolor a label belonging to the current organization. Requires the labels:write scope.

ParameterRequiredDescription
idyesThe label id.
namenoNew label name. Letters, numbers, spaces, dashes, underscores.
colornoNew label color, one of: gray, red, orange, yellow, green, blue, purple, pink.

assign_label

Write

Assign a label to a competitor (idempotent if already assigned). Returns the competitor's post-assign label set. Requires the labels:write scope.

ParameterRequiredDescription
idyesThe competitor subscription id to assign the label to.
labelIdyesThe label id to assign.

update_current_user

Write · Idempotent

Update the signed-in user's profile name fields (name, firstName, lastName). Pass null for a field to clear it; omit a field to leave it unchanged. Requires the account:write scope.

ParameterRequiredDescription
namenoLegacy display name, or null to clear it.
firstNamenoGiven name, or null to clear it.
lastNamenoFamily name, or null to clear it.

update_org

Write · Idempotent

Rename the current organization. Admin-only. Requires the org:write scope.

ParameterRequiredDescription
nameyesThe new organization name.

update_member_role

Write · Idempotent

Change a member's role to admin or member. Owner is intentionally not assignable here — use transfer_org_ownership to change ownership. Requires the members:write scope.

ParameterRequiredDescription
userIdyesThe user id of the member whose role is changing.
roleyesThe member's new role.

create_invite

Write

Invite a new member to the organization by email, joining at the admin or member role (defaults to member). Sends an invitation email. Requires the invites:write scope.

ParameterRequiredDescription
emailyesThe email address to invite.
rolenoThe role the invitee joins as (defaults to member).

mint_api_key

Write

Create a new API key for the current organization with a name, a set of scopes, and an optional expiry. The plaintext secret is returned exactly once in the response and can never be retrieved again, so store it immediately. Requires the account:write scope.

ParameterRequiredDescription
nameyesA human-readable name for the key, e.g. 'CI deploy bot'.
scopesyesThe scopes to grant, e.g. ['competitors:read', 'changes:read']. Cannot exceed what your role can grant.
expiresAtnoAn optional ISO 8601 expiry timestamp, e.g. '2027-01-01T00:00:00.000Z'.

create_dispatch

Write

Create a notification for the current organization, optionally scoped to specific labels. Requires the dispatches:write scope.

ParameterRequiredDescription
nameyesA friendly name for this notification.
labelIdsnoLabel ids to scope this notification to, e.g. ['01J0000000000000000000A001'].

update_dispatch

Write · Idempotent

Rename, recolor, or rescope a notification belonging to the current organization. Requires the dispatches:write scope.

ParameterRequiredDescription
idyesThe notification id.
namenoA new friendly name for this notification.
labelIdsnoReplacement set of label ids to scope this notification to.
themenoThe notification's email theme.

add_dispatch_recipient

Write

Add a recipient to a notification. Members are added immediately; external recipients are emailed a confirmation link and stay pending until they confirm. Requires the dispatches:write scope.

ParameterRequiredDescription
idyesThe notification id.
kindyesWhether the recipient is an organization member or an external email.
userIdnoThe member's user id. Required when kind is 'member'.
emailnoThe external recipient's email. Required when kind is 'external'.

create_webhook

Write

Register a webhook for the current organization. The signing secret is returned once. Requires the dispatches:write scope.

ParameterRequiredDescription
urlyesThe https destination URL that signed delivery payloads are POSTed to.

start_tracking_competitors

Write

Set someone up with competitor tracking before they have an account, and hand them a link to take it over.

Name the companies they care about, by name or by domain. We match them against the companies we already track and the first three you list go on file, with their change history readable straight away. We do not fetch an address you supply: a company we do not track yet comes back in shortfalls, which is not a failure — it is something the person can add themselves once they have claimed.

Call this ONCE per person, with every company you know about. If more come up later, use add_tracked_competitors to fill the remaining slots on the same organization rather than calling this again — a second call here starts a second organization with a second link, and the person ends up with two things to claim instead of one.

Nothing is charged to anyone, no email is sent and the organization is removed after four days unless someone claims it. The claim link comes back in the response and travels no further, so pass it on and tell them what went on file and what did not.

ParameterRequiredDescription
companiesyesCompany names or domains, in the order they matter to the person you are acting for, e.g. ['Notion', 'linear.app']. The first three we already track get the slots; everything else comes back in shortfalls.
sessionIdnoYour own id for the conversation this ask came from. It ties the claim link back to where it started and is never treated as a credential. Leave it out if you have none.

add_tracked_competitors

Write · Idempotent

Add more companies to an organization you started with start_tracking_competitors, using the key that call gave you.

The three slots can be filled over as many calls as you like, so you do not have to know every company up front. What is already on file counts towards the three: name two more when one is on file and one goes on, the other comes back in shortfalls waiting behind the claim. A company already on file is reported back and takes no slot.

Companies are matched by name or by domain against the ones we already track, exactly as at the start. We do not fetch an address you supply. The claim link stays the same one and is kept up to date, so the person sees everything on file and everything still outstanding when they open it.

Authenticate with the key from the response that created the organization; that key is what says which one to add to, and it is good for as long as the organization is. If the person has already claimed, or the four days have run out, you get a plain answer saying so and nothing is changed.

ParameterRequiredDescription
companiesyesMore company names or domains to add, in the order they matter to the person you are acting for. They fill whatever slots are left of the three; anything that does not fit comes back in shortfalls.

Destructive tools

unsubscribe_competitor

Write · Destructive · Idempotent

Stop tracking a competitor and remove its subscription. This is irreversible — pass confirm: true to proceed. Requires the competitors:write scope.

ParameterRequiredDescription
idyesThe competitor subscription id.
confirmyesMust be true to confirm this irreversible action (stops tracking this competitor).

delete_label

Write · Destructive · Idempotent

Delete a label and detach it from every competitor it is assigned to. This is irreversible — pass confirm: true to proceed. Requires the labels:write scope.

ParameterRequiredDescription
idyesThe label id.
confirmyesMust be true to confirm this irreversible action.

unassign_label

Write · Destructive · Idempotent

Unassign a label from a competitor. This is irreversible — pass confirm: true to proceed. Requires the labels:write scope.

ParameterRequiredDescription
idyesThe competitor subscription id to unassign the label from.
labelIdyesThe label id to unassign.
confirmyesMust be true to confirm this irreversible action.

delete_org

Write · Destructive · Idempotent

Delete the current organization. Owner-only. This is irreversible — pass confirm: true to proceed. Requires the org:write scope.

ParameterRequiredDescription
confirmyesMust be true to confirm this irreversible action.

transfer_org_ownership

Write · Destructive

Transfer ownership of the current organization: the current owner becomes admin and the target member becomes owner. This is irreversible — pass confirm: true to proceed. Requires the org:write scope.

ParameterRequiredDescription
to_user_idyesThe user id of the member who will become the new owner.
confirmyesMust be true to confirm this irreversible action.

leave_org

Write · Destructive

Leave the current organization. Sole owners must transfer ownership first. This is irreversible — pass confirm: true to proceed. Requires the account:write scope.

ParameterRequiredDescription
confirmyesMust be true to confirm this irreversible action.

revoke_invite

Write · Destructive · Idempotent

Revoke a pending invitation. This is irreversible — pass confirm: true to proceed. Requires the invites:write scope.

ParameterRequiredDescription
inviteIdyesThe id of the pending invitation to revoke.
confirmyesMust be true to confirm this irreversible action.

revoke_api_key

Write · Destructive · Idempotent

Permanently revoke an API key by id so it can no longer authenticate. This is irreversible — pass confirm: true to proceed. Requires the account:write scope.

ParameterRequiredDescription
idyesThe API key id.
confirmyesMust be true to confirm this irreversible action.

regenerate_api_key

Write · Destructive

Rotate an API key's secret by id. This immediately invalidates the previous secret and returns a new plaintext secret exactly once — any client still using the old secret will stop working. This is irreversible — pass confirm: true to proceed. Requires the account:write scope.

ParameterRequiredDescription
idyesThe API key id.
confirmyesMust be true to confirm this irreversible action.

delete_dispatch

Write · Destructive · Idempotent

Delete a notification belonging to the current organization. This is irreversible — pass confirm: true to proceed. Requires the dispatches:write scope.

ParameterRequiredDescription
idyesThe notification id.
confirmyesMust be true to confirm this irreversible action.

remove_dispatch_recipient

Write · Destructive · Idempotent

Remove a recipient from a notification. The pinned owner cannot be removed. This is irreversible — pass confirm: true to proceed. Requires the dispatches:write scope.

ParameterRequiredDescription
idyesThe notification id.
recipientIdyesThe recipient id to remove.
confirmyesMust be true to confirm this irreversible action.

delete_webhook

Write · Destructive · Idempotent

Delete a webhook, freeing one of the organization's slots. This is irreversible — pass confirm: true to proceed. Requires the dispatches:write scope.

ParameterRequiredDescription
idyesThe webhook id.
confirmyesMust be true to confirm this irreversible action.

On this page