# AccuLynx MCP tools

> Every AccuLynx MCP tool on the Cotlet server: tool names, input schemas, a tools/call example and an example result for each tool.

Source: https://cotlet.dev/docs/mcp/acculynx

Docs sections: [Get started](https://cotlet.dev/docs.md) · [REST API](https://cotlet.dev/docs/api.md) · [MCP](https://cotlet.dev/docs/mcp.md) · [SDKs & CLI](https://cotlet.dev/docs/sdks.md) · [Integrations](https://cotlet.dev/docs/integrations.md)

14 tools for AccuLynx on the Cotlet MCP server. Your agent picks them from tools/list.

- MCP server: `https://cotlet.dev/mcp/v1`
- Connects with: Your own AccuLynx account (the role you use in the app decides what the tools can do)
- Integration page: https://cotlet.dev/integrations/acculynx-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `acculynx_list_jobs` | read | Jobs in your location with name, address, current milestone, priority and dates. |
| `acculynx_get_job` | read | Full job: contacts, address, trade and work type, milestone history, sales owner and financial totals. |
| `acculynx_find_contact` | read | Contacts matching a name, email or phone number, with their jobs. |
| `acculynx_list_estimates` | read | Estimates on a job with name, total and date. |
| `acculynx_get_estimate` | read | One estimate with its sections, line items, quantities and prices. |
| `acculynx_list_job_messages` | read | Messages posted on a job, with author, date and replies. |
| `acculynx_list_job_payments` | read | Payments recorded on a job with date, method and amount. |
| `acculynx_create_contact` | write | New contact with name, phone, email and mailing address. |
| `acculynx_create_job` | write | New job for a contact, at the job site address. |
| `acculynx_update_job_milestone` | write | Move a job to another milestone, as you would in the job file, if your role allows it. |
| `acculynx_upload_job_photo` | write | Add a photo or video to the job file, with an optional tag and description. |
| `acculynx_post_job_message` | write | Post a message on a job for your team, or reply in a thread. |
| `acculynx_add_contact_note` | write | Add a note to a contact record. |
| `acculynx_record_payment_received` | write | Record a payment the customer made on a job. Nothing is charged. |

## List jobs

MCP tool: `acculynx_list_jobs`

Access: read.

Lists jobs in one location, most recently modified first unless you sort otherwise. Filter by milestone or search by job name, address or contact name. Milestone is one of Lead, Prospect, Approved, Completed, Invoiced, Closed or Dead. Pages hold up to 100 jobs; pass next_cursor back as cursor for the next page.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `milestone` | enum | no | Lead, Prospect, Approved, Completed, Invoiced, Closed or Dead. Default: all. |
| `search` | string | no | Job name, address or contact name. |
| `sort_by` | enum | no | created, milestone_date or modified. Default: modified. |
| `limit` | integer | no | 1 to 100. Default: 25. |
| `cursor` | string | no | Next page cursor from the previous call. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "acculynx_list_jobs",
    "arguments": {
      "milestone": "Prospect",
      "sort_by": "milestone_date",
      "limit": 100
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "jobs": [
      {
        "job_id": "b3f1c2a4-7d2e-4f0a-9c51-2e8a4d6f1b90",
        "job_name": "Miller - 48 Pine Ridge Rd",
        "address": "48 Pine Ridge Rd, Plano, TX 75074",
        "milestone": "Prospect",
        "priority": "Normal",
        "milestone_date": "2026-09-02T10:20:00-05:00",
        "modified_at": "2026-10-08T15:41:00-05:00"
      },
      {
        "job_id": "e91a47d3-5c60-4b2f-8d1e-0a7f3c9b5e24",
        "job_name": "Garcia - 310 Elm Ct",
        "address": "310 Elm Ct, Frisco, TX 75034",
        "milestone": "Prospect",
        "priority": "High",
        "milestone_date": "2026-09-11T08:05:00-05:00",
        "modified_at": "2026-10-06T09:12:00-05:00"
      }
    ],
    "next_cursor": null
  },
  "isError": false
}
```

## Get job

MCP tool: `acculynx_get_job`

Access: read.

Returns one job with its contacts, job site address, trade and work type, sales owner and the milestone history in order. Financial totals are the figures shown on the job in AccuLynx. Use the job_id from list_jobs.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "acculynx_get_job",
    "arguments": {
      "job_id": "job_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "job_id": "e91a47d3-5c60-4b2f-8d1e-0a7f3c9b5e24",
    "job_name": "Garcia - 310 Elm Ct",
    "address": "310 Elm Ct, Frisco, TX 75034",
    "milestone": "Completed",
    "priority": "Normal",
    "work_type": "Replacement",
    "trade_types": [
      "Roofing"
    ],
    "sales_owner": "Dana Whitfield",
    "contacts": [
      {
        "contact_id": "c2b8f6a1-90d4-4a37-b5e2-6f1d8a3c7e09",
        "name": "Luis Garcia",
        "role": "Primary"
      }
    ],
    "milestone_history": [
      {
        "milestone": "Lead",
        "date": "2026-08-14T11:02:00-05:00"
      },
      {
        "milestone": "Prospect",
        "date": "2026-08-16T09:30:00-05:00"
      },
      {
        "milestone": "Approved",
        "date": "2026-09-11T08:05:00-05:00"
      },
      {
        "milestone": "Completed",
        "date": "2026-10-05T16:48:00-05:00"
      }
    ],
    "totals": {
      "contract": "14850.00",
      "received": "7425.00",
      "currency": "USD"
    }
  },
  "isError": false
}
```

