Skip to content

Connect CMiC to ChatGPT: Manage Construction Projects & Financials

Learn how to connect CMiC to ChatGPT using a managed MCP server. Automate job costing, RFIs, change orders, and AP/AR workflows with AI agents via Truto.

Sidharth Verma Sidharth Verma · · 9 min read

If you need to connect CMiC to ChatGPT to automate job costing, manage Subcontractor Change Orders (SCCOs), or orchestrate complex construction financials, you need a Model Context Protocol (MCP) server. This server acts as the translation layer between ChatGPT's tool calling capabilities and CMiC's enterprise REST APIs. You can either spend months building and hosting this infrastructure yourself, or use a managed integration platform like Truto to dynamically generate a secure, authenticated MCP server URL in seconds.

If your team uses Claude, check out our guide on connecting CMiC to Claude or explore our broader architectural overview on connecting CMiC to AI Agents.

Giving a Large Language Model (LLM) read and write access to a monolithic construction ERP like CMiC is a massive engineering challenge. CMiC's data model is deeply nested, relying heavily on strict company codes, Virtual UUIDs (VUUIDs) for detail lines, and rigid ledger posting rules. Building custom JSON-RPC definitions for every possible CMiC endpoint is an exercise in endless boilerplate.

This guide breaks down exactly how to use Truto to generate a secure, managed MCP server for CMiC, connect it natively to ChatGPT, and execute complex construction and financial workflows using natural language.

The Engineering Reality of the CMiC API

A custom MCP server is essentially a self-hosted integration proxy. While the open MCP standard provides a predictable way for models to discover tools, implementing it against CMiC's highly specific ERP architecture is exceptionally painful.

If you decide to build a custom MCP server for CMiC, you own the entire API lifecycle. Here are the specific integration challenges that break standard CRUD assumptions when working with CMiC:

Multi-Entity Routing and Company Codes

Construction firms rarely operate as a single financial entity. A single CMiC environment might contain dozens of distinct LLCs, each tied to a specific project. Nearly every CMiC API request requires a strict CompCode parameter. If an LLM tries to query an invoice without specifying the exact company context, the request will fail. Your MCP server must ensure the LLM understands and consistently applies company code routing across related operations, or your agent will hallucinate connections between isolated projects.

Nested Batches and Virtual UUIDs (VUUIDs)

In CMiC, you rarely just "update a record." Operations like Purchase Orders (POs) or Job Cost Budgets are structured as complex header-line relationships. Changing a PO involves modifying the PO Master Header, which is intrinsically linked to multiple PO Detail Lines via VUUIDs. If you are building tools for an LLM, you cannot just expose a flat update endpoint. Your server must translate flat JSON-RPC arguments into nested, multi-part batch payloads that respect CMiC's strict parent-child VUUID constraints.

Strict Ledger States and Voiding

Standard REST APIs allow you to DELETE /invoices/123. CMiC is an accounting system - once an AP Voucher or Job Cost transaction is posted to the ledger, it is immutable. You cannot delete it; you must void it to reverse the sub-ledger distribution. An AI agent lacking this context will repeatedly attempt to issue DELETE calls and fail. The integration layer must expose business-logic-aware tools (e.g., create_a_c_mi_c_voiddeletevoucher) rather than generic CRUD endpoints.

Generating a CMiC MCP Server with Truto

Truto eliminates these headaches using documentation-driven tool generation. When you connect a CMiC account, Truto reads the underlying API documentation schemas and dynamically generates MCP-compliant tools. It handles the pagination, schema normalization, and flat-to-nested argument mapping automatically.

An MCP server is scoped to a single integrated account (a connected instance of CMiC for a specific tenant). The server is represented by a single, secure URL containing a cryptographic token.

You can create this server in two ways.

Method 1: Via the Truto UI

  1. Navigate to the Integrated Accounts page in the Truto dashboard.
  2. Select your connected CMiC account.
  3. Click the MCP Servers tab.
  4. Click Create MCP Server.
  5. Select your desired configuration (e.g., allow read methods only, filter by specific tags like jobs or ap).
  6. Copy the generated MCP server URL. It will look like https://api.truto.one/mcp/a1b2c3d4e5....

Method 2: Via the Truto API

You can programmatically generate MCP servers, which is ideal if you are embedding AI agent functionality into your own SaaS platform.

curl -X POST https://api.truto.one/integrated-account/$INTEGRATED_ACCOUNT_ID/mcp \
  -H "Authorization: Bearer $TRUTO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "CMiC Project Manager Agent",
    "config": {
      "methods": ["read", "write", "custom"],
      "tags": ["job_costing", "project_management"]
    }
  }'

The API provisions a secure token, maps the relevant CMiC resources, and returns a ready-to-use URL. The URL acts as the routing and authentication layer for the client.

