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-dev.woodsystems.com/mcp

Claude Code

claude mcp add --transport http woodsystems https://mcp-dev.woodsystems.com/mcp

Claude Desktop or Cursor

{
  "mcpServers": {
    "woodsystems": {
      "type": "http",
      "url": "https://mcp-dev.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-dev.woodsystems.com/mcp",
      "headers": {
        "Authorization": "Bearer wsk_live_..."
      }
    }
  }
}

Tools

ToolWhat it doesKindPermissions
add_job_notePost 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.addsnotes:write
complete_taskMark a task done. It moves to the account's Complete status; someone can reopen it in the app.addstasks:write
create_calendar_eventBook 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.addscalendar:write
create_leadPut 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.addsjobs:write
create_purchase_orderCreate 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.addspurchasing:write
create_taskCreate 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.addstasks:write
get_contactOne contact with their email, phone number and the jobs they are on.readscontacts:read
get_estimateOne estimate with its totals, deposit, dates, notes and terms; with include_lines, its sections and lines.readsestimates:read
get_invoiceOne invoice with its total, amount due, balance and payment link; with include_lines, its sections and lines.readsinvoices:read
get_jobOne job with its contacts (with their ids, emails and phone numbers) and custom field values.readsjobs:read
get_schedule_for_weekEverything 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.readscalendar:read, work_orders:read, tasks:read
get_work_orderOne work order with its steps in order and the step it is at now.readswork_orders:read
list_calendar_eventsCalendar 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.readscalendar:read
list_custom_fieldsThe 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.readsmeta:read
list_estimatesEstimates newest first, with number, name, job, status, subtotal, tax and total. Needs an office role or above.readsestimates:read
list_invoicesInvoices newest first, with number, job, status, total, amount due and balance. Needs an office role or above.readsinvoices:read
list_job_statusesThe 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.readsmeta:read
list_purchase_ordersPurchase orders newest first, with number, supplier, job, status, expected delivery and totals.readspurchasing:read
list_tasksA 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.readstasks:read
list_teamThe 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.readsmeta:read
list_work_ordersWork orders newest first, with number, job, type, current step, due date, priority, progress and who is assigned. Readable from a production role up.readswork_orders:read
search_contactsFind 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.readscontacts:read
search_jobsFind 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.readsjobs:read
search_productsFind 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.readsproducts:read
search_vendorsFind the account's suppliers, newest first, with contacts, lead time and payment terms. Use the id as vendor_id for create_purchase_order.readspurchasing:read
send_email_to_contactEmail 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 firstjobs:read, comms:send
update_job_statusMove 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 firstmeta:read, jobs:read, jobs:write
whoamiCall 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.readsmeta:read

Resources

Prompts

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.