danngalann/zoho-sprints-mcp
If you are the rightful owner of zoho-sprints-mcp and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.
An MCP server for Zoho Sprints that provides programmatic access to project management functionality.
Zoho Sprints MCP Server
An MCP (Model Context Protocol) server for Zoho Sprints that provides programmatic access to Zoho Sprints project management functionality. This server enables integration with tools like Claude for automating Zoho Sprints operations.
Features
The server exposes comprehensive tools for managing Zoho Sprints resources:
Projects
- List and fetch project details
- Create new projects
- Update project information
- Retrieve project backlogs
Sprints
- List sprints (upcoming, active, completed, canceled)
- Fetch sprint details
- Create new sprints
- Start, complete, cancel, and reopen sprints
- Manage sprint users
- Update sprint information
Items & Subitems
- Fetch items within sprints
- Create new items and subitems
- Update item details (status, priority, assignee, etc.)
- Move items between sprints/backlogs
- View item activity and comments
- Link items and manage item relationships
Epics
- List and fetch epic details
- Create new epics
- Update epic information
- Associate items with epics
- Move items between epics
Releases
- Manage releases and release cycles
- Create and update releases
- Link items to releases
- Manage release stages
Users & Teams
- Fetch workspace information
- Get workspace settings
- Manage project users
- Add users to sprints
Installation
Prerequisites
- Python 3.12+
- Zoho Sprints account with API access
- Zoho OAuth credentials
Setup
- Clone or create the project:
cd /path/to/zoho_mcp
- Install dependencies:
pip install -e .
- Configure OAuth credentials:
First, get your initial refresh token by running:
python get_refresh_token.py
This script will guide you through the OAuth flow to obtain your refresh token. Follow these steps:
-
Fill in your
CLIENT_ID,CLIENT_SECRET, andREDIRECT_URIfrom your Zoho Developer Console -
Run the script and click the generated authorization URL
-
Accept the permissions in your browser
-
Copy the authorization code from the redirected URL
-
Paste it back into the script
-
Save the refresh token that's displayed
-
Create a
.envfile in the project root with your credentials:
ZOHO_CLIENT_ID=your_client_id_here
ZOHO_CLIENT_SECRET=your_client_secret_here
ZOHO_REDIRECT_URI=your_redirect_uri_here
ZOHO_REFRESH_TOKEN=your_refresh_token_here
ZOHO_API_DOMAIN=https://sprintsapi.zoho.eu
ZOHO_ACCOUNTS_URL=https://accounts.zoho.eu
ZOHO_TEAM_ID=your_team_id_here
Running the Server
Start the MCP server:
python server.py
The server will run on the default HTTP transport and be ready to accept MCP protocol requests.
Architecture
Core Components
server.py- Entry point that initializes and runs the MCP servermcp_instance.py- Configures the MCP instancesettings.py- Manages environment configuration via Pydanticzoho_api/- Main API client modulesbase_client.py- Base HTTP client with OAuth token management and automatic refreshprojects.py- Project management toolssprints.py- Sprint management toolsitems.py- Work item management toolsepics.py- Epic management toolsreleases.py- Release management toolsusers.py- User and team management toolsworkspaces.py- Workspace configuration toolsresponses/- Pydantic response models
Authentication
The client uses OAuth 2.0 with automatic token refresh:
- Tokens are refreshed automatically when expired
- A 5-minute buffer is maintained before expiration to prevent request failures
- Failed authentication (401) triggers a single automatic retry with token refresh
API Scopes
The following Zoho Sprints API scopes are required for full functionality:
ZohoSprints.projects.READ- Read project informationZohoSprints.projects.CREATE- Create new projectsZohoSprints.projects.UPDATE- Update project detailsZohoSprints.projects.DELETE- Delete projectsZohoSprints.sprints.READ- Read sprint informationZohoSprints.sprints.CREATE- Create new sprintsZohoSprints.sprints.UPDATE- Update sprint detailsZohoSprints.sprints.DELETE- Delete sprintsZohoSprints.items.READ- Read work itemsZohoSprints.items.CREATE- Create new itemsZohoSprints.items.UPDATE- Update item detailsZohoSprints.items.DELETE- Delete itemsZohoSprints.epic.READ- Read epic informationZohoSprints.epic.CREATE- Create new epicsZohoSprints.epic.UPDATE- Update epic detailsZohoSprints.epic.DELETE- Delete epicsZohoSprints.release.READ- Read release informationZohoSprints.release.CREATE- Create new releasesZohoSprints.release.UPDATE- Update release detailsZohoSprints.release.DELETE- Delete releasesZohoSprints.projectusers.READ- Read project usersZohoSprints.projectusers.CREATE- Add project usersZohoSprints.projectusers.DELETE- Remove project usersZohoSprints.teams.READ- Read workspace/team information
Environment Variables
| Variable | Required | Default | Description |
|---|---|---|---|
ZOHO_CLIENT_ID | Yes | - | OAuth client ID from Zoho Developer Console |
ZOHO_CLIENT_SECRET | Yes | - | OAuth client secret from Zoho Developer Console |
ZOHO_REDIRECT_URI | Yes | - | OAuth redirect URI (must match Zoho console) |
ZOHO_REFRESH_TOKEN | Yes | - | OAuth refresh token (obtained from setup script) |
ZOHO_API_DOMAIN | No | https://sprintsapi.zoho.eu | Zoho Sprints API endpoint |
ZOHO_ACCOUNTS_URL | No | https://accounts.zoho.eu | Zoho OAuth accounts endpoint |
ZOHO_TEAM_ID | No | - | Default workspace/team ID (optional) |
Troubleshooting
Authentication Issues
- Ensure your OAuth credentials are correct and in the
.envfile - Verify the refresh token hasn't been revoked in your Zoho account settings
- Check that the redirect URI matches exactly what's configured in your Zoho Developer Console
API Errors
- Check that your account has the necessary API scopes enabled
- Ensure the
ZOHO_TEAM_IDis correct if using a non-default workspace - Verify that resource IDs (project_id, sprint_id, etc.) are valid
Token Expiration
- The client handles token refresh automatically, but ensure your refresh token is valid
- If you see persistent 401 errors, regenerate your refresh token using
get_refresh_token.py