An MCP (Model Context Protocol) server that enables AI agents to interact with Parse Server instances. Explore databases, query classes, troubleshoot issues, and safely modify data through natural language.
By Eliott Guillaumin
- 🔍 Database Exploration - Discover schemas, classes, and relationships
- 📊 Querying - Full Parse query support with filters, sorting, pagination
- 🔗 Relations - Query and manage Pointer and Relation fields
- ✏️ CRUD Operations - Create, read, update, delete objects (with safety prompts)
- 📦 Batch Operations - Bulk create, update, and delete
- ☁️ Cloud Functions - Execute Parse Cloud Code
- 📈 Aggregation - MongoDB-style aggregation pipelines
- 🔐 Roles & Users - Query users and roles
- 🛡️ Safety First - Built-in prompts to ask permission before modifications
- Node.js 18+ (or Docker)
- A Parse Server instance with valid credentials
# Clone the repository
git clone https://github.com/R3D347HR4Y/parse-mcp.git
cd parse-mcp
# Install dependencies
npm install
# Build
npm run buildOr use Docker (recommended):
docker pull purpleshow/parse-mcp-server:latest| Variable | Required | Description |
|---|---|---|
PARSE_SERVER_URL |
✅ | Parse Server URL (e.g., https://parseapi.back4app.com) |
PARSE_APP_ID |
✅ | Your Parse Application ID |
PARSE_MASTER_KEY |
Master Key for admin operations (schema access, config) | |
PARSE_JS_KEY |
❌ | JavaScript Key (optional) |
PARSE_REST_KEY |
❌ | REST API Key (optional) |
| Variable | Default | Description |
|---|---|---|
MCP_TRANSPORT |
http |
Transport mode: http or stdio |
MCP_PORT |
3000 |
HTTP server port (only for HTTP transport) |
MCP_HOST |
0.0.0.0 |
HTTP server host (only for HTTP transport) |
The server runs as an HTTP server by default, making it easy to deploy remotely or in containers.
# Start the HTTP server (default port 3000)
PARSE_SERVER_URL="https://your-server.com/parse" \
PARSE_APP_ID="your-app-id" \
PARSE_MASTER_KEY="your-master-key" \
npm start
# Or specify a custom port
MCP_PORT=8080 npm startThe server exposes:
POST /mcp- MCP Streamable HTTP endpointGET /mcp- SSE stream for server-sent eventsDELETE /mcp- Session terminationGET /health- Health check endpoint
For local Cursor IDE integration, use stdio mode. Add to your Cursor settings (.cursor/mcp.json):
{
"mcpServers": {
"parse": {
"command": "node",
"args": ["/path/to/parse-mcp-server/dist/index.js"],
"env": {
"MCP_TRANSPORT": "stdio",
"PARSE_SERVER_URL": "https://your-parse-server.com/parse",
"PARSE_APP_ID": "your-app-id",
"PARSE_MASTER_KEY": "your-master-key"
}
}
}
}Add to your Claude Desktop config (claude_desktop_config.json):
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"parse": {
"command": "node",
"args": ["/path/to/parse-mcp-server/dist/index.js"],
"env": {
"MCP_TRANSPORT": "stdio",
"PARSE_SERVER_URL": "https://your-parse-server.com/parse",
"PARSE_APP_ID": "your-app-id",
"PARSE_MASTER_KEY": "your-master-key"
}
}
}
}# HTTP mode (default) - starts an HTTP server
PARSE_SERVER_URL="https://your-parse-server.com/parse" \
PARSE_APP_ID="your-app-id" \
PARSE_MASTER_KEY="your-master-key" \
node dist/index.js
# stdio mode - for local IDE integration
MCP_TRANSPORT=stdio \
PARSE_SERVER_URL="https://your-parse-server.com/parse" \
PARSE_APP_ID="your-app-id" \
PARSE_MASTER_KEY="your-master-key" \
node dist/index.jsUse the pre-built image from Docker Hub:
# Pull the image
docker pull purpleshow/parse-mcp-server:latest
# Run in HTTP mode (default) - exposes port 3000
docker run -d \
-p 3000:3000 \
-e PARSE_SERVER_URL="https://your-parse-server.com/parse" \
-e PARSE_APP_ID="your-app-id" \
-e PARSE_MASTER_KEY="your-master-key" \
purpleshow/parse-mcp-server:latest
# The MCP server is now available at http://localhost:3000/mcp
# Health check: http://localhost:3000/healthOr build from source:
docker build -t parse-mcp-server .For local IDE integration via stdio:
{
"mcpServers": {
"parse": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"MCP_TRANSPORT=stdio",
"-e",
"PARSE_SERVER_URL=https://your-parse-server.com/parse",
"-e",
"PARSE_APP_ID=your-app-id",
"-e",
"PARSE_MASTER_KEY=your-master-key",
"purpleshow/parse-mcp-server:latest"
]
}
}
}For Back4App hosted Parse Server:
{
"mcpServers": {
"parse": {
"command": "node",
"args": ["/path/to/parse-mcp-server/dist/index.js"],
"env": {
"PARSE_SERVER_URL": "https://parseapi.back4app.com",
"PARSE_APP_ID": "your-back4app-app-id",
"PARSE_MASTER_KEY": "your-back4app-master-key",
"PARSE_JS_KEY": "your-back4app-js-key"
}
}
}
}Find your keys in Back4App Dashboard → App Settings → Security & Keys.
| Tool | Description |
|---|---|
check_connection |
Verify Parse Server connection and health |
| Tool | Description |
|---|---|
get_all_schemas |
Get schemas for all classes (requires Master Key) |
get_class_schema |
Get schema for a specific class |
| Tool | Description |
|---|---|
get_sample_objects |
Get sample objects from a class to understand data structure |
query_class |
Query objects with filters, sorting, pagination |
count_objects |
Count objects matching a query |
get_object_by_id |
Get a specific object by ID |
| Tool | Description |
|---|---|
query_relation |
Query objects in a Relation field |
add_to_relation |
Add objects to a Relation |
remove_from_relation |
Remove objects from a Relation |
| Tool | Description |
|---|---|
create_object |
Create a new object |
update_object |
Update an existing object |
delete_object |
Delete an object |
| Tool | Description |
|---|---|
batch_create |
Create multiple objects |
batch_update |
Update multiple objects |
batch_delete |
Delete multiple objects |
| Tool | Description |
|---|---|
query_users |
Query the _User class |
get_roles |
Get all defined roles |
get_role_users |
Get users in a specific role |
| Tool | Description |
|---|---|
run_cloud_function |
Execute a Cloud Code function |
| Tool | Description |
|---|---|
aggregate_class |
Run aggregation pipelines (requires Master Key) |
| Tool | Description |
|---|---|
validate_pointer |
Check if a pointer references a valid object |
find_orphaned_pointers |
Find broken pointer references in a class |
get_class_statistics |
Get statistics about a class |
| Tool | Description |
|---|---|
get_config |
Get Parse Config values |
update_config |
Update Parse Config values |
Legend:
⚠️ = Modifies data (asks for permission)- 🔴 = Destructive operation (extra caution)
You: "What classes exist in this Parse database and what data do they contain?"
AI: Let me check the connection and explore the schema...
[Uses check_connection, get_all_schemas, get_sample_objects for each class]
You: "Find all users who signed up in the last 7 days and have verified their email"
AI: I'll query the _User class with those filters...
[Uses query_class with date and emailVerified constraints]
You: "Some of our Order objects seem to have broken user references"
AI: I'll scan the Order class for orphaned user pointers...
[Uses find_orphaned_pointers on the "user" field]
You: "Update all products in category 'Electronics' to have a 10% discount"
AI: I found 47 products in the Electronics category. Here are some examples:
[Shows sample products]
Do you want me to proceed with updating all 47 products to add a 10% discount?
You: "Yes, go ahead"
AI: Updating products...
[Uses batch_update with user permission]
When working with an unfamiliar database, the AI should follow this workflow:
- Check Connection →
check_connection - Get Schema Overview →
get_all_schemas - Sample Key Classes →
get_sample_objectsfor each relevant class - Understand Statistics →
get_class_statisticsfor important classes - Query as Needed →
query_classwith appropriate filters - Ask Permission → Before any write operations
The AI has built-in prompts that guide it through this workflow and remind it to always ask permission before modifying data.
The query_class tool supports Parse query syntax. Here are examples:
{ "status": "active" }{
"score": { "$gt": 100 },
"age": { "$gte": 18, "$lte": 65 }
}{
"tags": { "$in": ["featured", "sale"] },
"category": { "$nin": ["deprecated", "hidden"] }
}{
"$or": [{ "status": "active" }, { "featured": true }]
}{
"author": {
"__type": "Pointer",
"className": "_User",
"objectId": "abc123"
}
}{
"email": { "$regex": "@company\\.com$", "$options": "i" }
}{
"profilePicture": { "$exists": true }
}The aggregate_class tool supports MongoDB-style aggregation:
[
{ "$match": { "status": "completed" } },
{
"$group": {
"_id": "$category",
"total": { "$sum": "$amount" },
"count": { "$sum": 1 },
"avgAmount": { "$avg": "$amount" }
}
},
{ "$sort": { "total": -1 } },
{ "$limit": 10 }
]- Master Key Protection: The Master Key bypasses all security. Only use when necessary.
- Environment Variables: Never commit credentials to version control.
- Permission Prompts: The AI is instructed to always ask before modifying data.
- Audit Trail: Consider logging tool usage for compliance.
- Least Privilege: If possible, use keys with limited permissions.
Check that PARSE_SERVER_URL and PARSE_APP_ID are set correctly.
Schema and config operations require the Master Key. Add PARSE_MASTER_KEY to your environment.
The objectId doesn't exist or you don't have permission to access it. Try with Master Key if appropriate.
- Verify the Parse Server URL is correct and accessible
- Check if your network/firewall allows the connection
- Ensure the keys are valid
# Install dependencies
npm install
# Run in development mode (with hot reload)
npm run dev
# Build for production
npm run build
# Run built version
npm startContributions are welcome! Please feel free to submit issues and pull requests.
- GitHub: https://github.com/R3D347HR4Y/parse-mcp
- Docker Hub: https://hub.docker.com/r/purpleshow/parse-mcp-server
- Parse Server - The open source backend
- Parse JS SDK - JavaScript SDK for Parse
- MCP Protocol - Model Context Protocol specification