Skip to main content
Glama
Switchboard666

HaloPSA MCP Server

README.md
# HaloPSA MCP Server

An MCP (Model Context Protocol) server that provides access to HaloPSA's reporting and REST APIs, allowing AI assistants to query and analyze HaloPSA data intelligently.

## Features

- 🔐 Secure OAuth2 authentication with HaloPSA API
- 📊 Execute SQL queries against HaloPSA database
- 🔍 Intelligent schema search and query suggestions
- 📋 Complete database schema with 800+ tables
- 🤖 AI-friendly query building assistance
- 🌐 Full API exploration with swagger schema access
- 📖 Browse and search API endpoints with pagination
- 🔧 Direct API calls to any HaloPSA endpoint

## Installation

### NPM

Install the package from npm:

```bash
npm install -g @adamhancock/halopsa-mcp
```

### Docker

Pull and run the Docker image:

```bash
docker run -e HALOPSA_URL=https://your-instance.halopsa.com \
  -e HALOPSA_CLIENT_ID=your-client-id \
  -e HALOPSA_CLIENT_SECRET=your-client-secret \
  -e HALOPSA_TENANT=your-tenant \
  ghcr.io/adamhancock/halopsa-mcp:latest
```

## Usage with Claude Desktop

### Using NPM Package

Add to your Claude Desktop configuration (`~/Library/Application Support/Claude/claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "halopsa": {
      "command": "npx",
      "args": ["@adamhancock/halopsa-mcp"],
      "env": {
        "HALOPSA_URL": "https://your-instance.halopsa.com",
        "HALOPSA_CLIENT_ID": "your-client-id",
        "HALOPSA_CLIENT_SECRET": "your-client-secret",
        "HALOPSA_TENANT": "your-tenant"
      }
    }
  }
}
```

### Using Docker

Add to your Claude Desktop configuration:

```json
{
  "mcpServers": {
    "halopsa": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e", "HALOPSA_URL=https://your-instance.halopsa.com",
        "-e", "HALOPSA_CLIENT_ID=your-client-id",
        "-e", "HALOPSA_CLIENT_SECRET=your-client-secret",
        "-e", "HALOPSA_TENANT=your-tenant",
        "ghcr.io/adamhancock/halopsa-mcp:latest"
      ]
    }
  }
}
```

## Available Tools

### Database Query Tools

#### `halopsa_list_tables`

List all available tables in the HaloPSA database:

```typescript
{
  filter: "fault"  // Optional: filter tables by name
}
```

#### `halopsa_list_columns`

List columns for a specific table:

```typescript
{
  tableName: "FAULTS",  // Required: table name
  columnFilter: "email"  // Optional: filter columns by name
}
```

#### `halopsa_query`

Execute SQL queries against the HaloPSA database:

```typescript
{
  sql: "SELECT * FROM FAULTS WHERE Status = 1 LIMIT 10"
}
```

#### `halopsa_table_info`

Get detailed information about a specific table including all columns, data types, and relationships:

```typescript
{
  tableName: "FAULTS"
}
```

#### `halopsa_build_query`

Build SQL queries programmatically with a helper:

```typescript
{
  tableName: "FAULTS",
  columns: ["Faultid", "username", "Symptom"],  // Optional: defaults to all columns
  conditions: { "Status": 1 },  // Optional: WHERE conditions
  orderBy: "datereported DESC",  // Optional: ORDER BY clause
  limit: 10  // Optional: LIMIT clause
}
```

### API Exploration Tools

#### `halopsa_list_api_endpoints`

List all API endpoints with basic information. Supports pagination:

```typescript
{
  category: "Tickets",  // Optional: filter by category
  limit: 100,          // Optional: max results (default: 100)
  skip: 0              // Optional: skip for pagination
}
```

#### `halopsa_get_api_endpoint_details`

Get complete details for specific API endpoints including parameters and schemas:

```typescript
{
  pathPattern: "ticket",      // Required: pattern to match endpoints
  summaryOnly: false,        // Optional: return only basic info
  includeSchemas: true,      // Optional: include request/response schemas
  maxEndpoints: 10,          // Optional: max endpoints to return
  includeExamples: false     // Optional: include examples
}
```

#### `halopsa_search_api_endpoints`

Search for API endpoints by keywords. Supports pagination:

```typescript
{
  query: "create ticket",    // Required: search query
  limit: 50,                // Optional: max results (default: 50)
  skip: 0                   // Optional: skip for pagination
}
```

#### `halopsa_get_api_schemas`

Get API schemas/models from the swagger definition. Supports pagination:

```typescript
{
  schemaPattern: "Ticket",   // Optional: filter schemas by name
  limit: 50,                // Optional: max schemas to return
  skip: 0,                  // Optional: skip for pagination
  listNames: false          // Optional: include all matching schema names
}
```

#### `halopsa_api_call`

Make authenticated API calls to any HaloPSA endpoint:

```typescript
{
  path: "/api/Ticket",       // Required: API endpoint path
  method: "GET",            // Optional: HTTP method (default: GET)
  body: {},                 // Optional: request body for POST/PUT/PATCH
  queryParams: {}           // Optional: URL query parameters
}
```

## Common Queries

### Open Tickets

```sql
SELECT Faultid, username, Symptom, Status, datereported 
FROM FAULTS 
WHERE Status IN (1, 2, 3)
ORDER BY datereported DESC
```

### User List

```sql
SELECT uusername, uemail, usite, uextn 
FROM USERS 
WHERE uinactive = 0
```

### Request Types

```sql
SELECT RTid as RequestTypeId, rtdesc as RequestTypeName 
FROM REQUESTTYPE 
WHERE RTVisible = 1
```

## Development

### Run in Development Mode

```bash
pnpm run dev
```

### Test Connection

```bash
node dist/index.js
```

## Schema Information

The MCP includes a complete HaloPSA database schema with:
- 818 tables
- Key tables include:
  - FAULTS (622 columns) - Tickets/Requests
  - USERS (213 columns) - User information
  - SITE (115 columns) - Client/Site data
  - ACTIONS (196 columns) - Ticket actions
  - REQUESTTYPE (332 columns) - Ticket types

## Security Notes

- Never commit `.env` files
- Store credentials securely
- Use read-only API credentials when possible
- Rotate API keys regularly

## License

ISC

TDQS

A3.9/5.0

Scored across 10 tools

Disambiguation3/5

The tools have some overlap that could cause confusion, particularly between halopsa_list_tables/halopsa_list_columns/halopsa_table_info for database exploration and halopsa_list_api_endpoints/halopsa_search_api_endpoints/halopsa_get_api_endpoint_details for API discovery. However, the descriptions help clarify their specific purposes, preventing complete ambiguity.

Naming Consistency5/5

All tools follow a consistent halopsa_verb_noun naming pattern with clear, descriptive names. The structure is uniform throughout the set, making it easy to predict tool purposes and maintain readability.

Tool Count5/5

With 10 tools, the count is well-scoped for a server focused on database and API interaction for HaloPSA. Each tool serves a distinct role in the workflow, from discovery to execution, without feeling excessive or insufficient.

Completeness4/5

The toolset covers essential workflows for database querying and API interaction, including discovery, schema inspection, and execution. Minor gaps exist, such as no direct tools for data modification (e.g., insert/update) or advanced API operations beyond calls, but agents can work around these using the provided tools.