MCP server exposing project writing analysis functionality (readability, grammar, token counting, completeness checking) to AI assistants via stdio transport
bito-lint is a writing quality analysis tool with 8 well-structured tools. All tools have descriptions and appear to have input schemas defined via schemars. Naming is consistent (verb_noun pattern: get_*, check_*, count_*, analyze_*, lint_*). However, critical gaps exist: (1) No visible output schema documentation, the response structure for each tool is not shown in the code provided, making it impossible to verify what fields agents can extract. (2) Parameter descriptions are present but generic in places (e.g., 'The text to analyze' lacks guidance on length limits or expected format). (3) No error handling strategy visible, what happens if text exceeds tokenizer limits, if grammar check fails, or if a template is invalid? (4) Tool composition is strong (eight single-purpose tools, good chaining potential), but missing context for agent use (e.g., should analyze_writing be called before lint_file? Are there dependencies?). The tools are domain-appropriate and address a clear set of lint concerns (readability, grammar, completeness, tokens), but lack the production-grade polish of error recovery guidance and output schema declaration.
Comprehensive writing analysis covering readability, grammar, style, and language issues.
Check document sections against a template. Returns validation results for required sections.
Analyze grammar and passive voice. Returns issues and passive voice statistics.
Check readability of text. Returns Flesch-Kincaid grade level and statistics.
Count tokens in text. Returns token count and optional budget check. Supports 'claude' (default, conservative) and 'openai' (exact cl100k_base) backends.
Retrieve resolved custom content by name.
Get project name, version, and description
Output schemas are not documented. Tool descriptions state WHAT tools do, but agents cannot see what fields to extract from responses (e.g., does check_readability return {grade_level, token_count, sentences}? The response structure is opaque.
analyze_writing accepts a 'checks' parameter described as 'comma-separated', but no enum is provided. Agents cannot know valid values (readability? grammar? style? all-of-above?). Free-form strings invite hallucinated check names.
check_completeness accepts 'template' with three values (adr, handoff, design-doc), but the description does not explain what each template validates. Agents cannot reason about which template to choose for a user's document.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 55 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 37 | - | v1 |
Lint a file with all checks configured in project settings.
No error handling strategy documented. What happens if text exceeds tokenizer limits for count_tokens? If grammar check encounters unparseable content? If a file_path points to a non-existent file? Agents cannot predict recovery steps.
lint_file accepts file_path for rule matching, but how does rule matching work? Are rules based on file extension, content patterns, or explicit config? Agents cannot reason about what rules will apply.
analyze_writing offers a 'dialect' enum (en-us, en-gb, en-ca, en-au) but no guidance on what spelling differences each enforces. Agents cannot choose the right dialect without explanation.
check_readability and analyze_writing both accept 'max_grade' and 'passive_max' as numeric parameters with no range constraints (e.g., is max_grade 0 - 18? 1 - 16?). Agents can pass invalid values like max_grade=1000.
No composition guidance. analyze_writing covers 'readability, grammar, style, and language issues', does this overlap with check_readability, check_grammar, and lint_file? When should an agent call analyze_writing vs the individual checks? Agents must guess.