MCP server adapter for GPG Webservice - enables ChatGPT and other MCP clients to use GPG cryptographic operations
This MCP server has a critical architectural flaw: it exposes a single tool 'dynamic_tools_from_flask' that acts as a meta-proxy, dynamically loading tool definitions from a Flask endpoint at runtime. The tool definition itself is NOT directly visible in the TypeScript source, it is inferred to exist based on code that fetches '/openai/function_definitions' from an external Flask service. Per HARD SCORING RULE: 'If you cannot see the actual tool definition in the source (only inferred): cap that tool's overall at 50.' The source code provided (http-server.ts) is truncated mid-import statement, preventing verification of actual tool schema registration, parameter definitions, and output documentation. The description provided in the evaluation metadata is generic and does not meet the pattern:tool-description standard (should be 10-1024 chars, actionable, and specific). No parameter schemas are visible. No input validation or error handling patterns are documented in the provided code. The tool operates as a write-capable proxy (Risk: WRITE) with no visible permission gates, audit trails, or secret injection patterns, violating pattern:secret-injection and pattern:permission-gate.
Tools are dynamically loaded from the Flask GPG webservice endpoint /openai/function_definitions at startup. The MCP server converts Flask function definitions to MCP tools and proxies calls to the underlying Flask API.
Tool definition is inferred from runtime behavior, not directly visible in source code. Only a partial http-server.ts snippet is provided with truncated imports. Cannot verify actual tool schema, parameter types, or descriptions.
No input schema is visible for 'dynamic_tools_from_flask'. Per HARD SCORING RULE, schema score must be 0 when input schemas are missing or not visible. Parameter types, constraints, and documentation are entirely absent from the provided code.
Tool description is generic and does not meet the pattern:tool-description baseline (should be 10-1024 chars with clear WHAT/WHEN/WHY guidance). Current description: 'Tools are dynamically loaded from the Flask GPG webservice endpoint /openai/function_definitions at startup. The MCP server converts Flask function definitions to MCP tools and proxies calls to the underlying Flask API.' This is implementation detail, not user-facing specification.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 22 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 16 | - | v1 |
Tool is marked WRITE (destructive operations) with no visible permission gates, confirmation patterns, or audit logging. Violates pattern:permission-gate (gate destructive tools behind permission checks) and pattern:audit-trail.
No error handling patterns are visible. Tool acts as a proxy to Flask endpoints, network failures, malformed responses, authentication errors, and API rejections from the Flask service are not addressed with recovery guidance per pattern:recovery-guide.
Tool is a meta-proxy that dynamically loads definitions from an external HTTP endpoint at startup. This breaks the principle that tool definitions should be static, discoverable, and part of the MCP contract. LLMs cannot plan reliably when tool schemas are loaded from external services and may change at runtime.
Naming violation: 'dynamic_tools_from_flask' is a noun phrase, not a verb-led action name. Per pattern:tool, tool names should start with a verb (get_, create_, update_, delete_, search_, etc.) to convey the action. This name says nothing about what the tool does, only where data comes from.
No visible secret injection or credential handling. If the Flask endpoint at $GPG_API_BASE requires credentials, they should not appear as tool parameters. Environment variable GPG_API_BASE is present, but no mention of auth tokens, API keys, or credential validation.