Expense MCP (beta)
Connect Findity expense functionality to Claude, ChatGPT, Gemini, or an agent you build yourself, using the Model Context Protocol.
This guide covers what the Findity Expense MCP server exposes, how to connect it from the major assistant clients, and what people realistically use it for. It is not an API reference — the MCP server is a surface over the Expense API, and the underlying endpoints are documented there.
The Expense MCP is in beta. Access is granted to partners who have registered interest — contact your Findity representative before following this guide. Behaviour, tool names, and the server URL may change before general availability.
What it is
The Model Context Protocol (MCP) is an open standard for connecting AI assistants to external systems. An MCP server publishes a set of callable tools; an MCP-compatible client — Claude, ChatGPT, Gemini, a coding agent, or something you build — discovers those tools and calls them on the user's behalf.
The Findity Expense MCP server publishes Findity's expense functionality as such a set of tools. A user asks their assistant a question in natural language, the assistant calls the relevant Findity tool, and the result lands in Findity exactly as if the user had done it in the app.
MCP is a protocol, not a product with a screen. There is no Findity MCP interface — the assistant is the interface. Results are visible in the standard Findity web and mobile views.
Two things follow from this that shape everything below:
- The server acts as one authenticated user. It does not introduce a new permission model. It reuses the same login, the same roles, and the same approval flows as any other Findity client.
- Partners can build against it, not just connect to it. An off-the-shelf assistant is the fastest route, but the same server backs a custom agent — which is what the Slack and Teams section is about.
This is a different server from the Docs MCP, which exposes Findity's API documentation to coding assistants. The Docs MCP helps a developer write an integration; the Expense MCP handles actual expenses.
Tools it exposes
This isn't a full API reference — see the Expense API docs for that — but it helps to know the shape of what's available before you start asking an assistant to use it.
| Area | Tool | What it does |
|---|---|---|
| Identity & organizations | get_my_info | Basic info about the signed-in user (name, email, id). |
list_organizations | Organizations the user belongs to, with permissions and approval settings. | |
get_counters | Pending approvals, rejections, and inbox counts across all orgs. | |
| Receipts & content | upload_base64_file | Uploads a receipt/document as base64. Returns a content id. |
get_content_token | Short-lived token/URL for uploading or downloading a file directly. | |
get_content_info | Metadata for an uploaded content item. | |
scan_content | Runs OCR/AI scan on a receipt; returns extracted fields and raw text. | |
| Expense drafts | start_expense_draft | Starts a new expense draft, optionally pre-filled from a scan. |
open_expense_draft | Opens an existing saved expense for editing. | |
update_expense_draft | Applies field values to an open draft. | |
list_field_options | Picker options for a list-type field on a draft. | |
set_subsistence_route | Sets the full travel route for an international per-diem draft. | |
save_expense_draft | Commits an open draft as a new expense. | |
discard_expense_draft | Discards an open draft without saving. | |
| Expense actions & lookups | list_loose_expenses | Expenses not yet added to a report. |
submit_expense | Submits a single loose expense directly. | |
delete_expense | Permanently deletes a draft expense. | |
| Report drafts | start_report_draft | Starts a new expense report draft. |
open_report_draft | Opens an existing saved report for editing. | |
update_report_draft | Applies field values to an open report draft. | |
save_report_draft | Commits an open report draft as a new/updated report. | |
discard_report_draft | Discards an open report draft without saving. | |
| Report actions & lookups | list_expense_reports | Reports for an organization, with status filters. |
submit_expense_report | Submits a draft report for approval/processing. | |
delete_expense_report | Permanently deletes a draft report. | |
| Approvals | list_approvals | Reports awaiting the signed-in user's approval. |
get_approval_report_fields | Full field details for a report within an approval. | |
get_approval_expense_fields | Full field details for an expense record within an approval. | |
approve_expense_report | Approves a report. | |
reject_expense_report | Rejects one or more expense records with comments. | |
| Confirmation | ask_confirmation | Confirm/cancel prompt shown before any destructive action, single or batch. |
| User settings | get_user_settings | The signed-in user's personal settings as editable fields. |
update_user_settings | Applies values to a settings draft. | |
list_settings_field_options | Picker options for a list-type settings field. | |
save_user_settings | Commits settings changes. | |
discard_user_settings | Discards a settings draft without saving. | |
| Guests | list_guests | Resolves ambiguous or partial participant names for an organization. |
| Memory | remember | Saves or updates a persistent memory for the user. |
get_memories | Returns all memories saved for the user. | |
forget | Deletes a saved memory by key. |
Destructive tools (
delete_expense,delete_expense_report,submit_expense,submit_expense_report,approve_expense_report,reject_expense_report, and their batch equivalents) always route throughask_confirmationfirst. An assistant that calls one of these directly without confirming is not behaving as designed.
What it can access
A session runs as the user who signed in, with exactly the access that user has in the Findity app.
| Scope | Access |
|---|---|
| The signed-in user's own expenses and reports | Yes — read and write. |
| Expenses awaiting the signed-in user's approval | Yes, if that user is configured as an approver. |
| Any other user's expenses | No. |
| Organisation-wide expense data | No. |
Actions taken through the MCP route through the same roles and approval flows as any other client. Submitting an expense through an assistant puts it into normal approval routing; approving one through an assistant is the same approval the user could perform in the app.
There is no separate control for MCP access in beta. Access mirrors app access — a user who can log in to Findity can connect the MCP server, and a user who cannot, cannot. Partners and organisation admins cannot enable it for a subset of users, restrict it, or apply MCP-specific permissions on top of an existing role.
Out of scope in beta
- Retrieving expenses across the organisation
- Acting on behalf of another user
- Forwarding approved expenses to external systems
Before you start
- Confirm with Findity that the Expense MCP is enabled for your environment.
- Have Findity credentials for the user who will be signing in. Access follows that user's existing role, so test with an account that has the permissions you want to demonstrate — including approver rights if you plan to try the approval flows.
- Use an MCP-compatible client that supports remote servers over HTTP. Clients that only support locally-installed servers cannot reach a hosted endpoint.
Connect the server
Server URL
https://api.findity.com/api/mcpWhite label partners use their own prefix in place of api:
https://{partner-prefix}.findity.com/api/mcpThere is nothing to install and no API key to issue. On first use the client opens a browser window and prompts for a Findity sign-in, exactly as the app does. Once signed in, the client holds the session and the tools become available to the assistant.
In Claude Desktop or claude.ai, open Settings → Connectors → Add custom connector, give it a name such as Findity, and paste the server URL. Claude opens a browser window for the Findity sign-in and the connector appears as enabled when it completes.
In Claude Code, add it from the terminal:
claude mcp add --transport http findity https://api.findity.com/api/mcpThen run /mcp in a session to complete the sign-in and confirm the server is connected.
Open Settings → Connectors → Add custom connector, paste the server URL, and complete the Findity sign-in when prompted. Enable the connector for the chats where you want it available.
Custom connectors are a paid-tier feature in ChatGPT and may need developer mode enabled on the account. ChatGPT reaches the server from the cloud, so the endpoint must be publicly resolvable — a locally hosted or IP-restricted environment will not connect.
Add the server to ~/.gemini/settings.json for Gemini CLI:
{
"mcpServers": {
"findity": {
"httpUrl": "https://api.findity.com/api/mcp",
"authProviderType": "dynamic_discovery"
}
}
}dynamic_discovery lets the CLI pick up the sign-in configuration from the server itself. Run /mcp to trigger the browser sign-in and list the discovered tools.
Any client that supports remote MCP servers over HTTP will work. Most take the same shape as the Gemini configuration above — a named entry pointing at the server URL:
{
"mcpServers": {
"findity": {
"url": "https://api.findity.com/api/mcp"
}
}
}If your client offers a choice of transport, select streamable HTTP rather than a local command. If it cannot open a browser window for sign-in, it cannot authenticate against the Expense MCP in beta.
Client menus move between releases. If the paths above do not match what you see, look for the section your client uses for MCP servers, remote servers, or connectors — the only value it needs is the server URL.
Verify the connection
Ask the assistant something that requires a tool call and has an unambiguous answer, such as:
What expenses are currently waiting for my approval?
A working connection produces an answer drawn from Findity, and the client shows the tool call it made. An assistant that answers in general terms without calling a tool is not connected — check that the connector is enabled for the current conversation, not just added to the account.
What you can ask it to do
The assistant decides which tools to call from what the user asks, so there are no commands to memorise. Two patterns are worth calling out separately, because they need different things from the person using them.
Everyday questions and actions
Single requests, answered in one or two tool calls. These are the ones that remove a context switch — the user stays in the assistant instead of opening Findity.
Submit this receipt as a travel expense on my Berlin trip report.
What's the status of my March expense report?
Which expenses are waiting for my approval?
How much have I spent on client entertainment this quarter?
Agent-assisted work
Longer sequences where the assistant does the repetitive part and the user stays in the loop on the decisions.
Bulk capture. The user uploads a batch of receipts at once. The agent categorises each one, drafts a description, assembles them into an expense, and submits it for approval — turning an evening of item-by-item entry into one review pass.
Approver triage. An approver has the agent work through their own approval queue, surfacing which items sit below threshold and within policy, and approving those on the user's instruction. The approvals are the user's own, made with the user's own rights.
Both patterns run inside a session the user has authenticated. Neither is organisation-wide automation, and neither runs on a schedule — the agent works while the user is there.
Troubleshooting
| Symptom | What to check |
|---|---|
| The client shows the server as added but no tools appear | The sign-in did not complete. Remove and re-add the connector, and watch for the browser window — some clients open it behind the active window. |
| The assistant answers without calling a Findity tool | The connector is added but not enabled for that conversation. Enable it per chat where the client requires it. |
| Sign-in succeeds, but expenses are missing | The session is running as a different Findity user than expected, or the user's role does not include what you are asking for. Confirm which account completed the sign-in. |
| A partner environment does not connect | Check the prefix in the URL. Partners connect through https://{partner-prefix}.findity.com/api/mcp, not the default host. |
| The client cannot reach the server at all | The client only supports locally-installed MCP servers, or the environment blocks outbound access to the Findity host. |
Next steps
Updated about 4 hours ago
