Connect your AI Agents to Concur in minutes

Available tools
list_report_expenses
List all expense entries on a report. Concur v4 returns the full set (no pagination). Use getreportexpense for full details on a specific entry.
get_report_expense
Get a single expense entry on a report including amount, date, location, and custom fields. Accepts either the v4 hex expenseid or the v3-style ID returned by createreport_expense.
list_expense_itemizations
List itemizations on an expense entry. Itemizations split a single charge across multiple expense types or amounts. Accepts either the v4 hex expenseid or the v3-style ID returned by createreport_expense.
update_report_expense
Update a single expense entry on a report. COMPANY-TOKEN ONLY: user OAuth tokens are rejected. Accepts either the v4 hex expenseid or the v3-style ID from createreport_expense. Cannot set comments — Concur exposes those as a separate sub-resource.
delete_report_expense
Permanently delete an expense entry from a report. Cannot be undone. Accepts either the v4 hex expenseid or the v3-style ID returned by createreport_expense.
create_report_expense
Create a new expense entry on an existing report. USER-TOKEN ONLY: company JWTs are rejected. Returns both expenseid (v3) and v4expenseid; pass v4expenseid to v4 read/update/delete tools and expenseid to attachreceiptto_expense.
attach_receipt_to_expense
Upload a receipt image and attach it directly to an expense entry. Image is sent as base64 in filecontent with the matching MIME in mediatype. Max 5 MB.
get_expense_form_fields
Get form-field metadata for an expense entry (custom fields by expense type). Pass expensetypeid to filter. Accepts either the v4 hex expenseid or the v3-style ID returned by createreport_expense.
list_payment_types
List payment types available to a Concur user (e.g. 'Cash', 'Company Paid') via Expense Config v4. USER-TOKEN ONLY: company JWTs are rejected. Returns v4 short codes (e.g. 'CASH'); pass these directly to createreportexpense, which auto-resolves to the v3 tenant-encoded form. Requires the expense.config.paymenttypes.restricted.read scope.
get_current_user
Get the authenticated user or company profile from /profile/v1/me. Returns the principal record (extension fields pass through).
get_principal
Get a Concur principal (user or company) by ID via /profile/v1/principals/{id}. Use the JWT 'sub' claim or the id from getcurrentuser.
create_quick_expense
Create a quick expense (no image) for the authenticated user. Required: expensetypeid, transactionamount, transactiondate.
create_quick_expense_with_image
Create a quick expense and attach a receipt image in one call. Send the image as base64 in filecontent with the matching MIME in mediatype. Max 50 MB.
upload_receipt
Upload an e-receipt (image + structured metadata) to the user's receipt library. The connector builds the Concur general-receipt JSON from flat inputs. Image is base64 in file_content. Max 25 MB.
upload_receipt_image_only
Upload an image-only receipt to the user's receipt library. Image is sent as base64 in filecontent with mediatype. Max 25 MB. Requires the receipts.write scope.
list_user_receipts
List e-receipts for the authenticated user. Returns the full set (Concur v4 does not paginate this endpoint).
list_image_only_receipts
List image-only receipts in the user's receipt library.
get_receipt
Get an e-receipt's metadata by receiptid (a merchant-delivered digital receipt in the user's Concur receipt library; receiptid comes from listuserreceipts). Not for an Expense Report expense entry's receiptImageId (use getexpensereceipt_image for those). Requires the receipts.read scope.
get_image_only_receipt
Get an image-only receipt's metadata by receiptid (a user-uploaded receipt image in the receipt library, no merchant-extracted data; receiptid comes from listimageonlyreceipts). Not for an Expense Report expense entry's receiptImageId (use getexpensereceiptimage for those). Requires the receipts.read scope.
get_receipt_status
Get the processing status of a submitted receipt by receiptid (from listuser_receipts or an upload response). Useful for tracking async OCR/validation. Requires the receipts.read scope.
download_receipt
Download the image bytes for an e-receipt (a digital receipt delivered to the user's Concur receipt library by a merchant), identified by a receiptid from listuserreceipts or getreceipt. Not for an Expense Report expense entry's receiptImageId (use downloadexpensereceiptimage for those). Returns base64 filecontent + media_type. Requires the receipts.read scope.
download_image_only_receipt
Download the image bytes for an image-only receipt (a user-uploaded receipt image in the receipt library, with no merchant-extracted data), identified by a receiptid from listimageonlyreceipts. Not for an Expense Report expense entry's receiptImageId (use downloadexpensereceiptimage for those). Returns base64 filecontent + media_type. Requires the receipts.read scope.
get_expense_receipt_image
Get metadata and a temporary (~15 min) download URL for an expense receipt image WITHOUT downloading the bytes, given a receiptImageId from an Expense Report expense entry (receiptImageId/ereceiptImageId). To download the bytes, use downloadexpensereceiptimage. For a receipt-library receiptid, use downloadreceipt/downloadimageonlyreceipt instead. Requires the IMAGE scope.
download_expense_receipt_image
Download the image bytes for an expense receipt, given a receiptImageId from an Expense Report expense entry (receiptImageId/ereceiptImageId). Returns base64 filecontent + mediatype. For just the URL + metadata use getexpensereceiptimage; for a receipt-library receiptid use downloadreceipt/downloadimageonlyreceipt instead. Requires the IMAGE scope.
get_report
Get an expense report by ID. Returns name, status, totals, and policy custom fields. Use listreportsto_approve to find pending reports as an approver.
create_report
Create a new (unsubmitted) expense report. policyid MUST be a v4 ID: first call listreports to find any existing report, then call getreport on it and use the policyid from that v4 response. Do NOT pass policyidv3 from list_reports — v4 will reject it.
update_report
Update fields on an unsubmitted report. report_source is required by Concur (one of OTHER/SE/UI/EA/TR/MOB; use 'OTHER' for API callers).
update_report_as_company
Update a report using a company-level JWT. COMPANY-TOKEN ONLY: user OAuth tokens are rejected. Works on any report regardless of submission state. Limited to businesspurpose, comment, name, paper-receipts flag, and customdata.
delete_report
Permanently delete an expense report. Cannot be undone. Use get_report first to confirm the right ID.
list_reports
List the authenticated user's expense reports. Supports cursor pagination via offset/limit and server-side filters (approvalstatus, paymentstatus, modifiedafter). Pass userlogin_id to filter by login ID or 'ALL' for all users (company token only).
list_reports_to_approve
List reports the authenticated user can approve as an approver or delegate. Concur v4 returns the full set (no pagination).
get_report_form_fields
Get policy-driven form-field metadata for a report (data type, required flag, access level). Pass policy_id for the target policy if it differs from the report's current one.
list_report_exceptions
List policy exceptions on a report. Returns header-level (expenseid None) and per-expense items. isblocking=true means red-flag (prevents submitreport). Call this when submitreport fails or when hasBlockingExceptions is true.
list_users
List Concur users in the company via Identity v4.1 (SCIM). Admin-only: caller must have the User/Company Administrator role; non-admin tokens get 401 even with identity.user.ids.read. Use searchusers for filtered queries. The returned id is the UUID to use as userid in other tools.
search_users
Search Concur users via Identity v4.1 SCIM (POST /Users/.search). Filter by userName, name, emails, active status, or raw SCIM expression. Admin-only: caller must have the User/Company Administrator role; non-admin tokens get 401 even with the read scopes. Use list_users for unfiltered listing.
validate_credential
Validate the connected Concur account by fetching the authenticated principal's profile.
submit_report
Submit an unsubmitted expense report for approval. The authenticated user must own the report (TRAVELER context). If submission fails with red-flag exceptions, call listreportexceptions to see which rules are blocking, fix the entries, and retry.
approve_report
Approve a submitted expense report (MANAGER context). Pass userid to approve as a delegate. Use listreportstoapprove to find pending IDs.
sendback_report
Send a submitted report back to the submitter for changes (MANAGER context). Comment is required. Pass user_id to send back as a delegate.

How to set up Merge Agent Handler
In an mcp.json file, add the configuration below, and restart Cursor.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "url": "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
5 "headers": {
6 "Authorization": "Bearer yMt*****"
7 }
8 }
9 }
10}
11Open your Claude Desktop configuration file and add the server configuration below. You'll also need to restart the application for the changes to take effect.
Make sure Claude is using the Node v20+.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "yMt*****"
14 }
15 }
16 }
17}Open your Windsurf MCP configuration file and add the server configuration below.
Click on the refresh button in the top right of the Manage MCP server page or in the top right of the chat box in the box icon.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api.merge.dev/api/v1/tool-packs/<tool-pack-id>/registered-users/<registered-user-id>/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "<ah-production-access-key>"
14 }
15 }
16 }
17 }In Command Palette (Cmd+Shift+P on macOS, Ctrl+Shift+P on Windows), run "MCP: Open User Configuration".
You can then add the configuration below and press "start" right under servers. Enter the auth token when prompted.
Learn more in the official documentation ↗
1{
2 "inputs": [
3 {
4 "type": "promptString",
5 "id": "agent-handler-auth",
6 "description": "Agent Handler AUTH_TOKEN", // "yMt*****" when prompt
7 "password": true
8 }
9 ],
10 "servers": {
11 "agent-handler": {
12 "type": "stdio",
13 "command": "npx",
14 "args": [
15 "-y",
16 "mcp-remote@latest",
17 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
18 "--header",
19 "Authorization: Bearer ${input:agent-handler-auth}"
20 ]
21 }
22 }
23}FAQs on using Merge's Concur MCP server
FAQs on using Merge's Concur MCP server
What is a Concur MCP?
It's an MCP server that gives your agents access to SAP Concur expense management data and functionality through tools. Your agents can invoke these tools to retrieve and submit expense reports, upload receipts, approve or send back reports, manage quick expenses, and more.
SAP doesn't offer an MCP server purpose built for Concur, but you can use one from a third-party platform, like Merge Agent Handler.
How can I use the Concur MCP server?
The use cases naturally depend on the agent you've built, but here are a few common ones:
- Automated expense report creation: When an employee books travel through a third-party tool, an agent creates a Concur report, adds the relevant expense line items, attaches receipt images, and submits the report for approval, removing the manual filing step entirely
- Approval queue management: A manager's AI monitors the
list_reports_to_approvequeue each morning, surfaces any reports that exceed policy thresholds, and drafts a summary for the manager to review before approving or sending back with comments
- Month-end spend reconciliation: On a scheduled cadence, an agent exports all submitted reports for a given period, cross-references expense amounts against budget data in a finance system, and flags any categories over threshold for the accounting team
- Receipt digitization workflow: When a receipt image lands in a shared inbox, an agent uploads it to Concur via
upload_receipt_image_only, associates it with the matching expense line, and notifies the employee that the receipt has been attached
What are popular tools for Concur's MCP server?
Here are some of the most commonly used tools:
list_reports: retrieves expense reports filtered by status, date range, or employee. Call this when an agent needs a current view of submitted or pending reports before generating a summary or triggering downstream actions
create_report: opens a new expense report in Concur with a specified name and policy. Use this when an agent needs to group a set of expenses under a fresh report before submitting for approval
create_report_expense: adds an expense line item to an existing report with amount, category, and date. Helpful when an agent is logging expenses automatically based on external events like bookings or card transactions
submit_report: advances a report into the approval workflow. Good for workflows that complete all expense entry automatically and need to hand the report off to a manager without human intervention
approve_report: approves a report that is pending manager or auditor sign-off. Use this when an agent validates expenses against policy and determines the report meets all criteria for approval
upload_receipt: attaches a receipt file to an existing expense entry. Useful for agents that process inbound receipt images and need to associate them with the correct expense line in a report
What makes Merge Agent Handler's Concur MCP server better than alternative Concur MCP servers?
A few things distinguish Merge Agent Handler's Concur MCP server from building your own or using a standalone alternative:
- Enterprise-grade security and DLP: Merge Agent Handler includes built-in data loss prevention controls that let you block or redact sensitive fields before they reach an agent. For Concur, this means expense amounts, employee reimbursement data, and corporate card details can be filtered at the tool layer even when the agent has broad read access
- Managed authentication and credentials: Merge stores your Concur OAuth credentials and manages token refresh on your behalf. You never expose raw API tokens to an agent or handle re-authentication when sessions expire
- Real-time observability and audit trail: Every Concur tool call is logged with timestamp, tool name, input parameters, and response metadata. Finance and compliance teams can audit exactly what an agent read, submitted, or approved without any additional instrumentation
- Tool Packs and controlled access: Tool Packs let you assemble the specific Concur tools an agent needs alongside tools from other connectors, all in one scoped endpoint. A reconciliation agent gets read access to reports and receipts. An approval agent gets submit and approve tools. Neither has access to operations outside its defined scope
How can I start using Merge Agent Handler's Concur MCP server?
You can take the following steps (assuming you use Claude Code):
1. Create or log into your Merge Agent Handler account.
2. Install the Merge CLI by running pipx install merge-api, then run merge configure to link the CLI to your Merge account and merge login to authenticate your session.
3. Register the Agent Handler MCP server with Claude Code by running claude mcp add --transport http agent-handler https://ah-api.merge.dev/mcp, then open Claude Code and run /mcp to confirm agent-handler appears with a connected status.
4. Select agent-handler from the MCP list. This opens a browser window where you select which integrations to authenticate. Choose Concur and complete the OAuth flow. Merge stores and manages the credentials going forward.
5. Open a Claude Code session and start querying Concur data directly. The first time you use a Concur tool, a Magic Link may appear to complete connector authentication.
If you want to connect Merge Agent Handler's Concur MCP with internal or customer-facing agentic products, you can follow the steps in our docs.
Can employees use Merge Agent Handler to connect their AI tools to Concur?
Yes, Agent Handler for Employees lets your employees connect Claude, ChatGPT, Microsoft Copilot, Cursor, Codex, and other MCP-compatible AI tools to Concur without bypassing IT governance.
Instead of setting up direct connections with personal credentials that IT can't monitor or revoke, each employee authenticates through Agent Handler and gets individual credentials tied to their identity. A finance analyst can ask their AI to pull submitted reports, flag over-budget categories, or retrieve pending approvals, all within the permissions IT has defined.
IT also provisions access by role or group via SCIM. A finance manager, for example, gets Concur access to review and approve expense reports, NetSuite to reconcile submitted spend against budget lines, and Slack to coordinate with employees on outstanding submissions; while a field sales rep gets Concur access to submit and track travel expenses, Salesforce to log client meetings and trips, and Gmail to manage receipts and reimbursement correspondence.
Every tool call an employee's AI makes to Concur is also inspected against your DLP rules and logged to a searchable audit trail, giving security teams full visibility into what data was accessed and by whom.
Ready to try it out?
Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now
























