MCP server that dynamically generates tools from OpenAPI specifications and enables calling REST APIs through the Model Context Protocol
OpenApiMcpNet exposes a single dynamically-generated tool that wraps OpenAPI endpoints. While the tool has a schema and basic description, it suffers from critical definition quality gaps: (1) The tool name 'dynamic_openapi_tools' or similar generic name does not follow verb_noun naming conventions and does not clearly indicate what action is performed; (2) The description 'Tools are dynamically generated from OpenAPI specification...' is present but generic and does not explain WHEN to use this tool or what its return format is; (3) The input schema groups parameters into high-level buckets (pathParameters, queryParameters, headerParameters, body) which is structurally sound but lacks per-parameter descriptions and type constraints at the leaf level, LLMs cannot reason about what each parameter does; (4) No output schema is documented, the tool returns serialized JSON responses from arbitrary OpenAPI endpoints, but there is no guidance on what fields to expect or how to extract data for downstream calls; (5) Error handling is minimal, exceptions are caught and returned as text with only the exception message, providing no recovery guidance or error classification; (6) The tool is overly generic and does not decompose OpenAPI operations into properly-named, individually-described tools that follow single-responsibility principle. The code shows schema building logic, but the resulting schemas lack descriptions at the parameter level and no output documentation exists.
Tools are dynamically generated from OpenAPI specification. Each endpoint in an OpenAPI spec becomes a callable tool with parameters extracted from path parameters, query parameters, headers, and request body schemas.
Tool name does not follow verb_noun convention and is too generic. 'Dynamic OpenAPI Tools' does not indicate the action (get, create, update, delete, search), LLMs cannot infer intent from the name alone.
Input schema lacks descriptions at the parameter level. Schema defines pathParameters, queryParameters, headerParameters, and body objects, but does not describe what each nested parameter controls. LLMs cannot reason about which parameters are required or what values they accept.
No output schema documented. The tool returns serialized JSON from arbitrary OpenAPI endpoints, but the description does not explain the response structure, which fields are present, or how to extract data for downstream tool calls. This violates the documented return types baseline (100% of A+ tools have them).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-21 | F | 27 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 21 | - | v1 |
Error handling is minimal and non-actionable. Exceptions return only the message text with no recovery guidance, error classification (retryable vs fatal), or suggestions for next steps. Pattern recovery-guide requires error responses to tell the LLM what to do next.
Tool is overly generic and violates single-responsibility principle. A single 'Dynamic OpenAPI Tools' wrapper exposes all OpenAPI endpoints without individual per-endpoint tool definitions. This forces the LLM to provide path, method, and parameters each time, rather than having dedicated get_user, create_ticket, search_issues tools with clear names and schemas.
Tool description does not explain WHEN to use it, what prerequisites exist, or what the likely return format is. At 127 characters, it stays within the 10-1024 range but lacks the actionable context needed for LLM selection. The description should state 'Calls OpenAPI-defined HTTP endpoints by passing path parameters, query parameters, headers, and request bodies. Returns JSON responses from the target API.'
No pagination support documented or implemented in the schema. If OpenAPI endpoints return lists, there is no guidance on limit, offset, or page parameters. Per the paginated-result pattern, tools returning lists should accept page/offset and limit parameters.