{"server":"dev.echorelay/management","count":31,"changes":[{"tool":"create_credential","kind":"changed","observed_at":"2026-10-13T15:29:13.635Z","fields":["description","inputSchema"],"description_before":"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, 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.","description_after":"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.","description_similarity":0.807,"before_hash":"89aae2d104602c4b64d09bf8c49f225a","after_hash":"a59c2bbefbe2aeeb747e018f321759bb"},{"tool":"dry_run_endpoint","kind":"changed","observed_at":"2026-10-13T15:29:13.635Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"67555257a808666dc355312bfb708bcd","after_hash":"c24f1e5a69dc5a00f98ae65b23c4fc6b"},{"tool":"update_endpoint","kind":"changed","observed_at":"2026-10-13T15:29:13.635Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"ea72f370582d25c010c1f71cbe74db96","after_hash":"7a3607582abd45e3068ebc3ce612eed6"},{"tool":"create_endpoint","kind":"changed","observed_at":"2026-10-13T15:29:13.635Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"cbb2133a9e456012194e81389bcde708","after_hash":"365b1d360cd0eb0a585f95c9ba01399a"},{"tool":"create_api_key","kind":"changed","observed_at":"2026-10-10T17:25:13.701Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"c83871abe6371bf393dc5c90379ac333","after_hash":"c2d013135d028c04223b66f4c2f56c65"},{"tool":"dry_run_endpoint","kind":"changed","observed_at":"2026-10-10T17:25:13.701Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"09308ddc0a1ae3e898e8d68b9b703a37","after_hash":"67555257a808666dc355312bfb708bcd"},{"tool":"delete_endpoint","kind":"changed","observed_at":"2026-10-10T17:25:13.701Z","fields":["description"],"description_before":"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, or removing the endpoint would leave an active line with no endpoints. Requires edit access.","description_after":"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.","description_similarity":0.819,"before_hash":"556ab17324b5525c5211ad3fac00452f","after_hash":"c6f7b6629571429d21af3a6d43caa991"},{"tool":"update_endpoint","kind":"changed","observed_at":"2026-10-10T17:25:13.701Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"d2cdc35110bdce319182d77225ee1612","after_hash":"ea72f370582d25c010c1f71cbe74db96"},{"tool":"create_endpoint","kind":"changed","observed_at":"2026-10-10T17:25:13.701Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"6589c7668e3f02d0f79e12009799e6f1","after_hash":"cbb2133a9e456012194e81389bcde708"},{"tool":"get_endpoint","kind":"changed","observed_at":"2026-10-10T17:25:13.701Z","fields":["description"],"description_before":"Get one endpoint's full document by `lineKey` and `endpointId`: `id`, `lineKey`, `name`, `url`, `httpMethod`, `strict`, `rateLimit`, `allowedIPs`, `idempotencyEnabled`, `senderSignature` (`{scheme, credentialId}` 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.","description_after":"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.","description_similarity":0.949,"before_hash":"c52ab2a044c348314b1f658ad6564708","after_hash":"cf68895290873d9dcdb2e17582e2a352"},{"tool":"create_credential","kind":"changed","observed_at":"2026-10-02T10:58:24.460Z","fields":["description","inputSchema"],"description_before":"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.","description_after":"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, 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.","description_similarity":0.793,"before_hash":"30b480ba3e3a847a976c41414445e5db","after_hash":"89aae2d104602c4b64d09bf8c49f225a"},{"tool":"dry_run_endpoint","kind":"changed","observed_at":"2026-10-02T10:58:24.460Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"dbc4c662e17c446433a61494ff57c84c","after_hash":"09308ddc0a1ae3e898e8d68b9b703a37"},{"tool":"update_endpoint","kind":"changed","observed_at":"2026-10-02T10:58:24.460Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"40696f22d6f162688a056ce243ae0b25","after_hash":"d2cdc35110bdce319182d77225ee1612"},{"tool":"create_endpoint","kind":"changed","observed_at":"2026-10-02T10:58:24.460Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"3f2a6e4dd1231eeb40c84e65aad25222","after_hash":"6589c7668e3f02d0f79e12009799e6f1"},{"tool":"get_endpoint","kind":"changed","observed_at":"2026-10-02T10:58:24.460Z","fields":["description"],"description_before":"Get one endpoint's full document by `lineKey` and `endpointId`: `id`, `lineKey`, `name`, `url`, `httpMethod`, `strict`, `rateLimit`, `allowedIPs`, `idempotencyEnabled`, `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.","description_after":"Get one endpoint's full document by `lineKey` and `endpointId`: `id`, `lineKey`, `name`, `url`, `httpMethod`, `strict`, `rateLimit`, `allowedIPs`, `idempotencyEnabled`, `senderSignature` (`{scheme, credentialId}` 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.","description_similarity":0.865,"before_hash":"86d7809c69f9b82cb39758bdb0f4179f","after_hash":"c52ab2a044c348314b1f658ad6564708"},{"tool":"list_credit_packs","kind":"changed","observed_at":"2026-09-25T13:30:51.471Z","fields":["description"],"description_before":"List the prepaid credit packs the project owner can purchase. Read-only. Identify a pack to start_topup by its `eurCents`.","description_after":"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`.","description_similarity":0.405,"before_hash":"5dc542c59fa90c26d4963bbdc616dfcc","after_hash":"79dee15ca87f8195f31c86c3deb6f72c"},{"tool":"discard_dlq_entry","kind":"changed","observed_at":"2026-09-25T13:30:51.471Z","fields":["description"],"description_before":"Permanently delete a DLQ entry without retrying. Requires edit access.","description_after":"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.","description_similarity":0.2,"before_hash":"aaa5bb7721bdc7d1d835f935533a007f","after_hash":"78af4a05fde06aa2afd26423e27efbef"},{"tool":"get_key_policy","kind":"changed","observed_at":"2026-09-25T13:30:51.471Z","fields":["description"],"description_before":"Returns the project's key policy: defaultKeyTtlDays, maxKeyTtlDays, editorsMayCreateNonExpiringKeys.","description_after":"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.","description_similarity":0.25,"before_hash":"e8a836e065dbf6d7c4b7e4a8482ec1f0","after_hash":"551f6eeccd49e755162f63c288420083"},{"tool":"revoke_api_key","kind":"changed","observed_at":"2026-09-25T13:30:51.471Z","fields":["description"],"description_before":"Manual hard revoke. The key stops authenticating on the next request. Owner anywhere, editor on own keys.","description_after":"Revoke a key immediately: it stops authenticating as soon as the change reaches the relay, with no overlap window, so callers still using it start failing. To replace a key without downtime, use rotate_api_key instead; if the key already has a successor, fetch it with reveal_rotation_successor, because rotate_api_key refuses a key that has one. Revoking a successor leaves its predecessor unable to rotate again. Owner anywhere, editor on own keys.","description_similarity":0.19,"before_hash":"a2c98e697995bcbb29850b80d6c7f5b7","after_hash":"88e6496b048043e0b1b62bf986b78c8c"},{"tool":"list_api_keys","kind":"changed","observed_at":"2026-09-25T13:30:51.471Z","fields":["description"],"description_before":"List the project's inbound API keys (metadata only — the secret plaintext is never returned).","description_after":"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.","description_similarity":0.35,"before_hash":"0e7bc474b026ee0235517b3e1d2e2e2f","after_hash":"8b8761b851fa5ebfd57eeb97c18f1e11"},{"tool":"remove_member","kind":"changed","observed_at":"2026-09-25T13:30:51.471Z","fields":["description"],"description_before":"Remove a member (accepted or pending) from this project by their member ID or email. Owner only.","description_after":"Remove a member (accepted or pending) from this project by memberId or email, matching the first record found; returns `{message, email}`. This deletes the membership record outright with no undo, so getting the person back onto the project takes a fresh invite_member call, not a restore. Errors when neither `memberId` nor `email` is given, no member matches, the caller isn't the project owner, or the token lacks the config scope. Owner only.","description_similarity":0.241,"before_hash":"8f7129530c8edf27b480ec501804f30f","after_hash":"a70673506a237b771ad40397e68192f5"},{"tool":"list_members","kind":"changed","observed_at":"2026-09-25T13:30:51.471Z","fields":["description"],"description_before":"List accepted and pending members of this project. Shows name/email, role, and whether the invite has been accepted. Owner only.","description_after":"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.","description_similarity":0.353,"before_hash":"19206fa3ec1e4aecda24a95002c6c46d","after_hash":"43c20fa911970bf0bae22f89440b3586"},{"tool":"dry_run_endpoint","kind":"changed","observed_at":"2026-09-25T13:30:51.471Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"e843a3def26a11a694a8d47715d84e33","after_hash":"dbc4c662e17c446433a61494ff57c84c"},{"tool":"delete_endpoint","kind":"changed","observed_at":"2026-09-25T13:30:51.471Z","fields":["description"],"description_before":"Delete an endpoint and its targets, publishing the removal immediately. Requires edit access.","description_after":"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, or removing the endpoint would leave an active line with no endpoints. Requires edit access.","description_similarity":0.174,"before_hash":"a865f59943c37e52e81def383e3ce056","after_hash":"556ab17324b5525c5211ad3fac00452f"},{"tool":"update_endpoint","kind":"changed","observed_at":"2026-09-25T13:30:51.471Z","fields":["description","inputSchema"],"description_before":"Update an endpoint immediately or in its line draft. The patch is merged field-by-field. Requires edit access.","description_after":"Update an endpoint immediately or by staging the change in its line draft with commitMode \"draft\" and draftRevision; the patch is merged field-by-field onto the endpoint's current values, so omitted keys keep their values. Targets are matched by the `id` get_endpoint returned; without one, by the same `name` and `targetUrl` (when only one stored target has that pair); without either, a patch to the target in the same position matches it, as long as the list keeps its length, the patch doesn't change both its `name` and `targetUrl`, and a changed `targetUrl` stays on the same host. A matched target keeps its stored secrets (auth and signingSecret) when they are omitted or redacted; an unmatched target is new, must carry its secrets, and a redacted `***` on it is rejected. An immediate update treats a target that exists only in the line draft as unmatched. Draft mode returns `{draft}`; an immediate update returns `{endpoint, scheduledAt}` with the endpoint's full updated document. Errors on a missing `lineKey`/`endpointId`, an unknown line or endpoint, a patch that fails validation (including a rejected target mapping or an outbound-allowlist violation), or a stale draftRevision. Requires edit access.","description_similarity":0.178,"before_hash":"abdea154e058b2b9d79d0ff583062db3","after_hash":"40696f22d6f162688a056ce243ae0b25"},{"tool":"create_endpoint","kind":"changed","observed_at":"2026-09-25T13:30:51.471Z","fields":["inputSchema"],"description_before":null,"description_after":null,"description_similarity":null,"before_hash":"f3519f78ee8506129c011a30aca48df3","after_hash":"3f2a6e4dd1231eeb40c84e65aad25222"},{"tool":"delete_line","kind":"changed","observed_at":"2026-09-25T13:30:51.471Z","fields":["description"],"description_before":"Delete a line and every endpoint under it, publishing the removal immediately. Requires edit access.","description_after":"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.","description_similarity":0.226,"before_hash":"1f6b121f93f8a858238caca9a6584e5e","after_hash":"0a2a3c1e0e0cc347d3d9aaa3e0432c69"},{"tool":"list_config_revisions","kind":"changed","observed_at":"2026-09-25T13:30:51.471Z","fields":["description"],"description_before":"List retained revisions for one line so a prior revision can be selected for rollback.","description_after":"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.","description_similarity":0.273,"before_hash":"e38aa026b6f6e691f5082911f6508436","after_hash":"c5109ed4862945a7dd704cb95c1cfc74"},{"tool":"get_endpoint","kind":"changed","observed_at":"2026-09-25T13:30:51.471Z","fields":["description"],"description_before":"Get the full JSON of one endpoint, including its targets, auth keys and attributes.","description_after":"Get one endpoint's full document by `lineKey` and `endpointId`: `id`, `lineKey`, `name`, `url`, `httpMethod`, `strict`, `rateLimit`, `allowedIPs`, `idempotencyEnabled`, `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.","description_similarity":0.147,"before_hash":"0f939a4d9ab661f12050bca911f58cf6","after_hash":"86d7809c69f9b82cb39758bdb0f4179f"},{"tool":"list_endpoints","kind":"changed","observed_at":"2026-09-25T13:30:51.471Z","fields":["description"],"description_before":"List the endpoints under one line of the project.","description_after":"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.","description_similarity":0.163,"before_hash":"56fad428708d34fe4597efa37f08f41b","after_hash":"e41675a0e412f56d4d44818c876a083e"},{"tool":"list_lines","kind":"changed","observed_at":"2026-09-25T13:30:51.471Z","fields":["description"],"description_before":"List the project's versioned API lines (e.g. v1, v2), each with its endpoint count.","description_after":"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.","description_similarity":0.152,"before_hash":"190f29c4f6aee874f63f6d5a16efac4d","after_hash":"3f337e9d07c4533fb5e50c44241f8283"}],"next_before":null,"next_actions":[]}