Chapter 9 of 10 · Updated 23 September 2026

AI connections (MCP)

SubDesk is an MCP server at https://www.subdesk.app/mcp. Connect the assistant you already use and it can read your records and file new ones for you, for example by going through your inbox for receipts, renewal notices and policy documents. SubDesk never reads your email: the assistant's own connectors do, and SubDesk only receives the result.

Every plan includes it: 1 connection on Free, 3 on Plus, 10 on Pro. Three rules hold for every connection: it only touches the workspaces you allowed, it can never delete anything, and everything it adds shows in the workspace activity log as you, marked via Claude (or whatever you named it).

Connect Claude, step by step

Step 1. Open Settings → Connections

The AI connections card lists what is connected and how many connections your plan allows. Choose Connect an assistant.

Settings, Connections tab, with the AI connections card and nothing connected yet
Settings, Connections

Step 2. Pick your assistant

The dialog has one tab per client so you only read the steps for yours. On the Claude tab, copy the server address with the Copy button.

The Connect an assistant dialog on the Claude tab, with the server address and a Copy button
Connect an assistant, Claude tab

Step 3. Add the connector in Claude

In Claude (web or desktop) open Settings → Connectors → Add custom connector, paste https://www.subdesk.app/mcp as the server URL, and confirm. Claude discovers SubDesk's sign-in on its own; nothing else to type.

Step 4. Approve on SubDesk

Claude opens SubDesk's consent page. It leads with who is asking ("claude.ai wants to read and add to your SubDesk records"), then two choices: which workspaces the assistant may see (view-only ones are listed as view only), and the permission: Read and add (add subscriptions, invoices, cards and coverage and update them, never delete) or Read only. Choose Allow. If you are signed out, SubDesk asks you to sign in first and comes back here. The request waits fifteen minutes.

Step 5. Done

Back in Claude, SubDesk appears as a connector with its tools. In SubDesk the new row shows where it came from (claude.ai), when it was last used, and how many records it has added.

The AI connections card with one connection listed: its name, workspaces, permission, origin and last use
A connection in the list

Step 6. Manage it

The row's menu has Edit (rename it, change its workspaces or permission) and Disconnect. Disconnecting revokes access at once; everything the assistant added stays.

The row menu of a connection, with Edit and Disconnect
Row menu
The Edit connection dialog: name, workspaces and permission
Edit a connection
The Disconnect confirmation: the assistant loses access now, everything it added stays
Disconnect

Other assistants

ClientWhat the tab tells you to do
ChatGPTSettings → Connectors → Create, paste the address as the MCP server URL, leave authentication on OAuth. ChatGPT sends you to the same consent page.
CursorAdd SubDesk to ~/.cursor/mcp.json (the tab has the JSON ready to copy). Cursor opens SubDesk in the browser to approve the first time.
Claude CodeRun claude mcp add --transport http subdesk https://www.subdesk.app/mcp once. It opens SubDesk to approve, then /mcp shows SubDesk connected.
The Connect an assistant dialog on the ChatGPT tab
ChatGPT tab
The Connect an assistant dialog on the Cursor tab, with the JSON for mcp.json
Cursor tab
The Connect an assistant dialog on the Claude Code tab, with the terminal command
Claude Code tab

Connection keys, for clients without sign-in

Scripts, MCP Inspector and some desktop clients take a token instead of signing in. At the bottom of the dialog choose Create a connection key.

Step 1. Describe the key

Name it (default "Claude Code"), tick the workspaces, and pick Read and add or Read only. Then Create key.

The Create a connection key dialog: name, workspaces and permission
Create a connection key

Step 2. Copy it now

The key is shown once. It starts with sdk_live_ and is sent as an Authorization: Bearer <key> header to https://www.subdesk.app/mcp. A lost key is replaced, never shown again. The dialog also gives the ready-made Claude Code command with the header filled in.

The Your connection key dialog, showing the key once with a Copy button and the Claude Code command
The key, shown once

A key is a connection like any other: it appears in the list as key, counts against the same cap, and can be edited or disconnected the same way.

Every command the assistant has

The server offers fourteen tools. Reads work on every connection; adds and updates need Read and add. Every tool takes a workspace_id from list_workspaces, so that is always the first call. Amounts are passed with the currency as printed on the receipt and converted to stored dollars; dates are YYYY-MM-DD.

