A security-constrained MCP server that dispatches a unit of work to an allowlisted org-user/repo lane as typed tools (no arbitrary exec).
Four tools with clear security-focused design and good descriptions (avg 156 chars). All tools have input schemas with typed parameters and descriptions. However, output schemas are not documented in the source code, and error handling lacks recovery guidance. Tool naming follows verb_noun convention well (dispatch_unit, dispatch_status, dispatch_result, dispatch_list). No tool annotations (readOnlyHint/destructiveHint) present. Composition is sound, each tool has one responsibility and chains naturally (dispatch_unit → dispatch_status/dispatch_result → dispatch_list). Security boundary is well-articulated in docstrings but not enforced via schema constraints (e.g., no enum for orguser/repo validation).
List every dispatch this server has launched this session.
Return the structured result (exit code + detail) for a dispatched handle.
Return the structured status of a previously dispatched handle.
Dispatch a unit of work to an allowlisted org-user/repo lane. ``orguser`` and ``repo`` must resolve against the configured allowlist, and the repo must be owned by that org-user, or the call is rejected. The ``task_description`` is the brief for the lane; it is passed to a fixed dispatch command as data (never shell). Returns a handle to poll with ``dispatch_status`` / ``dispatch_result``.
Output schemas not documented. LLMs cannot infer what dispatch_unit, dispatch_status, dispatch_result, and dispatch_list return. Responses must include handle, status, exit_code, detail, and list structure, none are specified in tool definitions.
No tool annotations. dispatch_unit is destructive (WRITE risk) and should carry destructiveHint=true. dispatch_status, dispatch_result, dispatch_list are read-only and should carry readOnlyHint=true. Annotations guide agent planning and safety.
Error handling lacks recovery guidance. DispatchError is mapped to ToolError with str(error), but no guidance on retryability, user-fixable vs fatal, or next steps. E.g., 'Unknown orguser: try dispatch_list() to see available repos' would be actionable.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
dispatch_list description is vague (60 chars). Does it return handles, statuses, or full results? What fields? When should an agent call it? Expand to clarify structure and use case.
orguser and repo parameters lack validation constraints. Descriptions mention 'must resolve against allowlist' but no enum, pattern, or format is declared. LLMs cannot self-validate before calling.