A local MCP server that dynamically loads and registers Python tool scripts from a tools directory
Single tool with adequate naming (verb_noun pattern) but critical gaps in parameter descriptions and output schema documentation. The ssl_cert_info tool has a clear, actionable description (67 chars), but the input parameter 'hostname' lacks a description entirely, violating the requirement that every parameter must explain what it controls. Output schema is undocumented; the tool returns a dict with 'info' or 'error' keys, but this structure is not formally declared. Error handling returns raw exception strings without recovery guidance. No input validation, no enum constraints, no pagination (not applicable here but relevant for composition patterns). The dynamic tool loading mechanism in main.py obscures explicit tool registration, making it difficult to verify schema completeness.
Get SSL certificate info for a website (expiry, SANs, issuer)
Input parameter 'hostname' has no description. LLMs cannot infer whether to pass a domain, IP, or FQDN, or what format is expected.
Output schema is not documented. Tool returns {'info': str} or {'error': str}, but this structure is not formally declared in the tool definition or docstring.
Error handling returns raw exception strings (e.g., 'Connection refused') without recovery guidance. LLMs cannot determine whether to retry, ask the user, or abandon the task.
No input validation. Tool does not validate hostname format, length, or character constraints. Invalid input (e.g., 'not a hostname!!!') will fail at socket connection time with a cryptic error.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 51 | 2026-07-28+ | v2 |
Dynamic tool loading via importlib obscures explicit schema registration. Tool definitions are inferred from function signatures and docstrings, not explicitly registered with fastmcp.tool() decorator metadata.