Integrates the AccuLynx roofing CRM with AI clients to manage jobs, contacts, estimates, and financials.
Also known as opsrev/acculynx-cli, @opsrev/acculynx-cli, acculynx-mcp
- Stars
- 0
- Tools
- 34
- Downloads, 30 days
- —
- Latest version
- —
- Last commit
- Oct 27, 2026
- License
- MIT
What is AccuLynx MCP?
AccuLynx integrates the AccuLynx roofing CRM with AI clients to manage jobs, contacts, estimates, and financials. It exposes 34 tools, such as acculynx_ping, acculynx_jobs_list, acculynx_jobs_get.
Summary generated from the project's README
About AccuLynx MCP server
Managing roofing business operations through AI is what this server enables for contractors using the AccuLynx CRM. By connecting to clients like Claude Desktop or Cursor, users can interact with their business data using natural language to handle jobs, contacts, estimates, and financial records. The server provides 30 specific tools, such as acculynx_jobs_list and acculynx_contacts_search, all governed by enforced JSON Schemas to ensure AI agents use correct parameters.
Setup requires an AccuLynx API key obtained from the account administrator settings. The server runs locally via npx or a global npm installation, communicating over stdio. Beyond standard MCP functionality, the package includes a command-line interface that allows for advanced scripting and data processing. This includes specialized scanning capabilities for monitoring job milestones, tracking prospect aging, or generating marketing evidence reports with exact financial values in cents.
What you can do with it
- 1Retrieve recent job detailsAsk your AI client to list the five most recent jobs from your AccuLynx account.
- 2Analyze prospect agingGenerate a report to see how long current prospects have been in the system using specific calendar-day buckets.
- 3Audit job paymentsScan all jobs within specific milestones to verify that received payments are correctly recorded.
- 4Automate contact managementUse the CLI to search for contacts within a specific date range and pipe the results to other tools.
Written from the project's README. Every use case is checked against a quote from it.
How to install AccuLynx MCP
Formats verified 10 Nov 2026Add to CursorAdd to GooseInstall AccuLynx MCP in Claude Code
$ claude mcp add acculynx-cli -- npx -y @opsrev/acculynx-cliInstall AccuLynx MCP in Cursor
~/.cursor/mcp.json
{
"mcpServers": {
"acculynx-cli": {
"command": "npx",
"args": [
"-y",
"@opsrev/acculynx-cli"
]
}
}
}Install AccuLynx MCP in VS Code
.vscode/mcp.json
{
"servers": {
"acculynx-cli": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@opsrev/acculynx-cli"
]
}
}
}Install AccuLynx MCP in VS Code CLI
$ code --add-mcp '{"name":"acculynx-cli","type":"stdio","command":"npx","args":["-y","@opsrev/acculynx-cli"]}'Install AccuLynx MCP in Claude Desktop
claude_desktop_config.json
{
"mcpServers": {
"acculynx-cli": {
"command": "npx",
"args": [
"-y",
"@opsrev/acculynx-cli"
]
}
}
}Install AccuLynx MCP in Codex
$ codex mcp add acculynx-cli -- npx -y @opsrev/acculynx-cliInstall AccuLynx MCP in Codex config.toml
~/.codex/config.toml
[mcp_servers.acculynx-cli] command = "npx" args = ["-y", "@opsrev/acculynx-cli"]
Install AccuLynx MCP in Gemini CLI
$ gemini mcp add -s user acculynx-cli npx -- -y @opsrev/acculynx-cliInstall AccuLynx MCP in Gemini settings.json
~/.gemini/settings.json
{
"mcpServers": {
"acculynx-cli": {
"command": "npx",
"args": [
"-y",
"@opsrev/acculynx-cli"
]
}
}
}AccuLynx MCP tools 34
Detected from the READMEacculynx_pingacculynx_jobs_listacculynx_jobs_getacculynx_jobs_createacculynx_jobs_searchacculynx_jobs_contactsacculynx_jobs_estimatesacculynx_jobs_financialsacculynx_jobs_invoicesacculynx_jobs_milestonesacculynx_jobs_paymentsacculynx_jobs_history
| acculynx_ping | — | |
| acculynx_jobs_list | — | |
| acculynx_jobs_get | — | |
| acculynx_jobs_create | — | |
| acculynx_jobs_search | — | |
| acculynx_jobs_contacts | — | |
| acculynx_jobs_estimates | — | |
| acculynx_jobs_financials | — | |
| acculynx_jobs_invoices | — | |
| acculynx_jobs_milestones | — | |
| acculynx_jobs_payments | — | |
| acculynx_jobs_history | — |
Show all 34 toolsShow fewer tools
acculynx_jobs_repsacculynx_jobs_reps_assignacculynx_jobs_work_typesacculynx_jobs_trade_typesacculynx_jobs_set_work_typeacculynx_jobs_set_trade_typesacculynx_jobs_document_foldersacculynx_jobs_add_expenseacculynx_jobs_upload_documentacculynx_contacts_listacculynx_contacts_getacculynx_contacts_createacculynx_contacts_searchacculynx_contacts_emailsacculynx_contacts_phonesacculynx_contacts_phone_addacculynx_estimates_listacculynx_estimates_getacculynx_estimates_sectionsacculynx_estimates_sectionacculynx_estimates_itemsacculynx_users_list
| acculynx_jobs_reps | — | |
| acculynx_jobs_reps_assign | — | |
| acculynx_jobs_work_types | — | |
| acculynx_jobs_trade_types | — | |
| acculynx_jobs_set_work_type | — | |
| acculynx_jobs_set_trade_types | — | |
| acculynx_jobs_document_folders | — | |
| acculynx_jobs_add_expense | — | |
| acculynx_jobs_upload_document | — | |
| acculynx_contacts_list | — | |
| acculynx_contacts_get | — | |
| acculynx_contacts_create | — | |
| acculynx_contacts_search | — | |
| acculynx_contacts_emails | — | |
| acculynx_contacts_phones | — | |
| acculynx_contacts_phone_add | — | |
| acculynx_estimates_list | — | |
| acculynx_estimates_get | — | |
| acculynx_estimates_sections | — | |
| acculynx_estimates_section | — | |
| acculynx_estimates_items | — | |
| acculynx_users_list | — |
Configuration
ACCULYNX_API_KEYJOB_ID
| Name | Description | |
|---|---|---|
| ACCULYNX_API_KEY | — | |
| JOB_ID | — |
Automated checks
Ran Nov 14, 2026Full report →Passed our automated checks. That is not a security audit: read the code and give the server the narrowest access it needs. How checks work
- Source repository linked and reachableopsrev/acculynx-cli is public and reachablegithub.com/opsrev/acculynx-cli ↗Pass
- Package names this repository as its source@opsrev/acculynx-cli, acculynx-mcp name opsrev/acculynx-cli as sourcenpmjs.com/package/@opsrev/acculynx-cli ↗Pass
- Build provenance (Sigstore attestation)Sigstore attestation for @opsrev/acculynx-cli, acculynx-mcpnpmjs.com/package/@opsrev/acculynx-cli/v/1.18.2#provenance ↗Pass
- Open source license (OSI)MITspdx.org/licenses/MIT.html ↗Pass
- Commit or release in the last yearLast commit or release 2026-10-27github.com/opsrev/acculynx-cli ↗Pass
- OpenSSF ScorecardNot checked
- Package name not close to a popular packageNo popular package one edit away from @opsrev/acculynx-cli, acculynx-mcpPass
- No critical advisory in the package or its dependenciesNot checked
- No hidden instructions to the model34 tool descriptions and the README read; no override phrases, credential paths or hidden charactersPass
- Destructive tools are labelledNo tool named like delete, drop or execPass
- Remote endpoint answers the MCP handshakeNot checked
README
View on GitHubAccuLynx MCP Server & CLI
npm:
acculynx-mcp(MCP server) ·@opsrev/acculynx-cli(CLI + MCP)
An MCP server for the AccuLynx roofing CRM — bring jobs, contacts, and estimates into Claude Desktop, Cursor, or any MCP client. Every tool is exposed with an enforced JSON Schema, so an AI agent can't invent a parameter or call a command that doesn't exist.
- 30 tools across jobs, contacts, estimates, and users.
acculynx-mcp— the MCP server, for Claude Desktop / Cursor / any MCP client.@opsrev/acculynx-cli— the same data as a JSON CLI (and it also ships theacculynx-mcpserver bin).
Use in Claude Desktop
- Get an AccuLynx API key (your AccuLynx account administrator creates it under Account Settings → API).
- Open your Claude Desktop config file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
- macOS:
- Add the server (zero-install via
npx):
{
"mcpServers": {
"acculynx": {
"command": "npx",
"args": ["-y", "acculynx-mcp"],
"env": { "ACCULYNX_API_KEY": "your-api-key" }
}
}
}
Prefer a global install? Run npm i -g acculynx-mcp, then use
"command": "acculynx-mcp" with no args.
- Restart Claude Desktop. Open a new chat and ask "List my 5 most recent
AccuLynx jobs" — you should see the
acculynx_*tools available.
Use in Cursor / other MCP clients
Any client that speaks MCP over stdio works. Point it at npx -y acculynx-mcp
(or a global acculynx-mcp) and set ACCULYNX_API_KEY in the environment.
Example (Cursor ~/.cursor/mcp.json):
{
"mcpServers": {
"acculynx": {
"command": "npx",
"args": ["-y", "acculynx-mcp"],
"env": { "ACCULYNX_API_KEY": "your-api-key" }
}
}
}
MCP tools
All tools are prefixed acculynx_ and return JSON.
| Tool | Description |
|---|---|
acculynx_ping |
Health check — verify the API key and connectivity |
acculynx_jobs_list |
List jobs (paginated, filterable) |
acculynx_jobs_get |
Get one job by id |
acculynx_jobs_create |
Create a job |
acculynx_jobs_search |
Search jobs by free-text term |
acculynx_jobs_contacts |
List a job's contacts |
acculynx_jobs_estimates |
List a job's estimates |
acculynx_jobs_financials |
Get a job's financials |
acculynx_jobs_invoices |
List a job's invoices |
acculynx_jobs_milestones |
List a job's milestone history |
acculynx_jobs_payments |
List a job's payments |
acculynx_jobs_history |
Get a job's change history |
acculynx_jobs_reps |
List a job's representatives |
acculynx_jobs_reps_assign |
Assign a representative to a job |
acculynx_jobs_work_types |
List the company's active work types (id + name) |
acculynx_jobs_trade_types |
List the company's active trade types (id + name) |
acculynx_jobs_set_work_type |
Set a job's work type — by workType name or workTypeId |
acculynx_jobs_set_trade_types |
Set a job's trade types — by tradeTypes names or tradeTypeIds (empty array unassigns all) |
acculynx_jobs_document_folders |
List the company's document folders |
acculynx_jobs_add_expense |
Record an additional expense on a job |
acculynx_jobs_upload_document |
Upload a local file to a job |
acculynx_contacts_list |
List contacts (paginated) |
acculynx_contacts_get |
Get one contact by id |
acculynx_contacts_create |
Create a contact |
acculynx_contacts_search |
Search contacts within a date range |
acculynx_contacts_emails |
List a contact's email addresses |
acculynx_contacts_phones |
List a contact's phone numbers |
acculynx_contacts_phone_add |
Add a phone number to a contact |
acculynx_estimates_list |
List estimates (paginated) |
acculynx_estimates_get |
Get one estimate by id |
acculynx_estimates_sections |
List an estimate's sections |
acculynx_estimates_section |
Get one estimate section |
acculynx_estimates_items |
List items in an estimate section |
acculynx_users_list |
List users (paginated, optional name/email search) |
Configuration
| Env Var | Flag | Required | Description |
|---|---|---|---|
ACCULYNX_API_KEY |
--api-key |
Yes | AccuLynx official API key (Account Settings → API) |
ACCULYNX_EMAIL |
— | No | Login email; only for tools that use AccuLynx's web API |
ACCULYNX_PASSWORD |
— | No | Login password; only for web-API tools |
ACCULYNX_COMPANY_ID |
— | No | Company GUID; only for web-API tools |
Also a CLI
@opsrev/acculynx-cli exposes the same data as a JSON CLI (and bundles the
acculynx-mcp server bin). All output is JSON to stdout; errors are
{"error": "..."} to stderr with exit code 1.
npm install -g @opsrev/acculynx-cli
acculynx ping # verify API key
acculynx jobs list --limit 5 # 25 results by default; --all to fetch everything
acculynx jobs get <jobId>
acculynx jobs search --query "smith"
acculynx jobs scan --milestones Approved # scan all jobs → digest + coverage receipt
acculynx contacts list --limit 10
acculynx estimates get <estimateId>
List commands default to 25 results; use --limit <n> or --all. Commands
that create resources read a JSON body from stdin:
echo '{"name": "New Job"}' | acculynx jobs create
Pipe to jq for scripting:
JOB_ID=$(acculynx jobs list --limit 1 | jq -r '.[0].id')
acculynx jobs get "$JOB_ID" | jq .
Prospect aging with complete readable rows
acculynx jobs scan --report prospect-aging --as-of 2026-10-20 --exclude-trade-type "Maintenance Program"
This bounded GET-only report ages current Prospect inventory by its full milestone date in America/New_York, with inclusive 0–30, 31–60, 61–90 and 91+ calendar-day buckets. It is not a historical inventory snapshot. Exclusions use exact case-insensitive trade-type names; missing classification stays unknown. Every eligible row includes its full ID, date, age and separate approved/worksheet values in exact cents. Missing values remain unavailable rather than zero.
Enumeration is strict and capped at 5,000 jobs before per-job financial reads. Reports above 180,000 characters return partial with no detailed list, keeping output below the retained process-log limit. No history, payment, message or write requests are made. Invalid/incomplete inventory withholds totals and rows; missing dates or financial evidence make the result partial (exit 3). Incompatible filters and output modes fail before provider access (exit 2). Read long stdout through bounded process-log pages.
Monitoring scans: payments with strict coverage
Scan every job in a set of milestones and fetch each one's received payments in one process, with a coverage line a script can check:
acculynx jobs scan --milestones Approved,Completed,Invoiced \
--enrich payments --strict --format jsonl --out payments.jsonl
Each job line carries payments: the job's full received-payment objects
(id, from, amount, paymentDate, checkNumber, notes, …). The last
line is the coverage receipt:
{"type":"coverage","scanned":299,"serverCount":299,"complete":true,"pageError":null,"enrichErrors":0}
--strict(implied by--enrich payments) treats any pagination anomaly (changing total, duplicate job IDs, overfull or malformed pages) as a partial scan. Partial scans exit 3 and reportcomplete: false. Never treat them as a full inventory.- A per-job payments failure doesn't abort the scan. It appears in that job's
errors({"jobId", "source": "payments", "message"}) and counts towardenrichErrors, so retry just those jobs withacculynx jobs payments <id>. - Without
--strictand withoutpayments,jsonloutput is unchanged: job lines only.
Development
cp .env.example .env # fill in your credentials
npm install
npm test # run unit tests (mocked fetch)
npm run dev -- --help # run the CLI in dev mode (auto-loads .env)
npm run build # build both bins to dist/
npm run dev auto-loads .env via Node's --env-file:
npm run dev -- jobs list --limit 5
License
MIT
Private marketing evidence from a native scan
Operators preparing approval-date reconciliation can preserve exact source fields without parsing the rounded human digest:
acculynx jobs scan --start-date 2026-07-01 --end-date 2026-09-04 --date-filter-type ModifiedDate --enrich dates,financials --format marketing-evidence
This emits one acculynx-marketing-evidence/v1 JSON object. It is private
operator evidence containing full job IDs and individual values; do not post
it in a vendor/customer channel. It excludes contacts, addresses, names,
notes, documents, unrelated financials and raw provider error bodies.
--out and other enrichers are rejected before reading. Redirect stdout only
into an appropriately protected operator workspace if retaining the artifact.
This format does not alter downstream agents' command allowlists or authorize
them to export records.
The receipt distinguishes query completeness from enrichment completeness. Strict pagination requires a numeric stable total, advancing offsets and unique job IDs. Exit 3 means partial evidence; never publish it as a complete result. Full source dates are preserved without timezone conversion, repeated approval milestones remain separate, and current approved value is represented in exact cents. Missing/invalid values and dates remain null with issue codes.
This is not an approval cohort, an original-acquisition attribution, a complete lead-delivery inventory or historical revenue. ModifiedDate is a candidate filter; confirm historical and unassigned/dead-lead coverage separately. Review source date semantics, repeated approvals, transfers and current-versus-original contract value before producing normalized results. A large historical scan reads history and financials for each candidate; bootstrap it separately from short daily marketing jobs, then validate an incremental refresh strategy.
AccuLynx MCP questions
How do I add AccuLynx MCP to Claude Code?
Run claude mcp add acculynx-cli -- npx -y @opsrev/acculynx-cli in your terminal. Add --scope user to make it available in every project.
How do I add AccuLynx MCP to Cursor?
Open ~/.cursor/mcp.json and add the server under mcpServers, using the Cursor config shown in the install section above.
What tools does AccuLynx MCP provide?
It exposes 34 tools, including acculynx_ping, acculynx_jobs_list, acculynx_jobs_get, acculynx_jobs_create, acculynx_jobs_search.
What kind of data can I access through the MCP tools?
You can access 30 different tools covering jobs, contacts, estimates, users, financials, invoices, and more.
Can I use this as a command line interface?
Yes, the @opsrev/acculynx-cli package provides a JSON CLI for scripting and terminal use.
Where do I get an API key for AccuLynx?
Your AccuLynx account administrator can create an API key under Account Settings → API.