expensify-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| EXPENSIFY_DRY_RUN | No | When 'false' (the literal string) mutations are executed; any other value runs in dry-run mode. | true |
| EXPENSIFY_MAX_BATCH_SIZE | No | Maximum number of records per write operation. | 100 |
| EXPENSIFY_PARTNER_USER_ID | Yes | Your Expensify partner user ID (integration user ID). | |
| EXPENSIFY_ALLOWED_POLICY_IDS | No | Optional comma-separated list of policy IDs that mutations are allowed to touch. | |
| EXPENSIFY_PARTNER_USER_SECRET | Yes | Your Expensify partner user secret (integration secret). |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| expensify_list_policiesA | List Expensify policies (workspaces) the authenticated account can see. Returns id, name, owner, role, type and output currency for each. Start here when you need a policy ID for any other tool. |
| expensify_get_policyA | Fetch configuration for one or more policies: categories, tags, report fields, tax rates, and the employee roster. Use this to discover valid category and tag names before creating expenses, since the API rejects values that do not already exist on the policy. |
| expensify_get_domain_cardsA | List corporate/domain card assignments, including bank source and import history. Requires domain admin rights on the account. |
| expensify_export_reportsA | Start an export of expense reports and return the generated filename. Filter by report IDs, date range, or approval state. Pass the returned filename to expensify_download_file to get the contents. Supply a freemarker template to control the columns, or omit it for a default CSV of reportID, name, status, date, merchant, amount, currency, category and tag. This is the only API that enumerates reports — there is no list-reports job. Use it to count or inspect reports. |
| expensify_export_card_reconciliationA | Export company card transactions for a given feed and date range, including transactions not yet attached to a report. Returns a filename to pass to expensify_download_file. |
| expensify_download_fileA | Download the contents of a file produced by expensify_export_reports or expensify_export_card_reconciliation, using the filename those tools return. |
| expensify_create_expensesA | Create one or more expenses on a user account. Amounts are INTEGER CENTS (1234 = $12.34) and dates must be yyyy-MM-dd. Category and tag values must already exist on the policy — call expensify_get_policy first to check. Set externalID per expense to make re-runs traceable. Expenses can be attached to an existing report via reportID, or left standalone. WRITES to Expensify. Dry-run is currently ON — this will preview only. |
| expensify_create_reportA | Create an expense report on a policy, optionally with expenses attached in the same call. Returns the new reportID. Note: this creates the report in an unsubmitted state — the Expensify API cannot submit it for approval or approve it. Amounts are integer cents; dates are yyyy-MM-dd. WRITES to Expensify. Dry-run is currently ON — this will preview only. |
| expensify_mark_reports_reimbursedA | Mark already-APPROVED reports as REIMBURSED. This records that payment happened outside Expensify — it does NOT move money and does NOT approve anything. Reports not already in Approved state will be rejected by the API. This is the only report-status transition the API supports. WRITES to Expensify. Dry-run is currently ON — this will preview only. |
| expensify_create_policyA | Create a new Expensify policy (workspace). Returns the new policyID. WRITES to Expensify. Dry-run is currently ON — this will preview only. |
| expensify_update_policy_categoriesA | Add, update, or replace expense categories on a policy. action="merge" upserts the supplied categories and leaves others untouched. action="replace" DELETES every category not listed in this call — use with care. maxExpenseAmount is in integer cents. WRITES to Expensify. Dry-run is currently ON — this will preview only. |
| expensify_update_policy_tagsA | Add, update, or replace tags on a policy. Tags are grouped into lists; each group has a name and its own tags array. DATA LOSS WARNING (verified against the live API): a tag group is replaced WHOLESALE even with action="merge". Any tag already in the group but absent from your payload is DELETED. Always call expensify_get_policy first, then send the full existing tag list plus your additions. action="merge" only protects OTHER groups, not tags within the groups you send. WRITES to Expensify. Dry-run is currently ON — this will preview only. |
| expensify_update_employeesA | Add or update members on a policy, including role, manager, approval limits and routing. Members are matched by email and updated in place. employeeEmail, managerEmail and employeeID are required for each record. To remove someone use expensify_remove_employees. WRITES to Expensify. Dry-run is currently ON — this will preview only. |
| expensify_remove_employeesA | Remove members from a policy. Sets isTerminated on each record, which is how the API removes someone from their assigned policy. WRITES to Expensify. Dry-run is currently ON — this will preview only. |
| expensify_update_tag_approversA | Set or clear the approver for individual tags on a policy. Pass an empty string as approver to clear one. Only single-level tags are supported. Tag names must already exist on the policy. WRITES to Expensify. Dry-run is currently ON — this will preview only. |
| expensify_create_expense_ruleB | Create an expense rule that automatically applies a tag or billable status for an employee on a policy. WRITES to Expensify. Dry-run is currently ON — this will preview only. |
| expensify_update_expense_ruleA | Modify an existing expense rule by its ruleID. WRITES to Expensify. Dry-run is currently ON — this will preview only. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/BilalAtique/expensify-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server