A dual-lab project combining a FastMCP banking server with ReAct agent integration and a multimodal Streamlit chatbot supporting text, voice (STT/TTS), and image inputs via Google Gemini
Banking MCP server has 7 tools with basic schemas and descriptions, but significant gaps prevent production use. All tools have input schemas with type definitions and descriptions present, meeting minimum requirements. However, descriptions are uniformly terse (10-20 chars), falling below the 50-200 char baseline for LLM-optimized tools. No output schemas documented. Error handling is absent, tools return raw results with no recovery guidance. Parameter descriptions lack format constraints, ranges, or validation rules. No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications. Missing idempotency guarantees on WRITE operations (deposit, withdraw, open_account). No pagination support on list_accounts or list_transactions despite potential for large result sets.
Check balance.
Deposit money.
List all accounts.
List transactions.
Open a new user account.
Search account.
Withdraw money.
All tool descriptions are under 20 characters (e.g., 'Open a new user account.', 'Deposit money.'). LLMs cannot determine when/why to select tools without context on prerequisites, return values, and use cases.
No output schemas documented. LLMs cannot plan downstream tool calls or extract required fields (e.g., account_id from open_account, balance from check_balance). Baseline: 100% of A+ tools have documented return types.
WRITE operations (deposit, withdraw, open_account) lack idempotency guarantees and confirmation steps. Agents retry on ambiguous failures, non-idempotent tools risk duplicate charges or duplicate accounts. No dry-run or confirmation pattern.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 45 | <=2025-11-25 | v2 |
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications in metadata. LLMs cannot distinguish safe reads from destructive writes without explicit hints.
list_accounts and list_transactions lack pagination (limit, offset, page_size, next_cursor). No total count returned. Large result sets will blow context window and degrade LLM reasoning.