Skip to main content
Glama
harsh-simform

custom-zoho-project-mcp-server

zoho-projects-axi

Read-only Zoho Projects for AI agents. Two front-ends share one command layer:

  • zoho-projects-axi, a command-line tool whose output is compact TOON text (--json gives JSON), built to cost an agent few tokens.

  • A six-tool MCP server (zoho-projects-axi mcp) that returns the same text, for MCP clients such as Claude Code and Claude Desktop.

It never creates or changes anything in Zoho: only GET requests (plus the OAuth token refresh) can leave the process.

Install it as a Claude Code plugin in two commands and sign in with your browser: see Install. Pick the skill + CLI plugin (cheapest on tokens) or the MCP plugin (native tools).

Version 0.2.0 is a breaking rewrite of the 0.1.x MCP server. See CHANGELOG.md.

Why

An agent that reads tickets pays for every character of tool output and for every tool schema loaded into every session. This project keeps both small and checks that in the test suite.

Numbers below are measured by this repository's own tests, on synthetic fixtures (see Known limitations). The estimator everywhere is a deterministic proxy, len(text) / 4 rounded up. It is not a tokenizer: it under-counts text dense in ids, digits and punctuation, so read the numbers as regression guards and relative sizes, not billing figures.

What

Measured (tokens)

Budget enforced

Source

Tool schemas, the 6 MCP tools together

651 (2,601 chars)

800

tests/test_mcp_server.py

Tool schemas, the 15 tools of 0.1.x (for comparison)

1,421 (5,686 chars)

none

recorded in tests/test_mcp_server.py

task default view (largest synthetic task: 6k-char description, 30 comments)

439

600

tests/test_cmd_task.py

task --comments (30 comments)

721

900

tests/test_cmd_task.py

bug default view (same shape)

334

500

tests/test_cmd_bug.py

bug --comments (30 comments)

617

900

tests/test_cmd_bug.py

tasks list, 20 rows

314

500

tests/test_cmd_fixtures.py

home / project overview

75 / 74

300 / 400

tests/test_cmd_fixtures.py

SessionStart hook output

83

150

tests/test_session_start.py

--help of one command (recorded for task: 180, bug: 166)

166 to 180

250 per command

tests/test_cmd_task.py, tests/test_cmd_bug.py

Run the suite to see every measured/allowed pair (venv/bin/python -m pytest tests -q prints a "token budgets" table). The estimator and its weakness are described in tests/README.md. The README does not claim anything about the size of 0.1.x tool output: only its tool schemas were measured.

How the savings are made: lean default views with explicit slices (--comments, --history, ...), long text cut with a size hint, a local response cache, resolve to turn free text into exact commands without a network call, and help[] lines that tell the agent the next command instead of making it guess.

Related MCP server: Zoho CRM Integration

Install

Pick one. Both need uv (brew install uv) and run zoho-projects-axi through it, so there is nothing else to install. Once you are signed in (below), Zoho opens in your browser once and you are done.

Option 1: skill + CLI (lightest on tokens)

/plugin marketplace add harsh-simform/zoho-projects-axi
/plugin install zoho-projects-axi-skill@zoho-projects-axi

Claude gets the zoho-projects-axi command on its Bash PATH, a skill that teaches it resolve and slices, and a SessionStart hook with a cache-only project snapshot (about 83 tokens). Nothing is loaded into the session until a Zoho question comes up. Tip: allow Bash(zoho-projects-axi:*) in your permissions to avoid prompts.

Option 2: MCP server (native tools, no Bash needed)

/plugin marketplace add harsh-simform/zoho-projects-axi
/plugin install zoho-projects-axi-mcp@zoho-projects-axi

Claude gets six tools (project, tasks, task, bug, people, resolve). Their schemas cost about 650 tokens in every session, but the tools show up natively, return images inline and work where there is no shell. Use this option for Claude Desktop-style clients; install only one of the two plugins.

Sign in

In either option run /zoho-projects-axi-skill:login (or /zoho-projects-axi-mcp:login), or in a terminal:

uvx --from git+https://github.com/harsh-simform/zoho-projects-axi zoho-projects-axi auth login

Zoho's consent page opens in your browser and the refresh token is saved for you. Read-only scopes only. If a build ships no Zoho client, zoho-projects-axi auth login-help shows the one-time registration (see Configure).

Without the plugins

Requires Python 3.10 or newer. Install from git as an isolated tool, which puts zoho-projects-axi (and the short alias zoho) on your PATH:

uv tool install git+https://github.com/harsh-simform/zoho-projects-axi

or

pipx install git+https://github.com/harsh-simform/zoho-projects-axi

Upgrade with uv tool upgrade zoho-projects-axi or pipx upgrade zoho-projects-axi. Check the install:

zoho-projects-axi --help
zoho-projects-axi auth status --offline

Renamed from zoho-axi

The project, command, package and plugins were all zoho-axi before. Still working, with a deprecation warning: the zoho-axi command, ZOHO_AXI_* environment variables and a config at ~/.config/zoho-axi/config.toml. Move the config to ~/.config/zoho-projects-axi/config.toml and rename the variables when convenient. An old SessionStart hook (zoho-axi session-start) is recognized by hooks uninstall; hooks install then replaces it.

Configure

All settings live in one TOML file, ~/.config/zoho-projects-axi/config.toml (or $XDG_CONFIG_HOME/zoho-projects-axi/config.toml). config.example.toml lists every setting, commented, with its default.

