SAP Concur Expense · Capability

SAP Concur Expense Reporting and Approval

Unified workflow capability for the full expense report lifecycle in SAP Concur: creating reports, adding expense entries, submitting for approval, tracking approval status, and monitoring reimbursement payment batches. Designed for finance teams, expense managers, and ERP integration partners managing employee expense reimbursement end-to-end.

Run with Naftiko Expense ManagementFinancial ManagementApproval WorkflowReimbursementSAP Concur

What You Can Do

GET
List reports — List expense reports with status filtering
/v1/reports
POST
Create report — Create a new expense report
/v1/reports
GET
Get report — Get an expense report by ID
/v1/reports/{id}
PUT
Update report — Update an expense report
/v1/reports/{id}
DELETE
Delete report — Delete a draft expense report
/v1/reports/{id}
GET
List entries — List expense entries for a report
/v1/entries
POST
Create entry — Add an expense entry to a report
/v1/entries
GET
Get entry — Get an expense entry by ID
/v1/entries/{id}
DELETE
Delete entry — Delete an expense entry
/v1/entries/{id}
GET
List payment batches — List payment batches for reimbursement
/v1/payment-batches
GET
List configurations — List expense group configurations and policies
/v1/configurations

MCP Tools

list-expense-reports

List expense reports with optional filtering by approval status (A_PEND, A_APPR, A_FILE) or payment status (P_NOTP, P_PROC, P_PAID).

read-only
get-expense-report

Retrieve full details of a specific expense report including status, totals, and owner information.

read-only
create-expense-report

Create a new expense report for an employee. Requires a report name and optional business purpose and policy ID.

update-expense-report

Update an existing draft expense report's name or purpose.

idempotent
delete-expense-report

Delete a draft expense report that has not been submitted.

idempotent
list-expense-entries

List all expense line items within a specific expense report. Requires the reportID parameter.

read-only
get-expense-entry

Retrieve a specific expense entry with full details.

read-only
create-expense-entry

Add a new expense line item to a draft expense report. Requires report ID, expense type code, transaction date, amount, and currency.

delete-expense-entry

Remove an expense entry from a draft expense report.

idempotent
list-payment-batches

List payment batches containing approved expense reports ready for employee reimbursement. Useful for ERP payment reconciliation.

read-only
list-expense-group-configurations

List expense group policy configurations showing available expense types, payment types, and approval workflow settings.

read-only

Capability Spec

expense-reporting-and-approval.yaml Raw ↑
naftiko: 1.0.0-alpha2
info:
  label: SAP Concur Expense Reporting and Approval
  description: 'Unified workflow capability for the full expense report lifecycle in SAP Concur: creating reports, adding
    expense entries, submitting for approval, tracking approval status, and monitoring reimbursement payment batches. Designed
    for finance teams, expense managers, and ERP integration partners managing employee expense reimbursement end-to-end.'
  tags:
  - Expense Management
  - Financial Management
  - Approval Workflow
  - Reimbursement
  - SAP Concur
  created: '2026-05-02'
  modified: '2026-05-06'
binds:
- namespace: env
  keys:
    CONCUR_OAUTH_TOKEN: CONCUR_OAUTH_TOKEN
