Skip to content

Connect Aspire to ChatGPT: Manage field operations and financials

Learn how to build a secure MCP server to connect Aspire to ChatGPT. Automate work tickets, field operations, and financials using Truto.

Nachi Raman Nachi Raman · · 9 min read
Connect Aspire to ChatGPT: Manage field operations and financials

If you need to connect Aspire to ChatGPT to automate landscaping workflows, manage field service tickets, or track property financials, you need a Model Context Protocol (MCP) server. This server acts as the translation layer between ChatGPT's tool calls and Aspire's REST APIs. 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 Claude, check out our guide on connecting Aspire to Claude or explore our broader architectural overview on connecting Aspire to AI Agents.

Giving a Large Language Model (LLM) read and write access to a comprehensive business management system like Aspire is an engineering challenge. You have to handle complex relational data payloads, map field service hierarchies to MCP tool definitions, and deal with deeply nested endpoints. Every time the API updates or your team adds a new custom field, your custom server code must be updated, redeployed, and tested.

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

The Engineering Reality of the Aspire 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, implementing it against Aspire's highly specific operational API requires significant domain logic.

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

The Operational Hierarchy: Opportunities to Work Tickets

Unlike standard CRMs where objects are relatively flat, Aspire operates on a strict field service hierarchy. An Opportunity represents potential work. When won, it generates Services, which are then fulfilled via Work Tickets. A Work Ticket can have multiple Visits, Times (clock-ins), and Item Allocations (inventory usage). If an LLM needs to "mark a job complete," your MCP server must understand this multi-layered hierarchy. Attempting to directly update a top-level Opportunity without creating the corresponding Work Ticket Time records will result in corrupted reporting and API validation errors.

Bulk Updates and Request Structures

Aspire's API frequently requires IDs to be passed in the request body rather than the URL path for update operations (e.g., aspire_properties_bulk_update requires the PropertyID in the payload). Standardizing LLM function schemas to accommodate these idiosyncratic routing rules requires writing custom schema parsers. If you generate standard REST tool definitions, the LLM will incorrectly guess the URL structure and fail.

Non-Standard Error Formats and Field Mappings

Field service APIs often return highly nested validation errors. When an agent attempts to allocate inventory (create_a_aspire_item_allocation) without specifying the correct InventoryLocationID, Aspire will reject the payload. A custom MCP server must parse these vendor-specific errors, map them to JSON-RPC error codes, and return them to the LLM in a format it can understand to self-correct.

Aspire to ChatGPT Quickstart Guide

If you want the fastest path from a fresh Truto account to ChatGPT calling the Aspire API, follow these five steps.

Step 1: Connect Aspire as an Integrated Account

Before you can generate tools, you must authenticate an Aspire tenant.

  1. In the Truto dashboard, navigate to Integrated Accounts -> New Integrated Account.
  2. Select Aspire and provide the required Client ID and Secret Key.
  3. Truto securely stores these credentials and handles the token refresh lifecycle. Aspire tokens typically last 24 hours; Truto automatically refreshes them every 12 hours so ChatGPT never encounters an expired session.

Step 2: Generate the Aspire MCP Server

You can scope an MCP server to this specific Aspire account using either the Truto UI or the API.

Method A: Via the Truto UI

  1. Navigate to the integrated account page for your Aspire connection.
  2. Click the MCP Servers tab.
  3. Click Create MCP Server.
  4. Select your desired configuration (name, allowed methods, allowed tags, expiry).
  5. Copy the generated MCP server URL.

Method B: Via the API Make a POST request to Truto to generate the server dynamically. You can filter the tools using the config block.

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": "Aspire for ChatGPT",
    "config": {
      "methods": ["read", "write"],
      "tags": ["work_tickets", "opportunities", "equipment", "invoices"]
    }
  }'

