Documentation
Owner's Desk, end to end.
A remote MCP server over Streamable HTTP with its own OAuth 2.1 authorization server. Endpoint:
https://desk.modernmustardseed.com/mcpConnect
1. Set up your desk. Sign in at desk.modernmustardseed.com/account with your email (a link and an 8-digit code, no password). Connect the systems you use.
2. Claude. Settings, Connectors, Add custom connector. Paste the endpoint above and choose Connect. Sign in and approve on the Owner's Desk screen. Works on claude.ai, Claude Desktop and Claude Code (claude mcp add --transport http owners-desk https://desk.modernmustardseed.com/mcp).
3. ChatGPT. Settings, Apps and Connectors, Advanced settings, turn on Developer mode, then Create. Paste the endpoint above, choose OAuth, and sign in when asked.
Then ask: "What needs me today?"
Connecting Stripe
Two ways, both acting only on your own account. The one-click install uses Stripe's app OAuth: you see and accept the exact permissions on Stripe's screen, access tokens last one hour and refresh tokens roll on every use. Or create a restricted key in Stripe (Developers, API keys, Create restricted key) with only these permissions, and paste it on your desk page:
- Charges and Refunds: Read
- Customers: Write
- Invoices: Write
- Balance: Read
We test each permission before saving. Full secret keys (sk_) are refused.
Tools
| Tool | Type | What it does |
|---|---|---|
| connection_status | read only | Which systems are connected, the time zone and currency answers use, and where to manage connections. |
| business_pulse | read only | Net revenue by currency with the change on the period before, payments, failed payments, new customers, money owed, appointments and new reviews. Periods: today, yesterday, this_week, last_week, last_7_days, this_month, last_month, last_30_days. |
| who_owes_me | read only | Open Stripe invoices with an amount due, most overdue first, with totals and aging. |
| needs_me_today | read only | A prioritized list across every connected system, plus today's schedule. |
| list_events | read only | Events on the primary Google Calendar for 1 to 31 days. |
| find_customer | read only | Stripe customers by name, email or id, returning the customer_id for draft_invoice. |
| list_new_reviews | read only | Recent Google reviews with stars, text and reply status. Available once Google approves Business Profile access. |
| list_pending_actions | read only | Drafts waiting for confirmation and the outcome of recent ones. |
| read_audit_log | read only | The append-only audit log, newest first, paged. |
| draft_invoice | write | Stages a Stripe invoice (customer, lines, due date, memo). Returns a draft and a confirmation token. |
| draft_event | write | Stages a Google Calendar event. Guests are emailed only if notify_attendees is true. |
| draft_review_reply | write | Stages a public reply to one Google review. Available once Google approves Business Profile access. |
| confirm_action | destructive | Executes one staged draft with its token: sends the invoice, creates the event, posts the reply, or deletes the account. |
| cancel_action | write | Cancels a staged draft so its token can never run. |
| disconnect_service | destructive | Deletes the saved credentials for one system and revokes the grant at the provider where possible. |
| delete_my_data | destructive | Stages the full purge: every connection revoked, sign-in, credentials, drafts, profile and audit log deleted. Runs on confirm_action. |
Every read tool is annotated readOnlyHint: true. Every tool that stages, executes, cancels or deletes is annotated destructiveHint: true, so your assistant asks before calling it.
The two-step confirmation
- A draft tool validates the request and stores the exact write, encrypted, as a pending action. It returns a plain-language draft and a confirmation token beginning
odc_. Nothing has happened in Stripe or Google. - The assistant shows you the draft and waits for your yes.
confirm_actionwith that token runs the stored write. The token is 256 random bits, stored only as a hash, works for your account only, expires 15 minutes after the draft, and is claimed atomically, so two confirms run it once.- If a run fails partway, the same token can be retried up to three times before expiry. Every step carries an idempotency key derived from the action, so a retry resumes and never sends a second invoice or creates a second event.
The confirm call executes what was drafted, never new arguments. To change a draft, draft again and cancel the old one.
Authorization
- Protected resource metadata (RFC 9728):
https://desk.modernmustardseed.com/.well-known/oauth-protected-resource/mcp - Authorization server metadata (RFC 8414):
https://desk.modernmustardseed.com/.well-known/oauth-authorization-server - Authorization code with PKCE S256 only. Public clients. Dynamic Client Registration (RFC 7591) at
/oauth/registerand Client ID Metadata Documents. Token revocation (RFC 7009) at/oauth/revoke. - Access tokens last one hour, refresh tokens 30 days and rotate on use. Tokens are opaque and stored as SHA-256 digests, bound to the resource
https://desk.modernmustardseed.com/mcp. - Claude's hosted callback is
https://claude.ai/api/mcp/auth_callback; loopback redirects match on any port for desktop clients.
Limits
Per account: 30 calls a minute, 1,500 a day, and 20 confirmed actions an hour. Limits are counted per account and per tool, never per IP address, because every assistant user reaches us from the assistant's own network. A limit returns a normal tool message saying when it resets.
Data handling
Credentials are sealed with AES-256-GCM before storage and opened only for the length of one provider call. Every table has row level security, and each tool call runs database reads as you. Logs record the tool, your account id, the outcome and timing, never arguments, message content or customer details. Full details are in the privacy policy.
Help
Write to sarah@modernmustardseed.com or see support.