A Python framework for building AI agents with tool support, integrations with multiple LLM providers, blockchain functionality, and multi-agent coordination. Supports MCP servers, knowledge management, memory, and deployment options.
This MCP server exhibits severe definition quality issues across all four tools. All tools have incomplete or missing input schemas (three have empty {} schemas), descriptions are trivial and under the 34-character baseline minimum, and there is zero documented output schema. The server relies on decorator and dict-based tool registration without proper validation or structured output. No error handling guidance, no parameter constraints, and no security measures visible. This is below the community baseline (45-55) and unsuitable for production deployment.
this function is used to get btc price
get btc price
when user ask eth price, return eth price
this function is used to get user age
Three of four tools have empty input schemas ({}), violating the hard rule that tools with NO input schema must score schema=0. get_btc_price, get_eth_price, and get_coin_price expose no parameter information despite accepting function calls.
'this function is used to get btc price' (40 chars including whitespace), 'when user ask eth price, return eth price' (42 chars), and 'get btc price' (13 chars) fail to explain WHEN to use the tool, WHAT it returns, or distinguish it from similar tools.
No documented output schemas. The source code shows tools return plain strings ('100,000', '1,000', '18', '20'), but LLMs cannot infer the response structure. Pattern:tool requires 'Document the output schema. LLMs need to know what fields to expect so they can plan downstream tool calls and extract the right data.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 39 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 30 | - | v1 |
Naming ambiguity: 'get_btc_price' and 'get_coin_price' are confusingly similar. 'get_coin_price' is vague, does it return BTC, ETH, or accept a parameter to specify the coin? Rubric: 'When multiple tools operate on the same resource, their names must make the distinction obvious.' Both reference cryptocurrency prices but differ in scope without clear naming distinction.
get_user_age has a parameter 'user_name' with type string and description 'The name of the user' (22 chars), which is barely adequate. No enum of valid user names (alice, bob) is exposed, forcing LLM to guess. Pattern:constrained-input requires 'When a parameter accepts one of a known set of values, declare it as an enum.' Alice and bob are hardcoded valid values but not declared as such.
No error handling guidance. tools.py shows generic function calling in handle_tool_function() without try-catch, error recovery hints, or actionable messages. Pattern:recovery-guide requires 'Error responses must tell the LLM what to do next.' If a tool fails (e.g., user not found in get_user_age), the LLM receives no guidance on recovery.
Tool decorator (@tool) does not validate inputs. Validate inputs early and return clear error messages.' Passing an invalid user name to get_user_age returns a generic string 'user {user_name} age is not found' without structured error classification.
No permission checks, scope declarations, or audit logging. Pattern:permission-gate, pattern:scope-declaration, and pattern:audit-trail are completely absent. Tools can be called by any agent without permission verification or logging trails for compliance.