Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, email [email protected] and we’ll put it right.

ai.shipeasy/mcp

NPM · @SHIPEASY/MCP · SCANNED AUG 3

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

Available components

+73 this week 79 Trust /100
Trust breakdown (6 categories)

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. How we score →

Supply Chain Security88
  • No malware found by supply-chain analysis.Pass
  • Only part of the dependency tree could be resolved (97 of 101), so this covers what we could see, not the whole tree.Partial
  • No install/post-install scripts declared.Pass
  • Only part of the dependency tree could be resolved (97 of 101), so this covers what we could see, not the whole tree. View diagnostics → Partial
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to shipeasy-ai/shipeasy). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 6 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability72
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • 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. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management26
  • Stability check failed: the tool surface changed between 2.5.0 and 2.8.0: 0 tool removals, 1 breaking changes, 0 additions. See how to fix → Fail
Tool Coverage98
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 95% of tool parameters carry a description.Partial
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.

npm · @shipeasy/mcp

# add to Claude Code
claude mcp add ai-shipeasy-mcp -- npx -y @shipeasy/mcp
# add to Codex CLI
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
    }
  }
}
# add to OpenClaw
openclaw mcp add ai-shipeasy-mcp --command npx --arg -y --arg @shipeasy/mcp
# ~/.hermes/config.yaml
mcp_servers:
  ai-shipeasy-mcp:
    command: "npx"
    args: ["-y", "@shipeasy/mcp"]
