Skip to main content
Glama

AroFlo MCP

Standalone, production-ready MCP server for AroFlo with first-class request signing and a clean tool surface.

Quick Start

Install (Local)

This repo ships an MCP server executable named aroflo-mcp (stdio transport by default).

Install the server on your machine (puts aroflo-mcp on your PATH via npm link):

make install

If global npm linking is restricted on your machine, skip npm link and run without a global install:

npm run build
node dist/mcp/server.js

Install Into Codex (stdio)

  1. Create a local .env (not committed) with your credentials:

cp .env.example .env
# edit .env
  1. Register the server in Codex (stores env in ~/.codex/config.toml, not passed as tool args):

make codex-install

make codex-install writes MCP config into ~/.codex/config.toml. If this path is permission-restricted, re-run with appropriate permissions.

  1. Verify:

codex mcp get aroflo

Manual Codex Install (Alternative)

If you prefer doing it manually (same env variables, stored in Codex config):

codex mcp add aroflo \
  --env AROFLO_API_BASE_URL=https://api.aroflo.com/ \
  --env AROFLO_ACCEPT=text/json \
  --env AROFLO_SECRET_KEY=... \
  --env AROFLO_UENCODED=... \
  --env AROFLO_PENCODED=... \
  --env AROFLO_ORG_ENCODED=... \
  --env MCP_TRANSPORT=stdio \
  -- "$(command -v node)" "$(pwd)/dist/mcp/server.js"

Notes:

  • If Codex (desktop app) hangs starting the server, it is usually a PATH issue (common when Node is installed via nvm and the app is launched outside your shell).

  • Fix 1: Launch Codex from a terminal so it inherits your shell PATH (codex app).

  • Fix 2: Configure the MCP server to run via an absolute Node path (see docs/runbooks.md).

Development

Install dependencies:

npm ci

Build and test:

npm run test
npm run build

Run server (stdio):

npm run dev

If your environment blocks IPC sockets used by tsx in dev mode, use the built runtime instead:

npm run build
npm run start

Run server (HTTP Streamable transport):

MCP_TRANSPORT=http npm run dev:http

Related MCP server: ServiceTitan MCP

MCP Inspector

To interactively test tools/list and tools/call via the official inspector UI:

make inspector

Project Layout

src/
  auth/
  aroflo/
  mcp/
  utils/
tests/
docs/

Environment

Required variables:

  • AROFLO_SECRET_KEY

  • AROFLO_UENCODED

  • AROFLO_PENCODED

  • AROFLO_ORG_ENCODED

