Typed MCP server for sandboxed agent ops (GitHub, Postgres, deploys, filesystem)
ops-mcp demonstrates solid definition quality with complete schemas, clear descriptions, and thoughtful security patterns. All 8 tools have explicit registrations with input schemas and docstrings. Naming follows verb_noun convention (fs_search, github_list_issues, postgres_query_readonly). Descriptions are substantive (100-200 chars typical) and explain prerequisites (e.g., 'Requires OPS_MCP_GITHUB_TOKEN'). Parameters are typed and mostly described. Key strengths: sandbox validation, dry-run defaults for writes, parameterized SQL. Gaps: output schemas not formally documented in code; error handling guidance sparse; some parameter descriptions could be more prescriptive about constraints.
Latest GitHub Actions workflow run for a branch (read-only).
Read a file under allowlisted roots with a hard size limit. Symlink and ``..`` escapes fail closed. Content is UTF-8 decoded with replacement characters; ``truncated`` is true when the file exceeded the cap.
Search allowlisted filesystem roots for a literal substring. Returns matches only under ``OPS_MCP_FS_ROOTS``. Paths that escape the sandbox (including via ``..`` or symlinks) are rejected.
Create a GitHub issue. Defaults to dry_run=True (no remote write). Set ``dry_run=False`` only when the user explicitly confirms creation. Never returns credentials.
List GitHub issues/PRs for a repo by state and labels. Requires ``OPS_MCP_GITHUB_TOKEN``. Returns number, title, state, labels.
Output schemas not formally documented. Tool descriptions state what is returned (e.g., 'Returns number, title, state, labels' for github_list_issues) but no structured schema definition is visible in code. LLMs cannot reliably parse unstructured responses or plan downstream tool chains.
Parameter constraints not fully specified. 'max_results' (fs_search) and 'per_page' (github_list_issues) lack min/max bounds in descriptions. 'state' (github_list_issues) accepts free-form string instead of enum (open|closed|all). LLMs may pass invalid values.
Error handling guidance absent. Tools return dict[str, Any] but no documentation of error response structure, recovery steps, or retryability. E.g., what does postgres_query_readonly return on SQL syntax error? How should the LLM respond?
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | <=2025-11-25 | v2 |
Summarize a PR's changed files and diff stats without full patches.
EXPLAIN (FORMAT TEXT) a SELECT without ANALYZE / executing side effects.
Run a parameterized SELECT against Postgres (DDL/DML rejected first). Requires ``OPS_MCP_DATABASE_URL``. Multi-statement and write SQL fail closed before any connection is opened.
github_pr_diff_summary and deploy_status descriptions are terse (70 chars). 'Summarize a PR's changed files and diff stats without full patches' lacks context on when to use vs. other GitHub tools, what fields are returned, or pagination behavior.
Pagination not explicitly documented. github_list_issues accepts 'per_page' but no mention of offset/cursor, total count, or how to fetch next page. Large result sets could exhaust context without clear pagination guidance.