Skip to content

Connect CMiC to Claude: Automate RFIs, Change Orders & Field Data

Learn how to build a managed MCP server for CMiC to give Claude secure access to your construction ERP. Automate RFIs, Change Orders, and Daily Journals.

Nidhi KN Nidhi KN · · 9 min read

If your team uses ChatGPT, check out our guide on /connect-cmic-to-chatgpt-manage-construction-projects-financials/ or explore our broader architectural overview on /connect-cmic-to-ai-agents-orchestrate-procurement-payroll-tasks/.

If you need to connect CMiC to Claude to automate Requests for Information (RFIs), process purchase change orders, or parse unstructured field data into Daily Journals, you need a Model Context Protocol (MCP) server. This server acts as the translation layer between Claude's LLM function calls and CMiC's complex REST APIs.

You can either build and maintain this infrastructure yourself—handling the dense CMiC data model, OAuth lifecycles, and pagination schemas—or use a managed integration platform like Truto to dynamically generate a secure, authenticated MCP server URL.

Giving a Large Language Model (LLM) read and write access to a sprawling construction ERP like CMiC is a serious engineering challenge. CMiC's architecture is deeply relational. An LLM cannot just "create a change order." It must navigate company codes, job codes, phase codes, and master-detail record hierarchies.

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

The Engineering Reality of the CMiC 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 a highly specialized ERP API is painful. CMiC is built for heavy civil, commercial, and specialty contractors. Its API reflects the rigidity and complexity of construction accounting.

If you decide to build a custom CMiC MCP server, here are the specific integration challenges your engineering team will face:

Master-Detail Hierarchies and Posting Routines CMiC heavily utilizes a master-detail data model. For example, creating a Purchase Order (PO) Change Order requires creating a header record (po_change_order_master) and then associating multiple detail lines (po_change_order_lines). An LLM has no inherent concept of transactional integrity. If the detail lines fail, you are left with an orphaned header. Furthermore, financial records in CMiC often sit in an "unposted" state. A successful POST request doesn't mean the data is live in the ledger; it often requires a secondary API call to a specific posting endpoint (e.g., postvoucher or po_change_order_post) to commit the transaction.

The Universal CompCode and JobCode Dependency Almost every resource in the CMiC API requires context parameters that LLMs struggle to infer. You cannot simply query for an invoice or an RFI by an ID alone. You frequently need to pass the CompCode (Company Code) and JobCode (Job/Project Code). Your MCP tools must be engineered to explicitly require these fields in their JSON schemas, forcing the LLM to either ask the user for them or retrieve them via a prerequisite tool call.

VUUIDs vs. Functional Identifiers CMiC operates with dual identifiers. Many objects have a functional, human-readable identifier (like a Vendor Code or Job Name) and a backend Virtual UUID (VUUID). When updating or deleting records via the API, the VUUID is almost always required. Your MCP tools must map the human-readable string the user provides to the internal VUUID via a search tool before attempting a PUT or PATCH request.

By using Truto, the MCP server is generated dynamically from documented API schemas. The tools presented to Claude already contain the exact JSON schema requirements—including required fields like CompCode—drastically reducing LLM hallucination rates.

Generating the CMiC MCP Server

Truto creates MCP servers by dynamically deriving tool definitions from the integration's documented API resources. The server is scoped entirely to a single integrated CMiC account. The resulting URL contains a cryptographic token that securely identifies the tenant and their specific configuration.

You can create this MCP server in two ways: through the Truto dashboard, or programmatically via the API.

Method 1: Via the Truto UI

