site24x7-code-mode-mcp
site24x7-code-mode-mcp
Status: public beta (
v0.1.0-beta.1). Verification status is tracked below.
A Model Context Protocol server for the Zoho Site24x7 REST API, built on the code-mode pattern: instead of mapping each of the hundreds of Site24x7 endpoints to its own MCP tool, this server exposes exactly two tools (site24x7_search and site24x7_execute) and a JavaScript sandbox where the LLM writes real code against a flat site24x7.* surface.
This is the same architecture used by the sibling repos:
make-code-mode-mcp— Make.com Web API v2unraid-code-mode-mcp— Unraid 7.2+ GraphQL APIunifi-code-mode-mcp— UniFi Network + Site Manager APIsfortimanager-code-mode-mcp— FortiManager JSON-RPC
What's different about Site24x7:
Zoho OAuth 2.0 with a permanent refresh token (Self Client flow). New auth pattern for this family.
MSP / Business Unit tenancy — a second axis of tenancy inside a single OAuth identity, expressed as
Cookie: zaaid=<customer_id>. First-class in this server, not bolted on.No public OpenAPI spec. We scrape the official REST reference into a bundled JSON spec at build time.
Quickstart
git clone https://github.com/jmpijll/site24x7-code-mode-mcp
cd site24x7-code-mode-mcp
npm install --legacy-peer-deps
cp .env.example .env
# Fill in SITE24X7_CLIENT_ID / SECRET / REFRESH_TOKEN / ZONE — see "Authentication" below.
npm run build
node dist/index.js # stdio mode (default)
# or, for multi-tenant HTTP mode:
MCP_TRANSPORT=http MCP_HTTP_PORT=8000 node dist/index.jsThen wire it into your MCP client:
Cursor — uses
.cursor/mcp.jsonshipped in this repo.opencode — uses
opencode.jsonshipped in this repo.Claude Code / Claude Desktop / Codex / Continue / Cline / Zed / MCP Inspector — see
docs/usage.md.
Authentication
Site24x7 reuses Zoho's accounts service for OAuth 2.0. The only practical long-lived option for a local MCP is the Self Client → refresh token flow.
Why this flow (and not the others)
Flow | Why we don't use it |
Web-server authorization-code | Needs a callback URL — impossible for a local MCP. |
Access-token only | Expires every hour — terrible UX. |
Legacy | Deprecated by Zoho for new integrations. |
Self Client refresh-token | What we use. One-time setup, permanent refresh token, automatic per-tenant access-token rotation. |
One-time setup (5 minutes)
Open the Zoho API console for your data center:
Zone
Console URL
US (
com)EU (
eu)India (
in)Australia (
com.au)China (
cn)Japan (
jp)Canada (
ca)UK (
uk)UAE (
ae)Saudi Arabia (
sa)Click Add Client → Self Client → Create. Note the Client ID and Client Secret.
Go to the Generate Code tab on the same Self Client and fill in:
Scope: the scopes you want available to the MCP, comma-separated. Pick from the table below. For a typical "full admin + MSP" deployment:
Site24x7.Admin.All,Site24x7.Account.All,Site24x7.Reports.All,Site24x7.Operations.All,Site24x7.Msp.All,Site24x7.Bu.AllDescription: anything (
"site24x7 code-mode mcp"works).Time Duration: 10 Minutes (the maximum; you only need a minute or two).
Click Create. Copy the displayed code (the grant token).
Exchange the grant token for a refresh token using
curl(run within 10 minutes of step 3):curl -X POST 'https://accounts.zoho.com/oauth/v2/token' \ -d "client_id=$CLIENT_ID" \ -d "client_secret=$CLIENT_SECRET" \ -d "code=$GRANT_CODE" \ -d "grant_type=authorization_code"Replace
accounts.zoho.comwith the accounts host for your zone (accounts.zoho.eu,accounts.zoho.in, etc.). The response includes:{ "access_token": "1000.xxx", "refresh_token": "1000.yyy", "expires_in": 3600, "token_type": "Bearer" }Keep the
refresh_token— it's permanent. Theaccess_tokenis throwaway; the MCP server will mint fresh ones automatically.Drop the values into
.env:SITE24X7_CLIENT_ID=1000.xxx SITE24X7_CLIENT_SECRET=xxx SITE24X7_REFRESH_TOKEN=1000.yyy SITE24X7_ZONE=com
Scopes reference
Scope family | What it grants | Levels |
| Users, license, account-wide data |
|
| Monitors, profiles, third-party integrations |
|
| Reports and monitor status |
|
| IT Automation, maintenance, status pages |
|
| MSP-level operations |
|
| Business-Unit-level operations |
|
Pick the narrowest set of scopes that covers your intended use. The MCP server tells the LLM, per operation, which scope it needs — so a scope-aware 403 always has actionable context.
Revoking a refresh token
curl -X POST 'https://accounts.zoho.com/oauth/v2/token/revoke?token=YOUR_REFRESH_TOKEN'Or via the Zoho web UI: https://accounts.zoho.com/u/h#sessions/refreshtokens.
MSP and Business Units
If your Zoho identity is an MSP user (or a BU portal user), one Self Client / refresh token lets you operate against any customer / BU under your portal — but you must tell each API call which customer to act on via Cookie: zaaid=<customer_zaaid>. This server makes that ergonomic.
Finding your customers' zaaid values
In the sandbox:
site24x7.listCustomers();This returns [{ name, zaaid, ... }] from /api/short/msp/customers (or /api/short/bu/business_units if SITE24X7_ACCOUNT_TYPE=bu).
Running against a single customer
site24x7.withCustomer('658123456', function (s) {
return s.monitors.list();
});withCustomer re-injects the cookie for every call inside the closure. Outside the closure, the active zaaid reverts to whatever was in scope when you entered.
Fanning out
var customers = site24x7.listCustomers();
var summary = [];
for (var i = 0; i < customers.length; i++) {
var c = customers[i];
var status = site24x7.withCustomer(c.zaaid, function (api) {
return api.request({ method: 'GET', path: '/api/current_status' });
});
summary.push({
name: c.name,
zaaid: c.zaaid,
down: (status && status.monitors_status && status.monitors_status.down) || 0,
});
}
summary;Multi-tenant HTTP mode
When the server runs with MCP_TRANSPORT=http, each request can override the active customer via the X-Site24x7-Zaaid header. The full multi-tenant contract:
Header | Required | Notes |
| yes | Zoho Self Client client ID |
| yes | Zoho Self Client client secret |
| yes | Permanent refresh token |
| yes | One of |
| no | Default |
| no |
|
See docs/multi-tenant.md for the full architecture.
Data centers
The server speaks to two hosts per zone — Zoho accounts (for OAuth) and Site24x7 (for API calls). Both are routed automatically from SITE24X7_ZONE.
Zone ( | Zoho accounts | Site24x7 API |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The sandbox surface
See SKILL.md for the operating manual aimed at the model
writing the JavaScript. TL;DR:
site24x7.request({ method, path, query?, body?, version?, zaaid? })
site24x7.<tag>.<op>(args) // typed accessor
site24x7.callOperation('opId', args) // flat lookup
site24x7.listCustomers() // MSP/BU enumeration
site24x7.withCustomer(zaaid, fn) // scoped customer override (sync)
site24x7.zaaid // active zaaid (or undefined)Configuration
All variables are documented in .env.example. Highlights:
Variable | Default | Notes |
|
|
|
|
| HTTP port (only if |
|
| Comma-separated origin allowlist |
| — | Zoho Self Client credentials |
|
| Data center (see table above) |
| — | (Optional) default MSP/BU customer scope |
|
|
|
|
| Per-execute API call budget |
|
| Wall-clock deadline (ms) |
|
| On-disk cache root |
Project status
This is v0.1.0-beta.1. Honest verification surface:
Surface | Verified |
Unit tests (Vitest, in-process) | ✅ |
Integration tests ( | ✅ |
MCP Inspector CLI smoke ( | ✅ |
Live read-only sweep against a real Site24x7 tenant | ⏳ pending credentials |
Live MSP customer round-trip via | ⏳ pending credentials |
OpenCode end-to-end LLM round-trip | ⏳ pending credentials |
Cursor / Claude Code / Claude Desktop / Continue / Cline / Aider / Zed | ⏳ |
Mutating live operations | ⛔ deliberately not run until you give us a lab tenant |
Other zones beyond the one your refresh token lives in | ⏳ |
Cloudflare Workers full transport | ⛔ 501 scaffold only (parity with sibling repos) |
Long-running soak / stability | ⏳ |
This table updates honestly as we verify more — if a row is not ticked here, we haven't tested it. Verification reports are welcome (see CONTRIBUTING.md).
Docs
AGENTS.md— contributor guide and architectural invariantsSKILL.md— operating manual for the MCP client / LLMdocs/architecture.md— the code-mode pattern and how this server implements itdocs/multi-tenant.md— env vs headers vswithCustomer, including MSP/BUdocs/security.md— threat model, credential handling, sandbox boundarydocs/usage.md— every supported MCP client and how to wire it indocs/opencode-skill.md— opencode-specific install + recipesdocs/cursor-skill.md— Cursor-specific install + recipesexamples/site24x7-expert-agent/— drop-in Site24x7-expert persona for any agent platform
License
MIT.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jmpijll/site24x7-code-mode-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server