Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Crustdata MCP connector

OAuth 2.1/DCRCRM & SalesSearch

Use Crustdata MCP to source candidates, prospect accounts, and enrich people and company data from your AI agent.

Crustdata MCP connector

  1. Terminal window
    npm install @scalekit-sdk/node

    Full SDK reference: Node.js | Python

  2. Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Register your Crustdata MCP credentials with Scalekit so it handles the token lifecycle. You do this once per environment.

    Dashboard setup steps

    Crustdata MCP uses OAuth 2.1 with Dynamic Client Registration (DCR) and PKCE. Scalekit handles client registration and token management automatically — no client ID or secret is needed in advance.

    1. Create a connection in Scalekit

      In the Scalekit dashboard, go to AgentKit > Connections and click Create Connection. Find Crustdata MCP and click Create.

    2. Authorize the connection

      After creating the connection, click Authorize. Scalekit registers an OAuth client with Crustdata via DCR and redirects you to Crustdata’s authorization page. Sign in with your Crustdata account and grant the requested permissions.

    3. Verify the connection is active

      Back in the Scalekit dashboard under AgentKit > Connections, confirm the Crustdata MCP connection shows a status of Active. Your AI agent can now call Crustdata tools through Scalekit.

  4. quickstart.ts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENV_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'crustdatamcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Crustdata MCP:', link)
    process.stdout.write('Press Enter after authorizing...')
    await new Promise(r => process.stdin.once('data', r))
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'crustdatamcp_crustdata_credits_check',
    toolInput: {},
    })
    console.log(result)

Connect this agent connector to let your agent:

  • Company crustdata autocomplete — Get autocomplete suggestions for CompanyDB field values
  • Filter crustdata autocomplete — Get autocomplete suggestions for search filter values
  • Person crustdata autocomplete — Get autocomplete suggestions for people database fields
  • Search crustdata batch job, crustdata company — Async batch job search from the database for up to 10 companies at once
  • Enrich crustdata batch people, crustdata company, crustdata people — Async batch contact enrichment for 1-1000 LinkedIn URLs
  • Identify crustdata company — Identify and match companies by name, domain, LinkedIn URL, Crunchbase URL, or Crustdata company_id

Get your cloud ID

Most Crustdata MCP tools require a cloudId — the UUID that identifies your Atlassian cloud site. Call crustdatamcp_getaccessibleatlassianresources once to retrieve it, then pass the id field value in every subsequent tool call.

// Step 1 — get the cloud ID
const resources = await actions.executeTool({
connectionName: 'crustdatamcp',
identifier: 'user_123',
toolName: 'crustdatamcp_getaccessibleatlassianresources',
toolInput: {},
});
const cloudId = resources[0].id;
// Step 2 — use cloudId in subsequent calls
const issue = await actions.executeTool({
connectionName: 'crustdatamcp',
identifier: 'user_123',
toolName: 'crustdatamcp_getjiraissue',
toolInput: {
cloudId,
issueIdOrKey: 'KAN-1',
},
});
console.log(issue);

The crustdatamcp_getaccessibleatlassianresources response looks like this:

[
{
"id": "a4c9b3e2-1234-5678-abcd-ef0123456789",
"name": "My Company",
"url": "https://mycompany.atlassian.net",
"scopes": ["read:jira-work", "write:jira-work", "read:confluence-content.all"]
}
]

Use id as the cloudId parameter. If the user belongs to multiple Atlassian sites, the list contains one entry per site — pick the one matching the target url.

Use the exact tool names from the Tool list below when you call execute_tool. If you’re not sure which name to use, list the tools available for the current user first.

crustdatamcp_crustdata_autocomplete_company#Get autocomplete suggestions for CompanyDB field values. Free — 0 credits consumed. Use to discover valid values before constructing a filter on crustdata_company_search_db (e.g. field='hq_city', query='san francisco' returns the actual stored values). Empty query is allowed — returns the most common values for the field.4 params

Get autocomplete suggestions for CompanyDB field values. Free — 0 credits consumed. Use to discover valid values before constructing a filter on crustdata_company_search_db (e.g. field='hq_city', query='san francisco' returns the actual stored values). Empty query is allowed — returns the most common values for the field.

NameTypeRequiredDescription
fieldstringrequiredField to get autocomplete suggestions for (e.g., 'company_name', 'hq_country', 'hq_city', 'linkedin_industries'). Works on any CompanyDB field.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
limitintegeroptionalMaximum number of suggestions (default: 20, max: 100).
querystringoptionalPrefix/query to get suggestions for. Empty string is allowed — returns the most common values for the field.
crustdatamcp_crustdata_autocomplete_filter#Get autocomplete suggestions for search filter values. Useful for building valid filters for people and company searches. Best coverage on 'region' and 'title'. 'school' returns matches for well-known institutions but may return empty for niche international schools. 'industry' is currently low-coverage upstream — prefer crustdata_autocomplete_company with field='linkedin_industries' for industry values when filtering company DB.5 params

Get autocomplete suggestions for search filter values. Useful for building valid filters for people and company searches. Best coverage on 'region' and 'title'. 'school' returns matches for well-known institutions but may return empty for niche international schools. 'industry' is currently low-coverage upstream — prefer crustdata_autocomplete_company with field='linkedin_industries' for industry values when filtering company DB.

NameTypeRequiredDescription
filter_typestringrequiredType of filter to get suggestions for. Valid values: 'region', 'industry', 'title', 'school'.
querystringrequiredSearch query for autocomplete suggestions (e.g., 'San' for regions, 'Tech' for industries).
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
countintegeroptionalMaximum number of suggestions to return (default: 10, max: 50).
startintegeroptionalStarting index for pagination (offset-based).
crustdatamcp_crustdata_autocomplete_person#Get autocomplete suggestions for people database fields. Useful for building filters or discovering valid field values before calling crustdata_people_search_db. CONTEXTUAL AUTOCOMPLETE: pass filters (same shape as PersonDB search filters) to narrow suggestions to a subset — e.g. field='current_employers.title' + filters for a specific company returns titles only for people at that company. Empty query is allowed — returns the most common values. Free of charge — no credits consumed.5 params

Get autocomplete suggestions for people database fields. Useful for building filters or discovering valid field values before calling crustdata_people_search_db. CONTEXTUAL AUTOCOMPLETE: pass filters (same shape as PersonDB search filters) to narrow suggestions to a subset — e.g. field='current_employers.title' + filters for a specific company returns titles only for people at that company. Empty query is allowed — returns the most common values. Free of charge — no credits consumed.