Connecting the MCP Server to ChatGPT

Once you have your Truto MCP URL, connecting it to an AI client requires zero additional coding.

Option A: Via the ChatGPT UI

If you are using ChatGPT Pro, Plus, Enterprise, or Education:

  1. Open ChatGPT and go to Settings > Apps > Advanced settings.
  2. Enable Developer mode.
  3. Under MCP servers / Custom connectors, click Add.
  4. Provide a recognizable name (e.g., "CMiC ERP").
  5. Paste your Truto MCP URL into the Server URL field.
  6. Click Save.

ChatGPT will immediately handshake with the Truto server, exchange capabilities, and list the available CMiC tools in the prompt interface.

(Note: If your team uses Claude Desktop, you can add the exact same URL under Settings > Connectors > Add custom connector).

Option B: Via Manual Config File (SSE Transport)

If you are building a custom agent framework (like LangChain or a local Claude Desktop instance), you can connect using the official Server-Sent Events (SSE) CLI wrapper.

{
  "mcpServers": {
    "cmic-erp": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-sse",
        "--url",
        "https://api.truto.one/mcp/a1b2c3d4e5f67890"
      ]
    }
  }
}

Security and Access Control

Giving an LLM unconstrained access to a multi-million dollar construction ledger is dangerous. Truto MCP servers support strict boundary definitions enforced at the protocol layer:

  • Method Filtering (config.methods): Restrict the server to specific HTTP verbs. Pass ["read"] to strictly allow get and list operations, ensuring the agent cannot mutate data.
  • Tag Filtering (config.tags): Scope the server to specific functional domains. If you tag resources in Truto, you can restrict an agent to only see ["hr"] or ["inventory"] tools.
  • Require API Token Auth (require_api_token_auth): By default, the cryptographically hashed URL grants access. Enabling this flag forces the client to also pass a valid Truto API token in the Authorization header, enforcing dual-layer authentication.
  • Expiration (expires_at): Set an ISO 8601 datetime. Once the timestamp passes, the server URL automatically expires and internal alarms purge the access token from the Key-Value store.

CMiC Hero Tools for AI Agents

Truto automatically maps hundreds of CMiC endpoints. Here are the highest-leverage tools for automating construction operations.

Retrieve JC Jobs

Tool: list_all_c_mi_c_jcjob Job Cost (JC) Jobs are the root entities for project tracking. This tool allows the agent to search for active construction projects, retrieving fundamental attributes like job codes, statuses, and associated accounting methods.

"Find the active job record for the 'Downtown Highrise' project and tell me the default billing method."

Retrieve Job Cost Codes

Tool: list_all_c_mi_c_jcjobcostcodes Cost Codes represent specific phases or work elements within a job (e.g., concrete pouring, electrical rough-in). Agents use this to understand budget structures before analyzing costs.

"List all the job cost codes associated with Job ID 1045, specifically filtering for phases related to HVAC installation."

Create a PM RFI

Tool: create_a_c_mi_c_pmrfi Automate the creation of Requests for Information (RFIs). The agent can draft an RFI based on email transcripts or field notes, assigning the correct project code and contact IDs automatically.

"Draft an RFI for project 1045 regarding the conflicting architectural specs for the lobby flooring. Assign it to the architect of record."

Create Purchase Change Order

Tool: create_a_c_mi_c_po_change_order When a vendor scope changes, agents can use this tool to generate a new PO Change Order header and automatically append the necessary summary lines, linking it back to the parent PO.

"Generate a change order for PO 9901 adding an extra $5,000 for expedited steel delivery due to weather delays."

Retrieve PCI Details

Tool: list_all_c_mi_c_cmdetail Potential Change Items (PCIs) are critical for tracking expected revenue/cost shifts. This tool retrieves the line-item details of a PCI, including billing codes and phase allocations.

"Pull the detail lines for PCI 402 on the Downtown Highrise project. What phase code is the drywall overage assigned to?"

Create AP Voucher with PO Detail

Tool: create_a_c_mi_c_apvoucherpo Allows an agent to ingest an invoice, validate it against an existing Purchase Order, and create the resulting AP Voucher with accurate distribution lines.

"Create an AP Voucher for the attached invoice from Acme Supplies. Tie it to PO 5502 and distribute the cost evenly across the listed detail lines."

Create a PM Daily Journal

Tool: create_a_c_mi_c_pmdailyjournal Project Managers spend hours typing up daily logs. An agent can use this tool to compile a PM Daily Journal from disparate notes, automatically assigning the project code and preparer contact info.

"Create a new daily journal for project 1045 for today. Note that weather was clear, 15 laborers were on site, and the concrete pour was completed successfully."

For a complete list of endpoints, schemas, and required parameters, view the CMiC integration page.

Workflows in Action

Here is how ChatGPT orchestrates complex CMiC operations autonomously using Truto's tools.

