---
title: Available tools
description: The six tools the Retidal MCP server exposes — arguments, required scope, and what each one actually does.
---

The server registers exactly **six** tools. `tools/list` only advertises the subset your credential's scope
allows — see [Overview § Tool visibility](/mcp/overview#tool-visibility).

Every tool below (except `get_integration_guide`) is a thin forward to the same Management API documented
elsewhere in these docs: a downstream `4xx` is passed through with its `error`/`issues` verbatim, a
downstream `5xx` or network failure becomes a fixed generic upstream-error message that never leaks internal
detail.

## get_integration_guide

<ParamField name="stack" type="string" required>
  `"node"` | `"browser"` | `"curl"`.
</ParamField>

No scope required — any resolved credential can call it. Generates the [event-ingestion](/docs/sending-data/events)
wiring snippet for the chosen stack, filled in with your resolved `apiKey` only (never the secret, even if
your credential is a key:secret pair). Pure content generation — it calls no downstream route.

## verify_event_ingestion

<ParamField name="eventName" type="string">
  Optional. If provided, only a matching event name counts as "received."
</ParamField>

Requires scope `mcp:events_write`. Enables debug mode for the project if it isn't already on, then does a
**single** check (not long-polling) for events received in the roughly 5-second window before the call plus
1 second after. Reports either a confirmed match with the event, or a fixed "not yet received — try again in
a few seconds" message. If enabling debug mode succeeds but the events query itself fails, the tool returns
an error without undoing the now-enabled debug mode (enabling is idempotent, so nothing is lost).

## list_recent_events

<ParamField name="eventName" type="string">
  Optional substring filter.
</ParamField>
<ParamField name="limit" type="number">
  Optional, default 20, clamped to 1–100.
</ParamField>

Requires scope `mcp:events_read`. Forwards to the project-events catalog — this returns the **aggregated
list of active event types** (most recently triggered first), not a feed of raw individual event rows.

## register_event_schema

<ParamField name="appEventName" type="string" required>
  Your application's event name, exactly as reported to `/api/v1/t`.
</ParamField>
<ParamField name="eventDefinitionId" type="string" required>
  The target standard event definition's **id** — not its name/slug. There's no tool to look this id up;
  get it from the console's event-mapping UI or the Management API's event-definitions list.
</ParamField>
<ParamField name="isActive" type="boolean">
  Optional. Omit it to take the downstream default (`true`) rather than sending `false` unintentionally.
</ParamField>

Requires scope `mcp:events_write`. Creates an event mapping — the same mapping the console's "event mapping"
feature manages, letting your business event name (`user_paid`) attribute against a standard event
(`PURCHASE`) for ad-platform conversion callbacks.

## create_short_link

<ParamField name="destinationUrl" type="string" required>
  Must be a parseable `http://` or `https://` URL. Rejected locally (no downstream call at all) if it isn't
  — you get an immediate error rather than a wasted round trip.
</ParamField>
<ParamField name="campaignName" type="string">
  Optional. Defaults to `"MCP Quickstart"` if omitted.
</ParamField>
<ParamField name="utmSource" type="string">
  Optional.
</ParamField>
<ParamField name="utmMedium" type="string">
  Optional.
</ParamField>
<ParamField name="utmCampaign" type="string">
  Optional.
</ParamField>

Requires scope `mcp:links_write`. Get-or-creates a campaign by exact name (atomic on the server — concurrent
calls with the same name can't create duplicate campaigns or split links across two different ones), then
creates a short link under it. Returns the short URL in the form `https://api.retidal.com/s/{shortCode}`. If
link creation fails after the campaign was resolved, the campaign is **not** rolled back — it's safely
reusable on a retry.

## get_attribution_report

<ParamField name="startDate" type="string">
  Optional `YYYY-MM-DD`.
</ParamField>
<ParamField name="endDate" type="string">
  Optional `YYYY-MM-DD`.
</ParamField>

Requires scope `mcp:attribution_read`. Read-only forward to the
[attribution analytics](/docs/console/queries#event-visit-and-attribution-analytics) endpoint. Missing or
unparseable dates don't error — they silently fall back to the downstream default 30-day window.

## Scope reference

| Tool | Required scope |
| --- | --- |
| `get_integration_guide` | none |
| `verify_event_ingestion` | `mcp:events_write` |
| `list_recent_events` | `mcp:events_read` |
| `register_event_schema` | `mcp:events_write` |
| `create_short_link` | `mcp:links_write` |
| `get_attribution_report` | `mcp:attribution_read` |

Issue a scoped key with only the scopes an agent actually needs from
[Projects → Scoped API keys](/docs/console/projects#scoped-api-keys). A project key:secret pair bypasses
these scope checks entirely (every tool is available) — prefer a scoped key for anything you're handing to
an agent you don't fully trust with full project ADMIN access.