// mcp.json
{
  "mcpServers": {
    "ai-shipeasy-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@shipeasy/mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 3 Aug 26 −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.

  • 2 Aug 26 +44
    • Known CVEs: unverified → partial security
    • Provenance: unverified → pass security
    • Install scripts: unverified → pass security
    • Malware scan: unverified → pass security
    • The attested source repository moved: shipeasy-ai/shipeasy security
    • Maintenance: unverified → pass functional
    • Dependency health: unverified → partial functional
    • License: unverified → pass functional
    • Licence: MIT functional
  • 31 Jul 26 −2
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 30 Jul 26 −34
    • Install scripts: pass → unverified security
    • Provenance: pass → unverified security
    • Known CVEs: partial → unverified security
    • The attested source repository moved: shipeasy-ai/shipeasy security
    • License: pass → unverified functional
    • Dependency health: partial → unverified functional
    • Maintenance: pass → unverified functional
    • Licence: MIT functional
  • 28 Jul 26 +67
    • Known CVEs: unverified → partial security
    • Provenance: unverified → pass security
    • Install scripts: unverified → pass security
    • The attested source repository moved: shipeasy-ai/shipeasy security
    • Tool coverage: unverified → 100 functional
    • License: unverified → pass functional
    • Maintenance: unverified → pass functional
    • Dependency health: unverified → partial functional
    • 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 functional
  • 27 Jul 26 6

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 3 Aug 2026 · Analysed npm/@shipeasy/[email protected]

Provenance verified

Ecosystem: npm · Outcome: verified

Reason: verified

Source repo:
shipeasy-ai/shipeasy
Certificate issuer:
https://token.actions.githubusercontent.com
Certificate SAN:
https://github.com/shipeasy-ai/shipeasy/.github/workflows/publish-mcp.yml@refs/heads/main
Rekor log index:
2261052342
Predicate type:
https://slsa.dev/provenance/v1
Subject digest:
sha512:0fa95a914595dbb959af7a7eb4185bcda3d04cac56c8c47b8df9665356898cd2add7341ba0e3f62d879d805c3615304af9a5ee6cb84e0929620ac1f97
Discovery method:
attestation_endpoint
Dependencies 97 packages

97 packages in the resolved dependency tree · 94 deprecated · 29 stale.

The dependency tree was only partially resolved, so these counts may be incomplete.

MCP tools — 115 exposed · ~22,388 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.

Tool Tokens
ops_investigations_create ~492

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…

NameTypeReqDescription
agentstringThe agent type producing the record — pass your own type when you are a coding agent.
completedAtstringISO-8601 timestamp the work finished.
confidencestringSelf-reported confidence in the record.
connectorIdstringThe trigger-connector row id the agent ran through.
durationMsintegerRun duration in milliseconds.
findingsstringThe full findings write-up (markdown).
handlestringyesA 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…
kindstringyesWhich lifecycle stage the record documents.
listTokenstringREQUIRED. 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.…
modelstringThe model the agent ran on.
prNumberintegerA PR the record references.
prUrlstringHTML URL of that PR.
qaNotesstringHow to verify the fix — QA notes (markdown).
questionstringA blocking question for the team (markdown).
sessionIdstringThe agent-run session id, so the dashboard can deep-link to the run.
sourcesarrayThe files/links inspected.
startedAtstringISO-8601 timestamp the work started.
summarystringOne-line summary of the record.
tokensUsedintegerTokens the run consumed.
visibilitystringRecord visibility. Defaults to `published`; `draft` keeps it out of the panel.

No output schema declared.

No examples provided.

ops_investigations_list ~133

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).

NameTypeReqDescription
handlestringyesA 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…

No output schema declared.

No examples provided.

ops_investigations_update ~479

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…

NameTypeReqDescription
completedAtstringISO-8601 timestamp the work finished. Set it (or flip `kind` off `working`) to mark a run record done.
confidencestringSelf-reported confidence in the record.
durationMsintegerRun duration in milliseconds.
findingsstringThe full findings write-up (markdown).
handlestringyesA 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…
investigationIdstringyesA 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…
kindstringReclassify the record's lifecycle stage (e.g. flip a `working` run into `investigated` once findings land).
modelstringThe model the agent ran on.
prNumberintegerA PR the record references.
prUrlstringHTML URL of that PR.
qaNotesstringHow to verify the fix — QA notes (markdown).
questionstringA blocking question for the team (markdown).
sessionIdstringThe agent-run session id, so the dashboard can deep-link to the run.
sourcesarrayThe files/links inspected.
summarystringOne-line summary of the record.
tokensUsedintegerTokens the run consumed.
visibilitystringRecord visibility. `draft` keeps it out of the panel; `published` surfaces it.

No output schema declared.

No examples provided.

ops_link_pr ~150

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

NameTypeReqDescription
handlestringyesA 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…
prNumberyesPR number to record on the item. `null` unlinks the PR.
prUrlstringExplicit PR URL. Required for error/alert tickets (no GitHub issue to derive the URL from).

No output schema declared.

No examples provided.

ops_list ~238

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…

NameTypeReqDescription
limitintegerMax items to return (1–500).
ownerstringNarrow 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…
statusFilter 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.
typeFilter by item type (`bug`/`feature_request`/`error`/`alert`), or `all`.

No output schema declared.

No examples provided.

ops_notify ~221

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.

NameTypeReqDescription
dedupeKeystringStable per-escalation key (e.g. `feedback:7`) so re-runs dedupe to one row.
hrefDashboard-relative deep link to the related item. `null` is accepted and treated as "no link".
stepsarrayOrdered 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…
summarystringyesOne sentence: why it can't be fixed in code. Renders markdown.
titlestringyesOne-line headline of what's blocked.

No output schema declared.

No examples provided.

ops_trigger_create_claude ~209

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…

NameTypeReqDescription
configobjectyesNon-secret config for a Claude trigger.
enabledbooleanWhether the trigger is active on create.
eventsarrayEvents that auto-fire the routine. Defaults to empty so the trigger does not auto-fire paid runs until events are subscribed.
namestringHuman-readable connector label.
tokenstringThe 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…

No output schema declared.

No examples provided.

ops_trigger_create_copilot ~192

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…

NameTypeReqDescription
configobjectyesNon-secret config for a Copilot trigger.
enabledbooleanWhether the trigger is active on create.
eventsarrayEvents that auto-fire a Copilot agent task. Defaults to empty.
namestringHuman-readable connector label.
tokenstringyesCopilot-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.

No output schema declared.

No examples provided.

ops_trigger_create_cursor ~219

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…

NameTypeReqDescription
apiKeystringyesCursor API key that launches the run (secret). Encrypted into the credentials cipher; never returned.
configobjectyesNon-secret config for a Cursor trigger.
enabledbooleanWhether the trigger is active on create.
eventsarrayEvents that auto-fire a cold cloud-agent run. Defaults to empty.
namestringHuman-readable connector label.
opsKeystringyesRestricted Shipeasy ops key, injected into the run as `SHIPEASY_CLI_TOKEN` via the launch envVars (secret). Encrypted; never returned.

No output schema declared.

No examples provided.

ops_trigger_create_jules ~205

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…

NameTypeReqDescription
apiKeystringyesJules API key that launches the session (secret). Encrypted into the credentials cipher; never returned.
configobjectyesNon-secret config for a Jules trigger.
enabledbooleanWhether the trigger is active on create.
eventsarrayEvents that auto-fire a Jules session. Defaults to empty.
namestringHuman-readable connector label.
opsKeystringyesRestricted Shipeasy ops key, embedded in the prompt (Jules exposes no env channel) (secret). Encrypted; never returned.

No output schema declared.

No examples provided.

ops_update ~622

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…

NameTypeReqDescription
actualResultstringUpdated actual result.
descriptionstringUpdated description.
expectedResultstringUpdated expected result.
githubPrNumberLink (or, when `null`, unlink) a GitHub pull request to this bug.
handlestringyesA 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…
notifyWhere this item's completion notification lands, or `null`.
priorityTriage priority, or `null` when not set (in an update, `null` clears it).
statusstringLifecycle 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…
stepsToReproducestringUpdated reproduction steps.
titlestringNew bug title (no leading/trailing whitespace).
useCasestringUpdated use case.

No output schema declared.

No examples provided.

projects_current ~57

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`.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

projects_update ~881

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.

NameTypeReqDescription
autoRollbackbooleanWhether a failing guardrail auto-rolls back the experiment.
ciConfidencenumberConfidence level for the interval surfaced on results (any value in [0.5, 0.999], e.g. 0.90, 0.95, 0.975, 0.99).
cupedBaselineDaysintegerCUPED baseline window — days of pre-experiment history, frozen at start.
cupedMinBaselineUsersintegerCUPED — minimum users with a baseline before it runs at all.
cupedMinOverlapnumberCUPED selection-bias guard — min share of users with a baseline, else skip.
defaultAllocationPctintegerDefault traffic allocation (basis points, 1000 = 10%) new experiments start with; overridable per experiment.
defaultEnvstringDefault environment new resources are scoped to.
defaultHoldoutintegerDefault holdout carve-out (basis points) that seeds each new universe's holdout (0 = none).
defaultMeiDefault minimum effect of interest (relative, 0–1) new metrics start with; overridable per metric and per experiment. Null clears it.
defaultPowernumberTarget statistical power (1−β) feeding the realized-MDE calculation.
defaultWinsorizePctintegerDefault winsorization percentile new metrics start with; overridable per metric.
domainstringLowercase 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…
idstringyesA 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…
minRuntimeDaysintegerMinimum days an experiment must run before a verdict (peeking guard).
minSampleDaysintegerMinimum number of days an experiment must run before it can be called.
minSampleSizeintegerVerdict power guard — minimum users per arm before a ship/hold verdict.
moduleConfigsbooleanEnable/disable the dynamic-configs module.
moduleEventsbooleanEnable/disable the events module.
moduleExperimentsbooleanEnable/disable the experiments module.
moduleFeedbackbooleanEnable/disable the feedback/ops module.
moduleGatesbooleanEnable/disable the feature-gates module.
moduleTranslationsbooleanEnable/disable the i18n/translations module.
moduleUserbooleanEnable/disable the user-management module.
msprtTauMeiFactornumbermSPRT prior width — τ = minimum effect of interest × this factor.
msprtTauSdFactornumbermSPRT fallback prior width — τ = this × control SD when no MEI is set.
namestringNew project name.
sigThresholdstringSignificance threshold (alpha) for experiment analysis.
slugstringURL-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.
srmThresholdnumberSRM chi-square p-value below which the run is called invalid.
statMethodstringStatistical method the experiment analyzer uses.
timezonestringIANA timezone the project's daily analysis runs in.

No output schema declared.

No examples provided.

projects_upsert ~177

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.

NameTypeReqDescription
bindbooleanWrite .shipeasy after upsert. Default true. Set false to skip binding.
domainstringyesHostname-like identifier for the project (e.g. shouks.app, acme.com). Primary key for upsert.
namestringHuman-readable project name. Defaults to the domain on first create; ignored on later upserts.
pathstringDirectory to write .shipeasy in. Defaults to the MCP server's cwd.

No output schema declared.

No examples provided.

release_configs_archive ~93

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

NameTypeReqDescription
idstringyesA 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…

No output schema declared.

No examples provided.

release_configs_create ~404

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.

NameTypeReqDescription
descriptionstringOptional free-form description shown in the dashboard. Max 512 chars.
devobjectSeed the **dev** env's initial value (version 1), overriding `value` for dev. Published immediately. Must match `schema`.
folderOptional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
listTokenstringREQUIRED. 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…
namestringyesStable config/killswitch key in `folder.name` form (two lowercase segments separated by a dot, e.g. `pricing.tiers`). Immutable after create.
prodobjectSeed the **prod** env's initial value (version 1), overriding `value` for prod. Published immediately. Must match `schema`.
schemaobjectyesJSON 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.
stagingobjectSeed the **staging** env's initial value (version 1), overriding `value` for staging. Published immediately. Must match `schema`.
valueobjectInitial 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.

No output schema declared.

No examples provided.

release_configs_get ~104

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.

NameTypeReqDescription
idstringyesA 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…

No output schema declared.

No examples provided.

release_configs_list ~133

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.

NameTypeReqDescription
cursorstringOpaque cursor returned in the previous page's `next_cursor`. Omit for the first page.
limitintegerPage size (1–500). Defaults to 100.
qstringCase-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.

No output schema declared.

No examples provided.

release_configs_update ~371

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…

NameTypeReqDescription
devobjectPublish a new version to the **dev** env only, immediately (no draft). Overrides `value` for dev. Must match the effective schema.
folderOptional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
idstringyesA 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…
prodobjectPublish a new version to the **prod** env only, immediately (no draft). Overrides `value` for prod. Must match the effective schema.
schemaobjectReplacement schema. When supplied, the new schema is validated against every published value before it lands.
stagingobjectPublish a new version to the **staging** env only, immediately (no draft). Overrides `value` for staging. Must match the effective schema.
valueobjectFlat 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.

No output schema declared.

No examples provided.

release_configs_update_schema ~143

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.

NameTypeReqDescription
idstringyesA 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…
schemaobjectyesReplacement JSON Schema (draft 2020-12). Validated against every published value before it lands.

No output schema declared.

No examples provided.

release_experiments_archive ~107

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

NameTypeReqDescription
idstringyesA 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…

No output schema declared.

No examples provided.

release_experiments_create ~887

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

NameTypeReqDescription
allocation_pctintegerShare 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_percentnumberAllocation 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.
audienceAudience label shown in the editor. Display-only.
bucket_by
descriptionFree-form description. Max 2000 chars, markdown rendered in the dashboard.
folderOptional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
goal_metricobjectInline metric — a DSL `query`, or an `event` (+ `aggregation`/`value`) the server compiles into one.
groupsarrayyesTwo 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_metricsarrayUp to 10 guardrail metrics defined inline. Each is upserted (event + metric) and attached with role=guardrail.
holdout_gateOptional 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…
hypothesisHypothesis statement shown in the editor. Display-only.
listTokenstringREQUIRED. 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_daysintegerMinimum days the experiment must run before results are considered conclusive.
min_sample_sizeintegerMinimum exposures per group before results are considered conclusive.
namestringyesStable 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_emailOwner email. Display-only.
paramsobject**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_headroomintegerBasis 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…
saltstringHash salt for bucketing. Auto-generated if omitted. Immutable while running.
sequential_testingbooleanEnable sequential testing (always-valid p-values). Requires Premium plan or higher.
significance_thresholdnumberp-value cutoff used by the analysis pass. Defaults to `0.05`. Values other than 0.05 require Pro plan or higher.
tagShort tag chip rendered next to the name. Display-only.
targeting_gateOptional gate name (a `targeting`-type flag). Only callers that pass the gate are enrolled in the experiment.
universestringyesName of an existing universe in the project. Returns `422` if the universe doesn't exist.

No output schema declared.

No examples provided.

release_experiments_get ~96

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

NameTypeReqDescription
idstringyesA 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…

No output schema declared.

No examples provided.

release_experiments_list ~171

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

NameTypeReqDescription
cursorstringOpaque cursor returned in the previous page's `next_cursor`. Omit for the first page.
limitintegerPage size (1–500). Defaults to 100.
qstringCase-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.
statusstringFilter by lifecycle status. Pass `archived` to return the archive tab; any other value (or omitting it) returns the non-archived experiments.

No output schema declared.

No examples provided.

release_experiments_readout_create ~256

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" …

NameTypeReqDescription
acknowledgedCaveatIdsarrayIds of the open caveats the caller ticked (decision-gating acknowledgment). Unlisted caveats are stored as unacknowledged.
idstringyesA 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…
kindstringyesWhy the snapshot is being minted — `manual` ("Share readout"), or automatically on `ship` / `stop`.
requireAllAcknowledgedbooleanWhen `true`, refuse (`422`) to mint while any open caveat is not listed in `acknowledgedCaveatIds` — server-side ship gating.

No output schema declared.

No examples provided.

release_experiments_readout_get ~203

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.

NameTypeReqDescription
idstringyesA 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…
readoutIdstringyesA 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…

No output schema declared.

No examples provided.

release_experiments_reanalyze ~115

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.

NameTypeReqDescription
idstringyesA 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…

No output schema declared.

No examples provided.

release_experiments_restore ~92

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

NameTypeReqDescription
idstringyesA 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…

No output schema declared.

No examples provided.

release_experiments_results ~119

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.

NameTypeReqDescription
idstringyesA 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…

No output schema declared.

No examples provided.

release_experiments_set_metrics ~132

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

NameTypeReqDescription
idstringyesA 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…
metricsarrayyesReplacement metrics list — replaces the current attachments wholesale.

No output schema declared.

No examples provided.

release_experiments_start ~92

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

NameTypeReqDescription
idstringyesA 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…

No output schema declared.

No examples provided.

release_experiments_stop ~89

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

NameTypeReqDescription
idstringyesA 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…

No output schema declared.

No examples provided.

release_experiments_timeseries ~126

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.

NameTypeReqDescription
idstringyesA 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…
metricstringOptional metric name to filter the series.

No output schema declared.

No examples provided.

release_experiments_universes_archive ~109

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

NameTypeReqDescription
idstringyesA 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…

No output schema declared.

No examples provided.

release_experiments_universes_create ~395

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).

NameTypeReqDescription
descriptionHuman-readable blurb shown in the universe picker/hovercard.
folderOptional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
holdout_rangeInclusive `[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…
listTokenstringREQUIRED. 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…
namestringyesStable universe key. Single segment or `folder.name`. Lowercase letters, digits, `_` or `-`; max 128 chars. Immutable after create.
param_schemaThe 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_headroomintegerBasis 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_typestringUnit of randomisation. Typically `user_id`. Use `account_id` to keep whole accounts in the same group across an experiment.

No output schema declared.

No examples provided.

release_experiments_universes_list ~142

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.

NameTypeReqDescription
cursorstringOpaque cursor returned in the previous page's `next_cursor`. Omit for the first page.
limitintegerPage size (1–500). Defaults to 100.
qstringCase-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.

No output schema declared.

No examples provided.

release_experiments_universes_update ~279

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

NameTypeReqDescription
descriptionHuman-readable blurb shown in the universe picker/hovercard.
folderOptional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
holdout_rangeInclusive `[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…
idstringyesA 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_schemaReplace the universe config schema. Additive changes + default edits are always allowed; removing a param a running experiment overrides is rejected (deprecate-only).
recommended_headroomintegerBasis points of reserved headroom seeded into new experiments in this universe.

No output schema declared.

No examples provided.

release_experiments_update ~640

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

NameTypeReqDescription
allocation_pctintegerBasis-points allocation (0–10000). Use `allocation_percent` (0–100) for percent. Immutable while the experiment is running.
allocation_percentnumberAllocation 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
folderOptional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
goal_metricobjectInline metric — a DSL `query`, or an `event` (+ `aggregation`/`value`) the server compiles into one.
groupsarrayReplacement 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_metricsarrayReplaces the guardrail set wholesale (event auto-upserted per entry).
holdout_gatePer-experiment holdout gate — the name of a `holdout`-type flag, or `null` to clear. A caller the flag passes is held out.
hypothesis
idstringyesA 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_daysinteger
min_sample_sizeinteger
namestringStable 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
paramsobject**Deprecated** — the universe owns the config schema (`param_schema`). Retained for back-compat. Map of param-name → scalar type.
reserved_headroomintegerBasis 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…
saltstringHash salt. Immutable while running.
sequential_testingboolean
significance_thresholdnumber
tag
targeting_gate
universestringNew universe name. Immutable while running. Returns `422` if the universe doesn't exist.

No output schema declared.

No examples provided.

release_flags_activity ~140

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).

NameTypeReqDescription
idstringyesA 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…
limitintegerMax rows to return (1–100). Defaults to 20.

No output schema declared.

No examples provided.

release_flags_archive ~108

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.

NameTypeReqDescription
idstringyesA 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…

No output schema declared.

No examples provided.

release_flags_attributes_archive ~90

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

NameTypeReqDescription
idstringyesA 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…

No output schema declared.

No examples provided.

release_flags_attributes_create ~235

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

NameTypeReqDescription
descriptionstringOptional human note shown in the dashboard.
enum_valuesAllowed values when `type` is `enum` (required in that case — 422 otherwise); `null` for non-enum types.
listTokenstringREQUIRED. 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…
namestringyesAttribute key (lowercase alphanumeric start, then letters/digits/`_`/`-`; max 64 chars). Immutable after create.
requiredbooleanWhether the attribute must be present on the evaluation context.
sdk_pathstringOptional dotted path the SDK reads the value from.
typestringyesDeclared value type of a targeting attribute.

No output schema declared.

No examples provided.

release_flags_attributes_get ~87

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

NameTypeReqDescription
idstringyesA 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…

No output schema declared.

No examples provided.

release_flags_attributes_list ~92

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.

NameTypeReqDescription
qstringCase-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.

No output schema declared.

No examples provided.

release_flags_attributes_update ~189

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

NameTypeReqDescription
descriptionstringOptional human note shown in the dashboard.
enum_valuesReplacement allowed values (for `enum`), or `null` to clear.
idstringyesA 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…
requiredbooleanWhether the attribute must be present on the evaluation context.
sdk_pathstringOptional dotted path the SDK reads the value from.
typestringDeclared value type of a targeting attribute.

No output schema declared.

No examples provided.

release_flags_create ~688

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

NameTypeReqDescription
descriptionstringLong-form description / runbook. Markdown is rendered in the dashboard.
enabledbooleanMaster 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.
folderOptional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
groupstringGroup label for dashboard organisation (e.g. team or product area).
listTokenstringREQUIRED. 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…
namestringyesStable 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_emailstringOwner contact. Displayed verbatim; not used for auth.
rollout_pctintegerInitial 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_percentnumberInitial 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…
rulesarrayTargeting predicates. AND-combined. If non-empty, the gate returns `true` only for callers that satisfy every rule **and** fall under `rollout_pct`.
saltstringHash 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…
stackOptional gatekeeper stack. When provided, takes precedence over `rules` + `rollout_pct` at evaluation time. Omit (or pass `null`) for a flat gate.
titlestringHuman-readable title shown in the dashboard. Free-form, no key format constraint.
typestringGate 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…

No output schema declared.

No examples provided.

release_flags_disable ~114

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.

NameTypeReqDescription
idstringyesA 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…

No output schema declared.

No examples provided.

release_flags_enable ~94

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

NameTypeReqDescription
idstringyesA 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…

No output schema declared.

No examples provided.

release_flags_get ~116

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`.

NameTypeReqDescription
idstringyesA 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…

No output schema declared.

No examples provided.

release_flags_list ~127

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

NameTypeReqDescription
cursorstringOpaque cursor returned in the previous page's `next_cursor`. Omit for the first page.
limitintegerPage size (1–500). Defaults to 100.
qstringCase-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.

No output schema declared.

No examples provided.