Skip to main content
Glama
brynnjocelyn

PocketBase MCP Server

by brynnjocelyn
README.md
# PocketBase MCP Server

A comprehensive Model Context Protocol (MCP) server that provides tools for managing PocketBase instances. This server enables LLMs to interact with PocketBase databases through a standardized protocol.

## Overview

This MCP server exposes PocketBase functionality as tools that can be used by any MCP-compatible client (like Claude Desktop, Cursor, or other LLM applications). It provides comprehensive access to PocketBase features with 60+ tools covering all major operations.

## Features

### Collection Management
- List, get, create, update, and delete collections
- Import/export collections in bulk
- Full schema management support

### Record Operations
- CRUD operations with filtering, sorting, and pagination
- `getFullList` for retrieving all records without pagination
- `getFirstListItem` for finding the first matching record
- Advanced query support with field selection and relation expansion
- Batch operations for efficient bulk processing

### Authentication & User Management
- Multiple auth methods: password, OAuth2, OTP
- Complete auth flow support: registration, login, password reset, email verification
- Email change functionality
- Auth token refresh
- List available auth methods for collections

### File Management
- Generate file URLs with thumbnail support
- Private file token generation
- Download forcing support

### System Operations
- Health monitoring
- Settings management
- Log viewing with statistics
- Cron job management and execution

### Backup & Restore
- Create, list, download, and delete backups
- Full backup restoration support

### Hook Management
- List, read, create, and delete JavaScript hooks
- Pre-built templates for common patterns

## Installation

```bash
npm install
npm run build
```

## Configuration

The server can be configured to connect to different PocketBase instances using (in order of precedence):

1. **Local config file** (`.pocketbase-mcp.json` in your project directory):
   ```json
   {
     "url": "http://localhost:8091"
   }
   ```

2. **Environment variable**:
   - `POCKETBASE_URL`: URL of your PocketBase instance

3. **Default**: `http://127.0.0.1:8090`

### Multi-Project Setup

#### Option 1: Project-Specific Configuration (Recommended)
Each project can have its own MCP configuration:

```bash
# In project directory
claude mcp add-json pocketbase '{"command": "node", "args": ["/path/to/pocketbase-mcp-server/dist/mcp-server.js"], "env": {"POCKETBASE_URL": "http://localhost:8091"}}' --scope project
```

#### Option 2: Config File
Create a `.pocketbase-mcp.json` in your project root:

```json
{
  "url": "https://api.myproject.com"
}
```

#### Option 3: Multiple Named Servers
Add different PocketBase instances globally:

```bash
claude mcp add-json pb-local '{"command": "node", "args": ["/path/to/pocketbase-mcp-server/dist/mcp-server.js"], "env": {"POCKETBASE_URL": "http://localhost:8090"}}'
claude mcp add-json pb-prod '{"command": "node", "args": ["/path/to/pocketbase-mcp-server/dist/mcp-server.js"], "env": {"POCKETBASE_URL": "https://api.myapp.com"}}'
```

## Usage with Claude Desktop

Add this configuration to your Claude Desktop MCP settings:

```json
{
  "mcpServers": {
    "pocketbase": {
      "command": "node",
      "args": ["/path/to/pocketbase-mcp-server/dist/mcp-server.js"],
      "env": {
        "POCKETBASE_URL": "http://localhost:8090"
      }
    }
  }
}
```

## Available Tools

### Collection Management Tools

- `list_collections` - List all collections with pagination and filtering
- `get_collection` - Get a specific collection by ID or name
- `create_collection` - Create a new collection with schema
- `update_collection` - Update collection settings and schema
- `delete_collection` - Delete a collection
- `import_collections` - Import multiple collections at once

### Record Management Tools

- `list_records` - List records with pagination, filtering, sorting, and field selection
- `get_full_list` - Get all records without pagination (batch processing)
- `get_first_list_item` - Get the first record matching a filter
- `get_record` - Get a specific record by ID
- `create_record` - Create a new record
- `update_record` - Update an existing record
- `delete_record` - Delete a record

### Batch Operations

- `batch_create` - Create multiple records in a single transaction
- `batch_update` - Update multiple records in a single transaction
- `batch_delete` - Delete multiple records in a single transaction
- `batch_upsert` - Upsert multiple records in a single transaction

### Authentication Tools

- `list_auth_methods` - Get available authentication methods
- `auth_with_password` - Authenticate with email/username and password
- `auth_with_oauth2` - Get OAuth2 authentication URL
- `auth_refresh` - Refresh authentication token
- `request_otp` - Request OTP for email authentication
- `auth_with_otp` - Authenticate with OTP
- `request_password_reset` - Send password reset email
- `confirm_password_reset` - Confirm password reset with token
- `request_verification` - Send verification email
- `confirm_verification` - Confirm email verification
- `request_email_change` - Request email change
- `confirm_email_change` - Confirm email change

### File Management Tools

- `get_file_url` - Generate URL for accessing files with options
- `get_file_token` - Get private file access token

### Log Management Tools

