Connect Epicor Kinetic to Claude: Streamline AP/AR and Vendor Workflows
Learn how to connect Epicor Kinetic to Claude using a managed MCP server. Execute BAQs, automate AP/AR, and control vendor workflows with natural language.
If your team needs to connect Epicor Kinetic to Claude to automate accounts payable, vendor management, or custom Business Activity Queries (BAQs), you need a Model Context Protocol (MCP) server. This server acts as the translation layer between Claude's LLM tool calls and Epicor's REST API. You can either build and maintain this infrastructure yourself, or use a managed integration platform like Truto to dynamically generate a secure, authenticated MCP server URL.
If your team uses ChatGPT, check out our guide on /connect-epicor-kinetic-to-chatgpt-manage-erp-orders-jobs-and-parts/ or explore our broader architectural overview on /connect-epicor-kinetic-to-ai-agents-automate-supply-chain-and-baqs/.
Giving a Large Language Model (LLM) read and write access to a sprawling enterprise resource planning (ERP) system like Epicor Kinetic is an engineering challenge. You have to handle complex OData filtering, map massive JSON schemas representing deeply nested Business Objects (BOs) to MCP tool definitions, and deal with strict referential integrity constraints. Every time your ERP admin publishes a new BAQ or modifies a custom field, you have to update your server code, redeploy, and test the integration.
This guide breaks down exactly how to use Truto to generate a secure, managed MCP server for Epicor Kinetic, connect it natively to Claude Desktop, and execute complex ERP workflows using natural language.
The Engineering Reality of the Epicor Kinetic API
A custom MCP server is a self-hosted integration layer. While the open MCP standard provides a predictable way for models to discover tools over JSON-RPC, the reality of implementing it against Epicor Kinetic's APIs is painful. Epicor is not a simple REST CRUD API. It exposes complex Business Objects (BOs) that enforce strict business logic at the API layer.
If you decide to build a custom Epicor Kinetic MCP server, here are the specific integration challenges you will face:
OData Filtering on Deeply Nested Business Objects
Epicor relies heavily on OData $filter syntax to query records out of endpoints like Erp.BO.APInvoiceSvc/APInvoices. An LLM cannot simply guess how to structure these queries. It needs explicit schema instructions indicating that VendorNum or InvoiceNum are queryable fields, and it needs to know how to format the OData string (e.g., VendorNum eq 5000). Without this, the LLM will hallucinate query parameters, resulting in HTTP 400 Bad Request errors.
Executing Business Activity Queries (BAQs)
Much of the real power in an Epicor instance is locked behind custom BAQs. These are effectively stored SQL views exposed over REST via the BaqSvc. To run a BAQ, you must pass the baq_id and any custom parameters that the specific BAQ expects (e.g., StartDate). An MCP server must be able to dynamically expose the list_all_epicor_kinetic_baq_results tool and instruct the LLM on how to pass arbitrary query parameters into the execution payload.
Referential Integrity and Empty 204 Responses
When you update or delete records in Epicor (e.g., a purchase order line), the API expects a PATCH or DELETE request and typically returns a 204 No Content on success. However, if that record has dependent data - like deleting an AP Invoice that has already been posted to the General Ledger - Epicor will throw a strict constraint violation. Your MCP server must catch these ERP-specific error formats and translate them into a coherent isError: true JSON-RPC response so Claude understands why the operation failed and can suggest a workaround to the user.
Strict Rate Limits (No Auto-Retries)
Epicor Kinetic enforces rate limits on API requests to protect database performance. It is critical to understand that Truto does not retry, throttle, or apply backoff on rate limit errors. When the upstream Epicor API returns an HTTP 429, Truto passes that error directly to the caller. Truto normalizes the upstream rate limit info into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF spec. The caller - your MCP client or AI agent orchestrator - is entirely responsible for reading these headers and implementing retry or exponential backoff logic.
Generating the Epicor Kinetic MCP Server
Truto derives MCP tools dynamically from the underlying API documentation and schemas. There is no manual mapping required. Once you connect an Epicor Kinetic account to Truto, you can generate an MCP server URL that instantly exposes the ERP's endpoints as LLM-ready tools.
You can create this server in two ways: via the Truto UI or programmatically via the API.
Method 1: Via the Truto UI
For internal tooling, quick testing, or deploying Claude Desktop across your finance team, the UI is the fastest path.
- Log into your Truto dashboard and navigate to the Integrated Accounts page.
- Select your connected Epicor Kinetic instance.
- Click the MCP Servers tab.
- Click Create MCP Server.
- Select your desired configuration. (For example, you can filter methods to only allow
readandlistoperations to ensure Claude cannot accidentally mutate financial data). - Click Generate and copy the resulting secure MCP server URL.
Method 2: Via the Truto API
If you are building an AI agent application and need to programmatically provision MCP servers for your end-users, you can use the Truto API.
Make an authenticated POST request to /integrated-account/:id/mcp. You can pass a config object to strictly scope the tools available to the LLM.
curl -X POST https://api.truto.one/integrated-account/<epicor_account_id>/mcp \
-H "Authorization: Bearer <YOUR_TRUTO_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"name": "Epicor AP Agent MCP",
"config": {
"methods": ["read", "list", "create", "update"]
},
"expires_at": "2026-12-31T23:59:59Z"
}'The API returns a secure, hashed token URL that is instantly ready to process JSON-RPC 2.0 messages.
{
"id": "mcp_8a9b0c1d2e",
"name": "Epicor AP Agent MCP",
"config": { "methods": ["read", "list", "create", "update"] },
"expires_at": "2026-12-31T23:59:59.000Z",
"url": "https://api.truto.one/mcp/tkn_f47ac10b58cc4372a56700c5a2b3492a"
}Connecting the MCP Server to Claude
Once you have your Truto MCP URL, connecting it to Claude is a zero-code process. The URL itself acts as the transport layer and authentication mechanism.
Method A: Via the Claude UI
If you are using the Claude desktop app or web interface on a supported enterprise plan:
- Open Claude and navigate to Settings > Integrations.
- Click Add MCP Server (or Custom Connector).
- Paste the Truto MCP URL (
https://api.truto.one/mcp/...). - Click Add. Claude will instantly perform a
tools/listhandshake and register the Epicor Kinetic tools.
Method B: Via Manual Config File
For developers running custom setups or local AI agent orchestrators, you can configure the connection via the standard claude_desktop_config.json file using the open-source Server-Sent Events (SSE) transport adapter.
Add the following JSON block to your configuration file:
{
"mcpServers": {
"epicor-kinetic": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-sse",
"https://api.truto.one/mcp/tkn_f47ac10b58cc4372a56700c5a2b3492a"
]
}
}
}Save the file and restart Claude Desktop. The LLM is now securely bridged to your Epicor instance.
Epicor Kinetic Hero Tools for Claude
Truto automatically generates tools by evaluating the underlying API resources and appending explicit JSON schemas that instruct the LLM on pagination, required fields, and data types.
Here are the highest-leverage tools exposed for Epicor Kinetic, designed to streamline AP, AR, and vendor operations.
list_all_epicor_kinetic_ap_invoices
This tool retrieves Accounts Payable invoices from Erp.BO.APInvoiceSvc. The LLM is instructed to use the filter parameter to apply OData logic (e.g. InvoiceNum eq 'INV-001'). It requires the vendor_num to scope the request. Truto automatically manages the 100-per-page pagination, injecting next_cursor tokens into the schema.
"Claude, check Epicor for any unpaid AP invoices associated with Vendor Number 5000 from the last 30 days."
create_a_epicor_kinetic_purchase_order
This tool executes a POST to Erp.BO.POSvc/POes. The LLM sends the POHeader columns it wants to set. Epicor handles filling in the default fields and auto-generating the system-assigned key. This is the starting point for agentic procurement workflows.
"Draft a new purchase order in Epicor for vendor ID 7200. Add a note that this is for the Q3 hardware refresh."
list_all_epicor_kinetic_vendors
Retrieves suppliers from Erp.BO.VendorSvc/Vendors. Useful for looking up VendorNum values before executing AP invoice or PO creation tools. The AI can filter by VendorID or name.
"Find the Epicor Vendor Number for 'Acme Corp' and tell me what their default payment terms are."
epicor_kinetic_business_object_methods_execute
The ultimate escape hatch. This tool allows the LLM to call any specific Business Object method via POST /api/v2/odata/<Company>/<service>/<method_name>. For example, executing Erp.BO.SalesOrderSvc GetNewOrderHed. The LLM passes the service and method name, along with a dynamic JSON body containing the method parameters.
"Call the GetByID method on the Erp.BO.CustomerSvc in Epicor for customer ID 1045 and return the full dataset."
list_all_epicor_kinetic_baq_results
This tool runs a Business Activity Query and returns the row data from GET BaqSvc/<baq_id>/Data. The LLM passes the baq_id and can inject arbitrary query parameters that match the BAQ's internal parameter definitions. This allows the AI to extract highly customized operational reports.
"Run the 'Open-Orders-By-Region' BAQ in Epicor, filter the results for the Midwest region, and summarize the total outstanding value."
list_all_epicor_kinetic_sales_orders
Retrieves AR sales orders from Erp.BO.SalesOrderSvc/SalesOrders. The LLM uses OData filtering (CustNum eq ...) to isolate orders for specific clients.
"Pull up all sales orders in Epicor for Customer Number 330 where the order status is currently open."
For the complete inventory of available Epicor Kinetic tools, including specific schema properties for jobs, quotes, parts, and customer shipments, see the Epicor Kinetic integration page.
Workflows in Action
Giving Claude access to individual tools is useful, but the real power of MCP is workflow orchestration. Claude can chain multiple Epicor API operations together to solve complex business problems without human intervention.
Workflow 1: AP Invoice Reconciliation
Accounts Payable teams spend hours manually cross-referencing invoices against open POs and vendor records. Claude can automate this entire reconciliation loop.
"Check if we have any pending AP invoices for Acme Corp. If we do, find their corresponding open purchase orders to ensure the billed amounts match the PO amounts."
flowchart TD
Claude["Claude Desktop"]
MCP["Truto MCP Server"]
Epicor["Epicor Kinetic API"]
Claude -->|"1. list_all_epicor_kinetic_vendors<br>(filter: Name eq 'Acme Corp')"| MCP
MCP -->|"GET Erp.BO.VendorSvc"| Epicor
Epicor -->|"Returns VendorNum: 5000"| MCP
MCP -->|"Result"| Claude
Claude -->|"2. list_all_epicor_kinetic_ap_invoices<br>(vendor_num: 5000)"| MCP
MCP -->|"GET Erp.BO.APInvoiceSvc"| Epicor
Epicor -->|"Returns Invoice list"| MCP
MCP -->|"Result"| Claude
Claude -->|"3. list_all_epicor_kinetic_purchase_orders<br>(filter: VendorNum eq 5000)"| MCP
MCP -->|"GET Erp.BO.POSvc"| Epicor
Epicor -->|"Returns PO list"| MCP
MCP -->|"Result"| ClaudeWhat happens:
- Claude realizes it needs the
VendorNumfirst. It callslist_all_epicor_kinetic_vendorsusing an OData filter for the name "Acme Corp". - Epicor returns
VendorNum: 5000. - Claude passes that ID into
list_all_epicor_kinetic_ap_invoicesto retrieve the pending invoices. - Claude uses the same ID to query
list_all_epicor_kinetic_purchase_orders. - Claude compares the totals in memory and returns a natural language summary identifying any discrepancies between the invoiced amount and the approved PO.
Workflow 2: Custom BAQ Execution for Supply Chain Audits
Supply chain managers often need highly specific data that isn't available in standard BO endpoints. By exposing BAQs to Claude, you can generate custom analytics on demand.
"Run the 'Supplier-Defect-Rate' BAQ for the trailing 90 days. Identify any vendor with a defect rate over 4% and draft an email to the procurement team summarizing the impact."
sequenceDiagram
participant User as User
participant Claude as Claude Desktop
participant MCP as Truto MCP Server
participant Epicor as Epicor Kinetic (BaqSvc)
User->>Claude: Run Supplier-Defect-Rate BAQ and analyze...
Claude->>MCP: list_all_epicor_kinetic_baq_results<br>(baq_id: "Supplier-Defect-Rate", Days: 90)
MCP->>Epicor: GET /BaqSvc/Supplier-Defect-Rate/Data?Days=90
Epicor-->>MCP: Paginated JSON rows
MCP-->>Claude: JSON result containing defect metrics
Claude->>User: Renders analysis and drafts emailWhat happens:
- Claude identifies the intent and calls
list_all_epicor_kinetic_baq_results. - It maps the requested timeframe to the BAQ's internal parameters (e.g.,
Days: 90). - Truto proxies the request to the
BaqSvcand pages through the dataset, passing the normalized JSON rows back to Claude. - Claude parses the data, isolates the vendors exceeding the 4% threshold, and outputs a formatted email draft for the user to review.
Security and Access Control
Exposing an ERP like Epicor Kinetic to an autonomous AI agent requires strict guardrails. Truto's MCP architecture provides multiple layers of access control at the server configuration level:
- Method Filtering: You can strictly limit the MCP server to read-only operations. By setting
config.methods: ["read"], Truto strips out allcreate,update, anddeletetools before the LLM ever sees them. The AI literally cannot mutate data. - Tag Filtering: You can isolate access by domain. By passing
config.tags: ["finance"], the server will only expose tools associated with AP, AR, and GL endpoints, hiding HR or supply chain tools. - Identity Passthrough (
require_api_token_auth): For enterprise security, knowing the MCP URL is not enough. Enabling this flag requires the connecting client to also pass a valid Truto API token in theAuthorizationheader, validating the specific user's identity before executing any ERP tool. - Auto-Expiring Servers: If you are provisioning an MCP server for a temporary audit or a specific agent session, you can pass an
expires_attimestamp. Truto will automatically destroy the token and kill the connection at the exact scheduled time.
Connecting the Pieces
Integrating Epicor Kinetic doesn't have to mean writing custom C# services to expose BO methods, fighting with OData syntax, or building complex pagination loops to extract BAQ data. By leveraging Truto's dynamically generated MCP servers, you can give Claude secure, documented, and strictly scoped access to your entire ERP surface area in minutes.
Stop hardcoding integration logic and start building agentic workflows.
FAQ
- How do I handle Epicor Kinetic API rate limits with Claude?
- Truto passes HTTP 429 rate limit errors directly from Epicor Kinetic to Claude. Truto normalizes the upstream rate limit data into standard IETF headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset), but does not auto-retry. Your client or orchestration layer must handle the backoff logic.
- Can Claude execute custom Epicor BAQs?
- Yes. By using the list_all_epicor_kinetic_baq_results tool exposed by the Truto MCP server, Claude can pass dynamic parameters directly to the BaqSvc endpoint and retrieve the results as paginated JSON.
- Does Truto support Epicor Kinetic's OData filtering?
- Yes. The Truto MCP server passes query parameters like $filter natively to Epicor's Erp.BO endpoints, allowing Claude to execute precise queries like CustomerNum eq 5000.
- How do I prevent Claude from deleting critical ERP data?
- You can enforce read-only access at the MCP server level. When creating the Epicor Kinetic MCP server in Truto, configure the method filter to only allow 'read' operations, which strips all create, update, and delete tools before Claude ever sees them.