Server data from the Official MCP Registry
MCP server for Kaseya Autotask PSA — companies, tickets, projects, time entries, and more.
MCP server for Kaseya Autotask PSA — companies, tickets, projects, time entries, and more.
The Autotask MCP server is a well-structured TypeScript/Node.js application with proper authentication, reasonable permission scoping, and generally sound code practices. However, several code quality and documentation issues create moderate concern: environment variables are accessed without strict validation, error handling is broad in places, and sensitive credential patterns could be hardened. No critical vulnerabilities or malicious patterns detected. The server's permissions (file system, environment variables, network HTTP) are appropriate for its PSA integration purpose. Supply chain analysis found 2 known vulnerabilities in dependencies (0 critical, 1 high severity).
4 files analyzed · 10 issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Set these up before or after installing:
Environment variable: AUTOTASK_USERNAME
Environment variable: AUTOTASK_SECRET
Environment variable: AUTOTASK_INTEGRATION_CODE
Environment variable: AUTOTASK_API_URL
Environment variable: MCP_TRANSPORT
Environment variable: AUTH_MODE
Environment variable: LOG_LEVEL
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-wyre-technology-autotask-mcp": {
"env": {
"AUTH_MODE": "your-auth-mode-here",
"LOG_LEVEL": "your-log-level-here",
"MCP_TRANSPORT": "your-mcp-transport-here",
"AUTOTASK_SECRET": "your-autotask-secret-here",
"AUTOTASK_API_URL": "your-autotask-api-url-here",
"AUTOTASK_USERNAME": "your-autotask-username-here",
"AUTOTASK_INTEGRATION_CODE": "your-autotask-integration-code-here"
},
"args": [
"-y",
"autotask-mcp"
],
"command": "npx"
}
}
}From the project's GitHub README.
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 39 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.
Claude Desktop — download, open, done:
autotask-mcp.mcpb from the latest releaseNo terminal, no JSON editing, no Node.js install required.
Claude Code (CLI):
claude mcp add autotask-mcp \
-e AUTOTASK_USERNAME=your-user@company.com \
-e AUTOTASK_SECRET=your-secret \
-e AUTOTASK_INTEGRATION_CODE=your-code \
-- npx -y github:wyre-technology/autotask-mcp
See Installation for Docker and from-source methods.
The simplest method — no terminal, no JSON editing, no Node.js install required.
autotask-mcp.mcpb from the latest releaseFor Claude Code (CLI), one command:
claude mcp add autotask-mcp \
-e AUTOTASK_USERNAME=your-user@company.com \
-e AUTOTASK_SECRET=your-secret \
-e AUTOTASK_INTEGRATION_CODE=your-code \
-- npx -y github:wyre-technology/autotask-mcp
Local (stdio — for Claude Desktop or Claude Code):
{
"mcpServers": {
"autotask": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "MCP_TRANSPORT=stdio",
"-e", "AUTOTASK_USERNAME=your-user@company.com",
"-e", "AUTOTASK_SECRET=your-secret",
"-e", "AUTOTASK_INTEGRATION_CODE=your-code",
"--entrypoint", "node",
"ghcr.io/wyre-technology/autotask-mcp:latest",
"dist/entry.js"
]
}
}
}
Remote (HTTP Streamable — for server deployments):
docker run -d \
--name autotask-mcp \
-p 8080:8080 \
-e AUTOTASK_USERNAME="your-user@company.com" \
-e AUTOTASK_SECRET="your-secret" \
-e AUTOTASK_INTEGRATION_CODE="your-code" \
--restart unless-stopped \
ghcr.io/wyre-technology/autotask-mcp:latest
# Verify
curl http://localhost:8080/health
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:
docker run -d \
--name autotask-mcp \
-p 8080:8080 \
-e AUTH_MODE=gateway \
--restart unless-stopped \
ghcr.io/wyre-technology/autotask-mcp:latest
The gateway injects credentials via headers:
X-API-Key: Autotask usernameX-API-Secret: Autotask secretX-Integration-Code: Autotask integration codeSee Gateway Mode for details.
git clone https://github.com/wyre-technology/autotask-mcp.git
cd autotask-mcp
npm ci && npm run build
Then point your MCP client at dist/entry.js:
{
"mcpServers": {
"autotask": {
"command": "node",
"args": ["/path/to/autotask-mcp/dist/entry.js"],
"env": {
"AUTOTASK_USERNAME": "your-user@company.com",
"AUTOTASK_SECRET": "your-secret",
"AUTOTASK_INTEGRATION_CODE": "your-code"
}
}
}
}
Create a .env file with your configuration:
# Required Autotask API credentials (Local Mode)
AUTOTASK_USERNAME=your-api-user@example.com
AUTOTASK_SECRET=your-secret-key
AUTOTASK_INTEGRATION_CODE=your-integration-code
# Optional configuration
# AUTOTASK_API_URL is auto-detected from AUTOTASK_USERNAME via Autotask's
# unauthenticated zoneInformation endpoint on first connect. Only set this
# explicitly to override auto-detection (e.g. for an on-prem proxy).
# AUTOTASK_API_URL=https://webservices2.autotask.net/atservicesrest/
MCP_SERVER_NAME=autotask-mcp
# Authentication mode
AUTH_MODE=env # env (local), gateway (hosted)
# Transport (stdio for local/desktop, http for remote/Docker)
MCP_TRANSPORT=stdio # stdio, http
MCP_HTTP_PORT=8080 # HTTP transport port (only used when MCP_TRANSPORT=http)
MCP_HTTP_HOST=0.0.0.0 # HTTP transport bind address
# Logging
LOG_LEVEL=info # error, warn, info, debug
LOG_FORMAT=simple # simple, json
# Environment
NODE_ENV=production
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:
AUTH_MODE=gateway
MCP_TRANSPORT=http
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 |
Health Check Response (Gateway Mode):
{
"status": "ok",
"transport": "http",
"authMode": "gateway",
"timestamp": "2026-02-05T10:00:00.000Z"
}
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.
# Start the MCP server (stdio transport, for piping to an MCP client)
node dist/entry.js
# Start with HTTP transport
MCP_TRANSPORT=http node dist/index.js
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 39 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 contractsautotask_search_configuration_items - Search configuration items (assets)autotask_search_tasks - Search project tasksautotask_create_task - Create project taskautotask_test_connection - Test API connectivity// Search for companies
{
"name": "autotask_search_companies",
"arguments": {
"searchTerm": "Acme Corp",
"isActive": true,
"pageSize": 10
}
}
// Create a new ticket
{
"name": "autotask_create_ticket",
"arguments": {
"companyID": 12345,
"title": "Server maintenance request",
"description": "Need to perform monthly server maintenance",
"priority": 2,
"status": 1
}
}
The 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": 12345,
"title": "Sample Ticket",
"companyID": 678,
"assignedResourceID": 90,
"_enhanced": {
"companyName": "Acme Corporation",
"assignedResourceName": "John Smith"
}
}
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:
npm run test:mapping
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.
# Start with HTTP transport
MCP_TRANSPORT=http MCP_HTTP_PORT=8080 node dist/index.js
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.
# Pull the latest image
docker pull ghcr.io/wyre-technology/autotask-mcp:latest
# Run container with HTTP transport (default)
docker run -d \
--name autotask-mcp \
-p 8080:8080 \
-e AUTOTASK_USERNAME="your-api-user@example.com" \
-e AUTOTASK_SECRET="your-secret-key" \
-e AUTOTASK_INTEGRATION_CODE="your-integration-code" \
--restart unless-stopped \
ghcr.io/wyre-technology/autotask-mcp:latest
# Verify it's running
curl http://localhost:8080/health
For stdio usage with Claude Desktop, see Installation Option 2.
# Clone repository
git clone https://github.com/wyre-technology/autotask-mcp.git
cd autotask-mcp
# Create environment file
cp .env.example .env
# Edit .env with your credentials
# Start with docker-compose
docker compose up -d
# Build production image locally
docker build -t autotask-mcp:latest .
# Run container
docker run -d \
--name autotask-mcp \
--env-file .env \
--restart unless-stopped \
autotask-mcp:latest
# Start development environment with hot reload
docker compose --profile dev up autotask-mcp-dev
git clone https://github.com/wyre-technology/autotask-mcp.git
cd autotask-mcp
npm install
npm run dev # Start development server with hot reload
npm run build # Build for production
npm run test # Run test suite
npm run test:watch # Run tests in watch mode
npm run test:coverage # Run tests with coverage
npm run lint # Run ESLint
npm run lint:fix # Fix ESLint issues
autotask-mcp/
├── src/
│ ├── handlers/ # MCP request handlers
│ ├── mcp/ # MCP server implementation
│ ├── services/ # Autotask service layer
│ ├── types/ # TypeScript type definitions
│ ├── utils/ # Utility functions (config, logger, cache)
│ ├── entry.ts # Entry point (stdout guard + .env loader)
│ └── index.ts # Server bootstrap (config, logger, server init)
├── tests/ # Test files
├── scripts/ # Build and packaging scripts
│ └── pack-mcpb.js # MCPB bundle creation
├── manifest.json # MCPB manifest for desktop distribution
├── Dockerfile # Container definition (HTTP transport)
├── docker-compose.yml # Multi-service orchestration
└── package.json # Project configuration
# Run all tests
npm test
# Run with coverage
npm run test:coverage
# Run in watch mode
npm run test:watch
# Run specific test file
npm test -- tests/autotask-service.test.ts
| 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 |
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)Error: Missing required Autotask credentials
Solution: Ensure all required environment variables are set correctly.
Error: Connection to Autotask API failed
Solutions:
Error: User does not have permission to access this resource
Solution: Review Autotask API user permissions and security level settings.
Enable debug logging for detailed troubleshooting:
LOG_LEVEL=debug npm start
Test server connectivity:
# Run test suite
npm run test
# For HTTP transport, check the health endpoint
curl http://localhost:8080/health
# Returns: {"status":"ok"}
# Test API connection with debug logging
LOG_LEVEL=debug npm start
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 teamSupport Team → AUTOTASK_INTEGRATION_CODE=SUPPORT_TEAM_CODE (3 threads)
Projects Team → AUTOTASK_INTEGRATION_CODE=PROJECTS_TEAM_CODE (3 threads, independent)
Additionally, 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
Be the first to review this server!
by Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
by mcp-marketplace · Developer Tools
Create, build, and publish Python MCP servers to PyPI — conversationally.
by Microsoft · Content & Media
Convert files (PDF, Word, Excel, images, audio) to Markdown for LLM consumption
by mcp-marketplace · Developer Tools
Scaffold, build, and publish TypeScript MCP servers to npm — conversationally
by Taylorwilsdon · Productivity
Control Gmail, Calendar, Docs, Sheets, Drive, and more from your AI