## Find contact

MCP tool: `acculynx_find_contact`

Access: read.

Searches contacts by name, email or phone number and returns each match with the jobs linked to it. Run it before create_contact so you do not add the same person twice. Use the contact_id with create_job and add_contact_note.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `query` | string | yes | Name, email or phone. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "acculynx_find_contact",
    "arguments": {
      "query": "query"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "contacts": [
      {
        "contact_id": "c7d2a9f0-3b11-4e8c-a6d5-91f0e2b47c18",
        "name": "Jane Doe",
        "phone": "(214) 555-0142",
        "email": "jane.doe@example.com",
        "jobs": []
      }
    ]
  },
  "isError": false
}
```

## List estimates

MCP tool: `acculynx_list_estimates`

Access: read.

Returns every estimate on one job with its name, total and date. Pass estimate_id to get_estimate for the sections and line items. Estimates are read only: Cotlet does not create or edit them.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "acculynx_list_estimates",
    "arguments": {
      "job_id": "job_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "estimates": [
      {
        "estimate_id": "a40d9e17-2f6b-4c83-b1a5-7e3c8d0f6291",
        "name": "Full replacement, architectural shingles",
        "total": "14850.00",
        "date": "2026-09-09"
      }
    ]
  },
  "isError": false
}
```

## Get estimate

MCP tool: `acculynx_get_estimate`

Access: read.

Returns one estimate with its sections in order and the line items in each section, with quantity and price. Line item totals add up to the estimate total. Use it to read back what was promised on a job.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `estimate_id` | string | yes | Estimate ID from list_estimates. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "acculynx_get_estimate",
    "arguments": {
      "estimate_id": "estimate_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "estimate_id": "a40d9e17-2f6b-4c83-b1a5-7e3c8d0f6291",
    "name": "Full replacement, architectural shingles",
    "total": "14850.00",
    "sections": [
      {
        "name": "Materials",
        "items": [
          {
            "name": "Architectural shingles",
            "quantity": 32,
            "unit": "square",
            "price": "210.00",
            "total": "6720.00"
          }
        ]
      },
      {
        "name": "Labor",
        "items": [
          {
            "name": "Tear-off and install",
            "quantity": 32,
            "unit": "square",
            "price": "253.13",
            "total": "8100.00"
          },
          {
            "name": "Dumpster",
            "quantity": 1,
            "unit": "each",
            "price": "30.00",
            "total": "30.00"
          }
        ]
      }
    ]
  },
  "isError": false
}
```

## List job messages

MCP tool: `acculynx_list_job_messages`

Access: read.

Returns the messages on one job, newest first, with replies nested under the message they answer. Use it to read what the crew and office said before you post.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |
| `limit` | integer | no | 1 to 100. Default: 25. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "acculynx_list_job_messages",
    "arguments": {
      "job_id": "job_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "messages": [
      {
        "message_id": "m-3a91",
        "author": "Dana Whitfield",
        "body": "Customer wants the ridge vent upgrade.",
        "posted_at": "2026-10-04T14:10:00-05:00",
        "replies": [
          {
            "message_id": "m-3a97",
            "author": "Crew lead",
            "body": "Added to the order.",
            "posted_at": "2026-10-04T15:02:00-05:00"
          }
        ]
      }
    ]
  },
  "isError": false
}
```