For internal tooling and rapid prototyping, generating the URL via the dashboard takes seconds.

  1. Log into Truto and navigate to the Integrated Accounts page.
  2. Select your connected CMiC account.
  3. Click the MCP Servers tab.
  4. Click Create MCP Server.
  5. Select your desired configuration (e.g., restricting access to read only, or filtering by specific functional tags like project_management).
  6. Copy the generated MCP Server URL (e.g., https://api.truto.one/mcp/abc123def456...).

Method 2: Via the Truto API

For production deployments where you are spinning up agents for your end-users dynamically, you will use the API.

Make an authenticated POST request to the /integrated-account/:id/mcp endpoint:

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

The response returns the secure URL you will provide to your AI agent framework:

{
  "id": "mcp_01hq...",
  "name": "CMiC Project Manager Agent",
  "config": {
    "methods": ["read", "write", "custom"]
  },
  "expires_at": null,
  "url": "https://api.truto.one/mcp/abc123def456..."
}

Connecting the MCP Server to Claude

Once you have the URL, you need to register the server with your LLM client. MCP operates over a JSON-RPC 2.0 protocol using HTTP POST. Because Truto's MCP servers support Server-Sent Events (SSE), integration is entirely configuration-driven.

Method A: Via the Claude UI (or ChatGPT)

If you are using the Claude web interface or ChatGPT with custom GPTs/Connectors:

  1. In Claude, navigate to Settings → Integrations → Add MCP Server (In ChatGPT, this is Settings → Apps → Advanced settings → Add custom connector).
  2. Name the integration "CMiC ERP".
  3. Paste the Truto MCP Server URL.
  4. Click Add. Claude will immediately perform a handshake (initialize) and discover the available CMiC tools.

Method B: Via Manual Configuration File (Claude Desktop)

For local development and testing with Claude Desktop, you must modify the claude_desktop_config.json file. Truto provides an official NPM package (@modelcontextprotocol/server-sse) that bridges Claude's standard stdio requirements with Truto's remote SSE endpoints.

Update your config file (located at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

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

Restart Claude Desktop. The "hammer" icon will appear, indicating that the CMiC tools are loaded and ready to use.

CMiC Hero Tools for Claude

Truto exposes hundreds of endpoints across CMiC's financial, project management, and equipment modules. Here are the highest-leverage "hero" tools for automating construction operations with Claude.

create_a_c_mi_c_pmrfi

Description: Creates a Project Management Request for Information (RFI). Usage Notes: This tool requires specific relation codes: PmrfiCompCode, PmrfiProjCode, and the PmrfiFromContactCode. It is heavily used to automate field-to-office communication based on site notes.

"I need you to create a new RFI for project 'HQ-Build' (Code: 9001). The subject is 'Mismatched HVAC ducting on floor 3'. Assign the 'From' contact as C-889. Explain that the specs call for 12-inch ducts but 14-inch arrived on site."

create_a_c_mi_c_po_change_order

Description: Creates a Purchase Change Order header and automatically generates associated summary lines from its parent purchase order. Usage Notes: Financial tools in CMiC require precision. This tool expects the company code (pocsCompCode), the original PO number (pocsPoNum), and the specific line items being modified.

"Create a PO change order for Company 01, PO Number PO-2023-445. We need to add $5,000 to the total for expedited lumber delivery on release number 2."

list_all_c_mi_c_pmdailyjournal

Description: Retrieves PM Daily Journals. Usage Notes: Daily journals consolidate weather, labor (pmdailyjourlab), equipment (pmdailyjouroeqp), and field notes. This tool is excellent for querying past conditions to defend against delay claims.

"Pull the daily journals for Job 8055 from last week. Summarize all weather delays and list the subcontractors who reported being on site during the rain event on Wednesday."

list_all_c_mi_c_jcjobcostcodes

Description: Retrieves Job Costing (JC) Phase Codes. Usage Notes: Cost codes are the fundamental tracking mechanism in CMiC. AI agents need this tool to accurately map raw text descriptions (e.g., "concrete pouring") to the exact billing code for a specific job.

"List the job cost codes for Job 4040. Find the code that corresponds to 'structural steel erection' so we can correctly categorize the latest invoice."

create_a_c_mi_c_pmsubmittal

Description: Creates a PM Submittal. Usage Notes: Submittals track materials and shop drawings requiring architect approval. This tool requires the PmsmCompCode, PmsmProjCode, and PmsmRequiredEndDate.

"Create a new submittal for the lighting fixtures on Project 550. Set the required end date to two weeks from today, and flag it as a procurement item."

list_all_c_mi_c_jcjob

Description: Retrieves JC Jobs (Projects). Usage Notes: This is typically the first tool an agent must call. It allows Claude to map a user's natural language request ("the downtown highrise") to the exact JobCode required by all downstream endpoints.

"Search our active jobs for anything matching 'Downtown Tower' and return the Company Code, Job Code, and the primary project manager's contact code."

This is just a small sample of the available tools. Truto auto-generates schema-compliant tools for AP Vouchers, AR Invoices, Equipment Timesheets, and more. For the complete API inventory, visit the Truto CMiC Integration Page.

Workflows in Action

Once the MCP server is connected, Claude operates as an autonomous agent, chaining these tools together to execute complex construction workflows. Here is what that looks like in practice.

Scenario 1: Field Data to PM (Creating an RFI from a Daily Log)

Field superintendents often drop rough notes into daily journals. Project managers need to identify issues and formalize them into RFIs for architects.

"Analyze yesterday's daily journals for Job 1001. If there are any noted material delays or discrepancies, draft and create an RFI addressing the issue."

Agent Execution Steps:

  1. list_all_c_mi_c_pmdailyjournal: Claude queries the daily journals for the specific JobCode (1001) for yesterday's date.
  2. Analysis: The LLM processes the returned JSON payload and identifies a note: "Electrical contractor flagged that panel B doesn't fit in the framed closet space."
  3. create_a_c_mi_c_pmrfi: Claude dynamically constructs the RFI payload, setting the subject to "Electrical Panel B clearance issue", filling in the CompCode and ProjCode, and executing the POST request.

Outcome: The user receives confirmation that the daily log was reviewed and a formal RFI was successfully logged in CMiC, saving the PM an hour of cross-referencing.

sequenceDiagram
    participant User
    participant Claude
    participant Truto as Truto MCP Server
    participant CMiC as CMiC API

    User->>Claude: "Review yesterday's journals for Job 1001 and create RFIs for delays."
    Claude->>Truto: Call list_all_c_mi_c_pmdailyjournal(JobCode=1001, Date=Yesterday)
    Truto->>CMiC: GET /pmdailyjournal?job=1001
    CMiC-->>Truto: JSON (Daily Journals)
    Truto-->>Claude: Tool Result (Journals)
    Claude->>Claude: Analyze text for delays/issues
    Claude->>Truto: Call create_a_c_mi_c_pmrfi(Subject="Panel B Clearance", ...)
    Truto->>CMiC: POST /pmrfi
    CMiC-->>Truto: 201 Created (RFI ID)
    Truto-->>Claude: Tool Result (Success)
    Claude-->>User: "RFI for Electrical Panel B has been created."

Scenario 2: Financial Change Order Automation

Change orders require pulling contextual data before executing the final financial transaction.

"Find PO #9021 for Vendor V-450. We need to create a change order adding a new line item for $2,500 due to expedited freight."

Agent Execution Steps:

  1. list_all_c_mi_c_purchase_order_lines: Claude queries the existing PO to retrieve the CompCode, ReleaseNum, and current line items.
  2. create_a_c_mi_c_po_change_order: Claude creates the master header for the change order associated with PO #9021.
  3. create_a_c_mi_c_po_change_order_line: Claude creates the specific summary detail line, setting the cost to $2,500 and the description to "Expedited Freight".

Outcome: The LLM successfully navigates CMiC's strict header/detail line hierarchy. The user receives the new Change Order number ready for review and posting.

Security and Access Control

Giving an AI agent access to core ERP financials and project data requires strict guardrails. Truto’s MCP architecture includes several built-in security features:

  • Method Filtering: When generating the server via /integrated-account/:id/mcp, pass "methods": ["read"] in the configuration. This ensures the MCP server strictly generates GET and LIST tools. If Claude hallucinates a POST request, the tool simply does not exist on the server to be called.
  • Tag Filtering: Limit the server's scope by functional area. By passing "tags": ["project_management"], you prevent the agent from accessing financial (apvoucher, gljournal) or HR tools.
  • Authentication Chaining (require_api_token_auth): For sensitive deployments, enabling this flag requires the MCP client to pass a valid Truto API token in the Authorization header, ensuring the URL cannot be abused if leaked.
  • Ephemeral Servers (expires_at): You can generate temporary MCP servers for contractors or specific agent tasks. Once the expires_at timestamp is reached, Truto's distributed edge scheduler permanently purges the token from the key-value store.

A Factual Note on Rate Limits: The CMiC API imposes strict quotas. Truto acts as a transparent proxy and does not intercept, retry, or apply exponential backoff to rate limit errors. If CMiC returns an HTTP 429, Truto passes that error directly to the caller. Truto normalizes the upstream rate limit data into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF specification. Your agent framework (e.g., LangGraph, CrewAI) is responsible for detecting the 429 error and managing the retry/backoff logic.

Moving Forward

Connecting Claude to CMiC via a managed MCP server removes the heavy lifting of maintaining ERP API integrations. You no longer have to parse complex WSDLs, manage VUUID lookups, or build custom logic to handle CMiC's master-detail relationships. Truto handles the schema normalization and protocol translation, letting your engineering team focus on building the actual AI agent workflows that save project managers hours of manual data entry.

FAQ

Does Claude automatically retry CMiC API rate limit errors?
No. Truto passes HTTP 429 rate limit errors directly from CMiC to Claude. Truto normalizes the upstream rate limit information into standard headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset), but you must implement your own retry and backoff logic in the agent framework.
Can I restrict Claude to read-only access for CMiC?
Yes. When generating the MCP server in Truto, you can pass a configuration payload specifying methods: ['read']. This restricts the generated tools to GET and LIST operations, preventing the LLM from executing creates or updates.
How does Claude handle CMiC's header and detail line requirements?
CMiC often requires composite payloads. Tools like create_a_c_mi_c_po_change_order are mapped specifically to handle the creation of both the master header and the nested detail lines in the correct sequential order.

More from our Blog