Skip to content

fix(mcp): honest inbound annotations + wording, aligned with the hosted app - #94

Merged
tuyakhov merged 2 commits into
mainfrom
claude/mcp-inbound-manifest-parity
Aug 1, 2026
Merged

fix(mcp): honest inbound annotations + wording, aligned with the hosted app#94
tuyakhov merged 2 commits into
mainfrom
claude/mcp-inbound-manifest-parity

Conversation

@tuyakhov

@tuyakhov tuyakhov commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Summary

The 0.14.0 manifest ships the inbound tool suite with annotations/wording the app had already deliberately corrected app-side (senderkit-app lib/mcp/tools.ts APP_ONLY_TOOLS, see app PRs #283/#285). This aligns the manifest with the app so a follow-up app PR can collapse the app-side inbound definitions onto the manifest (wire inbound handlers into HANDLERS and delete the duplicated ToolDefs). Same adoption pattern as #92 (cc/bcc/limit wording).

  • senderkit_inbound_addresses_createdestructiveHint: false: an additive create that deleting the address fully reverses; destructiveHint: true made well-behaved clients demand confirmation for a reversible operation.
  • livemode no longer promises a quota exemption: the manifest claimed test-mode addresses "don't count against quota", but the plan limit applies to every address. Now uses the honest wording (the app's tests forbid the quota-exemption promise).
  • Titles: inbound_messages_list / inbound_messages_get retitled "List Inbound Messages" / "Get Inbound Message" to match the app's served titles.
  • All remaining inbound descriptions + field descriptions aligned with the app, including the friendly ISO 8601 validation message on the before cursor.

Second commit — accuracy over blind parity. Where neither copy matched the actual implementation, both sides were corrected together instead of copying an incomplete description (app counterpart: senderkit-app#287, identical strings, byte-parity preserved — verified against the built dist):

  • localPart documents the "*" catch-all and the charset rules (both real: normalizeLocalPart accepts "*" and enforces 1-64 chars of a-z 0-9 . _ -, lowercased, reserved names rejected).
  • webhookEndpointId documents both halves of endpoint selection: a bound endpoint receives message.received even when not subscribed; unbound addresses fan out to every active subscribed endpoint in the address's mode.
  • livemode notes that a test-mode address's forwards are recorded as test sends without real delivery.

Tests

  • mcp.test.ts: parity block pinning the corrected annotation, the no-quota-promise wording (mirrors the app's test), the adopted titles, the ISO 8601 before message, plus wording guards for the catch-all/charset docs, the unbound fan-out, and the test-mode forward note — each written first and watched fail.
  • CLI mcp-server.test.ts expectations extended to support a destructiveHint: false write.
  • Full workspace green: build, typecheck, sdk 86/86, cli 87/87, react-email 29/29.

🤖 Generated with Claude Code

tuyakhov and others added 2 commits July 31, 2026 19:31
…ed app

Adopt the app-side corrections to the inbound tool suite so the manifest
matches what the hosted server actually serves (same pattern as the
cc/bcc/limit adoption in #92):

- inbound_addresses_create: destructiveHint false — an additive create
  that deleting the address fully reverses
- livemode no longer promises a quota exemption; every address counts
  toward the plan's inbound-address limit
- inbound_messages_list/_get retitled "List Inbound Messages" /
  "Get Inbound Message"; all remaining inbound descriptions and field
  descriptions adopt the app's wording, incl. the friendly ISO 8601
  message on the `before` cursor

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…havior

Not a straight adoption — the app's wording was incomplete here too, so
both sides move together (app PR: senderkit-app#287) to the code-verified
union, keeping byte-parity for the upcoming ToolDef collapse:

- localPart: document the "*" catch-all + charset rules; {slug} placeholder
- webhookEndpointId: bound endpoints receive message.received even when
  not subscribed; unbound addresses fan out to every active subscribed
  endpoint in the address's mode
- livemode: test-mode forwards are recorded as test sends, not delivered

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@tuyakhov
tuyakhov merged commit 249f1b9 into main Aug 1, 2026
1 check passed
@tuyakhov
tuyakhov deleted the claude/mcp-inbound-manifest-parity branch August 1, 2026 08:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant