takusaotome/zoho-mcp-server
If you are the rightful owner of zoho-mcp-server and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
Zoho MCP Server is a Model Context Protocol server designed for seamless integration with Zoho Projects and WorkDrive, enabling natural language interaction through MCP-compatible clients.
Zoho MCP Server
Model Context Protocol (MCP) server for Zoho Projects and WorkDrive integration.
๐ Table of Contents
- ๐ Quick Start Guide
- โ๏ธ Advanced Configuration
- ๐ Available Tools
- ๐ป Usage Examples
- ๐งช Development
- ๐ Deployment
- ๐ Troubleshooting
Overview
โก Get started with Zoho Projects API in 5 minutes!
This server enables natural language interaction with Zoho applications through MCP-compatible clients like Cursor IDE and Claude. It provides secure access to Zoho Projects tasks and WorkDrive files via JSON-RPC protocol.
๐ Recommended Usage
๐ฏ Local usage is strongly recommended!
- โ Personal Development & Learning: Local environment is optimal
- โ Prototyping: Safe development environment for testing
- โ Small Teams: Limited usage in VPN environment
- โ ๏ธ Production Deployment: Requires advanced security configuration
โจ Key Features
- ๐ฏ Easy Setup: 5-minute OAuth setup with automatic token management
- ๐ Secure: JWT authentication, IP allowlisting, rate limiting
- ๐ Fast: Redis caching, async processing
- ๐ Comprehensive: Task management, file operations, project analytics
- ๐ค AI-Ready: Perfect for Cursor IDE, Claude, and other MCP clients
- ๐ Local-First: Prioritizes safe usage in local environments
๐ฌ What You Can Do
- ๐ Create and manage tasks with natural language
- ๐ Generate project reports and analytics
- ๐ Search across projects and files
- ๐ Upload/download files to WorkDrive
- ๐ Real-time webhooks for task updates
๐ก Use Case Recommendations
Use Case | Recommended Environment | Security Level |
---|---|---|
๐งช Personal Learning & Development | Local environment | Basic setup |
๐ฅ Small Teams | Local + VPN | Standard setup |
๐ข Enterprise Use | Dedicated server + VPN | Advanced setup |
๐ Production Service | Not recommended | - |
Project Structure
zoho-mcp-server/
โโโ server/ # Main application code
โโโ tests/ # Test suites
โโโ docs/ # Documentation & guides
โ โโโ requirement/ # Requirements documentation
โ โโโ plan/ # Project planning documents
โ โโโ design/ # Design documents
โ โโโ guides/ # Setup guides & troubleshooting
โโโ tools/ # Development & utility scripts
โโโ config/ # Configuration files
โโโ reports/ # Generated reports & project data
โโโ temp/ # Temporary files
Directory Details
server/
- Main application code (handlers, auth, storage, etc.)tests/
- Test suites (unit, integration, e2e, security)docs/
- Documentation and guidesguides/
- Setup guides and troubleshooting documentation
tools/
- Development tools, test scripts, and utilitiesconfig/
- Configuration templates and settingsreports/
- Generated task reports, project data, and exports (gitignored)temp/
- Temporary files (coverage reports, logs, etc.)
Features
Phase 1 (MVP)
- Task Management: Create, read, update tasks in Zoho Projects
- Project Analytics: Get completion rates and progress summaries
- File Operations: Download and upload files in WorkDrive
- Search: Find files and tasks across projects
- Webhooks: Real-time notifications for task updates
Security
- JWT authentication with IP allowlisting
- Rate limiting (100 req/min)
- CORS protection
- OAuth2 integration with Zoho
๐ Quick Start Guide
โฑ๏ธ Time required: About 5 minutes | ๐ก Initial setup only | ๐ Local environment recommended
๐ฏ Let's start with local environment first!
This guide assumes safe usage in a local environment. If you're considering production deployment, please check security risks first.
๐ค MCP Client Setup (Cursor IDE / Claude Desktop)
For local MCP usage, JWT authentication is NOT required! The MCP server runs directly as a subprocess.
๐ฏ Cursor IDE Setup
- Install the MCP server (follow installation steps below)
- Configure Cursor MCP settings:
Create or update ~/.cursor/mcp.json
:
{
"mcpServers": {
"zoho-mcp-server": {
"command": "/path/to/your/project/venv/bin/python",
"args": ["-m", "server.mcp_stdio_server"],
"env": {
"PYTHONPATH": "/path/to/your/project/zoho-mcp-server",
"ZOHO_CLIENT_ID": "your_client_id",
"ZOHO_CLIENT_SECRET": "your_client_secret",
"ZOHO_REFRESH_TOKEN": "your_refresh_token",
"ZOHO_PORTAL_ID": "your_portal_id",
"REDIS_URL": "redis://localhost:6379/0",
"REDIS_SSL": "false",
"ALLOWED_IPS": "127.0.0.1,::1,localhost",
"ENVIRONMENT": "development"
},
"cwd": "/path/to/your/project/zoho-mcp-server"
}
}
}
- Restart Cursor IDE to load the MCP server
- Test the connection by asking Cursor about your Zoho projects
๐ฏ Claude Desktop Setup
- Install the MCP server (follow installation steps below)
- Configure Claude Desktop MCP settings:
Create or update ~/Library/Application Support/Claude/claude_desktop_config.json
(macOS):
{
"mcpServers": {
"zoho-mcp-server": {
"command": "/path/to/your/project/venv/bin/python",
"args": ["-m", "server.mcp_stdio_server"],
"env": {
"PYTHONPATH": "/path/to/your/project/zoho-mcp-server",
"ZOHO_CLIENT_ID": "your_client_id",
"ZOHO_CLIENT_SECRET": "your_client_secret",
"ZOHO_REFRESH_TOKEN": "your_refresh_token",
"ZOHO_PORTAL_ID": "your_portal_id",
"REDIS_URL": "redis://localhost:6379/0",
"REDIS_SSL": "false",
"ALLOWED_IPS": "127.0.0.1,::1,localhost",
"ENVIRONMENT": "development"
},
"cwd": "/path/to/your/project/zoho-mcp-server"
}
}
}
For Windows: %APPDATA%/Claude/claude_desktop_config.json
For Linux: ~/.config/Claude/claude_desktop_config.json
- Restart Claude Desktop to load the MCP server
- Test the connection by asking Claude about your Zoho projects
๐ก Important Notes for MCP Setup
- No JWT required: MCP clients run the server as a subprocess, so no authentication tokens needed
- Use full paths: Always use absolute paths for
command
andcwd
- Virtual environment: Make sure to use the Python executable from your virtual environment
- Environment variables: All Zoho credentials must be provided in the
env
section - Redis required: Make sure Redis is running locally (
brew services start redis
on macOS)
๐งโโ๏ธ Option A: Automatic Setup (Recommended)
The easiest way! Wizard automates everything:
# 1. Install dependencies
pip install -r requirements-dev.txt
# 2. Run setup wizard
python tools/setup_wizard.py
The wizard automatically performs:
- โ Prerequisites check (Python, Redis)
- โ .env file creation
- โ JWT_SECRET auto-generation
- โ Zoho authentication setup
- โ OAuth authentication flow
- โ Portal ID & Project ID retrieval
- โ Final testing
Complete in 5 minutes! ๐
๐ Option B: Manual Setup
Manual setup for those who want to understand the details:
๐ Prerequisites
- Python 3.12+ (with pip)
- Redis server (local installation recommended)
- Zoho account (Projects and WorkDrive access)
- Local development environment (macOS, Windows, Linux)
๐ง Step 1: Installation
- Clone and setup:
git clone <repository-url>
cd zoho-mcp-server
pip install -r requirements-dev.txt
- Start Redis (local server):
# macOS (Homebrew) - recommended
brew install redis
brew services start redis
# Ubuntu/Debian
sudo apt install redis-server
sudo systemctl start redis
# Windows (WSL recommended)
sudo service redis-server start
# Docker (cross-platform)
docker run -d -p 6379:6379 redis:alpine
๐ Step 2: Zoho OAuth Setup
Choose one of the following methods:
๐ Method A: Automatic Setup (Recommended)
-
Create Zoho Application:
- Go to Zoho API Console
- Click "ADD CLIENT" โ "Server-based Applications"
- Fill in:
- Client Name:
MCP Server
- Homepage URL:
http://localhost:8000
- Authorized Redirect URIs:
http://localhost:8000/auth/callback
- Client Name:
-
Configure Environment:
cp config/env.example .env
- Edit
.env
file with your Zoho credentials:
# Required: Copy from Zoho API Console
ZOHO_CLIENT_ID=1000.XXXXXXXXXXXXXXXXXX
ZOHO_CLIENT_SECRET=your_client_secret_here
# JWT Secret (ONLY required for web server deployment, NOT for MCP usage)
# JWT_SECRET=your_generated_jwt_secret_here # Comment out for MCP usage
# Required: Your Portal ID (see step 5.2 below)
ZOHO_PORTAL_ID=your_portal_id
# Required: Default Project ID for testing (see step 5.3 below)
TARGET_PROJECT_ID=your_project_id_here
# Redis (default for local)
REDIS_URL=redis://localhost:6379/0
3.1. Generate JWT Secret (ONLY for web server deployment):
# Skip this step for MCP usage!
# python tools/generate_jwt_secret.py
- โ ๏ธ For MCP usage: JWT is NOT required, skip this step
- โ For web server: Automatically generates secure JWT_SECRET
- Start the server (local environment):
# Local environment startup (recommended)
uvicorn server.main:app --host 127.0.0.1 --port 8000 --reload
# Or to allow external access (caution required)
uvicorn server.main:app --host 0.0.0.0 --port 8000 --reload
- Run OAuth authentication (automatic setup):
python tools/generate_zoho_auth_url.py
- Select option 1 (recommended, automatic setup)
- Follow the browser authentication
- โ Done! Refresh token is automatically saved
- Test your setup:
# Quick verification
python tools/verify_setup.py
# Test API access (optional)
python tools/get_project_tasks.py
- โ If successful, you'll see your projects and tasks!
๐ Method B: Manual Setup (Self Client)
For simpler setup without server configuration:
-
Use Self Client:
- Go to Zoho API Console
- Click "Self Client" tab
- Select scopes:
ZohoProjects.projects.read
,ZohoProjects.tasks.all
- Generate code (10-minute expiry)
-
Convert to Refresh Token:
python tools/exchange_auth_code.py "YOUR_GENERATED_CODE"
โ๏ธ Step 3: Initial Setup Verification
- Basic setup verification:
python tools/verify_setup.py
๐ Step 4: Find Your Portal & Project IDs
- Get your Portal ID and available projects:
python tools/get_real_portal_and_projects.py
- ๐ Available project list will be displayed
- ๐ Note down Portal ID and Project ID
- Update
.env
file with your IDs:
# Edit .env file and update the following:
ZOHO_PORTAL_ID=your_actual_portal_id
TARGET_PROJECT_ID=your_actual_project_id
โ Step 5: Final Testing
- Complete API test:
python tools/get_project_tasks.py
- โ If successful, project task list will be displayed
- Alternative: Test with specific project:
python tools/get_project_tasks.py --project-id YOUR_PROJECT_ID
๐ฏ Step 6: Start Using
๐ Local environment setup complete! Your MCP server is now ready! The server provides:
- MCP Endpoint:
http://127.0.0.1:8000/mcp
(local only) - Health Check:
http://127.0.0.1:8000/health
- API Docs:
http://127.0.0.1:8000/docs
(debug mode)
๐ ้่ฆ: OAuth่ช่จผๅพใฎๅฟ ้ ๆ้
OAuth่ช่จผๅฎไบๅพใฏๅฟ ใใตใผใใผใๅ่ตทๅใใฆใใ ใใ๏ผ
# 1. ็พๅจใฎใตใผใใผใๅๆญข (Ctrl+C)
# 2. ใตใผใใผใๅ่ตทๅ
uvicorn server.main:app --host 127.0.0.1 --port 8000 --reload
็็ฑ: ๆฐใใRefresh Tokenใๆญฃใใ่ชญใฟ่พผใใใ
๐ก๏ธ Security Notes
- โ Local Usage: Safest and recommended usage method
- โ ๏ธ External Access: Requires advanced security configuration (details)
- ๐ Sensitive Data: Never share .env file
- ๐ Development Environment: Manage production data in separate environment
- ๐ After OAuth: Always restart server after authentication
๐ง Quick Troubleshooting
โ "Invalid OAuth Scope" error
# Remove problematic scope and retry
python tools/generate_zoho_auth_url.py
# Select option 1 and re-authenticate
โ "Invalid Redirect Uri" error
# Check Zoho API Console settings:
# Redirect URI must be: http://localhost:8000/auth/callback
โ Redis connection error
# Check Redis is running
redis-cli ping
# Should return: PONG
โ JWT_SECRET missing or invalid (Web server only)
# For MCP usage: JWT is NOT required, comment out JWT_SECRET in .env
# For web server: Generate new JWT secret
python tools/generate_jwt_secret.py
โ "JWT_SECRET too short" error (Web server only)
# For MCP usage: Comment out JWT_SECRET in .env file
# For web server: JWT_SECRET must be at least 32 characters
python tools/generate_jwt_secret.py
For detailed troubleshooting, see:
โ๏ธ Advanced Configuration
Environment Variables Reference
Variable | Description | Required | Default |
---|---|---|---|
ZOHO_CLIENT_ID | Zoho OAuth Client ID | โ Yes | - |
ZOHO_CLIENT_SECRET | Zoho OAuth Client Secret | โ Yes | - |
ZOHO_REFRESH_TOKEN | OAuth Refresh Token (auto-generated) | โ Yes | - |
ZOHO_PORTAL_ID | Your Zoho Portal ID | โ ๏ธ Recommended | - |
JWT_SECRET | JWT signing secret (ONLY for web server, NOT for MCP) | โ No (for MCP) | - |
REDIS_URL | Redis connection URL | โ Yes | redis://localhost:6379/0 |
ALLOWED_IPS | IP allowlist (comma-separated) | โ No | 127.0.0.1,::1 |
RATE_LIMIT_PER_MINUTE | Request rate limit | โ No | 100 |
DEBUG | Enable debug mode | โ No | false |
Required Zoho Scopes
The following scopes are automatically configured:
ZohoProjects.projects.read
- Read project informationZohoProjects.tasks.all
- Full task management access
Additional Setup Guides
- ๐ Detailed OAuth Guide:
- ๐ง Self Client Method:
- ๐ Troubleshooting:
API Endpoints
MCP Protocol
POST /mcp
- JSON-RPC 2.0 endpointGET /manifest.json
- Tool manifest
Health & Monitoring
GET /health
- Health checkPOST /webhook/task-updated
- Webhook receiver
๐ Available Tools
Tool | Description | Parameters |
---|---|---|
listTasks | List project tasks | project_id , status? |
createTask | Create new task | project_id , name , owner? , due_date? |
updateTask | Update existing task | task_id , status? , due_date? , owner? |
getTaskDetail | Get task details | task_id |
getProjectSummary | Get project metrics | project_id , period? |
downloadFile | Download WorkDrive file | file_id |
uploadReviewSheet | Upload review file | project_id , folder_id , name , content_base64 |
searchFiles | Search files | query , folder_id? |
๐ป Usage Examples
List Tasks
{
"jsonrpc": "2.0",
"method": "callTool",
"params": {
"name": "listTasks",
"arguments": {
"project_id": "123456789",
"status": "open"
}
},
"id": "1"
}
Create Task
{
"jsonrpc": "2.0",
"method": "callTool",
"params": {
"name": "createTask",
"arguments": {
"project_id": "123456789",
"name": "Review API documentation",
"owner": "developer@company.com",
"due_date": "2025-07-01"
}
},
"id": "2"
}
๐งช Development
Testing
# Run all tests
pytest
# Run with coverage
pytest --cov=server --cov-report=html
# Run specific test types
pytest tests/unit/
pytest tests/integration/
pytest tests/e2e/
Code Quality
# Linting
ruff check .
ruff format .
# Type checking
mypy server/
# Security scan
bandit -r server/
safety check
Pre-commit Hooks
pre-commit install
pre-commit run --all-files
๐ Deployment
โ ๏ธ Important: Make sure to complete security configuration before deploying to production!
๐จ Security Warning
Deploying to Render as-is would be dangerous! Anyone could access your Zoho account.
Required: Read the first.
Render Platform (After Security Configuration)
- Complete security configuration -
- Connect your GitHub repository to Render
- Configure environment variables in Render dashboard (following security guide)
- Deploy automatically on push to main branch
๐ Production Environment Variables (Required Security Configuration)
# Security configuration (required)
ENVIRONMENT=production
DEBUG=false
LOG_LEVEL=WARNING
ALLOWED_IPS=your.office.ip,your.home.ip # Allow only your IPs
JWT_SECRET=your_128_character_super_secure_secret # 128 characters recommended
JWT_EXPIRE_HOURS=1 # Short expiration time
# Zoho configuration
ZOHO_CLIENT_ID=your_zoho_client_id
ZOHO_CLIENT_SECRET=your_zoho_client_secret
ZOHO_REFRESH_TOKEN=your_zoho_refresh_token
ZOHO_PORTAL_ID=your_portal_id
TARGET_PROJECT_ID=your_project_id
# Enhanced security
RATE_LIMIT_PER_MINUTE=20 # Strict rate limiting
๐ JWT Token Generation (For Production)
# Generate token for team member
python tools/generate_jwt_token.py generate --user "team_member_1" --expires-hours 24
# For temporary access
python tools/generate_jwt_token.py generate --user "temp_access" --expires-hours 1
# Token validation
python tools/generate_jwt_token.py validate "your_jwt_token_here"
Docker
# Build image
docker build -t zoho-mcp-server .
# Run container (with security configuration)
docker run -p 8000:8000 --env-file .env zoho-mcp-server
Environment-specific Configuration
Production (Security Enhanced)
- Use Render Starter plan or higher
- Configure Redis Add-on with authentication
- Set up monitoring and alerts
- Enable auto-scaling
- IP restrictions and JWT authentication required
Development
- Use local Redis instance
- Enable debug mode
- Use development Zoho credentials
- Local IP allowlist configuration
Monitoring
Health Checks
/health
endpoint for basic health status- Redis connectivity check
- Zoho API accessibility test
Metrics
- Request rate and response times
- Error rates by endpoint
- Token refresh frequency
- Cache hit rates
Logging
- Structured JSON logging
- Request/response correlation IDs
- Security event tracking
- Performance metrics
Security
Authentication Flow
- Client requests JWT token (external process)
- Include
Authorization: Bearer <token>
header - Server validates JWT signature and expiration
- IP address checked against allowlist
- Rate limiting applied per client
OAuth Token Management
- Automatic token refresh before expiration
- Secure storage in Redis with TTL
- Token revocation support
- Refresh token backup in secrets manager
๐ Troubleshooting
Common Issues
401 Unauthorized
- Check JWT token validity and expiration
- Verify JWT_SECRET matches token issuer
- Confirm IP address is in allowlist
429 Rate Limited
- Reduce request frequency
- Check rate limit headers
- Consider request batching
Zoho API Errors
- Verify OAuth scopes and permissions
- Check refresh token validity
- Monitor Zoho API rate limits
Redis Connection Issues
- Verify Redis URL and credentials
- Check network connectivity
- Monitor Redis memory usage
Debug Mode
Set DEBUG=true
in environment to enable:
- Detailed error messages
- API request/response logging
- Interactive API documentation at
/docs
Contributing
- Fork the repository
- Create a feature branch
- Make changes with tests
- Run quality checks
- Submit pull request
Development Workflow
- Follow conventional commit messages
- Maintain 90%+ test coverage
- Update documentation for API changes
- Security scan all dependencies
License
MIT License - see LICENSE file for details.
Support
- GitHub Issues for bug reports
- Documentation in
docs/
directory - API reference at
/docs
endpoint (debug mode)