## List job payments

MCP tool: `acculynx_list_job_payments`

Access: read.

Returns the payments recorded on one job, newest first, with the method and reference. Use it before record_payment_received to see whether a deposit is already there.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "acculynx_list_job_payments",
    "arguments": {
      "job_id": "job_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "payments": [
      {
        "payment_id": "p-1182",
        "type": "received",
        "amount": "7425.00",
        "method": "Check",
        "reference": "#1043",
        "received_on": "2026-09-12"
      }
    ]
  },
  "isError": false
}
```

## Create contact

MCP tool: `acculynx_create_contact`

Access: write.

Adds one contact to AccuLynx and returns its contact_id. It adds a record your team sees and sends nothing to the person, so it runs without asking. Use find_contact first to avoid duplicates.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `first_name` | string | yes | First name. |
| `last_name` | string | yes | Last name. |
| `phone` | string | no | Phone number. |
| `email` | string | no | Email address. |
| `address` | object | no | street, city, state, zip. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "acculynx_create_contact",
    "arguments": {
      "first_name": "first name",
      "last_name": "last name"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "contact_id": "c7d2a9f0-3b11-4e8c-a6d5-91f0e2b47c18",
    "name": "Jane Doe",
    "phone": "(214) 555-0142",
    "email": "jane.doe@example.com",
    "created_at": "2026-10-11T09:02:00-05:00"
  },
  "isError": false
}
```

## Create job

MCP tool: `acculynx_create_job`

Access: write.

Opens a job for an existing contact and returns it with the milestone it starts in. The job site address defaults to the contact address. It adds a record your team sees and sends nothing to the customer, so it runs without asking.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `contact_id` | string | yes | Contact ID from find_contact or create_contact. |
| `job_name` | string | no | Default: contact name and street. |
| `address` | object | no | Job site: street, city, state, zip. Default: contact address. |
| `priority` | enum | no | Normal, High or Urgent. Default: Normal. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "acculynx_create_job",
    "arguments": {
      "contact_id": "c7d2a9f0-3b11-4e8c-a6d5-91f0e2b47c18",
      "job_name": "Doe - 12 Oak St",
      "address": {
        "street": "12 Oak St",
        "city": "Plano",
        "state": "TX",
        "zip": "75074"
      },
      "priority": "High"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "job_id": "f2a6c8d1-4e93-4b07-a1d5-3c9e7b0f5a62",
    "job_name": "Doe - 12 Oak St",
    "address": "12 Oak St, Plano, TX 75074",
    "milestone": "Lead",
    "priority": "High",
    "created_at": "2026-10-11T09:03:00-05:00"
  },
  "isError": false
}
```

## Update job milestone

MCP tool: `acculynx_update_job_milestone`

Access: write. Confirm: waits for the user's OK before it runs.

Moves one job to another milestone the way you do in the job file, and returns the previous milestone and the date of the new one. It fails if your AccuLynx role does not allow the move. A milestone change can set off your own AccuLynx workflow. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |
| `milestone` | enum | yes | Prospect, Approved, Completed, Invoiced, Closed or Dead. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "acculynx_update_job_milestone",
    "arguments": {
      "job_id": "b3f1c2a4-7d2e-4f0a-9c51-2e8a4d6f1b90",
      "milestone": "Approved"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "job_id": "b3f1c2a4-7d2e-4f0a-9c51-2e8a4d6f1b90",
    "job_name": "Miller - 48 Pine Ridge Rd",
    "milestone": "Approved",
    "previous_milestone": "Prospect",
    "milestone_date": "2026-10-12T09:14:00-05:00"
  },
  "isError": false
}
```

