AroFlo MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@AroFlo MCP Show me all quotes that are currently awaiting a decision"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 installIf global npm linking is restricted on your machine, skip npm link and run without a global install:
npm run build
node dist/mcp/server.jsInstall Into Codex (stdio)
Create a local
.env(not committed) with your credentials:
cp .env.example .env
# edit .envRegister the server in Codex (stores env in
~/.codex/config.toml, not passed as tool args):
make codex-installmake codex-install writes MCP config into ~/.codex/config.toml. If this path is permission-restricted, re-run with appropriate permissions.
Verify:
codex mcp get arofloManual 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
nvmand 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 ciBuild and test:
npm run test
npm run buildRun server (stdio):
npm run devIf your environment blocks IPC sockets used by tsx in dev mode, use the built runtime instead:
npm run build
npm run startRun server (HTTP Streamable transport):
MCP_TRANSPORT=http npm run dev:httpRelated MCP server: ServiceTitan MCP
MCP Inspector
To interactively test tools/list and tools/call via the official inspector UI:
make inspectorProject Layout
src/
auth/
aroflo/
mcp/
utils/
tests/
docs/Environment
Required variables:
AROFLO_SECRET_KEYAROFLO_UENCODEDAROFLO_PENCODEDAROFLO_ORG_ENCODED
Optional variables:
AROFLO_API_BASE_URL(default:https://api.aroflo.com/)AROFLO_ACCEPT(default:text/json)AROFLO_HOST_IPAROFLO_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.mdaroflo://docs/api/<slug>->docs/api/<slug>.md(example:aroflo://docs/api/quotes)
Example query: list Quotes with acceptance status "Awaiting Decision":
Tool:
aroflo_get_quotesArgs:
{
"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_hoursArgs (add optional filters like
sinceDateRequestedto keep outputs small):
{
"sinceCreatedUtc": "2025-01-01",
"sinceDateRequested": "2025-01-01",
"hoursOnly": true,
"includeTaskStatus": true,
"mode": "data"
}Docs
docs/aroflo-auth.mddocs/mcp-tools.mddocs/examples.mddocs/runbooks.mddocs/deployment.mddocs/api/*
Available Tools
51 toolsaroflo_create_or_update_recordAroFlo: Create/Update RecordCDestructive
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 AssetCategoriesBRead-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 AssetsARead-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 BillLineItemsARead-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 BillsARead-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 BusinessUnitsARead-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 ClientNotesARead-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 ClientsARead-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 ContactsARead-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 CustomHoldersARead-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 DocumentsAndPhotosBRead-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 InventoryARead-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 InventoryCategoriesARead-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 InventoryListsARead-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 InventoryStockLevelsARead-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 InvoicesARead-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 LastUpdateBRead-onlyIdempotent
Query the AroFlo lastupdate zone for incremental sync workflows.
Inputs: zoneName, sinceUtc, orderDirection, page, +5 more. Returns: object
aroflo_get_locationsAroFlo: Get LocationsARead-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 MessageBoardARead-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 MessageTemplatesARead-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 PaymentsARead-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 PermissionGroupsARead-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 PrioritiesARead-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 ProjectsBRead-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 PurchaseOrdersARead-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 QuoteLineItemsBRead-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 QuotesARead-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 RecordBRead-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 SchedulesARead-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 StagesARead-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 SubstatusARead-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 SuppliersARead-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 TaskExpensesARead-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 TaskLaboursARead-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 TaskMaterialsARead-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 TaskResourcesBRead-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 TasksARead-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 TaskTypesBRead-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 TimesheetsARead-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 TrackingCentresARead-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 TransactionTermsARead-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 UserPositionARead-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 UsersARead-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 WorkOrderLineItemsBRead-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 WorkOrdersARead-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 ProjectsBRead-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 HoursCRead-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 ZoneARead-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 HoursARead-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 AuditARead-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 ContextARead-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
Scored across 51 tools
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.
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.
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.
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
Related MCP Connectors
MCP server for Codat — companies, connections, invoices, bills and financial statements.
MCP server for MOCO business software: time tracking, projects, budgets, and invoicing via API
Cross-product MCP server for CRM, LeadKit, ProjectKit, Bookio. 10 action types, MIT open spec.
MCP server for Arcoro and ExakTime — workforce data, jobs, cost codes and locations.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn 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.10MIT
- AlicenseBqualityBmaintenanceConnects 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.26461 npm5MIT
- AlicenseNot gradedqualityBmaintenanceMCP server exposing Accelo quote tools (list, get, create, update) with per-user OAuth authentication for natural language interaction.1MIT
- AlicenseNot gradedqualityDmaintenanceA 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.3MIT