Official Model Context Protocol (MCP) server for NOVA Labs — place AI voice-agent calls, track them, read quality scores, and manage webhooks via the NOVA API.
Strong foundation with 13 well-named tools, comprehensive descriptions (avg 180+ chars), and detailed input schemas using Zod. All tools have clear verb-noun naming (health_check, place_calls, get_call, etc.). Descriptions are LLM-optimized with operational context (demo mode, TTLs, auth requirements). Most parameters have type constraints and descriptions. However, output schemas are not explicitly documented in the tool definitions, responses are returned as JSON but the structure is not formally declared in the tool registration. Error handling is basic (safe() wrapper catches exceptions but doesn't provide recovery guidance). Some parameter relationships undocumented (e.g., goal=book_meeting requires booking_link, but this dependency is only stated in description text, not enforced in schema).
Register a webhook URL to receive call events (call.started, call.ended, call.transcribed, call.scored). Returns a webhook ID and a signing secret (returned exactly once — store it securely). Events are signed with HMAC-SHA256 using the secret. Requires authentication.
Delete a webhook by ID. Requires authentication. Once deleted, no further events will be delivered to that URL.
Poll the status of a placed call by call_id. Returns status (pending/in_progress/completed/failed), phone, whether an SMS was sent, any error message, and a TTL. Calls expire after 10 minutes; a 404 means the call record has been garbage-collected.
Retrieve the full call brief (agent instructions, opening line, objection handlers, closing script, product facts, qualification questions) that was built for a specific call. Useful for debugging or understanding what the agent was told to say. Calls expire after 10 minutes.
Retrieve the quality score for a completed call. Scores are computed asynchronously after the call ends; a null score means scoring is still in progress or the call failed. Authenticated calls unlock detailed quality metrics (tone, engagement, objection handling, etc.). Unauthenticated calls return a basic score. Calls expire after 10 minutes.
Output schemas not formally documented in tool definitions. Responses are returned as JSON but the structure (fields, types, required properties) is not declared in the tool registration. LLMs cannot plan downstream calls or extract fields reliably without knowing the response schema.
Parameter dependencies not enforced in schema. place_calls requires booking_link when goal=book_meeting and payment_link when goal=close_sale, but these constraints are only documented in description text. Schema should use conditional validation or explicit error messages.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
Generate a LiveKit browser-demo token for a call in DEMO MODE. Returns a server URL, participant token, and room name (call-<context_id>). Use this to join the agent's conversation from a browser (e.g. via livekit.io/playground). Only works for calls placed in the last 10 minutes.
Retrieve your NOVA account's usage and plan details: minutes used, remaining, plan name, trial status, and billing period. Requires authentication. Use this to check if you have minutes left before placing calls.
Check that the NOVA API is up. Returns status, timestamp and the number of active calls. Set deep=true to also probe critical dependencies (database, LiveKit) — deep returns per-dependency latency and a degraded verdict on failure. No authentication required. Use this first when other tools fail.
List all webhooks registered on your NOVA account. Returns webhook ID, URL, subscribed events, active status, and creation/update timestamps. Requires authentication.
Create and dispatch AI voice-agent calls to 1-5 leads in a single batch. NOVA builds a per-lead call brief (system prompt, opening line, objection handlers) from your product description and optional website, then dispatches one agent per lead. Returns a call_id + context_id per lead. Consent is mandatory: only set consent=true if the lead list has genuinely agreed to be contacted. Works without authentication today, but authenticated calls are metered against your plan and unlock webhooks + quality scores. NOTE: NOVA currently runs in DEMO MODE — no real phone (PSTN) dial is placed. The AI voice agent is dispatched into a LiveKit room named call-<context_id>; use the get_demo_token tool with the returned context_id to join the conversation from a browser. The request/response contract is identical to production dialing.
Send a test event to a webhook URL. Useful for verifying that your webhook endpoint is reachable and correctly processes NOVA's signature scheme. Requires authentication.
Update a webhook's URL and/or subscribed events. Requires authentication. Pass only the fields you want to change; omitted fields are left unchanged.
Return the NOVA account associated with the configured NOVA_API_KEY: email, verification status, trial state and remaining trial minutes. Use this to verify that authentication is set up correctly.
Error handling provides no recovery guidance. The safe() wrapper catches exceptions and returns isError=true with a message, but does not categorize errors as retryable, user-fixable, or fatal. LLMs cannot determine next steps without this classification.
Destructive operations (delete_webhook) lack confirmation or dry-run support. Agents can permanently delete webhooks without a confirmation step, risking accidental data loss.
place_calls accepts consent as a const=true parameter but does not validate that leads have genuinely consented. The tool description states 'Consent is mandatory' but the implementation cannot verify this, it relies on the agent to enforce the policy.