A file-backed content server that exposes documents to AI agents via the Model Context Protocol (MCP)
Stash-MCP demonstrates strong tool definition discipline with comprehensive schemas and consistent descriptions across 16 tools. All tools follow verb_noun naming conventions (list_, read_, create_, edit_, delete_, move_, search_, commit_, abort_, log_, diff_, blame_). Every tool has a non-empty description (average ~100 chars) and explicit input schemas with parameter descriptions. However, output schemas are not documented in tool definitions, and error handling lacks actionable recovery guidance. The semantic search tool (search_content) and transaction management tools are well-designed but would benefit from clearer error categorization and per-parameter constraints (enums for revision specs, ranges for limits). Overall, this is a solid B+: above the 60-69 median but below A-grade (80+) due to missing output documentation and incomplete error context.
Abort the current transaction and discard all pending changes.
Show line-by-line authorship and last-modified date for a file using git blame.
Commit and persist all changes made in the current transaction. Requires a commit message.
Create a new file. Parent directories are created automatically. Call start_content_transaction before using this tool if transactions are active, then commit_content_transaction to persist the changes.
Delete a file. Requires the current SHA for safety. Call start_content_transaction before using this tool if transactions are active, then commit_content_transaction to persist the changes.
Show the diff (unified format) between two commits or between a commit and the working tree for a file.
Output schemas not documented in tool definitions. LLMs cannot plan downstream operations or extract chaining IDs (e.g., file paths returned by move_content, or search result structure). Every tool should declare its return type and key fields.
Error handling lacks actionable recovery guidance. When a tool fails (e.g., 'file not found', 'invalid SHA', 'transaction conflict'), the error message should tell the LLM what to do next: 'File not found. Try list_content() to verify the path.' Current descriptions mention transactions but do not provide error context or retry logic.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 67 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 42 | - | v1 |
Apply targeted string replacements to a file. Requires the current SHA for safety. Call start_content_transaction before using this tool if transactions are active, then commit_content_transaction to persist the changes.
Apply multiple edits to one or more files in a batch. All edits are applied atomically (all succeed or all fail). Requires current SHA for each file. Call start_content_transaction before using this tool if transactions are active, then commit_content_transaction to persist the changes.
List content files and directories at path, optionally recursively
Get the git commit history of a file, showing commits, dates, and authors.
Move or rename a file. Call start_content_transaction before using this tool if transactions are active, then commit_content_transaction to persist the changes.
Move or rename multiple files in a batch. All moves are applied atomically (all succeed or all fail). Call start_content_transaction before using this tool if transactions are active, then commit_content_transaction to persist the changes.
Overwrite a file's full content. Requires the current SHA for safety. Call start_content_transaction before using this tool if transactions are active, then commit_content_transaction to persist the changes.
Read a file's full content, with optional line limit for large files
Search content by meaning using semantic embeddings. Returns ranked snippets with file paths and locations.
Begin a write transaction. All create/edit/overwrite/move/delete calls must be wrapped in a transaction and committed with commit_content_transaction. Idle transactions are auto-aborted after a timeout.
Revision parameters in diff_content (rev1, rev2) lack enum constraints or format specification. Should document: 'Valid formats: commit hash (40 hex chars), branch name (e.g., main, develop), or HEAD. Omit rev2 to compare against working tree.'
Numeric limits for max_lines (read_content) and max_results (search_content) lack upper bounds. Should specify: 'min=1, max=10000' to prevent resource exhaustion. Current description only states minimum=1.
Mutation tools (create_content, edit_content, delete_content, move_content) do not declare idempotence or offer dry-run/confirmation patterns. Given the destructive risk (delete, overwrite), consider adding a 'confirm' boolean flag or a separate preview_edit tool to show changes before commit.
Transaction semantics not fully explained in descriptions. The note appended to write-tool descriptions (starting with 'Note: this server gates writes...') is cut off in the source. Clarify: When is a transaction required? What happens if a write is called outside a transaction? What is the timeout for idle transactions?