Skip to main content
Glama

@qodalis/mcp-cli

A Model Context Protocol server that helps Claude Code build Qodalis CLI plugins (docs search, exact API declarations, scaffolding) and gives it the commands, files, data explorer, jobs and plugin tools of a running Qodalis CLI server through a resilient proxy.

npm Build & Test License: MIT

mcp-cli runs on your machine as a stdio MCP server in one of two modes:

  • Developer mode (no QCLI_URL): the plugin-development tools only. No server needed.

  • Server mode (QCLI_URL set): the same tools plus a proxy to the server's MCP endpoint (<server>/api/qcli/mcp): Claude Code sees exactly the server's tools, with the permissions of the account you configure. It handles sign-in, reconnects after network drops and lets you narrow what the assistant may use.

Where it fits

Repository

Role

web-cli

The browser terminal (Angular, React, Vue) and its plugins, including token create for API tokens

cli-server-node, cli-server-dotnet, cli-server-python

The servers that host the MCP endpoint

cli-server-dashboard

Admin dashboard served by the servers

pwa-cli

The CLI as a PWA and Android app

mcp-cli

This repository: the bridge from Claude Code to a server

Related MCP server: Claude Code Manager WAN

Highlights

  • Plugin development built in. Search the plugin guide, read the exact TypeScript declarations of @qodalis/cli-core and scaffold a plugin, with prompts that walk the assistant through a web plugin or a server command.

  • No tool-specific code. Tools come from the server's tools/list and are passed through unchanged (names, schemas, annotations); calls are forwarded. New commands on the server show up without updating the proxy.

  • Token or password. Use an API token (QCLI_TOKEN), or sign in with QCLI_USER / QCLI_PASSWORD; an expired session is renewed automatically on the next call.

  • Read-only mode (QCLI_READ_ONLY=true) exposes only the tools the server marks read-only, and refuses calls to anything else.

  • Client-side allow and deny lists (QCLI_TOOLS, QCLI_EXCLUDE, trailing * allowed) on top of the server's own permissions.

  • Self-healing connection. It connects on first use, never caches a failed connect, retries once when the connection drops, and fails fast (8 s) when the server is unreachable, with a message that says what to check.

  • Clear errors: a rejected token, MCP not enabled on the server, a missing permission or an unreachable host each come back as one actionable sentence.

Quick start

For plugin development, nothing else is needed:

claude mcp add qcli -- npx -y @qodalis/mcp-cli

Then ask, for example, "Create a Qodalis CLI plugin that converts temperatures" or run the /mcp__qcli__create-web-plugin prompt. See Plugin development.

To also reach a running server, add QCLI_URL and credentials as described below.

npx -y @qodalis/mcp-cli --help

The server must have MCP enabled (default ports: .NET 8046, Node 8047, Python 8048):

Server

Enable MCP

Node

createCliServer({ mcp: true })

Python

CliServerOptions(mcp=True)

.NET

builder.Services.AddCli(cli => cli.AddMcp())

Each also takes options (tool allow/deny lists, a static token, instructions); see MCP endpoint.

Claude Code

claude mcp add qcli -- npx -y @qodalis/mcp-cli

then set the environment in ~/.claude.json:

{
  "mcpServers": {
    "qcli": {
      "command": "npx",
      "args": ["-y", "@qodalis/mcp-cli"],
      "env": {
        "QCLI_URL": "http://localhost:8047",
        "QCLI_TOKEN": "qcli_pat_..."
      }
    }
  }
}

or sign in with a user name and password instead of a token:

"env": {
  "QCLI_URL": "http://localhost:8047",
  "QCLI_USER": "ops",
  "QCLI_PASSWORD": "********"
}

The same in one command, with -e flags:

claude mcp add qcli -e QCLI_URL=http://localhost:8047 -e QCLI_TOKEN=qcli_pat_... -- npx -y @qodalis/mcp-cli

Add --scope user to make it available in every project. With --scope project the entry goes into the project's .mcp.json, which is usually committed: keep the secret out of it with "QCLI_TOKEN": "${QCLI_TOKEN}" and set the variable in your shell. A .env file works too:

{ "command": "npx", "args": ["-y", "@qodalis/mcp-cli", "--env-file", "/path/to/.env"] }

Pin a version in shared configs (@qodalis/mcp-cli@0.2.0) so an upgrade is a deliberate change.

Getting a token

In the web CLI connected to the server (users plugin), signed in as the account the assistant should act as:

token create claude --expires=90
# token create claude --permissions=commands:execute,files:read   (narrower scope)

The token (qcli_pat_…) is shown once. Without the web CLI, sign in and create one with curl:

SESSION=$(curl -s http://localhost:8047/api/v1/qcli/sessions \
  -H 'Content-Type: application/json' -d '{"username":"ops","password":"..."}' | jq -r .token)
curl -s http://localhost:8047/api/v1/qcli/tokens -H "Authorization: Bearer $SESSION" \
  -H 'Content-Type: application/json' -d '{"name":"claude","expiresInDays":90}' | jq -r .token
curl -s -X DELETE http://localhost:8047/api/v1/qcli/sessions/current -H "Authorization: Bearer $SESSION"

A server without the users plugin protects its endpoint with a static token (its mcp.token option): put that value in QCLI_TOKEN. If it sets none, the endpoint is open and no auth variable is needed.

Plugin development

These tools are served locally and work without a server (developer mode) or next to a server's tools. Turn them off with QCLI_DEV_TOOLS=false.

claude mcp add qcli -- npx -y @qodalis/mcp-cli                 # developer mode
claude mcp add qcli --scope user -- npx -y @qodalis/mcp-cli    # in every project

Tools

Tool

Arguments

What it does

qcli_docs_search

query, limit? (default 5, max 20)

Ranked topics of the plugin guide as Section › Topic, with their summary and an excerpt.

qcli_docs_read

topic

A topic in full (heading match, case-insensitive; Section › Topic when a heading is in several sections), or a whole section (Web plugins). Lists the topics when nothing matches.

qcli_api

symbol, package? (default @qodalis/cli-core)