## Upload job photo

MCP tool: `acculynx_upload_job_photo`

Access: write.

Adds one photo or video to the job file and returns its ID. The tag must be one of your company photo and video tags. The file goes into the job and nothing is sent to anyone, so it runs without asking.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |
| `file_url` | string | yes | Image or video URL, or a file sent with the REST call. |
| `tag` | string | no | One of your company photo and video tags. |
| `description` | string | no | Caption shown with the photo. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "acculynx_upload_job_photo",
    "arguments": {
      "job_id": "job_8c41d2",
      "file_url": "https://example.com"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "photo_id": "ph-5530",
    "job_id": "b3f1c2a4-7d2e-4f0a-9c51-2e8a4d6f1b90",
    "tag": "Inspection",
    "description": "North slope, ridge cap damage",
    "uploaded_at": "2026-10-11T10:21:00-05:00"
  },
  "isError": false
}
```

## Post job message

MCP tool: `acculynx_post_job_message`

Access: write. Confirm: waits for the user's OK before it runs.

Posts a message on one job under your name, or a reply under an existing message when reply_to_id is set. Your team sees it on the job. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |
| `body` | string | yes | Message text. |
| `reply_to_id` | string | no | Message ID from list_job_messages to reply to. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "acculynx_post_job_message",
    "arguments": {
      "job_id": "job_8c41d2",
      "body": "body"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "message_id": "m-3b02",
    "job_id": "b3f1c2a4-7d2e-4f0a-9c51-2e8a4d6f1b90",
    "reply_to_id": null,
    "status": "posted",
    "posted_at": "2026-10-11T10:24:00-05:00"
  },
  "isError": false
}
```

## Add contact note

MCP tool: `acculynx_add_contact_note`

Access: write.

Adds a note to one contact record and returns its ID. The note shows on the contact in AccuLynx and is sent to no one, so it runs without asking.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `contact_id` | string | yes | Contact ID from find_contact or create_contact. |
| `body` | string | yes | Note text. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "acculynx_add_contact_note",
    "arguments": {
      "contact_id": "contact_8c41d2",
      "body": "body"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "note_id": "n-7741",
    "contact_id": "c7d2a9f0-3b11-4e8c-a6d5-91f0e2b47c18",
    "status": "added",
    "created_at": "2026-10-11T09:05:00-05:00"
  },
  "isError": false
}
```

## Record payment received

MCP tool: `acculynx_record_payment_received`

Access: write. Confirm: waits for the user's OK before it runs.

Records a payment the customer already made on one job, for example a deposit check, and returns the payment. Nothing is charged: it only writes the payment into the job. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |
| `amount` | string | yes | Amount, e.g. "2500.00". |
| `method` | string | yes | Payment method as named in your AccuLynx account, e.g. Check. |
| `received_on` | date | no | Default: today. |
| `reference` | string | no | Check number or memo. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "acculynx_record_payment_received",
    "arguments": {
      "job_id": "job_8c41d2",
      "amount": "2500.00",
      "method": "method"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "payment_id": "p-1183",
    "job_id": "b3f1c2a4-7d2e-4f0a-9c51-2e8a4d6f1b90",
    "amount": "2500.00",
    "method": "Check",
    "reference": "#2218",
    "received_on": "2026-10-12",
    "status": "recorded"
  },
  "isError": false
}
```
