PSA MCP Server 🐳 Docker

HaloPSA MCP

MCP server for HaloPSA with decision tree architecture for managing tickets, clients, assets, agents, and invoices.

🔗 Companion Plugin

Pair this MCP server with the HaloPSA plugin for skills, commands, and API knowledge alongside direct API access.

Installation

Run the MCP server with npx:

npx @wyre-technology/halopsa-mcp

Or install the package:

npm install @wyre-technology/halopsa-mcp

MCPB Bundle (Claude Desktop)

Download the .mcpb bundle from GitHub Releases for a zero-config Claude Desktop install. No Node.js or terminal required — just open the bundle in Claude Desktop via Settings → MCP Servers → Install from file. Requires Claude Desktop 0.10+.

Claude Desktop Configuration

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "halopsa": {
      "command": "npx",
      "args": [
        "@wyre-technology/halopsa-mcp"
      ],
      "env": {
        "HALOPSA_CLIENT_ID": "your-halopsa-client-id",
        "HALOPSA_CLIENT_SECRET": "your-halopsa-client-secret",
        "HALOPSA_TENANT": "your-halopsa-tenant"
      }
    }
  }
}

Authentication

Variable Required Description
HALOPSA_CLIENT_ID Yes OAuth 2.0 Client ID
HALOPSA_CLIENT_SECRET Yes OAuth 2.0 Client Secret
HALOPSA_TENANT Yes Tenant name (e.g., yourcompany)
HALOPSA_BASE_URL No Explicit base URL (alternative to tenant)

Getting Credentials

Vendor portal: https://halopsa.com/

Prerequisites

  • HaloPSA tenant with Administrator role
  • Knowledge of your tenant subdomain (e.g., yourcompany.halopsa.com)

Steps

  1. Sign in to your HaloPSA tenant as an Administrator.
  2. Navigate to Configuration → Integrations → Custom OAuth Apps.
  3. Click "Add" to create a new OAuth app.
  4. Fill in:
    • Name: "WYRE Gateway"
    • Authentication Method: Client ID and Secret (Services)
    • Login Type: System (not Agent)
  5. Save the app. HaloPSA generates HALOPSA_CLIENT_ID and HALOPSA_CLIENT_SECRET.
    • Save HALOPSA_CLIENT_SECRET before leaving — HaloPSA only shows it once.
  6. On the same OAuth app page, assign Permissions for the entities you need (Tickets, Clients, Assets, etc.). Least-privilege per your gateway scope.
  7. Set HALOPSA_TENANT to your subdomain (the prefix before .halopsa.com). If using a custom domain, set HALOPSA_BASE_URL to the full URL instead.

Required Scopes / Permissions

  • Tickets (read/write as needed)
  • Clients (read/write as needed)
  • Assets (read/write as needed)
  • Adjust per the tools you intend to use

Credential Format

Client ID is a GUID. Client Secret is a long random string. Tenant is the subdomain prefix (e.g., "acme" for acme.halopsa.com).

Rotation

OAuth apps can be regenerated from the same Configuration page. Rotation does not require gateway downtime if you have a brief window of overlap.

Architecture

Decision tree with lazy-loaded domain handlers. Navigate to a domain first, then use domain-specific tools.

Available Tools (18)

Tools are organized into 5 domains:

Tickets

Manage support tickets, create new tickets, update status, add actions/notes.

Tool Description
halopsa_tickets_list List tickets with filters
halopsa_tickets_get Get ticket details
halopsa_tickets_create Create a new ticket
halopsa_tickets_update Update an existing ticket
halopsa_tickets_add_action Add a note/action to a ticket

Clients

Manage companies/clients.

Tool Description
halopsa_clients_list List clients
halopsa_clients_get Get client details
halopsa_clients_create Create a new client
halopsa_clients_search Search clients by name

Assets

Manage configuration items/assets.

Tool Description
halopsa_assets_list List assets with filters
halopsa_assets_get Get asset details
halopsa_assets_search Search assets
halopsa_assets_list_types List available asset types

Agents

View technicians and teams.

Tool Description
halopsa_agents_list List agents/technicians
halopsa_agents_get Get agent details
halopsa_teams_list List teams

Invoices

View billing and invoices.

Tool Description
halopsa_invoices_list List invoices with filters
halopsa_invoices_get Get invoice details

Rate Limits

500 requests per 3 minutes. The underlying client library handles rate limiting automatically.