A Model Context Protocol (MCP) server that provides integration with Zoho Projects API. This server enables AI assistants to interact with Zoho Projects for managing projects, tasks, issues, milestones, and more.
-
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
- Create tasks
- Update tasks
- Delete tasks
-
Issue Management
- List issues (portal or project level)
- Get issue details
- Create issues
- Update issues
-
Phase/Milestone Management
- List phases
- Create phases
-
Search
- Search across portal or project
- Filter by module (projects, tasks, issues, milestones, forums, events)
-
User Management
- List users in portal or project
- Node.js (v18 or higher)
- Zoho Projects Account with API access
- Zoho OAuth Credentials
- 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 testing - Authorized 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!)
- Client ID (e.g.,
-
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:
com - EU:
eu - IN:
in - AU:
com.au - CN:
com.cn
- US:
-
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.in -
Copy the
codevalue (valid for ~2 minutes, use it immediately!)
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
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.
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
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
Prerequisites:
- Node.js (v18 or higher)
Steps:
- Clone and install:
git clone <repository-url>
cd zoho-mcp
npm install
npm run build-
Create
.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:httpCreate 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.com - EU:
projectsapi.zoho.eu/accounts.zoho.eu - IN:
projectsapi.zoho.in/accounts.zoho.in - AU:
projectsapi.zoho.com.au/accounts.zoho.com.au - CN:
projectsapi.zoho.com.cn/accounts.zoho.com.cn
Add to your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"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"
}
}
}
}Once configured, you can use Claude to interact with Zoho Projects:
Can you list all my Zoho Projects?
Create a new project called "Website Redesign" with description "Redesign company website" starting on 2025-01-15 and ending on 2025-03-31
Show me all tasks in project ID 1234567890
Create a high priority task called "Design homepage mockup" in project 1234567890, due on 2025-02-15
Search for "bug fix" in all modules
Show me all issues in project 1234567890
zoho-projects-mcp-server/
├── src/
│ └── index.ts # Main server implementation
├── dist/ # Compiled JavaScript (generated)
├── package.json
├── tsconfig.json
└── README.md
The server provides the following MCP tools:
list_portals- Get all portalsget_portal- Get portal detailslist_projects- List all projectsget_project- Get project detailscreate_project- Create a new projectupdate_project- Update a projectdelete_project- Delete a projectlist_tasks- List tasksget_task- Get task detailscreate_task- Create a taskupdate_task- Update a taskdelete_task- Delete a tasklist_issues- List issuesget_issue- Get issue detailscreate_issue- Create an issueupdate_issue- Update an issuelist_phases- List phases/milestonescreate_phase- Create a phasesearch- Search portal or projectlist_users- List users
- Ensure your access token is valid and not expired
- Verify the token has the required scopes
- Check that the portal ID is correct
- 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
- Restart Claude Desktop after configuration changes
- Check the Claude Desktop logs for error messages
- Verify the server path in the configuration
Access tokens expire after 1 hour (3600 seconds). This MCP server automatically refreshes tokens using the refresh token.
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
}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.
For detailed API documentation, visit: https://projects.zoho.com/api-docs
MIT
Contributions are welcome! Please feel free to submit issues or pull requests.
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