# Contractor Foreman by Cotlet (remote · cotlet.dev)

Projects, estimates, daily logs and invoices in Contractor Foreman.

- Trust score: 68/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-24

## Components

- remote · `cotlet.dev`: 68/100 (this document), [markdown](https://verifymcp.io/servers/dev-cotlet-contractor-foreman/mcp-v1-contractor-foreman.md), [page](https://verifymcp.io/servers/dev-cotlet-contractor-foreman/mcp-v1-contractor-foreman)
- remote · `cotlet.dev`: 40/100, [markdown](https://verifymcp.io/servers/dev-cotlet-contractor-foreman/mcp-v1-contractor-foreman-connect.md), [page](https://verifymcp.io/servers/dev-cotlet-contractor-foreman/mcp-v1-contractor-foreman-connect)

## Channel facts

- Endpoint: `https://cotlet.dev/mcp/v1/contractor-foreman`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.1`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-24.

- **Endpoint Security**: 66/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (cotlet_browser_click).
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 78/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 14600 tokens (~136/item across 107 items; 106 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability check failed: schema churn in the 1 day we've observed: 3 tool removals, 0 breaking changes, 0 auth/transport breaks, 0 additions.
- **Tool Coverage**: 89/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 66% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 7 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 108 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the Contractor Foreman by Cotlet MCP server?

Contractor Foreman by Cotlet is a hosted endpoint at https://cotlet.dev/mcp/v1/contractor-foreman, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http dev-cotlet-contractor-foreman 'https://cotlet.dev/mcp/v1/contractor-foreman'
```

### Cursor

```json
{
  "mcpServers": {
    "dev-cotlet-contractor-foreman": {
      "url": "https://cotlet.dev/mcp/v1/contractor-foreman"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "dev-cotlet-contractor-foreman": {
      "type": "http",
      "url": "https://cotlet.dev/mcp/v1/contractor-foreman"
    }
  }
}
```

### Codex

```toml
[mcp_servers.dev-cotlet-contractor-foreman]
url = "https://cotlet.dev/mcp/v1/contractor-foreman"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "dev-cotlet-contractor-foreman": {
      "type": "remote",
      "url": "https://cotlet.dev/mcp/v1/contractor-foreman",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add dev-cotlet-contractor-foreman --url 'https://cotlet.dev/mcp/v1/contractor-foreman' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  dev-cotlet-contractor-foreman:
    url: "https://cotlet.dev/mcp/v1/contractor-foreman"
```

### Netclaw

```json
{
  "McpServers": {
    "dev-cotlet-contractor-foreman": {
      "Transport": "http",
      "Url": "https://cotlet.dev/mcp/v1/contractor-foreman"
    }
  }
}
```

### Vellum

```bash
assistant mcp add dev-cotlet-contractor-foreman -t streamable-http -u 'https://cotlet.dev/mcp/v1/contractor-foreman'
```

### Other

```json
{
  "mcpServers": {
    "dev-cotlet-contractor-foreman": {
      "type": "http",
      "url": "https://cotlet.dev/mcp/v1/contractor-foreman"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-24 (score 68, 0)

- [security regression] Stability: unverified → fail
- [security regression] A breaking change shipped without a version bump: still 0.1.0
- [security regression] Tool “cotlet_balance” was removed
- [security regression] Tool “cotlet_browser_connect” was removed
- [security regression] Tool “cotlet_browser_sessions” was removed
- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “add_change_order_items” rewrote its description, which is the text the model reads
- [security] Tool “add_estimate_items” rewrote its description, which is the text the model reads
- [security] Tool “add_invoice_items” rewrote its description, which is the text the model reads
- [security] Tool “add_project_note” rewrote its description, which is the text the model reads
- [security] Tool “cotlet_browser_click” rewrote its description, which is the text the model reads
- [security] Tool “cotlet_browser_close” rewrote its description, which is the text the model reads
- [security] Tool “cotlet_browser_navigate” rewrote its description, which is the text the model reads
- [security] Tool “cotlet_browser_open” rewrote its description, which is the text the model reads
- [security] Tool “cotlet_browser_press” rewrote its description, which is the text the model reads
- [security] Tool “cotlet_browser_read” rewrote its description, which is the text the model reads
- [security] Tool “cotlet_browser_screenshot” rewrote its description, which is the text the model reads
- [security] Tool “cotlet_browser_scroll” rewrote its description, which is the text the model reads
- [security] Tool “cotlet_browser_select” rewrote its description, which is the text the model reads
- [security] Tool “cotlet_browser_type” rewrote its description, which is the text the model reads
- [security] Tool “cotlet_browser_upload” rewrote its description, which is the text the model reads
- [security] Tool “create_bill” rewrote its description, which is the text the model reads
- [security] Tool “create_change_order” rewrote its description, which is the text the model reads
- [security] Tool “create_contact” rewrote its description, which is the text the model reads
- [security] Tool “create_daily_log” rewrote its description, which is the text the model reads
- [security] Tool “create_estimate” rewrote its description, which is the text the model reads
- [security] Tool “create_expense” rewrote its description, which is the text the model reads
- [security] Tool “create_inspection” rewrote its description, which is the text the model reads
- [security] Tool “create_invoice” rewrote its description, which is the text the model reads
- [security] Tool “create_lead” rewrote its description, which is the text the model reads
- [security] Tool “create_opportunity” rewrote its description, which is the text the model reads
- [security] Tool “create_project” rewrote its description, which is the text the model reads
- [security] Tool “create_punchlist” rewrote its description, which is the text the model reads
- [security] Tool “create_purchase_order” rewrote its description, which is the text the model reads
- [security] Tool “create_rfi” rewrote its description, which is the text the model reads
- [security] Tool “create_service_ticket” rewrote its description, which is the text the model reads
- [security] Tool “create_share_link” rewrote its description, which is the text the model reads
- [security] Tool “create_sub_contract” rewrote its description, which is the text the model reads
- [security] Tool “create_todo” rewrote its description, which is the text the model reads
- [security] Tool “create_work_order” rewrote its description, which is the text the model reads
- [security] Tool “delete_change_order” rewrote its description, which is the text the model reads
- [security] Tool “delete_estimate” rewrote its description, which is the text the model reads
- [security] Tool “delete_invoice” rewrote its description, which is the text the model reads
- [security] Tool “get_bill” rewrote its description, which is the text the model reads
- [security] Tool “get_change_order” rewrote its description, which is the text the model reads
- [security] Tool “get_clock_status” rewrote its description, which is the text the model reads
- [security] Tool “get_contact” rewrote its description, which is the text the model reads
- [security] Tool “get_daily_log” rewrote its description, which is the text the model reads
- [security] Tool “get_estimate” rewrote its description, which is the text the model reads
- [security] Tool “get_expense” rewrote its description, which is the text the model reads
- [security] Tool “get_inspection” rewrote its description, which is the text the model reads
- [security] Tool “get_invoice” rewrote its description, which is the text the model reads
- [security] Tool “get_job_costing” rewrote its description, which is the text the model reads
- [security] Tool “get_opportunity” rewrote its description, which is the text the model reads
- [security] Tool “get_project” rewrote its description, which is the text the model reads
- [security] Tool “get_punchlist” rewrote its description, which is the text the model reads
- [security] Tool “get_purchase_order” rewrote its description, which is the text the model reads
- [security] Tool “get_rfi” rewrote its description, which is the text the model reads
- [security] Tool “get_service_ticket” rewrote its description, which is the text the model reads
- [security] Tool “get_sub_contract” rewrote its description, which is the text the model reads
- [security] Tool “get_submittal” rewrote its description, which is the text the model reads
- [security] Tool “get_time_card” rewrote its description, which is the text the model reads
- [security] Tool “get_todo” rewrote its description, which is the text the model reads
- [security] Tool “get_work_order” rewrote its description, which is the text the model reads
- [security] Tool “list_bills” rewrote its description, which is the text the model reads
- [security] Tool “list_change_orders” rewrote its description, which is the text the model reads
- [security] Tool “list_contacts” rewrote its description, which is the text the model reads
- [security] Tool “list_cost_codes” rewrote its description, which is the text the model reads
- [security] Tool “list_cost_items” rewrote its description, which is the text the model reads
- [security] Tool “list_daily_logs” rewrote its description, which is the text the model reads
- [security] Tool “list_estimates” rewrote its description, which is the text the model reads
- [security] Tool “list_expenses” rewrote its description, which is the text the model reads
- [security] Tool “list_inspections” rewrote its description, which is the text the model reads
- [security] Tool “list_invoices” rewrote its description, which is the text the model reads
- [security] Tool “list_leads” rewrote its description, which is the text the model reads
- [security] Tool “list_opportunities” rewrote its description, which is the text the model reads
- [security] Tool “list_payments” rewrote its description, which is the text the model reads
- [security] Tool “list_project_crew_hours” rewrote its description, which is the text the model reads
- [security] Tool “list_project_files” rewrote its description, which is the text the model reads
- [security] Tool “list_project_notes” rewrote its description, which is the text the model reads
- [security] Tool “list_projects” rewrote its description, which is the text the model reads
- [security] Tool “list_punchlists” rewrote its description, which is the text the model reads
- [security] Tool “list_purchase_orders” rewrote its description, which is the text the model reads
- [security] Tool “list_rfis” rewrote its description, which is the text the model reads
- [security] Tool “list_schedule_tasks” rewrote its description, which is the text the model reads
- [security] Tool “list_service_tickets” rewrote its description, which is the text the model reads
- [security] Tool “list_sub_contracts” rewrote its description, which is the text the model reads
- [security] Tool “list_submittals” rewrote its description, which is the text the model reads
- [security] Tool “list_time_cards” rewrote its description, which is the text the model reads
- [security] Tool “list_todos” rewrote its description, which is the text the model reads
- [security] Tool “list_work_orders” rewrote its description, which is the text the model reads
- [security] Tool “record_inspection_result” rewrote its description, which is the text the model reads
- [security] Tool “record_payment” rewrote its description, which is the text the model reads
- [security] Tool “remove_estimate_items” rewrote its description, which is the text the model reads
- [security] Tool “send_change_order” rewrote its description, which is the text the model reads
- [security] Tool “send_estimate” rewrote its description, which is the text the model reads
- [security] Tool “send_invoice” rewrote its description, which is the text the model reads
- [security] Tool “update_change_order” rewrote its description, which is the text the model reads
- [security] Tool “update_daily_log” rewrote its description, which is the text the model reads
- [security] Tool “update_estimate” rewrote its description, which is the text the model reads
- [security] Tool “update_invoice” rewrote its description, which is the text the model reads
- [security] Tool “update_project” rewrote its description, which is the text the model reads
- [security] Tool “update_schedule_task” rewrote its description, which is the text the model reads
- [security] Tool “update_service_ticket_status” rewrote its description, which is the text the model reads
- [security] Tool “update_todo” rewrote its description, which is the text the model reads
- [security] Tool “update_work_order_status” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: pass → fail
- [functional improvement] Stability: unverified → 0.03

### 2026-10-23 (score 68)

First indexed and scored.

## MCP tools (106)

### `cotlet_whoami` (~63 tokens)

Cotlet: who am I

The Cotlet account this connection acts as: email, workspace, access status, the API key or OAuth client in use with its scope, the apps the workspace may call and its credit balance. Free. Needs the user's Cotlet API key or sign-in.

### `cotlet_apps` (~89 tokens)

Cotlet: apps I can use

The apps of the user's workspace and whether each works now: access granted or requested, the app account in the user's Cloud Browser (connected, signed out, not enabled for agents), and the one step the user has to take, with the console link. Free. Needs the user's Cotlet API key or sign-in.

Input parameters:

- `app` (string): Only this app, e.g. skool.

### `cotlet_request_apps` (~102 tokens)

Cotlet: request access to apps

Requests access to apps for the user's workspace, as Request access in the console: a live app is granted at once, any other goes to the Cotlet team, who answer within 72 hours. Takes app slugs as listed at https://cotlet.dev/api/v1/apps. Free. Needs the user's Cotlet API key or sign-in.

Input parameters:

- `apps` (array, required): App slugs, e.g. ["skool", "substack"].

### `cotlet_get_call` (~76 tokens)

Cotlet: check a call

Status of an earlier Cotlet call, by its call_id: pending (waits for the owner's approval in the Cotlet console), approved, running, success, rejected, expired, blocked or failed. For a call that answered with status pending or running.

Input parameters:

- `call_id` (string, required): call_id from the earlier call

### `cotlet_upload_file` (~115 tokens)

Cotlet: upload a file for a tool

Returns a one-time upload_url and a file_id for a local file (an image for a post, an attachment). The file is sent to upload_url with an HTTP PUT; an argument that takes a file accepts {"file_id": "..."}. Up to 25 MB, the URL works once. Free. Needs the user's Cotlet API key or sign-in.

Input parameters:

- `content_type` (string): MIME type, e.g. image/jpeg.
- `name` (string): File name, e.g. photo.jpg.

### `cotlet_report_issue` (~276 tokens)

Cotlet: report a bug or a missing feature

Sends a report straight to the Cotlet team: a tool that failed or returned wrong data, an error you could not get past, or a tool, field or app the task needed and Cotlet lacks. The report carries the error text and call_id when there is one, never passwords or tokens. Needs the user's Cotlet API key or sign-in.

Input parameters:

- `app`: App slug the report is about, e.g. 'skool'.
- `call_id`: call_id of the call that went wrong, if any.
- `client`: Agent or tool sending this, e.g. 'Claude Code'.
- `description` (string, required): What you tried, what you expected and what happened, with the error text if there was one. No passwords, tokens or other secrets.
- `kind` (string, required): bug: a tool did the wrong thing or returned wrong data. error: a call failed or returned an error you could not get past. feature_request: something new the user wants. missing_feature: an app is her…
- `title` (string, required): One line, e.g. 'skool_list_members stops after 50 members'.
- `tool`: Tool or endpoint name, e.g. 'skool_list_members'.

### `cotlet_browser_open` (~131 tokens)

Open the browser

Wakes the user's Contractor Foreman Cloud Browser, a real Chrome hosted on Cotlet and signed in to Contractor Foreman as the user. Use it for what the Contractor Foreman tools do not cover. Opens `url` when given and returns the page's URL and title. The user watches every step live. Every started minute of the session costs credits; it ends when closed or 3 minutes after the last call in the browser.

Input parameters:

- `url` (string): A public http or https address, e.g. https://example.com. In an app's browser, a page of that app.

### `cotlet_browser_navigate` (~101 tokens)

Go to a page

Opens a public http or https address in the user's Contractor Foreman Cloud Browser and returns the URL and title it ended on. Only Contractor Foreman pages open. Every started minute of the session costs credits; it ends when closed or 3 minutes after the last call in the browser.

Input parameters:

- `url` (string, required): A public http or https address, e.g. https://example.com. In an app's browser, a page of that app.

### `cotlet_browser_read` (~99 tokens)

Read the page

Returns the current page of the user's Contractor Foreman Cloud Browser: its readable text, up to 20,000 characters, and a numbered list of its links, buttons and fields. Field values, cookies and storage are never returned. On a page longer than that, both start near where it is scrolled to. Every started minute of the session costs credits; it ends when closed or 3 minutes after the last call in the browser.

### `cotlet_browser_screenshot` (~77 tokens)

See the page

Returns a JPEG image of the visible part of the current page in the user's Contractor Foreman Cloud Browser, with its URL and title: boards, canvases and layouts that the page text does not show. Every started minute of the session costs credits; it ends when closed or 3 minutes after the last call in the browser.

### `cotlet_browser_scroll` (~177 tokens)

Scroll the page

Scrolls the current page in the user's Contractor Foreman Cloud Browser with the mouse wheel, as a person does: down or up by `screens` viewport heights (default 0.8), to the top or the bottom, or until element `element` is in view. Content that loads on scroll appears, and the next read lists it. Returns the URL, title and scroll position (at_top, at_bottom). Every started minute of the session costs credits; it ends when closed or 3 minutes after the last call in the browser.

Input parameters:

- `direction` (string): Where to scroll. Default: down.
- `element` (integer): Scroll until this element of the element list is in view.
- `screens` (number): How far, in viewport heights, for down and up. Default: 0.8.

### `cotlet_browser_click` (~121 tokens)

Click on the page

Clicks a link, button or other element of the current page in the user's Contractor Foreman Cloud Browser, by its number in the page's element list, and returns the URL and title after the click. It acts as the user on that site. Buttons that pay or buy and buttons on account or sign-in pages are refused. Every started minute of the session costs credits; it ends when closed or 3 minutes after the last call in the browser.

Input parameters:

- `element` (integer, required): The element's number in the element list of the current page.

### `cotlet_browser_type` (~150 tokens)

Type on the page

Types text into a field of the current page in the user's Contractor Foreman Cloud Browser, by the field's number in the page's element list, and with `submit` presses Enter. Returns the URL and title after it. Password, card and one-time code fields and sign-in pages are refused: the user fills those in themselves. Every started minute of the session costs credits; it ends when closed or 3 minutes after the last call in the browser.

Input parameters:

- `element` (integer, required): The element's number in the element list of the current page.
- `submit` (boolean): Press Enter after typing, e.g. to search.
- `text` (string, required): The text to type.

### `cotlet_browser_select` (~124 tokens)

Choose from a list

Chooses an option of a drop-down list on the current page in the user's Contractor Foreman Cloud Browser, by the list's number in the element list and the option's label as read lists it (or its value). Returns the URL and title after it. Card fields and account pages are refused. Every started minute of the session costs credits; it ends when closed or 3 minutes after the last call in the browser.

Input parameters:

- `element` (integer, required): The element's number in the element list of the current page.
- `option` (string, required): The option.

### `cotlet_browser_press` (~110 tokens)

Press a key

Presses one key on the current page in the user's Contractor Foreman Cloud Browser, on the element that has focus: Tab to the next field, Enter to send, Escape to close a dialog or pop-up, arrows to move through a suggestion list. Returns the URL and title after it. Enter on account pages is refused. Every started minute of the session costs credits; it ends when closed or 3 minutes after the last call in the browser.

Input parameters:

- `key` (string, required): The key.

### `cotlet_browser_upload` (~153 tokens)

Upload a file

Puts files into a file field of the current page in the user's Contractor Foreman Cloud Browser, or into the file picker that an upload button opens, by its number in the element list. A file is given as {"url": "https://..."} for a file online or {"file_id": "..."} for one uploaded to Cotlet first; up to 10 files, 20 MB each. Returns the URL and title after it. Every started minute of the session costs credits; it ends when closed or 3 minutes after the last call in the browser.

Input parameters:

- `element` (integer, required): The element's number in the element list of the current page.
- `files` (array, required): The files.

### `cotlet_browser_close` (~46 tokens)

Close the browser

Ends the session in the user's Contractor Foreman Cloud Browser: the browser keeps its cookies, goes to sleep and the per-minute charge stops. Returns the session's minutes and credits.

### `get_bill` (~80 tokens)

Get bill

One vendor bill with its line items, dates, total, balance due and status. Reads one Contractor Foreman bill by bill_id: what list_bills gives plus the payment terms and every line item with description, cost type, quantity, unit, unit cost, total and cost code.

Input parameters:

- `bill_id` (integer, required): bill_id from list_bills.

### `get_change_order` (~78 tokens)

Get change order

One change order or request with description, status, total and line items. Everything on one change order or change order request: number, title, status, project, customer, date, the reason (description), the estimate it came from, time delay and the priced line items.

Input parameters:

- `change_order_id` (string, required): From list_change_orders.

### `get_clock_status` (~94 tokens)

Get clock status

Who is clocked in right now, whether you are, and this and last week's crew hours. Reads the Contractor Foreman Time Cards dashboard: the employees clocked in at this moment with their project and clock-in time, whether the signed-in user is clocked in (and that card's id), and the regular, overtime and total hours of the whole team and of the signed-in user for this week and last.

### `get_contact` (~113 tokens)

Get contact

One Directory record in full: contact details, status, services, terms and additional contacts. Reads one Contractor Foreman Directory record by contact_id: everything list_contacts gives plus a second phone, fax, website, status, services, tags, default payment terms, referral source, the date it was added and the additional contacts kept under it. For leads also stage and quality. Login details, wages and personal ids of employees are left out.

Input parameters:

- `contact_id` (integer, required): contact_id from list_contacts or list_leads.

### `get_daily_log` (~107 tokens)

Get daily log

One daily log: work notes, people and visitors, materials, equipment, weather and delays. Returns one daily log in full: the work performed, crew notes and employees on site, visitors, materials, equipment used with hours, the weather Contractor Foreman recorded for the date and the address (temperatures in both scales, the day's conditions), your weather notes and any weather or schedule delay. Read only.

Input parameters:

- `daily_log_id` (string, required): daily_log_id from list_daily_logs.

### `get_estimate` (~108 tokens)

Get estimate

One estimate with customer, dates, terms, totals and every line item. Everything on one estimate: status, project, customer contact, estimate and expiry dates, billing type, description, inclusions, exclusions, terms, totals in dollars and the line items by section (type, quantity, unit, unit cost, markup, total, cost code). section_id is what add_estimate_items takes to put new items in a section.

Input parameters:

- `estimate_id` (string, required): From list_estimates.

### `get_expense` (~68 tokens)

Get expense

One expense with amount, date, vendor, project, cost type, cost code and reason. Reads one Contractor Foreman expense by expense_id: what list_expenses gives plus the cost code and the reason written on it.

Input parameters:

- `expense_id` (integer, required): expense_id from list_expenses.

### `get_inspection` (~59 tokens)

Get inspection

One inspection with type, project, date, result, agency, inspector and notes. Reads one Contractor Foreman inspection by inspection_id, with the same fields as list_inspections.

Input parameters:

- `inspection_id` (integer, required): inspection_id from list_inspections.

### `get_invoice` (~89 tokens)

Get invoice

One invoice with customer, dates, terms, line items, payments and balance due. Everything on one invoice: status, project, customer and their email, invoice and due dates, terms, retainage, total, amount paid and balance due in dollars, the line items and every payment recorded against it (date, amount, method, status).

Input parameters:

- `invoice_id` (string, required): From list_invoices.

### `get_job_costing` (~177 tokens)

Get job costing

Estimated and actual cost per cost code for one project, with the difference and totals. Sums the project's Job Cost Actual report per cost code: contract value, estimated cost (from the Schedule of Values or the approved estimates, plus change orders), actual cost split into bills, expenses, time cards and equipment, the difference (estimated minus actual, negative means over) and the amount invoiced. Time card hours are priced at labor_rate (default burden_rate). Costs with no cost code are under Unassigned. Amounts are in dollars. Read only.

Input parameters:

- `budget_from` (string): Estimated cost from the Schedule of Values or the approved estimates. Default: the project's own setting.
- `labor_rate` (string): Rate that prices time card hours as labor cost.
- `project_id` (string, required): project_id from list_projects.

### `get_opportunity` (~75 tokens)

Get opportunity

One opportunity in full: customer contact, stage, score, budget, notes and last activity. Reads one Contractor Foreman opportunity by opportunity_id: what list_opportunities gives plus the customer's email and phone, the notes and the subject of the last sales activity.

Input parameters:

- `opportunity_id` (integer, required): opportunity_id from list_opportunities.

### `get_project` (~104 tokens)

Get project

One project: customer, address, stage, dates, contract amounts, costs, billing and retainage. Returns one project. The revised contract amount is the original contract plus approved change orders, as the project shows it. Costs are budgeted, committed and actual. Billing is invoiced, paid and outstanding invoices, with retainage held shown apart. Amounts are in dollars. Use project_id from list_projects.

Input parameters:

- `project_id` (string, required): project_id from list_projects.

### `get_punchlist` (~96 tokens)

Get punchlist

One punchlist: project, address, customer and how many items are open and completed. Returns one punchlist with its project, the project address and customer, the number of open and completed items, who made it and when. The items themselves are not returned yet: open the punchlist in Contractor Foreman to see them. Read only.

Input parameters:

- `punchlist_id` (string, required): punchlist_id from list_punchlists.

### `get_purchase_order` (~78 tokens)

Get purchase order

One purchase order with supplier, dates, status and its line items. Reads one Contractor Foreman purchase order by purchase_order_id: what list_purchase_orders gives plus every line item with description, cost type, quantity, unit, unit cost, total and cost code.

Input parameters:

- `purchase_order_id` (integer, required): purchase_order_id from list_purchase_orders.

### `get_rfi` (~59 tokens)

Get RFI

One RFI with its question, dates, answer and status. Reads one Contractor Foreman RFI by rfi_id, with the same fields as list_rfis.

Input parameters:

- `rfi_id` (integer, required): rfi_id from list_rfis.

### `get_service_ticket` (~79 tokens)

Get service ticket

One service ticket with customer, service address, schedule, technicians and priority. Reads one Contractor Foreman service ticket by service_ticket_id: what list_service_tickets gives plus the priority, planned duration, service address, the customer's phone and the hours logged on it.

Input parameters:

- `service_ticket_id` (integer, required): service_ticket_id from list_service_tickets.

### `get_sub_contract` (~107 tokens)

Get sub-contract

One sub-contract with subcontractor, amounts, retainage, scope of work and items. Reads one Contractor Foreman sub-contract by sub_contract_id: what list_sub_contracts gives plus the scope of work text (HTML as saved) and the items added in the app, with quantity, unit cost, total and cost code. paid and balance come back null here. list_sub_contracts has them.

Input parameters:

- `sub_contract_id` (integer, required): sub_contract_id from list_sub_contracts.

### `get_submittal` (~90 tokens)

Get submittal

One submittal with plan sheet, specification section, status, dates and its items. Reads one Contractor Foreman submittal by submittal_id: what list_submittals gives plus the plan sheet and specification section and each submitted item with manufacturer, status and the date it was sent back.

Input parameters:

- `submittal_id` (integer, required): submittal_id from list_submittals.

### `get_time_card` (~82 tokens)

Get time card

One time card or crew sheet with hours per employee and cost code. Reads one Contractor Foreman time card by timecard_id: what list_time_cards gives plus one entry per employee and cost code with the hours worked and the entry's notes. A crew sheet lists every crew member.

Input parameters:

- `timecard_id` (integer, required): timecard_id from list_time_cards.

### `get_todo` (~67 tokens)

Get to-do

One to-do: description, project, priority, status, due date, assignees and checklist. Returns one to-do with its description, due date and time, assignees and checklist items. Read only.

Input parameters:

- `todo_id` (string, required): todo_id from list_todos.

### `get_work_order` (~76 tokens)

Get work order

One work order with project, customer, status, dates, location, notes and items. Reads one Contractor Foreman work order by work_order_id: what list_work_orders gives plus the location, notes and line items with quantity, unit cost and total.

Input parameters:

- `work_order_id` (integer, required): work_order_id from list_work_orders.

### `list_bills` (~119 tokens)

List bills

Vendor bills with vendor, project, dates, total, balance due and status. Reads the Contractor Foreman Bills list, newest first: bill number, subject, vendor, project, bill date, due date, total, balance still due and status (Open, Paid). Filter by project or search. get_bill adds the line items.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `limit` (integer)
- `project_id` (integer): Only this project's records.
- `search` (string): Words to look for.

### `list_change_orders` (~231 tokens)

List change orders

Change orders and change order requests, newest first, with status, project and total. The Change Orders list: number, title, kind (change_order or request), status, project, customer, date and total in dollars. Filter by project, kind, status or a search over title and number. Archived ones only with include_archived. Change orders have the statuses open, pending_approval, on_hold, approved, denied, billed. Requests have draft, on_hold, approved, denied, closed. A status that does not fit the kind stops the call. get_change_order gives the line items.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `include_archived` (boolean)
- `kind` (string): request = change order requests (COR) not yet turned into a change order.
- `limit` (integer)
- `project_id` (string): Only this project's (list_projects).
- `search` (string): Matches the title or number.
- `status` (string): With kind all or change_order, a change order status. Request statuses need kind request.

### `list_contacts` (~154 tokens)

List contacts

Customers, employees, contractors, vendors and misc contacts from the Directory. Reads the Contractor Foreman Directory: active contacts with their type, name, company, title, email, phone, cell and address. Filter by type or search by name, company, email or phone. contact_id is the id other tools ask for as customer_id, vendor_id, contractor_id or employee_id. Leads have their own tool, list_leads.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `limit` (integer)
- `search` (string): Name, company, email or phone to look for.
- `type` (string): Only this kind of contact. Left out: all of them, leads excluded.

### `list_cost_codes` (~70 tokens)

List cost codes

The company's cost codes, to put on estimate, change order and invoice items. Every active cost code with its code number, name and parent group. cost_code_id is what the item tools take. search narrows by code or name.

Input parameters:

- `search` (string): Matches the code or the name.

### `list_cost_items` (~157 tokens)

List cost items

Saved cost items with unit, unit cost and markup, to price estimate and change order lines. The Cost Items Database: name, type, unit, your unit cost in dollars, default markup, cost code, SKU and notes. Use the values as line items in create_estimate, add_estimate_items or create_change_order. Filter by type or a name search. Subcontractor and other items are picked out of each page of all items, so such a page can hold fewer than limit. Keep the cursor going until next_cursor is null.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `limit` (integer)
- `search` (string): Matches the item name.
- `type` (string)

### `list_daily_logs` (~177 tokens)

List daily logs

Daily logs by date, optionally for one project and a date range. Returns daily logs in the order of the Daily Logs list, with date, arrival time, project and who wrote them, and total, the count of logs that match. Filter by project and by from/to dates (both inclusive). get_daily_log gives one log in full: notes, people, materials, equipment and the weather. Pages hold up to 100 logs; pass next_cursor back as cursor.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `from` (string): First log date.
- `limit` (integer)
- `project_id` (string): Only logs of this project.
- `search` (string): Text to match, as the search box of the Daily Logs list.
- `to` (string): Last log date.

### `list_estimates` (~140 tokens)

List estimates

Estimates, newest first, with status, project, customer and total. The Estimates list: number, title, status, project, customer, dates and total in dollars. Filter by project, status or a search over title, number and customer. Archived estimates only with include_archived. get_estimate gives the line items.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `include_archived` (boolean)
- `limit` (integer)
- `project_id` (string): Only estimates of this project (list_projects).
- `search` (string): Matches the title, number or customer.
- `status` (string)

### `list_expenses` (~125 tokens)

List expenses

Expenses with amount, date, vendor, project, cost type and who paid. Reads the Contractor Foreman Expenses list, last added first: name, amount with tax, date, vendor, project, cost type (Material, Labor, Equipment ...), who paid it and through what, and whether it is billable to the customer. Filter by project or search.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `limit` (integer)
- `project_id` (integer): Only this project's records.
- `search` (string): Words to look for.

### `list_inspections` (~121 tokens)

List inspections

Inspections with project, type, date, result, agency and permit number. Reads the Contractor Foreman Inspections list, newest first: number, inspection type, project, date and time, status (Draft, Pass, Fail, Re-Inspect), agency, inspector, permit number, assignee and notes. Filter by project or search.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `limit` (integer)
- `project_id` (integer): Only this project's records.
- `search` (string): Words to look for.

### `list_invoices` (~247 tokens)

List invoices

Invoices, newest first, with status, totals, balance due and an overdue flag. The Invoices list: number, status (draft, submitted, on_hold, paid, denied, write_off), project, customer, invoice and due dates, total and balance due in dollars, and overdue (past the due date with a balance). Archived invoices are left out. unpaid_only keeps submitted and on-hold invoices that still have a balance. status, when given, replaces the unpaid_only status filter. unpaid_only and due_before filter the page you get, so a page can hold fewer than limit. Keep the cursor going until next_cursor is null. get_invoice gives the items and payments.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `customer_id` (string): Only this customer's.
- `due_before` (string): Only invoices due before this date.
- `limit` (integer)
- `project_id` (string): Only this project's (list_projects).
- `search` (string): Matches the number, project or customer.
- `status` (string)
- `unpaid_only` (boolean): Only submitted or on-hold invoices with a balance due.

### `list_leads` (~127 tokens)

List leads

Sales leads with contact details, stage and quality score. Reads the active leads in the Contractor Foreman Directory: name, company, email, phone, address, stage (received, pending, qualifying, qualified, quoted, awarded, lost) and quality from 1 to 5. Search by name, company, email or phone. Opportunities (deals tied to a customer) are list_opportunities.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `limit` (integer)
- `search` (string): Name, company, email or phone to look for.

### `list_opportunities` (~134 tokens)

List opportunities

Sales opportunities with customer, stage, score, budget and expected sale date. Reads the Contractor Foreman Opportunities list: deals for a customer before they turn into a project, at every stage, with number, name, stage (received, pending, qualifying, qualified, quoted, awarded, lost), score 1 to 5, budget in the account currency, estimated sales date and who it is assigned to. Search by name, number or customer.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `limit` (integer)
- `search` (string): Words in the name, number or customer.

### `list_payments` (~112 tokens)

List payments

Payments received on invoices, newest first, with amount, method and invoice. The Payments list: date, amount in dollars, method, status (received, in_review, verified, failed), notes, the invoice it pays, customer and project. get_invoice shows the payments of one invoice.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `customer_id` (string): Only this customer's.
- `limit` (integer)
- `project_id` (string): Only this project's (list_projects).

### `list_project_crew_hours` (~159 tokens)

List project crew hours

Hours and labor cost logged on one project, per employee and per day and cost code. Reads the time logged on a Contractor Foreman project (the project's Time Cards tab): every entry with the day, employee, cost code, regular and overtime hours and labor cost, plus a sum per employee (most hours first) and the project total. days counts the distinct days an employee logged. Cost uses the wages in the Directory and is 0 when no wage is set. Optional date range.

Input parameters:

- `end_date` (string): Hours up to this day, YYYY-MM-DD.
- `project_id` (integer, required): The project's numeric id (list_projects).
- `start_date` (string): Hours from this day on, YYYY-MM-DD.

### `list_project_files` (~104 tokens)

List project files

Photos and documents on a project, with name, size and a download link. Reads a Contractor Foreman project's Files tab, newest first: file name, title, whether it is an image, size, notes, tags, when it was added and a download link. The app signs the links and they expire about 30 days after the call (the expires parameter). Call again for fresh ones.

Input parameters:

- `project_id` (integer, required): The project's numeric id (list_projects).

### `list_project_notes` (~77 tokens)

List project notes

The notes on a project's Notes tab, with author and time. Reads the notes kept on a Contractor Foreman project's Notes tab, oldest first: title, text, who added it, when (in the account's date format) and how many files are attached.

Input parameters:

- `project_id` (integer, required): The project's numeric id (list_projects).

### `list_projects` (~172 tokens)

List projects

Projects with customer, stage, dates, contract amount, costs and percent complete. Returns active (not archived) projects in the order of the Projects list. Completed projects are left out unless include_completed is true or status asks for them. search matches the project name, number or customer. Amounts are in the account's currency: contract amount without tax, budgeted, committed and actual cost, invoiced and paid. Pages hold up to 100 projects; pass next_cursor back as cursor.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `include_completed` (boolean): Include completed projects. Ignored when status is set.
- `limit` (integer)
- `search` (string): Match on project name, number or customer.
- `status` (string): Only projects in this stage.

### `list_punchlists` (~136 tokens)

List punchlists

Punchlists with project, status, open and completed item counts and who the items are assigned to. Returns punchlists, optionally for one project, with the number of open and completed items and the people their items are assigned to. status is the one the Punchlists list shows. Pages hold up to 100 punchlists; pass next_cursor back as cursor.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `limit` (integer)
- `project_id` (string): Only punchlists of this project.
- `search` (string): Text to match, as the search box of the Punchlists list.

### `list_purchase_orders` (~125 tokens)

List purchase orders

Purchase orders with supplier, project, order date, total and status. Reads the Contractor Foreman Purchase Orders list, newest first: PO number, subject, supplier, project, order and delivery date, total, status (Draft, Submitted, Approved, Received, Closed ...) and who ordered it. Filter by project or search. get_purchase_order adds the line items.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `limit` (integer)
- `project_id` (integer): Only this project's records.
- `search` (string): Words to look for.

### `list_rfis` (~151 tokens)

List RFIs

Requests for information with question, project, dates, answer and status. Reads the RFIs in Contractor Foreman's RFI & Notices module, newest first: number, title, the question, area and plan sheet it refers to, project, date, response needed by, response received, the answer and status (Draft, Submitted, Outstanding, Received, Closed). Schedule and compliance notices from the same module are left out, so a page can hold fewer than limit. Filter by project or search.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `limit` (integer)
- `project_id` (integer): Only this project's records.
- `search` (string): Words to look for.

### `list_schedule_tasks` (~121 tokens)

List schedule tasks

Gantt schedule tasks of a project: dates, duration, dependencies, assignees, percent complete. Returns the tasks of the project schedule in Gantt order. kind is task, milestone or summary (a group whose dates follow its subtasks). end_date is the task's last day, inclusive. depends_on lists the tasks this one waits for, with the link type and lag in days. Use task_id with update_schedule_task. An empty list means the project has no schedule yet.

Input parameters:

- `project_id` (string, required): project_id from list_projects.

### `list_service_tickets` (~121 tokens)

List service tickets

Service tickets with customer, status, service date and time and technicians. Reads the Contractor Foreman Service Tickets list, newest first: ticket number, title, description, status (Unscheduled, Scheduled, En Route, Checked-In, Completed ...), customer, project, service date and time and the assigned technicians. Filter by project or search.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `limit` (integer)
- `project_id` (integer): Only this project's records.
- `search` (string): Words to look for.

### `list_sub_contracts` (~129 tokens)

List sub-contracts

Sub-contracts with subcontractor, project, amount, billed, paid, balance and status. Reads the Contractor Foreman Sub-Contracts list, newest first: agreement number, subject, subcontractor, project, date, contract total, amount billed and paid, balance, retainage percent and status (Draft, Submitted, Committed, Approved ...). Filter by project or search.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `limit` (integer)
- `project_id` (integer): Only this project's records.
- `search` (string): Words to look for.

### `list_submittals` (~127 tokens)

List submittals

Submittals with project, status, date received, due date and approver. Reads the Contractor Foreman Submittals list, newest first: number, title, project, status (Draft, Submitted, Pending, Response Received, Approved, Rejected), date received, due date, who it is assigned to and who approved it. Filter by project or search.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `limit` (integer)
- `project_id` (integer): Only this project's records.
- `search` (string): Words to look for.

### `list_time_cards` (~186 tokens)

List time cards

Time cards with employee or crew, project, clock-in and clock-out times and hours, newest first. Reads the Contractor Foreman Time Cards list, newest first: employee cards and crew sheets with the project, day, clock-in and clock-out time, hours worked and break hours. A card still running has running true and no hours yet. Filter by a date range, a project or an employee. get_time_card gives one card's entries per person and cost code.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `employee_id` (integer): Only this employee's cards (contact_id).
- `end_date` (string): Cards up to this day, YYYY-MM-DD.
- `limit` (integer)
- `project_id` (integer): Only this project's cards.
- `start_date` (string): Cards from this day on, YYYY-MM-DD.

### `list_todos` (~161 tokens)

List to-dos

To-dos with project, priority, status, due date and assignees. Returns to-dos, optionally for one project, one status (open, incomplete, complete) or only those assigned to you. get_todo gives one with its description and checklist. Pages hold up to 100 to-dos; pass next_cursor back as cursor.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `limit` (integer)
- `mine_only` (boolean): Only to-dos assigned to this account's user.
- `project_id` (string): Only to-dos of this project.
- `search` (string): Text to match, as the search box of the To-Do list.
- `status` (string)

### `list_work_orders` (~126 tokens)

List work orders

Work orders with project, customer, status, dates, total and assignee. Reads the Contractor Foreman Work Orders list, newest first: number, subject, description, project, customer, status (Open, Estimating, Submitted, Approved, Canceled, Completed), start and end date, total and who it is assigned to. Filter by project or search.

Input parameters:

- `cursor` (string): next_cursor from the previous call.
- `limit` (integer)
- `project_id` (integer): Only this project's records.
- `search` (string): Words to look for.

### `add_change_order_items` (~98 tokens)

Add change order items

Adds priced line items to a change order or change order request. Adds line items at the end of the change order's first section: name, type (material, labor, equipment, subcontractor, other), quantity, unit, unit cost in dollars and markup percent. The app computes totals. Returns the saved items and the new total.

Input parameters:

- `change_order_id` (string, required): From list_change_orders.
- `items` (array, required)

### `add_estimate_items` (~140 tokens)

Add estimate items

Adds priced line items to an existing estimate. Adds line items at the end of an estimate section (the first one unless section_id says otherwise). Each item has a name, a type (material, labor, equipment, subcontractor, other), quantity, unit, your unit cost in dollars and a markup percent. Contractor Foreman computes the totals. cost_code_id comes from list_cost_codes. Returns the saved items and the new estimate total.

Input parameters:

- `estimate_id` (string, required): From list_estimates or create_estimate.
- `items` (array, required)
- `section_id` (string): From get_estimate. Default: the first section.

### `add_invoice_items` (~97 tokens)

Add invoice items

Adds priced line items to an invoice. Adds plain priced lines at the end of an invoice: name, type, quantity, unit, unit cost in dollars, markup percent. Items billed from an estimate, change order or schedule of values are added in the app. Returns the saved items, the new total and the balance due.

Input parameters:

- `invoice_id` (string, required): From list_invoices or create_invoice.
- `items` (array, required)

### `add_project_note` (~91 tokens)

Add project note

Adds a note to a project's Notes tab. Writes a note on a Contractor Foreman project's Notes tab as the signed-in user, with an optional title. It is visible to the company's users with access to the project. Nobody is notified. Returns the saved note.

Input parameters:

- `project_id` (integer, required): The project's numeric id (list_projects).
- `text` (string, required)
- `title` (string)

### `create_bill` (~197 tokens)

Create bill

Records a vendor bill with its line items, optionally against a project. Enters a bill from a vendor in Contractor Foreman: the vendor's invoice number, bill and due date, subject, notes and line items (description, quantity, unit, unit cost, cost type). With a project_id the cost shows in that project's job costing. The bill starts Open and nothing is paid or sent. Returns the saved bill.

Input parameters:

- `bill_date` (string): YYYY-MM-DD. Default: today.
- `due_date` (string): YYYY-MM-DD.
- `items` (array, required): Line items. The total is the sum of quantity times unit cost.
- `notes` (string)
- `number` (string, required): The vendor's invoice number.
- `project_id` (integer): The project the cost belongs to.
- `subject` (string)
- `vendor_id` (integer, required): A vendor's contact_id (list_contacts type vendor).

### `create_change_order` (~211 tokens)

Create change order

Creates a change order or change order request on a project, with line items. Saves a new change order (status open) or change order request (status draft) on a project, for the project's customer. description records the reason. items are priced lines (name, type, quantity, unit, unit cost in dollars, markup percent, cost code). The app computes the total. Nothing is sent. send_change_order emails it after your OK, update_change_order sets the status.

Input parameters:

- `date` (string): Default: today.
- `description` (string): Why it changes: who asked, when, what.
- `items` (array)
- `kind` (string): request = a change order request (COR) to price before it becomes a change order.
- `number` (string): Your own number. Default: the app's next, or COR-<requests on the project + 1>.
- `project_id` (string, required): From list_projects.
- `title` (string, required)

### `create_contact` (~189 tokens)

Create contact

Adds a customer, employee, contractor, vendor or misc contact to the Directory. Creates a Contractor Foreman Directory record as the Add drawer does. Employees need a first and last name, contractors and vendors a company name, the others a name or a company. The record gets no app access and nobody is invited or emailed. Giving an employee a login stays a step in the app. Returns the new contact_id.

Input parameters:

- `address1` (string)
- `address2` (string)
- `cell` (string)
- `city` (string)
- `company_name` (string): Required for contractors and vendors.
- `email` (string)
- `first_name` (string)
- `last_name` (string)
- `phone` (string)
- `state` (string)
- `type` (string, required): What kind of contact.
- `zip` (string)

### `create_daily_log` (~346 tokens)

Create daily log

New daily log on a project: work notes, people, deliveries, weather notes and delays. Adds a daily log to the project for the date you give (arrival 07:00 unless you say otherwise) and returns it as get_daily_log shows it. Contractor Foreman records the weather for the date and the project address itself, and weather_notes sits next to it. notes must not be empty. people takes a headcount per crew or free text. The log reaches no client or crew and update_daily_log can edit it, so this tool runs without asking. One project can have several logs on one date: check list_daily_logs first.

Input parameters:

- `arrival_time` (string): Arrival on site, e.g. 07:00 or 7:00 AM.
- `date` (string, required): Log date.
- `departure_time` (string): Departure from site, e.g. 15:30.
- `jobsite_notes` (string): Jobsite condition notes.
- `materials_delivered` (array): Materials delivered or used, one line each.
- `notes` (string, required): Work done and site notes (the log's Work Performed).
- `people`: Crews, subcontractors and visitors on site: headcount per crew, or free text.
- `project_id` (string, required): project_id from list_projects.
- `schedule_delay` (string): What else held the schedule up. Marks a schedule delay.
- `visitors` (string): Visitors on site (inspector, owner, architect).
- `weather_delay` (string): What the weather delayed. Marks a weather delay.
- `weather_notes` (string): Your own notes next to the recorded weather.

### `create_estimate` (~203 tokens)

Create estimate

Creates a draft estimate on a project or for a customer, with priced line items. Saves a new estimate in the Estimating status, unit-price billing, dated today. With project_id it belongs to that project and its customer. Without one, customer_id is required. items are priced lines (name, type, quantity, unit, unit cost in dollars, markup percent, cost code). The app computes totals. Nothing is sent: send_estimate does that after your OK. More lines later with add_estimate_items, other fields with update_estimate.

Input parameters:

- `customer_id` (string): Directory customer id. Needed without a project.
- `description` (string): Scope shown on the estimate.
- `exclusions` (string)
- `expire_date` (string)
- `inclusions` (string)
- `items` (array)
- `project_id` (string): From list_projects. Its customer is used.
- `title` (string, required)

### `create_expense` (~203 tokens)

Create expense

Records an expense (receipt, purchase, fee) with amount, date, vendor and project. Enters an expense in Contractor Foreman as the signed-in user: name, amount, date, vendor, project, cost type, reason and whether it is billable to the customer. The project is required by the app, and the expense shows in that project's job costing. No receipt file is attached. Returns the saved expense.

Input parameters:

- `amount` (number, required): In the account currency.
- `billable` (boolean): Bill it on to the customer.
- `date` (string): YYYY-MM-DD. Default: today.
- `name` (string, required): What was bought or paid.
- `project_id` (integer, required): The project the cost belongs to (list_projects). The app refuses an expense without one.
- `reason` (string)
- `type` (string)
- `vendor_id` (integer): The vendor's contact_id (list_contacts type vendor).

### `create_inspection` (~151 tokens)

Create inspection

Logs an inspection on a project with type, date, agency, inspector and notes. Creates a Contractor Foreman inspection in Draft status on a project: inspection type, day, agency (internal, county, city or independent agency), inspector and notes. record_inspection_result sets pass, fail or re-inspect afterwards. Nobody is notified. Returns the saved inspection.

Input parameters:

- `agency` (string)
- `date` (string): Inspection day, YYYY-MM-DD. Default: today.
- `inspected_by` (string): Inspector or office.
- `notes` (string)
- `project_id` (integer, required): The project being inspected.
- `type` (string, required): e.g. Framing, Rough Electrical.

### `create_invoice` (~204 tokens)

Create invoice

Creates a draft invoice for a project or customer, with priced line items. Saves a new invoice in the Draft status. With project_id it bills that project's customer. Without one, customer_id is required. A description needs due_date in the same call. items are plain priced lines (name, type, quantity, unit, unit cost in dollars, markup percent). It is not sent. update_invoice with status submitted marks it sent and lets record_payment take payments. send_invoice emails it after your OK.

Input parameters:

- `customer_id` (string): Directory customer id. Needed without a project.
- `description` (string): Shown on the invoice. Needs due_date in the same call.
- `due_date` (string)
- `invoice_date` (string): Default: today.
- `items` (array)
- `number` (string): Your own number. Default: the app's next.
- `project_id` (string): From list_projects. Its customer is billed.

### `create_lead` (~163 tokens)

Create lead

Adds a sales lead with contact details and a pipeline stage. Creates a lead in the Contractor Foreman Directory as the Leads Add drawer does: a name or a company, contact details, address and the stage (received by default). Nobody is emailed. Returns the new contact_id, which list_leads and get_contact read.

Input parameters:

- `address1` (string)
- `address2` (string)
- `cell` (string)
- `city` (string)
- `company_name` (string)
- `email` (string)
- `first_name` (string)
- `last_name` (string)
- `phone` (string)
- `stage` (string)
- `state` (string)
- `zip` (string)

### `create_opportunity` (~233 tokens)

Create opportunity

Adds a sales opportunity for a customer with stage, score, budget and expected sale date. Creates an opportunity in Contractor Foreman as the Opportunities Add drawer does, for a customer from the Directory. It is assigned to the signed-in user. Nobody is emailed. The opportunity number must be unique. Without one it gets OPP- and the UTC date and time (OPP-261021-1213). Returns the saved opportunity.

Input parameters:

- `address1` (string)
- `budget` (number): Expected value in the account currency.
- `city` (string)
- `customer_id` (integer, required): A customer's contact_id (list_contacts type customer).
- `est_sales_date` (string): Expected sale date, YYYY-MM-DD.
- `name` (string, required)
- `number` (string): Your opportunity number. Left out: OPP- and the UTC date and time, as OPP-261021-1213.
- `project_type` (string)
- `score` (integer)
- `stage` (string)
- `state` (string)
- `zip` (string)

### `create_project` (~215 tokens)

Create project

New project for a customer, with number, type, stage, address and dates. Adds a project in the stage you give (default pending) for a customer from your Directory. Without number the account's next project number is used. Accounts that number projects by hand need one. The project reaches nobody outside your company, so this tool runs without asking. Returns the project as get_project shows it.

Input parameters:

- `city` (string)
- `customer_id` (string, required): The customer's contact_id from list_contacts.
- `description` (string)
- `end_date` (string)
- `name` (string, required): Project name, e.g. Kitchen remodel - Oak St.
- `number` (string): Project number. Default: the next number when the account numbers projects itself.
- `start_date` (string)
- `state` (string)
- `status` (string)
- `street` (string)
- `street2` (string)
- `type` (string)
- `zip` (string)

### `create_punchlist` (~99 tokens)

Create punchlist

New, empty punchlist on a project. Adds an empty punchlist to the project and returns it as get_punchlist shows it. Items cannot be added through this tool yet, so add them in Contractor Foreman. Nobody is assigned or notified, so this tool runs without asking.

Input parameters:

- `name` (string, required): Punchlist name, e.g. Final walkthrough - kitchen.
- `project_id` (string, required): project_id from list_projects.

### `create_purchase_order` (~172 tokens)

Create purchase order

Creates a draft purchase order to a supplier with line items, optionally for a project. Creates a Contractor Foreman purchase order in Draft status, ordered by the signed-in user: subject, supplier, project, order date, notes and line items (description, quantity, unit, unit cost, cost type). The supplier is not notified. Sending the PO stays a step in the app. Returns the saved order.

Input parameters:

- `items` (array, required): Line items. The total is the sum of quantity times unit cost.
- `notes` (string)
- `order_date` (string): YYYY-MM-DD. Default: today.
- `project_id` (integer): The project the order is for.
- `subject` (string, required)
- `vendor_id` (integer, required): The supplier's contact_id (list_contacts type vendor).

### `create_rfi` (~168 tokens)

Create RFI

Drafts a request for information on a project, with the question and a reply-by date. Creates a Contractor Foreman RFI in Draft status on a project, from the signed-in user, dated now: title, question, the area and plan sheet it refers to and the date a response is needed by. It is not sent to anyone. Submitting it to the architect or owner stays a step in the app. Returns the saved RFI.

Input parameters:

- `plan_sheet` (string): Plan sheet number.
- `project_id` (integer, required): The project the question is about.
- `question` (string, required): The information requested.
- `reference_area` (string): Area or element it refers to.
- `response_needed_by` (string): YYYY-MM-DD.
- `title` (string, required)

### `create_service_ticket` (~210 tokens)

Create service ticket

Opens a service ticket for a customer, optionally scheduled for a date and time. Creates a Contractor Foreman service ticket for a customer from the Directory: title, description, an optional project and the planned service date and time. The service address is the customer's (or the project's). With a date it is Scheduled, without one Unscheduled. Technicians are assigned in the app. The customer is not notified. Returns the saved ticket, with service_time on the 12-hour clock (02:00 PM).

Input parameters:

- `customer_id` (integer, required): A customer's contact_id (list_contacts type customer).
- `description` (string): What the customer reported.
- `project_id` (integer): Links the ticket to a project. The service address is then the project's.
- `service_date` (string): Planned visit, YYYY-MM-DD. The ticket is then Scheduled.
- `service_time` (string): Planned time on the 24-hour clock, like 13:30.
- `title` (string, required)

### `create_share_link` (~122 tokens)

Create share link

Makes a short internal link that opens an estimate, change order or invoice for your signed-in team. The panel's Share Internal Link: a short URL that opens the record in the Contractor Foreman app. Only people who sign in to your Contractor Foreman company can open it. It is not a public page for the customer. To get a document to the customer, send_estimate, send_change_order and send_invoice email the PDF.

Input parameters:

- `record_id` (string, required): estimate_id, change_order_id or invoice_id.
- `record_type` (string, required)

### `create_sub_contract` (~173 tokens)

Create sub-contract

Creates a draft sub-contract with a subcontractor on a project. Creates a Contractor Foreman sub-contract in Draft status, issued by the signed-in user, for a project and a subcontractor from the Directory, with subject, agreement number and date. This API cannot add scope items, terms or send it for signature. Those stay steps in the app. The subcontractor is not notified. Returns the saved sub-contract.

Input parameters:

- `agreement_number` (string, required): Your agreement number, e.g. the project number and a sequence (BP-2001-07).
- `contractor_id` (integer, required): The subcontractor's contact_id (type contractor).
- `date` (string): YYYY-MM-DD. Default: today.
- `project_id` (integer, required): The project the work is for.
- `subject` (string, required)

### `create_todo` (~168 tokens)

Create to-do

New to-do, optionally on a project, with due date, priority and assignees. Adds a to-do and returns it as get_todo shows it. Assignees see it in their Contractor Foreman app. By default you confirm each call; you can switch that off for this tool. Waits for the owner's approval.

Input parameters:

- `assignee_ids` (array): contact_id values from list_contacts of the employees or contacts who should do it.
- `description` (string)
- `due_date` (string)
- `due_time` (string): e.g. 09:00 or 2:30 PM.
- `name` (string, required): What has to be done.
- `priority` (string)
- `project_id` (string): Project from list_projects.

### `create_work_order` (~163 tokens)

Create work order

Creates an Open work order on a project with subject, description and dates. Creates a Contractor Foreman work order in Open status on a project, issued by the signed-in user, for the project's customer: subject, description, start and end date. It has no line items. Nobody is notified, and sending it to the customer stays a step in the app. update_work_order_status moves it on. Returns the saved order.

Input parameters:

- `description` (string): What has to be done.
- `end_date` (string): YYYY-MM-DD, not before start_date. Default: today.
- `project_id` (integer, required): The project the work is on.
- `start_date` (string): YYYY-MM-DD. Default: today.
- `subject` (string, required)

### `delete_change_order` (~60 tokens)

Delete change order

Deletes a change order or change order request for good. Deletes the change order and its items. It cannot be undone. To keep the record, use update_change_order with status denied instead.

Input parameters:

- `change_order_id` (string, required): From list_change_orders.

### `delete_estimate` (~77 tokens)

Delete estimate

Deletes an estimate for good. Deletes the estimate and its line items, as Delete in the estimate's menu does. Records made from it (projects, change orders, invoices) stay. It cannot be undone. To keep the history, use update_estimate with status lost instead.

Input parameters:

- `estimate_id` (string, required): From list_estimates.

### `delete_invoice` (~71 tokens)

Delete invoice

Deletes an invoice that has no payments, for good. Deletes the invoice and its items. It cannot be undone. An invoice with payments recorded is refused. For that one, or to keep the record, use update_invoice with status write_off or denied.

Input parameters:

- `invoice_id` (string, required): From list_invoices.

### `record_inspection_result` (~115 tokens)

Record inspection result

Marks an inspection passed, failed or to re-inspect, optionally with notes. Sets the status of a Contractor Foreman inspection to pass, fail, re_inspect or back to draft, as the status field on its page does, and optionally replaces its notes (corrections the inspector asked for). Nobody is notified. Returns the inspection as saved.

Input parameters:

- `inspection_id` (integer, required): inspection_id from list_inspections.
- `notes` (string): Replaces the inspection's notes.
- `result` (string, required)

### `record_payment` (~169 tokens)

Record payment

Records a payment you received against an invoice. Adds a payment to an invoice, as Add Payment does: amount in dollars, method (bank_transfer, cash, check, credit_card, other), date, status (received, in_review, verified, failed) and notes. It only records money already received. It charges nobody and emails nobody. The invoice must be submitted (update_invoice) and the amount cannot exceed the balance due. A payment that clears the balance marks the invoice paid.

Input parameters:

- `amount` (number, required): Dollars, at most the balance due.
- `date` (string): Default: today.
- `invoice_id` (string, required): From list_invoices.
- `method` (string, required)
- `notes` (string): e.g. the check number.
- `status` (string)

### `remove_estimate_items` (~107 tokens)

Remove estimate items

Deletes line items from an estimate. Deletes the given line items (item_id from get_estimate) and returns the new estimate total. An item_id that is not on the estimate stops the call before anything is deleted. The app refuses while the estimate is pending_approval, approved or completed: set it back to estimating with update_estimate first.

Input parameters:

- `estimate_id` (string, required): From list_estimates.
- `item_ids` (array, required): item_id values from get_estimate.

### `send_change_order` (~185 tokens)

Send change order

Emails the change order as a PDF to the customer or to the addresses you give. Sends the change order (or request) PDF by email from Contractor Foreman, as the panel's View/Email PDF does. Without to it goes to the project's customer, and a customer without an email stops the call. The approval call shows recipients and subject first. The status does not change: update_change_order sets pending_approval or approved. By default you confirm each call, and you can switch that off for this tool. Waits for the owner's approval.

Input parameters:

- `change_order_id` (string, required): From list_change_orders.
- `copy_me` (boolean)
- `message` (string): Email text above the PDF.
- `subject` (string): Default: the app's 'Change Order #n'.
- `to` (array): Recipient emails. Default: the project's customer.

### `send_estimate` (~202 tokens)

Send estimate

Emails the estimate as a PDF to the customer or to the addresses you give. Sends the customer version of the estimate PDF by email from Contractor Foreman, as the panel's View/Email PDF does. Without to it goes to the estimate's customer, and a customer without an email stops the call. The approval call shows the recipients and subject first. The estimate's status does not change. update_estimate sets it (pending_approval, approved). By default you confirm each call, and you can switch that off for this tool. Waits for the owner's approval.

Input parameters:

- `copy_me` (boolean): Send a copy to you.
- `estimate_id` (string, required): From list_estimates or create_estimate.
- `message` (string): Email text above the PDF.
- `subject` (string): Default: the app's 'Estimate: <title> (#n)'.
- `to` (array): Recipient emails. Default: the estimate's customer.

### `send_invoice` (~191 tokens)

Send invoice

Emails the invoice as a PDF to the customer or to the addresses you give. Sends the invoice PDF by email from Contractor Foreman, as the panel's View/Email PDF does. Without to it goes to the invoice's customer, and a customer without an email stops the call. The approval call shows recipients and subject first. The invoice needs a due date (update_invoice). Sending does not change the status: update_invoice with status submitted marks it sent. By default you confirm each call, and you can switch that off for this tool. Waits for the owner's approval.

Input parameters:

- `copy_me` (boolean)
- `invoice_id` (string, required): From list_invoices or create_invoice.
- `message` (string): Email text above the PDF.
- `subject` (string): Default: the app's 'Invoice #n'.
- `to` (array): Recipient emails. Default: the invoice's customer.

### `update_change_order` (~136 tokens)

Update change order

Changes a change order's status, title, reason or date. Sets only the fields you pass. Change order statuses: open, pending_approval, on_hold, approved (Unbilled/Approved, counts toward the contract), denied, billed. Change order request statuses: draft, on_hold, approved, denied, closed. A status of the other kind stops the call. Nobody is emailed. send_change_order does that.

Input parameters:

- `change_order_id` (string, required): From list_change_orders.
- `date` (string)
- `description` (string)
- `status` (string)
- `title` (string)

### `update_daily_log` (~316 tokens)

Update daily log

Change the notes, times, people, deliveries, weather notes or delays of a daily log. Replaces only the fields you pass and returns the log as get_daily_log shows it. Text fields are replaced, not appended: read the log first to add to its notes. materials_delivered replaces the material notes. weather_delay, schedule_delay and visitors can mark a delay or a visit but not clear it. The log date and project do not change. The log reaches no client or crew, so this tool runs without asking.

Input parameters:

- `arrival_time` (string): Arrival on site, e.g. 07:00 or 7:00 AM.
- `daily_log_id` (string, required): daily_log_id from list_daily_logs.
- `departure_time` (string): Departure from site, e.g. 15:30.
- `jobsite_notes` (string): Jobsite condition notes.
- `materials_delivered` (array): Materials delivered or used, one line each.
- `notes` (string): Work done and site notes (the log's Work Performed).
- `people`: Crews, subcontractors and visitors on site: headcount per crew, or free text.
- `schedule_delay` (string): What else held the schedule up. Marks a schedule delay.
- `visitors` (string): Visitors on site (inspector, owner, architect).
- `weather_delay` (string): What the weather delayed. Marks a weather delay.
- `weather_notes` (string): Your own notes next to the recorded weather.

### `update_estimate` (~155 tokens)

Update estimate

Changes an estimate's status, title, dates, description, inclusions or exclusions. Sets only the fields you pass. status moves the estimate on the Estimates board: estimating, pending_approval, on_hold, re_estimating, approved, completed or lost. Marking it approved here does not email anyone. send_estimate sends it. Line items change with add_estimate_items and remove_estimate_items.

Input parameters:

- `description` (string)
- `estimate_date` (string)
- `estimate_id` (string, required): From list_estimates.
- `exclusions` (string)
- `expire_date` (string)
- `inclusions` (string)
- `status` (string)
- `title` (string)

### `update_invoice` (~131 tokens)

Update invoice

Changes an invoice's status, invoice date, due date or description. Sets only the fields you pass. Statuses: draft, submitted (sent to the customer, payments can be recorded), on_hold, paid, denied, write_off. Contractor Foreman needs a due date on every change, so an invoice without one needs due_date in the same call. Nobody is emailed. send_invoice does that.

Input parameters:

- `description` (string)
- `due_date` (string)
- `invoice_date` (string)
- `invoice_id` (string, required): From list_invoices.
- `status` (string)

### `update_project` (~177 tokens)

Update project

Change a project's name, stage, type, address, dates or description. Changes only the fields you pass and returns the project as get_project shows it. A completed project drops out of list_projects unless include_completed is true. Editing the schedule can move the project dates again. Nothing reaches the customer, so this tool runs without asking.

Input parameters:

- `city` (string)
- `description` (string)
- `end_date` (string)
- `name` (string)
- `project_id` (string, required): project_id from list_projects.
- `start_date` (string)
- `state` (string)
- `status` (string): New stage, e.g. started or completed.
- `street` (string)
- `street2` (string)
- `type` (string)
- `zip` (string)

### `update_schedule_task` (~205 tokens)

Update schedule task

Change the name, dates, length or percent complete of a task on the project schedule. Changes one task and returns it as the schedule shows it afterwards. start_date alone moves the task and keeps its length; end_date or duration_days change the length. Tasks that depend on it are not moved: check depends_on in list_schedule_tasks and move them too. The project's start and end dates follow the schedule. A schedule edit reaches nobody outside your company and one more call undoes it, so this tool runs without asking.

Input parameters:

- `duration_days` (integer): New length in days, from the start.
- `end_date` (string): New last day.
- `name` (string)
- `percent_complete` (number)
- `project_id` (string, required): project_id from list_projects.
- `start_date` (string): New first day. Alone, it moves the task and keeps its length.
- `task_id` (string, required): task_id from list_schedule_tasks.

### `update_service_ticket_status` (~133 tokens)

Update service ticket status

Moves a service ticket to scheduled, en route, checked in, completed, closed and so on. Sets the status of a Contractor Foreman service ticket as the status field on its page does: unscheduled, scheduled, en_route, checked_in, requires_followup, canceled, completed or closed. The app's own en-route and completion emails to the customer are separate buttons and are not sent. Completed moves the service date to today, as the app does. Returns the ticket as saved.

Input parameters:

- `service_ticket_id` (integer, required): service_ticket_id from list_service_tickets.
- `status` (string, required)

### `update_todo` (~159 tokens)

Update to-do

Change a to-do's name, description, due date, priority or status, e.g. mark it complete. Changes only the fields you pass and returns the to-do as get_todo shows it. status complete closes it, open reopens it. Assignees and checklist items are not changed. Nothing is sent to anyone, so this tool runs without asking.

Input parameters:

- `description` (string)
- `due_date` (string)
- `due_time` (string): e.g. 09:00 or 2:30 PM.
- `name` (string)
- `priority` (string)
- `status` (string): complete closes the to-do.
- `todo_id` (string, required): todo_id from list_todos.

### `update_work_order_status` (~94 tokens)

Update work order status

Moves a work order to open, estimating, submitted, approved, canceled or completed. Sets the status of a Contractor Foreman work order as the status field on its page does. The status in the answer is the label the company uses for it. Nobody is emailed. Returns the work order as saved.

Input parameters:

- `status` (string, required)
- `work_order_id` (integer, required): work_order_id from list_work_orders.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/dev-cotlet-contractor-foreman/mcp-v1-contractor-foreman#diagnostics

## Score history

- 2026-10-24: 68
- 2026-10-23: 68

## Common questions

### What is the Contractor Foreman by Cotlet MCP server?

Contractor Foreman by Cotlet is an MCP server listed in the public MCP registry as dev.cotlet/contractor-foreman. Projects, estimates, daily logs and invoices in Contractor Foreman. This page covers its hosted endpoint (https://cotlet.dev/mcp/v1/contractor-foreman).

### Is the Contractor Foreman by Cotlet MCP server safe to use?

Contractor Foreman by Cotlet scores 68 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Contractor Foreman by Cotlet MCP server expose?

Contractor Foreman by Cotlet exposes 106 tools: cotlet_whoami, cotlet_apps, cotlet_request_apps, cotlet_get_call, cotlet_upload_file, and 101 more. Their descriptions and schemas cost roughly 14,404 tokens of context every time the server is loaded.

### Does the Contractor Foreman by Cotlet MCP server require authentication?

No. We connected to Contractor Foreman by Cotlet without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Contractor Foreman by Cotlet MCP server still maintained?

Contractor Foreman by Cotlet is still listed as active in the MCP registry. We last reached this channel on 24 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://cotlet.dev/mcp/v1/contractor-foreman
- Authorisation metadata: https://cotlet.dev/.well-known/oauth-protected-resource/mcp/v1/contractor-foreman
- Repository: https://github.com/cotletdev/contractor-foreman-api-mcp-server
- Website: https://cotlet.dev/integrations/contractor-foreman-api-mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/dev-cotlet-contractor-foreman/mcp-v1-contractor-foreman.xml
- Changelog JSON feed: https://verifymcp.io/servers/dev-cotlet-contractor-foreman/mcp-v1-contractor-foreman.json
- HTML version of this page: https://verifymcp.io/servers/dev-cotlet-contractor-foreman/mcp-v1-contractor-foreman
