MCP server
SpendOne runs a Model Context Protocol server, so an AI assistant can work with your spend data directly: list the invoices waiting on a colleague, read a purchase order, draft a purchase request from a link, answer an approval. It is a separate service from the REST API described in the rest of these docs, and it exposes a curated set of operations rather than the whole API.
Two properties are worth stating before anything else, because they are what most security reviews ask about:
- Every connection is one person's. The assistant authenticates as the user who connected it and sees exactly what that user sees in the dashboard. There is no shared service account, and the same roles, permissions, row-level security and audit trail apply.
- The assistant can do what the user can, and no more. Every write runs the same permission checks, approval rules and guards as the dashboard, so a user who may not approve a request in SpendOne cannot approve it through an assistant either.
Before you start
Ask your SpendOne contact for:
- Your endpoint URL. One per customer, of the form
https://mcp.<environment>.spendone.tech/t/{your-tenant}/mcp. The full path matters: an assistant pinned to the wrong path cannot connect. - The connector client ID, if you are setting up a Claude connector.
- MCP access enabled for your tenant. It is off until someone turns it on, and every refusal below is a refusal, never a partial connection.
Each person who will use the connection also needs their own SpendOne user account with the roles the work requires. A user who cannot see invoices in the dashboard cannot see them through an assistant either.
Connect Claude (web, Desktop, mobile)
Claude calls this a custom connector. An Owner or Admin of the Claude organization adds it once; each member then connects individually and logs in as themselves.
- In Claude, open Settings → Connectors → Add custom connector.
- Paste your endpoint URL, exactly as SpendOne gave it to you, including the
/t/{your-tenant}/mcppath. - Open the connector's Advanced settings and paste the client ID. Leave the client secret empty: the connector is a public OAuth client, and there is no secret to hold.
- Save. Claude discovers where to authenticate on its own.
- Each user opens the connector and clicks Connect. They are sent to your own login screen (including your identity provider, if SSO is set up), and come back with a token of their own.
From then on the tools appear in Claude, and Claude asks before it runs any of them.
Switching users
The connection carries one identity, and that identity decides what the assistant can see. To switch it, open the connector and Disconnect, then Connect again and log in as the other user. The old token is dropped, and the new session sees only what the new user may see. A connector added by an organization Owner is shared as a configuration, not as a session: every member still authenticates individually, so there is nothing to switch on their behalf.
Do not share one logged-in connector between people. Everything the assistant does is recorded against the user whose credential it used, which is what makes the audit trail worth reading.
What the assistant can do
The assistant works through a set of tools: reading invoices, purchase requests, purchase orders, suppliers, products, cost centers and approval and accounting queues, and drafting and submitting purchase requests, marking an order as ordered, deciding approvals and claiming accounting tasks. Every tool, with what it does to your data, is listed in the MCP tool reference, which is generated from the server itself so it always matches what is served. What changed and when is in the tool changelog.
Every result that names a record also carries a link to the screen in SpendOne that shows it: a purchase order to the step where it is ordered, an approval task to the approval screen with that task selected, an accounting task to its own page, an invoice to the invoice page. The list tools add a link to the approver and accountant queues. That is the intended end of most conversations, because the assistant can do less than the dashboard on purpose: completing an accounting task, booking an invoice and everything under administration happen there, and the link is how you get to them without hunting for a code.
Each tool tells the client whether it only reads, whether it changes something, and whether that change can be walked back, so an assistant can ask for confirmation in proportion. Approving spend through an assistant is still approving spend: your four-eyes rules, approval flows and self-approval restrictions apply exactly as they do in the dashboard, and a refusal there is a refusal here.
Buying something end to end
One purchase, from a link to a placed order, as it runs through an assistant. Each step is done by whoever holds that role; in a small team that can be the same person for every step except the approval.
- The requester pastes a link. "I need this for the design team: https://… Please draft a purchase request." The assistant reads the product page, matches the vendor against your suppliers, finds the purchase flow and cost center that fit, and drafts the request. It shows you the draft before anything is submitted.
- The requester submits it. "Looks right, send it for approval." The request enters its approval flow exactly as if it had been submitted in the dashboard.
- The approver decides. "What is waiting for my approval?" then "Approve PR-1042." The approver can only decide tasks that are theirs, and nobody can approve a request they raised.
- The buyer picks up the order. "Which approved orders are waiting to be placed?" then "Show me PO-2201." The assistant returns what placing the order needs: the supplier, the line items, the total, the payment method and the address the supplier must send the invoice to.
- The buyer opens the card. For an order paid by virtual card, the assistant shows the last four digits and the expiry, and a link. The link opens the card in SpendOne, where the full number is revealed to you after you sign in. The card number never passes through the assistant.
- The buyer orders at the supplier. Give the supplier the purchase order code as your order number and the invoice address from step 4, so the invoice finds its way back to the order.
- The buyer marks it as ordered. "I ordered PO-2201, mark it as ordered." The assistant records it only after you have ordered, and only the purchase's buyer can, exactly as in the dashboard.
Example prompts
Plain language works; the assistant picks the tools. Some starting points per role:
Requester
- "Draft a purchase request for this monitor for the Berlin office: https://…"
- "What happened to my purchase request for the conference tickets?"
- "Cancel my draft for the office chairs, we found them cheaper elsewhere."
Approver
- "What is waiting for my approval, oldest first?"
- "Summarize PR-1042: who asked, what for, how much, and from which supplier."
- "Reject PR-1043 and tell the requester we need a second quote."
Buyer
- "Which approved orders are still waiting to be placed?"
- "Give me everything I need to order PO-2201 at the supplier."
- "Done, I ordered PO-2201. Mark it as ordered."
Accountant
- "What is in my accounting queue today?"
- "Claim the oldest unassigned task and show me the invoice it is about."
- "Release AT-310 back to the unassigned queue, I cannot get to it this week."
What is not supported
- Recurring purchase requests and subscriptions. The assistant refuses to submit a recurring request; set those up in the dashboard.
- Limit increases. An approval to raise a budget or card limit is decided in the dashboard.
- Completing accounting work. The assistant can claim, hand over and release an accounting task, and links you to it; booking and completing it happen in SpendOne.
- Card details, payment methods, accounting exports, user administration, bulk import, audit-log export and tenant administration. Deliberately not available through MCP. Those stay in the dashboard and the REST API.
- Claude Code. Not a supported client. Connect through Claude (web, Desktop, mobile) instead.
- ChatGPT and other assistants that cannot take a client ID they are given. They cannot connect yet.
For your IT and security review
Who the assistant acts as, what data leaves SpendOne, how it is audited, what to allow on your network, how a Claude organization Owner deploys the connector to everyone, and how to remove access: all on one page, MCP rollout for IT and security.
When something does not connect
| What you see | What it usually means |
|---|---|
| The connector fails immediately after you paste the URL | The path is wrong or incomplete. It must end in /t/{your-tenant}/mcp. |
| Login succeeds, then the connection is refused | MCP access is not enabled for your tenant yet, or the account that logged in is not a SpendOne user in it. |
404 on the endpoint | SpendOne has not recorded a client for your tenant, or it was revoked. |
| A tool the tool reference lists is missing | That tool has been turned off on your deployment. Ask your SpendOne contact. |
A tool answers forbidden | The authenticated user lacks the role for it. It is checked per user, not per connection. |
The server logs the precise reason for every refusal, and deliberately does not return it to the client: a detailed error would tell an unauthenticated caller which tenants and users exist. If a connection fails and the table above does not settle it, your SpendOne contact can read the reason.