The TypeScript declaration of an interface, type, class, function, enum or constant, with its JSDoc and the related declarations to look up next. package takes any @qodalis/* package (cli is short for @qodalis/cli).

qcli_scaffold_plugin

name, description?, processorName?, directory?

Runs npx -y @qodalis/create-cli-plugin@latest and returns the created files and next steps. Inside a web-cli checkout it creates packages/plugins/<name>; elsewhere a standalone qodalis-cli-<name> project.

Where the data comes from:

  • Docs: https://cli.qodalis.com/llms-full.txt (QCLI_DOCS_URL), cached for an hour. When it cannot be fetched, the last download is reused, else the snapshot bundled in the package (docs/llms-full.txt), so the tools work offline.

  • API declarations: the project's node_modules (the MCP server's working directory and its parents) when the package is installed there, so the answer matches the version you build against. Otherwise the latest version on npm, downloaded from jsDelivr (unpkg as fallback) and cached in memory and in <tmp>/qodalis-mcp-cli; offline, the newest cached version is used.

  • Scaffolding: validates the name (lowercase letters, digits and hyphens, no cli- prefix), refuses an existing target directory, runs without a TTY and stops after 5 minutes. The standalone project installs its dependencies.

Prompts

Prompt

Arguments

Walks the assistant through

create-web-plugin

name, description

Reading the guide, looking up the contracts with qcli_api, scaffolding, implementing the processor and module, tests, registering it.

create-server-command

language (node, dotnet, python), command

Adding a command processor to a Node, .NET or Python server, registering it and testing it.

In Claude Code they appear as /mcp__qcli__create-web-plugin and /mcp__qcli__create-server-command. The docs topics are also MCP resources (qcli-docs://<section>/<topic>), which Claude Code can attach with @.

Example requests

  • "Search the Qodalis plugin docs for reading user input." → qcli_docs_search

  • "Show me ICliExecutionContext." → qcli_api { "symbol": "ICliExecutionContext" }

  • "Which options does CliEngine take?" → qcli_api { "symbol": "CliEngine", "package": "cli" }

  • "Scaffold a plugin called json-tools." → qcli_scaffold_plugin { "name": "json-tools" }

Filters and read-only mode

The dev tools are tools like any other: QCLI_TOOLS and QCLI_EXCLUDE apply to them (QCLI_EXCLUDE=qcli_scaffold_plugin, or QCLI_TOOLS=qcli_* for the dev tools alone), and QCLI_READ_ONLY=true hides and refuses qcli_scaffold_plugin (the docs and API tools are read-only). A server tool with the same name as a dev tool is hidden. When the server is unreachable, tools/list still returns the dev tools.

Configuration

Every setting is an environment variable. QODALIS_CLI_* names are accepted as aliases for every key.

Variable

Default

Description

QCLI_URL

none

Server base URL, e.g. https://cli.example.com (a pasted …/api/qcli/mcp URL is accepted). Without it: developer mode.

QCLI_TOKEN

none

API token (token create in the web CLI) or the server's static mcp.token.

QCLI_USER

none

Sign in with this user name instead of a token (needs QCLI_PASSWORD).

QCLI_PASSWORD

none

Password for QCLI_USER. Never logged.

QCLI_READ_ONLY

false

Expose and allow only tools annotated readOnlyHint: true. See read-only mode.

QCLI_TOOLS

all

Comma-separated allow-list of tool names; a trailing * matches a prefix (fs_*).

QCLI_EXCLUDE

none

Comma-separated deny-list, same syntax, applied after QCLI_TOOLS.

QCLI_CONNECTION_TIMEOUT

8000

Milliseconds to wait for the TCP/TLS connection before reporting the server unreachable.

QCLI_REQUEST_TIMEOUT

60000

Milliseconds a single request (tools/list, tools/call) may take.

QCLI_TRUST_CERT

false

Accept a self-signed TLS certificate.

QCLI_ENV_FILE

none

Path to a .env file (same as --env-file). Variables already set in the environment win.

QCLI_DEV_TOOLS

true

The qcli_* plugin-development tools, prompts and docs resources. false requires QCLI_URL.

QCLI_DOCS_URL

https://cli.qodalis.com/llms-full.txt

Where the plugin guide is fetched from (falls back to the bundled snapshot).

Set either QCLI_TOKEN or QCLI_USER + QCLI_PASSWORD, not both.

Tools

The tools are whatever the server exposes to your account. A typical server offers:

Tools

Available when

server_info

always: version, enabled features

one tool per CLI command (weather, weather_current, ...)

always

fs_list, fs_stat, fs_read, fs_write, fs_mkdir, fs_delete

the server's filesystem API is enabled

data_sources, data_schema, data_query

the data explorer is enabled

jobs_list, jobs_get, jobs_history, jobs_trigger, ...

the jobs plugin is installed

plugin tools

a server plugin contributes them

Each one is limited by the account's permissions on the server (for example commands:execute, files:read / files:write, data:query, jobs:manage), and by the token's scope when it was created with --permissions.

Read-only mode

With QCLI_READ_ONLY=true the proxy lists only the tools the server annotates readOnlyHint: true (such as server_info, fs_list, fs_read, data_schema, jobs_list) and refuses calls to any other tool before they reach the server. Command tools carry no read-only annotation, so they are hidden in this mode; add the ones you want with a separate, non-read-only entry and QCLI_TOOLS.

The filter is defence in depth. The real boundary is the account: give the assistant a user (or a token scope) with only the permissions it should have.

Several servers

Add one entry per server (and per access level) with a distinct name:

{
  "mcpServers": {
    "qcli-dev": {
      "command": "npx",
      "args": ["-y", "@qodalis/mcp-cli"],
      "env": { "QCLI_URL": "http://localhost:8047", "QCLI_TOKEN": "qcli_pat_dev..." }
    },
    "qcli-prod": {
      "command": "npx",
      "args": ["-y", "@qodalis/mcp-cli"],
      "env": {
        "QCLI_URL": "https://cli.example.com",
        "QCLI_TOKEN": "qcli_pat_prod...",
        "QCLI_READ_ONLY": "true"
      }
    },
    "qcli-prod-jobs": {
      "command": "npx",
      "args": ["-y", "@qodalis/mcp-cli"],
      "env": {
        "QCLI_URL": "https://cli.example.com",
        "QCLI_TOKEN": "qcli_pat_prod...",
        "QCLI_TOOLS": "jobs_*,server_info",
        "QCLI_EXCLUDE": "jobs_cancel"
      }
    }
  }
}

Troubleshooting

claude mcp list shows whether each server connects; inside a session /mcp shows its status and tools and lets you reconnect. The proxy logs to stderr (claude --debug shows it).

Message

What to do

… answered 401 (not authenticated): QCLI_TOKEN is wrong, expired or revoked

Create a new token (token create claude) and update QCLI_TOKEN. token list in the web CLI shows expiry dates.

… rejected QCLI_USER / QCLI_PASSWORD

Check the credentials; the account may be disabled or locked out after failed sign-ins.

… answered 403 …

The account lacks commands:execute, or the server rejected the request origin.

MCP is not enabled on this server (enable the mcp option)

Turn on the server's mcp option and restart it; check QCLI_URL (base URL, not a page of the web app).

Cannot reach … Check QCLI_URL / VPN.

The server is down, the URL or port is wrong, or the VPN is disconnected. Retry the call once it is back: the proxy reconnects by itself.

… did not answer within 60000 ms

A slow command; raise QCLI_REQUEST_TIMEOUT.

A tool is missing

The account (or token scope) lacks its permission, the feature is not enabled on the server, or QCLI_READ_ONLY / QCLI_TOOLS / QCLI_EXCLUDE hide it.

Nothing to serve: set QCLI_URL … at startup

QCLI_DEV_TOOLS=false without QCLI_URL: set the URL (check the variable name; npx -y @qodalis/mcp-cli --help lists every variable).

Only the qcli_* tools are listed

No QCLI_URL (developer mode), or the server is unreachable: the log says which.

How reconnection works

  1. The proxy connects to the endpoint on the first tools/list or tools/call, not at startup, so Claude Code starts even when the server is down.

  2. A failed connect is not cached: the next call tries again.

  3. A connection-level error (refused, reset, socket closed, DNS failure) drops the connection and retries the request once on a fresh one. A connect timeout is not retried, so an unreachable host fails within QCLI_CONNECTION_TIMEOUT.

  4. With QCLI_USER / QCLI_PASSWORD, a 401 signs in again and retries once.

  5. The tool list is cached for 60 s; a call to a tool the proxy does not know yet refreshes it first, so new server commands work without a restart.

Security notes

  • Tokens and passwords are read from the environment, sent only to QCLI_URL, and never written to logs or tool results.

  • Prefer an API token with a narrow --permissions scope and an expiry over a password; revoke it with token revoke <id> when it is no longer needed.

  • Use https:// for anything but localhost. QCLI_TRUST_CERT=true disables certificate verification for this process; use it only for self-signed certificates you control.

  • Nothing is written to stdout except the MCP protocol stream.

See SECURITY.md for reporting vulnerabilities.

Library use

The pieces are exported for embedding:

import { createProxyServer, loadConfig, RemoteServer } from '@qodalis/mcp-cli';

const config = loadConfig(process.env);
const remote = new RemoteServer(config, { clientInfo: { name: 'my-app', version: '1.0.0' } });
const server = createProxyServer(remote, config); // a low-level MCP Server: connect any transport

With the plugin-development tools (remote may be undefined for developer mode):

import { createProxyServer, DevTools, loadConfig } from '@qodalis/mcp-cli';

const config = loadConfig(process.env);
const server = createProxyServer(undefined, config, { dev: new DevTools(config) });

Development

npm install
npm run build
npm test             # unit tests and stdio end-to-end tests against a fake server (build first)
npm run typecheck
npm run check-format
npm run dev -- --env-file .env   # run from source
npm run sync-docs                # refresh docs/llms-full.txt: a path/URL argument, else generated by ../web-cli/tools/build-llms.js, else the site

See CONTRIBUTING.md.

License

MIT © Qodalis Solutions SRL

Available Tools

4 tools
qcli_apiA
Read-only

TypeScript declaration (with JSDoc) of an interface, type, class, function, enum or constant from the published @qodalis packages: the project's node_modules when installed, else the latest version on npm. Use it for exact member names and signatures, e.g. ICliCommandProcessor, ICliExecutionContext, ICliModule, ICliInputReader, CliProcessCommand.

NameRequiredDescriptionDefault
symbolYesExported name, case-sensitive
packageNoPackage to read (default @qodalis/cli-core; also @qodalis/cli, @qodalis/angular-cli, ...). "cli-core" is short for @qodalis/cli-core.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds genuinely non-obvious behavior: it resolves the source from the project's node_modules when installed, otherwise falls back to the latest npm version, and it states the return is a declaration including JSDoc. The version-resolution fallback is exactly the kind of context an agent cannot get from annotations.

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?

Two sentences, front-loaded with what the tool returns before the usage hint. The trailing list of five example symbols is slightly long but functions as concrete grounding rather than filler. No redundant restatement of the name.

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?

There is no output schema, and the description compensates by saying exactly what is returned (a TypeScript declaration with JSDoc) and where it is sourced from (local node_modules or npm latest). For a two-parameter read-only lookup with full schema coverage, nothing an agent needs in order to call it correctly is missing.

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 100%, so both `symbol` and `package` are already documented, including the @qodalis/cli-core default and the "cli-core" shorthand. The description reinforces usage with concrete symbol examples (ICliCommandProcessor, ICliExecutionContext, ...) but adds no syntax or format detail beyond the schema. Baseline 3 applies.

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 names a specific verb+resource: retrieving the TypeScript declaration (with JSDoc) for a named symbol from @qodalis packages. It enumerates the symbol kinds (interface, type, class, function, enum, constant) and gives concrete examples, so an agent knows exactly what comes back. It does not explicitly contrast itself with qcli_docs_search/qcli_docs_read, which is the main remaining ambiguity.

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?

"Use it for exact member names and signatures" gives a use condition, which is more than nothing. But there is no exclusion or routing rule against the sibling docs tools — an agent must infer that this is for precise signature lookup while qcli_docs_search is for prose/narrative discovery.

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

qcli_docs_readA
Read-only

Read a topic of the Qodalis CLI plugin-development guide in full (markdown with code samples). Pass a topic heading (case-insensitive), "Section › Topic" when a heading exists in several sections, or a section name ("Web plugins") for the whole section. Lists the topics when nothing matches.

NameRequiredDescriptionDefault
topicYesTopic heading, "Section › Topic", or a section name

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the bar is lower, and the description still adds real behavioral detail: the payload is markdown with code samples, and a non-matching topic does not error — it returns a topic listing instead. That fallback behavior is the kind of thing an agent can't infer from annotations or schema.

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?

Three tight sentences: what it returns, how to address a topic, and the fallback. The most important information (what you get back) is front-loaded and no sentence is redundant.

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 single-required-parameter read tool with no output schema, the description covers the return format, the three addressing modes, and the failure path. Nothing an agent needs in order to call it correctly is missing.

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 coverage is 100%, so the baseline is 3, and the description adds value on top by specifying that matching is case-insensitive and that a bare section name returns the entire section — semantics not present in the schema's one-line parameter description.

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?

States a specific verb and resource: 'Read a topic of the Qodalis CLI plugin-development guide in full (markdown with code samples).' The 'in full' framing implicitly separates it from qcli_docs_search, but the search sibling is never named, so differentiation is left to inference rather than explicit.

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?

Gives rich guidance on HOW to form the argument (case-insensitive heading, 'Section › Topic', or section name) and what happens on a miss, but never says when to pick this over qcli_docs_search — e.g. 'use search first when you don't know the heading.' Usage is implied, not stated relative to alternatives.

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

qcli_scaffold_pluginA

Create a new web CLI plugin with @qodalis/create-cli-plugin (npx): processor, module, build config and tests. Inside a web-cli checkout it goes to packages/plugins/; elsewhere to a standalone qodalis-cli- project with its dependencies installed. Returns the created files and next steps.

NameRequiredDescriptionDefault
nameYesPlugin name: lowercase letters, digits and hyphens, without a "cli-" prefix (package @qodalis/cli-<name>)
directoryNoDirectory to run in (default: the current working directory of the MCP server)
descriptionNoOne-line description of the plugin
processorNameNoPascalCase processor name (class Cli<processorName>CommandProcessor); default derived from name

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, and this description adds substantial context beyond them: it runs an npx generator (network fetch), writes to packages/plugins/<name> or a standalone qodalis-cli-<name> project, and installs dependencies as a side effect. It also states what is returned (created files and next steps), which is important since no output schema exists.

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?

Three dense sentences, front-loaded with the action and the generator, followed by location behavior and return value. Every sentence carries new information with no repetition of the title or name.

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?

It covers what is created, where it lands, that dependencies are installed, and what is returned, which is sufficient given full schema coverage and no output schema. It omits edge-case behavior such as what happens when the target plugin directory already exists, which matters given idempotentHint=false.

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 100%, so name, directory, description, and processorName are each documented in the schema itself. The description adds no parameter-level syntax or defaults beyond that, so the baseline 3 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 first sentence names a specific verb (create), the exact resource (web CLI plugin), the concrete generator used (@qodalis/create-cli-plugin via npx), and enumerates what the scaffold contains (processor, module, build config, tests). That is far more specific than the sibling docs/api tools, so an agent can distinguish it without opening a 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 gives clear context for when the tool applies and even explains the two different target locations depending on whether it runs inside a web-cli checkout. It does not state exclusions or explicitly redirect to any sibling tool, so it stops short of full alternative routing.

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. 4 tool updatesv0.2.0
    • First observedqcli_api
    • First observedqcli_docs_read
    • First observedqcli_docs_search
    • First observedqcli_scaffold_plugin

TDQS

A4/5.0

Scored across 4 tools

Disambiguation5/5

Each tool targets a distinct need: docs discovery (search), docs consumption (read), type/signature lookup (api), and project creation (scaffold). The search/read pair is explicitly linked in the descriptions ('read one in full with qcli_docs_read', 'Lists the topics when nothing matches'), so the boundary is unambiguous.

Naming Consistency4/5

All tools share a consistent qcli_ prefix and lowercase snake_case, which makes the family instantly recognizable. The component ordering varies (qcli_docs_search is noun_verb, qcli_scaffold_plugin is verb_noun) and qcli_api is a bare noun, a minor inconsistency but still readable.

Tool Count4/5

Four tools is a lean but justified surface for a docs-plus-scaffolding helper: one search, one read, one API reference, one generator, with no redundancy. It is on the thin side since there is no tool for exercising or validating what you build, but every tool earns its place.

Completeness3/5

Documentation retrieval (search + read) and API introspection are fully covered, but the lifecycle stops at creation: there is no tool to build, run, test, or inspect an existing plugin/project, and no way to list available recipes or installed plugins except indirectly through search. Agents will hit a dead end after scaffolding, having to fall back on shell commands.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to interact programmatically with Claude Code CLI, managing sessions, streaming outputs, and handling permission requests.
    7
    3 npm
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables ISLI agents and MCP clients to dispatch natural-language coding and terminal tasks to a locally-installed Claude Code CLI, supporting both one-shot execution and persistent sessions with workspace and security controls.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Lets Codex delegate coding and repository work to an installed Claude Code CLI with permission-aware inspect/write access, model and effort selection, resumable and cloud-attached sessions, and durable synchronous or asynchronous jobs.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Bridges MCP clients such as Claude Code and Cursor to independent Codex app-server sessions, letting them start, poll, steer, review, compact, cancel, and answer prompts for asynchronous Codex tasks over local stdio or a remote authenticated WebSocket. Runs read-only by default, with workspace-write sandboxing only when a user explicitly enables it, and reports job status, model listing, and progress back to the client.
    10
    20 npm
    1
    MIT