A syntactic dependency parser server that performs part-of-speech tagging and syntactic parsing using Google's Parsey McParseface model via SyntaxNet
This server exposes only one tool (parse_sentence) with a minimal, non-idiomatic interface. The tool name lacks a clear action verb prefix (should be 'parse_sentence', which it is, but the description is vague about intent and scope). The input schema is present but extremely sparse, only a single string parameter with no constraints, range limits, or format guidance. The description is short (79 chars) but lacks critical context about prerequisites, error conditions, output structure, and when to use this tool vs. alternatives. No output schema is documented anywhere in the code; the function returns a complex nested structure (tokens[0] with a 'tree' key containing recursive token objects) that an LLM must infer from code inspection. The server performs READ_ONLY operations but has no READ_ONLY or idempotent tool annotations. Error handling is minimal, a ValueError is raised for newlines but never caught or formatted for the LLM; the Flask route has no try/catch. The implementation uses a custom HTTP transport (Flask) not aligned with MCP's Streamable HTTP standard, and the server is not a proper MCP server at all, it's a raw Flask app that does not implement the MCP protocol.
Parses a sentence using part-of-speech tagging and syntactic dependency parsing. Returns a tree structure with tokens and their syntactic relationships.
Tool not an MCP server at all, Flask HTTP app with no MCP protocol implementation
No output schema documented; complex nested structure (tokens with 'tree' field, recursive dependencies) left for LLM to infer from code
Input schema is trivial, single string param with no type constraints, format guidance, length limits, or handling of edge cases (what happens with very long sentences?)
Description too generic and vague (79 chars); does not explain WHEN to call this vs. other NLP tools, what output structure to expect, or what dependency parsing returns
No error handling or recovery guidance; ValueError on newlines is silent (not caught), LLM receives only raw Flask 500 error with no actionable next step
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 34 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 36 | - | v1 |
No tool annotations (readOnlyHint); LLM cannot distinguish safe vs. unsafe tools despite this being READ_ONLY
Subprocess-based implementation (parser_eval via Popen) is fragile; no timeout, no graceful degradation, no health checks
Multiprocessing pool (Pool(1)) suggests concurrency concerns but no request routing, rate limiting, or queue management visible