- `list_logs` - List system logs with filtering
- `get_log` - Get a specific log entry
- `get_log_stats` - Get log statistics

### Cron Job Tools

- `list_cron_jobs` - List all cron jobs
- `run_cron_job` - Manually run a cron job

### System Tools

- `get_health` - Check PocketBase health status
- `get_settings` - Get PocketBase settings (requires admin auth)
- `update_settings` - Update PocketBase settings (requires admin auth)

### Backup Tools

- `create_backup` - Create a backup
- `list_backups` - List available backups
- `download_backup` - Get download URL for a backup
- `delete_backup` - Delete a backup
- `restore_backup` - Restore from a backup

### Hook Management Tools

- `list_hooks` - List JavaScript hook files in the pb_hooks directory
- `read_hook` - Read the contents of a hook file
- `create_hook` - Create or update a JavaScript hook file
- `delete_hook` - Delete a hook file
- `create_hook_template` - Generate hook templates for common patterns:
  - `record-validation`: Field validation for records
  - `record-auth`: Custom authentication logic
  - `custom-route`: API endpoint creation
  - `file-upload`: File upload validation
  - `scheduled-task`: Cron job setup

## Tool Examples

### List Records with Filtering
```json
{
  "tool": "list_records",
  "arguments": {
    "collection": "posts",
    "filter": "published = true && created >= '2024-01-01'",
    "sort": "-created",
    "expand": "author",
    "fields": "id,title,content,author",
    "skipTotal": true
  }
}
```

### Get All Records Without Pagination
```json
{
  "tool": "get_full_list",
  "arguments": {
    "collection": "categories",
    "sort": "name",
    "batch": 1000
  }
}
```

### Batch Create Records
```json
{
  "tool": "batch_create",
  "arguments": {
    "requests": [
      {
        "collection": "posts",
        "data": {
          "title": "First Post",
          "content": "Content 1"
        }
      },
      {
        "collection": "posts",
        "data": {
          "title": "Second Post",
          "content": "Content 2"
        }
      }
    ]
  }
}
```

### OAuth2 Authentication
```json
{
  "tool": "auth_with_oauth2",
  "arguments": {
    "collection": "users",
    "provider": "google",
    "redirectURL": "https://myapp.com/auth/callback"
  }
}
```

### OTP Authentication Flow
```json
// Step 1: Request OTP
{
  "tool": "request_otp",
  "arguments": {
    "collection": "users",
    "email": "user@example.com"
  }
}

// Step 2: Authenticate with OTP
{
  "tool": "auth_with_otp",
  "arguments": {
    "collection": "users",
    "otpId": "otp_id_from_step_1",
    "password": "123456"
  }
}
```

### Get File URL with Thumbnail
```json
{
  "tool": "get_file_url",
  "arguments": {
    "collection": "products",
    "recordId": "abc123",
    "filename": "photo.jpg",
    "thumb": "300x200"
  }
}
```

### Create a Hook Template
```json
{
  "tool": "create_hook_template",
  "arguments": {
    "type": "record-validation",
    "collection": "posts"
  }
}
```

## Query Syntax

The MCP server supports PocketBase's full query syntax:

### Filter Examples
- `title = "example"` - Exact match
- `created >= "2024-01-01"` - Date comparison
- `title ~ "search"` - Contains text
- `tags ?~ "important"` - Any array element contains
- `user.name = "John"` - Nested field access

### Sort Examples
- `created` - Ascending by created
- `-created` - Descending by created
- `name,-created` - Multiple sort fields

### Expand Examples
- `author` - Expand single relation
- `author,tags` - Expand multiple relations
- `author.profile` - Nested expansion

### Field Selection
- `id,title,content` - Select specific fields
- `*,expand.author.name` - Include expanded fields

## Performance Optimization

- Use `skipTotal: true` when you don't need the total count
- Use `fields` parameter to limit data transfer
- Use `get_full_list` with appropriate batch sizes for large datasets
- Use batch operations for bulk record modifications

## Development

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

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

## Architecture

The MCP server follows the Model Context Protocol specification:

1. **MCP Server**: Handles tool registration and execution
2. **PocketBase Client**: Uses the official PocketBase JavaScript SDK
3. **Tool Handlers**: Implement specific PocketBase operations with proper error handling

## Error Handling

All tools include comprehensive error handling and return descriptive error messages. Common errors include:
- Invalid authentication
- Missing required fields
- Network connectivity issues
- Permission denied errors

## Security Considerations

- Admin operations require appropriate authentication
- Use environment variables for sensitive configuration
- The server inherits PocketBase's security model and access rules
- OAuth2 state parameters are handled securely

## Version Compatibility

- Requires PocketBase v0.20.0 or higher
- Uses PocketBase JavaScript SDK v0.21.0+
- Implements MCP protocol version 1.0

## Contributing

Contributions are welcome! Please ensure that any new tools:
- Follow the existing naming patterns
- Include proper TypeScript types
- Have comprehensive error handling
- Are documented in this README

## License

ISC