capability:
  consumes:
  - type: http
    namespace: concur-expense-report
    baseUri: https://us.api.concursolutions.com/api/v3.0
    description: SAP Concur Expense Report v3 API
    authentication:
      type: bearer
      token: '{{CONCUR_OAUTH_TOKEN}}'
    resources:
    - name: expense-reports
      path: /expense/reports
      description: Expense report collection
      operations:
      - name: list-expense-reports
        method: GET
        description: List expense reports for the current user
        inputParameters:
        - name: approvalStatusCode
          in: query
          type: string
          required: false
          description: Filter by approval status code
        - name: paymentStatusCode
          in: query
          type: string
          required: false
          description: Filter by payment status code
        - name: limit
          in: query
          type: integer
          required: false
          description: Number of records to return (max 100)
        - name: offset
          in: query
          type: string
          required: false
          description: Pagination offset
        outputRawFormat: json
        outputParameters:
        - name: result
          type: object
          value: $.
      - name: create-expense-report
        method: POST
        description: Create a new expense report
        outputRawFormat: json
        outputParameters:
        - name: result
          type: object
          value: $.
        body:
          type: json
          data:
            Name: '{{tools.name}}'
            Purpose: '{{tools.purpose}}'
            PolicyID: '{{tools.policyId}}'
    - name: expense-report-by-id
      path: /expense/reports/{id}
      description: Single expense report operations
      operations:
      - name: get-expense-report
        method: GET
        description: Retrieve a specific expense report by ID
        inputParameters:
        - name: id
          in: path
          type: string
          required: true
          description: The expense report ID
        outputRawFormat: json
        outputParameters:
        - name: result
          type: object
          value: $.
      - name: update-expense-report
        method: PUT
        description: Update an expense report
        inputParameters:
        - name: id
          in: path
          type: string
          required: true
          description: The expense report ID
        outputRawFormat: json
        outputParameters:
        - name: result
          type: object
          value: $.
        body:
          type: json
          data:
            Name: '{{tools.name}}'
            Purpose: '{{tools.purpose}}'
      - name: delete-expense-report
        method: DELETE
        description: Delete a draft expense report
        inputParameters:
        - name: id
          in: path
          type: string
          required: true
          description: The expense report ID
        outputRawFormat: json
        outputParameters:
        - name: result
          type: object
          value: $.
    - name: expense-entries
      path: /expense/entries
      description: Expense entry collection
      operations:
      - name: list-expense-entries
        method: GET
        description: List expense entries for a report
        inputParameters:
        - name: reportID
          in: query
          type: string
          required: true
          description: The expense report ID
        - name: limit
          in: query
          type: integer
          required: false
          description: Number of records to return
        outputRawFormat: json
        outputParameters:
        - name: result
          type: object
          value: $.
      - name: create-expense-entry
        method: POST
        description: Create a new expense entry within a report
        outputRawFormat: json
        outputParameters:
        - name: result
          type: object
          value: $.
        body:
          type: json
          data:
            ReportID: '{{tools.reportId}}'
            ExpenseTypeCode: '{{tools.expenseTypeCode}}'
            TransactionDate: '{{tools.transactionDate}}'
            TransactionAmount: '{{tools.transactionAmount}}'
            TransactionCurrencyCode: '{{tools.currencyCode}}'
            BusinessPurpose: '{{tools.businessPurpose}}'
            VendorDescription: '{{tools.vendor}}'
    - name: expense-entry-by-id
      path: /expense/entries/{id}
      description: Single expense entry operations
      operations:
      - name: get-expense-entry
        method: GET
        description: Retrieve a specific expense entry by ID
        inputParameters:
        - name: id
          in: path
          type: string
          required: true
          description: The expense entry ID
        outputRawFormat: json
        outputParameters:
        - name: result
          type: object
          value: $.
      - name: delete-expense-entry
        method: DELETE
        description: Delete an expense entry from a draft report
        inputParameters:
        - name: id
          in: path
          type: string
          required: true
          description: The expense entry ID
        outputRawFormat: json
        outputParameters:
        - name: result
          type: object
          value: $.
    - name: payment-batches
      path: /expense/paymentbatches
      description: Payment batch management
      operations:
      - name: list-payment-batches
        method: GET
        description: List payment batches for reimbursement
        inputParameters:
        - name: limit
          in: query
          type: integer
          required: false
          description: Number of records to return
        outputRawFormat: json
        outputParameters:
        - name: result
          type: object
          value: $.
    - name: expense-group-configs
      path: /expense/expensegroupconfigurations
      description: Expense policy configuration
      operations:
      - name: list-expense-group-configurations
        method: GET
        description: List expense group policy configurations
        outputRawFormat: json
        outputParameters:
        - name: result
          type: object
          value: $.
  exposes:
  - type: rest
    port: 8080
    namespace: expense-reporting-api
    description: Unified REST API for expense report lifecycle management and approval workflow.
    resources:
    - path: /v1/reports
      name: reports
      description: Expense report management
      operations:
      - method: GET
        name: list-reports
        description: List expense reports with status filtering
        call: concur-expense-report.list-expense-reports
        with:
          approvalStatusCode: rest.approvalStatusCode
          paymentStatusCode: rest.paymentStatusCode
          limit: rest.limit
        outputParameters:
        - type: object
          mapping: $.
      - method: POST
        name: create-report
        description: Create a new expense report
        call: concur-expense-report.create-expense-report
        outputParameters:
        - type: object
          mapping: $.
    - path: /v1/reports/{id}
      name: report-detail
      description: Single expense report operations
      operations:
      - method: GET
        name: get-report
        description: Get an expense report by ID
        call: concur-expense-report.get-expense-report
        with:
          id: rest.id
        outputParameters:
        - type: object
          mapping: $.
      - method: PUT
        name: update-report
        description: Update an expense report
        call: concur-expense-report.update-expense-report
        with:
          id: rest.id
        outputParameters:
        - type: object
          mapping: $.
      - method: DELETE
        name: delete-report
        description: Delete a draft expense report
        call: concur-expense-report.delete-expense-report
        with:
          id: rest.id
        outputParameters:
        - type: object
          mapping: $.
    - path: /v1/entries
      name: entries
      description: Expense entry line items
      operations:
      - method: GET
        name: list-entries
        description: List expense entries for a report
        call: concur-expense-report.list-expense-entries
        with:
          reportID: rest.reportID
        outputParameters:
        - type: object
          mapping: $.
      - method: POST
        name: create-entry
        description: Add an expense entry to a report
        call: concur-expense-report.create-expense-entry
        outputParameters:
        - type: object
          mapping: $.
    - path: /v1/entries/{id}
      name: entry-detail
      description: Single expense entry
      operations:
      - method: GET
        name: get-entry
        description: Get an expense entry by ID
        call: concur-expense-report.get-expense-entry
        with:
          id: rest.id
        outputParameters:
        - type: object
          mapping: $.
      - method: DELETE
        name: delete-entry
        description: Delete an expense entry
        call: concur-expense-report.delete-expense-entry
        with:
          id: rest.id
        outputParameters:
        - type: object
          mapping: $.
    - path: /v1/payment-batches
      name: payment-batches
      description: Reimbursement payment batch tracking
      operations:
      - method: GET
        name: list-payment-batches
        description: List payment batches for reimbursement
        call: concur-expense-report.list-payment-batches
        outputParameters:
        - type: object
          mapping: $.
    - path: /v1/configurations
      name: configurations
      description: Expense group policy configuration
      operations:
      - method: GET
        name: list-configurations
        description: List expense group configurations and policies
        call: concur-expense-report.list-expense-group-configurations
        outputParameters:
        - type: object
          mapping: $.
  - type: mcp
    port: 9090
    namespace: expense-reporting-mcp
    transport: http
    description: MCP server for AI-assisted expense report management and approval tracking.
    tools:
    - name: list-expense-reports
      description: List expense reports with optional filtering by approval status (A_PEND, A_APPR, A_FILE) or payment status
        (P_NOTP, P_PROC, P_PAID).
      hints:
        readOnly: true
        openWorld: true
      call: concur-expense-report.list-expense-reports
      with:
        approvalStatusCode: tools.approvalStatusCode
        paymentStatusCode: tools.paymentStatusCode
        limit: tools.limit
      outputParameters:
      - type: object
        mapping: $.
    - name: get-expense-report
      description: Retrieve full details of a specific expense report including status, totals, and owner information.
      hints:
        readOnly: true
        openWorld: false
      call: concur-expense-report.get-expense-report
      with:
        id: tools.id
      outputParameters:
      - type: object
        mapping: $.
    - name: create-expense-report
      description: Create a new expense report for an employee. Requires a report name and optional business purpose and policy
        ID.
      hints:
        readOnly: false
        destructive: false
      call: concur-expense-report.create-expense-report
      with:
        name: tools.name
        purpose: tools.purpose
        policyId: tools.policyId
      outputParameters:
      - type: object
        mapping: $.
    - name: update-expense-report
      description: Update an existing draft expense report's name or purpose.
      hints:
        readOnly: false
        destructive: false
        idempotent: true
      call: concur-expense-report.update-expense-report
      with:
        id: tools.id
        name: tools.name
        purpose: tools.purpose
      outputParameters:
      - type: object
        mapping: $.
    - name: delete-expense-report
      description: Delete a draft expense report that has not been submitted.
      hints:
        readOnly: false
        destructive: true
        idempotent: true
      call: concur-expense-report.delete-expense-report
      with:
        id: tools.id
      outputParameters:
      - type: object
        mapping: $.
    - name: list-expense-entries
      description: List all expense line items within a specific expense report. Requires the reportID parameter.
      hints:
        readOnly: true
        openWorld: true
      call: concur-expense-report.list-expense-entries
      with:
        reportID: tools.reportID
      outputParameters:
      - type: object
        mapping: $.
    - name: get-expense-entry
      description: Retrieve a specific expense entry with full details.
      hints:
        readOnly: true
        openWorld: false
      call: concur-expense-report.get-expense-entry
      with:
        id: tools.id
      outputParameters:
      - type: object
        mapping: $.
    - name: create-expense-entry
      description: Add a new expense line item to a draft expense report. Requires report ID, expense type code, transaction
        date, amount, and currency.
      hints:
        readOnly: false
        destructive: false
      call: concur-expense-report.create-expense-entry
      with:
        reportId: tools.reportId
        expenseTypeCode: tools.expenseTypeCode
        transactionDate: tools.transactionDate
        transactionAmount: tools.transactionAmount
        currencyCode: tools.currencyCode
        businessPurpose: tools.businessPurpose
        vendor: tools.vendor
      outputParameters:
      - type: object
        mapping: $.
    - name: delete-expense-entry
      description: Remove an expense entry from a draft expense report.
      hints:
        readOnly: false
        destructive: true
        idempotent: true
      call: concur-expense-report.delete-expense-entry
      with:
        id: tools.id
      outputParameters:
      - type: object
        mapping: $.
    - name: list-payment-batches
      description: List payment batches containing approved expense reports ready for employee reimbursement. Useful for ERP
        payment reconciliation.
      hints:
        readOnly: true
        openWorld: true
      call: concur-expense-report.list-payment-batches
      outputParameters:
      - type: object
        mapping: $.
    - name: list-expense-group-configurations
      description: List expense group policy configurations showing available expense types, payment types, and approval workflow
        settings.
      hints:
        readOnly: true
        openWorld: true
      call: concur-expense-report.list-expense-group-configurations
      outputParameters:
      - type: object
        mapping: $.