Coupa procurement MCP connector for Power Platform
April 01, 2026
Coupa runs procurement for thousands of enterprises—purchase orders, invoices, requisitions, supplier management, contracts, approvals, and expense reports. My connector brings the Coupa Core API into Power Platform with 13 MCP tools for Copilot Studio and 47 REST operations for Power Automate and Power Apps. OAuth 2.0 handles authentication through Coupa’s OpenID Connect client.
Full source: GitHub repository
Tools
MCP tools for Copilot Studio
| Tool | Description |
|---|---|
list_purchase_orders |
Query POs with filters for status, supplier, PO number, and date |
get_purchase_order |
Get full PO details including line items |
list_invoices |
Query invoices with status, number, supplier, and date filters |
get_invoice |
Get invoice details with line items, taxes, and payment info |
list_requisitions |
Query requisitions by status and date |
get_requisition |
Get requisition details with all lines |
list_suppliers |
Query suppliers by name, status |
get_supplier |
Get full supplier details |
list_approvals |
Query approvals by status and approvable type |
list_contracts |
Query contracts by status and date |
get_contract |
Get contract details |
list_users |
Query users by email, login, or active status |
list_expense_reports |
Query expense reports by status and date |
How it works
User: "Show me all purchase orders from Zava that are still in draft"
1. Orchestrator calls list_purchase_orders({
supplier_name: "Zava",
status: "draft"
})
→ Returns POs with number, status, supplier, total, and line items
User: "Get me the details on PO-2026-0431"
2. Orchestrator calls get_purchase_order({ id: 12345 })
→ Returns full PO with all line items, ship-to address,
payment terms, currency, and transmission status
All list tools support limit, offset, and updated_after parameters for pagination and incremental sync.
REST operations for Power Automate and Power Apps
The connector exposes 47 typed operations across two categories:
Reference data (22 operations)
| Operation | Operation ID | Method |
|---|---|---|
| List Suppliers | ListSuppliers |
GET |
| Get Supplier | GetSupplier |
GET |
| Create Supplier | CreateSupplier |
POST |
| Update Supplier | UpdateSupplier |
PUT |
| List Users | ListUsers |
GET |
| Get User | GetUser |
GET |
| Create User | CreateUser |
POST |
| Update User | UpdateUser |
PUT |
| List Accounts | ListAccounts |
GET |
| Get Account | GetAccount |
GET |
| List Departments | ListDepartments |
GET |
| Get Department | GetDepartment |
GET |
| List Addresses | ListAddresses |
GET |
| Get Address | GetAddress |
GET |
| List Items | ListItems |
GET |
| Get Item | GetItem |
GET |
| List Currencies | ListCurrencies |
GET |
| List Payment Terms | ListPaymentTerms |
GET |
| List Exchange Rates | ListExchangeRates |
GET |
| List Lookup Values | ListLookupValues |
GET |
| List Projects | ListProjects |
GET |
| Get Project | GetProject |
GET |
Transactional (25 operations)
| Operation | Operation ID | Method |
|---|---|---|
| List Purchase Orders | ListPurchaseOrders |
GET |
| Get Purchase Order | GetPurchaseOrder |
GET |
| Create Purchase Order | CreatePurchaseOrder |
POST |
| Update Purchase Order | UpdatePurchaseOrder |
PUT |
| Issue Purchase Order | IssuePurchaseOrder |
PUT |
| Cancel Purchase Order | CancelPurchaseOrder |
PUT |
| Close Purchase Order | ClosePurchaseOrder |
PUT |
| List Purchase Order Lines | ListPurchaseOrderLines |
GET |
| List Invoices | ListInvoices |
GET |
| Get Invoice | GetInvoice |
GET |
| Create Invoice | CreateInvoice |
POST |
| Update Invoice | UpdateInvoice |
PUT |
| Submit Invoice | SubmitInvoice |
PUT |
| Void Invoice | VoidInvoice |
PUT |
| List Requisitions | ListRequisitions |
GET |
| Get Requisition | GetRequisition |
GET |
| Create Requisition | CreateRequisition |
POST |
| Update Requisition | UpdateRequisition |
PUT |
| List Approvals | ListApprovals |
GET |
| Get Approval | GetApproval |
GET |
| List Expense Reports | ListExpenseReports |
GET |
| Get Expense Report | GetExpenseReport |
GET |
| List Contracts | ListContracts |
GET |
| Get Contract | GetContract |
GET |
| List Receipts | ListReceipts |
GET |
PO lifecycle operations
The connector supports the full purchase order lifecycle through dedicated endpoints:
- Create (
CreatePurchaseOrder) — Create an external PO with supplier, ship-to address, currency, payment terms, and order lines - Update (
UpdatePurchaseOrder) — Modify status, shipping, payment terms, or mark as exported - Issue (
IssuePurchaseOrder) — Issue and transmit PO to the supplier via the configured method (cXML, XML, email, or buy online) - Cancel (
CancelPurchaseOrder) — Cancel an open PO - Close (
ClosePurchaseOrder) — Close a PO after completion
Invoice workflow
- Create (
CreateInvoice) — Create a draft invoice with supplier, currency, payment terms, and line items - Update (
UpdateInvoice) — Modify dates, comments, internal notes, or mark as exported - Submit (
SubmitInvoice) — Submit draft invoice for approval routing - Void (
VoidInvoice) — Void an approved invoice (works on approved, pending_receipt, or draft status)
Use cases
Procurement visibility: Ask your Copilot Studio agent “What POs are still in draft?” or “Show me all invoices pending approval from last week.” The MCP tools query Coupa and return structured results directly in conversation.
Supplier onboarding: Create suppliers with full details—PO transmission method (cXML, XML, email), payment method (invoice, pcard, virtual card), invoice matching level (2-way, 3-way, 3-way-direct), tax ID, and DUNS number.
Approval monitoring: Query pending approvals filtered by status and approvable type. Surface approvals that need attention without switching to the Coupa UI.
Spend reporting: Combine list operations across POs, invoices, and contracts to build spend visibility flows. Filter by supplier, date range, and status to track commitments and actuals.
ERP integration: Use the exported flag on POs, invoices, and requisitions to track which records have been synced to downstream systems. Update marks after successful export.
Prerequisites
- A Coupa instance with API access enabled
- An OAuth 2.0/OpenID Connect client configured in Coupa (Setup > Integrations > OAuth2/OpenID Connect Clients)
- API scopes assigned to the OIDC client (see required scopes below)
Setting up the connector
1. Configure the Coupa OIDC client
- In Coupa, navigate to Setup > Integrations > OAuth2/OpenID Connect Clients
- Select Create
- Select Authorization Code as the grant type
- Enter a name (for example, “Power Platform Connector”)
- Set the Redirect URI to
https://global.consent.azure-apim.net/redirect - Assign the required scopes:
core.purchase_order.read/core.purchase_order.writecore.invoice.read/core.invoice.writecore.requisition.read/core.requisition.writecore.supplier.read/core.supplier.writecore.user.read/core.user.writecore.accounting.readcore.common.readcore.expense.readcore.contract.readcore.approval.readoffline_access
- Save and note the Client ID and Client Secret
2. Update configuration files
apiDefinition.swagger.json: Replace YOUR_INSTANCE.coupahost.com in the host field and securityDefinitions URLs with your Coupa instance URL.
apiProperties.json: Replace YOUR_CLIENT_ID with your OIDC client identifier and YOUR_INSTANCE in the authorization, token, and refresh URLs.
3. Create the custom connector
- Go to Power Platform Maker Portal
- Navigate to Custom connectors > + New custom connector > Import an OpenAPI file
- Upload
apiDefinition.swagger.json - On the Security tab, verify the OAuth 2.0 settings match your OIDC client configuration
- On the Code tab:
- Enable Code
- Upload
script.csx
- Select Create connector
4. Create a connection
- Select Test > + New connection
- Sign in with your Coupa credentials
- Authorize the requested scopes
5. Add to Copilot Studio
- In Copilot Studio, open your agent
- Add this connector as an action—Copilot Studio detects the MCP endpoint via
x-ms-agentic-protocol - Test with prompts like “List all issued purchase orders” or “Show me invoices pending approval”
Authentication
| Setting | Value |
|---|---|
| Type | OAuth 2.0 (Authorization Code) |
| Authorization URL | https://{instance}.coupahost.com/oauth2/authorizations/new |
| Token URL | https://{instance}.coupahost.com/oauth2/token |
| Token expiry | 24 hours |
| Refresh token expiry | 90 days |
Design notes
- No DELETE operations: Coupa doesn’t support DELETE on any resource. Use PUT to deactivate records instead
- Pagination: List operations return up to 50 records by default. Use
offsetandlimitparameters for pagination - JSON only: The connector sets
Content-TypeandAcceptheaders toapplication/jsonon every request. The script layer handles this automatically - Rate limiting: Coupa recommends a 5-second buffer between token generation and the first API call
Known limitations
- Country-specific compliance fields aren’t included in the schema definitions to keep the connector manageable
- The GraphQL endpoint isn’t included—use the REST operations instead
- CSV flat file operations aren’t supported through this connector
Files
| File | Purpose |
|---|---|
apiDefinition.swagger.json |
OpenAPI 2.0 definition with MCP endpoint and 47 REST operations |
apiProperties.json |
OAuth 2.0 config and script operation bindings |
script.csx |
C# script handling MCP protocol, REST passthrough with header management, and query parameter mapping |
readme.md |
Setup and usage documentation |