PocketBase MCP Server
A comprehensive MCP server for managing PocketBase database schemas and migrations via REST API. It enables users to generate and execute migrations for creating, modifying, and deleting collections and fields directly through MCP-compatible clients.
README
🚀 PocketBase MCP Server
A complete MCP (Model Context Protocol) server for managing PocketBase migrations via REST API. Generates and executes migrations to create, modify, and delete PocketBase collections.
📥 Installation from GitHub
Clone and install
# Clone the repository
git clone https://github.com/Step-by-Step-technology/pocketbase-mcp.git
cd pocketbase-mcp
# Install dependencies
npm install
# Compile TypeScript
npm run build
Quick setup
- Create an MCP configuration file (
~/.cline_desktop_config.jsonor equivalent):
{
"mcpServers": {
"pocketbase-mcp": {
"command": "node",
"args": ["/absolute/path/to/pocketbase-mcp/dist/index.js"],
"env": {
"POCKETBASE_URL": "http://127.0.0.1:8090",
"POCKETBASE_TOKEN": "your_pocketbase_admin_token",
"POCKETBASE_MIGRATIONS_DIR": "/absolute/path/to/pb_migrations"
}
}
}
}
-
Restart your MCP client (Cline Desktop, Cursor, etc.)
-
Test the installation:
# Start the server in development mode npm run dev
📦 Global installation (optional)
# Install globally (if you want to use it as CLI)
npm install -g .
# Then run
pocketbase-mcp
GitHub Repository: https://github.com/Step-by-Step-technology/pocketbase-mcp
✨ Features
✅ Available Tools (20 complete tools)
🏗️ Migration Tools (13 tools)
| Tool | Description | Status |
|---|---|---|
pocketbase-create-collection-migration |
Generates a migration to create a new collection (supports relation fields) | ✅ Works perfectly |
pocketbase-update-collection |
Generates a migration to modify collection rules | ✅ New |
pocketbase-delete-collection |
Generates a migration to delete a collection | ✅ New |
pocketbase-update-collection-fields |
Generates a migration to modify collection fields (supports relation fields) | ✅ New |
pocketbase-add-field-migration |
Generates a migration to add a single field to a collection (supports relation fields) | ✅ NEW |
pocketbase-remove-field-migration |
Generates a migration to remove a single field from a collection | ✅ NEW |
pocketbase-revert-migration |
Generates a migration to revert a previous migration | ✅ NEW |
pocketbase-execute-any-migration |
Executes any type of migration (creation, modification, deletion) - now supports relation fields | ✅ Improved |
pocketbase-execute-migration |
Executes a creation migration (original tool preserved) | ✅ Works perfectly |
pocketbase-list-migrations |
Lists all available migrations | ✅ Existing |
pocketbase-view-migration |
Displays the content of a migration | ✅ Existing |
pocketbase-list-collections |
Lists all PocketBase collections | ✅ Existing |
pocketbase-view-collection |
Displays collection details | ✅ Existing |
📊 CRUD Tools (7 tools)
| Tool | Description | Status |
|---|---|---|
pocketbase-fetch-record |
Fetches a specific record from a PocketBase collection | ✅ NEW |
pocketbase-list-records |
Lists all records from a collection with pagination | ✅ NEW |
pocketbase-create-record |
Creates a new record in a PocketBase collection | ✅ NEW |
pocketbase-update-record |
Updates an existing record in a PocketBase collection | ✅ NEW |
pocketbase-get-collection-schema |
Gets the schema (fields and types) of a collection | ✅ NEW |
pocketbase-upload-file |
Uploads a file to a PocketBase collection | ✅ NEW |
pocketbase-download-file |
Downloads a file from a PocketBase collection | ✅ NEW |
Total: 20 complete MCP tools - Migration + CRUD + File management
🚀 Installation (Alternative)
If you have already cloned the project locally or are working on an existing version:
Prerequisites
- Node.js 18+
- PocketBase running
- PocketBase admin token
Local installation
# Move to the pocketbase-mcp folder
cd pocketbase-mcp
# Install dependencies
npm install
# Compile TypeScript
npm run build
Note: For a complete installation from GitHub, refer to the 📥 Installation from GitHub section above.
Configuration
Environment variables are configured in the MCP configuration file (cline_mcp_settings.json):
{
"mcpServers": {
"pocketbase-mcp": {
"command": "node",
"args": ["/absolute/path/pocketbase-mcp/dist/index.js"],
"env": {
"POCKETBASE_URL": "http://127.0.0.1:8090",
"POCKETBASE_TOKEN": "your_pocketbase_admin_token",
"POCKETBASE_MIGRATIONS_DIR": "/absolute/path/pb_migrations"
}
}
}
}
Required variables:
POCKETBASE_URL: URL of your PocketBase instance (e.g.,http://127.0.0.1:8090)POCKETBASE_TOKEN: PocketBase admin token (obtained via admin interface)POCKETBASE_MIGRATIONS_DIR: Absolute path to the migrations directory
📦 Project Structure
pocketbase-mcp/
├── src/
│ ├── index.ts # MCP entry point
│ ├── pocketbase-migration.ts # Migration generator
│ └── pocketbase-tools.ts # All MCP tools
├── dist/ # Compiled files
├── pb_migrations/ # Generated migrations
├── package.json
├── tsconfig.json
├── README.md
└── GUIDE_COMPLET.md
🛠️ Usage
Start the MCP Server
# Development
npm run dev
# Production
npm run build
node dist/index.js
Cline Desktop Configuration
Add to ~/.cline_desktop_config.json:
{
"mcpServers": {
"pocketbase-mcp": {
"command": "node",
"args": ["/absolute/path/pocketbase-mcp/dist/index.js"],
"env": {
"POCKETBASE_URL": "http://127.0.0.1:8090",
"POCKETBASE_TOKEN": "your_token",
"POCKETBASE_MIGRATIONS_DIR": "/absolute/path/pb_migrations"
}
}
}
}
📝 Complete Examples
1. Create a Collection
{
"collectionName": "products",
"fields": [
{
"name": "title",
"type": "text",
"required": true,
"max": 200
},
{
"name": "price",
"type": "number",
"required": true,
"min": 0
},
{
"name": "category",
"type": "select",
"required": true,
"values": ["electronics", "clothing", "books", "food", "home"]
}
],
"type": "base"
}
2. Modify Collection Rules
{
"collectionName": "products",
"listRule": "@request.auth.id != ''",
"createRule": "@request.auth.id != ''",
"updateRule": "@request.auth.id != ''",
"deleteRule": "@request.auth.id != ''"
}
3. Modify Collection Fields
{
"collectionName": "products",
"fields": [
{
"name": "title",
"type": "text",
"required": true,
"max": 200
},
{
"name": "description",
"type": "text",
"required": false,
"max": 1000
},
{
"name": "price",
"type": "number",
"required": true,
"min": 0
},
{
"name": "stock",
"type": "number",
"required": false,
"min": 0
}
]
}
4. Delete a Collection
{
"collectionName": "old_collection"
}
5. Execute a Migration
{
"migrationFile": "1768985344_update_products.js"
}
6. Add a Field to a Collection
{
"collectionName": "products",
"field": {
"name": "stock",
"type": "number",
"required": false,
"min": 0
}
}
7. Remove a Field from a Collection
{
"collectionName": "products",
"fieldName": "stock"
}
8. Revert a Migration
{
"migrationFile": "1768987877_add_field_stock_to_products.js"
}
🔄 Complete Workflow
Step 1: Create a Migration
# Use the pocketbase-create-collection-migration tool
# → Generates a file in pb_migrations/
Step 2: Execute the Migration
# Use the pocketbase-execute-any-migration tool
# → Executes the migration via REST API
Step 3: Verify
# Use pocketbase-list-collections
# → Verifies that the collection was created
Step 4: Modify if necessary
# Use pocketbase-update-collection
# → Generates a modification migration
# → Execute with pocketbase-execute-any-migration
🎯 Advanced Use Cases
Creation Migration with Authentication Rules
{
"collectionName": "user_posts",
"fields": [
{
"name": "title",
"type": "text",
"required": true,
"max": 200
},
{
"name": "content",
"type": "text",
"required": false,
"max": 5000
}
],
"listRule": "@request.auth.id != ''",
"createRule": "@request.auth.id != ''",
"updateRule": "@request.auth.id = author",
"deleteRule": "@request.auth.id = author"
}
Authentication Collection Migration
{
"collectionName": "users",
"type": "auth",
"fields": [
{
"name": "username",
"type": "text",
"required": true,
"max": 100
},
{
"name": "avatar",
"type": "file",
"required": false,
"maxSelect": 1
}
]
}
⚙️ Technical Configuration
Environment Variables
| Variable | Description | Default Value |
|---|---|---|
POCKETBASE_URL |
URL of the PocketBase instance | http://127.0.0.1:8090 |
POCKETBASE_TOKEN |
PocketBase admin token | (required) |
POCKETBASE_ADMIN_TOKEN |
Alternative to token | (optional) |
POCKETBASE_MIGRATIONS_DIR |
Migrations directory | ./pb_migrations |
NPM Scripts
{
"scripts": {
"build": "tsc",
"dev": "tsx watch src/index.ts",
"start": "node dist/index.js"
}
}
🆕 New Features (January 2026)
✨ Addition of 3 New Tools
1. pocketbase-add-field-migration
-
Purpose: Add a single field to an existing collection
-
Advantage: Fine granularity - no need to rewrite all fields
-
Usage example:
{ "collectionName": "products", "field": { "name": "stock", "type": "number", "required": false, "min": 0 } }
2. pocketbase-remove-field-migration
-
Purpose: Remove a single field from an existing collection
-
Advantage: Targeted removal without affecting other fields
-
Usage example:
{ "collectionName": "products", "fieldName": "stock" }
3. pocketbase-revert-migration
-
Purpose: Revert a previous migration
-
Advantage: Safety - ability to undo changes
-
Usage example:
{ "migrationFile": "1768987877_add_field_stock_to_products.js" }
🔧 Improvement of pocketbase-execute-any-migration
-
New detection: Now recognizes 6 types of migrations:
create- Collection creationupdate- Rule modificationupdate_fields- Modification of all fieldsadd_field- Addition of a single fieldremove_field- Removal of a single fielddelete- Collection deletion
-
Compatibility: Doesn't break existing functionality - the original
pocketbase-execute-migrationtool is preserved
🔗 Relation Fields Support (January 2026)
✨ Enhanced Support for Relation Fields
The MCP server now fully supports relation fields in PocketBase collections. This includes creating, updating, and managing collections with foreign key relationships between collections.
Key Improvements
-
Fixed
parseMigrationFields()function insrc/pocketbase-migration.ts:- Correctly handles
collectionIdparameter for relation fields - Properly serializes relation field configurations
- Supports
maxSelectandcascadeDeleteoptions
- Correctly handles
-
Enhanced
pocketbase-execute-any-migrationtool:- Now correctly processes migration files containing relation fields
- Properly handles the execution of migrations with complex field relationships
-
Updated
pocketbase-update-collection-fieldstool:- Supports adding/modifying relation fields in existing collections
- Maintains backward compatibility with existing collections
📋 Relation Field Examples
Creating a Collection with Relation Fields
{
"collectionName": "user_roles",
"fields": [
{
"name": "user_ref",
"type": "relation",
"required": true,
"collectionId": "users",
"maxSelect": 1,
"cascadeDelete": false
},
{
"name": "role_ref",
"type": "relation",
"required": true,
"collectionId": "roles",
"maxSelect": 1,
"cascadeDelete": false
},
{
"name": "assigned_at",
"type": "date",
"required": true
},
{
"name": "assigned_by",
"type": "relation",
"required": true,
"collectionId": "users",
"maxSelect": 1,
"cascadeDelete": false
}
],
"type": "base"
}
Adding a Relation Field to an Existing Collection
{
"collectionName": "posts",
"field": {
"name": "author",
"type": "relation",
"required": true,
"collectionId": "users",
"maxSelect": 1,
"cascadeDelete": true
}
}
🛠️ Technical Details
The fixes address the following issues:
-
Bug in
parseMigrationFields(): The function was not correctly handling thecollectionIdparameter for relation fields, causing migrations to fail when creating collections with relations. -
Migration Execution: The
pocketbase-execute-any-migrationtool now properly detects and executes migrations containing relation fields without errors. -
Field Configuration: Relation fields now support all PocketBase options:
collectionId: The ID of the related collection (required)maxSelect: Maximum number of related records (default: 1)cascadeDelete: Whether to delete related records when the parent is deleted (default: false)
✅ Testing
The relation field support has been thoroughly tested with:
- ✅ Creating collections with relation fields: Works perfectly
- ✅ Adding relation fields to existing collections: Works perfectly
- ✅ Executing migrations with relation fields: Works perfectly
- ✅ Real-world use case: User roles system with
users↔rolesrelationships
🎯 Real-World Example: User Roles System
A complete user roles system was implemented using the enhanced relation field support:
rolescollection: Stores role definitions (level 0-9, level 99 for super admin)user_rolescollection: Junction table linking users to roles with relation fields- Access rules: Configured with proper authentication rules
- Default role assignment: All new users automatically get level 1 (basic user)
This demonstrates the practical application of the relation field support in building complex database schemas with PocketBase.
🧪 Testing
The project has been successfully tested with:
- ✅ Manual tests of all features
- ✅ Real migrations executed on PocketBase
- ✅ Complete validation of the 13 MCP tools
- ✅ Tests of new features:
- Field addition: ✅ Works
- Field removal: ✅ Works
- Migration revert: ✅ Works
To test the MCP server:
# Start the server in development mode
npm run dev
# Then use the tools via Cline Desktop or other MCP client
🔧 Development
Code Structure
-
src/pocketbase-migration.ts: Migration generation logiccreateMigrationFile(): Collection creationcreateUpdateMigrationFile(): Collection modificationcreateDeleteMigrationFile(): Collection deletioncreateUpdateFieldsMigrationFile(): Field modificationparseMigrationFields(): Parsing fields from migrations
-
src/pocketbase-tools.ts: MCP tool definitions- 10 complete tools with Zod validation
- Robust error handling
- REST API to PocketBase
-
src/index.ts: Main MCP server- Server configuration
- Connection management
- Logging and monitoring
Add a New Tool
- Add the definition in
pocketbase-tools.ts - Implement the business logic
- Test manually with MCP tools
- Document in the README
📊 Project Statistics
- 10 complete MCP tools
- 4 types of migrations supported (creation, modification, deletion, field modification)
- 100% TypeScript with Zod validation
- Complete REST API to PocketBase
- Robust error handling
- Complete documentation
🚀 Deployment on GitHub
Prepare the Project for GitHub
# Initialize git
git init
# Add files
git add .
# Initial commit
git commit -m "Initial commit: Complete PocketBase MCP Server"
# Create a repo on GitHub
# Link the remote repo
git remote add origin https://github.com/your-username/pocketbase-mcp.git
# Push the code
git push -u origin main
Files to Include in .gitignore
# Dependencies
node_modules/
# Build outputs
dist/
# Environment variables
.env
.env.local
# PocketBase migrations (optional)
pb_migrations/
# IDE
.vscode/
.idea/
# OS
.DS_Store
Package.json for Publication
Make sure your package.json contains:
{
"name": "pocketbase-mcp",
"version": "1.0.0",
"description": "MCP Server for PocketBase migrations",
"main": "dist/index.js",
"scripts": {
"build": "tsc",
"dev": "tsx watch src/index.ts",
"start": "node dist/index.js"
},
"keywords": ["mcp", "pocketbase", "migrations", "database"],
"author": "Step by Step",
"license": "MIT",
"dependencies": {
"@modelcontextprotocol/sdk": "^1.0.0",
"zod": "^3.22.0"
},
"devDependencies": {
"@types/node": "^20.0.0",
"typescript": "^5.0.0",
"tsx": "^4.0.0"
}
}
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。