WoodSystems MCP server
Connect an AI assistant to your WoodSystems account. It acts as you, with your role, and only does what your role and the permissions you grant allow.
It can never change account settings, statuses, custom fields, workflows or templates, manage users, roles, API keys or webhooks, delete records, take payments, issue refunds or change billing, send documents for signature.
Connect
Claude.ai
In Settings, Connectors, add a custom connector with this URL. You sign in to WoodSystems and choose what it may do.
https://mcp-sandbox.woodsystems.com/mcp
Claude Code
claude mcp add --transport http woodsystems https://mcp-sandbox.woodsystems.com/mcp
Claude Desktop or Cursor
{
"mcpServers": {
"woodsystems": {
"type": "http",
"url": "https://mcp-sandbox.woodsystems.com/mcp"
}
}
}
Headless, with an API key
For an agent with no person to sign in, an admin creates an API key in Settings, Integrations, assigned to the user it should act as, and the client sends it as a bearer.
{
"mcpServers": {
"woodsystems": {
"type": "http",
"url": "https://mcp-sandbox.woodsystems.com/mcp",
"headers": {
"Authorization": "Bearer wsk_test_..."
}
}
}
}
Tools
| Tool | What it does | Kind | Permissions |
|---|---|---|---|
add_job_note | Post a note on a job's messages, written as the acting user. Everyone following the job is notified, and the note cannot be edited or deleted through this connection. To mention someone write @[user_id:Name] with an id from list_team. | adds | notes:write |
complete_task | Mark a task done. It moves to the account's Complete status; someone can reopen it in the app. | adds | tasks:write |
create_calendar_event | Book an event on the account's calendar for a job (or an internal or external event). The people in its departments and teams are notified, as in the app. | adds | calendar:write |
create_lead | Put a new lead in the account's pipeline. The office sees it at once and is notified, the same as a lead from the website form. Give at least an email or a phone number so someone can follow up. Calling twice with the same details within a minute makes one lead, not two. | adds | jobs:write |
create_purchase_order | Create a DRAFT purchase order with its lines, for a job or (without job_id) for stock. Nothing goes to the supplier: someone reviews and submits it in the app. Every line is checked first, so one bad line refuses the whole order. Needs a manager role or above. | adds | purchasing:write |
create_task | Create a task on a job and assign it. The people assigned are notified, as for a task made in the app. Ask who it is for if the user has not said; a task is never assigned to anyone by default. | adds | tasks:write |
get_contact | One contact with their email, phone number and the jobs they are on. | reads | contacts:read |
get_estimate | One estimate with its totals, deposit, dates, notes and terms; with include_lines, its sections and lines. | reads | estimates:read |
get_invoice | One invoice with its total, amount due, balance and payment link; with include_lines, its sections and lines. | reads | invoices:read |
get_job | One job with its contacts (with their ids, emails and phone numbers) and custom field values. | reads | jobs:read |
get_schedule_for_week | Everything booked or due in the seven days from week_start: calendar events, work orders due, and (when a job is given) that job's open tasks due. It makes several calls to WoodSystems (one for events, one or more pages of work orders, and pages of tasks), and each counts toward the account's API usage, so prefer it over calling the pieces separately. Work orders are read newest first; if there are more than it reads, the answer says the list is incomplete. | reads | calendar:read, work_orders:read, tasks:read |
get_work_order | One work order with its steps in order and the step it is at now. | reads | work_orders:read |
list_calendar_events | Calendar events that overlap a window, earliest first: installs, site measures, deliveries, meetings, with the job, departments and people on each. A production user sees their own and their departments' events. | reads | calendar:read |
list_custom_fields | The custom fields the account keeps on jobs: id, label, type and the allowed options for list fields. Use the ids as field_id in create_lead's custom_fields. | reads | meta:read |
list_estimates | Estimates newest first, with number, name, job, status, subtotal, tax and total. Needs an office role or above. | reads | estimates:read |
list_invoices | Invoices newest first, with number, job, status, total, amount due and balance. Needs an office role or above. | reads | invoices:read |
list_job_statuses | The account's job pipeline: main statuses in order, and the phases under each (a phase names its parent). Use an id from here as status_id for search_jobs or update_job_status. Accounts name their own statuses, so look them up rather than assuming. | reads | meta:read |
list_purchase_orders | Purchase orders newest first, with number, supplier, job, status, expected delivery and totals. | reads | purchasing:read |
list_tasks | A job's tasks, newest first, with who they are assigned to, due date and status. WoodSystems lists tasks per job; there is no account-wide task list on this connection. | reads | tasks:read |
list_team | The account's active people with their role and whether they can be a project manager. Use their ids to assign tasks or to filter calendar events. Email addresses are not included. | reads | meta:read |
list_work_orders | Work orders newest first, with number, job, type, current step, due date, priority, progress and who is assigned. Readable from a production role up. | reads | work_orders:read |
search_contacts | Find people in the account's address book (customers, contractors and anyone put on a job), newest first. Use get_contact for the jobs a person is on. | reads | contacts:read |
search_jobs | Find jobs (leads, opportunities and jobs), newest first. Returns each job's id, number, name, stage, status, address, dates, project manager and value. Use get_job for its contacts and custom fields. | reads | jobs:read |
search_products | Find products in the account's catalog, newest first, with kind (made, purchased or service), unit, price and cost. Prices and costs are blank for a role that cannot see them. | reads | products:read |
search_vendors | Find the account's suppliers, newest first, with contacts, lead time and payment terms. Use the id as vendor_id for create_purchase_order. | reads | purchasing:read |
send_email_to_contact | Email contacts on a job from the acting user's own connected mailbox. It becomes a thread on the job's messages and replies come back to it. A sent email cannot be taken back, so without confirm=true this only returns a preview (recipients, subject, body); show it to the user and call again with confirm=true once they agree. If the acting user has not connected a mailbox in WoodSystems the send is refused and nothing is sent. | changes, asks first | jobs:read, comms:send |
update_job_status | Move a job to another status or phase, by the same rules as the app (a job with estimates cannot go back to Lead; closing needs its invoices settled). Moving a job to Closed or Lost, or a phase under them, is final for the office: without confirm=true it only returns a preview of the change; show it to the user and call again with confirm=true once they agree. Marking a job lost needs a manager role. | changes, asks first | meta:read, jobs:read, jobs:write |
whoami | Call this first, before any other WoodSystems tool. Returns the account, the user every call acts as, their role (owner, admin, manager, office or production), the permissions this connection holds, the environment (live or sandbox), and what this connection can never do. Respect the role: WoodSystems refuses what the role cannot do, and a production user's money fields come back blank, so say the amounts are not visible to them instead of inventing numbers. | reads | meta:read |
Resources
woodsystems://accountThe account, the user this connection acts as, their role and the permissions it holds.woodsystems://custom-fieldsThe custom fields the account keeps on jobs, with their types and options.woodsystems://statusesThe account's job pipeline: main statuses in order and the phases under them.woodsystems://teamThe account's active people and their roles.
Prompts
daily_briefingA start-of-day briefing: who you are acting as, this week's schedule, and jobs that need attention.
Every tool reads and writes your own account's records, which can contain text written by customers and suppliers; assistants are told to treat it as data, not instructions. The machine-readable list is at /.well-known/mcp-tools.json.