Zoho Projects MCP Server
Provides tools for interacting with Zoho Projects API, enabling management of projects, tasks, issues, milestones, comments, attachments, and more.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Zoho Projects MCP Server list my tasks in the current project"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Zoho Projects MCP Server
An enhanced Model Context Protocol (MCP) server for Zoho Projects API integration. This server enables AI assistants to interact with Zoho Projects for managing projects, tasks, issues, milestones, comments, attachments, and more.
Note: This is an enhanced fork with additional features for task lookup by prefix, tasklist management, comments, attachments, and inline image handling. Based on qpiai/zoho-projects-mcp.
Features
Supported Operations
Portal Management
List all portals
Get portal details
Project Management
List projects
Get project details
Create new projects
Update existing projects
Delete projects (move to trash)
Task Management
List tasks (portal or project level)
Get task details
Find task by prefix/key (e.g.,
CA6-T282) ⭐Create tasks
Update tasks (with status and tasklist support)
Delete tasks
Tasklist Management ⭐
Create tasklists
Move tasks between tasklists
Delete tasklists
Task Comments ⭐
List comments on a task
Add comments to tasks
Edit existing comments
Task Attachments ⭐
Upload file attachments to tasks
List task attachments
Download inline images from task descriptions
Extract image URLs from HTML descriptions
Issue Management
List issues (portal or project level)
Get issue details
Create issues
Update issues
Phase/Milestone Management
List phases
Create phases
Task Statuses ⭐
List available statuses for a project
Search
Search across portal or project
Filter by module (projects, tasks, issues, milestones, forums, events)
User Management
List users in portal or project
Additional Enhancements ⭐
Automatic OAuth token refresh - No more manual token management
Empty response handling - Properly handles 204 No Content responses
API parameter mapping - Correct handling of status_id and tasklist_id
Related MCP server: Todoist MCP Server
Prerequisites
Node.js (v18 or higher)
Zoho Projects Account with API access
Zoho OAuth Credentials
Setup
1. Get Zoho OAuth Credentials (Detailed Guide)
Step 1: Create a Zoho Developer Application
Go to Zoho API Console
Click "Add Client" button
Choose "Self Client" (recommended for personal use) or "Server-based Applications"
Fill in the application details:
Client Name: e.g., "Zoho Projects MCP"
Homepage URL: Your website or
http://localhostfor testingAuthorized Redirect URIs:
http://localhost:8080/callback(or your preferred redirect URL)
Click "Create" and note down:
Client ID (e.g.,
1000.XXXXXXXXXX)Client Secret (keep this secure!)
Step 2: Generate Authorization Code
Build the authorization URL with required scopes:
https://accounts.zoho.{REGION}/oauth/v2/auth? scope=ZohoProjects.portals.ALL,ZohoProjects.projects.ALL,ZohoProjects.tasks.ALL,ZohoProjects.bugs.ALL,ZohoProjects.milestones.ALL,ZohoProjects.users.READ,ZohoSearch.securesearch.READ &client_id=YOUR_CLIENT_ID &response_type=code &access_type=offline &redirect_uri=YOUR_REDIRECT_URIReplace
{REGION}with your region:US:
comEU:
euIN:
inAU:
com.auCN:
com.cn
Open this URL in your browser
Log in to your Zoho account and authorize the application
You'll be redirected to your redirect URI with a code parameter in the URL:
http://localhost:8080/callback?code=1000.XXXXX.XXXXX&location=in&accounts-server=https://accounts.zoho.inCopy the
codevalue (valid for ~2 minutes, use it immediately!)
Step 3: Exchange Code for Tokens
Use this curl command to get your access and refresh tokens:
curl -X POST https://accounts.zoho.{REGION}/oauth/v2/token \
-d "code=YOUR_AUTHORIZATION_CODE" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "redirect_uri=YOUR_REDIRECT_URI" \
-d "grant_type=authorization_code"Response will contain:
{
"access_token": "1000.xxxx.yyyy",
"refresh_token": "1000.zzzz.aaaa",
"expires_in": 3600,
"api_domain": "https://www.zohoapis.in",
"token_type": "Bearer"
}Important: Save both tokens:
access_token: Valid for 1 hour (auto-refreshed by the server)
refresh_token: Long-lived, used to get new access tokens
Step 4: Find Your Portal ID
Method 1: From URL
Go to your Zoho Projects in browser
Look at the URL:
https://projects.zoho.{REGION}/portal/{PORTAL_ID}/...The number after
/portal/is your Portal ID (e.g.,60028147039)
Method 2: Using API
curl -X GET https://projectsapi.zoho.{REGION}/api/v3/portals \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN"Response will list all your portals with their IDs.
Step 5: Verify Credentials
Test your setup with this API call:
curl -X GET https://projectsapi.zoho.{REGION}/api/v3/portal/YOUR_PORTAL_ID/projects \
-H "Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN"Expected: JSON response with your projects list If error: Check token, portal ID, and API domain match your region
Required Scopes Summary
Make sure your OAuth token has these scopes:
✅
ZohoProjects.portals.ALL- Portal operations✅
ZohoProjects.projects.ALL- Project management✅
ZohoProjects.tasks.ALL- Task management✅
ZohoProjects.bugs.ALL- Issue/bug management✅
ZohoProjects.milestones.ALL- Milestone/phase management✅
ZohoProjects.users.READ- User information✅
ZohoSearch.securesearch.READ- Search functionality
2. Setup and Installation
Node.js Setup
Prerequisites:
Node.js (v18 or higher)
Steps:
Clone and install:
git clone <repository-url>
cd zoho-mcp
npm install
npm run buildCreate
.envfile with your credentials (see Configuration section below)Run the server:
# Stdio server (for local MCP clients)
npm start
# HTTP server (for remote access)
npm run start:http3. Configuration
Create a .env file in the project root with the following variables:
# OAuth credentials (required)
ZOHO_ACCESS_TOKEN=your_access_token_here
ZOHO_REFRESH_TOKEN=your_refresh_token_here
ZOHO_CLIENT_ID=your_client_id_here
ZOHO_CLIENT_SECRET=your_client_secret_here
# Portal configuration (required)
ZOHO_PORTAL_ID=your_portal_id_here
# API domain (optional, choose based on your region)
ZOHO_API_DOMAIN=https://projectsapi.zoho.com
ZOHO_ACCOUNTS_DOMAIN=https://accounts.zoho.com
# HTTP Server configuration (optional, for remote access)
HTTP_PORT=3001
ALLOWED_ORIGINS=http://localhost:3000
ALLOWED_HOSTS=127.0.0.1,localhostRegion-specific domains:
US:
projectsapi.zoho.com/accounts.zoho.comEU:
projectsapi.zoho.eu/accounts.zoho.euIN:
projectsapi.zoho.in/accounts.zoho.inAU:
projectsapi.zoho.com.au/accounts.zoho.com.auCN:
projectsapi.zoho.com.cn/accounts.zoho.com.cn
4. Configure Claude Desktop
Add to your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
For Node.js Setup:
{
"mcpServers": {
"zoho-projects": {
"command": "node",
"args": ["/absolute/path/to/zoho-mcp/dist/index.js"],
"env": {
"ZOHO_ACCESS_TOKEN": "your_access_token_here",
"ZOHO_REFRESH_TOKEN": "your_refresh_token_here",
"ZOHO_CLIENT_ID": "your_client_id_here",
"ZOHO_CLIENT_SECRET": "your_client_secret_here",
"ZOHO_PORTAL_ID": "your_portal_id_here",
"ZOHO_API_DOMAIN": "https://projectsapi.zoho.in",
"ZOHO_ACCOUNTS_DOMAIN": "https://accounts.zoho.in"
}
}
}
}Usage Examples
Once configured, you can use Claude to interact with Zoho Projects:
List Projects
Can you list all my Zoho Projects?Create a New Project
Create a new project called "Website Redesign" with description "Redesign company website" starting on 2025-01-15 and ending on 2025-03-31List Tasks
Show me all tasks in project ID 1234567890Create a Task
Create a high priority task called "Design homepage mockup" in project 1234567890, due on 2025-02-15Search
Search for "bug fix" in all modulesList Issues
Show me all issues in project 1234567890Find Task by Prefix ⭐
Get the task CA6-T282Add a Comment to a Task ⭐
Add a comment "Work in progress - will complete by EOD" to task 12345 in project 1234567890Upload an Attachment ⭐
Upload /path/to/screenshot.png to task 12345 in project 1234567890Move Task to Different Tasklist ⭐
Move task 12345 to tasklist 67890 in project 1234567890Download Task Images ⭐
Download all images from task CA6-T282 to /tmp/task-images/Project Structure
zoho-projects-mcp/
├── src/
│ └── index.ts # Main server implementation
├── dist/ # Compiled JavaScript (generated)
├── package.json
├── tsconfig.json
├── FORMATTING.md # Guide for Zoho HTML formatting
├── CLAUDE.md # Instructions for Claude Code
└── README.mdAvailable Tools
The server provides the following MCP tools:
Portal & Project
Tool | Description |
| Get all portals |
| Get portal details |
| List all projects |
| Get project details |
| Create a new project |
| Update a project |
| Delete a project (move to trash) |
Tasks
Tool | Description |
| List tasks (portal or project level) |
| Get task details by ID |
| Find task by prefix (e.g., |
| Create a task |
| Update a task (supports |
| Delete a task |
Tasklists ⭐
Tool | Description |
| Create a new tasklist in a project |
| Move a task to a different tasklist |
| Delete a tasklist |
Comments ⭐
Tool | Description |
| List comments on a task |
| Add a comment to a task |
| Edit an existing comment |
Attachments & Images ⭐
Tool | Description |
| Upload a file attachment to a task |
| List attachments on a task |
| Download an inline image from task description |
| Extract image URLs from HTML |
| Download all images from a task description |
Issues
Tool | Description |
| List issues (portal or project level) |
| Get issue details |
| Create an issue |
| Update an issue |
Phases & Other
Tool | Description |
| List phases/milestones |
| Create a phase |
| List available task statuses for a project ⭐ |
| Search portal or project |
| List users in portal or project |
Troubleshooting
Authentication Issues
Ensure your access token is valid and not expired
Verify the token has the required scopes
Check that the portal ID is correct
API Errors
Check the Zoho API documentation for rate limits
Ensure you're using the correct API domain for your region
Verify that the user has appropriate permissions
Connection Issues
Restart Claude Desktop after configuration changes
Check the Claude Desktop logs for error messages
Verify the server path in the configuration
OAuth Token Management
Token Expiration
Access tokens expire after 1 hour (3600 seconds). This MCP server automatically refreshes tokens using the refresh token.
Manual Token Refresh
If you need to manually refresh your access token:
# For India region (accounts.zoho.in)
curl -X POST https://accounts.zoho.in/oauth/v2/token \
-d "refresh_token=YOUR_REFRESH_TOKEN" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "grant_type=refresh_token"
# For other regions, use the appropriate accounts domain:
# US: https://accounts.zoho.com/oauth/v2/token
# EU: https://accounts.zoho.eu/oauth/v2/token
# AU: https://accounts.zoho.com.au/oauth/v2/token
# CN: https://accounts.zoho.com.cn/oauth/v2/tokenResponse example:
{
"access_token": "1000.xxx.yyy",
"scope": "ZohoProjects.portals.ALL ZohoProjects.projects.ALL...",
"api_domain": "https://www.zohoapis.in",
"token_type": "Bearer",
"expires_in": 3600
}Automatic Token Refresh
The MCP server automatically handles token refresh. Configure the following environment variables:
ZOHO_REFRESH_TOKEN=your_refresh_token_here
ZOHO_CLIENT_ID=your_client_id_here
ZOHO_CLIENT_SECRET=your_client_secret_here
ZOHO_ACCOUNTS_DOMAIN=https://accounts.zoho.in # Match your regionThe server will automatically refresh the access token before it expires.
API Reference
For detailed API documentation, visit: https://projects.zoho.com/api-docs
License
MIT
Contributing
Contributions are welcome! Please feel free to submit issues or pull requests.
Support
For issues related to:
MCP Server: Open an issue in this repository
Zoho Projects API: Contact Zoho support or check their documentation
Claude Desktop: Check Anthropic's documentation
Available Tools
39 toolsadd_task_commentB
Add a comment to a task
Inputs: content (required), task_id (required), project_id (required).
create_issueD
Create a new issue
Inputs: title (required), project_id (required), due_date, severity, +1 more.
create_phaseB
Create a new phase/milestone
Inputs: name (required), project_id (required), end_date, owner_zuid, +1 more.
create_projectC
Create a new project
Inputs: name (required), end_date, is_public, start_date, +1 more.
create_taskB
Create a new task in a project
Inputs: name (required), project_id (required), duration, end_date, +5 more.
create_tasklistB
Create a new tasklist in a project
Inputs: name (required), project_id (required), flag, milestone_id.
delete_phaseB
Delete a phase/milestone from a project
Inputs: phase_id (required), project_id (required).
delete_projectA
Delete a project (moves to trash)
Inputs: project_id (required).
delete_taskB
Delete a task
Inputs: task_id (required), project_id (required).
delete_task_attachmentA
Delete an attachment from a task. For WorkDrive attachments, use the third_party_file_id as the attachment_id.
Inputs: task_id (required), project_id (required), attachment_id (required).
delete_task_commentB
Delete a comment from a task
Inputs: task_id (required), comment_id (required), project_id (required).
delete_tasklistB
Delete a tasklist from a project
Inputs: project_id (required), tasklist_id (required).
download_inline_imageA
Download an inline image from a Zoho task description URL to a local file. Use this to download screenshots/images embedded in task descriptions.
Inputs: image_url (required), output_path (required).
download_task_imagesA
Download all inline images from a task description to a local directory. Returns the mapping of original URLs to local file paths.
Inputs: task_id (required), output_dir (required), project_id (required).
edit_task_commentB
Edit an existing comment on a task
Inputs: content (required), task_id (required), comment_id (required), project_id (required).
export_projectA
Export an entire Zoho project to a local directory. Creates a portable export with project.json containing all data and an images/ folder with downloaded attachments. Use this for importing projects into other systems.
Inputs: output_dir (required), project_id (required), include_images.
extract_inline_imagesA
Extract all inline image URLs from a task description HTML. Returns a list of Zoho image URLs that can be downloaded.
Inputs: html (required).
get_issueB
Get details of a specific issue
Inputs: issue_id (required), project_id (required).
get_portalB
Get details of a specific portal
Inputs: portal_id (required).
get_projectA
Get details of a specific project
Inputs: project_id (required).
get_taskC
Get details of a specific task
Inputs: task_id (required), project_id (required).
get_task_by_prefixA
Find and get a task by its prefix/key (e.g., 'CA6-T282'). Searches through tasks to find a match.
Inputs: prefix (required), project_id.
list_issuesB
List issues from a project or portal
Inputs: page, per_page, project_id.
list_phasesB
List phases/milestones from a project
Inputs: project_id (required), page, per_page.
list_portalsA
Retrieve all Zoho Projects portals
Inputs: no named parameters.
list_projectsB
List all projects in a portal
Inputs: page, per_page.
list_statusesA
List available task statuses for a project
Inputs: project_id (required).
list_task_attachmentsB
List attachments on a task
Inputs: task_id (required), project_id (required).
list_task_commentsB
List comments on a task
Inputs: task_id (required), project_id (required), page, per_page.
list_tasksB
List tasks from a project or portal
Inputs: page, per_page, project_id.
list_usersA
List users in a portal or project
Inputs: project_id.
move_taskB
Move a task to a different tasklist
Inputs: task_id (required), project_id (required), tasklist_id (required).
restore_taskB
Restore a deleted task from trash
Inputs: task_id (required), project_id (required).
searchC
Search across portal or project
Inputs: search_term (required), page, module, per_page, +1 more.
update_issueD
Update an issue
Inputs: issue_id (required), project_id (required), title, severity, +1 more.
update_phaseA
Update a phase/milestone. IMPORTANT: start_date and end_date are required by the Zoho REST API for updates.
Inputs: phase_id (required), project_id (required), name, status, +3 more.
update_projectB
Update an existing project
Inputs: project_id (required), name, status, end_date, +2 more.
update_taskD
Update a task
Inputs: task_id (required), project_id (required), name, duration, +7 more.
upload_task_attachmentB
Upload a file attachment to a task
Inputs: task_id (required), file_path (required), project_id (required), file_name.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 39 tools
Each tool targets a distinct resource and action: portals, projects, tasks, issues, phases, comments, attachments, images, and export. Even the image-related tools are clearly separated by single vs. bulk extraction/download, and get_task_by_prefix has a unique purpose. No two tools appear to do the same thing.
The naming pattern is mostly verb_noun (list_projects, create_task, delete_phase) and very readable. Minor deviations exist: add_task_comment vs create_task, edit_task_comment vs update_task, and longer names like get_task_by_prefix, but these do not undermine the overall consistency.
39 tools is a heavy surface for an MCP server, even for a broad platform like Zoho Projects. The count feels excessive, with granular operations for images and attachments that could be consolidated. It exceeds the 25+ threshold for a 'too many' rating.
The tool set covers core CRUD for projects, tasks, issues, and phases, plus comments, attachments, search, and export. Notable gaps include missing delete_issue, no update for tasklists, and no way to list or manage issue comments, but these are workable and the main workflows are well supported.
Maintenance
Related MCP Connectors
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Zoho MCP allows you to create your own MCP server to perform complex actions in a host of Zoho applications and 500+ third-party services
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that integrates AI assistants with Zoho CRM, enabling contact and deal management operations through natural language.3MIT
- AlicenseBqualityDmaintenanceAn MCP server that integrates with the Todoist REST API v2 to enable AI assistants to manage tasks, projects, sections, comments, and labels. It supports comprehensive operations including batch task creation, history tracking for completed tasks, and organized project management.33358 npm1MIT
- AlicenseNot gradedqualityDmaintenanceA comprehensive MCP server for integrating with OpenProject API, enabling AI assistants to manage projects, work packages, time tracking, and users.3 npm2MIT
- AlicenseAqualityDmaintenanceMCP server for Zoho Books integration, enabling AI agents to perform bookkeeping operations like managing journals, expenses, bills, invoices, and file attachments.491MIT