Owner's Desk

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/mcp

Connect

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

ToolTypeWhat it does
connection_statusread onlyWhich systems are connected, the time zone and currency answers use, and where to manage connections.
business_pulseread onlyNet 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_meread onlyOpen Stripe invoices with an amount due, most overdue first, with totals and aging.
needs_me_todayread onlyA prioritized list across every connected system, plus today's schedule.
list_eventsread onlyEvents on the primary Google Calendar for 1 to 31 days.
find_customerread onlyStripe customers by name, email or id, returning the customer_id for draft_invoice.
list_new_reviewsread onlyRecent Google reviews with stars, text and reply status. Available once Google approves Business Profile access.
list_pending_actionsread onlyDrafts waiting for confirmation and the outcome of recent ones.
read_audit_logread onlyThe append-only audit log, newest first, paged.
draft_invoicewriteStages a Stripe invoice (customer, lines, due date, memo). Returns a draft and a confirmation token.
draft_eventwriteStages a Google Calendar event. Guests are emailed only if notify_attendees is true.
draft_review_replywriteStages a public reply to one Google review. Available once Google approves Business Profile access.
confirm_actiondestructiveExecutes one staged draft with its token: sends the invoice, creates the event, posts the reply, or deletes the account.
cancel_actionwriteCancels a staged draft so its token can never run.
disconnect_servicedestructiveDeletes the saved credentials for one system and revokes the grant at the provider where possible.
delete_my_datadestructiveStages 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

  1. 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.
  2. The assistant shows you the draft and waits for your yes.
  3. confirm_action with 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.
  4. 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/register and 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.