stackhint
stackhint’s MCP server is a local, read-only assistant that inspects a project and your Claude Code/Codex setup to recommend, explain, search, review, and plan tool installs without changing anything.
Recommend MCP servers, plugins, skills, and CLIs for a project or task, ranked and skipping tools already configured.
Explain a specific registry entry: why it fits, permissions/risks, setup, and the exact config it would add.
Search the local curated registry by keyword, optionally filtering by tool kind and limiting results.
Show configured integrations and flag issues such as outdated servers or secrets written into config files.
Prepare an install plan with diff, permissions, environment variables, host, scope, and access mode—but never apply it.
Keep operations read-only and offline by default; installation requires the user to run the printed
stackhint installcommand themselves.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@stackhintwhat MCP servers would help this project?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
stackhint
Which MCP servers, plugins and skills does your repo actually need? stackhint looks at the project and at what Claude Code and Codex already have set up, then tells you, pointing at the file that made it think so. It can also add a server for you, after showing the exact change.
It runs locally, has no dependencies and sends nothing anywhere.
Try it in any project (Node.js 20+, nothing to install):
npx -y github:Protemir/stackhint recommendOr add it to Claude Code and ask "which MCP servers would help here?":
/plugin marketplace add Protemir/stackhint
/plugin install stackhint@stackhintThat is the real output on examples/dotnet-shop, a small ASP.NET Core API (npm run demo reproduces it). Every line in "Why now" points at a file; a README that only says "we might try Kubernetes one day" gets no Kubernetes suggestion.
What it reads: manifests (*.csproj, package.json, pyproject.toml, go.mod, Cargo.toml, Gradle, Composer, Gemfile), compose files, Kubernetes and Terraform files, CI, .env.example key names, README links and git history, plus your Claude Code and Codex configs. It knows 143 tools (MCP servers, plugins, skills, CLIs), checked by hand against the vendors' docs, including the retired ones, so stackhint check can tell you what to replace.
Why I built it
There are thousands of MCP servers, and a good share of the "top 10" lists still point at servers that were archived in 2025. The reference Postgres server, for example, has a known read-only bypass and no fixes. I wanted something that looks at my repo, knows what I already have configured in Claude Code and Codex, and tells me what is worth adding and what to replace, without sending my code anywhere and without touching my config behind my back.
How it compares to what exists:
Anthropic's
claude-code-setupplugin has Claude itself look at the codebase and suggest automations. It is good, but it works only in Claude Code, costs tokens on every run, doesn't check what you already have, and doesn't install anything.MCP Advisor and MCP Compass search MCP directories from a natural-language query. They don't look at your project.
stackhint is deterministic and local. It covers Claude Code and Codex, knows your existing setup, keeps a hand-checked registry with exact install commands and read-only defaults, and handles installs with a diff, a backup and a rollback.
Related MCP server: AI Knowledge Center MCP
Install
stackhint needs Node.js 20 or newer. It has no runtime dependencies.
Run it without installing (downloads from GitHub):
npx -y github:Protemir/stackhint recommendOr install the command globally:
npm install -g github:Protemir/stackhintClaude Code
The plugin adds a stackhint skill, so Claude can answer "which MCP servers would help here?", and a quiet session-start hint (see Proactive mode).
/plugin marketplace add Protemir/stackhint
/plugin install stackhint@stackhintFrom a shell: claude plugin marketplace add Protemir/stackhint and then claude plugin install stackhint@stackhint.
Codex
Codex reads the same repository as a plugin marketplace:
codex plugin marketplace add Protemir/stackhintThen install stackhint from /plugins. Codex asks you to approve plugin hooks in /hooks before they run.
Claude Desktop
Download stackhint-<version>.mcpb from the latest release and open it: Claude Desktop installs it as an extension. Pass the project folder as path when you ask for recommendations. The same server is in the official MCP Registry as io.github.Protemir/stackhint.
Without plugins: MCP server
stackhint can also run as a read-only MCP server with five tools (recommend_tools, explain_tool, search_tools, tooling_status, plan_install). It can never install anything; plan_install only shows the plan and the command for you to run.
stackhint setup claude # or: stackhint setup codexsetup shows what it will add (an MCP server entry and the skill file) and asks first. To do it by hand:
claude mcp add --scope user stackhint -- npx -y github:Protemir/stackhint mcp
codex mcp add stackhint -- npx -y github:Protemir/stackhint mcpCommands
Command | What it does |
| Shows what it detected and the evidence for each signal |
| Ranked suggestions. |
| Why, what it can access, setup, the exact JSON/TOML it would add, and the vendor's own command |
| Shows the plan and diff, asks, then applies. |
| Starts a server for one session without changing any config |
| What is configured for Claude Code and Codex |
| Reviews it: archived servers, secrets written into config, write access where read-only exists, duplicates. |
| Searches the local registry. |
| Never suggest again. |
| Lists installs made by stackhint, or undoes one |
|
|
| Checks Node, config files, host CLIs and common problems |
| Runs the read-only MCP server over stdio |
Every command takes --format text|md|json. Exit codes: 0 ok, 1 error, 2 usage error, 3 not approved, 4 blocked.
What it looks at
Package manifests:
*.csproj,Directory.Packages.props,package.json,requirements*.txt(alsorequirements/folders and UTF-16 files),pyproject.toml(Poetry, uv, PDM),Pipfile,go.mod(direct requirements only),Cargo.toml,pom.xml,build.gradle(.kts), Gradle version catalogs,composer.json,Gemfile,pubspec.yaml, Prisma schemas.Infrastructure: Dockerfiles, compose files (service images like
postgres:17), Kubernetes manifests, Helm charts, Argo CD and Flux objects, Terraform providers, Pulumi, Bicep, CDK, and the configs of Wrangler, Vercel, Netlify, Fly.io, Render, Railway, Heroku, DigitalOcean, Firebase and Supabase.Frameworks and engines: Angular, Svelte, Nuxt, Astro, Next.js, Expo, Flutter, Shopify apps and themes, Laravel, Storybook, Nx, shadcn/ui, Xcode, Unity, Unreal, browser extensions, browser games (three.js, Phaser, Pixi) and plain pages with scripts.
CI: GitHub Actions, GitLab CI, Azure Pipelines, CircleCI, Jenkins, Buildkite, Bitbucket.
APIs and tests: OpenAPI files,
.httpfiles, Postman collections, protobuf, GraphQL, Playwright/Cypress/Jest/Vitest/pytest configs.Settings files:
appsettings*.jsonconnection strings and.env.examplekey names, only to learn which database or service is used. Values are never stored or printed.Links in README/CONTRIBUTING: Jira, Confluence, Linear, Asana, monday.com, ClickUp, Figma, Notion.
Git: remote hosts, branch names, recent commit subjects (local
git log). Issue keys likeSHOP-123suggest Jira; 8+ commits with the same shape ("add migration ...") suggest a skill.MCP servers your team already configured for VS Code or Cursor (
.vscode/mcp.json,.cursor/mcp.json).Your task, if you pass one. English and Russian keywords both work.
A project that merely mentions a technology in prose does not get a recommendation for it. Signals carry a strength, and most entries need concrete evidence (requiresAny).
How ranking works
Each registry entry lists the signals that make it relevant, with a weight. The score is:
fit = relevance × (0.55 + 0.25 × value + 0.2 × immediacy) × compatibility × overlap
score = 100 × (fit − setup cost − risk), clamped to 0..100relevance combines matching signals (noisy-OR of weight × strength);
value comes from the registry's estimate of time saved and how often you'd use it;
immediacy is higher when the evidence comes from your task;
overlap goes down when an equivalent tool is already set up (a CLI like
ghcounts partially);setup cost covers effort, auth and missing prerequisites; risk covers write/admin access, community or preview status and incomplete metadata.
These numbers are editorial estimates, not measurements, and stackhint says so in its output. Confidence (high/medium/low) reflects how strong the evidence is and whether compatibility and metadata are verified. stackhint explain <id> prints the full breakdown.
What it knows about your setup
Claude Code: ~/.claude.json (user scope and per-project local scope), the project .mcp.json, approvals in .claude/settings*.json, enabled plugins and the MCP servers they bundle, skills and commands, and an admin-managed managed-mcp.json.
Codex: ~/.codex/config.toml (or $CODEX_HOME), a trusted project's .codex/config.toml, enabled plugins, and skills in ~/.agents/skills, .agents/skills and ~/.codex/skills.
It reports each tool as configured, disabled, not configured, incompatible or unknown (for example when a config file can't be parsed). "Configured" means it is in the config. stackhint does not claim a server is running unless you ask it to verify with the host's CLI (install --verify).
Installing safely
Installing changes your configuration, so stackhint follows the same steps every time:
It builds a plan: the official source, the scope, the exact diff or command, permissions, auth, network access, required environment variables (by name only) and side effects.
It asks. Without a terminal it refuses unless you pass
--yes.--dry-runnever asks and never writes.Before writing, it checks the file hasn't changed since the plan was made, and saves a backup.
It writes atomically, then parses the result back and checks the new server is there. If anything is off, the original is restored.
For Codex it can confirm with
codex mcp get. For Claude Code,--verifyrunsclaude mcp get.It prints the undo command.
stackhint rollback <id>restores the file byte-for-byte, or runsclaude mcp remove. If you edited the file after the install, rollback refuses unless you pass--force.
Where it writes:
Host | Scope | How |
Claude Code |
| merges into |
Claude Code |
| runs |
Codex |
| appends one |
Codex |
| appends to |
Rules it follows:
Read-only variants are the default where the vendor offers one (
X-MCP-Readonlyfor GitHub,--access-mode=restrictedfor Postgres MCP Pro,--read-onlyfor Kubernetes,read_only=truefor Supabase, and so on). Use--access writeto opt out.Secrets are referenced by environment variable name only:
${VAR}in Claude Code configs,bearer_token_env_varandenv_varsin Codex. stackhint never asks for a token and never writes one.Package versions are pinned where they could be checked (for example
kubernetes-mcp-server@0.0.67).It never runs remote scripts, never installs packages and never changes anything else. Plugins, skills and CLIs are shown as steps (Claude Code plugins can be installed through
claude plugin installafter you confirm).On native Windows,
npxservers are wrapped incmd /c, as both clients require.It won't install archived or deprecated entries, won't overwrite a server with the same name, and won't touch Claude Code when an admin-managed MCP config is active.
Proactive hints
The plugin installs two hooks. What they do depends on mode:
Mode | Session start | Each prompt |
| nothing | nothing |
| up to 2 high-confidence suggestions, at most once a day per project | nothing |
| up to 3 suggestions plus a one-line visible notice | if the prompt starts a new kind of task (a PR review, a slow query) and a missing tool fits, one suggestion |
Suggestions go into the agent's context, with the instruction to mention them only when relevant and never to install anything itself. The same item is not repeated for 14 days, dismissed items never come back, and a new dependency in the project can break through the daily limit. The prompt hook keeps the prompt in memory only; it is never written anywhere.
stackhint config set mode manual # turn hints off
stackhint config set mode proactive # more hintsLimitations, honestly:
Neither client has a background notification API, so "proactive" means session-start and prompt hooks. There is no file watcher.
Hook suggestions reach the model, not you directly (except the one-line notice in proactive mode). Whether it mentions them depends on the conversation.
Codex requires you to approve hooks in
/hooksbefore they run.
Privacy
Only files that a detector needs are read, with size limits and a time budget.
.env,.env.local, private keys,secrets.jsonandappsettings.*secret*are never opened.Connection strings, tokens and URLs with credentials are never stored or printed; evidence names the file and the kind of finding, not the value. All output, the audit log and errors pass through redaction.
No network access by default.
registry search --remotequeries the official MCP Registry only afterstackhint config set network true, and caches results for 24 hours.git logruns locally to read commit subjects. Turn it off withstackhint config set gitHistory false.State lives in
~/.stackhint(or$STACKHINT_HOME):config.json,state.json(dismissals and cooldowns, keyed by a hash of the project path),audit.log,backups/.
The registry
registry/registry.json has 143 entries: 120 recommendable tools (89 MCP servers, 28 plugins, 2 CLIs, 1 skill) and 23 deprecated or archived ones that stackhint detects in your config so it can suggest the replacement. Every URL, package name, flag and plugin id was checked against the vendor's repository or docs on the date in verifiedAt (October 2026). Effort, time saved and frequency are my estimates.
It covers source control (GitHub, GitLab, Azure DevOps), issue trackers (Jira/Confluence, Linear), databases (Postgres, MySQL, SQL Server, ClickHouse, MongoDB, Redis, Supabase, Neon, Firebase), containers and infrastructure (Kubernetes, Docker, Terraform, Argo CD, Flux), clouds (AWS, Azure, Google Cloud, Cloudflare, Vercel), docs (Context7, Microsoft Learn, DeepWiki), CI (CircleCI, Buildkite, Jenkins), quality (SonarQube, Semgrep, Snyk), observability (Sentry, Grafana), design (Figma), payments (Stripe), browser testing (Playwright, Chrome DevTools), Claude Code LSP and review plugins, and project skills for repeated workflows.
Adding your own tools
Put a JSON file in ~/.stackhint/registry.d/ (or point STACKHINT_REGISTRY at one). Custom entries are validated just like built-in ones, are always treated as community-maintained, and can override a built-in entry with the same id.
{
"entries": [
{
"id": "team-db",
"name": "Our analytics DB server",
"kind": "mcp",
"category": "database",
"description": "Read-only access to the analytics warehouse.",
"docs": "https://wiki.example.com/mcp/analytics",
"status": "active",
"triggers": [{ "signal": "db:clickhouse", "weight": 0.8 }, { "signal": "task:db", "weight": 0.6 }],
"requiresAny": ["db:clickhouse"],
"problem": "Analysts paste query results into the chat by hand.",
"workflow": "Ask the agent to check yesterday's event counts.",
"benefits": ["Schema and SELECT queries"],
"access": { "level": "read", "summary": "SELECT only", "readOnlyAvailable": true },
"auth": { "type": "oauth", "detail": "Company SSO" },
"hosts": { "claude": { "support": "yes" }, "codex": { "support": "yes" } },
"install": { "serverName": "analytics", "readOnly": { "transport": "http", "url": "https://mcp.example.com/analytics" } },
"match": { "urls": ["mcp.example.com/analytics"] }
}
]
}Validation rejects entries that could be abused: shell metacharacters or quotes in arguments, interpreters and downloaders as commands (bash, curl, powershell, node...), privileged Docker flags and host mounts, plain-HTTP URLs (except localhost), literal secrets in headers, env or arguments, and text that tries to instruct the agent ("ignore previous instructions", fake </system> tags). Missing metadata is filled with cautious defaults (unknown access is treated as write) and lowers confidence.
stackhint scan shows the signal ids found in a project; the full set the analyzer can produce lives in src/context/ (packages.ts, analyzer.ts, task.ts). To add a built-in tool, open a pull request with the entry plus the sources you checked; npm test verifies that every trigger is a signal the analyzer emits, that install specs render valid JSON and TOML for both hosts, and that plugin ids exist in the official marketplace.
Configuration
stackhint config show prints the current values. Keys:
Key | Default | Meaning |
|
|
|
|
| lowest score |
|
| lowest score for hook suggestions |
|
| suggestions per hook run |
|
| don't repeat the same suggestion sooner |
|
| at most one session-start batch per project in this window |
|
| allow |
|
| read recent commit subjects with |
Environment variables: STACKHINT_HOME (state folder), STACKHINT_REGISTRY (extra registry files, separated by your OS path delimiter), CLAUDE_CONFIG_DIR and CODEX_HOME (respected like the clients do), NO_COLOR.
Architecture
src/
context/ project analyzer: file walk with budgets, manifest parsers, git, task keywords -> signals
registry/ registry loading and validation, search, opt-in official MCP Registry client
hosts/ read-only adapters: Claude Code and Codex configs, plugins, skills, PATH -> inventory
engine/ ranking (recommend.ts) and configuration review (check.ts); pure functions
install/ spec resolution, planning, applying with backup/validation, rollback
hooks/ SessionStart and UserPromptSubmit hooks
mcp/ minimal stdio MCP server (read-only tools)
render/ text, Markdown and JSON output
state/ config, dismissals, cooldowns, audit log
cli.ts, commands.tsThe engine knows nothing about host config formats; adapters turn configs into a common inventory and the install module turns a registry spec into Claude JSON or Codex TOML. TypeScript is compiled by stripping types with Node's built-in stripper (scripts/build.mjs), so there are no runtime or build dependencies; CI checks that the committed dist/ matches the sources.
Development
npm install # TypeScript and @types/node, for type checking only
npm run typecheck
npm run lint
npm test # 300+ tests: node --test on the TypeScript sources (Node 22.18+)
npm run build # writes dist/
npm run test:dist # smoke tests on the built JavaScript (works on Node 20)The tests run in throwaway sandboxes (fake home, Claude and Codex config dirs) and cover detection, ranking, duplicate detection, config merging, approval enforcement, dry runs, rollback, redaction, malicious registry entries, network failures, hooks and the MCP protocol. CI also runs the real claude and codex CLIs against configs written by stackhint (tests/host-real.test.ts).
Troubleshooting
"No terminal to confirm in": you ran
installfrom a script or an agent. Run it in a terminal, or pass--yesonce you've read the plan."Claude Code CLI not found on PATH": user and local scopes need
claude. Use--scope project, or run the printed command yourself.A server shows "Failed to connect": check that the environment variables listed in the plan are set in the shell that starts the client, and that
npx/uvx/dockercan download packages.Codex ignores
.codex/config.toml: Codex reads project config only in trusted projects.Codex times out starting a server on first run: stackhint sets
startup_timeout_sec = 60for package-runner servers; raise it if downloads are slow.Something looks wrong:
stackhint doctor, then open an issue with the output ofstackhint scan --format json(it contains no secrets, but read it before sharing).
Uninstall
Undo installs:
stackhint rollbacklists them;stackhint rollback <id>reverts one.Claude Code plugin:
/plugin uninstall stackhint@stackhintand/plugin marketplace remove stackhint.Codex plugin: remove it in
/plugins, thencodex plugin marketplace remove stackhint.MCP server registered by
setup:claude mcp remove stackhint --scope useror delete[mcp_servers.stackhint]from~/.codex/config.toml; the skill lives in~/.claude/skills/stackhintor~/.agents/skills/stackhint.Global command:
npm uninstall -g stackhint.State: delete
~/.stackhint.
Limitations
The registry is curated by hand and checked in October 2026. Vendors change endpoints and flags;
verifiedAttells you how old a fact is, andcheckflags known deprecations.Detection is heuristic. It reads the files that commonly reveal a stack; unusual layouts may be missed (
stackhint scanshows what it found).Scores are estimates. They are useful for ordering, not as a measure of time saved.
stackhint does not install packages, plugins or CLIs itself (Claude Code plugins go through
claude plugin installafter you confirm).Codex support was verified against the docs and the Codex CLI in CI; I use Claude Code daily on Windows, so that path has had more real use.
License
MIT. If stackhint saved you some time, a star on GitHub helps other people find it.
Available Tools
5 toolsexplain_toolExplain one toolARead-onlyIdempotent
Details for one registry entry: what it does, why it fits (or not), permissions, risks, setup, and the exact config it would add.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| host | No | Which client to recommend for. Defaults to the clients found on this machine. | |
| path | No | Project directory. Defaults to the server working directory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds real value beyond that by disclosing the content the agent will receive (permissions, risks, setup, exact config), though it says nothing about output format or size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that opens with the scope ('Details for one registry entry') then lists the payload. Dense but every clause carries distinct information; slightly list-heavy but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description correctly carries the burden of describing return contents, and it does so thoroughly. The remaining gap is the ambiguous required 'id' argument, which the description could have clarified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: host and path are documented in the schema, but the required 'id' parameter has no description anywhere, and the description never clarifies its format or whether it is a name or an entry identifier. With moderate coverage and no compensating param detail, this is baseline-level.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource ('one registry entry') and enumerates exactly what the response covers (fit, permissions, risks, setup, config), which is more specific than the bare name. It does not explicitly differentiate itself from recommend_tools, whose 'why it fits' territory overlaps, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, when-not-to-use, or named alternative. The phrase 'one registry entry' weakly implies a single-id lookup versus the search/recommend siblings, but an agent must infer that from the description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_installPrepare an install plan (does not install)ARead-onlyIdempotent
Show exactly what installing a tool would change (diff, permissions, env vars). It does NOT apply anything. To install, ask the user to run the printed stackhint install command in their terminal; it asks for confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| host | Yes | ||
| path | No | Project directory. Defaults to the server working directory. | |
| scope | No | ||
| access | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds real value beyond that: it discloses the contents of the preview (diff, permissions, env vars) and that the actual mutation happens out-of-band via a user-confirmed CLI command.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each doing distinct work: what it produces, what it does not do, and the required next step. The non-effect is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still tells the agent what the plan contains (diff, permissions, env vars) and how the install ultimately happens. The remaining gap is the undocumented parameters, which is the only reason this is not a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20% - only `path` is documented, while `id`, `host`, `scope`, and `access` have no descriptions despite three being enums. The description adds no meaning for any parameter (e.g., what 'access: write' changes in the preview), so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Show exactly what installing a tool would change') and immediately lists the artifacts returned (diff, permissions, env vars). The negation 'It does NOT apply anything' plus the title make it unmistakably distinct from any actual install operation among the siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when not to use it (it does not install) and routes the agent to the correct alternative action: have the user run `stackhint install` in a terminal with confirmation. It stops short of contrasting with sibling read-only tools like explain_tool or recommend_tools, but the key decision boundary is covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_toolsRecommend tools for this projectARead-onlyIdempotent
Scan the project (locally, read-only) and list MCP servers, plugins, skills and CLIs that fit it and the current task, skipping ones already set up. Pass a short task description for task-specific advice. Never installs anything.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Which client to recommend for. Defaults to the clients found on this machine. | |
| path | No | Project directory. Defaults to the server working directory. | |
| task | No | What the user is working on, in a sentence. | |
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is partly covered; the description reinforces this with '(locally, read-only)' and adds a genuine constraint beyond the annotations: 'Never installs anything.' It also discloses the filtering behavior ('skipping ones already set up'). It does not discuss cost, latency, or what the recommendation list contains internally.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, with the core action and scope front-loaded and the no-install constraint placed last for emphasis. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-required-param, no-output-schema tool, the description names the categories returned and the scope of the scan, which is enough to call it correctly. Gaps: the return shape/format of the recommendations and the role of the undocumented limit parameter are not addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the schema already states defaults for host and path. The description adds only marginal meaning, clarifying that 'task' should be a short, task-specific sentence — largely overlapping the schema's 'What the user is working on, in a sentence.' The limit parameter is left undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Scan the project ... and list MCP servers, plugins, skills and CLIs that fit it and the current task.' The scope (project-local, fit-based, skipping already-configured tools) is clear enough to separate it from a generic tool search. It stops short of naming a sibling (search_tools, tooling_status, plan_install) as the alternative, so sibling differentiation is only implied.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: you use it to get recommendations for a project/task, and 'skipping ones already set up' implies it's the right pick when you need fresh suggestions. There is no explicit when-to-use versus search_tools/tooling_status/plan_install, and no exclusion conditions. 'Pass a short task description for task-specific advice' is parameter guidance, not tool-routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_toolsSearch the tool registryCRead-onlyIdempotent
Search the local curated registry by keyword (offline).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| limit | No | ||
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description reinforces this with 'local' and 'offline', which is useful confirmation that no network call occurs, but it discloses nothing about result caps, ranking, or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or redundancy. It is efficient, though arguably so terse that useful scoping information was trimmed away.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and zero parameter documentation, the description should explain what a result looks like, what the kind filter does, and how limit behaves. It covers only the keyword-search concept, leaving a three-parameter search tool substantially underspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across three parameters, so the description carries the full burden and mostly fails it. Only the 'query' parameter is implied by 'by keyword'; the 'kind' enum (mcp/plugin/skill/cli) and the 'limit' bounds (1-30) are left entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a clear verb (search) and resource (local curated registry) plus the matching mechanism (keyword) and a mode qualifier (offline). This is enough to distinguish it from siblings like recommend_tools and plan_install, though it never names or contrasts them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no alternatives named. An agent must infer on its own whether to reach for search_tools versus recommend_tools or explain_tool; the only hint is the implicit 'find things by keyword' framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tooling_statusShow configured integrationsARead-onlyIdempotent
List MCP servers, plugins and skills configured for Claude Code and Codex, plus problems such as outdated servers or secrets written into config files.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Which client to recommend for. Defaults to the clients found on this machine. | |
| path | No | Project directory. Defaults to the server working directory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive behavior, so the safety profile is covered. The description adds real value beyond that by disclosing that the output includes detected problems (outdated servers, secrets in config files), which an agent would not infer from the schema or annotations. Auth and pagination details are absent but not critical for a local read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the resource list front-loaded; every clause earns its place. It is efficient, though the trailing 'plus problems...' clause slightly obscures the primary output.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so adequately (servers, plugins, skills, and detected problems). For a two-optional-parameter read-only inspection tool, this is nearly complete; only the report's structure and default host resolution are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (host, path) are documented with defaults and an enum in the schema itself. The description adds no syntax or format guidance beyond what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (List) and concrete resources (MCP servers, plugins, skills configured for Claude Code and Codex), and adds that it reports problems like outdated servers or leaked secrets. It is clearly distinguishable from action-oriented siblings (plan_install, recommend_tools), though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The framing as a diagnostic ('plus problems') implies you call it to inspect current state before acting, but there is no explicit when-to-use statement, no mention of the sibling tools that act on the results, and no stated prerequisites.
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.
5 tool updates
v0.1.0- First observed
explain_tool - First observed
plan_install - First observed
recommend_tools - First observed
search_tools - First observed
tooling_status
TDQS
Scored across 5 tools
Each tool has a clearly distinct role: recommendation, keyword search, per-entry explanation, environment status, and install preview. While search and recommend both surface tools, their inputs and outputs are distinct enough to avoid meaningful misselection.
Most names follow a verb_noun pattern in snake_case: recommend_tools, explain_tool, search_tools, plan_install. tooling_status is the one deviation, using a noun phrase rather than a verb, but it is still readable and consistent in casing.
Five tools is well-scoped for a local tooling advisor: search, recommend, explain, plan, and status each earn their place. The surface is neither thin nor bloated.
The set covers discovery, evaluation, install planning, and configuration status, which are the core workflows for an advisory MCP server. It intentionally omits applying installs or managing removal/update operations, which is a minor gap but consistent with its safety-focused design.
Maintenance
Related MCP Connectors
Find, compare, and audit software for AI agents. Scored registry of tools and MCP servers.
Agent-native catalogue of Baseframe Labs dev tools and MCP servers.
Verified component catalog over remote MCP: agents pick component ids and get a stamped project repo that builds. Connect at https://www.botkelp.com/mcp. Auth: MCP OAuth 2.1, or a Bearer bk_live_ API key; initialize and tools/list are open.
A registry of AI agent tools — MCP servers, APIs, CLIs, SDKs — kept current by automated ingestion.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenancePrivacy-first, read-only repo intelligence for AI coding agents: scans local codebases and recommends MCP servers, repos, and research without sending data to the cloud.1Apache 2.0
- AlicenseNot gradedqualityCmaintenanceLocal-first MCP server that provides project context, verification gates, and structured tools for coding agents to discover knowledge, run diagnostics, and execute allowlisted commands within a repository.33 npmMIT
- AlicenseNot gradedqualityAmaintenanceLocal repository intelligence MCP server that builds a reusable graph of code structure for AI coding agents, providing 34 network-free tools for understanding, searching, and analyzing repositories without data leaving the machine.49 npmMIT

wellwornofficial
FlicenseNot gradedqualityDmaintenanceProvides coding agents with verified recommendations, version-specific breakage traps, design systems, and installable skills over MCP, enabling safer stack and dependency decisions without requiring an API key.1-