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

EchoRelay

REMOTE · MCP.ECHORELAY.DEV · SCANNED OCT 15

A managed runtime for custom API integrations. Manage lines, endpoints, keys, logs and DLQ via MCP.

0 this week 94 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security97
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
  • HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
  • The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
  • DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
  • The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
Schema Quality & AI Usability73
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 11059 tokens (~138/item across 80 items; 80 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
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage96
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 87% 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 9 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 80 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
Install

How do I install the EchoRelay MCP server?

EchoRelay is a hosted endpoint at https://mcp.echorelay.dev/, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · mcp.echorelay.dev

# add to Claude Code
claude mcp add --transport http dev-echorelay-management 'https://mcp.echorelay.dev/'
// .cursor/mcp.json
{
  "mcpServers": {
    "dev-echorelay-management": {
      "url": "https://mcp.echorelay.dev/"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "dev-echorelay-management": {
      "type": "http",
      "url": "https://mcp.echorelay.dev/"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.dev-echorelay-management]
url = "https://mcp.echorelay.dev/"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "dev-echorelay-management": {
      "type": "remote",
      "url": "https://mcp.echorelay.dev/",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add dev-echorelay-management --url 'https://mcp.echorelay.dev/' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  dev-echorelay-management:
    url: "https://mcp.echorelay.dev/"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "dev-echorelay-management": {
      "Transport": "http",
      "Url": "https://mcp.echorelay.dev/"
    }
  }
}
# add to Vellum
assistant mcp add dev-echorelay-management -t streamable-http -u 'https://mcp.echorelay.dev/'
// mcp.json
{
  "mcpServers": {
    "dev-echorelay-management": {
      "type": "http",
      "url": "https://mcp.echorelay.dev/"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

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.

  • 14 Oct 26 0
    • Tool “create_credential” rewrote its description, which is the text the model reads security
  • 10 Oct 26 0
    • Tool “delete_endpoint” rewrote its description, which is the text the model reads security
    • Tool “get_endpoint” rewrote its description, which is the text the model reads security
    • “create_api_key” reworded the description of “mode” cosmetic
    • “create_api_key” made “mode” optional cosmetic
  • 3 Oct 26 0
    • Tool “create_credential” rewrote its description, which is the text the model reads security
    • Tool “get_endpoint” rewrote its description, which is the text the model reads security
    • “create_credential” made “destinationHost” optional cosmetic
  • 28 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 26 Sept 26 0
    • Tool “delete_endpoint” rewrote its description, which is the text the model reads security
    • Tool “delete_line” rewrote its description, which is the text the model reads security
    • Tool “discard_dlq_entry” rewrote its description, which is the text the model reads security
    • Tool “get_endpoint” rewrote its description, which is the text the model reads security
    • Tool “get_key_policy” rewrote its description, which is the text the model reads security
    • Tool “list_api_keys” rewrote its description, which is the text the model reads security
    • Tool “list_config_revisions” rewrote its description, which is the text the model reads security
    • Tool “list_credit_packs” rewrote its description, which is the text the model reads security
    • Tool “list_endpoints” rewrote its description, which is the text the model reads security
    • Tool “list_lines” rewrote its description, which is the text the model reads security
    • Tool “list_members” rewrote its description, which is the text the model reads security
    • Tool “remove_member” rewrote its description, which is the text the model reads security
    • Tool “revoke_api_key” rewrote its description, which is the text the model reads security
    • Tool “update_endpoint” rewrote its description, which is the text the model reads security
    • Schema quality: 120 → 135 ▼ functional
  • 25 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 23 Sept 26 0
    • Tool “list_projects” rewrote its description, which is the text the model reads security
  • 21 Sept 26 +2
    • Authorization: fail → pass ▲ security
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 15 Oct 2026 · Probed https://mcp.echorelay.dev

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=echorelay.dev CN=YE2,O=Let's Encrypt,C=US 12 Sept 2026 11 Dec 2026 ECDSA 256 ECDSA-SHA384 56dd766f8ce63c6ae931fe7a8a27c888dd0
SANs: *.echorelay.dev, echorelay.dev
CN=YE2,O=Let's Encrypt,C=US (CA) CN=Root YE,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 ECDSA 384 ECDSA-SHA384 4df3b15dd6c0784c507cd37b58e6f115
CN=Root YE,O=ISRG,C=US (CA) CN=ISRG Root X2,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 ECDSA-SHA384 872165fc34b6e5fba8add5b3705fb53a
CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 SHA256-RSA 6c8f1dc727c7117f7baf853ac980f9cd

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of mcp.echorelay.dev. — Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
dev. present 60074 8 Verified
echorelay.dev. present 2371 13 Verified
mcp.echorelay.dev. Verified address RRset verified with the apex keys
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On tool calls
HTTP status 200

WWW-Authenticate challenge Bearer resource_metadata="https://mcp.echorelay.dev/.well-known/oauth-protected-resource"

Bearer resource_metadata="https://mcp.echorelay.dev/.well-known/oauth-protected-resource"
Header Value
strict-transport-security max-age=31536000; includeSubDomains
content-security-policy script-src 'self' 'nonce-977d85efd8e308ef759f6b899087d626' 'sha256-4FqAsKYYgAp9u0EQQ/5kYTh/MCiR+GodCLMScWjsIPc=' https://cdn.paddle.com; report-uri /csp-report; report-to csp-endpoint
x-content-type-options nosniff
x-frame-options SAMEORIGIN
referrer-policy strict-origin-when-cross-origin
permissions-policy geolocation=(), microphone=(), camera=()

Protected resource metadata

Document https://mcp.echorelay.dev/.well-known/oauth-protected-resource
Retrieved Yes
Resource https://mcp.echorelay.dev
Authorisation server https://app.echorelay.dev

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp.echorelay.dev Verified 200
http (plaintext) http://mcp.echorelay.dev HTTPS enforced 301 https://mcp.echorelay.dev/
MCP tools · 80 exposed · ~11,059 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. 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 →

Tool Tokens
activate_line ~90

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.

NameTypeReqDescription
commitModestring–Defaults to publish. Draft writes require draftRevision.
draftRevisioninteger–Current line draft revision, required for draft writes.
lineKeystringyesThe line key, e.g. "v1".

No output schema declared.

No examples provided.

archive_project ~100

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 management token and the `config` scope.

NameTypeReqDescription
slugstringyesThe slug of a project you own.

No output schema declared.

No examples provided.

cancel_line_publish ~35

Cancel one line schedule before its two-minute lock.

NameTypeReqDescription
draftRevisionintegeryes–
lineKeystringyes–

No output schema declared.

No examples provided.

cancel_subscription ~93

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

change_plan ~96

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.

NameTypeReqDescription
planstringyes–

No output schema declared.

No examples provided.

config_diff ~69

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

create_api_key ~179

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

NameTypeReqDescription
modestring–live → paid pool, test → testing pool (rate-limited to the plan's live rate). Omit for live.
namestringyesHuman-readable label, up to 120 characters.
ttlDaysinteger|null–Lifetime in days. Omit to use the project's defaultKeyTtlDays from get_key_policy. Null = never expires (owner-only unless editorsMayCreateNonExpiringKeys is set).

No output schema declared.

No examples provided.

create_credential ~434

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, oauthClientCredentials→tokenUrl+clientId+clientSecret (+ optional scope, audience, clientAuth "basic"|"post"; the access token is fetched at delivery, and clientSecret is never returned. The client secret is only ever sent to tokenUrl, and the access token only to the bound destinationHost; tokenUrl is permanent like destinationHost — it must pass the project's outbound host allowlist at create, and an update that changes it is refused), signingSecret→secret (the secret a sender such as GitHub or Stripe signs the webhooks it sends you with; attach it to an endpoint as senderSignature.credentialId). `destinationHost` is required and permanent: the credential is only ever sent to that host, over https, and no later call can re-aim it. A signingSecret credential is never sent anywhere, so it takes no destinationHost.

NameTypeReqDescription
authobjectyesThe credential's auth shape.
destinationHoststring–The only host this credential may be sent to, e.g. "api.stripe.com", or a single-label wildcard, e.g. "*.stripe.com" (matches api.stripe.com, not stripe.com and not a.b.stripe.com). Host only — no sc…
namestringyesHuman-readable label, up to 120 characters.

No output schema declared.

No examples provided.

create_endpoint ~134

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.

NameTypeReqDescription
commitModestring–Defaults to publish. Draft writes require draftRevision.
draftRevisioninteger–Current line draft revision, required for draft writes.
endpointobjectyesAn EchoRelay endpoint. Round-trips with the JSON returned by get_endpoint.
lineKeystringyesThe line key to create the endpoint under.
scheduledAtstring–Compatibility alias: stage this endpoint in its line draft then schedule that line.

No output schema declared.

No examples provided.

create_line ~127

Create a new versioned line. A new line has no endpoints, so creating one publishes nothing and serves no traffic yet — add an endpoint, which publishes the line with it. Draft mode requires draftRevision 0. Requires edit access.

NameTypeReqDescription
commitModestring–Defaults to publish. Draft writes require draftRevision.
draftRevisioninteger–Current line draft revision, required for draft writes.
lineKeystringyesURL key, lowercase letters/digits/hyphens, e.g. "v1".
namestringyesHuman-readable line name.

No output schema declared.

No examples provided.

create_project ~165

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 management token and the `config` scope. Returns the created project ({id, slug, name, apiBaseUrl, archived}); call create_project_token next to mint a management token for it.

NameTypeReqDescription
namestringyesHuman-readable project name (1–100 chars). The slug is derived from it.

No output schema declared.

No examples provided.

create_project_token ~293

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 management token's own grant (`read` is always included), expiry is mandatory (1–90 days, default 30, never "never"), and the minted management token (being project-scoped) can never mint management tokens itself. `spend` is human-granted only: no management token, of any scope, can mint one carrying it. Mint a spend-scoped token from the project's panel instead. Requires an ACCOUNT-scoped management token and the `config` scope. Returns the plaintext exactly once; only its hash is stored.

NameTypeReqDescription
expiresInDaysinteger–Days until the minted management token expires. Default 30. API-minted management tokens always expire.
labelstringyesHuman-readable management token label (1–100 chars).
scopesarray–Scopes for the minted management token: must be a subset of this management token's own scopes. `read` is always granted. `spend` and the legacy `billing` scope are never mintable here (panel-only).…
slugstringyesThe slug of a project you own.

No output schema declared.

No examples provided.

deactivate_line ~108

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.

NameTypeReqDescription
commitModestring–Defaults to publish. Draft writes require draftRevision.
draftRevisioninteger–Current line draft revision, required for draft writes.
lineKeystringyesThe line key, e.g. "v1".

No output schema declared.

No examples provided.

default_endpoint_template ~121

Return a canonical minimal-valid endpoint JSON for a fresh line. POST it verbatim to create_endpoint to land an immediately-working endpoint, then customise. It comes back with `mock: true`: it answers callers with its own canned body and never dials the target it carries, so a 200 from it proves the endpoint is reachable and nothing about delivery. Set `mock: false` and give the target a real URL before treating a call as delivered. Read-only.

NameTypeReqDescription
lineKeystringyesThe line key, e.g. "v1".

No output schema declared.

No examples provided.

delete_credential ~58

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.

NameTypeReqDescription
credentialIdstringyesUUID of the credential to delete.

No output schema declared.

No examples provided.

delete_endpoint ~234

Delete an endpoint and its targets, immediately or by staging the removal in the line's draft with commitMode "draft" and draftRevision (returns `{draft}` instead of deleting right away). An immediate delete publishes a new revision without the endpoint and returns `{deleted: true, endpointId}`, but the line's prior revision still has it, so list_config_revisions can find that revision and rollback_config can republish over the deletion. Errors when `lineKey`/`endpointId` is missing, the line or endpoint doesn't exist, the draft revision is stale, removing the endpoint would leave an active line with no endpoints, or the publish is refused (a rejected target mapping or an outbound-allowlist violation is a validation error; a publish the platform could not verify is retryable). Requires edit access.

NameTypeReqDescription
commitModestring–Defaults to publish. Draft writes require draftRevision.
draftRevisioninteger–Current line draft revision, required for draft writes.
endpointIdstringyesThe endpoint UUID.
lineKeystringyesThe line key, e.g. "v1".

No output schema declared.

No examples provided.

delete_line ~169

Delete a line and every endpoint under it, immediately or by staging the removal in the line's draft with commitMode "draft" and draftRevision (returns `{draft}`, discardable via discard_line_draft, instead of deleting right away). An immediate delete removes the line's own revision history along with it, so list_config_revisions has nothing left to list and rollback_config cannot bring the line back. Errors when `lineKey` is missing, doesn't match a line in the project, or the draft revision is stale. Requires edit access.

NameTypeReqDescription
commitModestring–Defaults to publish. Draft writes require draftRevision.
draftRevisioninteger–Current line draft revision, required for draft writes.
lineKeystringyesThe line key, e.g. "v1".

No output schema declared.

No examples provided.

discard_dlq_entry ~107

Permanently delete a DLQ entry without retrying it: the delivery is never re-sent and the entry cannot be restored. Use retry_dlq_entry instead when the delivery should still reach its target. The inbound request stays answerable through get_request for the project's requestLogRetentionDays window. Errors if the entry is already gone (retried, discarded, purged or evicted). Requires edit access.

NameTypeReqDescription
idstringyesDead-letter entry id from list_dlq.

No output schema declared.

No examples provided.

discard_draft_endpoint ~44

Discard one endpoint change from a line draft.

NameTypeReqDescription
draftRevisionintegeryes–
endpointIdstringyes–
lineKeystringyes–

No output schema declared.

No examples provided.

discard_line_draft ~37

Discard every unpublished change and schedule for one line.

NameTypeReqDescription
draftRevisionintegeryes–
lineKeystringyes–

No output schema declared.

No examples provided.

downgrade_addon ~122

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.

NameTypeReqDescription
addonKeystringyesCurrent active add-on key to downgrade from.
targetAddonKeystringyesTarget (lower) add-on key to downgrade to.

No output schema declared.

No examples provided.

dry_run_endpoint ~296

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. Supply sample and/or answerSample to also run each target's mapping against a real payload and see what it produces, which field came from which node, and every rule that failed with the value that broke it. No DB write, no queue entry, no billing, and the payload is never sent anywhere.

NameTypeReqDescription
answerSampleobject|array|string|number|boolean|null–Optional: an answer payload, shaped as one a target would actually return. Drives answerMapping the same way, as answerMappingEvaluation. It cannot be inferred from sample — the two travel in opposit…
endpointobjectyesEndpoint document (for create dry-run) or PATCH body (when endpointId is supplied).
endpointIdstring–Optional: dry-run a PATCH against this endpoint UUID.
lineKeystringyesThe line key.
sampleobject|array|string|number|boolean|null–Optional: a request payload, shaped as one a caller would actually send, passed as JSON rather than as a string containing JSON. Every target carrying an outgoingMapping is evaluated against it and t…

No output schema declared.

No examples provided.

duplicate_line ~149

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.

NameTypeReqDescription
commitModestring–Defaults to publish. Draft writes require draftRevision.
draftRevisioninteger–Current line draft revision, required for draft writes.
lineKeystringyesThe source line key to copy.
namestring–Optional name for the copy (defaults to "<source name> (copy)").
newLineKeystringyesNew line key for the copy, e.g. "v2".

No output schema declared.

No examples provided.

generate_line_draft ~413

Generate a draft endpoint under a line from a sample inbound request and a description of the target: infers the inbound body schema from the sample, reads the target's method/URL/fields from an OpenAPI document (targetDocument) or a bare sample plus targetUrl, and proposes an outgoingMapping pairing every target field to a same-named inbound field. Nothing is guessed — a target field with no same-named match is reported in the "unmapped" list instead of being mapped, and every field it did map carries "inferred": true in the stored mapping tree. Always writes a draft (never publishes); the draft flows through preview_line_draft, dry_run_endpoint, config_diff and publish_line_draft like any other. Requires edit access.

NameTypeReqDescription
deliveryModestringyesThe caller contract this endpoint offers: async acceptance with later outcomes, one sync reply, or a stream.
draftRevisionintegeryesThe line's current draft revision (0 for a line with no draft yet) — see get_line_draft.
lineKeystringyesThe line key to draft the generated endpoint under.
sampleobjectyesA sample inbound request body, shaped as one a real caller would send — one JSON field per key.
targetDocumentstring–The target's OpenAPI 3.x document (YAML or JSON). Mutually exclusive with targetSample; must describe exactly one operation.
targetFilenamestring–Filename hint for targetDocument, to decide YAML vs JSON. Defaults to "target.json".
targetHttpMethodstring–HTTP method for the target when using targetSample. Defaults to POST.
targetSampleobject–A raw sample of the target's own request body, used instead of targetDocument when there is no spec to read. Requires targetUrl.
targetUrlstring–The target URL. Required when targetSample is used; ignored when targetDocument is used (its servers[] entry wins).

No output schema declared.

No examples provided.

get_billing ~285

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. On a Pro or Scale plan billed for overage, `overage` reports the billing cycle running now: `usedCredits`, `overageCredits` (beyond the allowance and prepaid credits), `amount` so far in minor units of `currency` (null when it cannot be worked out), `windowEndsAt`, `throttled` (true while this cycle's request limit is halved because spend passed five times the plan's credits) and `throttledUntil` (when the halved limit ends, or null); it is absent otherwise. On Pro or Scale, `overageBilling` is the account's own overage setting, changed with set_overage_billing.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_config ~39

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_dlq_entry ~255

Get DLQ entries by entry 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.

NameTypeReqDescription
idstring–Dead-letter entry id, e.g. "1717930000000-0" (as returned by list_dlq). Changes on every retry — prefer requestId to track an entry across replays.
requestIdstring–The UUID the relay returned in its 202, or from list_requests / list_dlq rows. Stable across retries. Returns every fanned-out target's DLQ entry for this request. Provide exactly one of id / request…

No output schema declared.

No examples provided.

get_endpoint ~217

Get one endpoint's full document by `lineKey` and `endpointId`: `id`, `lineKey`, `name`, `url`, `httpMethod`, `strict`, `rateLimit`, `allowedIPs`, `idempotencyEnabled`, `senderSignature` (`{scheme, credentialId}`, plus `custom` for the custom-hmac scheme, or null: whether the sender's signature is verified, never the secret), `mock`, `mockResponse`, `attributes`, `targets` (auth redacted), and `transformers`. Each target carries its `id`, and its secrets come back redacted: the `targets` array can be edited and sent back in update_endpoint's `patch`, where a target that keeps its `id` keeps its stored secrets unless new ones are given. Errors when either argument is missing or when the line or endpoint doesn't exist in this project.

NameTypeReqDescription
endpointIdstringyesThe endpoint UUID.
lineKeystringyesThe line key, e.g. "v1".

No output schema declared.

No examples provided.

get_key_policy ~80

Return the project's key policy: `defaultKeyTtlDays` (what create_api_key uses when `ttlDays` is omitted), plus `maxKeyTtlDays` and `editorsMayCreateNonExpiringKeys`, the limits create_api_key enforces when minting a key. Read-only; use set_key_policy to change these values.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_line_draft ~42

Read one line draft, its optimistic revision, preview, and schedule.

NameTypeReqDescription
lineKeystringyesThe line key, e.g. "v1".

No output schema declared.

No examples provided.

get_metrics ~425

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

NameTypeReqDescription
endpointIdstring–Optional endpoint UUID (from list_endpoints / get_endpoint). When set, the series aggregate inbound request rows for that endpoint only. Mutually exclusive with targetId.
targetIdstring–Optional outbound target UUID (from get_endpoint targets). When set, the series aggregate the per-attempt rows for that target instead of the project-wide inbound rows.
windowstring–Time horizon. Defaults to "day". "week"/"month" require a paid plan; otherwise the server returns "day" with planGated=true.

No output schema declared.

No examples provided.

get_project ~47

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_receipts ~250

Get every target this request fanned out to, each with its delivery receipt or the reason it has none. A still-moving delivery (queued/retrying) answers from the live tracking copy, a terminal one (delivered/failed) from durable storage — the response shape is identical either way, so poll this on an interval with the same requestId a 202 response returned and watch `status` move to a terminal value. Each entry has targetId, targetURL, available, and when available: status (queued/retrying/delivered/failed), attempt, enqueuedAt/updatedAt/completedAt (unix ms), terminalError, callbackState (none/pending/delivered/failed — whether the target's completion-callback URL, if any, has been notified). When available is false, `reason` is "sync_or_stream_delivery" (the target answers inside the original HTTP response and is never tracked here — see the response body from that call instead) or "not_found" (no record for this target, e.g. aged past the retention window).

NameTypeReqDescription
requestIdstringyesUUID returned by the relay in 202 responses or visible in list_requests rows.

No output schema declared.

No examples provided.

get_request ~112

Get one inbound request envelope + every per-target delivery attempt 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 once the request has aged out of the project's log-retention window (requestLogRetentionDays — see get_project).

NameTypeReqDescription
requestIdstringyesUUID returned by the relay in 202 responses or visible in list_requests rows.

No output schema declared.

No examples provided.

get_subscription ~59

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

invite_member ~72

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.

NameTypeReqDescription
emailstringyesEmail address to invite.
rolestringyesRole to assign on acceptance.

No output schema declared.

No examples provided.

list_active_addons ~83

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_addons ~69

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_api_keys ~102

List the project's inbound API keys as metadata only — the secret plaintext is never returned, only `id`, `name`, `mode`, `prefix`, `createdAt`, `createdBy`, `lastUsedAt`, `expiresAt`, `revokedAt`, `successorId`, `predecessorId`, and `successorRevealedAt`. Returns `{keys: []}` with no paging — every key on the project comes back in one call.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_audit_events ~275

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

NameTypeReqDescription
actionstring–Exact action match, e.g. "endpoint.updated", "target.created", "key.revoked".
entityIdstring–Exact entity id (UUID or stream id depending on entityType).
entityTypestring–Exact entity type, e.g. "endpoint", "target", "line", "key".
limitinteger–Page size. Default 50.
offsetinteger–Page offset. Default 0.
sinceinteger–Lower bound on createdAt (unix ms). Inclusive.
untilinteger–Upper bound on createdAt (unix ms). Inclusive.

No output schema declared.

No examples provided.

list_config_revisions ~95

List every retained revision of one line, newest first, so a target revision can be picked for rollback_config. Returns `{revisions: []}` with no paging; each entry has `revision`, `publishedAt`, `current`, and `active`. Errors when `lineKey` is missing or doesn't match a line in the project.

NameTypeReqDescription
lineKeystringyesThe line key, e.g. "v1".

No output schema declared.

No examples provided.

list_credentials ~57

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

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_credit_packs ~81

List the prepaid credit packs available to purchase, returned as a bare array of `{credits, eurCents, usdCents, plnGrosze, welcomeEligible}` objects — not wrapped in an envelope, and not paginated (the whole catalog every time). Read-only; identify a pack to start_topup by its `eurCents`.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_dlq ~359

List entries currently in this project's dead-letter queue, newest first. One inbound request fans out per-target, so a single request may produce several DLQ entries, one per target that didn't accept it (different `targetId`s). Returns `{total, limit, offset, rows[], evictedCount}` where each row has `id` (the dead-letter entry id, `{ms}-{seq}`), `requestId`, `targetId`, `configVersion` (the published config that authorised the delivery; 0 means unstamped), `failureReason`, `failureCode` (stable machine-readable cause; `unclassified` for entries written before codes existed), `failedAttempts`, `failedAt`, `payload` (the JSON of the queued delivery as it was attempted); `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`.

NameTypeReqDescription
limitinteger–Page size. Default 50.
offsetinteger–Page offset. Default 0.

No output schema declared.

No examples provided.

list_endpoints ~110

List the endpoints under one line, identified by `lineKey`; returns `{lineKey, endpoints: []}` with no paging. Each entry reports `id`, `name`, `path`, `httpMethod`, `strict`, `mock`, and `targetCount` — not the endpoint's full body, which get_endpoint returns. Errors when `lineKey` is missing or doesn't match a line in the project.

NameTypeReqDescription
lineKeystringyesThe line key, e.g. "v1".

No output schema declared.

No examples provided.

list_lines ~88

List every line in the project: returns `{lines: []}` in one call, with no paging. Each entry reports `lineKey`, `name`, `active`, `docsShared`, `publishedAt`, `endpointCount`, and its draft state (`draftRevision`, `hasDraft`, `scheduledPublish`). A project with no lines yet returns an empty `lines` array rather than an error.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_members ~114

List accepted and pending members of this project, plus the owner (role "owner"), each with `id`, `email`, `name`, `role`, and whether the invite has been accepted. Returns `{members: [], count, seatCap, seatsUsed}` with no paging — `count` is the roster size, `seatCap`/`seatsUsed` are the plan's seat limit and how many seats are used. Errors when the caller isn't the project owner or the token lacks the config scope. Owner only.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_project_tokens ~80

List the management 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 management token and the `read` scope.

NameTypeReqDescription
slugstringyesThe slug of a project you own.

No output schema declared.

No examples provided.

list_projects ~94

List the projects on your account (archived included), each with `id`, `slug`, `name`, `apiBaseUrl` and `archived`, plus `accountEmail` — the account this token authenticates as. Requires an ACCOUNT-scoped management token (one minted with no project) and the `read` scope. A PROJECT-scoped management token cannot call this: use it on its own project's tools instead.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_requests ~295

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

NameTypeReqDescription
limitinteger–Page size. Default 50.
methodstring–HTTP method (POST, GET, …). Case-insensitive.
offsetinteger–Page offset. Default 0.
pathstring–Substring of the request path (e.g. "/webhook"). LIKE-matched.
sinceinteger–Lower bound on ts (unix ms). Inclusive.
statusinteger–Exact HTTP status code (e.g. 404).
targetOutcomestring–Narrow to requests that produced at least one per-target attempt with this outcome. Use "dlq" to find requests with at least one target that ended up dead-lettered.
untilinteger–Upper bound on ts (unix ms). Inclusive.

No output schema declared.

No examples provided.

Common questions

What is the EchoRelay MCP server?

EchoRelay is an MCP server listed in the public MCP registry as dev.echorelay/management. A managed runtime for custom API integrations. Manage lines, endpoints, keys, logs and DLQ via MCP. This page covers its hosted endpoint (https://mcp.echorelay.dev).

Is the EchoRelay MCP server safe to use?

EchoRelay scores 94 out of 100 on VerifyMCP. 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 EchoRelay MCP server expose?

EchoRelay exposes 80 tools: get_project, list_lines, list_endpoints, get_endpoint, get_config, and 75 more. Their descriptions and schemas cost roughly 11,059 tokens of context every time the server is loaded.

Does the EchoRelay MCP server require authentication?

Yes. EchoRelay asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the EchoRelay MCP server still maintained?

EchoRelay is still listed as active in the MCP registry. We last reached this channel on 15 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.