NameTypeRequiredDescription
fieldstringrequiredField name to autocomplete. Common fields: 'name', 'first_name', 'last_name', 'region', 'headline', 'skills', 'current_employers.name', 'current_employers.title', 'education_background.institute_name'. NOTE: Use 'name' not 'person_name', use 'current_employers.name' not 'company_name'.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
filtersobjectoptionalOptional filter criteria to narrow autocomplete suggestions. Same shape as PersonDB search filters: single {"filter_type": "...", "type": "...", "value": ...} or compound {"op": "and"|"or", "conditions": [...]}. Power-feature for contextual autocomplete.
limitintegeroptionalMaximum number of suggestions (default: 20, max: 100).
querystringoptionalPrefix/query to get suggestions for. Empty string is allowed — returns the most common values for the field.
crustdatamcp_crustdata_batch_job_search_live#Async batch LIVE job search across multiple companies. Scrapes LinkedIn in real-time for up to 10 companies at once, up to 100 jobs per company. Submits a batch job, polls until completion (~15-60s), then returns results. Use crustdata_company_identify first to get company IDs (free). For a single company, prefer crustdata_job_search_live instead.7 params

Async batch LIVE job search across multiple companies. Scrapes LinkedIn in real-time for up to 10 companies at once, up to 100 jobs per company. Submits a batch job, polls until completion (~15-60s), then returns results. Use crustdata_company_identify first to get company IDs (free). For a single company, prefer crustdata_job_search_live instead.

NameTypeRequiredDescription
crustdata_company_idsarrayrequiredList of Crustdata company IDs to fetch live jobs for (1-10). Get these from crustdata_company_identify (free).
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
compactbooleanoptionalStrip full job descriptions to reduce response size.
fieldsstringoptionalComma-separated list of fields to return per result.
formatstringoptionalResponse format: 'markdown' (default) or 'json'.
limitintegeroptionalMaximum number of job listings to return per company (default: 100, max: 100).
truncatebooleanoptionalIf true (default), enforce a 75K-char response cap. Set to false to bypass the cap.
crustdatamcp_crustdata_batch_people_enrich#Async batch contact enrichment for 1-1000 LinkedIn URLs. Returns business email, personal email, and phone numbers per URL. Submits a batch job, polls until completion (typical wall time 60-180 seconds regardless of input size), then returns parsed results. Use this over crustdata_people_enrich when: 4+ LinkedIn URLs at once, user asks for contact info with high fill rate, or sync enrichment returned missing emails. Batch runs the full enrichment waterfall — on a 50-URL sample, batch lifted business-email fill from 32% to 82%. Access is per-user gated; on 403, user needs to ping gtm@crustdata.co.4 params

Async batch contact enrichment for 1-1000 LinkedIn URLs. Returns business email, personal email, and phone numbers per URL. Submits a batch job, polls until completion (typical wall time 60-180 seconds regardless of input size), then returns parsed results. Use this over crustdata_people_enrich when: 4+ LinkedIn URLs at once, user asks for contact info with high fill rate, or sync enrichment returned missing emails. Batch runs the full enrichment waterfall — on a 50-URL sample, batch lifted business-email fill from 32% to 82%. Access is per-user gated; on 403, user needs to ping gtm@crustdata.co.

NameTypeRequiredDescription
professional_network_profile_urlsarrayrequiredList of LinkedIn profile URLs to enrich (1-1000). Example: ['https://www.linkedin.com/in/satyanadella', 'https://www.linkedin.com/in/sundarpichai']. Each URL costs the vendor charge per result returned.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
fieldsarrayoptionalDotted-path field names to return. Default: ['business_email', 'personal_contact_info.personal_emails', 'personal_contact_info.phone_numbers']. Other valid roots: 'business_email', 'personal_contact_info'. Use dots for nested paths (e.g. 'personal_contact_info.phone_numbers').
poll_timeout_secondsintegeroptionalMax seconds to wait for batch completion before returning a timeout response (default 300). Long-running batches return the batch_id so the caller can re-poll later.
crustdatamcp_crustdata_company_enrich#Get comprehensive company profile data. Each identifier (company_domain, company_name, company_linkedin_url, company_id) accepts a comma-separated list of up to 25 entries for batch enrichment. Omit `fields` for the basic firmographics bundle; pass `fields=[...]` with opt-in nested objects you need (headcount, funding_and_investment, web_traffic, etc.).9 params

Get comprehensive company profile data. Each identifier (company_domain, company_name, company_linkedin_url, company_id) accepts a comma-separated list of up to 25 entries for batch enrichment. Omit `fields` for the basic firmographics bundle; pass `fields=[...]` with opt-in nested objects you need (headcount, funding_and_investment, web_traffic, etc.).

NameTypeRequiredDescription
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
company_domainstringoptionalCompany domain (e.g., 'anthropic.com'). Can be comma-separated for multiple (max 25).
company_idstringoptionalCrustdata company ID. Can be comma-separated for multiple (max 25).
company_linkedin_urlstringoptionalLinkedIn company page URL. Can be comma-separated for multiple (max 25).
company_namestringoptionalCompany name. Can be comma-separated for multiple (max 25).
enrich_realtimebooleanoptionalForce real-time enrichment (slower but more current data). Default: false (uses cached data).
exact_matchbooleanoptionalControls how company_name and company_domain are matched. true: exact string match. false (default): fuzzy match — may return more than one company.
fieldsarrayoptionalOptional list of fields to include in the response. Omit for basic firmographics. Opt-in nested objects: all_office_addresses, competitors, cxos, decision_makers, founders, funding_and_investment, g2, gartner, glassdoor, headcount, job_openings, linkedin_followers, news_articles, producthunt, seo, taxonomy, web_traffic.
truncatebooleanoptionalIf true (default), cap multi-company responses at ~75K chars by progressive compaction. Set to false to bypass the cap.
crustdatamcp_crustdata_company_identify#Identify and match companies by name, domain, LinkedIn URL, Crunchbase URL, or Crustdata company_id. Pass ONE identifier type per call; within that type, comma-separate up to 25 values for batch identification. Returns {companies: [...], count: N, used_identifier?, dropped_identifiers?, note?}. Use this to find the Crustdata company_id for follow-up enrichment.8 params

Identify and match companies by name, domain, LinkedIn URL, Crunchbase URL, or Crustdata company_id. Pass ONE identifier type per call; within that type, comma-separate up to 25 values for batch identification. Returns {companies: [...], count: N, used_identifier?, dropped_identifiers?, note?}. Use this to find the Crustdata company_id for follow-up enrichment.

