All three tools are dynamically registered with generic descriptions that provide no actionable guidance for LLM tool selection. Tool names use verb_noun pattern (good), but descriptions are identical boilerplate stating 'Dynamically registered Convex [type] functions exposed as MCP tools', under 100 chars, failing to explain WHAT each tool does, WHEN to use it, or what it returns. No input schemas are visible in the provided source; tool definitions are inferred from configuration passed to createMCPServer(). The server provides no per-tool parameter descriptions, no output schema documentation, and no error handling guidance.
Dynamically registered Convex action functions exposed as MCP tools. Tool names and schemas are determined by the tools configuration passed to createMCPServer(). Each tool corresponds to a Convex action function reference.
Dynamically registered Convex mutation functions exposed as MCP tools. Tool names and schemas are determined by the tools configuration passed to createMCPServer(). Each tool corresponds to a Convex mutation function reference.
Dynamically registered Convex query functions exposed as MCP tools. Tool names and schemas are determined by the tools configuration passed to createMCPServer(). Each tool corresponds to a Convex query function reference.
Tool definitions are dynamically registered from config; no explicit schema definitions visible in source code.
All three tools share identical, generic descriptions (boilerplate ~80 chars) that fail to explain what each tool does, when to use it, or what it returns. Descriptions must be 10 - 1024 chars and answer: What? When? Why?
No output schema documentation visible. LLMs cannot plan downstream calls or extract required fields without knowing what each tool returns. Baseline: 100% of A+ tools have documented return types.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 40 | 2026-07-28+ | v2 |
No per-parameter descriptions visible. LLMs cannot infer parameter meaning from names alone. A 'status' param could mean HTTP status, project status, or boolean flag. Every parameter needs a description explaining what it controls.
No error handling guidance. Error responses must tell the LLM what to do next (e.g., 'User not found. Try search_users() first.'). Raw error codes or stack traces give agents nothing to act on.