Scenario 1: Processing a Vendor Invoice against a PO

Accounts Payable processes are highly manual. An agent can automate invoice validation and voucher creation.

"Check if Vendor 884 (Acme Corp) has an open PO for $10,000 on the Hudson project. If so, create an AP Voucher for their latest invoice using the PO details."

Step-by-step execution:

  1. list_all_c_mi_c_jcjob: The agent searches for the "Hudson" project to retrieve its JobCode and CompCode.
  2. list_all_c_mi_c_pomaster: The agent searches for open purchase orders for Vendor 884 under that CompCode.
  3. list_all_c_mi_c_podetail: It checks the PO lines to confirm there is a $10,000 unbilled balance.
  4. create_a_c_mi_c_apvoucherpo: Finding a match, the agent submits the AP Voucher, automatically distributing the invoice amounts against the verified PO lines.

Scenario 2: Auditing Project Financials & Generating an RFI

Project managers need to understand budget variances quickly and take action.

"Check the cost-to-complete details for the concrete phase on Job 1045. If the variance is over $5k, draft an RFI to the structural engineer asking for clarification on the rebar quantities."

sequenceDiagram
    participant User
    participant Agent as AI Agent (ChatGPT)
    participant Truto
    participant CMiC as CMiC ERP
    
    User->>Agent: "Check concrete costs on Job 1045..."
    Agent->>Truto: Call list_all_c_mi_c_jcjobcostcodes
    Truto->>CMiC: Proxy GET Request
    CMiC-->>Truto: Return Phase Data
    Truto-->>Agent: Phase Codes
    Agent->>Truto: Call list_all_c_mi_c_jccontfcostcompdet
    Truto->>CMiC: Proxy GET Request
    CMiC-->>Truto: Return Cost To Complete
    Truto-->>Agent: Financial Data (Variance: $8,500)
    Agent->>Truto: Call create_a_c_mi_c_pmrfi
    Truto->>CMiC: Proxy POST Request
    CMiC-->>Truto: Return RFI Record
    Truto-->>Agent: Success<br>RFI Generated
    Agent->>User: "Variance is $8,500. RFI created."

Step-by-step execution:

  1. list_all_c_mi_c_jcjobcostcodes: The agent queries the job cost structure to find the specific phase code for "concrete."
  2. list_all_c_mi_c_jccontfcostcompdet: It pulls the cost-to-complete details for that specific phase code. It detects a variance of $8,500.
  3. create_a_c_mi_c_pmrfi: Triggered by the logic condition, the agent drafts the RFI, applying the correct ProjCode and routing it to the pre-configured contact for structural engineering.

Rate Limits and Error Handling

When deploying AI agents against enterprise systems, rate limits become a serious bottleneck. Agents operate incredibly fast and can easily trip API thresholds during parallel operations.

A factual note on how Truto handles rate limits: Truto does not retry, throttle, or apply backoff on rate limit errors. When CMiC's upstream API returns an HTTP 429 Too Many Requests, Truto passes that exact error directly back to the caller. Truto's only intervention is normalizing the upstream rate limit information into standardized IETF headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset).

The calling agent framework (whether that is ChatGPT, LangChain, or your custom infrastructure) is entirely responsible for reading these headers and implementing its own retry and exponential backoff logic. Truto does not absorb these errors for you.

Stop Hand-Coding ERP Integrations

Building an integration with a massive ERP like CMiC is rarely a one-and-done project. As soon as you finish mapping the AP endpoints, the business will ask for Payroll, Job Costing, and Procurement.

By leveraging Truto's auto-generated MCP servers, you skip the infrastructure build entirely. You get secure, authenticated, dynamically documented tools that LLMs can instantly consume, allowing your engineering team to focus on building the actual agent logic, not maintaining API connectors.

FAQ

How do I connect CMiC to ChatGPT?
You can connect CMiC to ChatGPT using a Model Context Protocol (MCP) server. Truto generates a secure MCP server URL for your connected CMiC account, which you can add as a custom connector in ChatGPT's developer settings.
Does Truto cache my CMiC financial data?
No. Truto operates as a real-time pass-through proxy. Tool calls from ChatGPT are translated into API requests and sent directly to CMiC. Truto does not retain or cache your underlying construction or financial data.
How are CMiC rate limits handled by the MCP server?
Truto passes HTTP 429 rate limit errors directly to the caller and normalizes the headers into the IETF standard (ratelimit-limit, ratelimit-remaining, ratelimit-reset). Truto does not automatically retry; your client must handle backoff logic.
Can I restrict ChatGPT to read-only access in CMiC?
Yes. When generating the MCP server in Truto, you can pass a configuration filter like `methods: ["read"]`. This ensures the AI agent can only execute GET and LIST operations, preventing any accidental writes or deletions.

More from our Blog