SAP Concur MCP Server
Create a powerful Model Context Protocol (MCP) server for SAP Concur in minutes with our AI Gateway. This guide walks you through setting up seamless expense and travel management integration with automated workflows and instant OAuth authentication.
About SAP Concur API
SAP Concur is the world's leading travel, expense, and invoice management solution. The API enables comprehensive integration with expense reporting, travel booking, receipt management, and financial systems, streamlining business spend management.
Key Capabilities
- Expense Management: Reports, receipts, approvals
- Travel Booking: Flights, hotels, car rentals
- Invoice Processing: AP automation, payment processing
- Receipt Capture: OCR, mobile scanning, e-receipts
- Credit Card Integration: Corporate card feeds
- Policy Compliance: Rules engine, audit trails
- Reporting: Analytics, insights, forecasting
- Mobile Access: iOS/Android apps, offline support
API Features
- RESTful APIs: Modern JSON interfaces
- OAuth 2.0: Secure authentication
- Webhooks: Real-time notifications
- Bulk Operations: Mass data processing
- Image Handling: Receipt image API
- Geolocation: Location-based services
- Multi-currency: Global support
- SDK Support: Multiple languages
What You Can Do with SAP Concur MCP Server
The MCP server transforms SAP Concur API into a natural language interface, enabling AI agents to:
Expense Management
-
Expense Reports
- "Create new expense report"
- "Submit report for approval"
- "Check report status"
- "Add expenses to report"
-
Expense Entries
- "Add meal expense for $45.50"
- "Create mileage entry"
- "Split expense between projects"
- "Itemize hotel bill"
-
Receipt Management
- "Upload receipt image"
- "Match receipt to expense"
- "Extract data from receipt"
- "Flag missing receipts"
Travel Management
-
Trip Booking
- "Book flight to New York"
- "Reserve hotel near conference"
- "Rent car for business trip"
- "Create travel itinerary"
-
Travel Requests
- "Submit travel request"
- "Get travel pre-approval"
- "Check policy compliance"
- "Estimate trip cost"
-
Itinerary Management
- "View upcoming trips"
- "Share itinerary"
- "Update travel plans"
- "Cancel reservations"
Corporate Card Integration
-
Card Transactions
- "Import card charges"
- "Match to expenses"
- "Flag personal charges"
- "Reconcile statements"
-
Card Management
- "Activate new card"
- "Report lost card"
- "Update card details"
- "Set spending limits"
Approval Workflows
-
Report Approvals
- "Approve pending reports"
- "Request additional info"
- "Reject non-compliant expenses"
- "Delegate approvals"
-
Policy Enforcement
- "Check policy violations"
- "Override with reason"
- "Escalate exceptions"
- "Update approval chain"
Mobile Features
-
Receipt Capture
- "Scan receipt with phone"
- "Auto-categorize expense"
- "Quick expense entry"
- "Offline mode sync"
-
On-the-go Management
- "Submit from mobile"
- "Approve via app"
- "Track reimbursement"
- "View notifications"
Analytics & Reporting
-
Spend Analysis
- "Show spending by category"
- "Track budget vs actual"
- "Identify cost savings"
- "Forecast travel spend"
-
Compliance Reports
- "List policy violations"
- "Audit expense reports"
- "Track approval times"
- "Monitor fraud risk"
-
Custom Reports
- "Export to Excel"
- "Create dashboards"
- "Schedule reports"
- "Share insights"
Integration Features
-
ERP Integration
- "Sync to SAP"
- "Export to QuickBooks"
- "Update GL codes"
- "Post to accounting"
-
Data Extract
- "Pull expense data"
- "Get user list"
- "Export receipts"
- "Backup reports"
Prerequisites
- Access to Cequence AI Gateway
- SAP Concur account (Standard or Professional)
- Admin or Web Services Admin role
- OAuth 2.0 app registration
Step 1: Configure SAP Concur API Access
1.1 Register OAuth App
- Log in to Concur Partner Portal
- Navigate to Manage Apps Create New App
- Configure app:
- App Name: "AI Gateway Integration"
- App Type: Partner Application
- Scopes: Select required scopes
1.2 Configure OAuth Settings
- Set OAuth 2.0 parameters:
- Redirect URI: From AI Gateway
- Grant Types: Authorization Code, Refresh Token
- Token Lifetime: Configure as needed
1.3 Get Credentials
Note down:
- Client ID
- Client Secret
- Company UUID
- Data Center (US, EU, etc.)
1.4 Configure Permissions
Essential scopes:
expense.report.read
expense.report.readwrite
travel.request.read
receipts.read
user.read
Step 2-4: Standard Setup
Follow standard steps to access AI Gateway, find SAP Concur API, and create MCP server.
Step 5: Configure API Endpoints
- Base URL:
- US:
https://us.api.concursolutions.com
- EU:
https://emea.api.concursolutions.com
- US:
- API Version: v4.0 (latest)
- Company UUID: Your organization ID
- Click Next
Step 6: MCP Server Configuration
- Name: "SAP Concur Expense"
- Description: "Travel and expense management"
- Timeout: 60 seconds
- Click Next
Step 7: Configure Authentication
- Authentication Type: OAuth 2.0
- Authorization URL:
https://us.api.concursolutions.com/oauth2/v0/authorize
- Token URL:
https://us.api.concursolutions.com/oauth2/v0/token
- Client ID & Secret: From app registration
- Configure required scopes
Available SAP Concur API Operations
Expense APIs
-
Reports
- Create report
- Submit report
- Get report details
- List reports
-
Entries
- Create entry
- Update entry
- Delete entry
- Itemize expense
-
Receipts
- Upload image
- Get receipt
- Match receipt
- OCR data
Travel APIs
-
Requests
- Create request
- Get approval
- Update request
- Cancel request
-
Itineraries
- Get trips
- Book travel
- Update bookings
- Share itinerary
User APIs
- Profile
- Get user info
- Update profile
- Manage delegates
- Set preferences
List APIs
- Reference Data
- Expense types
- Payment types
- Vendors
- Locations
Step 8-10: Complete Setup
Configure security settings, choose deployment options, and deploy your server.
Using Your SAP Concur MCP Server
With Claude Desktop
{
"servers": {
"sap-concur": {
"url": "your-mcp-server-url",
"auth": {
"type": "oauth2",
"client_id": "your-client-id",
"client_secret": "your-client-secret",
"company_uuid": "your-company-uuid"
}
}
}
}
Natural Language Commands
- "Create expense report for San Francisco trip"
- "Add $127.50 dinner expense with client"
- "Submit my pending expense report"
- "Show all unapproved reports for my team"
- "Book flight to Chicago for next Tuesday"
API Integration Example
// Initialize MCP client
const mcpClient = new MCPClient({
serverUrl: 'your-mcp-server-url',
auth: {
type: 'oauth2',
clientId: 'your-client-id',
clientSecret: 'your-client-secret',
companyUuid: 'your-company-uuid'
}
});
// Create expense report
const report = await mcpClient.concur.createExpenseReport({
name: 'Q1 Sales Conference - San Francisco',
purpose: 'Annual sales team conference and client meetings',
startDate: '2025-02-15',
endDate: '2025-02-18',
comment: 'Attended sales conference and met with 3 key clients',
customData: {
project: 'SALES-2025',
costCenter: 'CC-SALES-001'
}
});
console.log(`Created report: ${report.reportId}`);
// Add flight expense
const flightExpense = await mcpClient.concur.createExpense({
reportId: report.reportId,
expenseType: 'AIRFR',
transactionDate: '2025-02-15',
amount: {
value: 450.00,
currencyCode: 'USD'
},
vendor: {
name: 'United Airlines',
description: 'SFO-ORD Round Trip'
},
locationName: 'San Francisco, CA',
isBillable: true,
isPersonal: false,
comment: 'Economy class, booked 2 weeks in advance'
});
// Add hotel expense with itemization
const hotelExpense = await mcpClient.concur.createExpense({
reportId: report.reportId,
expenseType: 'LODNG',
transactionDate: '2025-02-15',
amount: {
value: 567.42,
currencyCode: 'USD'
},
vendor: {
name: 'Hilton San Francisco',
description: '3 nights stay'
},
hasItemizations: true
});
// Itemize hotel charges
const itemizations = [
{
expenseType: 'LODNG',
description: 'Room charges',
amount: { value: 450.00, currencyCode: 'USD' },
dailyRate: 150.00,
numberOfNights: 3
},
{
expenseType: 'PACKG',
description: 'Internet/WiFi',
amount: { value: 45.00, currencyCode: 'USD' }
},
{
expenseType: 'TAXIH',
description: 'Hotel tax',
amount: { value: 72.42, currencyCode: 'USD' }
}
];
for (const item of itemizations) {
await mcpClient.concur.createItemization({
reportId: report.reportId,
entryId: hotelExpense.entryId,
...item
});
}
// Add meal expense with attendees
const mealExpense = await mcpClient.concur.createExpense({
reportId: report.reportId,
expenseType: 'DINNR',
transactionDate: '2025-02-16',
amount: {
value: 245.80,
currencyCode: 'USD'
},
vendor: {
name: 'The French Laundry',
description: 'Client dinner'
},
hasAttendees: true,
attendeeCount: 4,
businessPurpose: 'Dinner with Acme Corp executives to discuss Q2 contract'
});
// Add attendees
const attendees = [
{
attendeeType: 'EMPLOYEE',
name: 'John Smith',
company: 'Our Company',
title: 'VP Sales'
},
{
attendeeType: 'CLIENT',
name: 'Jane Doe',
company: 'Acme Corp',
title: 'CFO'
},
{
attendeeType: 'CLIENT',
name: 'Bob Johnson',
company: 'Acme Corp',
title: 'VP Procurement'
}
];
for (const attendee of attendees) {
await mcpClient.concur.addAttendee({
reportId: report.reportId,
entryId: mealExpense.entryId,
...attendee
});
}
// Add mileage expense
const mileageExpense = await mcpClient.concur.createMileageExpense({
reportId: report.reportId,
transactionDate: '2025-02-17',
journeyType: 'BUSINESS',
startLocation: 'San Francisco Airport',
endLocation: 'Client Office - Palo Alto',
distance: {
value: 35.2,
unit: 'MILES'
},
personalCarUsed: true,
comment: 'Drive to client site for presentation'
});
// Upload receipt image
const receiptImage = await mcpClient.concur.uploadReceipt({
image: fs.readFileSync('dinner-receipt.jpg'),
contentType: 'image/jpeg',
entryId: mealExpense.entryId
});
// OCR receipt data
const ocrData = await mcpClient.concur.getReceiptOCR({
receiptId: receiptImage.receiptId
});
console.log(`OCR extracted: ${ocrData.vendor.name} - $${ocrData.total}`);
// Import corporate card transactions
const cardTransactions = await mcpClient.concur.getCardTransactions({
cardNumber: '**** 1234',
fromDate: '2025-02-01',
toDate: '2025-02-28'
});
// Match card transactions to expenses
for (const transaction of cardTransactions) {
if (transaction.amount === 245.80 && transaction.merchantName.includes('FRENCH')) {
await mcpClient.concur.matchCardTransaction({
transactionId: transaction.id,
expenseId: mealExpense.entryId
});
}
}
// Check policy compliance
const complianceCheck = await mcpClient.concur.checkCompliance({
reportId: report.reportId
});
if (complianceCheck.hasViolations) {
console.log('Policy violations found:');
complianceCheck.violations.forEach(violation => {
console.log(`- ${violation.expenseType}: ${violation.message}`);
});
}
// Submit report for approval
const submission = await mcpClient.concur.submitReport({
reportId: report.reportId,
comment: 'All receipts attached, client meeting was successful'
});
console.log(`Report submitted, workflow ID: ${submission.workflowId}`);
// Manager: Get reports pending approval
const pendingReports = await mcpClient.concur.getPendingApprovals({
approverId: 'current-user'
});
console.log(`${pendingReports.length} reports awaiting approval`);
// Approve report with comment
const approval = await mcpClient.concur.approveReport({
reportId: pendingReports[0].reportId,
workflowId: pendingReports[0].workflowId,
comment: 'Approved - good client engagement',
approved: true
});
// Create travel request
const travelRequest = await mcpClient.concur.createTravelRequest({
name: 'Tech Conference - Las Vegas',
purpose: 'Attend AWS re:Invent 2025',
startDate: '2025-11-27',
endDate: '2025-12-01',
destinations: [{
city: 'Las Vegas',
state: 'NV',
country: 'US',
arrivalDate: '2025-11-27',
departureDate: '2025-12-01'
}],
estimatedCost: {
airfare: 600,
lodging: 800,
meals: 250,
other: 200,
total: 1850,
currency: 'USD'
},
comments: 'Early bird registration saves $200'
});
// Book travel through Concur Travel
const flightBooking = await mcpClient.concur.searchFlights({
origin: 'SFO',
destination: 'LAS',
departDate: '2025-11-27',
returnDate: '2025-12-01',
cabinClass: 'ECONOMY',
directOnly: false
});
// Select and book flight
const selectedFlight = flightBooking.results[0];
await mcpClient.concur.bookFlight({
travelRequestId: travelRequest.id,
flight: selectedFlight,
travelerInfo: {
firstName: 'John',
lastName: 'Doe',
email: 'john.doe@company.com',
phone: '+1-555-123-4567',
dateOfBirth: '1985-03-15',
tsa: {
redressNumber: '12345',
knownTravelerId: 'ABC123'
}
},
payment: {
type: 'CORPORATE_CARD',
lastFour: '1234'
},
seatPreference: 'AISLE'
});
// Generate expense report analytics
const analytics = await mcpClient.concur.getExpenseAnalytics({
startDate: '2025-01-01',
endDate: '2025-01-31',
groupBy: ['expenseType', 'project', 'employee'],
metrics: ['totalAmount', 'averageAmount', 'count']
});
console.log('\nExpense Analytics:');
console.log(`Total Spend: $${analytics.summary.totalAmount}`);
console.log(`Total Reports: ${analytics.summary.reportCount}`);
console.log('\nTop Categories:');
analytics.byExpenseType.slice(0, 5).forEach(cat => {
console.log(`- ${cat.name}: $${cat.totalAmount} (${cat.percentage}%)`);
});
// Set up expense report webhook
const webhook = await mcpClient.concur.createWebhook({
name: 'Report Status Updates',
events: [
'report.submitted',
'report.approved',
'report.paid',
'expense.flagged'
],
url: 'https://your-app.com/webhooks/concur',
configuration: {
includeDetails: true,
batchSize: 10
}
});
// Mobile receipt quick expense
const quickExpense = await mcpClient.concur.createQuickExpense({
receiptImage: mobilePhotoBase64,
useOCR: true,
autoMatch: true,
expenseData: {
paymentType: 'CASH',
comment: 'Taxi to airport'
}
});
// Delegate access management
await mcpClient.concur.addDelegate({
delegateEmail: 'assistant@company.com',
permissions: ['CREATE_REPORT', 'SUBMIT_REPORT'],
startDate: '2025-02-01',
endDate: '2025-12-31'
});
// Export data for accounting
const accountingExport = await mcpClient.concur.exportToERP({
reportIds: [report.reportId],
format: 'SAP',
includeDetails: true,
glMapping: {
'AIRFR': '6100-10',
'LODNG': '6100-20',
'MEALS': '6100-30'
}
});
// Download all receipts for a report
const receipts = await mcpClient.concur.downloadReceiptZip({
reportId: report.reportId,
format: 'PDF',
includeMetadata: true
});
fs.writeFileSync(`receipts-${report.reportId}.zip`, receipts);
Common Use Cases
Expense Management
- Expense report creation
- Receipt management
- Policy compliance
- Approval workflows
Travel Management
- Pre-trip approval
- Travel booking
- Itinerary management
- Duty of care
Financial Integration
- ERP synchronization
- Credit card reconciliation
- Budget tracking
- Cost allocation
Mobile Scenarios
- Receipt capture
- Quick expenses
- Mileage tracking
- Offline support
Best Practices
-
Data Accuracy:
- Validate amounts
- Use correct expense types
- Include detailed descriptions
- Attach all receipts
-
Compliance:
- Check policies before submission
- Document exceptions
- Include business purpose
- Track approvals
-
Integration:
- Sync regularly
- Handle errors gracefully
- Map GL codes correctly
- Validate data integrity
Troubleshooting
Common Issues
-
Authentication Errors
- Verify OAuth credentials
- Check token expiration
- Confirm user permissions
- Review company UUID
-
Data Validation
- Check required fields
- Validate expense types
- Verify date formats
- Confirm currency codes
-
Receipt Issues
- Check image quality
- Verify file size limits
- Ensure supported formats
- Review OCR results
Getting Help
- Documentation: AI Gateway Docs
- Support: support@cequence.ai
- Concur Support: community.concur.com