A B2B lead enrichment and outreach automation platform that scores leads, enriches lead data, generates personalized emails, and manages email campaigns with AI-powered insights.
This is NOT an MCP server. ResonateIQ is a Next.js web application with Python execution scripts and API routes. It has no MCP protocol implementation, no tool registration via MCP, and no remote procedure call interface. The 13 'tools' listed are a mix of Python scripts (enrich_lead, generate_email, score_lead) and Next.js API routes (POST /api/leads/*, GET /auth/callback, etc.). None are registered as MCP tools with schemas. Tool definitions are inferred from file paths and descriptions, not explicitly declared.
Cron job endpoint to process campaigns. Executes campaign processing and returns results. Designed to be called by external cron service.
API endpoint to unsubscribe a lead from outreach. Marks a lead as unsubscribed in the database and returns an HTML confirmation page.
OAuth callback endpoint for Supabase authentication. Exchanges authorization code for session and redirects to dashboard or specified next URL.
API endpoint to execute campaign processing. Processes all due leads across active campaigns and returns the number of processed leads and details.
API endpoint to approve and send an email to a lead. Fetches lead and email draft from Supabase, sends email via Resend API, and logs the email send event.
API endpoint to enrich a lead by leadId, domain, or LinkedIn URL. Fetches lead details from Supabase, executes enrichment via Python bridge, and updates the lead record with enriched data.
Not an MCP server. This is a Next.js web application with no MCP protocol implementation. No tools are registered via MCP; all 'tools' are inferred from file paths and descriptions. MCP requires explicit tool registration with JSON Schema input/output definitions.
No input schemas visible in source code. Python scripts (enrich_lead, generate_email, score_lead) have no explicit schema definitions. API routes accept JSON bodies but schemas are not declared or validated against a formal schema.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 23 | 2026-07-28+ | v2 |
API endpoint to generate a personalized email draft for a lead. Fetches lead data from Supabase, generates email via Python bridge using LLM, and updates the lead record with the draft.
API endpoint to score a lead using an LLM. Fetches lead data from Supabase, executes scoring via Python bridge, and updates the lead record with score and reasoning.
Enrich a lead using Apify or fallback to mock data. Takes domain and/or LinkedIn URL and returns enriched company information including company name, industry, employee count, revenue, and website.
Generate a personalized email draft using Gemini, OpenAI, or mock data. Takes lead data as JSON and returns an email with subject and body.
Server action to authenticate a user with email and password. Calls Supabase auth.signInWithPassword and redirects to dashboard on success.
Score a lead using an LLM (Gemini or OpenAI) based on lead data. Returns a score (0-100) and reasoning for the score.
Server action to create a new user account. Calls Supabase auth.signUp with email, password, and full name, then redirects to dashboard on success.
API route naming violates verb_noun convention. Routes like 'POST /api/leads/enrich' and 'GET /api/cron/process-campaigns' use REST path semantics, not action verbs. MCP tools should be named 'enrich_lead', 'process_campaigns', etc. HTTP verbs (POST/GET) are transport details, not tool names.
No error handling guidance. API routes return generic 401/500 errors with minimal context. E.g., 'Unauthorized' and 'Internal Server Error' do not tell an LLM what to do next (retry, ask user, abort). Per pattern:recovery-guide, errors must guide recovery.
Credentials and secrets exposed in environment. Code references NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY, and LLM API keys (Gemini, OpenAI) via env vars. While not in tool parameters, the architecture does not isolate secrets from agent-facing responses. Per pattern:secret-injection, ensure responses never leak tokens or session IDs.