Dynamic MCP server that creates HTTP request tools from YAML configuration. Allows registering and executing arbitrary HTTP endpoints as MCP tools with dynamic parameter binding.
This server exposes a single tool 'dynamic' that is a generic wrapper for HTTP requests. While the implementation uses fastmcp correctly, the tool definition itself violates fundamental MCP patterns. The tool name 'dynamic' is vague and does not start with an action verb. The input schema uses a catch-all 'dynamic_parameters' object with no type information, property definitions, or per-parameter descriptions. The tool description mentions that parameters 'can include' path_params, query_params, and body_params but provides no structured schema for these. LLMs cannot infer what this tool actually does from the name alone, and cannot validate inputs because there are no constraints. This is a proxy pattern that trades discoverability and type safety for configuration flexibility, a poor tradeoff for agent use. The tool is essentially a pass-through that forces agents to reason about HTTP semantics rather than domain operations.
Tools are dynamically created from config.yaml. Each tool in the config becomes a registered MCP tool with HTTP request capabilities. Tool names, descriptions, parameters, and HTTP endpoints are defined in the YAML configuration file.
Tool name 'dynamic' is generic and does not start with an action verb. LLMs cannot infer intent from the name alone. Should be named after the domain action it performs (e.g., 'fetch_api_data', 'call_endpoint', 'send_request') or tools should be registered with individual names from config.yaml.
Input schema uses untyped catch-all 'dynamic_parameters' with no structured properties. Per MCP spec, every parameter must have a type (string, integer, number, boolean, array, object) and description. The current schema has type 'object' with generic description but no 'properties' field, making it impossible for agents to validate inputs or understand what parameters are valid for a given configuration.
Tool description is 169 characters and describes the configuration loading mechanism rather than what the tool does from an agent's perspective. It does not explain: (1) WHEN to use this tool vs calling the API directly, (2) WHAT the output will be, (3) what common use cases are supported. Description should be LLM-optimized, stating the action, expected result, and prerequisites.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 27 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 21 | - | v1 |
No output schema documented. The tool returns 'resp.text' (raw HTTP response body as string), but agents have no way to know the structure of this text. Is it JSON? XML? Plain text? Should agents parse it? This violates the pattern that all tools must document output structure so LLMs can extract data and plan downstream calls.
No error handling or recovery guidance. The code calls 'resp.raise_for_status()' which will raise an exception on HTTP 4xx/5xx, but the MCP layer does not catch this or provide actionable error messages. Agents receive raw exceptions with no guidance on what went wrong, how to fix it, or whether to retry.
Parameters are loaded from config.yaml but not exposed in the input schema. The schema description says 'Parameters are dynamically defined per tool in config.yaml' but the actual schema properties field is missing. Agents cannot see what parameters a specific tool instance accepts without inspecting the config file manually.
No idempotency or side-effect declarations. The tool can execute GET (read-safe) or POST/PUT/DELETE (write/destructive) operations, but there is no way to mark which is which. MCP tool annotations (readOnlyHint, destructiveHint) should declare this, and tool descriptions should warn agents when calls have irreversible consequences.