Co-Op is a local-first business software platform with cloud license control plane backend and desktop/web application frontend. The backend manages license activation, heartbeat tracking, and user provisioning. The desktop/web application provides business tools including runway calculators, pitch deck analysis, cap table modeling, investor tracking, and market research alerts.
This MCP server exhibits significant definition quality gaps. While three tools are defined with names and some schema structure, the implementation shows critical issues: (1) Tool definitions appear inferred from Rust code rather than explicit MCP registration, only the file location is provided, not the actual tool registration code; (2) Descriptions are present but generic and lack LLM-optimization guidance; (3) Input schemas are partially visible but lack rigor in parameter validation and error recovery; (4) No output schemas are documented; (5) Error handling is absent from tool definitions. The server targets research/investment analysis (alerts, pitch deck review) but does not demonstrate production-grade tooling patterns. The 'analyze_pitch_deck' tool accepts file uploads without explicit validation guidance, and 'run_alert_now' lacks pagination or result limiting documentation.
Analyze a pitch deck (PDF, PPTX, TXT, or Markdown) and return investor-grade critique including score, verdict, slide-by-slide feedback, missing evidence, diligence risks, and rewrite checklist
Execute a saved alert immediately and fetch research results for the alert query
Save a research alert (watchlist item) with name, query, and cadence (daily/weekly/manual)
Tool definitions are inferred from source code location, not explicitly visible in tool registration. Only file path provided (frontend/src-tauri/src/tools.rs); no actual MCP tool registration manifest shown.
No output schemas documented for any tool. Pattern:tool-chain and pattern:response-shaper require clear output structure so downstream tools and agents can chain calls. E.g., save_alert must return alert_id; run_alert_now must return result structure with fields for downstream use. Without this, agents cannot compose tools.
analyze_pitch_deck accepts base64-encoded file uploads without documented validation, size limits, or error recovery guidance. Pattern:tool-gateway and pattern:tool-description require explicit constraints: max file size, supported MIME types (PDF, PPTX, TXT, Markdown), encoding format details. Current description 'Base64-encoded file content (data URL format supported)' is too vague, what if encoding is invalid? What is the max size before rejection?
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 48 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 51 | - | v1 |
run_alert_now lacks pagination and result limiting documentation. Pattern:paginated-result requires list-returning tools to accept limit/offset and return total count. Current description 'Execute a saved alert immediately and fetch research results' does not specify: max results returned, pagination support, or what 'research results' structure contains. This invites context window exhaustion.
All three tools lack error handling recovery guidance. Pattern:recovery-guide requires error responses to tell the LLM what to do next. E.g., if save_alert fails due to duplicate name, respond with 'Alert name already exists. Try searching existing alerts first.' No such guidance is present in descriptions or inferred from schema.
Parameter 'cadence' in save_alert is an enum (daily/weekly/manual) but description does not explain WHEN to use each. Pattern:tool-description requires: 'Write descriptions as if prompt-engineering. State WHAT the tool does, WHEN to use it, and any prerequisites.' The enum alone is insufficient for LLM selection. Add context: 'daily: check every 24 hours; weekly: every 7 days; manual: user-triggered only.'
Parameter 'deck_notes' in analyze_pitch_deck lacks guidance on format and content. Description is generic: 'Founder notes about the deck'. LLMs cannot infer: Is this free-form text? Maximum length? Should it include company stage, funding goal, business model? Pattern:tool-description requires explicit format hints. Add: 'Free-form text (max 2000 chars) summarizing company stage, funding goal, key risks, and unique value prop.'