MCP server for Harmonic AI API - company and person enrichment for VC deal flow
Strong tool naming (verb_noun pattern throughout) and comprehensive descriptions with examples and use-case guidance. All 13 tools have explicit schemas with type definitions and parameter descriptions. Tool annotations present (readOnlyHint, destructiveHint, idempotentHint). Key gaps: output schemas documented in descriptions but not in formal JSON Schema; error handling lacks recovery guidance; some parameter descriptions could be more precise on constraints.
Clear Saved Search Net New Results - Mark results as "seen"
Find companies similar to a given company. Core use case for VCs: "I like this company, find me more like it." **What it does:** Uses Harmonic's similarity algorithm to find companies with similar characteristics (industry, stage, business model, etc.). **Input:** - company_id: Either numeric ID (e.g., "1") or full URN (e.g., "urn:harmonic:company:1") **Returns (JSON):** { "data": ["urn:harmonic:company:763898", "urn:harmonic:company:11578442", ...], "count": number } **Next Steps:** Use harmonic_get_company with each URN to get full company details. **Example workflow:** 1. Find a company you like: harmonic_lookup_company with domain 2. Get similar: harmonic_find_similar_companies with that company's ID 3. Get details: harmonic_get_company for each similar company
Get company details by ID with field filtering for optimal response size. **Input:** - company_id: Numeric ID (e.g., "1") or full URN (e.g., "urn:harmonic:company:1") - include_fields: Optional array of fields to include (e.g., ["name", "funding", "headcount"]) **Response sizes:** - Default (basic fields): ~3KB per company - All fields: ~368KB per company (not recommended) **Default fields returned:** name, description, website, headcount, location, funding, stage, founding_date, company_type, customer_type, contact, socials **When to use:** - After harmonic_search_companies to get full details - After harmonic_find_similar_companies - When you have a company ID from another source **Note:** Uses batch endpoint internally for proper field filtering. The GET endpoint ignores include_fields.
Output schemas documented in descriptions but not formalized in JSON Schema. LLMs cannot parse response structure from text descriptions alone; formal schemas enable downstream tool chaining and validation.
Error handling lacks recovery guidance. Tools return error strings (e.g., 'Error: Not Found') but do not suggest next steps (e.g., 'Try search_companies() with a partial name'). Agents cannot self-correct without explicit guidance.
Saved search tools (list, get_results, get_net_new, clear) have minimal descriptions (60-65 chars). Descriptions lack context on when to use each tool and what distinguishes them. LLMs may conflate or misapply them.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Find which team members have connections to a company. Key for warm introductions in VC deal flow. **What it does:** Returns your team's network connections to people at the target company, showing who knows whom and how they're connected. **Returns:** { "data": [ { "user_urn": "urn:harmonic:user:17115", "target_person_urn": "urn:harmonic:person:73639745", "target_person_email_address": "[email protected]", "connection_sources": ["EMAIL", "LINKEDIN"] } ] } **Connection sources:** - EMAIL: Connected via email correspondence - LINKEDIN: LinkedIn connection - CALENDAR: Met via calendar events **Use case:** Before reaching out to a company, find if anyone on your team has a warm intro path.
Get employees of a company with filtering options. **Input:** - company_id: Numeric ID or URN - employee_group_type: Filter by role (ALL, FOUNDERS_AND_CEO, EXECUTIVES, FOUNDERS, LEADERSHIP, NON_LEADERSHIP, ADVISORS, NON_PARTNERS) - employee_status: Filter by status (ACTIVE, NOT_ACTIVE, ACTIVE_AND_NOT_ACTIVE) Note: Filter values confirmed via API testing. Documentation had incorrect values (EMPLOYEES, CURRENT, PAST do not work). **Returns:** Person URNs that you can use with harmonic_get_person to get full details. **Example Response (JSON):** { "data": [ { "urn": "urn:harmonic:person:113554", "id": "113554" }, { "urn": "urn:harmonic:person:155348322", "id": "155348322" } ], "count": 72, "hasMore": false } **Common workflows:** 1. Get founders: employee_group_type="FOUNDERS_AND_CEO" 2. Get leadership: employee_group_type="LEADERSHIP" 3. Get former employees: employee_status="NOT_ACTIVE"
Get full person details by ID. Use after getting person URNs from company employees. **Input:** - person_id: Numeric ID (e.g., "161780079") or full URN (e.g., "urn:harmonic:person:161780079") **Returns same data as harmonic_lookup_person:** - Full name and profile picture - Contact info (emails) - Location - Education history - Work experience with company links **When to use:** - After harmonic_get_company_employees to get full details on each person - When you have a person ID from another Harmonic response - To expand on a person URN from search results
Get Saved Search Net New Results - Get only new matches since last check
Get saved search results input schema WARNING: Response sizes are large (~27KB per result in practice). - size=3 (default): ~81KB - size=5 (max): ~135KB Field filtering does NOT work on this endpoint.
Get all saved searches accessible to your Harmonic account. Saved searches enable monitoring deal flow.
Look up a company by domain, website URL, or social media URL. This is a READ operation (does not create data). **What it does:** Finds and enriches a company profile by any of its known identifiers. Returns full company details including funding, headcount, location, and contact info. **Supported identifiers (use ONE):** - website_domain: e.g., "harmonic.ai", "stripe.com" - website_url: Full URL like "https://www.stripe.com" - linkedin_url: LinkedIn company page - crunchbase_url: Crunchbase profile - pitchbook_url: Pitchbook profile - twitter_url: Twitter/X profile - instagram_url: Instagram profile - facebook_url: Facebook page - angellist_url: AngelList profile **Returns full company data including:** - Basic info: name, description, logo - Contact: emails, primary_email, exec_emails - Funding: total amount, stage, investors, rounds - Social: LinkedIn, Twitter with follower counts - Metrics: headcount, web_traffic **Example Response (JSON):** { "id": 1, "entity_urn": "urn:harmonic:company:1", "name": "Harmonic", "description": "...", "headcount": 67, "funding": { "funding_total": 30150000, "funding_stage": "SERIES_A", "investors": [...] }, "contact": { "primary_email": "[email protected]", "emails": [...] } } **HTTP 404 Note:** If company not found, Harmonic may trigger background enrichment. Try again later or use a different identifier.
Look up a person by their LinkedIn URL. This is a READ operation (does not create data). **What it does:** Finds and enriches a person's profile by their LinkedIn URL. Returns full profile including work history, education, contact info, and social links. **Input:** - linkedin_url: Full LinkedIn profile URL (e.g., "https://linkedin.com/in/username") **Returns:** { "id": 161780079, "entity_urn": "urn:harmonic:person:161780079", "full_name": "Max Ruderman", "contact": { "emails": ["[email protected]"], "primary_email": "[email protected]" }, "location": { "city": "New York", "state": "New York", "country": "United States" }, "education": [ { "school": { "name": "Cornell University" }, "degree": "Bachelor of Science (B.S.)", "field": "Labor and Industrial Relations" } ], "experience": [ { "title": "Chief Executive Officer", "company": "urn:harmonic:company:1", "company_name": "Harmonic", "is_current_position": true, "start_date": "2022-07-01T00:00:00Z" } ] } **HTTP 404 Note:** If person not found, Harmonic may trigger background enrichment. Try again later. **Use cases:** - Research a founder or executive before a meeting - Find contact information for outreach - Verify a person's current role and company
Search for companies using natural language queries. This is the primary entry point for discovering companies. **What it does:** Searches Harmonic's database using AI-powered natural language understanding. You can describe what you're looking for in plain English. **Example queries:** - "AI startups in San Francisco" - "fintech companies with Series A funding" - "B2B SaaS companies founded after 2020" - "healthcare startups in Boston with 50-100 employees" **Returns:** - Company URNs (use harmonic_get_company to get full details) - Total count of matching companies - Query interpretation showing how your query was parsed - Pagination cursor for more results **Returns (JSON):** { "data": [{ "urn": "urn:harmonic:company:123", "id": "123" }], "count": number, "totalAvailable": number, "hasMore": boolean, "nextCursor": string | null, "queryInterpretation": { "semantic": string, "faceted": [...] } } **Next Steps:** Use the numeric ID from URN with harmonic_get_company for full company details.
Quick autocomplete search for companies by name or domain. Use this for fast lookups when you know part of the company name. **What it does:** Returns company matches ranked by relevance. Lower ranking_score = better match. **Example queries:** - "Harmonic" - finds companies with Harmonic in the name - "stripe.com" - finds by domain - "Str" - partial name search **Returns (JSON):** { "data": [ { "entity_urn": "urn:harmonic:company:1", "text": "Harmonic", "ranking_score": 10.0 } ], "count": number } **When to use:** - Quick lookup by known company name - Autocomplete suggestions - Finding company by domain **When NOT to use:** - Complex searches with multiple criteria (use harmonic_search_companies instead) - Searching by funding stage, location, etc.
Parameter 'response_format' (json|markdown) present on all tools but never documented in descriptions. LLMs may not understand when to use markdown vs json or may default incorrectly.
No dry-run or confirmation pattern for the one write operation (harmonic_clear_saved_search_net_new). Agents cannot preview what will be cleared before committing. Risk of accidental data loss.