A hosted, stateless MCP server on HTTP — deploy and feature-flag control, with approval gates. A demonstration of building on Frey.
Switchboard demonstrates solid fundamentals: all 4 tools have clear verb-noun names (list_, get_, set_, deploy), explicit JSON schemas with required fields and descriptions, and thoughtful error handling with recovery guidance. Descriptions are concise (20-80 chars) and state what each tool does. However, parameter descriptions lack detail on constraints (e.g., 'service' and 'flag' accept any string with no validation hints), output schemas are not formally documented, and approval-gated tools lack explicit dry-run or confirmation patterns in the schema itself. The code shows strong intent (NeedsInput pattern, approval gates, literal action display) but the tool definitions alone do not fully capture these safeguards.
Deploy a version of a service to production. Requires human approval.
Read one feature flag's current value.
List every service, its deployed version, and its feature flags.
Turn a feature flag on or off in production. Requires human approval.
Parameter descriptions lack validation constraints. 'service' and 'flag' accept any string; no guidance on valid formats, length limits, or character restrictions. LLMs cannot infer constraints from names alone.
Output schemas not formally documented. list_services returns structured JSON but the schema is inferred from code, not declared in ToolDefinition. Downstream tools cannot rely on documented field names.
Approval-gated tools (set_flag, deploy) require human input but this is not reflected in the schema. The NeedsInput pattern is implemented in code but invisible to the LLM at definition time. Consider adding a note in descriptions or tool annotations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) declared. list_services and get_flag are read-only; set_flag and deploy are destructive. Annotations would help LLMs reason about safety and retry logic.
Error messages in code are rich (guide, suggest fields) but tool definitions do not document error cases or recovery paths. LLMs see only the schema, not the error handling logic.