Projects API
Manage construction projects, quotes, work orders, and budget tracking via the API.
Overview#
The Projects module covers the full lifecycle of a construction project: ideation, quotes, approval, execution, payments, and closeout.
| MCP tool | Description | Scope |
|---|---|---|
list_projects | List projects | read:finances |
create_project | Create a project | write:finances |
update_project | Update a project | write:finances |
delete_project | Archive a project | write:finances |
add_quote | Add a quote | write:finances |
approve_quote | Approve a quote | write:finances |
create_work_order | Create a work order | write:finances |
log_project_expense | Log an expense | write:finances |
close_project | Close a project | write:finances |
19 tools total. See spec features/07-projects.md for the full list.
Project object#
{
id: string;
title: string;
description: string;
status: "draft" | "quoting" | "approved" | "in-progress" | "completed" | "cancelled";
category: "roofing" | "plumbing" | "electrical" | "facade" | "hvac" | "landscaping" | "elevator" | "other";
budget: number; // CAD
fundSource: "operating" | "reserve" | "contingency";
spent: number; // Calculated automatically
startDate: string | null; // ISO 8601
endDate: string | null;
contractor: {
id: string;
name: string;
} | null;
quotes: Quote[];
workOrders: WorkOrder[];
expenses: Expense[];
createdAt: string;
updatedAt: string;
}
create_project#
Parameters#
| Parameter | Type | Required | Description |
|---|---|---|---|
title | string | ✅ | e.g. "2026 Roof replacement" |
category | string | ✅ | One of the 8 types |
description | string | — | Context, needs |
budget | number | ✅ | CAD, > 0 |
fundSource | string | ✅ | operating, reserve, contingency |
Example#
{
"name": "create_project",
"arguments": {
"title": "2026 Roof replacement",
"category": "roofing",
"description": "TPO membrane, 20-year warranty",
"budget": 145000,
"fundSource": "reserve"
}
}
add_quote#
Add a quote to a project in the quoting phase.
{
"name": "add_quote",
"arguments": {
"projectId": "...",
"contractorId": "...",
"amount": 138500,
"validUntil": "2026-05-15",
"notes": "Includes 20-year warranty and existing membrane removal"
}
}
Max 5 quotes per project (RGCQ best practice).
approve_quote#
Mark a quote as the winner. The project moves to approved.
{
"name": "approve_quote",
"arguments": {
"quoteId": "...",
"resolutionId": "..." // Optional — ties the decision to a meeting resolution
}
}
For large projects (> 5% of the reserve fund), Bill 16 strongly recommends AGM approval. Link the resolution for traceability.
create_work_order#
Create an official work order after quote approval.
{
"name": "create_work_order",
"arguments": {
"projectId": "...",
"quoteId": "...",
"startDate": "2026-06-01",
"milestones": [
{ "title": "30% deposit", "amount": 41550, "dueDate": "2026-06-01" },
{ "title": "50% progress", "amount": 41550, "dueDate": "2026-07-15" },
{ "title": "Final payment", "amount": 55400, "dueDate": "2026-08-30" }
]
}
}
log_project_expense#
Record each payment as it happens.
{
"name": "log_project_expense",
"arguments": {
"projectId": "...",
"amount": 41550,
"date": "2026-06-03",
"description": "Deposit — Toiture Québec inc.",
"invoiceAttachmentId": "..."
}
}
A journal entry is created automatically (debit reserve fund, credit vendor account) if the Accounting module is enabled.
Budget tracking#
{
"name": "get_project_summary",
"arguments": { "projectId": "..." }
}
Response:
{
"budget": 145000,
"spent": 83100,
"remaining": 61900,
"percentSpent": 57.3,
"milestonesDue": 1,
"daysElapsed": 45,
"estimatedCompletion": "2026-08-30"
}