Optional variables:

  • AROFLO_API_BASE_URL (default: https://api.aroflo.com/)

  • AROFLO_ACCEPT (default: text/json)

  • AROFLO_HOST_IP

  • AROFLO_TIMEOUT_MS (default: 65000)

  • AROFLO_MAX_RETRIES (default: 2)

  • LOG_LEVEL (default: info)

HTTP Transport

Set MCP_TRANSPORT=http to run an HTTP server (Streamable HTTP transport) at:

  • http://${MCP_HTTP_HOST}:${MCP_HTTP_PORT}${MCP_HTTP_PATH}

Using Extracted API Docs (docs/api)

This repo includes a local snapshot of the AroFlo API docs in docs/api/.

The MCP server exposes these markdown files as MCP resources so the client/LLM can look up valid WHERE fields, JOIN areas, etc:

  • aroflo://docs/api -> docs/api/README.md

  • aroflo://docs/api/<slug> -> docs/api/<slug>.md (example: aroflo://docs/api/quotes)

Example query: list Quotes with acceptance status "Awaiting Decision":

  • Tool: aroflo_get_quotes

  • Args:

{
  "where": "and|acceptancestatus|=|Awaiting Decision",
  "page": 1,
  "pageSize": 50
}

Example report: open projects with labour hours per task (recommended for progress reporting):

  • Tool: aroflo_report_open_projects_with_task_hours

  • Args (add optional filters like sinceDateRequested to keep outputs small):

{
  "sinceCreatedUtc": "2025-01-01",
  "sinceDateRequested": "2025-01-01",
  "hoursOnly": true,
  "includeTaskStatus": true,
  "mode": "data"
}

Docs

  • docs/aroflo-auth.md

  • docs/mcp-tools.md

  • docs/examples.md

  • docs/runbooks.md

  • docs/deployment.md

  • docs/api/*

Available Tools

51 tools
aroflo_create_or_update_recordAroFlo: Create/Update RecordC
Destructive

Create or update a record in AroFlo using zone + postxml.

Inputs: zone (required), postxml (required), extra, mode, +3 more. Returns: object

aroflo_get_assetcategoriesAroFlo: Get AssetCategoriesB
Read-onlyIdempotent

Query the AroFlo AssetCategories zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_assetsAroFlo: Get AssetsA
Read-onlyIdempotent

Query the AroFlo Assets zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_billlineitemsAroFlo: Get BillLineItemsA
Read-onlyIdempotent

Query the AroFlo BillLineItems zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_billsAroFlo: Get BillsA
Read-onlyIdempotent

Query the AroFlo Bills zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_businessunitsAroFlo: Get BusinessUnitsA
Read-onlyIdempotent

Query the AroFlo BusinessUnits zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_clientnotesAroFlo: Get ClientNotesA
Read-onlyIdempotent

Query the AroFlo ClientNotes zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_clientsAroFlo: Get ClientsA
Read-onlyIdempotent

Query the AroFlo Clients zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_contactsAroFlo: Get ContactsA
Read-onlyIdempotent

Query the AroFlo Contacts zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_customholdersAroFlo: Get CustomHoldersA
Read-onlyIdempotent

Query the AroFlo CustomHolders zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_documentsandphotosAroFlo: Get DocumentsAndPhotosB
Read-onlyIdempotent

Query the AroFlo DocumentsAndPhotos zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_inventoryAroFlo: Get InventoryA
Read-onlyIdempotent

Query the AroFlo Inventory zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_inventorycategoriesAroFlo: Get InventoryCategoriesA
Read-onlyIdempotent

Query the AroFlo InventoryCategories zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_inventorylistsAroFlo: Get InventoryListsA
Read-onlyIdempotent

Query the AroFlo InventoryLists zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_inventorystocklevelsAroFlo: Get InventoryStockLevelsA
Read-onlyIdempotent

Query the AroFlo InventoryStockLevels zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_invoicesAroFlo: Get InvoicesA
Read-onlyIdempotent

Query the AroFlo Invoices zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_lastupdateAroFlo: Get LastUpdateB
Read-onlyIdempotent

Query the AroFlo lastupdate zone for incremental sync workflows.

Inputs: zoneName, sinceUtc, orderDirection, page, +5 more. Returns: object

aroflo_get_locationsAroFlo: Get LocationsA
Read-onlyIdempotent

Query the AroFlo Locations zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_messageboardAroFlo: Get MessageBoardA
Read-onlyIdempotent

Query the AroFlo MessageBoard zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_messagetemplatesAroFlo: Get MessageTemplatesA
Read-onlyIdempotent

Query the AroFlo MessageTemplates zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_paymentsAroFlo: Get PaymentsA
Read-onlyIdempotent

Query the AroFlo Payments zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_permissiongroupsAroFlo: Get PermissionGroupsA
Read-onlyIdempotent

Query the AroFlo PermissionGroups zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_prioritiesAroFlo: Get PrioritiesA
Read-onlyIdempotent

Query the AroFlo Priorities zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_projectsAroFlo: Get ProjectsB
Read-onlyIdempotent

Query the AroFlo Projects zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_purchaseordersAroFlo: Get PurchaseOrdersA
Read-onlyIdempotent

Query the AroFlo PurchaseOrders zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_quotelineitemsAroFlo: Get QuoteLineItemsB
Read-onlyIdempotent

Query the AroFlo QuoteLineItems zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_quotesAroFlo: Get QuotesA
Read-onlyIdempotent

Query the AroFlo Quotes zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_recordAroFlo: Get RecordB
Read-onlyIdempotent

Fetch one specific AroFlo record by zone and ID field/value. Use extraWhere for additional pipe-delimited clauses like "and|archived|=|false".

Inputs: zone (required), idField (required), idValue (required), extraWhere, +4 more. Returns: object

aroflo_get_schedulesAroFlo: Get SchedulesA
Read-onlyIdempotent

Query the AroFlo Schedules zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_stagesAroFlo: Get StagesA
Read-onlyIdempotent

Query the AroFlo Stages zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_substatusAroFlo: Get SubstatusA
Read-onlyIdempotent

Query the AroFlo Substatus zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_suppliersAroFlo: Get SuppliersA
Read-onlyIdempotent

Query the AroFlo Suppliers zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_taskexpensesAroFlo: Get TaskExpensesA
Read-onlyIdempotent

Query the AroFlo TaskExpenses zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_tasklaboursAroFlo: Get TaskLaboursA
Read-onlyIdempotent

Query the AroFlo TaskLabours zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_taskmaterialsAroFlo: Get TaskMaterialsA
Read-onlyIdempotent

Query the AroFlo TaskMaterials zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_taskresourcesAroFlo: Get TaskResourcesB
Read-onlyIdempotent

Query the AroFlo TaskResources zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_tasksAroFlo: Get TasksA
Read-onlyIdempotent

Query the AroFlo Tasks zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_tasktypesAroFlo: Get TaskTypesB
Read-onlyIdempotent

Query the AroFlo TaskTypes zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_timesheetsAroFlo: Get TimesheetsA
Read-onlyIdempotent

Query the AroFlo Timesheets zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_trackingcentresAroFlo: Get TrackingCentresA
Read-onlyIdempotent

Query the AroFlo TrackingCentres zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_transactiontermsAroFlo: Get TransactionTermsA
Read-onlyIdempotent

Query the AroFlo TransactionTerms zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_userpositionAroFlo: Get UserPositionA
Read-onlyIdempotent

Query the AroFlo UserPosition zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_usersAroFlo: Get UsersA
Read-onlyIdempotent

Query the AroFlo Users zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_workorderlineitemsAroFlo: Get WorkOrderLineItemsB
Read-onlyIdempotent

Query the AroFlo WorkOrderLineItems zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_get_workordersAroFlo: Get WorkOrdersA
Read-onlyIdempotent

Query the AroFlo WorkOrders zone (GET). Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. mode: data|verbose|debug|raw (default: data). Set compact=true and optionally select=["field","nested.field"] to reduce payload size. See resource "aroflo://docs/api/" (example: "aroflo://docs/api/quotes") for valid fields/values.

Inputs: where, order, join, page, +14 more. Returns: object

aroflo_list_open_projectsAroFlo: List Open ProjectsB
Read-onlyIdempotent

List open projects with optional client-side filtering (status/open + closeddate empty). Supports auto pagination with a result cap.

Inputs: sinceCreatedUtc, orgId, managerUserId, autoPaginate, +5 more. Returns: object

aroflo_list_project_tasks_with_hoursAroFlo: List Project Tasks With HoursC
Read-onlyIdempotent

Given projectIds, fetch tasks joined with project + tasktotals and group tasks by project with total hours. Uses client-side filtering by projectId and supports auto pagination with caps.

Inputs: projectIds (required), sinceDateRequested, sinceCreatedUtc, hoursOnly, +8 more. Returns: object

aroflo_query_zoneAroFlo: Query ZoneA
Read-onlyIdempotent

Query an arbitrary AroFlo zone using WHERE/ORDER/JOIN clauses. Use pipe-delimited WHERE clauses like "and|field|=|value", ORDER clauses like "field|asc", and JOIN areas like "lineitems". where/order/join accept either a single string or an array. Set compact=true and optionally select=["field","nested.field"] to reduce payload size. mode: data|verbose|debug|raw (default: data). See resource "aroflo://docs/api" for the extracted zone docs.

Inputs: zone (required), where, order, join, +15 more. Returns: object

aroflo_report_open_projects_with_task_hoursAroFlo: Report Open Projects With Task HoursA
Read-onlyIdempotent

Report open projects (status=open, closeddate empty) and their tasks with total labour hours. Internally fetches Projects then Tasks (join project + tasktotals) and returns a compact grouped output.

Inputs: sinceCreatedUtc, orgId, managerUserId, sinceDateRequested, +10 more. Returns: object

aroflo_report_project_labour_budget_auditAroFlo: Report Project Labour Budget AuditA
Read-onlyIdempotent

Audit a project's actual labour hours against the linked quote's allowed labour hours, including a planned-vs-actual breakdown by task. Uses quote assemblies (parent QuoteLineItems only) as the planned-hour source to avoid double counting children. Highlights the "Credits, Extras & Variations" section when present.

Inputs: jobNumber, quoteId, quoteRefno, projectId, +16 more. Returns: object

aroflo_resolve_job_contextAroFlo: Resolve Job ContextA
Read-onlyIdempotent

Resolve a job context (jobnumber + related task(s), quote(s), and project) starting from any of: jobNumber, quoteId, quoteRefno, projectId, or projectRefno. Uses direct WHERE filters where supported and falls back to bounded scanning where necessary (for example when filtering by refno/refcode is not supported).

Inputs: jobNumber, quoteId, quoteRefno, projectId, +14 more. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 51 tools

    Disambiguation4/5

    Most tools are clearly distinct by targeting specific AroFlo zones (e.g., assets, clients, tasks), with minimal overlap. However, some tools like aroflo_get_record and aroflo_query_zone could be confused with the many specific get_* tools, as they offer more general querying capabilities. The descriptions help differentiate them, but an agent might need to carefully choose between specialized and general tools.

    Naming Consistency5/5

    All tool names follow a consistent snake_case pattern with the prefix 'aroflo_' and clear verb_noun structures (e.g., get_assets, create_or_update_record, list_open_projects). There are no deviations in naming conventions, making the set predictable and easy to parse.

    Tool Count2/5

    With 51 tools, the count is excessive for typical MCP server scopes (usually 3-15 tools). While AroFlo is a complex system, many tools are repetitive get_* queries for different zones, which could have been consolidated into fewer, more generic tools. This large number may overwhelm agents and increase selection complexity.

    Completeness3/5

    The tool set provides extensive read coverage across AroFlo's zones and includes a create/update tool, but lacks dedicated update, delete, or other write operations for most resources. There are also specialized reporting tools, but core CRUD lifecycle coverage is incomplete, relying heavily on querying with only one general write tool.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      An MCP server that wraps the TimePRO API, enabling AI assistants to automatically create, view, and manage timesheets for authenticated users. It provides tools for searching clients and projects, retrieving configuration defaults, and performing full CRUD operations on timesheet entries.
      10
      MIT
    • A
      license
      B
      quality
      B
      maintenance
      Connects AI assistants to ServiceTitan with a default catalog of 264 read-only tools for CRM, dispatch, accounting, reporting, and analytics. Supports focused discovery profiles; write operations are experimental and require explicit opt-in.
      264
      61 npm
      5
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      MCP server exposing Accelo quote tools (list, get, create, update) with per-user OAuth authentication for natural language interaction.
      1
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      A production-ready MCP server for Method CRM API integration. It enables LLMs to interact with Method CRM data through tools for tables, files, users, events, and API key management.
      3
      MIT