If your build ships a Zoho client (zoho-projects-axi auth login-help says so), skip to step 3: auth login needs no setup. Otherwise, or to use your own client:

  1. Register a client once at https://api-console.zoho.com (use .eu, .in, .com.au or .jp for your data center): add a Server-based Applications client with the Authorized Redirect URI http://localhost:8765/callback. zoho-projects-axi auth login-help prints these steps with your data center filled in.

  2. Put the client's id and secret in the config file and lock it down (the refresh token is added for you in step 3):

    mkdir -p ~/.config/zoho-projects-axi
    curl -sO https://raw.githubusercontent.com/harsh-simform/zoho-projects-axi/main/config.example.toml
    cp config.example.toml ~/.config/zoho-projects-axi/config.toml
    chmod 600 ~/.config/zoho-projects-axi/config.toml

    Edit client_id, client_secret, and dc if your account is not on com. Or skip the file and set ZOHO_PROJECTS_AXI_CLIENT_ID / ZOHO_PROJECTS_AXI_CLIENT_SECRET.

  3. Sign in:

    zoho-projects-axi auth login

    It opens Zoho's consent page in your browser (the URL is also printed, for --no-browser or a remote shell), catches the redirect on a one-shot listener bound to 127.0.0.1 (PKCE and a state check protect the code), and saves the refresh_token into the config file, keeping its comments and mode 600. Only read scopes are requested: ZohoProjects.{portals,projects,tasks,tasklists,milestones,bugs,users,tags,search}.READ. Use --port N if 8765 is taken (register http://localhost:N/callback too). If your account is in another data center, the sign-in finds it and saves dc for you.

    No browser (ssh, CI)? Create a Self Client in the same console instead, exchange its code once at https://accounts.zoho.<dc>/oauth/v2/token (grant_type=authorization_code, client_id, client_secret, code) and put the refresh_token in the config yourself. Treat it like a password.

  4. Check it, pick a default project and look around:

    zoho-projects-axi auth status
    zoho-projects-axi project list
    zoho-projects-axi project use "Demo Site"
    zoho-projects-axi
    zoho-projects-axi task PROJ1-T1000

    project use writes portal_id and project_id into the config file (the only thing the CLI ever writes there, preserving comments). You can also pass --project NAME or --project PORTAL:ID on any call.

Settings

Key

Default

Meaning

client_id, client_secret

none (required)

the client you registered in the Zoho API console

refresh_token

none (required)

