MCP server for TLS certificate analysis using OpenSSL and zlint
Single tool with complete schema and reasonable descriptions. Tool name 'fetch_certificate' is action-verb clear and unambiguous. Input schema is well-structured with 8 parameters, all typed and described. However, output schema is not documented in the visible code, the function signature shows it returns list[TextContent] but the actual response structure (what fields are in the TextContent) is not specified. This forces LLMs to guess what data they receive. Parameter descriptions are adequate (50-100 chars each) but lack constraint details (e.g., hostname format, port range). No error handling guidance visible. Tool is read-only (good security posture) but lacks idempotent/readonly annotations.
Fetch and analyze TLS certificate from a website with flexible output options
Output schema not documented. The tool returns list[TextContent] but the actual response structure (fields, types, example values) is not specified. LLMs cannot plan downstream operations or extract specific data without knowing what fields to expect.
Parameter constraints lack specificity. 'hostname' description does not specify format (FQDN, IP, wildcard support). 'port' has no min/max bounds (should be 1-65535). 'analyze' enum is documented but no guidance on when to use 'detailed' vs 'quick'. LLMs may pass invalid values.
No error handling guidance. If hostname is unreachable, certificate is invalid, or zlint fails, the tool returns an error but does not guide the LLM on recovery (retry, try different port, check hostname spelling). Agents cannot self-correct.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | <=2025-11-25 | v2 |
Tool lacks annotations. No readOnlyHint, destructiveHint, or idempotentHint in the schema. Although the tool is read-only and safe to retry, these annotations are not declared, forcing LLMs to infer safety properties.
Parameter interdependencies not documented. 'analyze_ciphers' and 'cipher_scan_type' are related (cipher_scan_type only applies if analyze_ciphers=true), but this dependency is not stated in descriptions. LLMs may pass cipher_scan_type without analyze_ciphers.