MCP server enabling autonomous AI agents to request scoped, single-use payment cards with human-in-the-loop approvals for purchases and cloud provisioning
This server has critical structural and definition gaps. Tool definitions exist only as string names in a manifest; no actual MCP tool registration with schemas is visible in the source code. The three tools (issue_agent_card, execute_purchase, verify_spend_limits) are declared but not implemented as callable MCP tools. Input schemas are inferred from the problem statement but not present in the actual codebase. The mcp_server.py file only prints a static manifest and does not handle tool calls, parameter validation, or error responses. Client.py contains mock implementations that return hardcoded responses, not real integrations. No tool descriptions, parameter constraints, or output schemas are enforced in the server logic.
Execute a one-call purchase with a natural language ask and maximum budget
Request a scoped, single-use virtual payment card with merchant lock and spend limits
Verify spend limits for a virtual card (declared in manifest but not implemented)
No MCP tool registration in source code. Tools are declared as strings in a manifest but not registered with the MCP server as callable tools with input schemas, descriptions, or handlers.
Input schemas are not visible in the server code. Schemas are inferred from the problem statement but not enforced in mcp_server.py. No JSON Schema definitions, type validation, or parameter constraints are present.
verify_spend_limits has no description and is marked as 'not implemented' in the problem statement. Tool is declared but non-functional.
No error handling or recovery guidance. Tools return mock responses without validation, error classification, or actionable error messages. LLM has no guidance on retryability or next steps on failure.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 24 | 2026-07-28+ | v2 |
Credentials and API keys exposed in client code. AgentcardClient.__init__ defaults to 'demo_sandbox_key' and accepts api_key as a parameter, violating secret injection pattern. Secrets must never be tool parameters.