MCP Server for Sapling SCM - A Node.js implementation demonstrating custom tools integration
Server has 17 tools with complete Zod schemas and basic descriptions. However, descriptions are uniformly terse (10-40 chars), parameter descriptions lack context about constraints/formats, and output schemas are undocumented. No error recovery guidance, no idempotency hints, and no distinction between read-only and destructive operations in descriptions. Tool names follow verb_noun convention but lack clarity on mutual exclusivity (e.g., sapling_diff_untracked vs sapling_diff_changed vs sapling_diff_target). Schemas are present but minimal, no enums, ranges, or format constraints. This is typical community-grade work: functional but not LLM-optimized.
Add untracked files to the repository
Create or navigate to a bookmark
Create a commit with a message and optional files
Show staged/changed files in the repository
Show diff with a target revision
Show untracked/unknown files in the repository
Navigate to a target revision
Descriptions uniformly terse (10-40 chars). Rubric baseline is 194 chars avg; 94% of A+ tools have 50-200 char descriptions. Current descriptions lack WHEN to use, prerequisites, and return value hints. Example: 'Get repository status' tells LLM nothing about when to call it vs other status tools.
No output schemas documented. Rubric requires 100% of A+ tools to have documented return types. LLMs cannot plan downstream calls or extract fields without knowing response structure. All 17 tools return generic text content with no field definitions.
No error recovery guidance. Rubric pattern:recovery-guide requires errors to tell LLM what to do next. Current code throws generic 'Command failed with code X' with no actionable next step. LLM cannot self-correct or retry intelligently.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 43 | 2026-07-28+ | v2 |
Initialize a new Sapling repository
Land a pull request using ghstack
Show commit history with configurable max count
List pull requests using ghstack
Push changes using ghstack submit
Revert all changes in the repository
Show details of a specific revision
Show smart log of commits
Get repository status
Open web interface for the repository
Destructive operations (sapling_commit, sapling_revert, sapling_push, sapling_land) lack confirmation/dry-run support. Rubric pattern:confirmation-request requires irreversible ops to support confirmation. Agents can accidentally commit or push without safeguards.
Three diff tools (sapling_diff_untracked, sapling_diff_changed, sapling_diff_target) have overlapping names and unclear distinctions. Rubric requires 'get_channel_metadata' vs 'get_channel_messages' clarity. LLMs will conflate these and pick wrong tool.