Skip to main content
Glama
andymillar84-cyber

mcp-cliniko

README.md
# MCP Cliniko Server

A Model Context Protocol (MCP) server that provides integration with the Cliniko API for healthcare practice management.

## Features

### Tools (Actions)
- **Patient Management**
  - `list_patients` - Search and list patients
  - `get_patient` - Get patient by ID
  - `create_patient` - Create new patient
  - `update_patient` - Update patient details
  - `delete_patient` - Archive patient

- **Appointment Management**
  - `list_appointments` - Search and list appointments
  - `get_appointment` - Get appointment by ID
  - `create_appointment` - Book new appointment
  - `update_appointment` - Modify appointment
  - `cancel_appointment` - Cancel appointment
  - `delete_appointment` - Delete appointment
  - `get_available_times` - Get practitioner availability

- **Invoice Management**
  - `list_invoices` - List and filter invoices
  - `get_invoice` - Get invoice details
  - `create_invoice` - Create new invoice
  - `update_invoice` - Update invoice status or details
  - `delete_invoice` - Delete draft invoice
  
- **Invoice Items**
  - `list_invoice_items` - List items on an invoice
  - `add_invoice_item` - Add item to invoice
  - `update_invoice_item` - Modify invoice item
  - `delete_invoice_item` - Remove item from invoice

- **Payment Processing**
  - `list_payments` - List payments with filtering
  - `create_payment` - Record a payment
  - `delete_payment` - Delete payment record

- **Products & Services**
  - `list_products` - List billable products/services
  - `get_product` - Get product details
  - `create_product` - Create new product/service
  
- **Tax Configuration**
  - `list_taxes` - List available tax rates
  - `get_tax` - Get tax details

- **Complex Workflows**
  - `create_invoice_from_appointments` - Generate invoices from appointments
  - `bulk_invoice_generation` - Bulk create invoices for date range
  - `list_patient_cases` - List patient cases
  - `list_invoices_for_case` - Get invoices for a case

- **Supporting Tools**
  - `list_practitioners` - List all practitioners
  - `list_appointment_types` - List appointment types
  - `list_businesses` - List businesses

- **Test Data**
  - `generate_test_data` - Generate synthetic Australian healthcare data
  - `cleanup_test_data` - Remove test patients

### Resources (Data Access)
- `patient://{id}` - Individual patient data
- `patients://list` - All patients
- `appointment://{id}` - Individual appointment
- `appointments://list` - All appointments
- `appointments://today` - Today's appointments
- `practitioners://list` - All practitioners
- `businesses://list` - All businesses
- `appointment-types://list` - All appointment types
- `openapi://spec` - Cliniko API OpenAPI specification (YAML format)

## Installation

1. Clone the repository:
```bash
git clone https://github.com/yourusername/mcp-cliniko.git
cd mcp-cliniko
```

2. Install dependencies:
```bash
npm install
```

3. Set up your Cliniko API key:
```bash
cp .env.example .env
# Edit .env and add your Cliniko API key
```

4. Build the project:
```bash
npm run build
```

## Configuration

### Environment Variables
- `CLINIKO_API_KEY` - Your Cliniko API key (required)

### Getting a Cliniko API Key
1. Log into your Cliniko account
2. Go to Settings → Integrations → API Keys
3. Create a new API key
4. Copy the key to your `.env` file

## Usage

### Development Mode
```bash
npm run dev
```

### Production Mode
```bash
npm start
```

### Testing with MCP Inspector
```bash
npm run inspect
```

### Integration with Claude Desktop

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

```json
{
  "mcpServers": {
    "cliniko": {
      "command": "node",
      "args": ["/path/to/mcp-cliniko/dist/index.js"],
      "env": {
        "CLINIKO_API_KEY": "your-api-key-here"
      }
    }
  }
}
```

## Examples

### Using Tools

**List Patients:**
```json
{
  "tool": "list_patients",
  "arguments": {
    "q": "Smith",
    "per_page": 10
  }
}
```

**Create Patient:**
```json
{
  "tool": "create_patient",
  "arguments": {
    "first_name": "John",
    "last_name": "Doe",
    "email": "john.doe@example.com",
    "phone_number": "0412345678",
    "date_of_birth": "1980-01-15",
    "medicare_number": "1234567890"
  }
}
```

**Book Appointment:**
```json
{
  "tool": "create_appointment",
  "arguments": {
    "starts_at": "2024-01-20T10:00:00Z",
    "patient_id": 123,
    "practitioner_id": 456,
    "appointment_type_id": 789,
    "business_id": 101
  }
}
```

**Generate Test Data:**
```json
{
  "tool": "generate_test_data",
  "arguments": {
    "num_patients": 5,
    "num_appointments": 10,
    "days_ahead": 7
  }
}
```

### Using Resources

Resources provide read-only access to Cliniko data:

- `patient://123` - Get patient with ID 123
- `patients://list` - List all patients
- `appointments://today` - Get today's appointments

## API Rate Limits

Cliniko API has a rate limit of 200 requests per minute. The server does not implement rate limiting internally, so be mindful of this limit when making bulk operations.

## Error Handling

The server uses standard HTTP error conventions:
- 400 - Bad Request
- 401 - Unauthorized (check API key)
- 404 - Resource not found
- 429 - Rate limit exceeded
- 500 - Internal server error

## Development

### Project Structure
```
mcp-cliniko/
├── src/
│   ├── index.ts              # Main server
│   ├── cliniko-client.ts     # API client
│   ├── types.ts              # TypeScript types
│   ├── tools/                # MCP tools
│   │   ├── patients.ts
│   │   ├── appointments.ts
│   │   └── synthetic-data.ts
│   └── resources/            # MCP resources
│       └── index.ts
├── dist/                     # Compiled JavaScript
├── package.json
├── tsconfig.json
└── .env
```

### Building
```bash
npm run build
```

### Type Checking
```bash
npx tsc --noEmit
```

## License

MIT

## Support

For Cliniko API documentation, visit: https://docs.api.cliniko.com/

For MCP documentation, visit: https://modelcontextprotocol.io/# mcp-cliniko

TDQS

B3.2/5.0

Scored across 27 tools

Disambiguation4/5

Most tools target distinct resources (patients, appointments, invoices) with clear purposes. However, cleanup_test_data and cleanup_comprehensive_test_data are very similar, and demo_invoice_generation overlaps with how_to_create_invoices in providing guidance.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case (e.g., create_patient, list_appointments, delete_patient). No mixing of styles or ambiguous verbs.

Tool Count3/5

27 tools is slightly high for a healthcare practice server. Multiple test data generation and cleanup tools add redundancy, and several invoice tools are read-only due to API limitations, reducing effective utility. A more streamlined set (around 15-20) would be better.

Completeness4/5

CRUD operations are covered for patients and appointments, along with listings and searches. Invoice operations are read-only but acknowledged. Missing features like appointment notes or patient tags are minor given the domain focus.

Maintenance

ActivityInactive
ResponsivenessNo issues