MCP gateway and tool catalog management system with upstream service integration, endpoint routing, role-based access control, and data filtering
mcp-nexus exposes 7 tools for managing upstream tool catalogs and endpoint bindings. Tool names follow verb_noun convention (PullTools, ListEndpointTools, BindTool, etc.), which is positive. However, critical gaps undermine quality: (1) Input schemas are inferred from Go struct tags in the code but NOT explicitly visible as JSON Schema definitions in the tool registration layer. (2) Descriptions are present but generic and lack LLM-optimization guidance (e.g., 'Bind a tool from global catalog to an endpoint' does not explain WHEN to use it vs ListBoundTools). (3) No parameter descriptions visible in the source, only struct field names. (4) No documented output schemas. (5) Error handling returns raw database errors ('upsert update failed: ' + err.Error()) without recovery guidance. (6) No evidence of idempotency, pagination, or result limits. Per-tool scores average 42; most tools score 35-50 due to missing schema visibility and weak descriptions.
Bind a tool from global catalog to an endpoint. Tool name uniqueness within endpoint validated at application layer
Batch bind multiple tools from global catalog to endpoint. Deduplicates by tool name within batch and existing endpoint bindings; skips duplicates and returns skipped list
Return all endpoint-bound tools, deduplicated by (upstream_id, tool_name)
Return global tool catalog, joined with upstream names
Return endpoint's bound tool join view (tool name/description/schema/upstream)
Pull tools/list from upstream online, write to global tool catalog (upstream_tools), deduplicated by upstream_id + tool_name
Unbind a tool: hard delete binding row and cascade delete filter rules pointing to it
Input schemas not explicitly visible in tool registration. Go struct tags (e.g., `json:"upstream_tool_id"`) are inferred but not exposed as formal JSON Schema with type/description metadata. Cannot verify schema completeness.
Parameter descriptions missing. Input structs (e.g., `upstream_tool_id`, `endpoint_id`) have no descriptions explaining what they control, valid ranges, or format constraints. LLMs cannot infer parameter semantics from names alone.
Output schemas not documented. Tools return JSON responses (e.g., `{"pulled": len(tools)}`, tool view objects) but no schema is declared. LLMs cannot plan downstream calls or extract required fields.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 39 | <=2025-11-25 | v2 |
Error responses lack recovery guidance. Errors return raw database messages ('upsert update failed: ' + err.Error()) without actionable next steps. LLMs cannot self-correct or retry intelligently.
Tool descriptions are generic and lack LLM-optimization. Descriptions like 'Return endpoint's bound tool join view' (27 chars) do not explain WHEN to use this tool vs ListBoundTools, what prerequisites exist, or what the response structure is. Baseline: 194 chars average for A+ tools.