MCP Server wrapper for the Client Tracker API, providing tools to interact with client, product, and transaction data through HTTP requests to the underlying API
This server has 19 tools with consistent but minimal definition quality. All tools are properly registered with @mcp.tool() decorators and have one-line descriptions. However, the definitions lack depth required for production use: (1) Parameter descriptions are single-line and minimal; (2) No output schemas are documented, LLMs cannot plan downstream calls or understand return structure; (3) Input schemas use generic dict types for complex objects (client, product, transaction, review), making it impossible for LLMs to know what fields are required or optional; (4) No error handling guidance, errors are raw HTTP status + text with no recovery hints; (5) Names like 'add_client', 'update_rating_for_client_by_firstname_and_lastname' are verbose but inconsistent in structure (some use '_by_id', some use '_by_firstname_and_lastname'); (6) No parameter constraints (enums, min/max, patterns) documented. The codebase shows proper error handling internally (_raise_for_status), but these details are not exposed to the LLM. Most tools would require multiple follow-up calls because return values are not documented. Baseline for community servers is 45-55; this server falls at the lower end due to missing schema documentation and output structure.
Activate a product by ID.
Activate a product by name.
Create a new client record.
Create a new product record.
Add a product review for a client.
Add a transaction for a client.
Deactivate a product by ID.
Generic dict input schemas for complex objects (client, product, transaction, review). No field documentation, no required vs optional distinction, no nested structure. LLMs cannot construct valid payloads.
No output schemas documented. Tools return Any with no field names, types, or structure hints. LLMs cannot plan downstream calls or extract expected fields (e.g., 'Which field contains the client_id for later use?').
Inconsistent naming patterns. Tools use 'add_' + 'by_id', 'retrieve_' + 'by_firstname_and_lastname', 'get_' + 'by_id', 'find_' + 'by_name'. LLMs must reason about which verb and which lookup method apply, increasing error rate.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 41 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 42 | - | v1 |
Deactivate a product by name.
Find transactions within a timestamp range.
Find a product by ID.
Find a product by name.
Get a page of reviews submitted by a client.
Get a page of transactions for a client.
Predict future revenue for a given year horizon.
Retrieve a page of reviews for a product.
Retrieve a client by first and last name.
Retrieve a client by client ID.
Update a client's rating by first and last name.
Update a client's rating by client ID.
Parameter descriptions are single-line and vague. E.g., 'Client data object to create' does not specify required fields, data types, or constraints. 'Transaction data object' does not explain what constitutes a valid transaction.
No error recovery guidance. Errors are raw HTTP status + response text (e.g., 'Request failed (404): Not found'). LLMs do not know whether to retry, call a discovery tool, or ask the user.
Multiple tools perform the same action with different lookup keys (e.g., update_rating_for_client_by_firstname_and_lastname vs update_rating_for_client_by_id). This duplicates functionality and forces LLMs to decide which variant to use.
No pagination limits enforced in descriptions. Tools like get_transactions_by_client_by_id accept pageSize and pageNumber without documented min/max constraints. An LLM could request pageSize=10000, causing performance degradation or OOM.
No tool annotation hints (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes without examining descriptions manually. Makes agent planning less efficient.