CommandNeedsWhat it doesAsk your assistant, for example
list_workspacesreadThe workspaces this connection may see: currency, your role, whether it may add, and how much of the owner's caps are left (subscriptions, coverage, invoice bytes)."Which SubDesk workspaces can you see, and how much room is left?"
find_subscriptionsreadSubscriptions by name or preset; an empty query lists them all. Filter by active, cancelled or all. Called before any add, so a match is updated instead of duplicated."Do I already track Netflix?"
get_subscriptionreadOne subscription with its full price history and invoice list."Show me everything about my Adobe subscription, including past prices."
find_coveragereadWarranties and policies by name or provider, optionally one kind."What insurance policies do I have with AXA?"
list_cardsreadCards by nickname, type, last four digits and expiry month. Used to link a subscription to the card a receipt names."Which cards are in my Personal workspace?"
search_presetsreadSubDesk's catalogue of about 900 services and, with scope coverage, makers, retailers, insurers and policy types. Returns the preset key that gives a record the right tile and category."Find the SubDesk preset for Spotify."
create_subscriptionaddAdds a subscription: name, amount and currency, monthly or yearly, start and next billing date, category, card by last four digits, trial flag, note, and the email's Message-ID as source so a re-run never files the same receipt twice. A same-name active subscription is refused as a duplicate unless allowed."File this Spotify receipt as a monthly subscription on my Visa ending 4242."
update_subscriptionaddChanges only the fields passed: name, cycle, dates, category, card (or unlink it), trial, note, status (active or cancelled). Nothing is deleted."Move Notion's next billing date to 1 November and mark it cancelled after that."
record_price_changeaddAppends a new price to the history, effective from a date, the way a receipt showing a higher price would. The current price follows once the date arrives."Netflix went up to $22.99 from 4 October, log that."
attach_invoiceaddStores an invoice file (PDF, PNG, JPEG or WebP, up to 1 MB) on a subscription for one billing period, one per period unless replaced. Skipped by clients that cannot hand over file bytes."Attach this PDF as the September invoice for Adobe."
create_cardaddAdds a card by last four digits and type, or returns the one that already exists. An expiry month needs a paid plan."Add my new Mastercard ending 5588, expiring 2028-03."
create_coverageaddAdds a warranty or an insurance policy: what is covered, provider, serial or policy number, dates, price or premium, auto-renew and the card for a policy."Register this AppleCare+ document as a warranty ending 2 November 2027."
update_coverageaddChanges a coverage record's fields, including cancelling it. To extend a term, use renew_coverage instead so the old term is kept."Change the policy number on my car insurance to POL-2291."
renew_coverageaddCloses the current term into history and opens the next one with new dates and, if changed, a new premium. Same as Mark as renewed in the app."My car insurance renewed today for a year at 640 EUR."

The built-in prompt. The server also publishes one prompt, Import from email (import_from_email), with optional workspace and since arguments. It tells the assistant how to go through an inbox properly: list workspaces once, look up each service before adding, log price changes and attach invoices on matches, file warranties and policies as coverage, never cancel or delete without asking, and finish with a short list of what was added, updated, skipped and what needs you.

What a call answers

Every answer carries the stored dollar figure and the figure in the workspace's currency. A refused call answers with a short code and the sentence to relay to you:

CodeMeaning
read_onlyThe connection is read-only, or the workspace is read-only for you
not_allowed_workspaceOutside the workspaces you ticked at consent
plan_limitA cap was hit; the message names the plan that lifts it
storage_limit, too_large, unsupported_fileInvoice storage full, file over 1 MB, or not a PDF or image
duplicateAn active record with the same name exists; its id is included so the assistant updates it instead
not_found, invalidUnknown id, or a field failed validation (the field is named)
rate_limitedMore than 120 calls in a minute on one connection
// search_presets { "query": "netflix" }
{ "presets": [ { "key": "netflix", "label": "Netflix", "category": "Entertainment" } ] }

// search_presets { "query": "applecare", "scope": "coverage" }
{ "presets": [ { "key": "applecare", "label": "AppleCare", "group": "Retailers & plans" },
               { "key": "apple", "label": "Apple", "group": "Makers" } ] }

// list_workspaces
{ "workspaces": [ { "id": "8a844165-…", "name": "My workspace", "kind": "business", "currency": "USD",
    "role": "owner", "owner_plan": "pro", "can_write": true,
    "usage": { "subscriptions": { "used": 13, "limit": 200 }, "coverage": { "used": 0, "limit": 100 },
               "invoice_bytes": { "used": 0, "limit": 5368709120 } } } ] }
Three real answers, as an assistant receives them