A toolkit for product analysis including impact sizing, web browsing, and sales data parsing capabilities
This server exhibits significant definition quality gaps across multiple dimensions. Tool naming is inconsistent (verb_noun not uniformly applied; 'web_browser_*' tools are compound actions). Parameter descriptions exist but lack specificity about constraints, formats, and ranges. Critically, output schemas are entirely undocumented, we see function signatures but no declared return types or structured response documentation. Error handling is absent: no recovery guidance, categorization, or actionable feedback. The server mixes Python (impact-sizing) and JavaScript (web-browser) with no unified definition or composition story. No tools declare destructive/read-only intent (despite marked risks), no idempotency guarantees, and security is not addressed (files written to arbitrary paths, no access control visible).
Create an impact sizing Excel workbook from collected data.
Parse churn data spreadsheet to find feature-related churned customers.
Parse a pasted table (from Confluence, Slack, etc.) into a DataFrame. Handles pipe-delimited, tab-delimited, and common table formats.
Parse a Salesforce closed sales export and extract feature-related data.
Evaluate JavaScript code in the current browser tab
Navigate to a URL in the current tab or open in a new tab
Interactively pick and inspect elements from the current browser tab
No output/return schemas documented. Impact-sizing tools return dicts with inconsistent structure (e.g. parse_salesforce_export returns 'feature_deals' array with nested objects, but no schema tells the LLM what fields to expect). Web-browser tools have no visible return type at all. LLMs cannot plan downstream tool calls or extract the right data.
Web-browser tools (navigate, screenshot, evaluate, pick, start) have input schemas inferred only from brief parameter names in descriptions. No explicit JSON Schema with type declarations visible. Caps each at 50 per inferred-tool rule. 'web_browser_pick' message parameter description is generic: 'Instructions for what elements to pick', lacks format, length, examples of valid instructions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 39 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Take a screenshot of the current browser tab
Start Chrome browser with remote debugging port
No error handling or recovery guidance. Functions like parse_salesforce_export return error dicts on column detection failure ('error': 'Could not find amount/ARR column') but offer no hint to the LLM about what to do next (e.g., 'Try passing a file with standard Salesforce export columns: Amount, Stage, Reason'). LLM receives a failure signal with no actionable next step.
Missing parameter constraints and validation documentation. 'feature_keywords' is documented as 'List of keywords' but lacks guidance on min/max length, case sensitivity, regex support, or what happens if the list is empty. 'file_path' has no validation: can LLM pass absolute paths, relative paths, symlinks? Can it escape with '../'? No documented constraints invite path-traversal vulnerabilities.
Compound tool names in web-browser group suggest multiple responsibilities per tool. 'web_browser_start' + 'web_browser_navigate' + 'web_browser_screenshot' could be orchestrated by a single 'web_browser' tool or split into more atomic pieces. Current naming ('web_browser_*') makes it unclear which tools interact with which browser state (are they sequential? concurrent? Does screenshot require navigate first?).
parse_pasted_table returns a pandas DataFrame to the LLM, but a DataFrame is a Python object with no serialized JSON representation visible. LLMs cannot reason about Python objects, this tool needs to return structured JSON (array of objects or a dict with column names and rows).
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) visible. Risk column marks 'create_impact_sizing_workbook' as WRITE and others as READ_ONLY, but this is metadata NOT in the tool schemas. LLM cannot see these hints and may treat a destructive tool as safe to retry.
No pagination or result limits. If a Salesforce export has 10,000 closed-lost deals, parse_salesforce_export returns ALL of them in the feature_deals array. This blows the context window and invites hallucination. Tool description should state: 'Returns up to 100 feature-related deals; use offset/limit for pagination.' No such limits are visible.
Tool definitions not visible in a formal MCP registry or schema file. Tool names and parameters are hardcoded in Python/JS function signatures, making it difficult for an MCP client to discover capabilities without parsing source code. No tools.json, schema.mcp, or similar declarative definition found.