Overview
When you connect OpenFunnel to Claude via MCP, a set of tools becomes available, and Claude will automatically pick the right one based on your question.
Two families: data fetchers vs. data generators
OpenFunnel MCP exposes two kinds of tools:
- Data fetchers read what’s already in your workspace — accounts, audiences, insights, signals. They are free and have no rate-limited credit cost. Most tools below fall in this group.
- Data generators are wrappers over the Agent Primitive APIs. They generate new data on demand — searching the broader company universe, surfacing companies hiring for a given technology, etc. They consume credits per company returned and are clearly marked with a credit warning. Claude will confirm with you before calling them.
Credit-consuming generator tools currently:
get_account_summary
Get a quick summary/overview of an account.
Parameters:
| Name | Type | Required | Description |
|---|
account_id | int | Yes | The account ID to get summary for |
Returns: Basic account info, signal counts, people count, and TOP 3 key contacts only.
get_account_full_details
Get COMPLETE account details including ALL people/contacts at the company.
Example queries:
- Who works at [company]?
- Show me all contacts at [company]
- Get me people at [company]
- List employees at [company]
- Who are the decision makers at [company]?
- Any request for people/contacts/employees at a company
Parameters:
| Name | Type | Required | Description |
|---|
account_id | int | Yes | The account ID to get full details for |
Returns: Complete account data with ALL people and ALL signals.
get_account_timeline
Get recent activity timeline for an account.
Parameters:
| Name | Type | Required | Description |
|---|
account_id | int | Yes | The account ID to get timeline for |
days | int | No (default: 30) | How many days back to look (default 30) |
signal_types | list | No (default: None) | Optional filter by signal types (hiring, socials, linkedin_engagement, job_change) |
Returns: Timeline with chronological list of events.
get_my_insights
Find out what has been happening with your accounts in the last n days.
Example queries:
- Show me what has been happening with my accounts in last n days?
- Show me net new accounts in last n days?
- Tell me more about the alerts that were sent to me today?
Parameters:
| Name | Type | Required | Description |
|---|
days | int | No (default: 1) | How many days back to look (default 1, max 30) |
limit | int | No (default: 5) | Maximum alerts to return per page (default 5) |
offset | int | No (default: 0) | Pagination offset (e.g. 0 for page 1, 5 for page 2) |
Returns: Alerts with total_alerts, has_more, and alerts list (each with embedded insights).
If no alerts exist, returns fallback insights_feed data instead.
get_insight_detail
Get full detail for a single insight. Drill down from the feed.
Example queries:
- Tell me more about this insight
- What signal triggered this alert?
- Show me the details for insight X
- Any drill-down from the insights feed
Parameters:
| Name | Type | Required | Description |
|---|
insight_id | int | Yes | The insight ID to get details for (from get_insights_feed) |
Returns: Insight details with underlying_signal and related_insights.
list_accounts
List accounts in your database with optional filters.
Parameters:
| Name | Type | Required | Description |
|---|
limit | int | No (default: 20) | Maximum accounts per page (default 20) |
offset | int | No (default: 0) | Number of accounts to skip for pagination |
is_imported | bool | No (default: None) | Filter by imported accounts (True) or discovered (False) |
is_in_crm | bool | No (default: None) | Filter by CRM presence |
Returns: List of accounts with pagination info.
list_audiences
List all audiences (saved lists) for the user.
Audiences can be either “accounts” type (primary entities are accounts) or
“people” type (primary entities are people/prospects). Use this to discover
what audiences exist before fetching their data with get_audience_data.
Returns: List of audiences with audience_id, audience_name, and audience_type.
get_audience_data
Get all members on an audience.
Use this to retrieve the members of an audience. Works for both “accounts”
and “people” audience types.
Parameters:
| Name | Type | Required | Description |
|---|
audience_id | int | Yes | The audience ID to fetch data for (from list_audiences) |
Returns: Audience metadata plus member IDs and totals for accounts and people.
lookup_company
Look up a specific company in the user’s OpenFunnel database by name or domain.
Example queries:
- Tell me about [company]
- What’s happening with [company]
- Show me [company] from OpenFunnel
- Find [company] in my accounts
- Any question about a specific company by name or domain
Parameters:
| Name | Type | Required | Description |
|---|
company_name | str | Yes | The company name or domain to look up (e.g., “Capital One”, “Stripe”, “acme.com”) |
Returns: Company summary including basic info, signal counts, and key contacts.
If multiple companies match, returns options to clarify which one.
search_by_traits
Search within your existing database for companies matching specific characteristics.
Use this to find companies in your DB matching things like:
- Industry or vertical (healthcare, fintech, etc.)
- Products or services they offer
- Technologies they use
- Business model or target market
Parameters:
| Name | Type | Required | Description |
|---|
query | str | Yes | Describe the type of companies you’re looking for |
limit | int | No (default: 25) | Maximum number of results (default 25, max 100) |
Returns: List of matching companies in your database, ranked by relevance.
search_lookalikes
Search the broader company universe (beyond your database) for net-new prospects, with optional filters for size, funding stage, and location.
Use this when you want to find companies you don’t already have, e.g. finding lookalikes of your best customers, or expanding into new geographies / segments.
This tool consumes credits — 1 credit per company returned. Empty result sets are free. The exact amount billed is echoed back in the credits_consumed field on the response. Claude will confirm with you before running with a large limit. The LLM trait synthesis used by seed_domains is included — no extra charge.
Seed-based discovery (no need to phrase the trait)
In addition to natural-language query, you can pass up to 10 company websites in seed_domains and OpenFunnel will use them to synthesize the lookalike query for you. Useful when you can name a few example customers but struggle to phrase what unifies them.
- Seeds only: pass
seed_domains — the API picks the common theme automatically and surfaces it in the derived_query field of the response.
- Seeds + query (must-have angle): pass both — the query becomes a constraint on top of the trait the seeds imply (e.g.
seed_domains=["stripe.com", "adyen.com"] + query="for SMB merchants" → synthesized trait targets B2B SMB payments platforms).
Unresolved seeds (e.g. typos, very small companies not in our index) are skipped silently as long as at least one seed resolves; the response reports both resolved_seed_domains and unresolved_seed_domains so you can show the user exactly what landed.
At least one of query or seed_domains is required.
Choosing a search strategy: precision vs. recall
search_lookalikes supports two retrieval strategies via the search_type parameter:
search_type | Best for | Latency | Behavior |
|---|
semantic (default) | Fuzzy / conceptual queries, long-tail discovery | Slower | High recall. Casts a wider net, including companies that don’t use your exact phrasing but are conceptually adjacent. |
agentic | Crisp category queries, high-confidence shortlists | ~2–4s | High precision. Returns a tighter set of companies that explicitly self-describe with the trait. |
Rule of thumb: start with agentic if the query has a clear category (e.g. “B2B customer support software”, “LLM evaluation tools”, “HVAC home services”); switch to semantic if results feel too narrow or the trait is fuzzy.
Parameters:
| Name | Type | Required | Description |
|---|
query | str | Yes (or seed_domains) | Natural-language description of the companies to find. When combined with seed_domains, the query becomes a must-have angle on top of the seed-derived trait. |
seed_domains | list[str] | Yes (or query) | Up to 10 company websites to use as seeds (e.g. ["stripe.com", "adyen.com", "checkout.com"]). OpenFunnel uses them to synthesize the lookalike query for you. Protocol / www. prefixes are normalized. Unresolved seeds are skipped silently as long as at least one resolves. |
limit | int | No (default: 10) | Maximum number of results, max 5000. Practical interactive values are ≤100; higher values are intended for batch workflows where minutes-long latency is acceptable. Each returned company costs 1 credit. |
min_employees | int | No | Minimum employee count, inclusive |
max_employees | int | No | Maximum employee count, inclusive |
funding_stages | list[str] | No | Filter by funding stage. Valid values: Pre-Seed, Seed, Series A … Series H, Acquired, Private, Public. e.g. ["Series A", "Series B"] |
locations | list[str] | No | Filter by HQ country using ISO 3166-1 alpha-3 codes (UPPERCASE), e.g. ["USA", "GBR", "DEU"]. Pass ["EU"] to expand to all 27 EU member states. |
search_type | str | No (default: semantic) | Retrieval strategy: semantic (high recall) or agentic (high precision, faster). See table above. |
Returns: Object with query, results (each entry: name, domain, linkedin_url, headquarters, company_size, match_reason), total, credits_consumed (1 per returned company), and — when seed_domains was used — derived_query (the LLM-synthesized trait), resolved_seed_domains, and unresolved_seed_domains.
search_companies_by_tech_stack
Find companies whose recent job postings mention a given technology, ranked by matching post count.
Use this for technology-adoption discovery — e.g. “Find companies hiring for Snowflake”, “Show me US-HQ companies of 1,000+ employees adopting Kubernetes”, “Series B+ fintechs hiring for ClickHouse engineers”. Page size is fixed at 50; walk pages with page=1, page=2, … using has_more from the response.
This tool consumes credits — 5 credits per company returned (10 credits per company when enriched). Enrichment is auto-enabled when any firmographic filter (hq_country_code, min_employee_count, max_employee_count) is set, or when you pass enrich=true. A full page (50 companies) therefore costs up to 250 credits unenriched or 500 credits enriched. Empty result sets are free. The exact amount billed is echoed back in the credits_consumed field on the response. Claude will confirm with you before running with filters / enrichment turned on.
Parameters:
| Name | Type | Required | Description |
|---|
tech | str | Yes | Technology to search for in job descriptions (e.g. "Snowflake", "Kubernetes", "ClickHouse"). |
variations | list[str] | No | Alternate phrasings, OR-matched as phrases (e.g. ["Snowflake Data Cloud"]). |
lookback_days | int | No (default: 365) | Lookback window in days, 1–365. Defaults to a full year so coverage isn’t artificially clipped; narrow this for recency-sensitive queries. |
page | int | No (default: 1) | 1-indexed page number, max 1000. Page size is fixed at 50. Walk pages using has_more. |
exclude_vendor | bool | No (default: true) | Exclude job posts from the technology vendor itself (e.g. searching Snowflake excludes Snowflake’s own postings). |
exclude_aggregators | bool | No (default: true) | Exclude well-known LinkedIn job aggregators and reposters (jobs-via-*, lensa, ziprecruiter, etc.) which otherwise dominate raw counts. |
exclude_company_slugs | list[str] | No | Additional LinkedIn company slugs to exclude on top of the default block-list. Useful for blocking consultancies (deloitte, pwc, accenture), the caller’s own company, or known competitors. |
include_evidence | bool | No (default: true) | Include one top-hit job per company with a highlighted snippet showing the tech phrase in context. Set false for the leanest payload (~6× faster). |
enrich | bool | No (default: false) | Hydrate each company with firmographics (employee count, HQ, website, LinkedIn, industries, funding, revenue). Doubles credit cost to 10/company. Auto-enabled when any of hq_country_code, min_employee_count, or max_employee_count is set. |
hq_country_code | str | No | Filter by company HQ ISO 3166-1 alpha-3 code (UPPERCASE), e.g. "USA", "GBR", "DEU". Auto-enables enrich. Companies missing a country code are dropped when this is set. |
min_employee_count | int | No | Inclusive lower bound on employee count. Auto-enables enrich. Companies with no employee count are dropped when set. |
max_employee_count | int | No | Inclusive upper bound on employee count. Auto-enables enrich. Companies with no employee count are dropped when set. |
Returns: A page of matched companies with their top-hit job snippet (when include_evidence=true) and firmographics (when enriched), plus has_more for pagination and credits_consumed for the exact amount billed.
This tool is a thin wrapper over the Search Companies By Tech Stack Agent Primitive API. The full request/response schema, examples, and country-code reference live there.
deep_research
Decide whether a single, known company fits your criteria in terms of recent activity and organizational structure as a qualifier.
Combine an activity question (answered from job postings) and a team-composition question (answered from LinkedIn people) in a single call, with cited evidence per stage. Provide a domain plus at least one of activity_question or qualifier_question.
Each question is routed to a specific data source — pick the param accordingly:
activity_question → answered from recent job postings (use for hiring / team-expansion / JD-visible questions).
qualifier_question → answered from LinkedIn people data (use for team composition / org-shape questions).
Use this to research an account before outreach — e.g. “Is Stripe hiring SDRs?” (activity_question) + “Do they already have a Sales Director?” (qualifier_question), or “Does Notion have a dedicated AppSec team?” (qualifier_question). Pass both when the question spans both signals.
This tool consumes credits — 1 charge per call, regardless of verdict, as long as at least one stage produced a finding. A failed domain resolution (404) is free. The per-call price is configured for your workspace; the exact amount billed is echoed back in the credits_consumed field on the response. Claude will confirm with you before invoking when cost is a concern.
Two stages, two data sources
Each parameter is hard-wired to a specific data source. Pick the param that matches where the answer lives:
| Stage | Data source | Use it for questions about… | Sources returned |
|---|
activity_question | Job postings (the company’s recent open roles) | Hiring intent, team expansion, technology adoption surfaced via JDs, geographic hiring footprint. e.g. “Are they hiring SDRs?”, “Are they building an AI platform team?”, “Are they hiring engineers with Rust + Kubernetes experience?”, “Are they posting roles requiring Snowflake / dbt?”, “Are they expanding in Berlin?”. | Up to ~10 matching job postings (title, URL, location, why-relevant reason) |
qualifier_question | People data (LinkedIn profiles of current employees) | Team composition, who already works there, roles already filled, org structure. e.g. “Do they have a Head of Security?”, “Do they have ≥5 SDRs and a Sales Director?”, “Do they have a dedicated AppSec team?”. | Matched LinkedIn profiles (name, title, profile URL, seniority, department) |
You can pass either or both — at least one is required. Pass both when a question spans both signals (e.g. “they have an SDR team and are hiring more SDRs”) — each stage runs against its own data source and returns independent evidence.
- Use
deep_research to research a known company (you have the domain) and answer specific yes/no research questions with evidence.
- Use
search_lookalikes when you don’t yet have the company — net-new discovery across the broader universe.
- Use
search_companies_by_tech_stack for technology-adoption discovery across many companies.
Parameters:
| Name | Type | Required | Description |
|---|
domain | str | Yes | Company website domain to research (e.g. "stripe.com", "notion.so"). Protocol and www. prefixes are stripped automatically. |
activity_question | str | At least one of activity / qualifier required | Answered from the company’s recent job postings. Natural-language description of the hiring activity to look for (e.g. "rapidly growing their SDR team", "hiring senior platform engineers in Europe", "building out an AI / ML platform team", "hiring engineers experienced with Rust and Kubernetes", "posting data roles that require Snowflake and dbt"). Use this for any question about hiring, team expansion, tech-stack adoption, or other signals visible in JDs. Pass null or omit to skip this stage. |
qualifier_question | str | At least one of activity / qualifier required | Answered from LinkedIn people data (current-employee profiles). Natural-language criteria about the company’s team / org composition (e.g. "Has at least 5 SDRs and a Sales Director", "Has a dedicated AppSec / product-security team"). Use this for any question about who already works there or how the org is shaped. Pass null or omit to skip this stage. |
timeframe_days | int | No (default: 90) | Lookback window in days, 1–365, used by the activity stage. Ignored when activity_question is omitted. |
max_jobs_to_check | int | No (default: 25) | Upper bound on the number of recent job postings the activity stage scores with the LLM relevance pass, 1–200. Each job is judged by an LLM call, so higher values raise recall but add latency / token cost. The default is tuned for interactive use; bump it for batch / data-extraction workflows where you want maximum recall. Ignored when activity_question is omitted. |
Returns: An object with:
company — resolved firmographics for the domain (name, employee count, stage, industry, HQ location, short description, LinkedIn slug)
activity — null when not asked, otherwise { qualified, answer, confidence, jobs_searched, jobs_matched, sources: [...job postings], elapsed_ms }
qualifier — null when not asked, otherwise { qualified, answer, detailed_reasoning, people_evaluated, sources: [...profiles], elapsed_ms }
credits_consumed — exact amount billed for this call (0 on a 404)
latency_ms — end-to-end request latency
This tool is a thin wrapper over the Deep Research Agent Primitive API. The full request/response schema and examples live there.