0.0 / 30
What changed in the harness
Selection accuracy 100→100, token cost down 9%, unconfirmed writes 0%→0%.
Category breakdown
Where the score comes from.
Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.
01Safety
02Legibility
21.4 / 30
03Economics
15.9 / 20
04Discoverability
12.4 / 20
Highest-impact fix
Estimated gain +30 pointsAdd explicit identity and permission preflight tools
Expose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.
Description evidence
Defects and rewrites.
18 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.
| Tool | Defect types | Suggested rewrite |
|---|---|---|
list_technologies |
no_return_description |
Returns all available technology IDs grouped by category, optionally filtered by a category (frontend, backend, meta-framework, database, orm, auth, hosting, payments, cms). Use this first to discover valid technology IDs before calling analyze_tech or compare_techs. |
analyze_tech |
no_return_description |
Returns a detailed analysis of a technology, including 6-dimension scores (Developer Experience, Performance, Scalability, Security, Ecosystem, Cost), strengths, weaknesses, and compatible technologies. Use a technology ID from list_technologies (e.g., nextjs not Next.js); context selects the scoring basis (default, mvp, enterprise). |
recommend_stack_demo |
params_unexplained |
Returns a recommended tech stack for a project: the optimal technology for each category (frontend, backend, database, etc.) with a score and grade, based on 100% deterministic scoring (no AI hallucinations). projectType is the type of project being built (web-app, mobile-app, api, desktop, cli, library, e-commerce, saas, marketplace) and scale is the project size (mvp, startup, growth, enterprise). |
recommend_stack |
name_restates_behavior params_unexplained no_return_description |
Returns a recommended tech stack for a project using real-time scoring with context adjustments, giving the optimal technology per category with scores and rationale. Use projectType to select the type of project (web-app, mobile-app, api, desktop, cli, library, e-commerce, saas, marketplace), scale for project size, priorities to rank the top 3 factors to optimize (max 3), and constraints for any project constraints. Prefer this over recommend_stack_demo when you need priority-based scoring. |
get_blueprint |
no_return_description |
Fetches an existing blueprint by ID and returns the saved blueprint data (the technology stack configuration created via create_blueprint or the StacksFinder web UI). Provide the blueprintId as the blueprint UUID. |
create_blueprint |
params_unexplained |
Creates a new tech stack blueprint for a project. projectName is an optional label for the blueprint and projectType is the type of project to generate a stack for (web-app, mobile-app, api, desktop, cli, library, e-commerce, saas, marketplace). Blueprint generation is asynchronous: by default the tool waits for completion and returns the full blueprint, or set waitForCompletion=false to get the job ID immediately for manual polling. Optional inputs include scale, projectDescription, priorities (top 3), and constraints (max 20 technology constraint IDs). |
setup_api_key |
no_return_description |
Authenticates with your StacksFinder account using email/password and returns a newly created API key. Provide your StacksFinder account email, password, and an optional keyName label. Verify the key with list_api_keys; for ChatGPT OAuth users, prefer create_api_key instead. |
list_api_keys |
name_restates_behavior no_return_description |
Returns all of your StacksFinder API keys so you can verify which keys exist. Requires a configured API key. |
revoke_api_key |
name_restates_behavior no_return_description |
Permanently invalidates the API key with the given keyId UUID so it can no longer be used for authentication, and returns the revocation result. This action cannot be undone, so only revoke keys you no longer need. |
create_api_key |
no_return_description |
Creates a new API key using OAuth authentication (preferred for ChatGPT users; ChatGPT Actions handles authentication automatically) and returns the generated key. Requires a Pro or Team subscription. The key is shown only once, so save it securely; verify it with list_api_keys. keyName is an optional label for the key. |
list_audits |
name_restates_behavior no_return_description |
Returns your audit reports with pagination, showing each report's name, status, health score, and creation date. Use limit (max results) and offset (pagination offset) to page through the list. |
compare_audits |
no_return_description |
Returns a comparison of two audit reports to track technical debt trends over time, including new issues introduced, issues resolved, and health score change. Provide the older audit as baseAuditId and the newer audit as compareAuditId; useful for measuring progress on debt reduction. |
get_audit_quota |
no_return_description |
Returns your remaining audit quota for this month so you can determine how many more audits you can run. |
generate_mcp_kit |
no_return_description |
Returns a complete project kit based on your project description, including an optimal tech stack for each category (frontend, backend, database, auth, hosting, payments), AI-assistant MCP recommendations tailored to those technologies, and ready-to-use install configurations for Claude Desktop, Cursor, and Windsurf. Provide a projectDescription (50-5000 chars); priorities, constraints, projectType, and scale are optional to shape the result. |
analyze_repo_mcps |
no_return_description |
Returns an analysis of your repository: it detects the tech stack (frontend, backend, database, auth, hosting, payments), finds already installed MCP servers, recommends new MCPs that would enhance your workflow, and generates ready-to-use install configurations for Cursor, Claude Desktop, and Windsurf. includeInstalled controls whether already installed MCPs are included; workspaceRoot and mcpConfigPath override the repo/config paths. |
prepare_mcp_installation |
no_return_description |
Returns a generated .env-mcp configuration file for MCP server installation after analyzing your repository's tech stack. The file contains INSTALL_xxx flags to control which MCPs to install, required and optional environment variables for each MCP, and documentation links/examples. After filling in the credentials and adjusting flags, run execute_mcp_installation to complete setup. workspaceRoot, mcpConfigPath, and envMcpPath (default .env-mcp in workspaceRoot) control paths; includeInstalled includes already installed MCPs. |
get_workflow_guide |
no_return_description |
Returns a workflow guide recommending the next StacksFinder tool to use based on your goal and context, with adapted snippets for your client. current_goal selects the goal (discover, setup_api_key, get_recommendation, audit_project, migrate_stack, install_mcp, compare_techs, create_blueprint); completed_tools, user_tier, known_constraints, and context refine the recommendation. |
get_estimate_quota |
no_return_description |
Returns your remaining estimate quota for the current week and month, reporting the amount of quota still available in each period. |
Selection evidence
Confusable tool pairs.
11 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
recommend_stack_demo |
recommend_stack |
high | A generic request like 'recommend a tech stack for my SaaS' maps to both tools; one is the quick demo and the other the full real-time version, and nothing in the user's wording forces either, so an agent may return only the demo. |
setup_api_key |
create_api_key |
high | Both tools exist to create/get an API key and both open with 'creates a new API key', differing only by auth method (email/password vs OAuth). A task like 'create an API key for me' gives no basis to pick one. |
get_audit |
get_audit_quota |
medium | 'Get my audit' is ambiguous between fetching the audit report (get_audit) and checking how many audits remain (get_audit_quota); a request like 'check my audits/how many audits do I have left' closely matches both. |
get_audit_quota |
get_estimate_quota |
medium | Both are empty-input quota checkers with nearly identical descriptions ('check your remaining quota'), so a natural request like 'check my remaining quota' genuinely doesn't reveal whether audit or estimate quota is meant. |
prepare_mcp_installation |
execute_mcp_installation |
medium | 'Set up/install MCPs for my project' maps both to the prep step (generate .env-mcp) and the execution step (generate install commands); an agent asked to 'install MCPs' may pick execute directly or stop at prepare. |
generate_mcp_kit |
prepare_mcp_installation |
medium | Both generate ready-to-use MCP install configurations for Claude Desktop, Cursor, and Windsurf from a project context, so a task like 'generate MCP setup/configs for my project' is ambiguous about which generator is intended. |
analyze_tech |
compare_techs |
medium | A request phrased as 'analyze React vs Vue' or 'analyze these technologies' uses the verb 'analyze' but requires compare_techs (2-4 technologies); an agent may instead route to analyze_tech, which scores a single technology. |
create_audit |
get_audit |
medium | 'Get me an audit of my stack' is ambiguous between creating a fresh technical-debt audit and fetching an existing report by ID; both definitions center on 'audit report', so either is a plausible pick. |
get_audit |
list_audits |
low | A user asking 'get my audits/show my audit reports' without supplying a UUID could route the agent to get_audit (which requires an ID) instead of list_audits; the shared 'audit report' wording blurs the intent. |
generate_mcp_kit |
execute_mcp_installation |
low | Both generate MCP installation commands/configs, so a task like 'generate the MCP install for my project' could pick either; only the .env-mcp prerequisite in execute_mcp_installation's description disambiguates them. |
analyze_tech |
analyze_repo_mcps |
low | 'Analyze my project/stack' is ambiguous between analyzing a single technology ID (analyze_tech) and scanning the repo to recommend MCP servers (analyze_repo_mcps); only the repo-vs-single-tech detail separates them. |
Compare the field