The API returns a payload containing a secure url (e.g., https://api.truto.one/mcp/<token>). This single URL encapsulates the routing logic, authentication, and tool definitions.

Step 3: Connect the Server to ChatGPT

Now, provide this endpoint to your LLM environment.

Method A: Via the ChatGPT UI (For ChatGPT Plus/Pro/Enterprise)

  1. In ChatGPT, navigate to Settings -> Apps -> Advanced settings.
  2. Enable Developer mode.
  3. Under MCP servers / Custom connectors, click Add new server.
  4. Name the connector (e.g., "Aspire Field Ops").
  5. Paste the Truto MCP URL into the Server URL field and click Add.

Method B: Via Manual Config File (For Custom Agents and Desktop Clients) If you are using an agentic framework or an MCP-compatible desktop client, you can configure it via a standard mcp.json file. Truto's MCP servers communicate over Server-Sent Events (SSE). Use the @modelcontextprotocol/server-sse adapter to bridge the connection:

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

Step 4: Handle Rate Limits

CRITICAL: Truto does not retry, throttle, or apply backoff on rate limit errors. When the upstream Aspire API returns an HTTP 429, Truto passes that exact error to the caller.

To help your AI agent handle this gracefully, Truto normalizes the upstream rate limit information into standard IETF headers:

  • ratelimit-limit: The total requests allowed in the current window.
  • ratelimit-remaining: The number of requests left.
  • ratelimit-reset: The timestamp when the limit resets.

Your application framework or LLM orchestration layer is strictly responsible for intercepting 429s, reading the ratelimit-reset header, and implementing retry/backoff logic. Do not build an infinite loop that hammers the MCP server when limits are exhausted.

Security and Access Control

Giving an AI agent raw access to your financial and operational data is a massive risk. Truto's MCP implementation provides strict access controls encoded directly into the server token:

  • Method Filtering: You can restrict an MCP server to specific HTTP methods. Passing methods: ["read"] ensures the agent can only execute GET/LIST operations, making it physically impossible for ChatGPT to accidentally delete a work ticket or create an erroneous invoice.
  • Tag Filtering: Scope the server to specific operational domains. Passing tags: ["equipment"] hides all payroll and financial tools, exposing only fleet and asset management endpoints.
  • Require API Token Auth: For higher security environments, setting require_api_token_auth: true forces the client to pass a valid Truto API token in the Authorization header, meaning the MCP URL alone is not enough to access the data.
  • Auto-Expiring Servers: By setting an expires_at timestamp, you can provision temporary MCP access for external contractors or audit agents. Once the time passes, the URL is automatically invalidated and garbage collected.

Core Aspire Tools for ChatGPT

When connected, Truto dynamically transforms Aspire's endpoints into JSON-RPC tools. Here are the highest-leverage operations for field and financial workflows.

List All Work Tickets

list_all_aspire_work_tickets

Work tickets are the core operational unit in Aspire. This tool retrieves a paginated list of work performed relative to scheduled services. Agents use this to check the status of jobs for the day.

"Pull the list of active work tickets for today and summarize which crews are assigned to property maintenance jobs."

Create a Work Ticket Time

create_a_aspire_work_ticket_time

Used to log the start and end times for crew members during a site visit. This is essential for accurate labor costing and payroll generation.

"Clock out the landscape maintenance crew for ticket ID 1045. Set their end time to 4:30 PM local time."

Create an Issue

create_a_aspire_issue

An activity type that records a conflict or problem associated with a property, opportunity, or work ticket (e.g., broken equipment, customer complaint, inaccessible site).

"Log a new issue against Work Ticket 882. The gate was locked, so the crew could not access the backyard for the fertilization service. Assign it to the dispatch manager."

List All Equipment

list_all_aspire_equipments

Retrieves a list of equipment assets and vehicles associated with the company fleet. Agents can use this to check availability or cross-reference broken machinery.

"Fetch the equipment list and find all available zero-turn mowers that aren't currently allocated to a job."

Create an Opportunity

create_a_aspire_opportunity

Adds potential or actual work to the pipeline. This is the starting point for estimating and bidding on new contracts.

"Create a new Opportunity for the 'Oak Park HOA' property. Label it 'Fall Clean-up 2026' and set the opportunity type to Maintenance."

List All Invoices

list_all_aspire_invoices

Retrieves billing statements for services charged to a customer. Used for AR automation and financial auditing.

"Check the invoices for the Smith Commercial account. Are there any unpaid invoices older than 30 days?"

To view the complete inventory of tools, schemas, and required parameters, visit the Aspire integration page.

Workflows in Action

Connecting tools is only half the battle. The real value of an MCP server is enabling ChatGPT to orchestrate multi-step field operations autonomously. Here are two real-world examples.

Workflow 1: Field Issue Logging and Equipment Swap

When a piece of equipment breaks down on site, field crews need to log the issue and immediately locate a replacement to finish the job. An AI agent can handle this entire triage sequence.

"Log a 'Broken Mower' issue on the Oak Street maintenance ticket. Note that the drive belt snapped. Then, pull the equipment list and find me an available 48-inch mower we can dispatch as a replacement."

sequenceDiagram
    participant User as Field Manager
    participant Agent as ChatGPT
    participant Truto as Truto MCP Server
    participant Aspire as Aspire API

    User->>Agent: "Log a broken mower issue on Oak St ticket..."
    
    Agent->>Truto: call list_all_aspire_work_tickets (search: "Oak Street")
    Truto->>Aspire: GET /WorkTickets
    Aspire-->>Truto: Returns ticket ID 5541
    Truto-->>Agent: Ticket data

    Agent->>Truto: call create_a_aspire_issue (TicketID: 5541, Subject: "Broken Mower")
    Truto->>Aspire: POST /Issues
    Aspire-->>Truto: Returns Issue ID
    Truto-->>Agent: Issue created confirmation

    Agent->>Truto: call list_all_aspire_equipments
    Truto->>Aspire: GET /Equipments
    Aspire-->>Truto: Equipment list
    Truto-->>Agent: Returns fleet data

    Agent-->>User: "Issue logged. Mower #12 (48-inch) is available at the North Branch."

Execution Breakdown:

  1. The agent calls list_all_aspire_work_tickets to resolve the string "Oak Street" into a concrete Work Ticket ID.
  2. It calls create_a_aspire_issue, passing the resolved Ticket ID and the notes about the snapped drive belt.
  3. It calls list_all_aspire_equipments to pull the active fleet inventory.
  4. It parses the JSON response, filtering for active, available mowers, and returns the recommendation to the user.

Workflow 2: End-of-Day Crew Time Entry and AR Check

Operations managers often need to verify that crews have clocked out while simultaneously checking the financial health of the property they just serviced.

"Clock out the crew for the Pine Valley installation ticket. Set the end time to now. Also, check if the Pine Valley property has any pending invoices that we need to collect on."

sequenceDiagram
    participant User as Ops Manager
    participant Agent as ChatGPT
    participant Truto as Truto MCP Server
    participant Aspire as Aspire API

    User->>Agent: "Clock out Pine Valley crew and check pending invoices..."
    
    Agent->>Truto: call list_all_aspire_work_tickets (search: "Pine Valley")
    Truto->>Aspire: GET /WorkTickets
    Aspire-->>Truto: Returns Ticket ID 9920, Property ID 304
    Truto-->>Agent: Ticket data

    Agent->>Truto: call create_a_aspire_work_ticket_time (TicketID: 9920, EndTime: <current_time>)
    Truto->>Aspire: POST /WorkTicketTimes
    Aspire-->>Truto: Returns Time entry ID
    Truto-->>Agent: Time entry logged

    Agent->>Truto: call list_all_aspire_invoices (PropertyID: 304)
    Truto->>Aspire: GET /Invoices
    Aspire-->>Truto: Invoice data
    Truto-->>Agent: Invoice status array

    Agent-->>User: "Crew clocked out at 5:00 PM. Pine Valley has one unpaid invoice ($4,500) from last month."

Execution Breakdown:

  1. The agent searches for the ticket using list_all_aspire_work_tickets, extracting both the Ticket ID and the associated Property ID.
  2. It calls create_a_aspire_work_ticket_time to log the stop time for the crew on that ticket.
  3. Using the Property ID it found in step 1, it calls list_all_aspire_invoices to retrieve the billing history.
  4. It analyzes the invoice payload, identifies any records where the status indicates an unpaid balance, and summarizes the data for the manager.

Unblock Your AI Roadmap

Building AI features for field service and operational SaaS shouldn't require a dedicated team of integration engineers writing point-to-point scripts. Maintaining the hierarchical payloads of Aspire, tracking schema drift, and handling complex authentication lifecycles is infrastructure work, not product work.

By leveraging Truto's managed MCP servers, you can give your LLMs instant, secure, and curatable access to Aspire data. You define the filters, Truto manages the secure tunneling, and your AI agents execute the workflows.

FAQ

How does Truto handle Aspire API rate limits?
Truto does not retry or absorb rate limit errors. When the Aspire API returns an HTTP 429, Truto passes that error directly to the caller and normalizes the rate limit headers into standard IETF formats (ratelimit-limit, ratelimit-remaining, ratelimit-reset). Your application or agent must handle the retry and backoff logic.
Can I limit which Aspire records ChatGPT can modify?
Yes. When generating the MCP server, you can apply method filtering (e.g., restricting to only 'read' operations) and tag filtering (e.g., only exposing 'work_tickets' tools). This prevents the LLM from executing unauthorized operations.
What is an MCP server?
The Model Context Protocol (MCP) is a standardized JSON-RPC interface that allows AI models like ChatGPT and Claude to discover and invoke tools. An MCP server translates LLM tool calls into standard API requests.
Does Truto support custom fields in Aspire?
Yes. Truto dynamically generates MCP tools based on the live configuration of the integrated account, which includes endpoints for retrieving and managing custom fields on properties, contacts, and equipment.

More from our Blog