NameTypeRequiredDescription
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
company_crunchbase_urlstringoptionalCrunchbase company URL. Accepts vanity form ('https://www.crunchbase.com/organization/retool') or UUID form. Comma-separated for up to 25.
company_idstringoptionalCrustdata company ID. Comma-separated for up to 25 IDs.
company_linkedin_urlstringoptionalLinkedIn company page URL. Accepts vanity form ('https://linkedin.com/company/tryretool') or LinkedIn-ID form ('https://www.linkedin.com/company/11869260'). Comma-separated for up to 25.
company_namestringoptionalCompany name to search for. Single value or comma-separated list of up to 25 names (e.g., 'Anthropic' or 'Anthropic,OpenAI,Mistral').
company_websitestringoptionalCompany website domain (e.g., 'anthropic.com'). Single value or comma-separated list of up to 25 domains.
countintegeroptionalMaximum number of matches to return per query (default: 10, max: 25).
exact_matchbooleanoptionalIf true, only return exact matches. Default is fuzzy matching.
crustdatamcp_crustdata_company_search_db#Search the Crustdata company database with flexible filters. Fast search against pre-indexed data. Uses 'filter_type'/'type'/'value' keys (NOT 'column'). Call crustdata_autocomplete_company first to resolve exact values for categorical fields like linkedin_industries or country. By default returns compact records with key fields only.9 params

Search the Crustdata company database with flexible filters. Fast search against pre-indexed data. Uses 'filter_type'/'type'/'value' keys (NOT 'column'). Call crustdata_autocomplete_company first to resolve exact values for categorical fields like linkedin_industries or country. By default returns compact records with key fields only.

NameTypeRequiredDescription
filtersobjectrequiredSearch filters using 'filter_type'/'type'/'value' keys. Single: {"filter_type": "company_name", "type": "(.)", "value": "Anthropic"}. Multiple: {"op": "and", "conditions": [{"filter_type": "hq_country", "type": "=", "value": "USA"}, {"filter_type": "employee_metrics.latest_count", "type": ">", "value": 100}]}. Operators: = != in not_in > < => =< (.) [.]
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
compactbooleanoptionalStrip verbose nested data to reduce response size. Keeps: name, website, HQ, industries, headcount, growth, total funding. Set to false for full data.
cursorstringoptionalPagination cursor from previous response. Must be paired with the same filters and sorts — do not reuse with different parameters.
fieldsstringoptionalComma-separated list of fields to return per result. Supports dot-notation: 'company_name,hq_country,employee_count_range'.
formatstringoptionalResponse format: 'markdown' (default) or 'json'. Markdown tables are more token-efficient.
limitintegeroptionalNumber of results to return (default: 20, max: 1000).
sortsarrayoptionalSort options. Each entry: {column: <field>, order: 'asc'|'desc'}. Common sort fields: employee_metrics.latest_count, employee_metrics.growth_12m_percent, crunchbase_total_investment_usd, last_funding_date.
truncatebooleanoptionalIf true (default), enforce a 75K-char response cap. Set to false to bypass the cap.
crustdatamcp_crustdata_company_social_posts#DEPRECATED — call crustdata_social_posts_by_keyword instead. This name is kept as a temporary alias for backward compatibility; it forwards to crustdata_social_posts_by_keyword and will be removed in a future release. Searches LINKEDIN posts by keyword, covering BOTH company and personal posts.15 params

DEPRECATED — call crustdata_social_posts_by_keyword instead. This name is kept as a temporary alias for backward compatibility; it forwards to crustdata_social_posts_by_keyword and will be removed in a future release. Searches LINKEDIN posts by keyword, covering BOTH company and personal posts.

NameTypeRequiredDescription
keywordstringrequiredKeyword or phrase to search for in social posts. MAX 6 KEYWORDS joined by OR/AND operators (at most 5 operators in the string). Quoted phrases count as one keyword. Examples: 'AI', 'AI OR documentation'.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
compactbooleanoptionalStrip verbose engagement data and truncate post text. Set to false for full post data.
content_typearrayoptionalFilter by content type. Allowed values: 'photos', 'videos', 'documents', 'jobs', 'collaborativeArticles', 'liveVideos'.
date_postedstringoptionalDate window filter. Values: 'past-24h', 'past-week', 'past-month', 'past-quarter', 'past-year'.
exact_keyword_matchbooleanoptionalIf true, only return posts containing the exact keyword phrase. REQUIRES limit (NOT page).
fieldsstringoptionalComma-separated fields. Add 'reactors' for users who reacted, 'comments' for comments.
filtersarrayoptionalAdditional post-level filters combined with AND (author / company constraints, etc.).
formatstringoptionalResponse format: 'markdown' (default) or 'json'.
limitintegeroptionalNumber of posts to return per request (1-500). Server default is 5. NOTE: when page is also set, the server caps limit at 5.
max_commentsintegeroptionalMax comments per post when 'comments' is in fields (0-5000). Server default is 5.
max_reactorsintegeroptionalMax reactors per post when 'reactors' is in fields (0-5000). Server default is 5.
pageintegeroptionalPage number for pagination (1-100). Each page returns up to 5 posts. Cannot be combined with exact_keyword_match=true.
sort_bystringoptionalSort order. Recommended: 'relevance' (default). 'date_posted' is DEPRECATED; combine sort_by='relevance' with the date_posted filter for time-bounded results.
truncatebooleanoptionalIf true (default), enforce a 75K-char response cap. Set to false to bypass the cap.
crustdatamcp_crustdata_credit_costs#Return a markdown table of how many Crustdata credits each MCP tool call costs, broken down by variation (in-DB vs realtime, reactors/comments, business email, exact keyword match, per-result vs per-100-results, etc.). Free — makes no API call and consumes no credits. Use this to answer 'how much does X cost?' or to compare costs before making expensive calls. Note: credits are only charged when a call returns results.1 param

Return a markdown table of how many Crustdata credits each MCP tool call costs, broken down by variation (in-DB vs realtime, reactors/comments, business email, exact keyword match, per-result vs per-100-results, etc.). Free — makes no API call and consumes no credits. Use this to answer 'how much does X cost?' or to compare costs before making expensive calls. Note: credits are only charged when a call returns results.

NameTypeRequiredDescription
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
crustdatamcp_crustdata_credits_check#Check your remaining Crustdata API credit balance. Free — consumes no credits.1 param

Check your remaining Crustdata API credit balance. Free — consumes no credits.

NameTypeRequiredDescription
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
crustdatamcp_crustdata_get_skill_body#Fetch the live SKILL.md body for a centrally-managed skill. The local SKILL.md installed at ~/.claude/skills/<name>/SKILL.md is intentionally a stub that points here — call this tool to get the current playbook before executing the skill. Returns the full instructions exactly as authored in the admin UI. Throws if the caller hasn't been granted access to this skill.2 params

Fetch the live SKILL.md body for a centrally-managed skill. The local SKILL.md installed at ~/.claude/skills/<name>/SKILL.md is intentionally a stub that points here — call this tool to get the current playbook before executing the skill. Returns the full instructions exactly as authored in the admin UI. Throws if the caller hasn't been granted access to this skill.

