Read-only MCP server exposing the workspace to planning chats
Workspace-mcp is a read-only tool suite with clear, consistent naming and solid descriptions. All 8 tools follow verb_noun patterns (list_, get_, read_) and have 50-100 character descriptions explaining purpose. However, most tools accept zero parameters (6 of 8), limiting schema complexity. The two parameterized tools (get_contract, read_repo_file) have proper type definitions and descriptions. No output schemas are documented, and error handling is minimal, tools catch broad exceptions but provide no recovery guidance. The server is well-engineered (strict mypy, ruff audit, pre-commit hooks) but lacks LLM-optimized error messages and pagination support for potentially large results.
Get the dependency graph output (consumer -> provider edges).
Get the contents of a specific contract file from the contracts/ directory.
Get the contract registry overview (docs/ai/CONTRACTS.md).
Get the behavior routing guidelines (docs/ai/ROUTING.md).
Get the contents of the system architecture map (docs/ai/SYSTEM.md).
List all machine-readable contract filenames in the contracts/ directory.
List all service repositories in the workspace with their roles.
No output schemas documented. LLMs cannot predict response structure, forcing them to guess at field names and types for downstream tool chaining.
No error recovery guidance. Broad exception catch in server.py (BLE001 noqa) returns errors to client but provides no actionable next steps (e.g., 'File not found in repo. Call list_repos() to see available repositories.').
No pagination support. list_repos, list_contracts, and dependency_graph may return unbounded results. Large workspaces could exhaust context windows. No limit parameter or cursor documented.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
Read the contents of a specific file inside a repository, sandboxed to that repo.
Parameter descriptions lack format/constraint details. 'relpath' in read_repo_file says 'Relative path to the file' but does not specify: allowed characters, max length, whether '..' traversal is blocked, or what happens if path is absolute.
No tool annotations (readOnlyHint, idempotentHint). All tools are read-only and safe to retry, but LLMs cannot infer this from the schema. Annotations would enable smarter retry logic.