written by zoho-projects-axi auth login (or a Self Client's token, by hand)

dc

com

Zoho data center: com, eu, in, com.au or jp. An allowlist, because it is placed in the hostnames that receive your credentials

portal_id, project_id

none

default project (set by project use)

max_images

5

images per --images call; 0 disables

max_attachment_bytes

8388608

skip any single image bigger than this

ttl_long_seconds

86400

cache lifetime of portals, projects, users, tags, tasklists, milestones

ttl_task_seconds

300

cache lifetime of tasks, bugs, search

ttl_comment_seconds

120

cache lifetime of comments, attachments, status history

log_level, log_file

INFO, none

MCP server logging (stderr, secrets redacted, optional file)

Precedence, highest first: command-line flags, ZOHO_PROJECTS_AXI_<KEY> environment variables (for example ZOHO_PROJECTS_AXI_DC), the config file, then the deprecated legacy sources and defaults. zoho-projects-axi auth status --offline shows where each setting came from without printing secrets.

Deprecated legacy sources. The 0.1.x environment variables (ZOHO_CLIENT_ID, ZOHO_CLIENT_SECRET, ZOHO_REFRESH_TOKEN, ZOHO_PORTAL_ID, ZOHO_PROJECT_ID, ZOHO_DC, ZOHO_MCP_*) and a repo-root .env file are still read as a last-resort fallback, with a warning on every command. Move them into the config file.

CLI quick reference

Output is TOON by default; add --json for JSON. Every answer ends with a help[] block of the next commands worth running. Unknown flags fail with exit code 2 and a "did you mean" hint, and nothing ever prompts. Run zoho-projects-axi <command> --help for flags and examples (this table is checked against the command registry by the tests).

Command

What it does

zoho-projects-axi / zoho-projects-axi home

live overview of the default project

zoho-projects-axi project

project overview: status, owner, next milestone, counts (--lists adds tasklists and milestones)

zoho-projects-axi project list

projects of the portal (id, name, status)

zoho-projects-axi project use <name or id>

make a project the default (writes the config file)

zoho-projects-axi people

portal users and tags (--users, --tags, --limit N)

zoho-projects-axi tasks

task list with totals by status (--tasklist, --milestone, --status, --owner, --limit, --page)

zoho-projects-axi task <KEY or id>

one task; slices --comments, --history, --subtasks, --attachments, --images

zoho-projects-axi bug <KEY or id>

one bug; slices --comments, --attachments, --images, --task (linked task)

zoho-projects-axi resolve <text or ->

find task/bug keys, ids and Zoho links in free text, offline; --check confirms them

zoho-projects-axi auth status

config and credential check, verifies the token with Zoho (--offline skips the network)

zoho-projects-axi auth login

sign in with your browser (OAuth); saves the refresh token to the config file (--port N, --no-browser)

zoho-projects-axi auth login-help

the one-time client registration steps and where the values go

zoho-projects-axi cache status

cache size, entry counts, oldest entry

zoho-projects-axi cache clear

delete the cache (needs --yes)

zoho-projects-axi hooks install / zoho-projects-axi hooks uninstall

add or remove the Claude Code SessionStart hook

zoho-projects-axi skill install

install the Claude Code skill

zoho-projects-axi session-start

the hook entrypoint (plain output, always exit 0)

zoho-projects-axi mcp

run the MCP server over stdio

Global flags, accepted before or after the command: --project P (PROJECT or PORTAL:PROJECT), --fresh (bypass the cache), --json, --full (every field, no truncation) and --debug (prints the Zoho request count to stderr).

Examples:

zoho-projects-axi tasks --status open --owner asha --limit 10
zoho-projects-axi task PROJ1-T1000 --comments --history
zoho-projects-axi bug PROJ1-I12 --comments --images
zoho-projects-axi task PROJ1-T1000 --json
zoho-projects-axi resolve "why does PROJ1-T123 loop? see AD1-I45"
zoho-projects-axi project --project "Demo Site" --lists
zoho-projects-axi task 4000000012345 --fresh --debug

Exit codes: 0 ok, 2 usage error, 3 auth or config problem, 4 not found, 5 Zoho unreachable or failing, 6 rate limited, 1 anything else. Errors are three lines on stdout (error, message, hint).

Use it from Claude (MCP)

The MCP server exposes six tools: project, tasks, task, bug, people and resolve. Each is the CLI command of the same name, with the same arguments, plus project, fresh, full and format (toon or json). images=true on task or bug returns images inline. Configuration comes from the config file, so the server needs nothing but the command to start.

The easy way is the zoho-projects-axi-mcp plugin (see Install); it runs the server through uvx. The manual registrations below are for a tool-installed executable. The server reads the config when it starts, so after your first auth login reconnect it (/mcp in Claude Code) or restart the client.

Claude Code

claude mcp add --scope user zoho -- /absolute/path/to/zoho-projects-axi mcp

Use the absolute path of the executable (command -v zoho-projects-axi; for uv tool it is usually ~/.local/bin/zoho-projects-axi). A client launches the server from its own environment, which may not have your shell's PATH, and a path into a project virtualenv that later moves or is deleted is exactly what silently killed the 0.1.x registration. A tool-installed executable does not depend on any checkout. Then run claude mcp list and check that zoho is connected. The tools appear as mcp__zoho__task, mcp__zoho__tasks and so on; the name you pass to claude mcp add is the prefix.

Claude Desktop

Add the server to claude_desktop_config.json (on macOS usually ~/Library/Application Support/Claude/claude_desktop_config.json) and restart the app:

{
  "mcpServers": {
    "zoho": {
      "command": "/absolute/path/to/zoho-projects-axi",
      "args": ["mcp"]
    }
  }
}

Do not put secrets in this JSON; the config file already holds them.

Notes

  • The MCP server has no tool to list or switch projects. Choose the default with the CLI: zoho-projects-axi project list, then zoho-projects-axi project use "<name>". Any tool call can also pass project= for one call.

  • Older registrations that run python -m zoho_mcp or zoho-projects-mcp no longer exist (removed in 0.2.0); re-register with zoho-projects-axi mcp.

  • Stdout is the protocol wire. The server logs to stderr (and log_file, if set), redacting credentials.

Claude Code hook and skill

The zoho-projects-axi-skill plugin already includes both, so you only need these commands if you installed the CLI without the plugin. Both commands print a diff first and write nothing without --yes. They only touch ~/.claude.

zoho-projects-axi hooks install
zoho-projects-axi hooks install --yes
zoho-projects-axi skill install
zoho-projects-axi skill install --yes
  • Hook. Adds a SessionStart entry to ~/.claude/settings.json that runs zoho-projects-axi session-start: a cache-only snapshot of the default project (about 83 tokens), silent on any failure. The previous file is copied to settings.json.bak. zoho-projects-axi hooks uninstall --yes removes it. The hook runs the bare command zoho-projects-axi, so it must be on the PATH that Claude Code sees.

  • Skill. Copies the packaged skill to ~/.claude/skills/zoho-projects-axi/SKILL.md; it teaches an agent to start with resolve, ask for slices and not paste credentials.

Cache

Responses are cached in SQLite at ~/.cache/zoho-projects-axi/cache.sqlite ($XDG_CACHE_HOME/zoho-projects-axi/), so repeated commands cost no Zoho requests. Lifetimes are set by the ttl_* settings (portals, projects, users and tags 24 h; tasks and bugs 5 min; comments and attachments 2 min by default) and applied when an entry is read, so changing one takes effect immediately. Errors and downloads are never cached; a corrupt cache degrades to "no cache" with a warning.

zoho-projects-axi cache status
zoho-projects-axi cache clear --yes
zoho-projects-axi task PROJ1-T1000 --fresh

--fresh skips the cache for one call (and still refreshes it). cache clear also deletes the derived name index and needs --yes. Images saved by --images go to ~/.cache/zoho-projects-axi/attachments/.

Troubleshooting

  • auth.missing or config.project_missing (exit 3). Run zoho-projects-axi auth status --offline to see what is unset and where each value comes from, then zoho-projects-axi auth login-help. Environment variables override the file, which is a common reason a changed value seems ignored.

  • Token problems. zoho-projects-axi auth status verifies the token online: valid, invalid (revoked or wrong credentials; run zoho-projects-axi auth login again), or unreachable (network, or a wrong dc). A refresh token can mint only a limited number of access tokens per ten minutes, so do not loop on a failing login.

  • Config permissions warning. ... is readable by other users; run chmod 600 .... Run chmod 600 ~/.config/zoho-projects-axi/config.toml.

  • Wrong data center. dc must be com, eu, in, com.au or jp; anything else is rejected before any request. A token from one data center does not work on another.

  • rate_limited.client (exit 6). The built-in limiter refuses beyond 100 requests per 2 minutes so Zoho never locks the API (Zoho's documented lockout is 30 minutes). Wait the number of seconds in the hint. Cached and narrower commands use fewer requests.

  • rate_limited.zoho (exit 6). Zoho answered 429 three times in a row (after 1 s and 2 s back-offs). Wait several minutes before retrying; repeated attempts extend the lockout.

  • Stale data. Cached answers can be up to their TTL old. Use --fresh on one call, lower the ttl_* values, or zoho-projects-axi cache clear --yes. The session-start hook deliberately serves a snapshot up to four hours old; run zoho-projects-axi for live numbers.

  • A project is "not found" or the key does not resolve. Key lookup needs the search scope; check zoho-projects-axi project list, pass --project, and see the unverified items below.

  • MCP shows no project list or project use. By design: use the CLI (zoho-projects-axi project use ...), which writes the config file the server reads.

  • Login problems. auth.login_timeout: no browser approval within 5 minutes, run auth login again. usage.port_unavailable: pick another port with --port N and register that redirect URI. auth.state_mismatch or auth.exchange_failed: use only the URL auth login printed; for a client of your own, check the redirect URI matches exactly and that the client is enabled for your data center. auth.missing: no client is configured, see auth login-help. No browser (ssh)? Run auth login --no-browser and open the URL on your machine; the redirect must reach the same host, so use a Self Client there instead.

  • Plugin cannot start (the launcher says it needs uv). Install uv (brew install uv) and restart Claude Code. The first run builds the package, so it takes a few seconds; later runs use uv's cache.

  • MCP tools say "Not signed in" right after login. The server started before the token existed: reconnect it with /mcp or restart Claude Code.

  • MCP server will not connect. Run zoho-projects-axi mcp in a terminal: it should wait silently for input (stop with Ctrl-C). Make sure the registered command is an absolute path to an executable that still exists.

  • --debug prints the number of Zoho requests a command made to stderr.

Testing

uv venv venv && uv pip install --python venv/bin/python -e ".[dev]"
venv/bin/python -m pytest tests -q
uvx --quiet mypy zoho_projects_axi --ignore-missing-imports --python-version 3.10

The default suite is offline: sockets are blocked and ZOHO_* variables are stripped per test. Its token budgets, goldens and fixtures are described in tests/README.md.

Live smoke (manual, never in the default suite). With real credentials in place:

ZOHO_PROJECTS_AXI_LIVE=1 venv/bin/python -m pytest tests/live -q

Tests marked live are skipped without the switch; all their calls are GETs through the gateway.

Known limitations and what is unverified

Be careful before relying on any of the following. This project was built without access to a live Zoho account, so:

  • Every test fixture is synthetic. Bodies follow Zoho's published response shapes and what the earlier 0.1.x code depended on, but values are made up. Each fixture file records, per field group, whether it is documented, proven-by-legacy-code, invented or recorded; none is recorded yet. A green test suite proves the code handles those shapes, not that Zoho sends them.

  • No end-to-end run against Zoho. zoho-projects-axi task <KEY> was exercised only against replayed fixtures. I could not run claude mcp list or register the server in a real Claude installation here; the MCP server was verified over stdio by an MCP client in the test suite and a handshake in a throwaway environment (initialize and tools/list), not inside Claude Code or Claude Desktop. The claude mcp add and Claude Desktop snippets follow those tools' documented forms but were not executed.

  • uv tool install and pipx were not run (only documented here); the package was built into a wheel and installed into a throwaway virtualenv, which is the same artifact those tools install.

Zoho facts that are still unconfirmed (details in tests/README.md):

Question

What the code does meanwhile

Zoho's v3 docs call bugs /issues and milestones /phases; the code uses /bugs and /milestones because 0.1.x did

tries v3 first and falls back to the legacy /restapi path on 404; milestone failure only becomes a warning

Does a bug detail carry associated_task? v3 documents a separate associated-tasks call instead

bug --task reads associated_task and is labelled unverified

Search result wrappers for bugs: bugs/key (as 0.1.x assumed) versus issue/prefix (as the legacy docs show); v3 documents a third shape (results[], entity_id)

resolve --check and key lookup accept the known wrappers, and a key that does not resolve is reported as unresolved

page_info differs between endpoints: has_next_page is missing for bug lists and bare arrays appear for projects and status history

parsers accept both wrapped and bare shapes and use only has_next_page when it exists

The body of a throttle (429) reply, and of token-endpoint errors, is undocumented

429 is detected by status code and retried; the token path reads an error string if present

Rate limit: v3 docs say 200 calls per 2 minutes per endpoint and a 10 minute block, legacy docs say 100 and 30 minutes

the client assumes the stricter 100 per 2 minutes

Search scope name: ZohoProjects.search.READ (used here) versus ZohoSearch.securesearch.READ (shown in Zoho's docs)

auth login-help asks for ZohoProjects.search.READ; if key resolution answers 401 or 403, add the other scope

Task attachment list shape on v3 (the docs show no sample); subtask listing (Zoho cannot filter by parent)

name, type and size are read from every known spelling; --subtasks is labelled unverified

How to settle them. Record real, sanitized fixtures with the read-only recorder and commit the reviewed result:

python scripts/record_fixture.py task_comments/v3_404_legacy_ok \
    --call "task_comments portal=<id> project=<id> task=<id>" --literal "<portal or company name>"

It drives the real gateway (GET only), sanitizes ids, people, emails and tokens, refuses to write if it finds a secret, and writes tests/fixtures/zoho/<endpoint>/<name>.json; use --dry-run first and read the output, since free text is scrubbed by pattern only. Then run the live smoke (above) and update the provenance of the fixtures you replaced.

Layout

  • zoho_projects_axi/core: config, auth, HTTP gateway, cache, TOON encoder, render layer and the commands.

  • zoho_projects_axi/cli: parser and registry (the single source of the command table, --help and the MCP tools).

  • zoho_projects_axi/mcp_server: the MCP front-end.

  • zoho_projects_axi/skills: the packaged Claude Code skill.

  • zoho_projects_axi/core/oauth_login.py, bundled_client.py: the browser sign-in (PKCE, loopback redirect) and the slot for a shipped Zoho client.

  • .claude-plugin/marketplace.json, plugins/: the two Claude Code plugins (zoho-projects-axi-skill, zoho-projects-axi-mcp), each a manifest plus a small bin/zoho-projects-axi launcher that runs through uvx.

  • scripts/record_fixture.py: the dev-only fixture recorder.

MIT licensed; see LICENSE.

Available Tools

15 tools
configure_oauthA

Configure and validate Zoho OAuth credentials. Must succeed before any other tool becomes usable.

NameRequiredDescriptionDefault
client_idYes
client_secretYes
refresh_tokenYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that the tool both configures and validates credentials, and that it is a prerequisite for all other tools. However, it does not describe side effects such as overwriting existing credentials, error behavior on invalid input, or whether it is idempotent. This is a notable omission for a configuration tool, but the stated prerequisite behavior adds some value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, each carrying essential information. The purpose is stated first, and the prerequisite condition is added in the second sentence without redundancy. Every word earns its place, making it highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the return value is likely covered there. However, the description does not mention failure modes, whether the tool can be called multiple times, or any setup details beyond the prerequisite. For a configuration tool that gates all others, this is only moderately complete; it tells the agent when to call it but not what to expect on success or failure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain what the three parameters (client_id, client_secret, refresh_token) are and how they relate. The description only says 'Zoho OAuth credentials' without mapping these to the parameters or providing any additional detail. This is a critical gap that leaves the agent guessing about the purpose and format of each field.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Configure and validate') on a specific resource ('Zoho OAuth credentials'), and distinguishes itself from the sibling tools which all deal with portals, projects, tasks, or bugs. The prerequisite note reinforces its unique role, leaving no ambiguity about what it does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states 'Must succeed before any other tool becomes usable', which tells the agent this is the first call to make. It doesn't mention when not to use it or alternative setup methods, but the instruction is clear enough for a prerequisite tool. The lack of explicit 'when not' is a minor gap given the obvious need.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_bug_contextA

Full context for a bug in one call: details, comments, attachments, and the linked task if any — with any image attachments (e.g. screenshots) downloaded and returned inline so they can be visually inspected alongside the text, no follow-up call needed.

NameRequiredDescriptionDefault
bug_idYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral burden, and it does disclose significant behavior: attachments are downloaded and returned inline, and no follow-up call is needed. It does not mention auth, rate limits, or error behavior, but for a read-focused tool the key operational trait is well communicated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the core purpose and packs the most important behavioral detail into the latter half without repeating information. It could be split into two sentences for readability, but there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with no output schema, the description adequately conveys what the caller gets: details, comments, attachments, linked task, and inline image downloads. Minor gaps such as how non-image attachments are returned or error conditions do not undermine tool selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain bug_id, its format, or where it comes from. The phrase 'for a bug' adds little beyond the schema's own field title 'Bug Id,' so the description fails to compensate for the low coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: get full context for a bug. It also lists the included contents (details, comments, attachments, linked task) and adds a distinguishing detail (image attachments returned inline), making it clearly distinct from sibling context tools like get_task_context or get_project_context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool: when you need a bug's full context in one call, especially with visual attachments. However, it never explicitly names alternatives or states when not to use it, leaving the agent to infer the boundary from the sibling tool names and the word 'bug.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_milestone_contextB

Full context for a milestone: its metadata plus every task under it.

NameRequiredDescriptionDefault
milestone_idYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the return scope (all tasks under the milestone), but does not state whether the operation is read-only, whether large task counts are returned unbounded, or what the output structure looks like. The 'get' prefix implies read-only but this is not explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. Every phrase earns its place, clearly conveying both the resource and the compositional scope.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter retrieval tool, this is minimally adequate, but with no output schema and no annotations, the description does not disclose return shape, potential pagination, or scale warnings. The nature of 'full context' is hinted but not fully specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description does not elaborate on milestone_id beyond 'milestone'. The parameter name is self-explanatory, but the description adds no format, source, or expected value details. With zero schema coverage, the description fails to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (milestone) and scope ('metadata plus every task under it'), which distinguishes it from sibling tools like get_task_context and get_project_context. It lacks an explicit verb like 'retrieve' or 'list', but the intent is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool - when you need full context for a milestone including its tasks. However, it provides no explicit exclusions or comparisons to alternatives like get_task_context, leaving the agent to infer routing from the resource name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_project_contextA

Full overview of the selected project: details, tasklists, milestones, users, tags. Use this for broad questions like 'what's the state of this project'.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden. It states the tool returns an 'overview' implying a read-only operation, but it does not explicitly confirm read-only behavior, mention any prerequisites (like a selected project), or describe error cases. While the description is not misleading, it lacks explicit behavioral details that an agent might need to infer safety and preconditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences, front-loaded with the tool's core function and then a usage example. There is no redundancy or filler. Every phrase contributes to understanding scope and applicability, achieving high conciseness with proper structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers what the tool returns (list of components) and when to use it. It does not explicitly state whether a project must be selected beforehand, but the 'selected project' phrasing implies that context, and sibling selection tools exist. Given the low complexity (no parameters, no output schema), the description is largely complete, though it could have mentioned response format or potential errors.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema provides no structural information to augment. Per the calibration, a zero-parameter tool gets a baseline of 4. The description adds no extra parameter semantics (none needed), but it does not contradict anything. Since all parameters are nonexistent, the description's clarity about the operation compensates adequately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: it provides a 'Full overview of the selected project' and lists the contained elements (details, tasklists, milestones, users, tags). This distinguishes it from sibling tools like get_tasklist_context or get_milestone_context, which focus on specific sub-entities. The verb 'get' plus resource 'project context' is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly gives a usage scenario: 'Use this for broad questions like 'what's the state of this project''. This conveys when to invoke the tool. However, it does not explicitly state when not to use it or point to alternatives, though the existence of focused sibling tools implies that. The guidance is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_task_contextA

Full context for a task in one call: details, comments, subtasks, status history, and attachments — with any image attachments (e.g. screenshots) downloaded and returned inline so they can be visually inspected alongside the text, no follow-up call needed.

NameRequiredDescriptionDefault
task_idYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that image attachments are downloaded and returned inline, and that no follow-up call is needed, which is a valuable behavioral detail. It does not explicitly state that the operation is read-only or mention error cases, but the 'get' verb and the listing of returned content imply a safe read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence but front-loads the core purpose ('Full context for a task in one call') before listing the components and the inline-image behavior. It is efficient and not overly verbose, though slightly long; it earns a solid 4.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains what the tool returns in detail (details, comments, subtasks, status history, attachments) and the inline image behavior. Since there is no output schema, this is necessary and sufficient for an agent to understand the result. It does not mention potential payload size or error handling, but for a read-only context tool, the information is complete enough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not add any meaning beyond the schema's 'task_id' string. It neither explains the format, where to find the ID, nor any constraints. The purpose is inferable from the tool name, but the description fails to compensate for the low schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'get' and the resource 'task context', and enumerates exactly what is included: details, comments, subtasks, status history, attachments, and inline images. It distinguishes itself from sibling context tools by emphasizing 'full context in one call' and the inline image behavior, making it unambiguous which tool to use for a task.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says 'full context for a task in one call' and 'no follow-up call needed', which gives clear context that this is the comprehensive task-specific tool. It does not explicitly name alternatives (e.g., get_project_context, get_bug_context) or state when not to use them, but the scope is clearly task-focused, so the guidance is adequate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tasklist_contextB

Full context for a tasklist: its metadata plus every task in it.

NameRequiredDescriptionDefault
tasklist_idYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It does disclose the response scope — metadata and every task, implying a potentially large read operation. It does not mention pagination, error handling, authentication, or performance, but the core read-only behavior is stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single 10-word sentence, front-loads the core value ('Full context for a tasklist'), and contains no unnecessary words or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (one parameter, no nested objects), but with no output schema or annotations, the description should cover return format and usage context. It explains the return content but omits when to use it and any behavioral caveats, leaving the agent to infer the rest.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description never mentions tasklist_id or its expected format. The parameter is largely self-explanatory from its name and type, so the omission is a moderate gap rather than a fatal one.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the resource (a tasklist) and the content returned (metadata plus every task), which clearly conveys a comprehensive retrieval operation. It does not explicitly distinguish itself from sibling context tools like get_project_context or get_task_context, but the resource-specific wording makes the scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus the other context getters, nor any exclusions, prerequisites, or alternatives. The only implied guidance comes from the tool name and the word 'context'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_portalsA

List Zoho portals available to this account. Requires configure_oauth first.

NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It mentions the OAuth prerequisite, which is a behavioral precondition, but does not disclose whether the operation is read-only, what side effects (if any) exist, or how the results are returned. The existence of sibling 'list_selected_portals' suggests a distinction, but this description does not clarify that it lists all portals versus selected ones. With zero annotation support, this is a significant gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero fluff. The action and resource are front-loaded, and the prerequisite is stated succinctly. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter list tool with no output schema, the description covers the core purpose and a key prerequisite. It could add that the operation is read-only or specify the return format, but those are minor given the simplicity. The scope ('available to this account') adds useful context. It is mostly complete, though a note on output would be ideal.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters (0 params), so the schema is trivially covered. The description does not need to add parameter-specific details. Per the guidelines, with 0 params the baseline is 4, and there is nothing else to add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (List) and the specific resource (Zoho portals) and scopes it to 'this account'. It distinguishes itself from sibling tools like list_projects and list_users by naming the resource type. The verb 'List' is explicit and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a clear prerequisite ('Requires configure_oauth first'), which tells the agent the setup needed before calling. However, it does not explicitly contrast with alternative listing tools or state when not to use it, though the resource specificity makes the usage context clear. It gives a necessary condition but not explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_projectsA

List all projects in a portal, so a project_id can be picked for select_portal_and_project. Requires configure_oauth first.

NameRequiredDescriptionDefault
portal_idYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden. It correctly implies a read-only operation ('List') and adds the OAuth prerequisite, which is useful behavioral context. However, it does not mention pagination, error behavior, or output shape, leaving moderate gaps for a tool with no annotation support.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no wasted words. The core action is front-loaded, and the prerequisite is placed efficiently after it. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with one parameter, but there is no output schema and no annotations. The description covers the prerequisite and purpose but omits what exactly is returned and how the required portal_id should be obtained, leaving an agent to infer those details from sibling tools or runtime behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no description for portal_id (0% coverage). The description ties the parameter to 'in a portal,' giving some meaning, and the purpose sentence implies the output contains project_id. But it doesn't explain where portal_id comes from or any format constraints, so it only partially compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('List all projects in a portal') and immediately clarifies the downstream purpose: picking a project_id for select_portal_and_project. This distinguishes it from sibling tools like list_portals, which lists portals, and select_portal_and_project, which selects rather than lists.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear prerequisite ('Requires configure_oauth first') and frames when the tool is useful ('so a project_id can be picked for select_portal_and_project'). It doesn't explicitly say when not to use it versus other siblings, but the context is strong enough for an agent to know when it applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_selected_portalsA

List every portal/project pair currently selected, and which one is active.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the burden. The verb 'List' clearly indicates a read-only operation, and the description specifies exactly what is returned (selected pairs and active one). It does not explicitly state there are no side effects, but the read-only nature is evident.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that is front-loaded with the core action ('List') and the precise scope ('every portal/project pair currently selected, and which one is active'). No wasted words; everything is essential.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with no parameters and no output schema, the description is complete. It tells the agent exactly what information will be returned, which is sufficient for deciding whether to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and schema coverage is 100% trivially. The baseline for 0 params is 4, and the description adds no parameter-specific information because none exist. It is accurate and complete for this aspect.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists currently selected portal/project pairs and indicates which is active. This distinguishes it from sibling tools like list_portals and list_projects, which likely list all available options, by explicitly adding the 'currently selected' qualifier.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for querying the current selection state but does not explicitly contrast it with siblings. It does not say 'use this instead of list_portals when you need the active selection,' leaving the decision to inference. A clear alternative would improve routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tagsA

List tags in the current portal — useful for resolving tag IDs on tasks/tasklists.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It implies a read-only listing operation scoped to the current portal, but it does not disclose return shape, portal-selection requirements, or pagination behavior. For a simple list tool this is adequate, though not deeply transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence stating the action first, then the practical purpose. Every word earns its place, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter listing tool, the description covers the scope ('current portal') and the intended use case well. The lack of an output schema is partially mitigated by 'List tags' making the return nature clear, though a note about whether a portal must be selected would make it fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero properties and 100% schema coverage, so there are no parameters that need explanation. The description's mention of resolving tag IDs adds useful context beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a clear action and resource: 'List tags in the current portal.' This distinguishes the tool from siblings like list_portals, list_projects, and list_users by the specific resource being listed, with no need to inspect schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a concrete use case: 'useful for resolving tag IDs on tasks/tasklists,' and scopes the operation to the current portal. It does not explicitly name alternatives or when-not-to-use cases, but no sibling overlaps with tags, so the guidance is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_usersA

List users in the current portal — useful for resolving owner names.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It conveys that this is a scoped read operation against the current portal and hints at the output's usefulness, but it does not describe return format, pagination, or any limitations. It is adequate but not richly transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with no wasted words. The core action is front-loaded and the purpose clause earns its place by explaining why an agent would call this tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter listing tool, the description is nearly complete: an agent knows what to call and why. It does not explicitly state that a portal must already be selected, though the sibling tools (switch_portal, list_selected_portals) make that context discoverable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema coverage is 100%, so there is nothing for the description to add about arguments. The phrase 'current portal' refers to implicit context rather than parameters; the baseline for a no-parameter tool is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource — 'List users in the current portal' — and adds a concrete purpose ('useful for resolving owner names'). This clearly distinguishes it from sibling tools like list_portals, list_projects, and list_tags.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a clear use case (resolving owner names) and specifies the scope ('current portal'), so an agent knows when this list is relevant. It does not explicitly name alternatives or exclusions, but the sibling context makes the distinction straightforward.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_portal_selectionA

Remove one portal/project pair from the selected set. If it was active, another remaining selection (if any) becomes active.

NameRequiredDescriptionDefault
portal_idYes
project_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure, and it does disclose a key non-obvious behavior: if the removed pair was active, another remaining selection becomes active. It does not mention failure modes or permissions, but for this simple state mutation the critical behavioral nuance is covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence with a conditional follow-up that adds essential behavior. Every word earns its place, and the main action is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool with an output schema, the description is nearly complete: it states the operation, the object, and the active-selection fallback behavior. It does not explicitly state prerequisites such as 'the pair must already be selected,' but that is strongly implied by the phrase 'from the selected set.'

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds the useful semantic that portal_id and project_id together form a pair within the selected set, but it does not clarify where these IDs come from or any formatting constraints. The parameter names and titles are self-explanatory enough to make the description minimally viable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Remove') with a precise resource ('one portal/project pair from the selected set'), making the operation unambiguous. It also implicitly differentiates from siblings like reset_selection by emphasizing removal of a single pair rather than clearing the entire selection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: use this when you need to remove one portal/project pair from the current selected set. It does not explicitly name alternatives or exclusions, such as 'for removing all, use reset_selection,' but the scope of the operation is clearly implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reset_selectionA

Clear every portal/project selection without losing OAuth config.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses both what is cleared (every portal/project selection) and what is preserved (OAuth config), which is meaningful side-effect information for a reset operation. It does not mention irreversibility or post-conditions, but the scope is simple enough that the stated behavior is largely sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that states the action, the scope, and the key preservation guarantee. Every word earns its place; there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with an output schema, the description is nearly complete: it states the action, the scope, and what is not affected. A minor gap is not explicitly routing to remove_portal_selection for single-selection removal, but this is inferable from the sibling list.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no parameter semantics burden. The description does not need to explain anything beyond the fact that no arguments are required, which the schema already conveys.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Clear') and resource ('every portal/project selection') and adds a key distinction ('without losing OAuth config'). It clearly separates this from sibling tools like remove_portal_selection and configure_oauth.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: it clears all selections rather than just one, and it explicitly notes that OAuth configuration is preserved. It does not explicitly name alternatives or when not to use it, but the 'every' qualifier makes the intended use reasonably inferable from sibling names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

select_portal_and_projectA

Validate and select a portal/project, making it the active one. Multiple portal/project pairs can be selected this way without losing earlier ones — use switch_portal to move between already-selected pairs, list_selected_portals to see them all. Requires configure_oauth first.

NameRequiredDescriptionDefault
portal_idYes
project_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses that multiple portal/project pairs can be selected without losing earlier ones, that the new pair becomes active, and that OAuth configuration is required. It does not mention error behavior or whether selections persist, but the key stateful behavior is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler. It front-loads the primary action, then adds stateful behavior and alternatives, then the prerequisite. Every sentence contributes useful guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter selection tool with an output schema, the description covers purpose, state accumulation, navigation between selections, listing, and the required OAuth prerequisite. Nothing essential for invoking the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description needed to compensate, but it only references 'portal/project' without explaining how to obtain or format portal_id and project_id. The parameter names are self-evident, but the description adds little beyond what the schema already shows.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Validate and select a portal/project, making it the active one.' It clearly distinguishes this from siblings by explaining that switch_portal is for moving between already-selected pairs and list_selected_portals is for viewing them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: select new pairs here, use switch_portal to move between existing ones, and use list_selected_portals to see them. It also states the prerequisite, 'Requires configure_oauth first,' so an agent knows the required setup.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

switch_portalA

Switch the active portal/project to one already selected via select_portal_and_project — no re-validation call. Fails if that pair hasn't been selected yet.

NameRequiredDescriptionDefault
portal_idYes
project_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It reveals that the tool performs no re-validation and fails hard when the pair has not been selected. It does not detail side effects on the previous active context or auth requirements, but for a simple switch operation the disclosed behavior is meaningful and useful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence packs purpose, prerequisite, and failure mode with no wasted words. The dash-delimited clarification about no re-validation call earns its place by differentiating the tool from its sibling.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter state-switching tool with an output schema, the description covers the core actions, prerequisite, and failure behavior. It does not explain what happens to the previous active context or how to verify current selections, but those details are minor and partially discoverable via sibling tools like list_selected_portals.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the property titles 'Portal Id' and 'Project Id' are self-explanatory. The description adds important semantic constraint: the two IDs must represent an already-selected pair, and the failure condition ties both parameters to the prerequisite selection step.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Switch') and resource ('active portal/project'), and immediately distinguishes the tool from select_portal_and_project by noting it operates on an already-selected pair with no re-validation. This makes the tool's role unambiguous even without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states the prerequisite (must already be selected via select_portal_and_project) and the failure condition if that prerequisite is unmet. It does not explicitly say 'call select_portal_and_project first if not selected,' but the context is strong enough to guide correct usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 15 tool updatesv0.1.0
    • First observedconfigure_oauth
    • First observedget_bug_context
    • First observedget_milestone_context
    • First observedget_project_context
    • First observedget_task_context
    • First observedget_tasklist_context
    • First observedlist_portals
    • First observedlist_projects
    • First observedlist_selected_portals
    • First observedlist_tags
    • First observedlist_users
    • First observedremove_portal_selection
    • First observedreset_selection
    • First observedselect_portal_and_project
    • First observedswitch_portal

TDQS

A4/5.0

Scored across 15 tools

Disambiguation5/5

Every tool has a clearly distinct purpose. The selection/configuration tools (configure_oauth, select_portal_and_project, switch_portal, etc.) are well-separated from the context-retrieval tools (get_project_context, get_task_context, etc.), and each context tool targets a different resource type. Even similar-sounding tools like list_portals vs list_projects are unambiguous due to clear descriptions.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case. Verbs are clear (configure, list, select, switch, remove, reset, get) and nouns accurately describe the resource. The compound 'select_portal_and_project' is a minor deviation but still follows the pattern and remains predictable.

Tool Count5/5

15 tools is within the recommended range and well-scoped for a comprehensive Zoho Projects integration. The configuration, selection, and context retrieval tools each serve a distinct purpose, and no tool feels redundant or unnecessary.

Completeness4/5

The server provides thorough read and context-gathering capabilities, covering all major entity types (project, tasklist, milestone, task, bug) with detailed context retrieval. The only notable gap is the absence of mutation tools (create/update/delete), but given the server's apparent focus on read-only context provision, this is a minor gap that agents can work around.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables AI assistants to interact with Zoho Projects for managing projects, tasks, issues, milestones, users, and performing searches. Supports comprehensive project management operations through natural language with automatic OAuth token handling.
    20
    9
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Connects Claude to Zoho CRM with read-only access, enabling natural language queries to search records, list modules, retrieve field information, and count records using OAuth authentication.
    ISC
  • A
    license
    Not graded
    quality
    D
    maintenance
    Secure read-only access to Coddie project planning data, enabling AI assistants to manage and query projects, phases, and steps.
    16 npm
    MIT