# ai.shipeasy/mcp (npm · @shipeasy/mcp)

Feature flags, A/B experiments, kill switches, dynamic config & i18n — Shipeasy MCP server.

- Trust score: 79/100 (medium)
- Change this week: +73
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `@shipeasy/mcp`: 79/100 (this document), [markdown](https://verifymcp.io/servers/ai-shipeasy-mcp/shipeasy-mcp.md), [page](https://verifymcp.io/servers/ai-shipeasy-mcp/shipeasy-mcp)

## Channel facts

- Registry: `npm`
- Package: `@shipeasy/mcp`
- Version: `2.8.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 88/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (97 of 101), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (97 of 101), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to shipeasy-ai/shipeasy).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 6 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 72/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 22388 tokens (~194/item across 115 items; 115 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 26/100
  - Stability check failed: the tool surface changed between 2.5.0 and 2.8.0: 0 tool removals, 1 breaking changes, 0 additions.
- **Tool Coverage**: 98/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 95% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add ai-shipeasy-mcp -- npx -y @shipeasy/mcp
```

### Codex

```bash
codex mcp add ai-shipeasy-mcp -- npx -y @shipeasy/mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ai-shipeasy-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@shipeasy/mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add ai-shipeasy-mcp --command npx --arg -y --arg @shipeasy/mcp
```

### Hermes

```yaml
mcp_servers:
  ai-shipeasy-mcp:
    command: "npx"
    args: ["-y", "@shipeasy/mcp"]
```

### Other

```json
{
  "mcpServers": {
    "ai-shipeasy-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@shipeasy/mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 79, −2)

No change was recorded against any check on this day. Supply Chain Security went from 97 to 88. Other categories moved too: Stability & Change Management rose 3.

### 2026-08-02 (score 81, +44)

- [security improvement] Known CVEs: unverified → partial
- [security improvement] Provenance: unverified → pass
- [security improvement] Install scripts: unverified → pass
- [security improvement] Malware scan: unverified → pass
- [security] The attested source repository moved: shipeasy-ai/shipeasy
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] License: unverified → pass
- [functional] Licence: MIT

### 2026-07-31 (score 37, −2)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 39, −34)

- [security regression] Install scripts: pass → unverified
- [security regression] Provenance: pass → unverified
- [security regression] Known CVEs: partial → unverified
- [security] The attested source repository moved: shipeasy-ai/shipeasy
- [functional regression] License: pass → unverified
- [functional regression] Dependency health: partial → unverified
- [functional regression] Maintenance: pass → unverified
- [functional] Licence: MIT

### 2026-07-28 (score 73, +67)

- [security improvement] Known CVEs: unverified → partial
- [security improvement] Provenance: unverified → pass
- [security improvement] Install scripts: unverified → pass
- [security] The attested source repository moved: shipeasy-ai/shipeasy
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] License: unverified → pass
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Schema quality: unverified → 100
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 95
- [functional] First check of Schema quality: good
- [functional] Licence: MIT

### 2026-07-27 (score 6)

First indexed and scored.

## MCP tools (115)

### `projects_upsert` (~177 tokens)

Find-or-create a Shipeasy project by domain (idempotent) and bind the cwd to it via .shipeasy. Use this on fresh installs BEFORE any other write tool — every other write tool refuses to run until .shipeasy exists. Re-running with the same domain returns the existing project unchanged.

Input parameters:

- `bind` (boolean): Write .shipeasy after upsert. Default true. Set false to skip binding.
- `domain` (string, required): Hostname-like identifier for the project (e.g. shouks.app, acme.com). Primary key for upsert.
- `name` (string): Human-readable project name. Defaults to the domain on first create; ignored on later upserts.
- `path` (string): Directory to write .shipeasy in. Defaults to the MCP server's cwd.

### `auth_check` (~37 tokens)

Report whether ~/.config/shipeasy/config.json holds a valid CLI token. Returns { authenticated, project_id, base_url, user_email }.

### `auth_login` (~45 tokens)

Launch the PKCE device-auth flow via `shipeasy login`. Opens a browser; blocks up to 5 minutes. Caller should render a 'waiting for browser…' spinner.

### `auth_logout` (~179 tokens)

Delete ~/.config/shipeasy/config.json — the ONE session shared by the `shipeasy` CLI and every MCP client on this machine. No network call. **This is not restorable from MCP**: re-authenticating needs a browser sign-in in a terminal (`shipeasy login`), which this transport cannot perform, so calling this strands the current task and every other tool until a human signs in again. Do NOT call it to 'reset' or troubleshoot a failing call — a 401/403 is fixed by signing in, not by deleting the credential first. Only call it when the user explicitly asked to sign out, and pass confirm: true to acknowledge that.

Input parameters:

- `confirm` (boolean, required): Must be true. Acknowledges that this deletes the machine-wide session and that only a human at a terminal can restore it.

### `errors_get` (~138 tokens)

Get a tracked error. Returns a single tracked error by its id, including the latest occurrence's stack, extras, and consequence, plus `occurrences` — the sampled per-instance detail rows behind the issue (newest first; exhaustive while the issue is small, thinned at volume, capped at 100). Returns…

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `errors_list` (~128 tokens)

List tracked errors. Returns a single page of tracked production errors as a **bare JSON array** (no pagination envelope), ordered by `lastSeenAt desc`. Filter with `status`, free-text-search with `q`, and cap the page with `limit`.

Input parameters:

- `limit` (integer): Maximum number of rows to return (1–500). Defaults to 200.
- `q` (string): Case-insensitive substring match against `message`, `errorType`, and `subject`.
- `status` (string): Filter by triage state. `all` (the default) returns every status.

### `errors_resolve` (~145 tokens)

Resolve a tracked error. Marks one tracked error `resolved` — the single-purpose "close out" action. Takes no body; it is `PATCH /api/admin/errors/{id}` pinned to `{ "status": "resolved" }`, exposed so tooling can close an error without being handed the full open/resolved/ignored status machine. A res…

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `errors_series` (~218 tokens)

Get an error's occurrence series. Returns a bucketed occurrence timeseries for one tracked error (by its fingerprint), read from the `shipeasy_errors` Analytics Engine dataset (near-real-time; ingest lag is seconds). The window bounds are epoch **seconds**; `to` must be strictly greater than `from`. The respon…

Input parameters:

- `bucket` (integer): Bucket width in seconds (60s–86400s/1d). Defaults to `3600` (hourly). Each returned point is floor-aligned to this width.
- `from` (integer, required): Window start, epoch seconds (inclusive).
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `to` (integer, required): Window end, epoch seconds (exclusive). Must be greater than `from`.

### `i18n_drafts_create` (~152 tokens)

Create a translation draft. Stage a new translation draft against a target profile, optionally seeding its keys from a source profile.

Input parameters:

- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `i18n_drafts_list` call. It proves you listed existing i18n drafts and confirmed this one doesn't already exist before creating it. Call `i18n_dr…
- `name` (string, required): Draft name, e.g. the target locale being staged.
- `profile_id` (string, required): Profile the draft targets.
- `source_profile_id` (string): Optional profile to seed the draft's keys from.

### `i18n_drafts_list` (~25 tokens)

List translation drafts. List staged translation drafts awaiting review/publish.

### `i18n_drafts_update` (~115 tokens)

Update a translation draft. Transition a draft's lifecycle state (`open` / `merged` / `abandoned`).

Input parameters:

- `draftId` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `status` (string): New lifecycle state for the draft.

### `i18n_keys_list` (~136 tokens)

List i18n keys. List keys for a profile, optionally filtered to a name `prefix`.

Input parameters:

- `limit` (integer): Max keys to return (1–500).
- `offset` (integer): Number of keys to skip before returning `limit` rows (offset pagination).
- `prefix` (string): Only keys whose name starts with this.
- `profile_id` (string): Profile id to list keys for.
- `q` (string): Free-text search — matches keys whose name, value, OR description contains this substring (case-insensitive). Use it to find the key behind a piece of on-screen copy.

### `i18n_keys_push` (~147 tokens)

Push i18n keys (insert-only, or `force` to overwrite). Add NEW keys to a profile. Insert-only by default — existing keys are left untouched and reported back as `skipped`.

Input parameters:

- `force` (boolean): Overwrite keys that already exist with the submitted value instead of skipping them. Overwritten keys come back as `updated`. Off by default so a routine push can never clobber live translations.
- `keys` (array, required): Keys to add. Insert-only by default — existing keys are reported back as `skipped` (set `force` to overwrite them instead).
- `profile_id` (string, required): Target profile id to add keys to.

### `i18n_keys_set` (~174 tokens)

Set a key's value and publish it live. Upsert a single key's value into a profile and immediately publish the whole profile (KV rebuild + CDN purge) so the new value is live in one call. The key is inserted when new and overwritten when it already exists. `profile` is a profile name — omit it to target the project'…

Input parameters:

- `description` (string): Optional human note to store with the key.
- `key` (string, required): Dotted key path to set, e.g. `home.cta`.
- `profile` (string): Profile name to target, e.g. `en:prod`. Omit to target the project's default-marked profile.
- `value` (string, required): New value for the key. Inserted when the key is new, overwritten when it exists.

### `i18n_keys_update` (~158 tokens)

Update one i18n key. Overwrite a single existing key's value — the only overwrite path.

Input parameters:

- `description` (string): Optional human note to store with the key.
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `value` (string, required): New value for the key (the only overwrite path).
- `variables` (array): Explicit `{{var}}` placeholder names in the value. Omit to auto-derive them from the value.

### `i18n_profiles_create` (~174 tokens)

Create an i18n profile. Create a locale profile. `name` is the stable handle (e.g. `fr:prod`).

Input parameters:

- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `i18n_profiles_list` call. It proves you listed existing i18n profiles and confirmed this one doesn't already exist before creating it. Call `i18…
- `name` (string, required): Profile handle to create, e.g. `en:prod` or `fr:prod`. Lowercase alphanumeric start, then letters/digits/`_`/`:`/`.`/`-`; max 64 chars. The locale is encoded in the handle, so no separate locale fiel…

### `i18n_profiles_list` (~39 tokens)

List i18n profiles. Returns every locale profile in the project (e.g. `en:prod`, `fr:prod`).

### `i18n_profiles_publish` (~123 tokens)

Publish a profile live. Publish a profile to the CDN — rebuild its KV snapshot + purge the edge. Publishing is PROFILE-WIDE: the whole profile is snapshotted into one KV blob, so the body takes no options.

Input parameters:

- `profileId` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `metrics_archive` (~104 tokens)

Archive a metric. Soft-deletes (archives) the metric. Returns `409` if it is attached to a running experiment — stop those experiments first.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `metrics_create` (~479 tokens)

Create a metric. Creates an event-backed metric. Pass the query as the DSL string (`query`) **or** the typed IR (`query_ir`) — exactly one. `event_name` must equal the event the query references.

Input parameters:

- `default_min_effect_of_interest`: Default minimum effect of interest (relative, 0–1) — the smallest change in this metric worth acting on, used as the power-planning baseline. Intrinsic to the metric; an experiment overrides it per-a…
- `direction` (string): Desired direction of movement. `higher_better` (default), `lower_better`, or `neutral` (guardrail).
- `event_name` (string, required): Source event the query reads from.
- `folder`: Optional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `metrics_list` call. It proves you listed existing metrics and confirmed this one doesn't already exist before creating it. Call `metrics_list` f…
- `name` (string, required): Stable metric key. Single segment or `folder.name`; lowercase letters, digits, `_`/`-`; max 128 chars.
- `query` (string): Metric query DSL string, e.g. `sum(purchase, amount)`. The alternative to `query_ir`. Every label the query references — in filters, the value position, `by (…)`, or `without (…)` — must exist as a p…
- `query_ir` (object): Typed query IR — the structured alternative to the `query` DSL string. Exactly one of `query` / `query_ir` is supplied per metric body.
- `unit`: Display unit (e.g. `ms`, `%`, `$`), or `null` when unitless.
- `winsorize_pct` (integer): Winsorise percentile (1–99) to clamp outliers. Defaults to 99.

### `metrics_events_approve` (~180 tokens)

Approve a pending event. Promotes a pending (auto-discovered) event to usable so metrics can query it (`pending` → `0`).

Input parameters:

- `description` (string): New description for the event.
- `folder`: Optional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `properties` (array): Replaces the full property set (no merge). Omit to leave properties unchanged.

### `metrics_events_archive` (~103 tokens)

Archive an event. Soft-deletes (archives) the event. Returns `409` if any metric still references it — delete those metrics first.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `metrics_events_create` (~213 tokens)

Register an event. Registers a new event name and (optionally) its typed properties. Only `name` is required.

Input parameters:

- `description` (string): Optional human-readable description of the event.
- `folder`: Optional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `metrics_events_list` call. It proves you listed existing metrics events and confirmed this one doesn't already exist before creating it. Call `m…
- `name` (string, required): Event name. Starts with a letter, digit, or `_`; letters, digits, `_`, `-`, `.`; max 128 chars. Immutable after create — this is the handle metric queries reference.
- `properties` (array): Typed properties declared on the event. Defaults to an empty list.

### `metrics_events_get` (~102 tokens)

Get an event. Returns one event's full detail. Resolves by exact id, unique id-prefix, or exact (unique) name.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `metrics_events_list` (~93 tokens)

List events. Returns every catalogued event in the project, including pending auto-discovered names. Each row carries its own `pending` flag, so the unapproved queue can be filtered client-side.

Input parameters:

- `q` (string): Case-insensitive substring filter across the resource's human-readable text columns (e.g. `name`, `title`, `description`). OR-matched across those columns; omit to return everything.

### `metrics_events_update` (~171 tokens)

Update an event. Partial update of an event's folder, description, or properties. `name` is immutable.

Input parameters:

- `description` (string): New description for the event.
- `folder`: Optional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `properties` (array): Replaces the full property set (no merge). Omit to leave properties unchanged.

### `metrics_experiments` (~120 tokens)

List experiments using a metric. Returns every experiment that attaches this metric — as `goal`, `guardrail`, or `secondary` — ordered with running experiments first, then by role weight (goal > guardrail > secondary).

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `metrics_list` (~85 tokens)

List metrics. Returns every metric in the project (not paginated) — name, folder, source event, the typed `queryIr`, and the rendered query.

Input parameters:

- `q` (string): Case-insensitive substring filter across the resource's human-readable text columns (e.g. `name`, `title`, `description`). OR-matched across those columns; omit to return everything.

### `metrics_series` (~216 tokens)

Get a metric's time series. Compiles the metric's typed IR into Analytics Engine SQL and returns the bucketed series over the requested window (near-real-time; ingest lag is seconds). The window bounds are epoch **seconds**; `to` must be strictly greater than `from`. The response echoes the SQL that prod…

Input parameters:

- `bucket` (integer): Bucket width in seconds (60s–86400s/1d). Defaults to `3600` (hourly). Each returned point is floor-aligned to this width.
- `from` (integer, required): Window start, epoch seconds (inclusive).
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `to` (integer, required): Window end, epoch seconds (exclusive). Must be greater than `from`.

### `metrics_show` (~96 tokens)

Get a metric. Fetch one metric by its id or name, including the rendered DSL query and the typed IR.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `metrics_unarchive` (~112 tokens)

Unarchive a metric. Reverses a soft-delete (archive), making the metric live again. Idempotent — unarchiving a metric that is already live succeeds with no effect.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `metrics_update` (~466 tokens)

Update a metric. Update a metric's definition — folder, source event, query (`query` DSL or typed `query_ir`), winsorisation, minimum detectable effect, or direction. `name` is immutable. Provide at most one of `query` / `query_ir`.

Input parameters:

- `default_min_effect_of_interest`: Default minimum effect of interest (relative, 0–1) — the smallest change in this metric worth acting on, used as the power-planning baseline. Intrinsic to the metric; an experiment overrides it per-a…
- `direction` (string): Desired direction of movement. `higher_better` (default), `lower_better`, or `neutral` (guardrail).
- `event_name` (string): Source event the query reads from.
- `folder`: Optional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `query` (string): Metric query DSL string, e.g. `sum(purchase, amount)`. The alternative to `query_ir`. Every label the query references — in filters, the value position, `by (…)`, or `without (…)` — must exist as a p…
- `query_ir` (object): Typed query IR — the structured alternative to the `query` DSL string. Exactly one of `query` / `query_ir` is supplied per metric body.
- `unit`: Display unit (e.g. `ms`, `%`, `$`), or `null` when unitless.
- `winsorize_pct` (integer): Winsorise percentile (1–99) to clamp outliers. Defaults to 99.

### `ops_ack` (~262 tokens)

Ack an item (start a run). Acknowledge a queue item — a person or an AI agent declaring "I'm on this now". Opens a run: stamps who picked the item up and when, assigns them as owner, and moves the item into the matching working status (`investigating_by_ai` for an AI ack, `in_progress` for a human one).…

Input parameters:

- `agent` (string): The AI agent type acking on the item's behalf — pass your own type when you are a coding agent (Claude Code passes `claude`, Cursor `cursor`, Copilot `copilot`, Jules/Gemini `jules`). Omit entirely f…
- `handle` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `sessionId` (string): The agent-run session id (e.g. Claude's `session_01…`), so the dashboard can deep-link to the exact run page. Omit when the harness has no session id.

### `ops_agents_list` (~56 tokens)

List connected AI agents. The project's connected AI agents — one per authenticated trigger connector (Claude / Cursor / Copilot / Jules). These are the agent types `ops ack` accepts and the agents a queue item can be assigned to.

### `ops_alerts_archive` (~119 tokens)

Delete an alert rule. Deletes the alert rule. The cron stops evaluating it immediately. Use this (then create a new rule) to repoint alerting at a different metric, since `metricId` is immutable.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `ops_alerts_channels` (~31 tokens)

List Slack channels. List the project's connected Slack channels — used to resolve an alert rule's notification target.

### `ops_alerts_create` (~269 tokens)

Create an alert rule. Creates a metric-threshold alert rule. `name`, `metricId`, `comparator`, and `threshold` are required; `windowHours` defaults to `24`, `severity` to `warn`, and `enabled` to `true`.

Input parameters:

- `comparator` (string, required): How the metric value is compared to the threshold (gt/gte/lt/lte).
- `enabled` (boolean): Whether the rule is evaluated by the cron.
- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `ops_alerts_list` call. It proves you listed existing ops alerts and confirmed this one doesn't already exist before creating it. Call `ops_alert…
- `metricId` (string, required): Id of the metric to evaluate.
- `name` (string, required): Human label for the rule, shown on the alert and the rules list.
- `notify`: Delivery target for a notification; `null` = use the project default.
- `severity` (string): Severity of the raised alert.
- `threshold` (number, required): Threshold the metric value is compared against.
- `windowHours` (integer): Lookback window (hours) the metric is aggregated over. 1–720.

### `ops_alerts_list` (~113 tokens)

List alert rules. Returns every alert rule in the project (not paginated). Each rule carries its bound `metricId`, the denormalised `metricName` (or `null` if the metric was removed), the comparator/threshold/window, severity, enabled flag, and delivery target.

Input parameters:

- `q` (string): Case-insensitive substring filter across the resource's human-readable text columns (e.g. `name`, `title`, `description`). OR-matched across those columns; omit to return everything.

### `ops_alerts_update` (~201 tokens)

Update an alert rule. Partial update of a rule's tunable knobs. `metricId` is immutable — the metric also pins the aggregation, so a body carrying `metricId` is rejected with `409 IMMUTABLE_FIELD`; create a new rule bound to the other metric instead (rule deletion is dashboard-only).

Input parameters:

- `comparator` (string)
- `enabled` (boolean)
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `name` (string)
- `notify`: Delivery target for a notification; `null` = use the project default.
- `severity` (string)
- `threshold` (number)
- `windowHours` (integer)

### `ops_bug` (~385 tokens)

File a bug report.. Files one queue item — a bug report or a feature request — and fires the project's connectors (GitHub issue / Slack). `type` selects which; only the two user-fileable types are accepted (`error`/`alert` tickets are auto-filed by the platform). Returns the new id and per-projec…

Input parameters:

- `actualResult` (string): What actually happened.
- `assigneeId`: The `users.id` of the person to assign as owner at creation, or `null`.
- `context`: Arbitrary capture context, or `null`.
- `expectedResult` (string): What was expected instead.
- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `ops_list` call. It proves you listed existing ops and confirmed this one doesn't already exist before creating it. Call `ops_list` first if you…
- `notify`: Where this bug's completion notification lands.
- `pageUrl`: URL of the page the bug relates to, or `null`.
- `priority`: Initial triage priority, or `null`.
- `reporterEmail`: Email of the reporter, or `null`.
- `status`: Initial lifecycle status; defaults to `open` when omitted.
- `stepsToReproduce` (string): How to reproduce the bug.
- `subscribers` (array): Emails of teammates to subscribe to this item's Slack pings at creation.
- `tags` (array): Tag names to attach at creation (get-or-created by name, deduped case-insensitively).
- `title` (string, required): One-line bug title (no leading/trailing whitespace).
- `userAgent`: Reporter's user-agent string, or `null`.
- `viewport`: Reporter's viewport (e.g. `1280x720`), or `null`.

### `ops_comments_create` (~283 tokens)

Comment on an item. Append a comment to a queue item's thread. The body is markdown (mentions like `@teammate` notify that person; `@shipeasy` asks Jarvis, the AI agent, to reply). Pass `parentId` to reply under an existing top-level comment (one level of threading — a reply to a reply attaches t…

Input parameters:

- `body` (string, required): The comment body as markdown. Mentions (`@teammate`, `@shipeasy`) are parsed from it.
- `handle` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `ops_comments_list` call. It proves you listed existing ops comments and confirmed this one doesn't already exist before creating it. Call `ops_c…
- `parentId`: Reply under this top-level comment. Omit / `null` for a top-level comment. Replying to a reply attaches to the same top-level parent (threading is one level deep).

### `ops_comments_list` (~139 tokens)

List an item's comments. List the comment thread on a queue item, oldest first. Each comment carries its author (a teammate email, or `system` for a comment authored by Jarvis — the AI agent), its markdown body, and `parentId` for the single level of threaded replies. Removed comments are omitted.

Input parameters:

- `handle` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `ops_create` (~434 tokens)

File a queue item (bug or feature request) — pass --type.. Files one queue item — a bug report or a feature request — and fires the project's connectors (GitHub issue / Slack). `type` selects which; only the two user-fileable types are accepted (`error`/`alert` tickets are auto-filed by the platform). Returns the new id and per-projec…

Input parameters:

- `actualResult` (string): What actually happened.
- `assigneeId`: The `users.id` of the person to assign as owner at creation, or `null`.
- `context`: Arbitrary capture context, or `null`.
- `description` (string): What the feature is.
- `expectedResult` (string): What was expected instead.
- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `ops_list` call. It proves you listed existing ops and confirmed this one doesn't already exist before creating it. Call `ops_list` first if you…
- `notify`: Where this bug's completion notification lands.
- `pageUrl`: URL of the page the bug relates to, or `null`.
- `priority`: Initial triage priority, or `null`.
- `reporterEmail`: Email of the reporter, or `null`.
- `status`: Initial lifecycle status; defaults to `open` when omitted.
- `stepsToReproduce` (string): How to reproduce the bug.
- `subscribers` (array): Emails of teammates to subscribe to this item's Slack pings at creation.
- `tags` (array): Tag names to attach at creation (get-or-created by name, deduped case-insensitively).
- `title` (string, required): One-line bug title (no leading/trailing whitespace).
- `type` (string, required): Discriminator — files a bug.
- `useCase` (string): Why it's needed / the use case.
- `userAgent`: Reporter's user-agent string, or `null`.
- `viewport`: Reporter's viewport (e.g. `1280x720`), or `null`.

### `ops_feature` (~352 tokens)

File a feature request.. Files one queue item — a bug report or a feature request — and fires the project's connectors (GitHub issue / Slack). `type` selects which; only the two user-fileable types are accepted (`error`/`alert` tickets are auto-filed by the platform). Returns the new id and per-projec…

Input parameters:

- `assigneeId`: The `users.id` of the person to assign as owner at creation, or `null`.
- `context`: Arbitrary capture context, or `null`.
- `description` (string): What the feature is.
- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `ops_list` call. It proves you listed existing ops and confirmed this one doesn't already exist before creating it. Call `ops_list` first if you…
- `notify`: Where this request's completion notification lands.
- `pageUrl`: URL of the page the request relates to, or `null`.
- `priority`: Initial triage priority, or `null`.
- `reporterEmail`: Email of the reporter, or `null`.
- `status`: Initial lifecycle status; defaults to `open` when omitted.
- `subscribers` (array): Emails of teammates to subscribe to this item's Slack pings at creation.
- `tags` (array): Tag names to attach at creation (get-or-created by name, deduped case-insensitively).
- `title` (string, required): One-line feature-request title (no leading/trailing whitespace).
- `useCase` (string): Why it's needed / the use case.
- `userAgent`: Reporter's user-agent string, or `null`.

### `ops_fired_alerts_list` (~98 tokens)

List fired alerts. Returns the project's FIRED alerts as a **bare JSON array** (no pagination envelope), ordered by `createdAt desc`. Defaults to the currently-firing ones (`status=active`); pass a `status` to widen to resolved/dismissed history or `all`.

Input parameters:

- `status` (string): Filter by lifecycle state. Defaults to `active` (currently firing); `all` returns every status.

### `ops_fired_alerts_update` (~241 tokens)

Update a fired alert. Triage writes on one fired alert — the only mutations this surface allows. All body fields are optional (at least one required); only the fields present are changed.

Input parameters:

- `agent`: AGENT owner — a connected trigger connector's id (`connectors.id`), the built-in `"jarvis"` (Enterprise plan only — rejected with `403` otherwise), or `null` to clear. Stored in `assigneeConnectorId`…
- `assigneeId`: PERSON owner — a `users.id`, or `null` to clear the assignment.
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `status` (string): New lifecycle state. `resolved` / `dismissed` stamp their timestamp; `active` re-opens and clears both.

### `ops_get` (~94 tokens)

Get one queue item. Fetch a single queue item by its per-project `number` or full id.

Input parameters:

- `handle` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `ops_investigations_create` (~492 tokens)

Record an investigation. Append one structured investigation record to a queue item — the AI-write seam the cockpit's detail panel renders read-only. Post your findings (`kind: investigated`), a blocking question for the team (`kind: question`), or how to verify the fix (`kind: ready_for_qa` with `qaN…

Input parameters:

- `agent` (string): The agent type producing the record — pass your own type when you are a coding agent.
- `completedAt` (string): ISO-8601 timestamp the work finished.
- `confidence` (string): Self-reported confidence in the record.
- `connectorId` (string): The trigger-connector row id the agent ran through.
- `durationMs` (integer): Run duration in milliseconds.
- `findings` (string): The full findings write-up (markdown).
- `handle` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `kind` (string, required): Which lifecycle stage the record documents.
- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `ops_investigations_list` call. It proves you listed existing ops investigations and confirmed this one doesn't already exist before creating it.…
- `model` (string): The model the agent ran on.
- `prNumber` (integer): A PR the record references.
- `prUrl` (string): HTML URL of that PR.
- `qaNotes` (string): How to verify the fix — QA notes (markdown).
- `question` (string): A blocking question for the team (markdown).
- `sessionId` (string): The agent-run session id, so the dashboard can deep-link to the run.
- `sources` (array): The files/links inspected.
- `startedAt` (string): ISO-8601 timestamp the work started.
- `summary` (string): One-line summary of the record.
- `tokensUsed` (integer): Tokens the run consumed.
- `visibility` (string): Record visibility. Defaults to `published`; `draft` keeps it out of the panel.

### `ops_investigations_list` (~133 tokens)

List an item's investigation records. The structured, read-only investigation records on a queue item — the findings / blocking questions / QA notes an AI agent posted while working it, plus its `working` run rows. Returns `published` records only, newest first (max 50).

Input parameters:

- `handle` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `ops_investigations_update` (~479 tokens)

Update an investigation record. Update one existing investigation record in place — the write-back seam for the `working` run record you were handed when a run was launched. Fill in the `summary`/`findings`, attach the fixing PR, record your `confidence` and the `sources` you inspected, or flip its `kind` of…

Input parameters:

- `completedAt` (string): ISO-8601 timestamp the work finished. Set it (or flip `kind` off `working`) to mark a run record done.
- `confidence` (string): Self-reported confidence in the record.
- `durationMs` (integer): Run duration in milliseconds.
- `findings` (string): The full findings write-up (markdown).
- `handle` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `investigationId` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `kind` (string): Reclassify the record's lifecycle stage (e.g. flip a `working` run into `investigated` once findings land).
- `model` (string): The model the agent ran on.
- `prNumber` (integer): A PR the record references.
- `prUrl` (string): HTML URL of that PR.
- `qaNotes` (string): How to verify the fix — QA notes (markdown).
- `question` (string): A blocking question for the team (markdown).
- `sessionId` (string): The agent-run session id, so the dashboard can deep-link to the run.
- `sources` (array): The files/links inspected.
- `summary` (string): One-line summary of the record.
- `tokensUsed` (integer): Tokens the run consumed.
- `visibility` (string): Record visibility. `draft` keeps it out of the panel; `published` surfaces it.

### `ops_link_pr` (~150 tokens)

Link a fixing PR. Record the pull request that fixes a queue item (and clears the link with `prNumber: null`).

Input parameters:

- `handle` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `prNumber` (required): PR number to record on the item. `null` unlinks the PR.
- `prUrl` (string): Explicit PR URL. Required for error/alert tickets (no GitHub issue to derive the URL from).

### `ops_list` (~238 tokens)

List the operational queue. Returns the unified ops queue (bugs, feature requests, errors, alerts) in work order — highest priority first, oldest first within a priority — so consumers work it top-down. Filter by `type` and/or `status`, and cap with `limit`. Human-gated holding states (items awaiting hum…

Input parameters:

- `limit` (integer): Max items to return (1–500).
- `owner` (string): Narrow to items owned by one person OR one agent. Matches a person by `users.id`, email, or display name, and an agent by connector id, display name, or kebab-case handle — e.g. `owner=Claude` or `ow…
- `status`: Filter by lifecycle status, or `all`. The human-gated holding state (`pending_approval`) is excluded from `all`/default and returned only when requested as the exact status.
- `type`: Filter by item type (`bug`/`feature_request`/`error`/`alert`), or `all`.

### `ops_notify` (~221 tokens)

Raise an attention notification. Raise a 'needs your attention' bell notification. Create-only and idempotent on `dedupeKey` — re-raising with the same key updates the one card instead of stacking duplicates. It never reads, marks read, or deletes the feed, so it is safe for restricted ops keys.

Input parameters:

- `dedupeKey` (string): Stable per-escalation key (e.g. `feedback:7`) so re-runs dedupe to one row.
- `href`: Dashboard-relative deep link to the related item. `null` is accepted and treated as "no link".
- `steps` (array): Ordered steps the human should take to unblock — self-contained (the human reads only this card, not the agent's transcript), 3–6 steps, each naming the exact file, command, env var, or dashboard pag…
- `summary` (string, required): One sentence: why it can't be fixed in code. Renders markdown.
- `title` (string, required): One-line headline of what's blocked.

### `ops_trigger_create_claude` (~209 tokens)

Register a Claude Code scheduled routine as the trigger connector. Creates (or idempotently updates) a coding-agent **trigger** connector — the recurring, unattended run that burns down the ops queue in `--pr` mode. Discriminated on `provider`; only the four Shipeasy-fireable providers are accepted (`claude_trigger`, `cursor_trigger`, `copilo…

Input parameters:

- `config` (object, required): Non-secret config for a Claude trigger.
- `enabled` (boolean): Whether the trigger is active on create.
- `events` (array): Events that auto-fire the routine. Defaults to empty so the trigger does not auto-fire paid runs until events are subscribed.
- `name` (string): Human-readable connector label.
- `token` (string): The routine's fire bearer token (secret). **Optional** — a tokenless trigger is recorded but not fireable until a token is added later. Encrypted into the credentials cipher; never persisted in `conf…

### `ops_trigger_create_copilot` (~192 tokens)

Register a GitHub Copilot cloud-agent trigger. Creates (or idempotently updates) a coding-agent **trigger** connector — the recurring, unattended run that burns down the ops queue in `--pr` mode. Discriminated on `provider`; only the four Shipeasy-fireable providers are accepted (`claude_trigger`, `cursor_trigger`, `copilo…

Input parameters:

- `config` (object, required): Non-secret config for a Copilot trigger.
- `enabled` (boolean): Whether the trigger is active on create.
- `events` (array): Events that auto-fire a Copilot agent task. Defaults to empty.
- `name` (string): Human-readable connector label.
- `token` (string, required): Copilot-licensed user PAT (secret). The ops key lives in the repo's GitHub "Agents" secret store and is never sent through Shipeasy. Encrypted; never returned.

### `ops_trigger_create_cursor` (~219 tokens)

Register a Cursor cloud-agent trigger (cold-fire; Shipeasy launches the run). Creates (or idempotently updates) a coding-agent **trigger** connector — the recurring, unattended run that burns down the ops queue in `--pr` mode. Discriminated on `provider`; only the four Shipeasy-fireable providers are accepted (`claude_trigger`, `cursor_trigger`, `copilo…

Input parameters:

- `apiKey` (string, required): Cursor API key that launches the run (secret). Encrypted into the credentials cipher; never returned.
- `config` (object, required): Non-secret config for a Cursor trigger.
- `enabled` (boolean): Whether the trigger is active on create.
- `events` (array): Events that auto-fire a cold cloud-agent run. Defaults to empty.
- `name` (string): Human-readable connector label.
- `opsKey` (string, required): Restricted Shipeasy ops key, injected into the run as `SHIPEASY_CLI_TOKEN` via the launch envVars (secret). Encrypted; never returned.

### `ops_trigger_create_jules` (~205 tokens)

Register a Google Jules (Gemini) trigger. Creates (or idempotently updates) a coding-agent **trigger** connector — the recurring, unattended run that burns down the ops queue in `--pr` mode. Discriminated on `provider`; only the four Shipeasy-fireable providers are accepted (`claude_trigger`, `cursor_trigger`, `copilo…

Input parameters:

- `apiKey` (string, required): Jules API key that launches the session (secret). Encrypted into the credentials cipher; never returned.
- `config` (object, required): Non-secret config for a Jules trigger.
- `enabled` (boolean): Whether the trigger is active on create.
- `events` (array): Events that auto-fire a Jules session. Defaults to empty.
- `name` (string): Human-readable connector label.
- `opsKey` (string, required): Restricted Shipeasy ops key, embedded in the prompt (Jules exposes no env channel) (secret). Encrypted; never returned.

### `ops_update` (~622 tokens)

Update a queue item. Update a queue item. The body is validated against the item's stored type: a `bug` accepts its content fields (title, steps-to-reproduce, actual/expected result) plus `status`/`priority`/`notify` and a GitHub PR link; a `feature_request` its content (title, description, use-ca…

Input parameters:

- `actualResult` (string): Updated actual result.
- `description` (string): Updated description.
- `expectedResult` (string): Updated expected result.
- `githubPrNumber`: Link (or, when `null`, unlink) a GitHub pull request to this bug.
- `handle` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `notify`: Where this item's completion notification lands, or `null`.
- `priority`: Triage priority, or `null` when not set (in an update, `null` clears it).
- `status` (string): Lifecycle status of a queue item. The working flow is `open` → `in_progress` → `ready_for_qa` → `resolved` (or `wont_fix`, terminal from any earlier stage). `blocked` marks an item that can't progres…
- `stepsToReproduce` (string): Updated reproduction steps.
- `title` (string): New bug title (no leading/trailing whitespace).
- `useCase` (string): Updated use case.

### `projects_current` (~57 tokens)

Show the current project. Returns the project the caller's auth header resolves to — plan, status, billing, and which modules are enabled. The server reads the project from the credential, so there is no id parameter. Powers `whoami`.

### `projects_update` (~881 tokens)

Update the current project. Update the current project's settings — name, domain, slug, default environment, timezone, experiment-analysis knobs (statistical method, significance threshold, auto-rollback, minimum sample days), and the per-module enable flags. Partial: only the fields you send change.

Input parameters:

- `autoRollback` (boolean): Whether a failing guardrail auto-rolls back the experiment.
- `ciConfidence` (number): Confidence level for the interval surfaced on results (any value in [0.5, 0.999], e.g. 0.90, 0.95, 0.975, 0.99).
- `cupedBaselineDays` (integer): CUPED baseline window — days of pre-experiment history, frozen at start.
- `cupedMinBaselineUsers` (integer): CUPED — minimum users with a baseline before it runs at all.
- `cupedMinOverlap` (number): CUPED selection-bias guard — min share of users with a baseline, else skip.
- `defaultAllocationPct` (integer): Default traffic allocation (basis points, 1000 = 10%) new experiments start with; overridable per experiment.
- `defaultEnv` (string): Default environment new resources are scoped to.
- `defaultHoldout` (integer): Default holdout carve-out (basis points) that seeds each new universe's holdout (0 = none).
- `defaultMei`: Default minimum effect of interest (relative, 0–1) new metrics start with; overridable per metric and per experiment. Null clears it.
- `defaultPower` (number): Target statistical power (1−β) feeding the realized-MDE calculation.
- `defaultWinsorizePct` (integer): Default winsorization percentile new metrics start with; overridable per metric.
- `domain` (string): Lowercase bare hostname (e.g. `acme.com`, `app.acme.com`, `*.acme.com`), or `*` to allow any origin. Full URLs with `https://` are not accepted. The project is keyed by `(owner_email, domain)`, so a…
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `minRuntimeDays` (integer): Minimum days an experiment must run before a verdict (peeking guard).
- `minSampleDays` (integer): Minimum number of days an experiment must run before it can be called.
- `minSampleSize` (integer): Verdict power guard — minimum users per arm before a ship/hold verdict.
- `moduleConfigs` (boolean): Enable/disable the dynamic-configs module.
- `moduleEvents` (boolean): Enable/disable the events module.
- `moduleExperiments` (boolean): Enable/disable the experiments module.
- `moduleFeedback` (boolean): Enable/disable the feedback/ops module.
- `moduleGates` (boolean): Enable/disable the feature-gates module.
- `moduleTranslations` (boolean): Enable/disable the i18n/translations module.
- `moduleUser` (boolean): Enable/disable the user-management module.
- `msprtTauMeiFactor` (number): mSPRT prior width — τ = minimum effect of interest × this factor.
- `msprtTauSdFactor` (number): mSPRT fallback prior width — τ = this × control SD when no MEI is set.
- `name` (string): New project name.
- `sigThreshold` (string): Significance threshold (alpha) for experiment analysis.
- `slug` (string): URL-safe identifier used in app URLs and SDK config. Lowercase letters, numbers, and hyphens; 2–48 chars; cannot start or end with a hyphen. The caller lowercases the raw slug before sending.
- `srmThreshold` (number): SRM chi-square p-value below which the run is called invalid.
- `statMethod` (string): Statistical method the experiment analyzer uses.
- `timezone` (string): IANA timezone the project's daily analysis runs in.

### `release_configs_archive` (~93 tokens)

Delete a dynamic config. Soft-deletes the config and rebuilds the project's flags KV blob.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_configs_create` (~404 tokens)

Create a dynamic config. Creates a new config with the given `schema`. The initial `value` (or an empty object) is published as version 1 on **every** env.

Input parameters:

- `description` (string): Optional free-form description shown in the dashboard. Max 512 chars.
- `dev` (object): Seed the **dev** env's initial value (version 1), overriding `value` for dev. Published immediately. Must match `schema`.
- `folder`: Optional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `release_configs_list` call. It proves you listed existing release configs and confirmed this one doesn't already exist before creating it. Call…
- `name` (string, required): Stable config/killswitch key in `folder.name` form (two lowercase segments separated by a dot, e.g. `pricing.tiers`). Immutable after create.
- `prod` (object): Seed the **prod** env's initial value (version 1), overriding `value` for prod. Published immediately. Must match `schema`.
- `schema` (object, required): JSON Schema (draft 2020-12) describing the shape of the config value. Top-level `type` must be `'object'`; every published value is validated against this schema.
- `staging` (object): Seed the **staging** env's initial value (version 1), overriding `value` for staging. Published immediately. Must match `schema`.
- `value` (object): Initial config value. Either a single JSON object applied to every env, or a `{ env: value }` map seeding per-env values. Must match `schema`. Defaults to `{}` on every env when omitted.

### `release_configs_get` (~104 tokens)

Get one config. Returns config metadata plus the latest published values per env and any active draft values. Use this to fetch the JSON the editor renders.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_configs_list` (~133 tokens)

List dynamic configs. Returns a single page of configs ordered by `updated_at desc, id desc`. Each row includes the latest published `version` per env and any active drafts.

Input parameters:

- `cursor` (string): Opaque cursor returned in the previous page's `next_cursor`. Omit for the first page.
- `limit` (integer): Page size (1–500). Defaults to 100.
- `q` (string): Case-insensitive substring filter across the resource's human-readable text columns (e.g. `name`, `title`, `description`). OR-matched across those columns; omit to return everything.

### `release_configs_update` (~371 tokens)

Update a dynamic config. Partial update. When `value` is supplied it is **republished on every env** (new version per env). A per-env key (`dev`/`staging`/`prod`) publishes a new version to **only that env**, immediately, overriding `value` for it. When `schema` is supplied it replaces the current sch…

Input parameters:

- `dev` (object): Publish a new version to the **dev** env only, immediately (no draft). Overrides `value` for dev. Must match the effective schema.
- `folder`: Optional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `prod` (object): Publish a new version to the **prod** env only, immediately (no draft). Overrides `value` for prod. Must match the effective schema.
- `schema` (object): Replacement schema. When supplied, the new schema is validated against every published value before it lands.
- `staging` (object): Publish a new version to the **staging** env only, immediately (no draft). Overrides `value` for staging. Must match the effective schema.
- `value` (object): Flat value applied to **every** env. Publishes a new version per env. To publish one env only, pass that env's key (`dev`/`staging`/`prod`) instead.

### `release_configs_update_schema` (~143 tokens)

Update a config schema. Replaces a config's JSON Schema in place. Every existing published value is re-validated against the new schema before it lands; the update fails if any value no longer validates.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `schema` (object, required): Replacement JSON Schema (draft 2020-12). Validated against every published value before it lands.

### `release_experiments_archive` (~107 tokens)

Delete an experiment. Archives the experiment (soft-delete via status transition). Returns `409` if the experiment is still `running` — stop it first.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_experiments_create` (~887 tokens)

Create an experiment. Creates a new experiment in `draft` status. `name`, `universe`, and `groups` are required; everything else has sensible defaults.

Input parameters:

- `allocation_pct` (integer): Share of the (gated) audience allocated to the experiment, in basis points (0–10000 = 0%–100%). `0` = unallocated. Under pooled assignment this is the size of the universe-pool slice claimed. Use `al…
- `allocation_percent` (number): Allocation as a **percentage** (0–100, fractional ok). Friendlier alias for `allocation_pct`; converted to basis points server-side (e.g. `50` = 5000 bp). If both are set, `allocation_percent` wins.
- `audience`: Audience label shown in the editor. Display-only.
- `bucket_by`
- `description`: Free-form description. Max 2000 chars, markdown rendered in the dashboard.
- `folder`: Optional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
- `goal_metric` (object): Inline metric — a DSL `query`, or an `event` (+ `aggregation`/`value`) the server compiles into one.
- `groups` (array, required): Two or more variants. Weights must sum to `10000 − reserved_headroom`. Existing weights are immutable while running, but a new variant may be appended into the reserved tail.
- `guardrail_metrics` (array): Up to 10 guardrail metrics defined inline. Each is upserted (event + metric) and attached with role=guardrail.
- `holdout_gate`: Optional per-experiment holdout gate — the name of a `holdout`-type flag (public % + whitelist). A caller the flag passes is *held out* (never assigned, sees the universe defaults). Distinct from the…
- `hypothesis`: Hypothesis statement shown in the editor. Display-only.
- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `release_experiments_list` call. It proves you listed existing release experiments and confirmed this one doesn't already exist before creating i…
- `min_runtime_days` (integer): Minimum days the experiment must run before results are considered conclusive.
- `min_sample_size` (integer): Minimum exposures per group before results are considered conclusive.
- `name` (string, required): Stable experiment key. Single segment or `folder.name` (a-z, 0-9, `_`/`-`; max 128 chars). Used by SDKs as `Shipeasy.getExperiment(user, '<name>')`. Immutable after create.
- `owner_email`: Owner email. Display-only.
- `params` (object): **Deprecated** — the universe now owns the config schema (`param_schema`). Retained for back-compat; new experiments should leave this empty and declare params on the universe. Map of param-name → sc…
- `reserved_headroom` (integer): Basis points of this experiment's split kept empty (0–10000) so a new variant can be appended into it while running without reshuffling. Group weights must sum to `10000 − reserved_headroom`. Default…
- `salt` (string): Hash salt for bucketing. Auto-generated if omitted. Immutable while running.
- `sequential_testing` (boolean): Enable sequential testing (always-valid p-values). Requires Premium plan or higher.
- `significance_threshold` (number): p-value cutoff used by the analysis pass. Defaults to `0.05`. Values other than 0.05 require Pro plan or higher.
- `tag`: Short tag chip rendered next to the name. Display-only.
- `targeting_gate`: Optional gate name (a `targeting`-type flag). Only callers that pass the gate are enrolled in the experiment.
- `universe` (string, required): Name of an existing universe in the project. Returns `422` if the universe doesn't exist.

### `release_experiments_get` (~96 tokens)

Get one experiment. Returns the full experiment row including groups, params, allocation, and lifecycle timestamps.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_experiments_list` (~171 tokens)

List experiments. Returns a single page of non-archived experiments ordered by `updated_at desc, id desc`. Use the `cursor` query parameter to paginate.

Input parameters:

- `cursor` (string): Opaque cursor returned in the previous page's `next_cursor`. Omit for the first page.
- `limit` (integer): Page size (1–500). Defaults to 100.
- `q` (string): Case-insensitive substring filter across the resource's human-readable text columns (e.g. `name`, `title`, `description`). OR-matched across those columns; omit to return everything.
- `status` (string): Filter by lifecycle status. Pass `archived` to return the archive tab; any other value (or omitting it) returns the non-archived experiments.

### `release_experiments_readout_create` (~256 tokens)

Mint a readout snapshot. Freezes the current results view into an immutable, dated readout snapshot — verdict, headline, per-metric numbers, the caveat list with its acknowledgment state, enrollment, and a hash of the assignment-relevant config. Ship/stop flows mint one automatically; "Share readout" …

Input parameters:

- `acknowledgedCaveatIds` (array): Ids of the open caveats the caller ticked (decision-gating acknowledgment). Unlisted caveats are stored as unacknowledged.
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `kind` (string, required): Why the snapshot is being minted — `manual` ("Share readout"), or automatically on `ship` / `stop`.
- `requireAllAcknowledged` (boolean): When `true`, refuse (`422`) to mint while any open caveat is not listed in `acknowledgedCaveatIds` — server-side ship gating.

### `release_experiments_readout_get` (~203 tokens)

Get a readout snapshot. Returns one immutable readout snapshot — the frozen results view (verdict, headline, per-metric numbers, caveats, enrollment) captured when it was minted, plus the `configHash` that tells you whether it is still comparable to the live view.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `readoutId` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_experiments_reanalyze` (~115 tokens)

Re-queue analysis. Requeues the daily analysis pass for this experiment outside the normal cron cadence. Useful after attaching a new metric or correcting an event taxonomy. The job runs asynchronously.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_experiments_restore` (~92 tokens)

Restore an archived experiment (→ draft). Drives the experiment lifecycle. Allowed transitions:

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_experiments_results` (~119 tokens)

Get analysis results. Returns the latest analysis output for the experiment — one row per metric/group/day, including sample size, mean, % delta vs. control, p-value, and a sample-ratio mismatch flag.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_experiments_set_metrics` (~132 tokens)

Attach metrics. Replaces the experiment's metric attachments wholesale. Each entry pairs an existing `metric_id` with a `role` (`goal` / `guardrail` / `secondary`).

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `metrics` (array, required): Replacement metrics list — replaces the current attachments wholesale.

### `release_experiments_start` (~92 tokens)

Start an experiment (draft → running). Drives the experiment lifecycle. Allowed transitions:

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_experiments_stop` (~89 tokens)

Stop a running experiment. Drives the experiment lifecycle. Allowed transitions:

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_experiments_timeseries` (~126 tokens)

Get analysis timeseries. Same row shape as `/results`, but returns every daily slice rather than the latest. Filter to a single metric with the `metric` query parameter.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `metric` (string): Optional metric name to filter the series.

### `release_experiments_universes_archive` (~109 tokens)

Delete a universe. Soft-deletes the universe. Returns `409` if any non-archived experiment still references it — archive those experiments first.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_experiments_universes_create` (~395 tokens)

Create a universe. Creates a new universe. Only `name` is required — `unit_type` defaults to `user_id` and `holdout_range` defaults to `null` (no holdout).

Input parameters:

- `description`: Human-readable blurb shown in the universe picker/hovercard.
- `folder`: Optional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
- `holdout_range`: Inclusive `[lo, hi]` bucket range (0–9999) reserved as the **holdout** — callers hashed into this slice are excluded from every experiment in the universe. `null` disables the holdout. Pro plan or hi…
- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `release_experiments_universes_list` call. It proves you listed existing release experiments universes and confirmed this one doesn't already exi…
- `name` (string, required): Stable universe key. Single segment or `folder.name`. Lowercase letters, digits, `_` or `-`; max 128 chars. Immutable after create.
- `param_schema`: The universe-owned config schema — an ordered `{ name, type, default }[]`. Experiments may only override values per variant, never add fields. `null` starts an empty schema.
- `recommended_headroom` (integer): Basis points of reserved headroom seeded into each new experiment created in this universe (0 = none). Lets variants be appended into a running experiment without reshuffling.
- `unit_type` (string): Unit of randomisation. Typically `user_id`. Use `account_id` to keep whole accounts in the same group across an experiment.

### `release_experiments_universes_list` (~142 tokens)

List universes. Returns a single page of universes ordered by `created_at desc, id desc`. The universes table has no `updated_at`, so this list is keyed on creation time.

Input parameters:

- `cursor` (string): Opaque cursor returned in the previous page's `next_cursor`. Omit for the first page.
- `limit` (integer): Page size (1–500). Defaults to 100.
- `q` (string): Case-insensitive substring filter across the resource's human-readable text columns (e.g. `name`, `title`, `description`). OR-matched across those columns; omit to return everything.

### `release_experiments_universes_update` (~279 tokens)

Update a universe. Partial update. Only `holdout_range` is mutable — `name` and `unit_type` are immutable after create.

Input parameters:

- `description`: Human-readable blurb shown in the universe picker/hovercard.
- `folder`: Optional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
- `holdout_range`: Inclusive `[lo, hi]` bucket range (0–9999) reserved as the **holdout** — callers hashed into this slice are excluded from every experiment in the universe. `null` disables the holdout. Pro plan or hi…
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `param_schema`: Replace the universe config schema. Additive changes + default edits are always allowed; removing a param a running experiment overrides is rejected (deprecate-only).
- `recommended_headroom` (integer): Basis points of reserved headroom seeded into new experiments in this universe.

### `release_experiments_update` (~640 tokens)

Update an experiment. Partial update. `allocation_pct`, `groups`, `salt`, `universe`, `params` are **immutable while running** — returns `409` if you try. Stop the experiment first.

Input parameters:

- `allocation_pct` (integer): Basis-points allocation (0–10000). Use `allocation_percent` (0–100) for percent. Immutable while the experiment is running.
- `allocation_percent` (number): Allocation as a **percentage** (0–100). Friendlier alias for `allocation_pct`; converted to basis points server-side. Wins over `allocation_pct` if both are supplied. Immutable while running.
- `audience`
- `bucket_by`
- `description`
- `folder`: Optional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
- `goal_metric` (object): Inline metric — a DSL `query`, or an `event` (+ `aggregation`/`value`) the server compiles into one.
- `groups` (array): Replacement groups. Weights must sum to `10000 − reserved_headroom`. Existing weights/values are immutable while running; a new variant may be appended into the reserved tail.
- `guardrail_metrics` (array): Replaces the guardrail set wholesale (event auto-upserted per entry).
- `holdout_gate`: Per-experiment holdout gate — the name of a `holdout`-type flag, or `null` to clear. A caller the flag passes is held out.
- `hypothesis`
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `min_runtime_days` (integer)
- `min_sample_size` (integer)
- `name` (string): Stable experiment key. Single segment or `folder.name` (a-z, 0-9, `_`/`-`; max 128 chars). Used by SDKs as `Shipeasy.getExperiment(user, '<name>')`. Immutable after create.
- `owner_email`
- `params` (object): **Deprecated** — the universe owns the config schema (`param_schema`). Retained for back-compat. Map of param-name → scalar type.
- `reserved_headroom` (integer): Basis points of the split kept empty for appended variants. Group weights must sum to `10000 − reserved_headroom`. May be shrunk (never grown into existing weights) while running when appending a var…
- `salt` (string): Hash salt. Immutable while running.
- `sequential_testing` (boolean)
- `significance_threshold` (number)
- `tag`
- `targeting_gate`
- `universe` (string): New universe name. Immutable while running. Returns `422` if the universe doesn't exist.

### `release_flags_activity` (~140 tokens)

List gate activity. Returns recent audit rows for one gate (create, update, enable, disable, delete) ordered newest first. Use the `limit` query parameter to cap the result (1–100, default 20).

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `limit` (integer): Max rows to return (1–100). Defaults to 20.

### `release_flags_archive` (~108 tokens)

Delete a feature gate. Soft-deletes the gate. Returns 409 if the gate is still referenced by a running experiment as a targeting gate — stop the experiment first.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_flags_attributes_archive` (~90 tokens)

Archive a targeting attribute. Soft-deletes (archives) a targeting attribute.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_flags_attributes_create` (~235 tokens)

Declare a targeting attribute. Declare a targeting attribute the SDK reports and gates/experiments can target. `type: enum` requires `enum_values`.

Input parameters:

- `description` (string): Optional human note shown in the dashboard.
- `enum_values`: Allowed values when `type` is `enum` (required in that case — 422 otherwise); `null` for non-enum types.
- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `release_flags_attributes_list` call. It proves you listed existing release flags attributes and confirmed this one doesn't already exist before…
- `name` (string, required): Attribute key (lowercase alphanumeric start, then letters/digits/`_`/`-`; max 64 chars). Immutable after create.
- `required` (boolean): Whether the attribute must be present on the evaluation context.
- `sdk_path` (string): Optional dotted path the SDK reads the value from.
- `type` (string, required): Declared value type of a targeting attribute.

### `release_flags_attributes_get` (~87 tokens)

Get a targeting attribute. Fetch one targeting attribute by id.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_flags_attributes_list` (~92 tokens)

List targeting attributes. Returns every auto-inferred targeting attribute in the project — the `name` and (when known) the value `type` — for building gate/experiment targeting rules.

Input parameters:

- `q` (string): Case-insensitive substring filter across the resource's human-readable text columns (e.g. `name`, `title`, `description`). OR-matched across those columns; omit to return everything.

### `release_flags_attributes_update` (~189 tokens)

Update a targeting attribute. Update a targeting attribute's type, allowed values, required flag, description, or SDK path. `name` is immutable.

Input parameters:

- `description` (string): Optional human note shown in the dashboard.
- `enum_values`: Replacement allowed values (for `enum`), or `null` to clear.
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `required` (boolean): Whether the attribute must be present on the evaluation context.
- `sdk_path` (string): Optional dotted path the SDK reads the value from.
- `type` (string): Declared value type of a targeting attribute.

### `release_flags_create` (~688 tokens)

Create a feature gate. Creates a new gate. Default `enabled: true` at the supplied `rollout_pct` (`0` = fully dark).

Input parameters:

- `description` (string): Long-form description / runbook. Markdown is rendered in the dashboard.
- `enabled` (boolean): Master switch. Defaults to `true`. Set `false` to create the gate disabled (evaluates to `false` regardless of rules/rollout); flip on via `POST /{id}/enable` or PATCH.
- `folder`: Optional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
- `group` (string): Group label for dashboard organisation (e.g. team or product area).
- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `release_flags_list` call. It proves you listed existing release flags and confirmed this one doesn't already exist before creating it. Call `rel…
- `name` (string, required): Stable gate key used by SDKs (`Shipeasy.checkGate(user, '<name>')`). Single segment or `folder.name`. Lowercase letters, digits, `_` or `-`; max 128 chars. Immutable after create — rename = delete +…
- `owner_email` (string): Owner contact. Displayed verbatim; not used for auth.
- `rollout_pct` (integer): Initial rollout in **basis points** (0–10000 = 0%–100%) — `100` here means **1%**, not 100%. Use `rollout_percent` (0–100) below if you'd rather think in percent. Use `0` to create the gate dark and…
- `rollout_percent` (number): Initial rollout as a **percentage** (0–100, fractional ok). Friendlier alias for `rollout_pct`; converted internally to basis points (e.g. `100` here = 10000 bp = 100%). If both `rollout_pct` and `ro…
- `rules` (array): Targeting predicates. AND-combined. If non-empty, the gate returns `true` only for callers that satisfy every rule **and** fall under `rollout_pct`.
- `salt` (string): Hash salt for percentage bucketing. Auto-generated if omitted. Provide explicitly to keep a gate's buckets stable across delete/recreate. **Immutable after create** — there is no PATCH for `salt` bec…
- `stack`: Optional gatekeeper stack. When provided, takes precedence over `rules` + `rollout_pct` at evaluation time. Omit (or pass `null`) for a flat gate.
- `title` (string): Human-readable title shown in the dashboard. Free-form, no key format constraint.
- `type` (string): Gate kind. `targeting` (default) is a normal flag with the full builder. `holdout` is a **restricted** flag — only a public rollout % and a whitelist are allowed; attribute rules and a gatekeeper sta…

### `release_flags_disable` (~114 tokens)

Disable a gate. Sets `enabled: false` so the gate evaluates to `false` for every caller, regardless of `rollout_pct` or `rules`. Use as a quick kill switch.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_flags_enable` (~94 tokens)

Enable a gate. Sets `enabled: true`. The current `rollout_pct` is preserved.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_flags_get` (~116 tokens)

Get one gate. Returns the full gate row — including the gatekeeper `stack`, resolved creator/last-editor emails, and the edit `version` — for one gate, addressed by id or `name`.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_flags_list` (~127 tokens)

List feature gates. Returns a single page of gates ordered by `updated_at desc, id desc`. Use the `cursor` query parameter to paginate.

Input parameters:

- `cursor` (string): Opaque cursor returned in the previous page's `next_cursor`. Omit for the first page.
- `limit` (integer): Page size (1–500). Defaults to 100.
- `q` (string): Case-insensitive substring filter across the resource's human-readable text columns (e.g. `name`, `title`, `description`). OR-matched across those columns; omit to return everything.

### `release_flags_templates_archive` (~108 tokens)

Delete a gate template. Soft-deletes (archives) a **customer** template. Returns `409` if `id` names a read-only built-in template.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_flags_templates_create` (~205 tokens)

Create a gate template. Creates a per-project (customer) targeting-rule template. Built-ins are read-only and cannot be created here. Returns `409` if a template with this `name` already exists in the project.

Input parameters:

- `auto` (boolean): Mark the attribute as request-derived (resolved at the SDK edge).
- `category` (string)
- `description` (string): One-liner shown in pickers and matched by the list `query` filter.
- `icon_key` (string): Display-only icon hint.
- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `release_flags_templates_list` call. It proves you listed existing release flags templates and confirmed this one doesn't already exist before cr…
- `name` (string, required): Human label. Unique per project.
- `rules` (array, required): The rule definition captured by the template.

### `release_flags_templates_get` (~108 tokens)

Get one gate template. Returns a single template by its `id` — a built-in slug (`country`) or a customer `gtpl_…` id.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_flags_templates_list` (~146 tokens)

List gate templates. Returns the merged targeting-rule template catalog — read-only **built-ins first** (the `@team`/`@owner` audience aliases, country, email-domain, region presets, …), then this project's **customer** templates. Each item carries a `rules: [{ attr, op, value }]` definition; the …

Input parameters:

- `q` (string): Case-insensitive substring filter across the resource's human-readable text columns (e.g. `name`, `title`, `description`). OR-matched across those columns; omit to return everything.
- `query` (string): Deprecated alias for `q`, kept working for one release. Prefer `q`.

### `release_flags_templates_update` (~154 tokens)

Update a gate template. Partial update of a **customer** template. `rules` replaces the list wholesale. Returns `409` if `id` names a read-only built-in template.

Input parameters:

- `auto` (boolean)
- `category` (string)
- `description` (string)
- `icon_key`
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `name` (string)
- `rules` (array)

### `release_flags_update` (~506 tokens)

Update a feature gate. Partial update — only supplied fields change. Array fields (`rules`, `stack`) **replace** wholesale; there is no merge or append.

Input parameters:

- `description` (string): Long-form description / runbook. Markdown is rendered in the dashboard.
- `enabled` (boolean): Master switch. `false` makes the gate evaluate to `false` for every caller regardless of `rollout_pct`, `rules`, or `stack` — use as kill switch.
- `folder`: Optional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
- `group` (string): Group label for dashboard organisation (e.g. team or product area).
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `owner_email` (string): Owner contact. Displayed verbatim; not used for auth.
- `rollout_pct` (integer): New rollout in **basis points** (0–10000 = 0%–100%) — `100` here means **1%**. Use `rollout_percent` (0–100) below for percent. Omit both to leave unchanged.
- `rollout_percent` (number): New rollout as a **percentage** (0–100). Friendlier alias for `rollout_pct`; converted internally. Wins over `rollout_pct` if both are supplied. Omit both to leave unchanged.
- `rules` (array): Replaces the rule list wholesale. To add a value to an `in` rule, send the full new `rules` array with the augmented `value` (e.g. previous `['US','CA']` → `['US','CA','GB']`).
- `stack`: Replaces the gatekeeper stack wholesale. Send `null` to revert to flat `rules` + `rollout_pct` evaluation.
- `title` (string): Human-readable title shown in the dashboard. Free-form, no key format constraint.
- `type` (string): Gate kind. Switching to `holdout` requires the gate carry only a public rollout % + whitelist (attribute rules / stack are rejected).

### `release_killswitch_archive` (~102 tokens)

Delete a killswitch. Soft-deletes the killswitch and rebuilds the project's flags KV blob so SDKs stop seeing it.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_killswitch_create` (~266 tokens)

Create a killswitch. Creates a new killswitch with `value` (default `false`) applied to **every** env at version 1.

Input parameters:

- `description` (string): Optional free-form description shown in the dashboard. Max 512 chars.
- `folder`: Optional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
- `listToken` (string): REQUIRED. The `listToken` returned by the most recent `release_killswitch_list` call. It proves you listed existing release killswitch and confirmed this one doesn't already exist before creating it.…
- `name` (string, required): Stable config/killswitch key in `folder.name` form (two lowercase segments separated by a dot, e.g. `pricing.tiers`). Immutable after create.
- `switches` (object): Initial per-switch overrides applied to every env. Empty/omitted leaves the killswitch with only the flat `value`.
- `value` (boolean): Default value applied to every env at creation. Defaults to `false`. Use `true` to ship the killswitch pre-tripped.

### `release_killswitch_get` (~105 tokens)

Get one killswitch. Returns the killswitch metadata plus the latest published `value`/`switches`/`version` per env.

Input parameters:

- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…

### `release_killswitch_list` (~143 tokens)

List killswitches. Returns a single page of killswitches ordered by `updated_at desc, id desc`. Each row includes the latest published `value`/`switches`/`version` per env.

Input parameters:

- `cursor` (string): Opaque cursor returned in the previous page's `next_cursor`. Omit for the first page.
- `limit` (integer): Page size (1–500). Defaults to 100.
- `q` (string): Case-insensitive substring filter across the resource's human-readable text columns (e.g. `name`, `title`, `description`). OR-matched across those columns; omit to return everything.

### `release_killswitch_set` (~170 tokens)

Set one switch entry. Sets or updates a single `switchKey` on a single `env`. Publishes one new version on that env only — other envs untouched.

Input parameters:

- `env` (string, required): Target environment. One of the project's configured envs (`dev`, `staging`, `prod`).
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `switchKey` (string, required): Switch key to set.
- `value` (boolean, required): New boolean value for this `switchKey` on this `env`.

### `release_killswitch_set_value` (~168 tokens)

Set the flat value on one env. Sets the flat `value` on a single `env`, publishing one new version on that env only. `switches` and other envs are untouched.

Input parameters:

- `env` (string, required): Target environment. One of the project's configured envs (`dev`, `staging`, `prod`).
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `value` (boolean, required): Flat boolean to publish on `env`. Publishes a new version on that env only.

### `release_killswitch_unset` (~150 tokens)

Remove one switch entry. Removes a single `switchKey` from the `switches` map on a single `env`. Publishes a new version on that env.

Input parameters:

- `env` (string, required): Target environment. One of the project's configured envs (`dev`, `staging`, `prod`).
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `switchKey` (string, required): Switch key to remove.

### `release_killswitch_update` (~237 tokens)

Update a killswitch. Partial update applied to **every** env. Setting `value`/`switches` publishes a new version per env. Description-only patches don't bump versions.

Input parameters:

- `description`: New description, or `null` to clear it. Max 512 chars.
- `folder`: Optional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
- `id` (string, required): A resource path identifier — an opaque `xxx_<ULID>` id (~30 chars) or the resource's `name`/`key`. 1–128 characters; the upper bound matches the longest name/key any resource accepts, so an over-long…
- `switches` (object): Replace the switches map wholesale on every env. To edit a single entry on a single env use `PUT /{id}/switch` instead.
- `value` (boolean): Flat value applied to every env. Publishes a new version per env when set. Omit to leave values unchanged.

### `whoami` (~57 tokens)

Show the current project. Returns the project the caller's auth header resolves to — plan, status, billing, and which modules are enabled. The server reads the project from the credential, so there is no id parameter. Powers `whoami`.

### `metrics_grammar` (~50 tokens)

Print the metric query DSL grammar. Print the full metric query DSL reference — grammar, aggregation semantics, filter/group-by/ratio rules, and glossed examples — used to author `metrics create --query`.

### `docs_list` (~79 tokens)

List an SDK's documentation tree. Fetch an SDK's `/docs/manifest.json` and return the doc tree — feature pages, nested snippet groups, the optional setup-topic map, and whether an installable skill exists.

Input parameters:

- `sdk` (string): SDK language. Defaults to the `sdk` recorded in the nearest `.shipeasy` when omitted.

### `docs_get` (~126 tokens)

Fetch one SDK doc page or snippet. Fetch one feature page (`flags`, `experiments`, …) or nested snippet (`release/experiments`, …), substituting declared {{placeholders}} from caller args.

Input parameters:

- `framework` (string): Framework hint (substitutes {{FRAMEWORK}}).
- `name` (string): Resource name (substitutes {{RESOURCE_NAME}}).
- `path` (string, required): Page key or snippet 'group/resource'.
- `sdk` (string): SDK language. Defaults to the `sdk` recorded in the nearest `.shipeasy` when omitted.

### `docs_skill` (~105 tokens)

Fetch an SDK's installable LLM skill. Fetch the SDK's `skill/SKILL.md` (frontmatter intact) so an agent can install it verbatim. The CLI `--install` writes it locally (a consumer fs side-effect).

Input parameters:

- `install` (boolean): CLI only: write the skill to the local agent skills dir.
- `sdk` (string): SDK language. Defaults to the `sdk` recorded in the nearest `.shipeasy` when omitted.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/ai-shipeasy-mcp/shipeasy-mcp#diagnostics

## Score history

- 2026-08-03: 79
- 2026-08-02: 81
- 2026-08-01: 37
- 2026-07-31: 37
- 2026-07-30: 39
- 2026-07-28: 73
- 2026-07-27: 6

## Links

- npm package: https://www.npmjs.com/package/@shipeasy/mcp
- Socket report: https://socket.dev/npm/package/@shipeasy/mcp
- Repository: https://github.com/shipeasy-ai/shipeasy
- Website: https://docs.shipeasy.ai/get-started/mcp?utm_source=mcp-registry&utm_medium=referral&utm_campaign=mcp-server-listing
- Changelog RSS feed: https://verifymcp.io/servers/ai-shipeasy-mcp/shipeasy-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/ai-shipeasy-mcp/shipeasy-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/ai-shipeasy-mcp/shipeasy-mcp
