A sample MCP server implementation for Coinone cryptocurrency exchange API
Server has 5 tools with basic schemas and descriptions, but significant quality gaps. Tool names follow verb_noun convention (good). Descriptions exist but are minimal (avg ~60 chars, below 194-char baseline). Input schemas present but lack enums for constrained values (e.g., 'side' should be enum ['BUY','SELL'], 'type' should be enum ['LIMIT','MARKET','STOP_LIMIT']). No output schemas documented. Error handling returns generic dicts without recovery guidance. Parameters lack format constraints (e.g., 'price' and 'qty' are strings with no validation rules stated). Credentials exposed in config.py (COINONE_ACCESS_TOKEN, COINONE_SECRET_KEY) rather than injected at runtime. No tool annotations (readOnlyHint, destructiveHint). place_order and cancel_order are high-risk WRITE/REVERSIBLE operations with minimal validation.
Cancel a Coinone order.
Get the list of open (active) orders on Coinone.
Get all Coinone balances.
Get the current orderbook for a specific market.
Place an order on Coinone using the v2.1 order API.
Credentials hardcoded in config.py and exposed via environment variables without server-side injection. COINONE_ACCESS_TOKEN and COINONE_SECRET_KEY are loaded globally and could leak into logs or traces.
Constrained parameters lack enum declarations. 'side' accepts 'BUY'|'SELL', 'type' accepts 'LIMIT'|'MARKET'|'STOP_LIMIT', 'order_type' is array of enums, all should be declared as JSON Schema enums, not free-form strings.
No output schemas documented. Tools return raw API responses (dicts) without specifying field names, types, or structure. LLMs cannot plan downstream calls or extract required data.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 49 | 2026-07-28+ | v2 |
Error handling returns generic {'error': str(e)} without recovery guidance. LLMs cannot determine if errors are retryable, user-fixable, or fatal. No actionable error messages.
Destructive operations (place_order, cancel_order) lack confirmation or dry-run support. No tool annotations (destructiveHint) to signal risk to agents. Agents can execute irreversible trades without safeguards.