A CRM agent system with marketing campaign management capabilities, built with LangGraph and LangChain MCP adapters to orchestrate customer intelligence workflows
This server defines 2 tools with reasonable naming and basic structure, but lacks proper error handling guidance, missing output schema documentation, and incomplete parameter descriptions. Tool names follow verb_noun pattern (create_campaign, send_campaign_email), which is correct. However, descriptions are minimal (10-20 chars range for some params), and there is no documented output structure or error recovery guidance. The server uses FastMCP framework with STDIO transport, meaning it is not remotely accessible. Parameter types are visible in Python type hints but not formally exposed in JSON Schema for agent introspection. No pagination, batch operations, or result limiting mechanisms are present. Security considerations are minimal, database credentials appear to be environment-injected (good), but no rate limiting, permission gating, or audit trail patterns are evident.
Create a marketing campaign.
Send a campaign email.
Missing output schema documentation. Neither tool documents what fields/types are returned to the agent. create_campaign returns an integer; send_campaign_email returns a confirmation string. Without explicit schema, LLMs must infer the structure, risking downstream tool chaining errors.
Minimal parameter descriptions. Parameters like 'type' in create_campaign have a single-line description ('The type of the campaign. One of: loyalty, referral, re-engagement'), but no guidance on what happens if an invalid type is passed, whether the tool validates input, or what the LLM should do if the user requests an unsupported campaign type.
No error handling or recovery guidance. If campaign_id is invalid in send_campaign_email, the tool raises a ValueError, but there is no error response structure telling the LLM what to do next (retry, ask user, call another tool). Agents cannot self-correct without explicit error guidance.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 49 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 37 | - | v1 |
Parameter 'campaign_id' accepts both int and string, but the coercion logic is buried in implementation. The description says 'integer or string representation' but provides no guidance on which to prefer or what happens on parse failure beyond a ValueError. Undocumented coercion invites LLM confusion.
No output schema for downstream tool chaining. If a future tool (e.g., get_campaign_stats) needs the campaign_id returned by create_campaign, the agent must infer the field name and type. Explicit output schema enables automatic tool chaining.
Bare 'name' and 'description' parameters lack validation constraints. No min/max length, no character restrictions, no guidance on required formatting. LLMs may pass absurdly long or special-character-laden strings causing database errors.