Thin stdio MCP server for proxy facade and instance status resources. Lightweight FRP deployment and maintenance CLI with structured proxy management, audit logging, and MCP support for LLM-assisted operations.
frpdeck defines 10 tools with generally clear naming and reasonable descriptions. Most tools follow verb_noun conventions (add_proxy, remove_proxy, list_proxies). Input schemas are present for all tools with proper JSON Schema formatting, including enums, type constraints, and parameter descriptions. However, several issues limit the score: (1) descriptions are adequate but generic in places, lacking actionable recovery guidance for errors; (2) output schemas are documented in code but not visible in the provided excerpt, making full validation impossible; (3) error handling is present but doesn't follow the recovery-guide pattern consistently; (4) some parameter descriptions are minimal (e.g., 'Proxy name' for the 'name' param lacks context on valid formats or length); (5) the 'patch_spec' parameter in update_proxy is poorly constrained, it accepts arbitrary key-value pairs with no schema or validation hints; (6) tool composition is good overall, but instance_dir is required on every tool despite being repetitive, suggesting the server could benefit from context binding.
Add one structured proxy definition to proxies.yaml. Set protocol to tcp/udp/http/https. Use remote_port for tcp/udp. Use custom_domains and/or subdomain for http/https.
Disable a proxy in proxies.yaml.
Enable a proxy in proxies.yaml.
Get a single proxy by name from proxies.yaml.
Import one proxy definition from a local YAML file into proxies.yaml.
List proxies from proxies.yaml for an instance directory.
Preview rendered proxy outputs without mutating rendered/.
update_proxy's 'patch_spec' parameter is a free-form object with no schema constraints. This violates the constrained-input pattern, LLMs cannot infer which keys are valid, what types they accept, or what constraints apply. Risk: invalid patches cause silent failures or data corruption.
Parameter descriptions lack operational context. E.g., 'Proxy name' in get_proxy does not explain valid formats, length, character restrictions, or case sensitivity. Tool descriptions should follow the format guidance pattern and include 'The proxy name (alphanumeric, 1 - 50 chars, case-sensitive)' to prevent LLM guessing.
Error handling responses are not visible in the provided code excerpt, making it impossible to verify recovery guidance. If errors return raw stack traces or generic messages without suggesting next steps, this violates the recovery-guide pattern. Errors should be categorized (retryable vs user-fixable) and include actionable hints.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | <=2025-11-25 | v2 |
Permanently delete a proxy definition from proxies.yaml.
Return lightweight MCP diagnostic information for this server instance.
Apply a structured patch to an existing proxy.
Destructive operation (remove_proxy) lacks confirmation/dry-run support. The description states 'Permanently delete' but does not mention whether the agent can preview changes or request confirmation before execution. The confirmation-request pattern suggests offering a preview or dry-run step for irreversible operations.
Output schemas are not documented in the visible code. Each tool's return type (FacadeResult) is referenced but the actual structure (fields, types, nesting) is not shown in the excerpt. This violates the response-shaper pattern, LLMs cannot plan downstream tool calls without knowing what fields to expect.
instance_dir is required on all tools (except server_info). Repeating this parameter everywhere suggests the tool suite could be simpler if bound to an instance at server initialization time. Consider context binding to reduce parameter clutter.
list_proxies and preview_proxy_changes do not declare pagination (page, limit, offset) or total counts. If the proxy file contains hundreds of entries, returning all of them at once wastes tokens and risks context exhaustion. The paginated-result pattern recommends accepting limit/offset and returning metadata about total count and next_cursor.