# Contractor Foreman API and MCP server

> Contractor Foreman has no public API (checked 11 Oct 2026). Its only programmatic access is a Zapier app with 7 triggers for leads, customers and file uploads, and 2 actions: Create Lead and Create Customer.

Construction management software for contractors: projects, estimates, change orders, daily logs, Gantt scheduling, time cards, invoices, punchlists and job costing.

## What is the Contractor Foreman API?

Cotlet's Contractor Foreman API exposes 15 endpoints for your own Contractor Foreman account: list projects, get project, get job costing, list estimates, list change orders, list daily logs, list schedule tasks, list invoices, create daily log, create estimate, send estimate, create change order, send change order, update schedule task and add punchlist item. The list_projects endpoint returns projects with customer, address, stage, contract amount and percent complete. Each endpoint takes simple JSON inputs like project_id, limit or title and works both as an MCP tool for agents and as a REST call for scripts.

- **Category:** [Local services & SaaS](https://cotlet.dev/integrations/category/local-services-saas)
- **Endpoints:** 15 (8 read, 7 write)
- **Updated:** 2026-10-11

Contractor Foreman has no public API (checked 11 Oct 2026). Cotlet is a hosted MCP server and REST API for Contractor Foreman with 15 endpoints (8 read, 7 write): your AI agent signs in as you and does the work.

## Does Contractor Foreman have an official API?

Contractor Foreman has no public API (checked 11 Oct 2026). Its only programmatic access is a Zapier app with 7 triggers for leads, customers and file uploads, and 2 actions: Create Lead and Create Customer.

| Task | Contractor Foreman official | Cotlet |
|---|---|---|
| Read projects and job costing | No | Yes |
| Create estimates and send them for e-signature | No | Yes |
| Create and send change orders | No | Yes |
| Add daily logs | No | Yes |
| Update schedule tasks and percent complete | No | Yes |
| List invoices and open balances | No | Yes |
| Add punchlist items | No | Yes |
| Add leads and customers | Partly: Zapier actions Create Lead and Create Customer, no reads | Yes |

Sources: [Contractor Foreman: Zapier integration](https://contractorforeman.com/features/integrations/zapier/), [Contractor Foreman on Zapier: triggers and actions](https://zapier.com/apps/contractor-foreman/integrations), [Contractor Foreman: features](https://contractorforeman.com/features/), [Contractor Foreman: pricing](https://contractorforeman.com/pricing/), [Contractor Foreman Knowledge Base: no over-budget notification](https://kb.contractorforeman.com/knowledge-base/how-do-i-receive-a-notification-that-my-project-has-gone-over-budget/), [Contractor Foreman Knowledge Base: no notification for exceeding budgeted hours](https://kb.contractorforeman.com/knowledge-base/how-do-i-set-up-a-notification-if-i-exceed-budgeted-hours-on-a-project/), [Contractor Foreman: Daily Logs feature (weather recorded automatically)](https://contractorforeman.com/features/daily-logs/), [Contractor Foreman Knowledge Base: Daily Log statuses](https://kb.contractorforeman.com/knowledge-base/how-do-i-update-the-daily-log-status/), [Contractor Foreman: Estimates feature (e-signature, opened notifications)](https://contractorforeman.com/features/estimates/), [Contractor Foreman Knowledge Base: estimate Send Reminder](https://kb.contractorforeman.com/knowledge-base/estimates-workflow-visibility-and-follow-up-enhancements/), [Contractor Foreman: Change Orders feature (e-signature)](https://contractorforeman.com/features/change-orders/), [Contractor Foreman Knowledge Base: Change Order Request cannot be converted](https://kb.contractorforeman.com/knowledge-base/how-do-i-convert-a-change-order-request-to-a-change-order/), [Contractor Foreman Knowledge Base: signing a Change Order in the mobile app](https://kb.contractorforeman.com/knowledge-base/is-there-an-option-to-sign-the-change-order-within-the-mobile-app/)

## For AI agents

```text
Contractor Foreman has no public API (checked 11 Oct 2026). Its only programmatic access is a Zapier app with 7 triggers for leads, customers and file uploads, and 2 actions: Create Lead and Create Customer.
Cotlet provides a hosted MCP server and REST API for Contractor Foreman: 15 tools (8 read, 7 write).
Access       Request access at https://cotlet.dev/app/signup?app=contractor-foreman; we email the API key.

MCP server   https://cotlet.dev/mcp/v1
REST base    https://cotlet.dev/api/v1/contractor-foreman
Auth         Authorization: Bearer <COTLET_API_KEY>. Listing endpoints and schemas needs no key; calling an endpoint needs one.
Tools        list_projects, get_project, get_job_costing, list_estimates, list_change_orders, list_daily_logs, list_schedule_tasks, list_invoices, create_daily_log, create_estimate, send_estimate, create_change_order, send_change_order, update_schedule_task, add_punchlist_item
Confirm      send_estimate, send_change_order, add_punchlist_item (by default the user approves each call; the user can switch this off per tool, e.g. for scheduled automations)
Markdown     https://cotlet.dev/integrations/contractor-foreman-api-mcp-server.md

How access works:
1. The user requests access at https://cotlet.dev/app/signup?app=contractor-foreman (Contractor Foreman is pre-selected). Each request is reviewed and the API key is sent by email.
2. The user signs in to Contractor Foreman once in a browser. An agent cannot do this step.
3. The API key goes into the MCP client or the REST call as a bearer token.

Fits: people who want a hosted Contractor Foreman server that someone else maintains, including non-developers.

Policy: Cotlet never stores passwords, never solves CAPTCHAs, never bypasses MFA.
Company: legal details in the Terms of service at https://cotlet.dev/terms. Contact contact@cotlet.dev.
Session: the user signs in to Contractor Foreman in a browser; Cotlet keeps only the session, AES-256 encrypted, revocable in the dashboard at any time.
Terms: the user stays responsible for following Contractor Foreman's terms; Cotlet is not affiliated with Contractor Foreman.
```

## What can an AI agent do in Contractor Foreman?

Cotlet is best for contractors and project managers who want an AI agent to write daily logs, estimates and change orders and check job costing without running or fixing a server.

- **[Turn a foreman's site note into a daily log](https://cotlet.dev/integrations/contractor-foreman-api-mcp-server/add-daily-logs)** (runs: daily): "Here is Mike's voice note from the Maple St remodel. Turn it into today's daily log: framing crew of 4, one electrician, drywall delivered, rain stopped work at 2:30." → `list_projects`, `list_daily_logs`, `create_daily_log`
- **[Build an estimate from a scope list and send it for signature](https://cotlet.dev/integrations/contractor-foreman-api-mcp-server/create-and-send-estimates)**: "Turn this scope list from the Johnson bathroom walkthrough into a Contractor Foreman estimate with 20% markup on materials, show me the total, then send it to the client for signature." → `list_projects`, `list_estimates`, `create_estimate`, `send_estimate`
- **[Write a change order from a client request and send it for approval](https://cotlet.dev/integrations/contractor-foreman-api-mcp-server/create-change-orders)**: "Dana wants a second window on the kitchen east wall at Maple St. Write the change order with the window, 6 hours of install labor and 20% markup, and send it to her for approval." → `list_projects`, `list_change_orders`, `create_change_order`, `send_change_order`
- **Reschedule a task and check the Gantt**: "Rough-in inspection moved to Friday. Push that task and tell me what else shifts." → `list_schedule_tasks`, `update_schedule_task`
- **[Find projects going over budget](https://cotlet.dev/integrations/contractor-foreman-api-mcp-server/job-costing-report)** (runs: weekly): "Every Monday, check job costing on all my open Contractor Foreman projects and tell me which ones have spent more than estimated on labor or materials, and by how much." → `list_projects`, `get_project`, `get_job_costing`
- **List overdue invoices every Monday** (runs: weekly): "Every Monday, list unpaid invoices older than 30 days with the amount due." → `list_invoices`

## Can Contractor Foreman automations run on a schedule in n8n, Make or Zapier?

Yes. Cotlet does not replace your automation platform: it gives it a Contractor Foreman connection it does not have, with the same API key as your agent. Write actions ask for your OK by default; switch that off in your dashboard for the tools you choose, for example to turn a foreman's site note into a daily log, and the schedule runs on its own. Cotlet runs in the cloud, so it keeps going while your computer is off.

| Where | How to connect | How to schedule |
|---|---|---|
| Your AI agent | Add https://cotlet.dev/mcp/v1 with your API key. | A scheduled agent run, for example a Claude Code routine. |
| n8n | MCP Client node with https://cotlet.dev/mcp/v1, or an HTTP Request node to https://cotlet.dev/api/v1/contractor-foreman/{tool}. | Schedule Trigger node. |
| Make | HTTP module: POST https://cotlet.dev/api/v1/contractor-foreman/{tool} with an Authorization: Bearer header and a JSON body. | Scenario schedule. |
| Zapier | Webhooks by Zapier: POST https://cotlet.dev/api/v1/contractor-foreman/{tool} with the same header and body. | Schedule by Zapier trigger. |
| Your own script | POST https://cotlet.dev/api/v1/contractor-foreman/{tool} with your API key. | cron or GitHub Actions. |

## Tools

**For AI agents:** Every endpoint and its schema is public. The 15 endpoints on this page, with parameters and example responses, can be listed without an account. Calling one returns 403 until the account has an API key with access to Contractor Foreman.

### list_projects

Projects with customer, address, stage, contract amount and percent complete. Access: read. REST: `POST /api/v1/contractor-foreman/list_projects`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `search` | string | no | Match on project name, number or customer. |
| `include_completed` | boolean | no | Include completed projects. Default: false. |
| `limit` | integer | no | 1 to 100. Default: 25. |
| `cursor` | string | no | Next page cursor from the previous call. |

Returns projects newest first. Completed projects are left out unless you ask for them. Search matches the project name, number or customer. Pages hold up to 100 projects; pass next_cursor back as cursor for the next page.

Example response:

```json
{
  "projects": [
    {
      "project_id": "84213",
      "name": "Maple St Remodel",
      "number": "P-0142",
      "customer": "Dana Whitfield",
      "address": "218 Maple St, Asheville, NC",
      "stage": "In progress",
      "contract_amount": 86500,
      "percent_complete": 42
    }
  ],
  "next_cursor": null
}
```

### get_project

One project: customer, address, stage, original and revised contract amount, dates. Access: read. REST: `POST /api/v1/contractor-foreman/get_project`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `project_id` | string | yes | Project ID from list_projects. |

Returns one project. The revised contract amount is the original amount plus approved change orders, as the project shows it. Use the project_id from list_projects.

Example response:

```json
{
  "project_id": "84213",
  "name": "Maple St Remodel",
  "customer": "Dana Whitfield",
  "address": "218 Maple St, Asheville, NC",
  "stage": "In progress",
  "original_contract_amount": 86500,
  "revised_contract_amount": 86500,
  "start_date": "2026-08-17",
  "end_date": "2026-12-11"
}
```

### get_job_costing

Estimated and actual cost per cost code for one project, with the difference. Access: read. REST: `POST /api/v1/contractor-foreman/get_job_costing`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `project_id` | string | yes | Project ID from list_projects. |

Returns the figures of the project's job costing: estimated cost, actual cost and the difference for each cost code, plus totals. Labor from time cards counts toward actual cost. Read only.

Example response:

```json
{
  "project_id": "84213",
  "cost_codes": [
    {
      "code": "Labor",
      "estimated": 18000,
      "actual": 19250,
      "difference": -1250
    },
    {
      "code": "Materials",
      "estimated": 22000,
      "actual": 20100,
      "difference": 1900
    },
    {
      "code": "Subcontractors",
      "estimated": 9000,
      "actual": 9000,
      "difference": 0
    }
  ],
  "totals": {
    "estimated": 49000,
    "actual": 48350,
    "difference": 650
  },
  "currency": "USD"
}
```

### list_estimates

Estimates with status, total, and whether the client opened or signed them. Access: read. REST: `POST /api/v1/contractor-foreman/list_estimates`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `project_id` | string | no | Only estimates for this project. |
| `status` | string | no | Filter by status as shown in Contractor Foreman, e.g. draft or approved. |
| `limit` | integer | no | 1 to 100. Default: 25. |

Returns estimates newest first, optionally for one project. Status is the label Contractor Foreman shows, for example draft or approved. Pages hold up to 100 estimates.

Example response:

```json
{
  "estimates": [
    {
      "estimate_id": "E-2291",
      "project_id": "84213",
      "title": "Bathroom remodel",
      "status": "draft",
      "total": 1589,
      "opened_by_client": false,
      "signed": false
    }
  ]
}
```

### list_change_orders

Change orders and change order requests on a project, with status and amount. Access: read. REST: `POST /api/v1/contractor-foreman/list_change_orders`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `project_id` | string | yes | Project ID from list_projects. |
| `include_requests` | boolean | no | Include change order requests not yet in a change order. Default: true. |

Returns the change orders of one project with status and amount. Change order requests that are not yet in a change order are included unless you turn them off.

Example response:

```json
{
  "change_orders": [
    {
      "change_order_id": "CO-17",
      "title": "Second kitchen window",
      "status": "draft",
      "amount": 1368
    }
  ]
}
```

### list_daily_logs

Daily logs on a project: date, people on site, weather, materials and notes. Access: read. REST: `POST /api/v1/contractor-foreman/list_daily_logs`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `project_id` | string | yes | Project ID from list_projects. |
| `from` | date | no | First log date. |
| `to` | date | no | Last log date. |

Returns the daily logs of one project, newest first, optionally between two dates. Each log carries the notes, the people on site, deliveries and the weather Contractor Foreman recorded.

Example response:

```json
{
  "daily_logs": [
    {
      "daily_log_id": "557190",
      "date": "2026-10-09",
      "notes": "Framing second floor east wall.",
      "people": {
        "Framing crew": 4
      },
      "weather": {
        "condition": "Rain",
        "high_f": 61,
        "low_f": 48
      }
    }
  ]
}
```

### list_schedule_tasks

Gantt schedule tasks with start and end dates, dependencies and percent complete. Access: read. REST: `POST /api/v1/contractor-foreman/list_schedule_tasks`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `project_id` | string | yes | Project ID from list_projects. |

Returns the tasks of the project schedule in the order of the Gantt chart. Each task has start and end dates, the tasks it depends on and percent complete. Use the task_id with update_schedule_task.

Example response:

```json
{
  "tasks": [
    {
      "task_id": "T-5530",
      "name": "Rough-in inspection",
      "start_date": "2026-10-14",
      "end_date": "2026-10-14",
      "depends_on": [
        "T-5521"
      ],
      "percent_complete": 0
    }
  ]
}
```

### list_invoices

Invoices with project, customer, total, amount paid, balance due and retainage held. Access: read. REST: `POST /api/v1/contractor-foreman/list_invoices`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `project_id` | string | no | Only invoices for this project. |
| `unpaid_only` | boolean | no | Only invoices with a balance due. Default: false. |
| `due_before` | date | no | Only invoices due before this date. |
| `limit` | integer | no | 1 to 100. Default: 25. |

Returns invoices newest first. Balance due is the total minus the amount paid. Retainage held is listed apart from it. Filter to invoices with a balance or due before a date. Pages hold up to 100 invoices.

Example response:

```json
{
  "invoices": [
    {
      "invoice_id": "INV-1048",
      "project_id": "84213",
      "customer": "Dana Whitfield",
      "total": 12000,
      "paid": 7000,
      "balance_due": 5000,
      "retainage_held": 600,
      "due_date": "2026-09-05"
    }
  ]
}
```

### create_daily_log

New daily log on a project. Weather is recorded by Contractor Foreman for the date. Access: write. REST: `POST /api/v1/contractor-foreman/create_daily_log`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `project_id` | string | yes | Project ID from list_projects. |
| `date` | date | yes | Log date. |
| `notes` | string | yes | Work done and site notes. |
| `people` | object | no | Crews, subcontractors and visitors on site, with headcount or names. |
| `materials_delivered` | string[] | no | Materials delivered to the site. |
| `weather_notes` | string | no | Your own notes next to the recorded weather. |

Adds a daily log to the project for the date you give. Contractor Foreman records the weather itself; weather_notes sits next to it. The log reaches no client or crew and can be edited in the app, so this tool runs without asking.

Example response:

```json
{
  "daily_log_id": "557190",
  "project_id": "84213",
  "date": "2026-10-09",
  "weather": {
    "condition": "Rain",
    "high_f": 61,
    "low_f": 48
  }
}
```

### create_estimate

Draft estimate with line items and markup. Nothing goes to the client until you send it. Access: write. REST: `POST /api/v1/contractor-foreman/create_estimate`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `project_id` | string | yes | Project ID from list_projects. |
| `title` | string | yes | Estimate title. |
| `items` | object | yes | Line items: name, item type (e.g. material or labor), quantity, unit cost, markup percent. |
| `notes` | string | no | Scope notes shown on the estimate. |

Saves a draft estimate on the project. Each line total is quantity times unit cost plus its markup, and the estimate total is the sum of the lines. The client sees nothing until send_estimate, so this tool runs without asking.

Example response:

```json
{
  "estimate_id": "E-2291",
  "project_id": "84213",
  "title": "Johnson bathroom",
  "status": "draft",
  "lines": [
    {
      "name": "Demolition labor",
      "total": 968
    },
    {
      "name": "Tile",
      "total": 621
    }
  ],
  "total": 1589
}
```

### send_estimate

Email an estimate to the client for online approval and e-signature. Access: write, asks the user first. REST: `POST /api/v1/contractor-foreman/send_estimate`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `estimate_id` | string | yes | Estimate ID from create_estimate or list_estimates. |
| `to` | string[] | no | Recipient emails. Default: the project customer. |
| `message` | string | no | Email body. |

Emails the estimate to the recipients for online approval and e-signature. Without recipients it goes to the project customer. The client can approve it from the email. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "estimate_id": "E-2291",
  "status": "sent",
  "sent_to": [
    "client@example.com"
  ]
}
```

### create_change_order

Draft change order on a project, itemized or lump sum. Not sent until you send it. Access: write. REST: `POST /api/v1/contractor-foreman/create_change_order`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `project_id` | string | yes | Project ID from list_projects. |
| `title` | string | yes | Change order title. |
| `items` | object | yes | Line items: name, quantity, unit cost, markup percent. |
| `lump_sum` | boolean | no | Show the client one total instead of items. Default: false. |
| `description` | string | no | Reason for the change. |

Saves a draft change order. Each line total is quantity times unit cost plus its markup, and the total is the sum of the lines. With lump_sum the client sees one total instead of the lines. Nothing reaches the client until send_change_order, so this tool runs without asking.

Example response:

```json
{
  "change_order_id": "CO-17",
  "project_id": "84213",
  "title": "Second kitchen window",
  "status": "draft",
  "lump_sum": false,
  "lines": [
    {
      "name": "Window unit",
      "total": 936
    },
    {
      "name": "Install labor",
      "total": 432
    }
  ],
  "total": 1368
}
```

### send_change_order

Email a change order to the client for online approval and e-signature. Access: write, asks the user first. REST: `POST /api/v1/contractor-foreman/send_change_order`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `change_order_id` | string | yes | Change order ID from create_change_order. |
| `message` | string | no | Email body. |

Emails the change order to the project customer for online approval and e-signature. Approval is up to the client; the revised contract amount changes only after that. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "change_order_id": "CO-17",
  "status": "sent",
  "sent_to": [
    "client@example.com"
  ]
}
```

### update_schedule_task

Change dates or percent complete of a task on the project schedule. Access: write. REST: `POST /api/v1/contractor-foreman/update_schedule_task`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `task_id` | string | yes | Task ID from list_schedule_tasks. |
| `start_date` | date | no | New start date. |
| `end_date` | date | no | New end date. |
| `percent_complete` | integer | no | 0 to 100. |

Changes the start date, end date or percent complete of one task and returns the task as the schedule shows it afterwards. Call list_schedule_tasks again to see tasks that depend on it. A schedule edit reaches no client, and one more call undoes it, so this tool runs without asking.

Example response:

```json
{
  "task_id": "T-5530",
  "name": "Rough-in inspection",
  "start_date": "2026-10-16",
  "end_date": "2026-10-16",
  "percent_complete": 0
}
```

### add_punchlist_item

New punchlist item on a project, assigned to an employee or subcontractor. Access: write, asks the user first. REST: `POST /api/v1/contractor-foreman/add_punchlist_item`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `project_id` | string | yes | Project ID from list_projects. |
| `title` | string | yes | What needs fixing. |
| `assignee` | string | no | Name or email from your Directory. |
| `due_date` | date | no | Due date, added to the calendar. |

Adds a punchlist item to the project and assigns it to someone from your Directory. A due date is added to the calendar. The item is assigned to another person, so you confirm it. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "punchlist_item_id": "PL-311",
  "project_id": "84213",
  "title": "Touch up paint, hallway",
  "assignee": "Sam Rivera",
  "due_date": "2026-10-20",
  "status": "open"
}
```

## How do I connect Contractor Foreman to Claude Code, Codex or Cursor?

Connecting Contractor Foreman takes three steps: request access, sign in to Contractor Foreman once, then add one MCP server or call the REST API with the same key.

### Connect Contractor Foreman to your agent.

1. **Create an account** Sign up and add Contractor Foreman in the console. Your API key is there too.

2. **Sign in to Contractor Foreman once** Open the connect page from the console and sign in to Contractor Foreman the way you always do. We keep the session, never your password, and you can revoke it anytime.

3. **Add Cotlet to your agent** Paste the snippet for your client. The same server and key serve every app you connect, so you do this once.

   Claude Code:

```
claude mcp add --transport http cotlet \
  https://cotlet.dev/mcp/v1 \
  --header "Authorization: Bearer $COTLET_API_KEY"
```

   Cursor:

```
{
  "mcpServers": {
    "cotlet": {
      "url": "https://cotlet.dev/mcp/v1",
      "headers": {
        "Authorization": "Bearer ${COTLET_API_KEY}"
      }
    }
  }
}
```

   Codex:

```
# ~/.codex/config.toml
[mcp_servers.cotlet]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY"
```

4. **Ask your agent** Ask in plain words. Your agent finds the Contractor Foreman tools on the server and calls them for you; anything that reaches other people waits for your OK unless you switch that off for a tool.

```
Here is Mike's voice note from the Maple St remodel. Turn it into today's daily log: framing crew of 4, one electrician, drywall delivered, rain stopped work at 2:30.
```

### Call Contractor Foreman from your scripts.

1. **Export your API key** Your scripts use the same API key as your agent. Keep it in an environment variable, never in your code.

```
export COTLET_API_KEY="cotlet_..."
```

2. **Call a tool** Every tool is a POST endpoint at /api/v1/contractor-foreman/{tool}. Send its parameters as JSON, exactly as listed in the endpoints above.

```
curl https://cotlet.dev/api/v1/contractor-foreman/create_daily_log \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"project_id":"84213","date":"2026-10-09","notes":"Framing second floor east wall. Window rough openings checked.","people":{"Framing crew":4,"Electrical sub":1},"materials_delivered":["48 sheets 1/2\" drywall","20 2x6x12 studs"],"weather_notes":"Rain after 2 pm, crew stopped at 2:30."}'
```

3. **Read the result** You get plain JSON back, ready for your script. A failed call costs nothing.

```
{
  "daily_log_id": "557190",
  "project_id": "84213",
  "date": "2026-10-09",
  "weather": {
    "condition": "Rain",
    "high_f": 61,
    "low_f": 48
  }
}
```

## Why use Cotlet for Contractor Foreman?

**Built for agents**

- One MCP server for every app you connect.
- The same tools as a REST API for scripts and cron jobs.
- Works with Claude Code, Codex and Cursor.

**Your login stays yours**

- You sign in to Contractor Foreman yourself. We keep only the session, encrypted with AES-256.
- The model never sees a login.
- No stored passwords, no CAPTCHA solving, no MFA bypass.

**You stay in control**

- Pick read only, or read and write.
- Anything that reaches other people waits for your OK, unless you switch it off per tool.
- Revoke access in one click.

**Kept working for you**

- We test every integration daily.
- When Contractor Foreman changes, the tool pauses until we fix it.
- Failed calls cost nothing.

## Is there a Contractor Foreman MCP server on GitHub?

Contractor Foreman's own Zapier app moves leads, customers and file uploads to other apps. It reaches nothing else: no estimates, logs, schedule or financials.

|  | Zapier | Cotlet |
|---|---|---|
| Setup | Connect your Contractor Foreman account in Zapier, build a Zap per workflow | Request access, sign in to Contractor Foreman once, add one MCP server or API key |
| What it can reach | Leads, customers and file uploads | Projects, estimates, change orders, daily logs, schedule, invoices, job costing, punchlist |
| Write actions | Create Lead and Create Customer only | Daily logs, estimates, change orders, schedule and punchlist updates; sends to clients ask for your OK |
| When the app changes | Zapier maintains the app Contractor Foreman built | Our team tests it daily and fixes it for you; failed calls are free |
| Your session | Account connection stored by Zapier | Encrypted in an EU vault, limited to the actions you allow, revoked in one click |
| Where it runs | Fixed Zaps on Zapier | Hosted: Claude Code, Codex, Cursor, n8n and scripts, also on a schedule |
| Price | Included in your Contractor Foreman subscription; Zapier may need its own plan | Free 7-day trial with 5,000 credits, then credits per call |

### Which one fits you

**Pick Cotlet if**

- you are not a developer, or you do not want to maintain a server
- you need it to keep working when Contractor Foreman changes, without checking it yourself
- your agent or a script should run it on a schedule, also while your computer is off

**Pick an open-source server if**

- you are comfortable installing, updating and fixing it yourself
- you want the session to stay on your own computer
- you only need it now and then, from one MCP client

## How much does the Contractor Foreman API cost?

Free 7-day trial with 5,000 credits, no card needed. After that, the Contractor Foreman API comes with the Cotlet plan, from $29 a month for 3,000 credits, with no limit on apps. Each month's credits stay valid for 3 months, so unused credits add up.

| Size | Price | Credits / month | Per credit |
|---|---|---|---|
| Solo | $29/mo | 3,000 | about $0.0097 |
| Pro | $99/mo | 12,000 | about $0.0083 |
| Agency | $299/mo | 40,000 | $0.0075 |

Each successful call uses credits for the work it takes; failed calls and timeouts cost nothing. A hard spend cap is on by default. Authenticate with the `Authorization: Bearer` header. [See full pricing](https://cotlet.dev/pricing)

## How Cotlet holds your access

Cotlet hosts MCP servers and REST APIs for apps with no usable API. Your agent works in your own Contractor Foreman account.

- **Company details:** The legal name, address and registration numbers of the company behind Cotlet are in the Terms of service. [Terms](https://cotlet.dev/terms)
- **Your session:** You sign in to Contractor Foreman yourself, in your browser. We keep only the session, never your password: encrypted with AES-256 in an EU vault, isolated to your account and used only when your agent calls a Contractor Foreman tool you allowed. When it expires, your agent gives you a link to sign in again. [Security](https://cotlet.dev/security)
- **Revoking access:** Disconnect Contractor Foreman in your dashboard: the session is deleted and access ends at once. Actions that reach other people wait for your OK unless you switch that off per tool.
- **What we never do:** Store passwords, solve CAPTCHAs or bypass MFA.
- **Contractor Foreman's terms:** You use your own Contractor Foreman account and stay responsible for following Contractor Foreman's terms. Cotlet is independent and not affiliated with Contractor Foreman. [Terms](https://cotlet.dev/terms)
- **Contact:** Questions about the company, security or an app: [contact@cotlet.dev](mailto:contact@cotlet.dev)

## Frequently asked questions

**How do I get access?**

Request access and pick Contractor Foreman. Cotlet reviews each request and emails you your API key.

**Do I need to be technical?**

No. You sign in to Contractor Foreman once in your browser and paste one command into your agent, or one URL into n8n. Your agent can walk you through it. There is no server to install, update or fix.

**Is a hosted server safe? My Contractor Foreman session would leave my computer.**

Cotlet keeps your Contractor Foreman session encrypted with AES-256 in an EU vault, isolated to your account and used only for the tools you allow: read only, or read and write. The AI model never sees it, and you revoke it in one click. A local server keeps the same session in a file on your computer, readable by any program you run, and needs a fresh sign-in whenever it expires.

**Does Contractor Foreman have a way to export or sync estimates and logs?**

Not through its Zapier app (checked 11 Oct 2026). Contractor Foreman lists Zapier as included in the subscription, and the app has 7 triggers (leads, customers, file uploads) and 2 actions (Create Lead, Create Customer). Estimates, change orders, daily logs, schedule and invoices are not part of it.

**Which Contractor Foreman plan do I need?**

Cotlet works in your own account and does not use the Zapier app. Contractor Foreman's pricing page does not say which plans include API access, because there is none. What your agent can reach depends on the modules your role can open in the app.

**Can my agent post or send messages in Contractor Foreman without asking me?**

No. Every call to send_estimate, send_change_order or add_punchlist_item waits for your OK by default. For scheduled automations you can switch confirmation off per tool in your dashboard, for example only for approvals. create_daily_log, create_estimate, create_change_order, update_schedule_task runs without asking, because it sends nothing to anyone and one call undoes it.

**Can I use the Contractor Foreman API in n8n?**

Yes. Add https://cotlet.dev/mcp/v1 with your API key in n8n's MCP Client node, or call https://cotlet.dev/api/v1/contractor-foreman/{tool} from the HTTP Request node.
