MCP server exposing Vonage SMS and Voice to AI agents, with guardrails for the prompt-injection threat model.
This server demonstrates strong engineering discipline with consistent tool naming, detailed parameter descriptions, and comprehensive guardrails. All 6 tools follow verb_noun conventions (send_sms, get_sms_status, make_voice_call, get_call_status, estimate_sms_segments, generate_jwt). Descriptions are specific and actionable, ranging 100-200 chars. Input schemas are well-defined using Zod with regex patterns, length constraints, and enum-style validation. Error handling is sophisticated: the toolResponse.ts module categorizes errors by kind (validation, rate_limit, disabled, not_found, upstream, internal) and provides recovery guidance (reason + suggestion). However, output schemas are not explicitly documented in the visible code, responses are converted to JSON via toMcpResult() but the structure is inferred from context rather than formally declared. Tool composition is excellent: tools are granular (send vs status check), idempotent (status queries), and include dry_run confirmation for destructive ops. Security is well-addressed: no credentials in tool params, whitelist-based phone validation, rate limiting, and URL checking. The main limitation is lack of pagination/result limits for list-style tools, though this server has no list tools, so the gap is minor. Naming is highly consistent and descriptive, well above industry baselines.
Estimate SMS segment count and character limit for a given message text. Returns number of segments and approximate character limit per segment based on Vonage SMS concatenation rules.
Generate Vonage JWT authentication token. Creates a JWT token for calling Vonage APIs directly using application credentials.
Get voice call status and failure details. Returns call status (started, ringing, answered, completed, busy, cancelled, failed, rejected, unanswered, etc.), duration, pricing, and failure reasons from Event Webhook when available.
Get SMS delivery status. Returns the delivery status of a previously sent SMS message via Vonage Messages API webhook or status polling.
Make outbound voice call with text-to-speech message. Validates phone number against whitelist, enforces call duration limits, supports dry-run mode, and includes guardrails for phone number validation.
Output schemas not formally documented. Tool responses are converted to JSON dynamically (via toMcpResult()) but the exact structure, field names, types, optional/required fields, is not declared in a schema-like format that LLMs can rely on during planning.
Status query tools (get_sms_status, get_call_status) lack detailed description of return values and when to call them. Users/agents need to know: 'Call this after send_sms() to poll for delivery confirmation. Returns delivery status (sent, failed, undelivered), timestamp, and failure reason if applicable.'
generate_jwt description is minimal (in source: 'Creates a JWT token for calling Vonage APIs directly using application credentials'). Should explain: When to use this (for direct API calls outside MCP), what permissions the token grants, and security implications (token appears in logs, should be short-lived).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 65 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Send SMS message. Validates phone number against whitelist, checks message length and URL content, enforces rate limits, and supports dry-run mode for validation.
No documented limits on result sizes or retry behavior. While rate limiting exists in guardrails.ts, agents lack visibility into rate limit buckets, costs, or backoff strategy. Error messages include rate_limit category but lack 'retry after X seconds' guidance.