NameTypeRequiredDescription
skill_namestringrequiredName of the skill (folder name), e.g. 'research-person'.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
crustdatamcp_crustdata_get_skill_file#Fetch a helper file (reference, script, README, etc.) for a centrally-managed skill. Use this whenever the live SKILL.md body (from crustdata_get_skill_body) references a relative path like `references/foo.md` or `scripts/bar.py` — the file is NOT installed locally, only on the server. For executable scripts, write the returned content to a temp path before running.3 params

Fetch a helper file (reference, script, README, etc.) for a centrally-managed skill. Use this whenever the live SKILL.md body (from crustdata_get_skill_body) references a relative path like `references/foo.md` or `scripts/bar.py` — the file is NOT installed locally, only on the server. For executable scripts, write the returned content to a temp path before running.

NameTypeRequiredDescription
file_pathstringrequiredRelative path within the skill, e.g. 'references/profile-card.md' or 'scripts/compress_pool.py'.
skill_namestringrequiredName of the skill (folder name), e.g. 'source-candidates'.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
crustdatamcp_crustdata_get_twitter_posts#Find recent Twitter/X posts from a company or person by their Twitter handle. USE THIS TOOL whenever the user asks about Twitter posts, X posts, or tweets — NOT the social_posts tools (those are LinkedIn only). Returns post titles, URLs, and snippets.3 params

Find recent Twitter/X posts from a company or person by their Twitter handle. USE THIS TOOL whenever the user asks about Twitter posts, X posts, or tweets — NOT the social_posts tools (those are LinkedIn only). Returns post titles, URLs, and snippets.

NameTypeRequiredDescription
twitter_handlestringrequiredTwitter/X handle of the company or person (with or without @). For example: 'crustdata' or '@crustdata'.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
num_pagesintegeroptionalNumber of result pages. Each page returns up to ~10 posts. Default: 1.
crustdatamcp_crustdata_healthz#Lightweight liveness probe for the Crustdata MCP server itself. Returns {status: 'ok'} when the server is reachable. Does NOT call the Crustdata API or consume credits. Use this when you need to verify the MCP connection is healthy without spending credits.1 param

Lightweight liveness probe for the Crustdata MCP server itself. Returns {status: 'ok'} when the server is reachable. Does NOT call the Crustdata API or consume credits. Use this when you need to verify the MCP connection is healthy without spending credits.

NameTypeRequiredDescription
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
crustdatamcp_crustdata_install_skills#Install Crustdata research skills locally so they appear as native /slash-commands in Claude Code (e.g., /research-person). By default writes full skill content (SKILL.md + helper files like references/, scripts/) plus a .crustdata_version marker. Each skill becomes invokable without any further server roundtrips. Use crustdata_skill_versions periodically to check whether a re-install is needed.3 params

Install Crustdata research skills locally so they appear as native /slash-commands in Claude Code (e.g., /research-person). By default writes full skill content (SKILL.md + helper files like references/, scripts/) plus a .crustdata_version marker. Each skill becomes invokable without any further server roundtrips. Use crustdata_skill_versions periodically to check whether a re-install is needed.

