The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Autotask listing page.
Give your AI assistant direct access to Autotask. Search tickets, create time entries, look up companies, manage projects — all through natural language. No more copy-pasting between browser tabs and chat windows.
This is a Model Context Protocol (MCP) server that connects Claude (or any MCP-compatible AI) to your Autotask PSA environment. Your AI assistant gets 101 tools covering the operations MSP teams use daily: ticket triage, time logging, company lookups, project management, billing review, and more.
If you run an MSP on Autotask and you're tired of the context-switching tax, this is for you.
Part of the MSP Claude Plugins ecosystem — a growing suite of AI integrations for the MSP stack including Datto RMM, IT Glue, HaloPSA, ConnectWise Automate, NinjaOne, Huntress, and more. Built by MSPs, for MSPs.
Note — no GitHub Packages token required. Unlike most WYRE MCP servers,
autotask-mcpdoes not depend on a private@wyre-ai/*package on GitHub Packages. Its only WYRE dependency is theautotask-nodeSDK, declared as a git dependency on the publicWYRE-AI/autotask-noderepo, whichnpm installresolves anonymously. The DigitalOcean one-click deploy therefore works without anyNODE_AUTH_TOKEN/GITHUB_TOKENbuild variable.
Claude Desktop — download, open, done:
autotask-mcp.mcpb from the latest releaseNo terminal, no JSON editing, no Node.js install required.
Claude Code (CLI):
See Installation for Docker and from-source methods.
autotask_get_ticket_details renders as an interactive card in MCP Apps hosts (Claude Desktop/web) with an in-card "Add note" round-trip; neutral theme by default, brandable via MCP_BRAND_* env vars; plain-JSON behavior is unchanged in other hostsThe simplest method — no terminal, no JSON editing, no Node.js install required.
autotask-mcp.mcpb from the latest releaseFor Claude Code (CLI), one command:
Local (stdio — for Claude Desktop or Claude Code):
Remote (HTTP Streamable — for server deployments):
Clients connect to http://host:8080/mcp using MCP Streamable HTTP transport.
Gateway Mode (for MCP Gateway deployments):
When deploying behind an MCP Gateway that injects credentials via HTTP headers:
The gateway injects credentials via headers:
X-API-Key: Autotask usernameX-API-Secret: Autotask secretX-Integration-Code: Autotask integration codeX-Impersonation-Resource-Id: (optional) Autotask resource ID to act on behalf ofSee Gateway Mode for details.
Then point your MCP client at dist/entry.js:
Create a .env file with your configuration:
When deployed behind an MCP Gateway (e.g., mcp.wyre.ai), the server operates in gateway mode where credentials are injected via HTTP headers on each request.
Enable Gateway Mode:
Expected Headers:
| Header | Description |
|---|---|
X-API-Key | Autotask API username (email) |
X-API-Secret | Autotask API secret key |
X-Integration-Code | Autotask integration code |
X-API-URL | (Optional) Custom Autotask API URL |
X-Impersonation-Resource-Id | (Optional) Autotask resource ID to act on behalf of. Forwarded to Autotask as its ImpersonationResourceId header, so actions are attributed to that resource instead of the API user, and recorded in the entity's read-only impersonatorCreatorResourceID field. Must be a positive integer; anything else is ignored with a warning. The impersonated resource must itself have permission for the action, and the API user's security level must permit impersonation. |
Health Check Response (Gateway Mode):
For detailed migration instructions, see the Migration Guide.
💡 Pro Tip: Copy the above content to a .env file in your project root.
For detailed setup instructions, see the Autotask API documentation.
See Installation for all setup methods.
Resources provide read-only access to Autotask data:
autotask://companies - List all companiesautotask://companies/{id} - Get specific companyautotask://contacts - List all contactsautotask://contacts/{id} - Get specific contactautotask://tickets - List all ticketsautotask://tickets/{id} - Get specific ticketautotask://time-entries - List time entriesThe server provides 101 tools for interacting with Autotask:
autotask_search_companies - Search companies with filtersautotask_create_company - Create new companyautotask_update_company - Update existing companyautotask_search_contacts - Search contacts with filtersautotask_create_contact - Create new contactautotask_search_tickets - Search tickets with filtersautotask_get_ticket_details - Get full ticket details by IDautotask_create_ticket - Create new ticketautotask_create_time_entry - Log time entryautotask_search_time_entries - Search time entries with filters (resource, ticket, project, date range)autotask_search_billing_items - Search approved and posted billing itemsautotask_get_billing_item - Get specific billing item by IDautotask_search_billing_item_approval_levels - Search multi-level approval records for time entriesautotask_search_projects - Search projects with filtersautotask_create_project - Create new projectautotask_search_resources - Search resources (technicians/users)autotask_get_ticket_note / autotask_search_ticket_notes / autotask_create_ticket_noteautotask_get_project_note / autotask_search_project_notes / autotask_create_project_noteautotask_get_company_note / autotask_search_company_notes / autotask_create_company_noteautotask_get_ticket_attachment - Get ticket attachmentautotask_search_ticket_attachments - Search ticket attachmentsautotask_get_expense_report / autotask_search_expense_reports / autotask_create_expense_reportautotask_get_quote / autotask_search_quotes / autotask_create_quoteautotask_search_invoices - Search invoicesautotask_search_contracts - Search contracts (name, company, status, type, end-date range)autotask_get_contract - Get a single contract by IDautotask_list_expiring_contracts - Expiring/expired contracts report (next N days, per company or org-wide)autotask_create_contract / autotask_create_contracts_bulk - Create contract shells, one or manyautotask_update_contract - Update a contract (e.g. extend/renew end date)autotask_create_contract_service / autotask_update_contract_service - Manage contract service linesautotask_search_configuration_items - Search configuration items (assets)autotask_search_tasks - Search project tasksautotask_create_task - Create project taskautotask_test_connection - Test API connectivityThe Autotask MCP server includes intelligent ID-to-name mapping that automatically resolves company and resource IDs to human-readable names, making API responses much more useful for AI assistants and human users.
All search and detail tools automatically include an _enhanced field with resolved names:
ID-to-name mapping is applied automatically to all search and detail tool results. No additional tools are needed — the _enhanced field is added transparently to every response that contains company or resource IDs.
Test the mapping functionality:
For detailed mapping documentation, see docs/mapping.md.
The server supports the MCP Streamable HTTP transport for remote deployments (e.g., Docker, cloud hosting). Set MCP_TRANSPORT=http to enable it.
The HTTP transport exposes:
POST /mcp — MCP Streamable HTTP endpointGET /health — Health check (returns {"status":"ok"})Clients must send requests to /mcp with Accept: application/json, text/event-stream headers per the MCP Streamable HTTP specification.
The Docker image uses HTTP transport by default (port 8080) with a built-in health check.
The Docker image defaults to HTTP transport on port 8080 — suitable for remote/server deployments where clients connect over the network.
For stdio usage with Claude Desktop, see Installation Option 2.
| Variable | Required | Default | Description |
|---|---|---|---|
AUTOTASK_USERNAME | ✅ | - | Autotask API username (email) |
AUTOTASK_SECRET | ✅ | - | Autotask API secret key |
AUTOTASK_INTEGRATION_CODE | ✅ | - | Autotask integration code |
AUTOTASK_API_URL | ❌ | Auto-detected | Autotask API endpoint URL |
MCP_SERVER_NAME | ❌ | autotask-mcp | MCP server name |
MCP_TRANSPORT | ❌ | stdio | Transport type (stdio or http) |
MCP_HTTP_PORT | ❌ | 8080 | HTTP transport port |
MCP_HTTP_HOST | ❌ | 0.0.0.0 | HTTP transport bind address |
LOG_LEVEL | ❌ | info | Logging level |
LOG_FORMAT | ❌ | simple | Log output format |
AUTOTASK_ENHANCE_CONCURRENCY | ❌ | 3 | Max concurrent Autotask API calls used to resolve company/resource names on search results. Kept low to stay under Autotask's concurrent-thread limit. |
NODE_ENV | ❌ | development | Node.js environment |
error: Only error messageswarn: Warnings and errorsinfo: General information, warnings, and errorsdebug: Detailed debugging informationsimple: Human-readable console outputjson: Structured JSON output (recommended for production)Autotask enforces per-integration-code API thresholds on a rolling 1-hour window:
HTTP 429 responsesHTTP 429 until the window rollsLLM-driven workflows fan out easily — "status report on all open projects with notes" can issue hundreds of requests across a few minutes. The server tries to make this safer:
error_type: "rate_limited" and a retry_after_seconds field parsed from Autotask's Retry-After header. The error message explicitly tells the LLM not to retry and to ask the user to scope the query — this prevents repeated retries from extending the cooldown.autotask_search_ticket_notes, autotask_search_project_notes, autotask_search_company_notes, autotask_search_time_entries, autotask_search_ticket_attachments) include a hint reminding the LLM to scope the parent record list before iterating.Per-integration thresholds can be increased in Autotask:
This is the right answer when a single integration code is shared between Claude/Copilot/etc. and other tooling. For LLM-heavy workloads, dedicate a separate API user (and integration code) so a fan-out from one client doesn't starve others.
autotask_get_field_info to discover picklist values once per session rather than refetching them per call.If you're seeing threshold warnings from Autotask but the server seems fine, the LLM driver is probably issuing fan-out patterns. Tighten the prompt to scope before iterating.
Solution: Ensure all required environment variables are set correctly.
Solutions:
Solution: Review Autotask API user permissions and security level settings.
Enable debug logging for detailed troubleshooting:
Test server connectivity:
Problem: 429 Too Many Requests or "thread limit exceeded" errors when Claude queries aggressively
Autotask enforces 3 concurrent threads per endpoint per API tracking identifier. When an LLM issues multiple tool calls simultaneously (e.g., searching tickets, companies, and contacts at once), requests can pile up and hit this limit.
Built-in mitigation: The underlying autotask-node SDK automatically queues excess requests rather than failing immediately. Requests wait for a slot to free up, so you generally won't see 429 errors — but you may notice slower responses under heavy load.
Critical for team/multi-user deployments: If multiple users or the MCP Gateway share the same API credentials, they compete for the same 3-thread budget. This can cause noticeable slowdowns and, in severe cases, queued requests that time out.
Solution — one API key per team: Create a dedicated Autotask API user per team or integration. Each user has an independent integrationCode with its own thread budget:
AUTOTASK_USERNAME, AUTOTASK_SECRET, and AUTOTASK_INTEGRATION_CODE per teamAdditionally, Autotask limits 10,000 total requests per hour across all integrations hitting your tenant. If you hit this limit, all integrations will start receiving 429s — another reason to use targeted queries with appropriate filters.
Problem: MCP server not appearing in Claude Desktop Solutions:
Problem: "Invalid JSON-RPC message: [dotenv@...] injecting env" / Server disconnected
Cause: The autotask-node library calls dotenv.config() at module load time. dotenv v17+ writes status messages via console.log to stdout, which corrupts the MCP stdio JSON-RPC channel.
Solution: Ensure you're using dist/entry.js (not dist/index.js) as the entry point. The entry wrapper redirects console.log to stderr before any libraries load.
Problem: Slow responses Solutions:
LOG_LEVEL=debug) to identify bottlenecksgit checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)This project is licensed under the Apache License 2.0. See the LICENSE file for details.
By submitting a pull request, you agree to the terms of our Contributor License Agreement. This ensures that contributions can be properly licensed and that you have the right to submit the code.
| Avatar | Name | Contributions |
|---|---|---|
![]() | @asachs01 | Maintainer |
![]() | @Baphomet480 | CLI bin fix |
Built by WYRE Technology — part of the MSP Claude Plugins ecosystem