# EchoRelay MCP server

Manage EchoRelay relay projects from any MCP client: lines, endpoints, keys, billing, logs, DLQ.

## Links
- Registry page: https://www.getdrio.com/mcp/dev-echorelay-management

## Install
- Endpoint: https://mcp.echorelay.dev
- Auth: Auth required by registry metadata

## Setup notes
- Remote header: Authorization (required; secret)
- The upstream registry signals required auth or secrets.
- Remote endpoint: https://mcp.echorelay.dev
- Header: Authorization

## Tools
- get_project - Get the EchoRelay project this token is scoped to: id, slug, name, caller-facing API base URL, whether the token has edit access, and the request-log hot-tier retention window. Endpoint: https://mcp.echorelay.dev
- list_lines - List the project's versioned API lines (e.g. v1, v2), each with its endpoint count. Endpoint: https://mcp.echorelay.dev
- list_endpoints - List the endpoints under one line of the project. Endpoint: https://mcp.echorelay.dev
- get_endpoint - Get the full JSON of one endpoint, including its targets, auth keys and attributes. Endpoint: https://mcp.echorelay.dev
- get_config - Get the project's published relay configuration — the exact JSON the EchoRelay Framework consumes. Includes pendingPublish with its frozen, redacted config when one is scheduled. Endpoint: https://mcp.echorelay.dev
- config_diff - Preview what Save & Publish (or the pending scheduled publish, if one exists) would change: added/removed/changed lines, and within each changed line the added/removed/changed endpoints and targets, plus any project-level setting change. Outbound auth secrets are redacted the same as get_config. Endpoint: https://mcp.echorelay.dev
- list_config_revisions - List retained revisions for one line so a prior revision can be selected for rollback. Endpoint: https://mcp.echorelay.dev
- get_line_draft - Read one line draft, its optimistic revision, preview, and schedule. Endpoint: https://mcp.echorelay.dev
- preview_line_draft - Preview one line draft without publishing it. Endpoint: https://mcp.echorelay.dev
- publish_line_draft - Publish one line draft now and clear only its schedule. Endpoint: https://mcp.echorelay.dev
- discard_line_draft - Discard every unpublished change and schedule for one line. Endpoint: https://mcp.echorelay.dev
- discard_draft_endpoint - Discard one endpoint change from a line draft. Endpoint: https://mcp.echorelay.dev
- schedule_line_publish - Schedule one non-empty line draft. Active subscribers required. Endpoint: https://mcp.echorelay.dev
- cancel_line_publish - Cancel one line schedule before its two-minute lock. Endpoint: https://mcp.echorelay.dev
- rollback_config - Publish a retained line revision immediately and clear any pending schedule. Endpoint: https://mcp.echorelay.dev
- get_billing - Get the project's credit balances (paid + testing) and which ledger it settles on. `billingModel` is `prepaid` (metered against the credit balance) or `invoiceable` (an Enterprise account, settled on the contract — its credit fields read empty/zero by design, not because it is out of credits). A zero balance is not on its own a reason to stop: live traffic is never refused for an empty balance, and a free-tier project is exempt from live credit billing entirely. Only the testing pool refuses when exhausted (402 `testing_credits_exhausted`). Read this before concluding from any other field that a project cannot send. Endpoint: https://mcp.echorelay.dev
- set_burst_opt_in - Enable or disable the auto-decaying burst window for live traffic and publish the change immediately. When enabled, brief spikes a little above your steady RPM cap are absorbed at the normal credit rate (no surcharge, no burst SKU) instead of being rejected. Sustained overage decays back to your steady cap; headroom returns once traffic cools below the cap or you add RPM. Burst usage is tracked so you can see when to upgrade. Default is off (steady cap is a hard 429). Requires edit access. Endpoint: https://mcp.echorelay.dev
- set_rpm_ceiling - Set or clear a self-set ceiling on this project's own effective live-traffic RPM (Traffic shaping) — for when your origin can't take the throughput your plan grants. Never plan-gated: the ceiling can only LOWER your effective RPM below your plan/add-on rate, never raise it, and never touches billing. Steady traffic is capped at the ceiling; if Burst Protect is on, its headroom is measured above the ceiling, not above the plan rate. The current value is on get_project as `rpmCeiling` (null = no ceiling). Requires edit access. Endpoint: https://mcp.echorelay.dev
- set_outbound_allowlist - Narrow the project's outbound host allowlist — the hosts a target may point at. The current list is on get_project as `outboundHostAllowlist` (empty means any public host). This tool may only narrow it: `patterns` must be a strict subset of, or equal to, the current list, compared as exact strings — submitting a wildcard that would cover an existing exact host, or clearing to empty, is refused as a widen. Widening the list is web-only, in the panel. Refused when the project already has a target (inactive lines included) outside the submitted list. Requires edit access. Endpoint: https://mcp.echorelay.dev
- create_line - Create a new versioned line. Defaults to immediate publish; draft mode requires draftRevision 0. Requires edit access. Endpoint: https://mcp.echorelay.dev
- delete_line - Delete a line and every endpoint under it, publishing the removal immediately. Requires edit access. Endpoint: https://mcp.echorelay.dev
- activate_line - Activate and immediately publish an inactive line so it serves traffic again. Blocked at the active-line cap — deactivate another line first. Requires edit access. Endpoint: https://mcp.echorelay.dev
- deactivate_line - Take a line off the data plane immediately (callers get 404) without deleting it — endpoints/targets/config are preserved and it can be reactivated later. A deliberate action; live traffic is never auto-disabled. Requires edit access. Endpoint: https://mcp.echorelay.dev
- duplicate_line - Copy a line and all its endpoints/targets/rules into a new line key — build v2 from v1. The copy is saved inactive and remains off the data plane; edit it, then activate_line when ready. Requires edit access. Endpoint: https://mcp.echorelay.dev
- set_docs_shared - Turn the line's public OpenAPI docs on or off. When enabled, the line's spec is published at docs.{baseDomain}/{slug}/{lineKey} (and …/openapi.json); when disabled those URLs return 404. The `docsShared` field on each line read (list_lines) reflects the current state. Requires edit access. Endpoint: https://mcp.echorelay.dev
- create_endpoint - Create an endpoint under a line. Defaults to immediate publish; draft mode requires draftRevision. scheduledAt stages the line draft then schedules it. Requires edit access. Endpoint: https://mcp.echorelay.dev
- update_endpoint - Update an endpoint immediately or in its line draft. The patch is merged field-by-field. Requires edit access. Endpoint: https://mcp.echorelay.dev
- delete_endpoint - Delete an endpoint and its targets, publishing the removal immediately. Requires edit access. Endpoint: https://mcp.echorelay.dev
- default_endpoint_template - Return a canonical minimal-valid endpoint JSON for a fresh line. POST it verbatim to create_endpoint to land an immediately-working mock endpoint, then customise. Read-only. Endpoint: https://mcp.echorelay.dev
- dry_run_endpoint - Validate an endpoint document without writing it. Returns either {ok: true, resolved: <Framework config slice>} or {ok: false, errors: {...}}. Pass endpointId to dry-run a PATCH against an existing endpoint; omit it to dry-run a create. No DB write, no queue entry, no billing. Endpoint: https://mcp.echorelay.dev
- list_members - List accepted and pending members of this project. Shows name/email, role, and whether the invite has been accepted. Owner only. Endpoint: https://mcp.echorelay.dev
- invite_member - Invite a person by email to collaborate on this project. Returns the new invitation record; the invitee receives an email with an accept link. Enforces the seat cap for the plan tier. Owner only. Endpoint: https://mcp.echorelay.dev
- remove_member - Remove a member (accepted or pending) from this project by their member ID or email. Owner only. Endpoint: https://mcp.echorelay.dev
- set_member_role - Change a member's role between editor, viewer, and billing. Identify the member by their member ID or email (from list_members); the project owner's own role cannot be changed. Returns the updated member record. Owner only. Endpoint: https://mcp.echorelay.dev
- resend_invite - Re-send the invitation email for a still-pending invite, by member ID or email (from list_members). The original accept link is reused. Already-accepted members are rejected. Owner only. Endpoint: https://mcp.echorelay.dev
- list_api_keys - List the project's inbound API keys (metadata only — the secret plaintext is never returned). Endpoint: https://mcp.echorelay.dev
- create_api_key - Mint an inbound relay (data-plane) API key for callers to send traffic to this project. Its `er_live_` or `er_test_` secret authenticates relay requests; it cannot call management MCP or REST. Returns the plaintext exactly once — store it now, it cannot be retrieved later. Editor + owner; subject to the project key policy (see get_key_policy). Endpoint: https://mcp.echorelay.dev
- rotate_api_key - Mint a linked successor for an existing key. Returns the successor plaintext exactly once — store it now. The predecessor stays valid through its overlap window so callers can swap without downtime. Owner anywhere, editor on own keys. Endpoint: https://mcp.echorelay.dev
- reveal_rotation_successor - One-shot retrieval of the plaintext for a successor minted by the auto-rotation scheduler (not by rotate_api_key — that returns its own plaintext directly). Decrypts the at-rest ciphertext, returns it once, then destroys it; a second call errors. Only available while the predecessor still has an unrevealed successor. Endpoint: https://mcp.echorelay.dev
- revoke_api_key - Manual hard revoke. The key stops authenticating on the next request. Owner anywhere, editor on own keys. Endpoint: https://mcp.echorelay.dev
- get_key_policy - Returns the project's key policy: defaultKeyTtlDays, maxKeyTtlDays, editorsMayCreateNonExpiringKeys. Endpoint: https://mcp.echorelay.dev
- set_key_policy - Owner-only. Edit the project's key policy. Only fields present in the patch are touched. Editors calling this get an error — use get_key_policy to read. Endpoint: https://mcp.echorelay.dev
- list_credentials - List the project's saved credentials — reusable target-auth secrets that can be referenced from any number of targets instead of entering auth inline per target. `auth` is redacted (secret fields never returned, even encrypted — see create_credential for why). Endpoint: https://mcp.echorelay.dev
- create_credential - Save a new reusable credential, sealed with the project's encryption key at write time. Neither this call nor any later read ever returns the secret back — reference it from a target by id (see create_endpoint/update_endpoint's target.credentialVaultEntryId) instead of copying the secret around. `auth.type` selects which fields apply: bearer→token, basic→username+password, apiKeyHeader→headerName+key, apiKeyQuery→paramName+key, publicPrivateKey→secret+key. `destinationHost` is required and permanent: the credential is only ever sent to that host, over https, and no later call can re-aim it. Endpoint: https://mcp.echorelay.dev
- update_credential - Rename a credential and/or rotate its secret, publishing the change immediately so every target that uses this credential picks it up right away. Omit a secret field (or the whole `auth` object) to keep the existing value — the vault can never show a secret back to confirm it, so leaving it out means "unchanged," not "cleared." The destination host cannot be changed here: create a new credential for a new destination. Endpoint: https://mcp.echorelay.dev
- delete_credential - Delete a saved credential. Blocked (not a permission or not-found error — a validation error) while any target still references it; repoint or remove those targets first. Endpoint: https://mcp.echorelay.dev
- list_requests - List inbound API requests the relay has processed for this project, newest first. Hot-tier window is the project's requestLogRetentionDays (see get_project). Optional filters narrow the result. Returns {total, limit, offset, rows[]} where each row has ts (unix ms), requestId, method, path, status, durationMs, targets, creditsDeducted, authType, errorMessage, bytesSent, configVersion (the published config that authorised the request; 0 means unstamped), and closeReason (for a streaming request: complete / abortedOrError / byteCap / noValue; empty for non-stream requests). Endpoint: https://mcp.echorelay.dev
- get_request - Get one inbound request envelope + every per-target attempt the Consumer made on the way out (success / permanent_failure / retry_scheduled / dlq). The request and each attempt carry configVersion, the published config that authorised them; 0 means unstamped. Scoped to this project; returns null if no matching row in the hot tier (the project's requestLogRetentionDays window — see get_project). Endpoint: https://mcp.echorelay.dev
- get_metrics - Aggregate request metrics for this project over a time window — volume, error rate and p50/p95/p99 latency, bucketed for charting. By default the series cover inbound requests; pass `targetId` to slice over one outbound target's per-attempt rows instead (answers "which target is degraded?"); pass `endpointId` to slice over inbound rows for a single endpoint (answers "is this endpoint receiving traffic / erroring?"). Pass at most one of targetId / endpointId. Free plans see "hour" and "day"; "week" and "month" require an active paid subscription on the project owner and are silently downgraded to "day" otherwise (the response includes `planGated: true` when that happens). Returns `{window, requestedWindow, planGated, scope, targetId?, endpointId?, bucketSeconds, buckets[], volume[], errors[], totalVolume, totalErrors, errorRate}` plus latency series whose keys depend on scope: an inbound read (project-wide, or `endpointId`) carries `relayP50[]/relayP95[]/relayP99[]` for our own time and `targetP50[]/targetP95[]/targetP99[]` for the destination's, never blended; a `targetId` read carries `p50[]/p95[]/p99[]` for that target's attempts — series arrays are dense (one point per bucket, zero-filled when no traffic). Endpoint: https://mcp.echorelay.dev
- list_dlq - List entries currently in this project's dead-letter queue, newest first. One inbound request fans out per-target, so a single failed request may produce several DLQ entries with different `targetId`s. Returns `{total, limit, offset, rows[], evictedCount}` where each row has `id` (Redis stream id), `requestId`, `targetId`, `configVersion` (the published config that authorised the delivery; 0 means unstamped), `failureReason`, `failedAttempts`, `failedAt`, `payload` (the original Consumer queue entry JSON); `evictedCount` is the lifetime count of entries the queue's capacity cap discarded before they could be triaged. DLQ entries — including the original request body and headers — are kept for up to 30 days from the failure time or until cleared, then purged automatically (or discarded early past capacity — see `evictedCount`); they are never written to a database. get_request still answers what happened to a purged/evicted/discarded entry's inbound request for the project's requestLogRetentionDays window, independent of whether the DLQ row itself still exists. `requestId` is the durable handle across a retry: an entry's own `id` changes every time it is replayed and later dead-letters again, so get_dlq_entry accepts a `requestId` lookup as well as `id`. Endpoint: https://mcp.echorelay.dev
- get_dlq_entry - Get DLQ entries by Redis stream id (`{ms}-{seq}`, as returned by list_dlq's `id`) or by `requestId`. `requestId` is the durable handle — stable across a retry, unlike `id`, which changes every time an entry is replayed and later dead-letters again — and returns every fanned-out target's entry for that inbound request (one request can fan out to N targets, and several may dead-letter); `id` returns at most one. Each entry includes configVersion (the published config that authorised the delivery; 0 means unstamped). Errors if nothing matches this project — purged, retried, or discarded entries age out the same as any other. Endpoint: https://mcp.echorelay.dev
- retry_dlq_entry - Re-enqueue a DLQ entry to the main relay stream and delete it from the DLQ. A replay is billed like any relay — it charges the entry's original credit cost to the project before re-sending; if the balance is too low the entry stays in the DLQ and this returns an insufficient-credits error (top up and retry). Succeeds if the entry exists, errors if it's already gone (retried or discarded). Requires edit access. Endpoint: https://mcp.echorelay.dev
- discard_dlq_entry - Permanently delete a DLQ entry without retrying. Requires edit access. Endpoint: https://mcp.echorelay.dev
- list_subscription_plans - List the available subscription plans (Free, Pro, Scale) with monthly EUR price, credit allowance, per-project RPM cap, and how many active projects the plan includes. Read-only. Endpoint: https://mcp.echorelay.dev
- list_credit_packs - List the prepaid credit packs the project owner can purchase. Read-only. Identify a pack to start_topup by its `eurCents`. Endpoint: https://mcp.echorelay.dev
- list_addons - List the optional add-on subscriptions (RPM upgrades, extra team seats, extended log retention, extra file-delivery storage in +5 GB blocks, …). Each entry is monthly, renews every 30 days until cancelled, and carries `scope` (per_account or per_project). Read-only. Endpoint: https://mcp.echorelay.dev
- get_subscription - Get the project owner's current subscription: plan, active flag, period start/end, cancel-at-period-end flag, external Paddle subscription id, and whether a payment method is on file at the provider. Owner-only; requires a token minted with the billing scope. Endpoint: https://mcp.echorelay.dev
- preview_plan_change - Preview what would happen if change_plan were called with this plan: the immediate-charge amount (cents), the next-invoice amount, the effective date, and the kind (`applied` for in-cycle upgrade, `scheduled` for at-period-end downgrade / cancel). Owner-only; requires a token minted with the billing scope. Endpoint: https://mcp.echorelay.dev
- start_subscription - Begin a new Pro or Scale subscription for the project owner. Returns `{checkoutUrl, plan}` — surface the URL to the human for approval. Errors if the owner is already on an active paid plan (use change_plan instead). Owner-only; requires a token minted with the billing scope. Endpoint: https://mcp.echorelay.dev
- change_plan - Switch the project owner between Pro and Scale, or cancel the subscription (effectively dropping to Free at period end). Returns `{kind, newPlan, effectiveAt, applied}` — `applied=true` means Paddle was charged immediately, otherwise the change is queued for the current period end. Use preview_plan_change first to see the dollar impact. Owner-only; requires a token minted with the billing scope. Endpoint: https://mcp.echorelay.dev
- cancel_subscription - Schedule the project owner's subscription for cancellation at the end of the current billing period. Returns `{kind: 'scheduled', newPlan: 'free', effectiveAt}`. Add-ons keep renewing while the plan is active; after it ends they stop renewing and each already-paid add-on cycle stays active until its own end date (use unsubscribe_addon to stop one sooner). Owner-only; requires a token minted with the billing scope. Endpoint: https://mcp.echorelay.dev
- start_topup - Begin a credit-pack top-up for the project owner. Pass the pack`s `eurCents` (from list_credit_packs). Returns `{checkoutUrl, credits, eurCents, directCharge}` or `{transactionId, credits, eurCents, directCharge:true}` on subsequent MCP purchases. Owner-only; requires a token minted with the billing scope. Endpoint: https://mcp.echorelay.dev
- subscribe_addon - Subscribe the project owner to a monthly add-on (RPM upgrade, team seat, extended log retention, extra file storage in +5 GB blocks, …). Charges the saved payment method immediately, then auto-renews every 30 days until `unsubscribe_addon` — or until the subscription ends, after which the already-paid cycle stays active to its own end date and stops without further charges. Requires an active Pro/Scale subscription and a saved PM. RPM upgrades (rpm_*) are per-project and apply to THIS project automatically. Returns `{addonKey, project, monthlyEurCents, transactionId, activatedAt, nextRenewalAt}`. Owner-only; requires a token minted with the billing scope. Endpoint: https://mcp.echorelay.dev
- unsubscribe_addon - Cancel an active add-on subscription. Stops future charges; the current cycle stays active until expiry. RPM upgrades are cancelled for THIS project. Returns `{addonKey, project, cancelledAt}`. Owner-only; requires a token minted with the billing scope. Endpoint: https://mcp.echorelay.dev
- resume_addon - Resume (un-cancel) a pending-cancel add-on whose paid-through cycle has not yet ended. Clears the cancellation so the add-on renews normally at the next cycle boundary. No new charge — the cycle was already paid. Stackable add-ons cannot be resumed; buy a new unit instead. Returns {addonKey, project, nextRenewalAt, resumed}. Owner-only; requires a token minted with the billing scope. Endpoint: https://mcp.echorelay.dev
- downgrade_addon - Schedule a tier downgrade for a non-stackable add-on (RPM tier). The current tier stays active until `nextRenewalAt`; at that point the lower tier is charged and activated. No mid-cycle charge. Use list_addons to find available keys. Returns {addonKey, targetAddonKey, project, effectiveAt}. Owner-only; requires a token minted with the billing scope. Endpoint: https://mcp.echorelay.dev
- list_active_addons - List the project owner`s currently-active add-ons. Returns `[{addonKey, project, monthlyEurCents, activatedAt, nextRenewalAt, consecutiveFailures}, ...]`. RPM upgrades are per-project; `project` is the slug they apply to (null for account-wide add-ons). Owner-only; requires a token minted with the billing scope. Endpoint: https://mcp.echorelay.dev
- list_audit_events - List project audit-log entries, newest first. Captures who changed what — lines, endpoints, targets, API keys. Outbound-target `auth.token` / `auth.password` are redacted in the diff per the same policy used for endpoint reads. Retention is the `auditRetentionDays` advertised on get_project (default 365 days); rows older than that are purged by the cleanup job. Returns `{total, limit, offset, retentionDays, rows[]}` where each row has `id`, `createdAt`, `actor` (email or null), `action`, `entityType`, `entityId`, `entityLabel`, `diff`. Endpoint: https://mcp.echorelay.dev
- list_projects - List the projects on your account (archived included), each with `id`, `slug`, `name`, `apiBaseUrl` and `archived`. Requires an ACCOUNT-scoped token (one minted with no project) and the `read` scope. A project-scoped token cannot call this — use it on its own project's tools instead. Endpoint: https://mcp.echorelay.dev
- create_project - Create a new project on your account so an agent can bootstrap from a fresh account. The slug is derived from the name and validated server-side (format, reserved words, uniqueness). Each plan includes a fixed number of active projects (free tiers one; paid plans more — see list_subscription_plans); at the limit this errors — if an existing project can host this integration, skip create_project and call create_project_token against it instead of adding another. Requires an ACCOUNT-scoped token and the `config` scope. Returns the created project ({id, slug, name, apiBaseUrl, archived}); call create_project_token next to mint a token for it. Endpoint: https://mcp.echorelay.dev
- rename_project - Rename a project you own (the display name only — the slug, which is the identity in URLs / Redis, never changes). Requires an ACCOUNT-scoped token and the `config` scope. 404-equivalent error when you do not own the slug. Endpoint: https://mcp.echorelay.dev
- archive_project - Archive a project you own. Reversible: the project + slug persist and credits are kept, but the data plane drops the tenant (callers get 404). Idempotent. Fails with an error if the project has archive protection enabled — that is a support-only unlock, not something this call can override. Requires an ACCOUNT-scoped token and the `config` scope. Endpoint: https://mcp.echorelay.dev
- protect_project - Turn on archive protection for a project you own: archive_project (on every surface — panel, REST, and this tool) then refuses until it is lifted. Idempotent. Permanent from here — there is no tool or API call to turn it back off; only contacting support can. Requires an ACCOUNT-scoped token and the `config` scope. Endpoint: https://mcp.echorelay.dev
- unarchive_project - Restore an archived project you own to the data plane. Restoring consumes one of your plan's active-project slots, so at the limit this returns an error telling you to archive another project or upgrade. Idempotent for an already-active project. Requires an ACCOUNT-scoped token and the `config` scope. Endpoint: https://mcp.echorelay.dev
- create_project_token - Mint a PROJECT-scoped management token (`er_mcp_`) for MCP and REST; it cannot authenticate relay traffic. Use it after create_project to configure a fresh project, or for any project you already own. Attenuated by design: the scopes must be a subset of THIS token's own grant (`read` is always included), expiry is mandatory (1–90 days, default 30, never "never"), and the minted token — being project-scoped — can never mint tokens itself. `spend` is human-granted only: no token, of any scope, can mint one carrying it — mint a spend-scoped key from the project's panel instead. Requires an ACCOUNT-scoped token and the `config` scope. Returns the plaintext exactly once; only its hash is stored. Endpoint: https://mcp.echorelay.dev
- list_project_tokens - List the API tokens scoped to a project you own (any holder): id, label, scopes, createdAt, lastUsedAt, expiresAt, revokedAt — never the secret (only its hash is stored). Requires an ACCOUNT-scoped token and the `read` scope. Endpoint: https://mcp.echorelay.dev
- revoke_project_token - Revoke a PROJECT-scoped API token on a project you own — any holder's, not just your own (the account-owner kill switch for a leaked or retired integration token). Soft-revoke: the row stays for traceability and the token is rejected immediately. Idempotent. Requires an ACCOUNT-scoped token and the `config` scope. Endpoint: https://mcp.echorelay.dev

## Resources
Not captured

## Prompts
Not captured

## Metadata
- Owner: dev.echorelay
- Version: 0.11.0
- Runtime: Streamable Http
- Transports: HTTP
- License: Not captured
- Language: Not captured
- Stars: Not captured
- Updated: Jun 11, 2026
- Source: https://registry.modelcontextprotocol.io