NameTypeRequiredDescription
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
onlyarrayoptionalOptional list of skill names to install. When set, only those skills are returned (intersected with caller's grants). When omitted, returns every granted skill.
stub_onlybooleanoptionalIf true, install only thin SKILL.md stubs that fetch full content via crustdata_get_skill_body on every invocation (legacy behavior — guarantees always-fresh content but adds a tool roundtrip per use). Default: false (write full skill content + helper files locally for fast invocation).
crustdatamcp_crustdata_job_search_live#Fetch LIVE job listings from LinkedIn for a specific company. Scrapes LinkedIn in real-time — slower than crustdata_job_search but returns the most current data. No charge when 0 results come back. Use crustdata_company_identify first to get the crustdata_company_id (free). This tool only filters by company; use crustdata_job_search for filtering by title/location/category.8 params

Fetch LIVE job listings from LinkedIn for a specific company. Scrapes LinkedIn in real-time — slower than crustdata_job_search but returns the most current data. No charge when 0 results come back. Use crustdata_company_identify first to get the crustdata_company_id (free). This tool only filters by company; use crustdata_job_search for filtering by title/location/category.

NameTypeRequiredDescription
crustdata_company_idintegerrequiredCrustdata company ID to fetch live job listings for. Get this from crustdata_company_identify (free) first.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
compactbooleanoptionalStrip full job descriptions to reduce response size. Set to false to include descriptions.
fieldsstringoptionalComma-separated list of fields to return per result: 'title,company_name,location,url'.
formatstringoptionalResponse format: 'markdown' (default) or 'json'.
limitintegeroptionalMaximum number of job listings to return (default: 100, max: 100).
sort_orderstringoptionalOrder of returned listings. Options: 'recent_first' (default — newest postings first), 'oldest_first', 'api_default' (upstream insertion order).
truncatebooleanoptionalIf true (default), enforce a 75K-char response cap. Set to false to bypass the cap.
crustdatamcp_crustdata_list_my_skills#List the Crustdata skills your account has access to install. Use this BEFORE crustdata_install_skills to see what's available, or to confirm what was granted. Returns names + descriptions.1 param

List the Crustdata skills your account has access to install. Use this BEFORE crustdata_install_skills to see what's available, or to confirm what was granted. Returns names + descriptions.

NameTypeRequiredDescription
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
crustdatamcp_crustdata_people_enrich#Get detailed person profile data by LinkedIn URL, business email, personal email, or GitHub URL. ENRICH MULTIPLE PROFILES IN ONE CALL — DO NOT LOOP. linkedin_profile_url (and other identifiers) accept COMMA-SEPARATED values, up to 25 per call. ONE call with 25 comma-separated URLs is ~10x FASTER than 25 separate calls. Use exactly ONE identifier TYPE per call. Returns professional information including current role, company, experience history, education, and skills. Supports reverse lookup by personal email or GitHub URL.12 params

Get detailed person profile data by LinkedIn URL, business email, personal email, or GitHub URL. ENRICH MULTIPLE PROFILES IN ONE CALL — DO NOT LOOP. linkedin_profile_url (and other identifiers) accept COMMA-SEPARATED values, up to 25 per call. ONE call with 25 comma-separated URLs is ~10x FASTER than 25 separate calls. Use exactly ONE identifier TYPE per call. Returns professional information including current role, company, experience history, education, and skills. Supports reverse lookup by personal email or GitHub URL.

NameTypeRequiredDescription
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
business_emailstringoptionalBusiness email address. Can be comma-separated for up to 25 emails. Mutually exclusive with linkedin_profile_url / personal_email / github_profile_url.
enrich_realtimebooleanoptionalTrigger a live LinkedIn scrape ONLY for profiles whose DB cache is stale or missing. Default: false.
fieldsstringoptionalComma-separated field names to return. Limits the response to ONLY these fields. include_* flags are additive on top of this list. Ignored when include_all_fields=true.
force_fetchbooleanoptionalBypass the DB cache entirely and scrape every requested profile live. Requires enrich_realtime=true. Use sparingly — costs realtime scrape credits per profile. Default: false.
github_profile_urlstringoptionalGitHub profile URL (e.g., 'https://github.com/octocat'). Reverse lookup to find the person's LinkedIn profile and full professional data. Can be comma-separated for up to 25 profiles.
include_all_fieldsbooleanoptionalReturn the full curated profile bundle (name, headline, summary, employers, education, skills, etc.). OVERRIDES the fields param when set. Does NOT include business_email, github_profiles, or personal_contact_info — use the dedicated include_* flags for those.
include_business_emailbooleanoptionalInclude verified business/work email. Set to true ONLY when the user explicitly asks for business email or wants to email the person for outreach.
include_github_profilesbooleanoptionalAppend github_profiles to the returned field set. Set to true ONLY when the user explicitly asks for GitHub, git activity, repos, or developer/code profile data.
include_personal_contact_infobooleanoptionalInclude personal emails and phone numbers. Set to true ONLY when the user explicitly asks for personal email, phone number, or mobile. May return 403 if not in user's plan.
linkedin_profile_urlstringoptionalLinkedIn profile URL (e.g., 'https://linkedin.com/in/johndoe'). Can be comma-separated for up to 25 profiles. Mutually exclusive with business_email / personal_email / github_profile_url.
personal_emailstringoptionalPersonal email address (e.g., Gmail, Yahoo). Reverse lookup to find the person's LinkedIn profile and professional data. Can be comma-separated for up to 25 emails.
crustdatamcp_crustdata_people_search_db#ALWAYS USE THIS TOOL FIRST for any people search. Primary search across 800M+ professional profiles. Up to 1000 per request with cursor pagination. Do NOT use crustdata_people_search unless this returns 0 results AND the user needs live LinkedIn data. FILTER SYNTAX: Each filter uses 'column'/'type'/'value' keys (NOT 'filter_type'). Combine multiple filters with {'op': 'and', 'conditions': [...]}. CATEGORICAL FIELDS: For current_employers.title, region, current_employers.seniority_level etc., call crustdata_autocomplete_person FIRST to resolve exact stored values.11 params

ALWAYS USE THIS TOOL FIRST for any people search. Primary search across 800M+ professional profiles. Up to 1000 per request with cursor pagination. Do NOT use crustdata_people_search unless this returns 0 results AND the user needs live LinkedIn data. FILTER SYNTAX: Each filter uses 'column'/'type'/'value' keys (NOT 'filter_type'). Combine multiple filters with {'op': 'and', 'conditions': [...]}. CATEGORICAL FIELDS: For current_employers.title, region, current_employers.seniority_level etc., call crustdata_autocomplete_person FIRST to resolve exact stored values.

NameTypeRequiredDescription
filtersobjectrequiredSearch filters. Each filter has exactly 3 keys: "column", "type", "value". Single: {"column": "name", "type": "[.]", "value": "Chris"}. Multiple (AND): {"op": "and", "conditions": [...]}. Operators: [.]=substring, (.)=fuzzy, (!)=fuzzy negation, = !=, in/not_in, >/</=>/=<, geo_distance. Key columns: name, headline, region, skills, current_employers.name, current_employers.title, current_employers.seniority_level, years_of_experience_raw.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
compactbooleanoptionalStrip verbose nested data to reduce response size. Keeps: name, headline, region, skills, emails, education, current employers. Set to false for full profiles including complete work history.
cursorstringoptionalPagination cursor from previous response for fetching next page. TIED TO the original filters + sorts — reusing with different filters/sorts returns an error. Treat as opaque; don't modify.
exclude_namesarrayoptionalList of exact full-name strings to drop from results (e.g. test accounts, banned names).
exclude_profilesarrayoptionalList of LinkedIn profile URLs to drop from results. Useful for de-duping across paginated calls. Each URL MUST match https://www.linkedin.com/in/{slug} exactly. Max 50,000 entries.
fieldsstringoptionalSTRONGLY RECOMMENDED when you only need specific data. Comma-separated list of fields to return per result (e.g. 'name,linkedin_profile_url,current_employers.title,emails'). Supports dot-notation. Avoids auto-compaction and eliminates need for follow-up enrich calls.
formatstringoptionalResponse format: 'markdown' (default) or 'json'. Markdown tables are much more token-efficient. Use 'json' for programmatic processing.
limitintegeroptionalNumber of results to return (default: 20, max: 1000).
sortsarrayoptionalSort options. Example: [{"column": "years_of_experience_raw", "order": "desc"}]. Sortable columns: current_employers.company_headcount_latest, name, num_of_connections, years_of_experience_raw, etc.
truncatebooleanoptionalIf true (default), enforce a 75K-char response cap. Set to false to bypass the cap — Claude Code will spill large results to a file automatically.
crustdatamcp_crustdata_people_search_db_v2#PEOPLE SEARCH — NEW DATASET API (v2025-11-01). DO NOT USE BY DEFAULT — use crustdata_people_search_db for normal people search. Only use this v2 tool when the user EXPLICITLY asks for it (phrases like 'use the new API', 'use v2', 'use the 2025-11-01 API'). Differences from legacy: same DB, richer nested response shape, vanity LinkedIn URLs. FILTER SHAPE: leaves use {field, type, value} (NOT 'column'). Field paths are nested (e.g. basic_profile.name, experience.employment_details.current.title).7 params

PEOPLE SEARCH — NEW DATASET API (v2025-11-01). DO NOT USE BY DEFAULT — use crustdata_people_search_db for normal people search. Only use this v2 tool when the user EXPLICITLY asks for it (phrases like 'use the new API', 'use v2', 'use the 2025-11-01 API'). Differences from legacy: same DB, richer nested response shape, vanity LinkedIn URLs. FILTER SHAPE: leaves use {field, type, value} (NOT 'column'). Field paths are nested (e.g. basic_profile.name, experience.employment_details.current.title).

NameTypeRequiredDescription
filtersobjectrequiredFilter tree. LEAF: {"field": "<nested.path>", "type": "<operator>", "value": ...}. BRANCH: {"op": "and"|"or", "conditions": [...]}. NOTE: use 'field' (not 'column' like the legacy tool). Common field paths: basic_profile.name, basic_profile.headline, basic_profile.location.country, experience.employment_details.current.company_name, experience.employment_details.current.title, experience.employment_details.current.seniority_level, education.schools.school, skills.professional_network_skills, years_of_experience_raw.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
cursorstringoptionalPagination cursor from previous response.
fieldsstringoptionalLimit response to specific field paths (e.g. ['basic_profile.name', 'social_handles.professional_network_identifier.profile_url']). Omit for full nested payload. Comma-separated string also accepted.
limitintegeroptionalResults per page (1-100, default 20).
sortsarrayoptionalOptional sort list. Example: [{"field": "years_of_experience_raw", "order": "desc"}]. Each entry: field + order (asc/desc).
truncatebooleanoptionalIf true (default), enforce a 75K-char response cap by progressively dropping fields. Set false when dumping raw data for offline analysis.
crustdatamcp_crustdata_people_search_semantic#PEOPLE SEMANTIC SEARCH (beta) — natural-language people search on the /person/search dataset (v2025-11-01). DO NOT USE BY DEFAULT — use crustdata_people_search_db for normal people search. Only use this when the user EXPLICITLY asks for semantic / natural-language search. Ranks people by how well their whole profile matches the query text. KEY: results ALWAYS come back — read the per-profile 'fit' tier (strong/possible/weak) to judge quality. Results are relevance-ordered; sorting is not available. Cost: 0.03 credits per result.9 params

PEOPLE SEMANTIC SEARCH (beta) — natural-language people search on the /person/search dataset (v2025-11-01). DO NOT USE BY DEFAULT — use crustdata_people_search_db for normal people search. Only use this when the user EXPLICITLY asks for semantic / natural-language search. Ranks people by how well their whole profile matches the query text. KEY: results ALWAYS come back — read the per-profile 'fit' tier (strong/possible/weak) to judge quality. Results are relevance-ordered; sorting is not available. Cost: 0.03 credits per result.

NameTypeRequiredDescription
querystringrequiredNatural-language description of the people to find — a role, persona, skill set, or pasted job description. e.g. 'founding engineers at developer-tools startups', 'backend engineers with Golang and distributed systems experience'. This text is the ranking signal.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
cursorstringoptionalPagination cursor from a previous response.
fieldsstringoptionalLimit the response to specific field paths (list or comma-separated string). 'fit' is auto-added so the per-profile relevance tier is never dropped. Omit for the full nested payload.
filtersobjectoptionalOPTIONAL structured filter tree to constrain/seed the ranked set — same shape as crustdata_people_search_db_v2. LEAF: {"field": "<nested.path>", "type": "<operator>", "value": ...}. BRANCH: {"op": "and"|"or", "conditions": [...]}.
limitintegeroptionalResults per page (1-100, default 20).
recall_modestringoptionalHow explicit filters combine with the query. 'managed' (default) = filters are a ranking signal. 'exact' = filters are hard constraints and query only ranks within them. Use 'exact' when every returned profile MUST satisfy your filters.
search_modestringoptionalRetrieval signal for the query. 'hybrid' (default) = keyword + vector, best general default. 'lexical' = keyword only (exact terms, acronyms, names, IDs). 'semantic' = vector only (concept match even with different wording).
truncatebooleanoptionalIf true (default), enforce a 75K-char response cap. Set false when dumping raw data for offline analysis.
crustdatamcp_crustdata_skill_versions#Return current server-side version markers for the caller's granted skills. Each version is the ISO timestamp of the most recent update to the skill in the admin DB. Compare against the .crustdata_version file written at install time — if they differ, re-run crustdata_install_skills to refresh local content. Cheap, single DB query. Safe to call once per session.1 param

Return current server-side version markers for the caller's granted skills. Each version is the ISO timestamp of the most recent update to the skill in the admin DB. Compare against the .crustdata_version file written at install time — if they differ, re-run crustdata_install_skills to refresh local content. Cheap, single DB query. Safe to call once per session.

NameTypeRequiredDescription
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
crustdatamcp_crustdata_social_posts#Get recent LinkedIn posts authored by a specific person OR company profile, OR fetch a single post by URL. LinkedIn only — for Twitter/X posts use crustdata_get_twitter_posts. Provide exactly ONE identifier: person_linkedin_url, company_domain, company_linkedin_url, company_name, company_id, or linkedin_post_url (single-post mode). Posts are always sorted by date (most recent first). Add 'reactors' and/or 'comments' to the fields parameter for engagement details.16 params

Get recent LinkedIn posts authored by a specific person OR company profile, OR fetch a single post by URL. LinkedIn only — for Twitter/X posts use crustdata_get_twitter_posts. Provide exactly ONE identifier: person_linkedin_url, company_domain, company_linkedin_url, company_name, company_id, or linkedin_post_url (single-post mode). Posts are always sorted by date (most recent first). Add 'reactors' and/or 'comments' to the fields parameter for engagement details.

NameTypeRequiredDescription
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
compactbooleanoptionalStrip verbose engagement data and truncate post text. Set to false for full post data.
company_domainstringoptionalCompany domain to fetch posts for (e.g., 'anthropic.com').
company_idstringoptionalCrustdata company ID to fetch posts for.
company_linkedin_urlstringoptionalLinkedIn company page URL (e.g., 'https://linkedin.com/company/anthropic').
company_namestringoptionalCompany name to fetch posts for.
fieldsstringoptionalComma-separated fields. Add 'reactors' for users who reacted, 'comments' for comments.
limitintegeroptionalNumber of posts to return per request (1-100). Default: 20.
linkedin_post_urlstringoptionalFetch a single LinkedIn post by its direct URL. Returns exactly one post and disables pagination. Mutually exclusive with person_linkedin_url and the company_* identifiers.
max_commentsintegeroptionalMax comments per post when 'comments' is in fields. Server default: 100. Valid range 1-5000; 0 means no comment data.
max_reactorsintegeroptionalMax reactors per post when 'reactors' is in fields. Server default: 100. Valid range 1-5000; 0 means no reactor data.
pageintegeroptionalPage number for pagination (1-20). Most recent posts on page 1.
person_linkedin_urlstringoptionalLinkedIn profile URL of a person (e.g., 'https://linkedin.com/in/johndoe'). Mutually exclusive with the company_* identifiers and linkedin_post_url.
post_typesstringoptionalComma-separated post types: 'original', 'repost', or 'repost,original' (default).
response_formatstringoptionalResponse format: 'markdown' (default) or 'json'. Markdown tables are more token-efficient.
truncatebooleanoptionalIf true (default), enforce a 75K-char response cap. Set to false to bypass the cap.
crustdatamcp_crustdata_social_posts_by_keyword#Search LINKEDIN posts by keyword (POST /screener/linkedin_posts/keyword_search/). Finds BOTH company and personal LinkedIn posts mentioning specific topics, products, or trends. Useful for market research, competitive intelligence, and trend analysis. CONSTRAINT: keyword accepts at most 6 keywords joined by OR/AND (max 5 operators). By default (compact=true), returns trimmed posts. Set compact=false for full data.15 params

Search LINKEDIN posts by keyword (POST /screener/linkedin_posts/keyword_search/). Finds BOTH company and personal LinkedIn posts mentioning specific topics, products, or trends. Useful for market research, competitive intelligence, and trend analysis. CONSTRAINT: keyword accepts at most 6 keywords joined by OR/AND (max 5 operators). By default (compact=true), returns trimmed posts. Set compact=false for full data.

NameTypeRequiredDescription
keywordstringrequiredKeyword or phrase to search for in social posts. MAX 6 KEYWORDS joined by OR/AND operators (so at most 5 operators in the string). 7+ keywords will return a 400 error. Quoted phrases count as one keyword regardless of words inside. Examples: 'AI', 'AI OR documentation', '"AI Engineer" OR "ML Engineer" OR "Data Scientist"'. To search 7+ terms, split into multiple calls and merge results.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
compactbooleanoptionalStrip verbose engagement data (full reactor/comment lists) and truncate post text. Set to false for full post data including all reactors and comments.
content_typearrayoptionalFilter by content type. Allowed values: 'photos', 'videos', 'documents', 'jobs', 'collaborativeArticles', 'liveVideos'. Example: ['photos', 'videos'].
date_postedstringoptionalDate window filter (server default: 'past-month'). Values: 'past-24h', 'past-week', 'past-month', 'past-quarter', 'past-year'.
exact_keyword_matchbooleanoptionalIf true, only return posts containing the exact keyword phrase. REQUIRES limit (NOT page) — when true the API scans the first n posts (n=limit) and returns only the exact-match subset; may return fewer than limit. If no posts match, returns a 404.
fieldsstringoptionalComma-separated fields. Add 'reactors' for users who reacted, 'comments' for comments. Affects cost: default=1/post, with reactors=5/post, with comments=5/post, with both=10/post.
filtersarrayoptionalAdditional post-level filters combined with AND. Each entry is a filter dict (author / company constraints, etc.). Posts must satisfy ALL listed filters.
formatstringoptionalResponse format: 'markdown' (default) or 'json'. Use 'json' for programmatic processing.
limitintegeroptionalNumber of posts to return per request (1-500). Server default is 5. NOTE: when page is also set, the server caps limit at 5 — for bulk retrieval use limit WITHOUT page.
max_commentsintegeroptionalMax comments per post when 'comments' is in fields (0-5000). Server default is 5. Omit to use the server default.
max_reactorsintegeroptionalMax reactors per post when 'reactors' is in fields (0-5000). Server default is 5. Omit to use the server default.
pageintegeroptionalPage number for pagination (1-100). Each page returns up to 5 posts. When page is set, limit cannot exceed 5. CANNOT be combined with exact_keyword_match=true — use limit instead.
sort_bystringoptionalSort order. Recommended: 'relevance' (default — sorts by top match). 'date_posted' is DEPRECATED; for time-bounded results combine sort_by='relevance' with the date_posted date-window filter.
truncatebooleanoptionalIf true (default), enforce a 75K-char response cap by progressively compacting/dropping fields. Set to false to bypass the cap entirely.
crustdatamcp_crustdata_watcher_cancel#Permanently cancel a watcher subscription by ID. Cancellation is irreversible — the watch stops running and cannot be reactivated (use crustdata_watcher_update with status='paused' if you only want to pause it). Notification history and run records are preserved. The cancelled watch is hidden from crustdata_watcher_list unless include_cancelled=true.2 params

Permanently cancel a watcher subscription by ID. Cancellation is irreversible — the watch stops running and cannot be reactivated (use crustdata_watcher_update with status='paused' if you only want to pause it). Notification history and run records are preserved. The cancelled watch is hidden from crustdata_watcher_list unless include_cancelled=true.

NameTypeRequiredDescription
subscription_idintegerrequiredID of the watch to cancel. Must be positive. Cancellation is permanent and irreversible.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
crustdatamcp_crustdata_watcher_create#Create a watcher to monitor events. No webhook hosting required — if the user does not provide notification_endpoint, the watcher posts to a Crustdata-managed receiver and the MCP retrieves delivered payloads via crustdata_watcher_run_summary. Creating a watch is FREE; credits are only charged when the watch runs. Event types include 'job-posting-with-keyword-and-location' (new job postings), 'company-watch-linkedin-posts' (company LinkedIn activity), 'linkedin-person-post-updates' (person LinkedIn posts), 'person-discovery-via-filters' (people matching Sales Nav filters), and more. Use crustdata_watcher_simulate to dry-run first, crustdata_watcher_cancel to permanently stop a watch. The response includes an `api_request` field with the exact JSON body posted and a copy-pasteable curl; after creating, surface that curl to the user so they can reproduce or save it.10 params

Create a watcher to monitor events. No webhook hosting required — if the user does not provide notification_endpoint, the watcher posts to a Crustdata-managed receiver and the MCP retrieves delivered payloads via crustdata_watcher_run_summary. Creating a watch is FREE; credits are only charged when the watch runs. Event types include 'job-posting-with-keyword-and-location' (new job postings), 'company-watch-linkedin-posts' (company LinkedIn activity), 'linkedin-person-post-updates' (person LinkedIn posts), 'person-discovery-via-filters' (people matching Sales Nav filters), and more. Use crustdata_watcher_simulate to dry-run first, crustdata_watcher_cancel to permanently stop a watch. The response includes an `api_request` field with the exact JSON body posted and a copy-pasteable curl; after creating, surface that curl to the user so they can reproduce or save it.

NameTypeRequiredDescription
event_filtersarrayrequiredEvent-specific filters. Example: [{"filter_type": "REGION", "type": "in", "value": "San Francisco"}]. For title matching use CURRENT_TITLE (tokenized) or KEYWORD (phrase-exact). For job-posting watchers include TITLE+REGION. For person-discovery include CURRENT_TITLE, REGION, SENIORITY_LEVEL, etc.
event_type_slugstringrequiredType of event to monitor. Options include: 'linkedin-person-profile-updates', 'linkedin-person-post-updates', 'linkedin-person-press-mentions', 'company-watch-linkedin-posts', 'company-watch-linkedin-job-postings', 'company-watch-funding-milestones', 'company-watch-press-mentions', 'company-watch-headcount-growth', 'person-discovery-via-filters', 'linkedin-post-with-keyword', 'new-funding-announcements', 'job-posting-with-keyword-and-location', 'job-posting-with-location', 'person-starting-new-position', 'company-headcount-growth', and more.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
account_filtersarrayoptionalCompany filters. Filter types: INDUSTRY, COMPANY_HEADCOUNT, COMPANY_HQ_COUNTRY, LAST_FUNDING_ROUND_TYPE. Required for certain event types like 'new-funding-announcements' and 'job-posting-with-keyword-and-location'.
approximate_notification_timeintegeroptionalHour of day (0-23, UTC) to send notifications.
expiration_datestringoptionalSubscription expiration date in YYYY-MM-DD format. Must be a future date.
frequencyintegeroptionalNotification frequency in days (minimum 1 day). Default: 1
lead_filtersarrayoptionalPerson filters. Filter types: CURRENT_TITLE, PAST_TITLE, CURRENT_COMPANY, PAST_COMPANY, REGION, etc.
max_notifications_per_executionintegeroptionalOptional cap on notifications sent per watch execution. Must be a positive multiple of 50. If omitted, all matching events are sent.
notification_endpointstringoptionalHTTPS URL to receive webhook notifications when events occur. OPTIONAL — defaults to a Crustdata-managed receiver. When omitted, use crustdata_watcher_run_summary to view delivered payloads directly in chat.
crustdatamcp_crustdata_watcher_get#Get the full details of a single watcher subscription by ID (status, filters, endpoint, frequency, etc.).2 params

Get the full details of a single watcher subscription by ID (status, filters, endpoint, frequency, etc.).

NameTypeRequiredDescription
subscription_idintegerrequiredID of the watch. Must be positive.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
crustdatamcp_crustdata_watcher_list#List the caller's watcher subscriptions, most recent first. Returns id, event_type_slug, status, frequency, created_at, last_run_id, notification_endpoint, and max_notifications_per_execution. Use this at the start of any session that references a previously-created watch — users often forget the subscription_id, so match by event_type_slug + created_at to recover it.4 params

List the caller's watcher subscriptions, most recent first. Returns id, event_type_slug, status, frequency, created_at, last_run_id, notification_endpoint, and max_notifications_per_execution. Use this at the start of any session that references a previously-created watch — users often forget the subscription_id, so match by event_type_slug + created_at to recover it.

NameTypeRequiredDescription
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
compactbooleanoptionalWhen true (default), return only the headline fields per watcher and drop the bulky event_filters / account_filters / lead_filters payloads. Set to false when the user explicitly asks to inspect filter configuration.
include_cancelledbooleanoptionalWhen true, cancelled watches are returned alongside active/paused ones. Default false (cancelled watches are hidden).
limitintegeroptionalMaximum number of watchers to return (most recent first). Default 50. Use a smaller limit (e.g. 10) if you only need the latest few.
crustdatamcp_crustdata_watcher_run_summary#Fetch the detailed summary of a single watcher run: per-stage pipeline logs with timestamps AND the actual webhook payload(s) delivered for that run. Each entry in notifications has sent_at, http_status, and the full payload POSTed (subscription_id, event_type, timestamp, and the matching records). Use this to show the user the actual matches their watcher produced — no webhook hosting required; the MCP can render results directly in chat.3 params

Fetch the detailed summary of a single watcher run: per-stage pipeline logs with timestamps AND the actual webhook payload(s) delivered for that run. Each entry in notifications has sent_at, http_status, and the full payload POSTed (subscription_id, event_type, timestamp, and the matching records). Use this to show the user the actual matches their watcher produced — no webhook hosting required; the MCP can render results directly in chat.

NameTypeRequiredDescription
run_idintegerrequiredID of the specific run (from crustdata_watcher_runs).
subscription_idintegerrequiredID of the watch the run belongs to.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
crustdatamcp_crustdata_watcher_runs#List recent runs of a watcher. Each entry includes the run id, status (RUNNING/SUCCESS/FAILED/SKIPPED), started_at, completed_at, new_records_count, credits_deducted, and notification_http_status. Cursor-paginated, most recent first. Use this to find runs worth inspecting, then call crustdata_watcher_run_summary for the actual delivered records.4 params

List recent runs of a watcher. Each entry includes the run id, status (RUNNING/SUCCESS/FAILED/SKIPPED), started_at, completed_at, new_records_count, credits_deducted, and notification_http_status. Cursor-paginated, most recent first. Use this to find runs worth inspecting, then call crustdata_watcher_run_summary for the actual delivered records.

NameTypeRequiredDescription
subscription_idintegerrequiredID of the watch whose run history you want.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
cursorintegeroptionalPagination cursor — pass the next_cursor returned by the previous call to fetch the next page. Omit for the first page.
limitintegeroptionalMaximum number of runs to return (most recent first). Default 20, max 100.
crustdatamcp_crustdata_watcher_simulate#Simulate a watcher subscription to test your webhook endpoint. Sends a test notification without creating a persistent subscription.9 params

Simulate a watcher subscription to test your webhook endpoint. Sends a test notification without creating a persistent subscription.

NameTypeRequiredDescription
event_filtersarrayrequiredEvent-specific filters for the simulation.
event_type_slugstringrequiredType of event to simulate monitoring.
notification_endpointstringrequiredHTTPS URL to receive test webhook notification. Must use HTTPS protocol.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
account_filtersarrayoptionalCompany filters to simulate (same shape as crustdata_watcher_create). Filter types: INDUSTRY, COMPANY_HEADCOUNT, COMPANY_HQ_COUNTRY, LAST_FUNDING_ROUND_TYPE.
expiration_datestringoptionalOptional expiration date (YYYY-MM-DD, future) for the simulated watch.
frequencyintegeroptionalSimulated notification frequency in days (minimum 1 day).
lead_filtersarrayoptionalPerson filters to simulate (same shape as crustdata_watcher_create). Filter types: CURRENT_TITLE, PAST_TITLE, CURRENT_COMPANY, PAST_COMPANY, REGION, etc.
max_notifications_per_executionintegeroptionalOptional cap on notifications sent per watch execution. Must be a positive multiple of 50. If omitted, all matching events are sent.
crustdatamcp_crustdata_watcher_update#Update an existing watcher subscription. Can change status (pause/resume), update webhook endpoint, or modify filters for certain subscription types. To permanently cancel a watch use crustdata_watcher_cancel instead — the update endpoint cannot cancel.6 params

Update an existing watcher subscription. Can change status (pause/resume), update webhook endpoint, or modify filters for certain subscription types. To permanently cancel a watch use crustdata_watcher_cancel instead — the update endpoint cannot cancel.

NameTypeRequiredDescription
subscription_idintegerrequiredID of the subscription to update. Must be positive.
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.
event_filtersarrayoptionalUpdated event filters (only for certain subscription types).
max_notifications_per_executionintegeroptionalOptional cap on notifications sent per watch execution. Must be a positive multiple of 50. If omitted, all matching events are sent. Applied from the next watch execution onward.
notification_endpointstringoptionalNew HTTPS webhook endpoint URL.
statusstringoptionalNew status: 'active' (resume) or 'paused'. To permanently cancel a watch, use crustdata_watcher_cancel instead — the update endpoint cannot cancel.
crustdatamcp_crustdata_web_fetch#Fetch and extract text content from up to 10 web page URLs in one request. HTML is stripped and content is capped per URL.2 params

Fetch and extract text content from up to 10 web page URLs in one request. HTML is stripped and content is capped per URL.

NameTypeRequiredDescription
urlsarrayrequiredURLs to fetch content from (max 10).
_rationalestringoptionalDescribe the user's intent and why this tool was selected in general terms only; do not include specific field values, names, emails, or other data.