ai.shipeasy/mcp
NPM · @SHIPEASY/MCP · 2 COMPONENTS
Feature flags, A/B experiments, kill switches, dynamic config & i18n — Shipeasy MCP server.
Available components
Last scanned (12 hours ago)
Scores higher than 97% of npm servers
Category Developer Tools
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 → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 30 of 95 dependencies flagged as unhealthy. 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 0 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability75
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 41944 tokens (~233/item across 180 items; 180 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 Management100
- Stability check failed: the tool surface changed between 2.8.0 and 2.16.0: 0 tool removals, 1 breaking changes, 65 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
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 17 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 180 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
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.
- 5 Nov 26 0
- Schema quality: 32639 → 41944 ▼ functional
- Package version: 2.15.0 → 2.16.0 functional
- 3 Nov 26 0
- Package version: 2.14.0 → 2.15.0 functional
- 1 Nov 26 +25
- Malware scan: unverified → pass ▲ security
- Known CVEs: unverified → pass ▲ security
- Dependency health: unverified → 0.86 ▲ functional
- Package version: 2.13.0 → 2.14.0 functional
- 31 Oct 26 −25
- Known CVEs: pass → unverified ▼ security
- Malware scan: pass → unverified ▼ security
- Schema quality: 28716 → 31766 ▼ functional
- Dependency health: 0.86 → unverified ▼ functional
- Package version: 2.10.0 → 2.13.0 functional
- Package version: 2.10.0 → 2.12.1 functional
- Package version: 2.10.0 → 2.12.0 functional
- 29 Oct 26 0
- Package version: 2.9.0 → 2.10.0 functional
- 27 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 26 Oct 26 −16
- Malware scan: pass → unverified ▼ security
- Stability: pass → fail ▼ security
- Schema quality: 194 → 219 ▼ functional
- Package version: 2.8.0 → 2.9.0 functional
- 21 Oct 26 +1
- Stability: 0.97 → pass security
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 5 Nov 2026 · Analysed npm/@shipeasy/mcp@2.16.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| 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 | 3692077079 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha512:c36cf6859854f870be363435a95b68c6d35240e2de58a1b8a5964cb153e7cc7a120d77001328ef46020b4d8be7035fa1b0d36c81b493fe0d0112b13e0 |
Background: How many MCP packages publish verified provenance →
Dependencies 95 packages
| Packages resolved | 95 |
|---|---|
| Stale | 30 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
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. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
api_keys_create ~373
Create an API key. Mints a new API key and returns the plaintext token **once** — it is stored hashed and can never be retrieved again, so capture it on creation.
| Name | Type | Req | Description |
|---|---|---|---|
| env | string | yes | Environment to bind the key to. Always required. For `server`/`client` keys it is the isolation boundary the worker reads from; `admin`/`ops` keys are env-agnostic and pinned to `prod` by the handler… |
| expiresInDays | – | – | Days until the key expires (1–3650), or `null`/omitted for a key that never expires. Ignored for `admin` keys (fixed 90-day expiry) and `ops` keys (short sliding window). |
| name | string | – | Optional human label. Programmatic (API) mints that omit it get an auto-generated descriptive name; dashboard mints may leave it blank. The cap is generous because provenance labels are composed, not… |
| scopes | array | – | Optional permission strings recorded on the key. `tickets:public_create` is enforced: a client key needs it (plus the project's `allowPublicTickets` setting) to file a `pending_approval` bug via the… |
| type | string | yes | Key kind to mint. `server` (back-end), `client` (public, browser), `admin` (CLI/devtools token), `ops` (restricted unattended-trigger credential). `admin`/`ops` keys don't count toward the plan key l… |
No output schema declared.
No examples provided.
auth_check ~37
Report whether ~/.config/shipeasy/config.json holds a valid CLI token. Returns { authenticated, project_id, base_url, user_email }.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
auth_login ~45
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
auth_logout ~179
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.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Must be true. Acknowledges that this deletes the machine-wide session and that only a human at a terminal can restore it. |
No output schema declared.
No examples provided.
docs_get ~126
Fetch one SDK doc page or snippet. Fetch one feature page (`flags`, `experiments`, …) or nested snippet (`release/experiments`, …), substituting declared {{placeholders}} from caller args.
| Name | Type | Req | Description |
|---|---|---|---|
| framework | string | – | Framework hint (substitutes {{FRAMEWORK}}). |
| name | string | – | Resource name (substitutes {{RESOURCE_NAME}}). |
| path | string | yes | Page key or snippet 'group/resource'. |
| sdk | string | – | SDK language. Defaults to the `sdk` recorded in the nearest `.shipeasy` when omitted. |
No output schema declared.
No examples provided.
docs_list ~79
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.
| Name | Type | Req | Description |
|---|---|---|---|
| sdk | string | – | SDK language. Defaults to the `sdk` recorded in the nearest `.shipeasy` when omitted. |
No output schema declared.
No examples provided.
docs_skill ~105
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).
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
No output schema declared.
No examples provided.
errors_get ~138
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…
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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… |
No output schema declared.
No examples provided.
errors_list ~128
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`.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
No output schema declared.
No examples provided.
errors_resolve ~145
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…
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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… |
No output schema declared.
No examples provided.
errors_series ~218
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…
| Name | Type | Req | Description |
|---|---|---|---|
| bucket | integer | – | Bucket width in seconds (60s–86400s/1d). Defaults to `3600` (hourly). Each returned point is floor-aligned to this width. |
| from | integer | yes | Window start, epoch seconds (inclusive). |
| id | string | yes | 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 | yes | Window end, epoch seconds (exclusive). Must be greater than `from`. |
No output schema declared.
No examples provided.
i18n_drafts_create ~152
Create a translation draft. Stage a new translation draft against a target profile, optionally seeding its keys from a source profile.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | Draft name, e.g. the target locale being staged. |
| profile_id | string | yes | Profile the draft targets. |
| source_profile_id | string | – | Optional profile to seed the draft's keys from. |
No output schema declared.
No examples provided.
i18n_drafts_list ~25
List translation drafts. List staged translation drafts awaiting review/publish.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
i18n_drafts_update ~115
Update a translation draft. Transition a draft's lifecycle state (`open` / `merged` / `abandoned`).
| Name | Type | Req | Description |
|---|---|---|---|
| draftId | string | yes | 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. |
No output schema declared.
No examples provided.
i18n_keys_list ~141
List i18n keys. List keys for a profile, optionally filtered to a name `prefix`.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max keys to return (1–500). Defaults to 200. |
| 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. |
No output schema declared.
No examples provided.
i18n_keys_push ~147
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`.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | Keys to add. Insert-only by default — existing keys are reported back as `skipped` (set `force` to overwrite them instead). |
| profile_id | string | yes | Target profile id to add keys to. |
No output schema declared.
No examples provided.
i18n_keys_set ~174
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'…
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | Optional human note to store with the key. |
| key | string | yes | 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 | yes | New value for the key. Inserted when the key is new, overwritten when it exists. |
No output schema declared.
No examples provided.
i18n_keys_update ~215
Update one i18n key. Overwrite a single existing key's value — the only overwrite path.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | Optional human note to store with the key. |
| experimentId | – | – | Link this key's copy change to an experiment (id or name) so the change can be tracked against it. `null` removes the link; omit to leave the current link untouched. A data link only — it does not ch… |
| id | string | yes | 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 | yes | 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. |
No output schema declared.
No examples provided.
i18n_profiles_create ~174
Create an i18n profile. Create a locale profile. `name` is the stable handle (e.g. `fr:prod`).
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | 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… |
No output schema declared.
No examples provided.
i18n_profiles_list ~39
List i18n profiles. Returns every locale profile in the project (e.g. `en:prod`, `fr:prod`).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
i18n_profiles_publish ~123
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.
| Name | Type | Req | Description |
|---|---|---|---|
| profileId | string | yes | 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… |
No output schema declared.
No examples provided.
metrics_archive ~104
Archive a metric. Soft-deletes (archives) the metric. Returns `409` if it is attached to a running experiment — stop those experiments first.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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… |
No output schema declared.
No examples provided.
metrics_create ~752
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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). |
| display | object | – | How the metric's series is DRAWN, as opposed to what it measures. Both parts used to be DSL functions (`expected(q, seasonal)`, `forecast(q, …)`), which meant turning a band on minted a different met… |
| display_name | – | – | What a human calls the metric — "Checkout revenue" beside the `checkout.revenue` that identifies it. Unlike `name` it is free text, it is editable, and nothing addresses the metric by it: the dashboa… |
| event_name | string | yes | 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 | yes | 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 | – | A metric definition as a typed expression tree — the structured alternative to the `query` DSL string, and what the API stores. Exactly one of `query` / `query_ir` is supplied per metric body; `query… |
| unit | – | – | Display unit (e.g. `ms`, `%`, `$`), or `null` when unitless. |
| winsorize_pct | integer | – | Winsorise percentile (1–99) to clamp outliers. Defaults to 99. |
No output schema declared.
No examples provided.
metrics_events_approve ~180
Approve a pending event. Promotes a pending (auto-discovered) event to usable so metrics can query it (`pending` → `0`).
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | 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. |
No output schema declared.
No examples provided.
metrics_events_archive ~103
Archive an event. Soft-deletes (archives) the event. Returns `409` if any metric still references it — delete those metrics first.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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… |
No output schema declared.
No examples provided.
metrics_events_create ~267
Register an event. Registers a new event name and (optionally) its typed properties. Only `name` is required.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | Event name. Starts with a letter, digit, or `_`; letters, digits, `_`, `-`, `.`; max 50 characters. The cap is the Analytics Engine index budget — 96 bytes total, less a 36-byte project UUID and a se… |
| properties | array | – | Typed properties declared on the event. Defaults to an empty list. |
No output schema declared.
No examples provided.
metrics_events_get ~102
Get an event. Returns one event's full detail. Resolves by exact id, unique id-prefix, or exact (unique) name.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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… |
No output schema declared.
No examples provided.
metrics_events_list ~93
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
No output schema declared.
No examples provided.
metrics_events_update ~171
Update an event. Partial update of an event's folder, description, or properties. `name` is immutable.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | 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. |
No output schema declared.
No examples provided.
metrics_experiments ~120
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).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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… |
No output schema declared.
No examples provided.
metrics_grammar ~50
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`.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
metrics_list ~85
List metrics. Returns every metric in the project (not paginated) — name, folder, source event, the typed `queryIr`, and the rendered query.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
No output schema declared.
No examples provided.
metrics_series ~216
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…
| Name | Type | Req | Description |
|---|---|---|---|
| bucket | integer | – | Bucket width in seconds (60s–86400s/1d). Defaults to `3600` (hourly). Each returned point is floor-aligned to this width. |
| from | integer | yes | Window start, epoch seconds (inclusive). |
| id | string | yes | 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 | yes | Window end, epoch seconds (exclusive). Must be greater than `from`. |
No output schema declared.
No examples provided.
metrics_show ~96
Get a metric. Fetch one metric by its id or name, including the rendered DSL query and the typed IR.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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… |
No output schema declared.
No examples provided.
metrics_unarchive ~112
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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… |
No output schema declared.
No examples provided.
metrics_update ~739
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`.
| Name | Type | Req | Description |
|---|---|---|---|
| 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). |
| display | object | – | How the metric's series is DRAWN, as opposed to what it measures. Both parts used to be DSL functions (`expected(q, seasonal)`, `forecast(q, …)`), which meant turning a band on minted a different met… |
| display_name | – | – | What a human calls the metric — "Checkout revenue" beside the `checkout.revenue` that identifies it. Unlike `name` it is free text, it is editable, and nothing addresses the metric by it: the dashboa… |
| 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 | yes | 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 | – | A metric definition as a typed expression tree — the structured alternative to the `query` DSL string, and what the API stores. Exactly one of `query` / `query_ir` is supplied per metric body; `query… |
| unit | – | – | Display unit (e.g. `ms`, `%`, `$`), or `null` when unitless. |
| winsorize_pct | integer | – | Winsorise percentile (1–99) to clamp outliers. Defaults to 99. |
No output schema declared.
No examples provided.
ops_ack ~472
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).…
| Name | Type | Req | Description |
|---|---|---|---|
| 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 `jules`, Gemini `gemini` → norma… |
| handle | string | yes | 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… |
| launch | boolean | – | Whether an AI ack may FIRE the agent's connected trigger. Default `true`: an ack naming a connected agent, with no `sessionId`, starts a new provider run of that agent. Pass `false` to only record th… |
| runId | string | – | The run you were handed — the investigation id a fired run's prompt names, or the `runId` an earlier ack returned. Proves the open run is yours, so the ack adopts it instead of answering `409` `ALREA… |
| 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. |
| takeover | boolean | – | Replace another session's LIVE run on the item instead of being refused with `409` `ALREADY_EXISTS`. Only when you were asked to replace that session — two sessions on one item each open their own PR. |
No output schema declared.
No examples provided.
ops_activity_list ~213
List queue activity. The activity feed of the project's queue items, newest first: every status, priority, owner, tag and content change, every comment, every alert acknowledgement, and every pull-request event (`linked`, `unlinked`, `merged`, `closed` unmerged). Each entry names the item it belon…
| Name | Type | Req | Description |
|---|---|---|---|
| field | string | – | Which kind of change an activity entry records. `pr` is a pull-request event (see `pr.event`); `comment` carries an excerpt in `to`; `edit` names the edited content fields in `added`. |
| item | string | – | Narrow to one item — its per-project number (e.g. `7`) or full id. Omit for the whole project. |
| limit | integer | – | Maximum entries to return (1-200). Defaults to 100. |
| since | string | – | Only entries strictly after this ISO-8601 instant. |
| until | string | – | Only entries strictly before this ISO-8601 instant. |
No output schema declared.
No examples provided.
ops_agents_list ~56
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ops_alerts_archive ~119
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | 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… |
No output schema declared.
No examples provided.
ops_alerts_channels ~31
List Slack channels. List the project's connected Slack channels — used to resolve an alert rule's notification target.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ops_alerts_create ~1,509
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`.
| Name | Type | Req | Description |
|---|---|---|---|
| autoResolveMinutes | – | – | Close a live instance that has gone this long without a fresh verdict. A rule that cannot reach a verdict deliberately leaves its alert alone, which is right for a tick and wrong for a week. Never cl… |
| bucketMinutes | – | – | Width of the buckets the window is split into, in minutes. Omit (or `null`) to divide the window into 12 equal buckets. The rule is judged per bucket, so this is the resolution at which "sustained" i… |
| comparator | string | – | How the metric value is compared to the threshold. Read only by a `normal` rule with no range set. |
| composite | object | – | What a `composite` rule is a boolean over. `rules` are sibling alert-rule ids in the same project and `op` is how their states combine. A child's state is what the current pass concluded about it, fa… |
| delayMinutes | – | – | Hold the evaluated window back this far behind live, on top of the reader's own settle grace. For a metric assembled from a source that lands in batches, whose trailing buckets are legitimately incom… |
| direction | – | – | Which side of the baseline an `anomaly` or `outliers` rule watches. Omit (or `null`) for either, which is what "is this unusual" means; name a side for a metric that is only bad in one direction. |
| enabled | boolean | – | Whether the rule is evaluated by the cron. |
| groupAlerts | boolean | – | Fire one alert per `by()` group instead of one for the whole metric. The firing key becomes (rule, group), so each group raises, dedupes and recovers on its own. Refused on a metric with no `by()`, a… |
| kind | string | – | What the rule watches for. `normal` compares the metric's own value — against `threshold` via `comparator`, or against the [`rangeMin`, `rangeMax`] corridor it must stay inside. `anomaly` compares it… |
| 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… |
| maxGroups | – | – | How many groups this rule may alert on at once. Omit (or `null`) for 10. Past the cap the worst groups fire and the count of the rest is stated on each ticket — a group set is customer data, and an u… |
| metricId | string | yes | Id of the metric to evaluate. |
| name | string | yes | Human label for the rule, shown on the alert and the rules list. |
| noDataMinutes | – | – | For a `no_data` rule: how long the silence must last. Omit (or `null`) for 15 minutes. Five is the floor — below it, ordinary ingest lag empties the trailing bucket and reads as an outage. |
| notify | – | – | Delivery target for a rule's alert; `null` = use the project default. The `NotificationTarget` shape plus the in-app switch. |
| rangeMax | – | – | Upper edge of the corridor the metric must stay inside. |
| rangeMin | – | – | Lower edge of the corridor the metric must stay inside. Setting either bound switches a `normal` rule off `comparator`/`threshold` and onto the range, which breaches on LEAVING it in either direction… |
| recoveryThreshold | – | – | What the metric must get back to before a live alert closes. Without it a metric sitting on its threshold pages and clears once per tick. Must be on the safe side of the firing level, or equal to it.… |
| requiredBuckets | – | – | How many buckets must breach before the rule fires. Omit (or `null`) to require every bucket that had data. Buckets with nothing in them are excluded before this is counted, so on a sparse metric `nu… |
| severity | string | – | Severity of the raised alert. A `warnThreshold` breach opens one step quieter than this. |
| sigma | – | – | How far from normal is too far, for `anomaly` and `outliers`, in sigma-equivalents. Omit (or `null`) for 3, which is also the half-width of the band a chart draws — so an unconfigured rule fires exac… |
| sustained | boolean | – | Judge the window by ACCUMULATED departure instead of bucket by bucket. The ordinary check asks every bucket to be past `sigma`, which a slow regression never manages: a metric running 1.5σ worse than… |
| threshold | number | – | Threshold the metric value is compared against. Required for a `normal` rule unless a range is given; ignored by every other kind. |
| warnThreshold | – | – | The milder bound — a second level, in the same unit the kind judges in, that raises a quieter alert before the firing level is reached. Must be strictly milder than the level the rule fires at, or it… |
| windowHours | integer | – | Lookback window (hours) the metric is aggregated over. 1–720. |
No output schema declared.
No examples provided.
ops_alerts_list ~113
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
No output schema declared.
No examples provided.
ops_alerts_update ~684
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).
| Name | Type | Req | Description |
|---|---|---|---|
| autoResolveMinutes | – | – | Close a stale live instance after this long; `null` never auto-resolves. |
| bucketMinutes | – | – | Bucket width in minutes; `null` restores the default 12 buckets per window. |
| comparator | string | – | – |
| composite | object | – | What a `composite` rule is a boolean over. `rules` are sibling alert-rule ids in the same project and `op` is how their states combine. A child's state is what the current pass concluded about it, fa… |
| delayMinutes | – | – | How far behind live the window is held; `null` drops the delay. |
| direction | – | – | Which side an `anomaly` or `outliers` rule watches; `null` restores either. |
| enabled | boolean | – | – |
| groupAlerts | boolean | – | Fire one alert per `by()` group. Refused on a metric with no grouping. |
| id | string | yes | 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 | – | – |
| maxGroups | – | – | How many groups may alert at once; `null` restores the default of 10. |
| name | string | – | – |
| noDataMinutes | – | – | How long a `no_data` rule's silence must last; `null` restores 15 minutes. |
| notify | – | – | Delivery target for a rule's alert; `null` = use the project default. The `NotificationTarget` shape plus the in-app switch. |
| rangeMax | – | – | Upper edge of the corridor; `null` drops it. |
| rangeMin | – | – | Lower edge of the corridor; `null` drops it, returning the rule to comparator and threshold when both bounds are gone. |
| recoveryThreshold | – | – | What the metric must get back to before a live alert closes; `null` drops the hysteresis. |
| requiredBuckets | – | – | Buckets that must breach to fire; `null` restores "every bucket that had data". |
| severity | string | – | – |
| sigma | – | – | Sigmas an `anomaly` or `outliers` rule fires at; `null` restores the default of 3. |
| sustained | boolean | – | Judge the window by accumulated departure rather than bucket by bucket. `anomaly` and `outliers` only; refused alongside `requiredBuckets`. |
| threshold | number | – | – |
| warnThreshold | – | – | The milder bound; `null` drops the warning level, leaving the rule with one. |
| windowHours | integer | – | – |
No output schema declared.
No examples provided.
ops_attachments_create ~331
Attach a screenshot to an item. Attach a screenshot, screen recording, or file to a bug or feature request, so the fixer sees what QA saw instead of reconstructing it from measurements. Send the bytes as `contentBase64` (a bare base64 string or a `data:` URI) or give a public https `url` for the server to fe…
| Name | Type | Req | Description |
|---|---|---|---|
| contentBase64 | string | – | The file bytes, base64-encoded (a bare string or a `data:<mime>;base64,` URI). Pass this or `url`, not both. |
| filename | string | – | File name, e.g. `checkout-overflow.png`. Defaults to the last segment of `url`, else `file`. |
| handle | string | yes | 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 | – | Attachment kind. Defaults from the media type (image → screenshot, video → recording, else file). Ignored by the comment-media upload. |
| mimeType | string | – | Media type, e.g. `image/png`. Defaults from the data URI, the fetched response, or the filename extension. |
| url | string | – | A public https URL for the server to fetch the file from (no IP literals or internal hosts; max 25 MiB). Pass this or `contentBase64`, not both. |
No output schema declared.
No examples provided.
ops_bug ~554
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…
| Name | Type | Req | Description |
|---|---|---|---|
| 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`. |
| delegateConnectorId | string | – | The agent connector the filer chose to delegate this item to at creation. When set, the server launches that one agent and skips any tag-rule auto-launch, so the filer's choice prevails and only one… |
| 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 label the item with, e.g. `["ios", "checkout"]`. Each name is matched case-insensitively against the project's existing tags and reuses that tag (keeping its stored casing) when one matc… |
| title | string | yes | One-line bug title (no leading/trailing whitespace). |
| trail | string | – | File the bug on this trail (`T-12` or the trail's id) instead of the open queue. An agent that hits something outside its intent files it here rather than fixing it in place. The item records `discov… |
| userAgent | – | – | Reporter's user-agent string, or `null`. |
| viewport | – | – | Reporter's viewport (e.g. `1280x720`), or `null`. |
No output schema declared.
No examples provided.
ops_comments_create ~283
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…
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | The comment body as markdown. Mentions (`@teammate`, `@shipeasy`) are parsed from it. |
| handle | string | yes | 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). |
No output schema declared.
No examples provided.
ops_comments_list ~139
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.
| Name | Type | Req | Description |
|---|---|---|---|
| handle | string | yes | 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… |
No output schema declared.
No examples provided.
ops_comments_upload_media ~332
Upload an image to embed in a comment. Upload an image to embed in a comment on a queue item. Takes the same body as the attachment upload (`contentBase64` or `url`). The response carries a relative `url` — reference it from the comment body as a markdown image (``) in `ops comments create`, so an ev…
| Name | Type | Req | Description |
|---|---|---|---|
| contentBase64 | string | – | The file bytes, base64-encoded (a bare string or a `data:<mime>;base64,` URI). Pass this or `url`, not both. |
| filename | string | – | File name, e.g. `checkout-overflow.png`. Defaults to the last segment of `url`, else `file`. |
| handle | string | yes | 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 | – | Attachment kind. Defaults from the media type (image → screenshot, video → recording, else file). Ignored by the comment-media upload. |
| mimeType | string | – | Media type, e.g. `image/png`. Defaults from the data URI, the fetched response, or the filename extension. |
| url | string | – | A public https URL for the server to fetch the file from (no IP literals or internal hosts; max 25 MiB). Pass this or `contentBase64`, not both. |
No output schema declared.
No examples provided.
ops_create ~603
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…
| Name | Type | Req | Description |
|---|---|---|---|
| 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`. |
| delegateConnectorId | string | – | The agent connector the filer chose to delegate this item to at creation. When set, the server launches that one agent and skips any tag-rule auto-launch, so the filer's choice prevails and only one… |
| 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 label the item with, e.g. `["ios", "checkout"]`. Each name is matched case-insensitively against the project's existing tags and reuses that tag (keeping its stored casing) when one matc… |
| title | string | yes | One-line bug title (no leading/trailing whitespace). |
| trail | string | – | File the bug on this trail (`T-12` or the trail's id) instead of the open queue. An agent that hits something outside its intent files it here rather than fixing it in place. The item records `discov… |
| type | string | yes | 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`. |
No output schema declared.
No examples provided.
How do I install the ai.shipeasy/mcp server?
ai.shipeasy/mcp runs locally as an npm package, launched with npx -y @shipeasy/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @shipeasy/mcp
claude mcp add ai-shipeasy-mcp -- npx -y @shipeasy/mcp
What is the ai.shipeasy/mcp server?
ai.shipeasy/mcp is listed in the public MCP registry as ai.shipeasy/mcp. Feature flags, A/B experiments, kill switches, dynamic config & i18n, Shipeasy MCP server. This page covers its npm package (@shipeasy/mcp).
Is the ai.shipeasy/mcp server safe to use?
ai.shipeasy/mcp scores 94 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the ai.shipeasy/mcp server expose?
ai.shipeasy/mcp exposes 180 tools: projects_upsert, auth_check, auth_login, auth_logout, api_keys_create, and 175 more. Their descriptions and schemas cost roughly 41,944 tokens of context every time the server is loaded.
Is the ai.shipeasy/mcp server still maintained?
ai.shipeasy/mcp is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the ai.shipeasy/mcp server under?
ai.shipeasy/mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.