Expose local MCP servers to remote clients without opening ports.
Two tools with minimal schemas and descriptions. Both tools have empty input schemas (no parameters), which is appropriate for their use case. Descriptions are present but generic and lack actionable context. Tool annotations are correctly applied (readOnlyHint, idempotentHint). No parameter descriptions needed since inputs are empty. Error handling is basic, returns text responses with isError flags but lacks recovery guidance. The 'status' tool dynamically generates its description based on connection state, which is clever but makes static validation difficult. Overall, this is a functional but minimal implementation typical of relay/proxy servers.
Restart all local MCP server processes on connected agents. Useful if a server is stuck or you've changed its configuration.
Show tunnel status. Currently connected: [device names] or No agent is currently connected.
Descriptions lack actionable context. 'Show tunnel status' and 'Restart all local MCP server processes' do not explain WHEN to use these tools, what prerequisites exist, or what the LLM should expect in the response. Per pattern:tool-description, descriptions should state WHAT, WHEN, and any prerequisites.
Error responses lack recovery guidance. When 'restart' fails with 'No agent is currently connected', the response does not suggest next steps (e.g., 'Start an agent with: npx mcp-local-tunnel'). Per pattern:recovery-guide, errors must tell the LLM what to do next.
No output schema documentation. The 'status' tool returns JSON with 'connected' and 'devices' fields, but this structure is not formally documented. LLMs cannot plan downstream actions without knowing the response shape. Per pattern:tool, output schemas must be documented.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
Tool names lack action verbs. 'status' and 'restart' are nouns/imperative verbs but do not follow verb_noun convention (e.g., 'get_status', 'trigger_restart'). Per naming baseline, 90% of A+ tools start with action verbs like get, list, create, search, update.
Dynamic description generation for 'status' tool makes static validation and discovery difficult. The description changes based on runtime connection state, which is clever but prevents clients from caching tool metadata and complicates LLM planning.