MCP App Store
by KeenEthics

Overview

Delpha helps AI agents verify commercial identity: which company a record refers to, the commercial group it belongs to, and its business contact details. Results include validation findings, confidence scores and supporting evidence where available, helping teams assess records before taking action. Delpha uses a company's website alongside other identity signals to distinguish companies with similar names and assess their commercial relationships. What you can do with Delpha: • Resolve a company's commercial parent and distinguish it from its legal or financial parent • Validate a company's website, LinkedIn page and legal identifier • Find and verify a person's LinkedIn profile and business email • Validate and normalize a phone number or name you already hold • Assess new-logo and account-routing decisions when existing CRM account information is provided Built for RevOps, sales and data teams. The tools look up, validate and normalize data; they do not modify your CRM. Applying changes requires a separate CRM integration. Results can be incomplete or uncertain and should be assessed using the returned evidence and confidence information. Requires a Delpha account with MCP access enabled at delpha.ai. People data: Delpha holds no contact database. Email candidates come from name and company-domain patterns, LinkedIn profiles from public web search, and phone checks from verification providers. Data sources and privacy details: https://help.delpha.io/delpha-api-and-mcp/api/data-sources-and-privacy

Tools

findAndValidateEmail

ChatGPT
Find, validate, and qualify a person's email address: send email to verify it, or first_name, last_name and website together to search for it. Submit an asynchronous job; the returned job_id goes to getEmailResult, which yields the validated email, the email_status (Valid / ...), email_domain_qualification (whether the address's domain is a public/personal mail domain or a company domain, and whether it accepts mail at any address; see getEmailResult), the qualified domain, the scores (validity / completeness / accuracy / consistency), and ranked suggestions (both inferred from the input and from the company website). Two modes — at least one must be fully satisfied: - Validation mode: provide email alone to verify deliverability and qualify the domain. - Recommendation mode: provide first_name, last_name, AND website together (all three required) to search for the address. Partial recommendation inputs are rejected with 400. Supplying both an email and the recommendation triple runs both paths in the same job. This result comes from Delpha's own verification and a Delpha model; no contact database and no third-party database is used. Candidate addresses are generated from per-domain address patterns, not retrieved from a list of known addresses. The address you supply — or an address formed from the name and company website you supply — reaches the mail infrastructure of that address's own domain. Cost: an accepted call spends 1 credit and starts a new job; a repeat with the same input starts another and is charged again. The call and its result are kept in your team's resolution history for its configured retention.

findAndValidateLegalID

ChatGPT
Submit an asynchronous job to find and validate a company's legal identifier (SIRET, SIREN, NZBN, ABN, CIK, ...): send legal_id to validate one or name to search for one, plus legal_id_type or address.country to select the registry. The identifier is a business registry number, never a personal identifier. Returns a job_id — pass it to getLegalIDResult to retrieve the normalized identifier, the resolved legal_id_type, and validity / accuracy scores. Registry selection: the job targets one registry, resolved from either of two fields: - legal_id_type — the registry directly (e.g. FRA - SIRET, GBR - COMPANY REGISTRATION NUMBER), or - address.country — the entity's country, from which the registry is inferred. A call that provides neither is rejected with 400 (Either 'legal_id_type' or 'address.country' must be provided) — e.g. {name, website} alone fails. The remaining fields select the mode: legal_id runs validation and name runs search — a call with neither is rejected with 400; website only adds a country signal. Coverage: only the registries in the legal_id_type enum can be queried. A request naming any other registry, or a country that has no registry in that list, is refused with 422 `unsupported_registry` before any credit is reserved; the message lists the supported countries. That refusal depends only on the registry or country requested, so the same country returns it again whatever name or legal_id carries. An explicit legal_id_type takes precedence over address.country, so a supported registry with an unsupported country still runs. The name or identifier you supply is matched against Delpha's company datalake and, when needed, the public registry of the selected country. A company found in a registry is added to the datalake. Cost: an accepted call spends 1 credit and starts a new job; a repeat with the same input starts another and is charged again. The call and its result are kept in your team's resolution history for its configured retention.

findAndValidateLinkedInCompanyPage

ChatGPT
Submit an asynchronous job to find and validate the LinkedIn page of a COMPANY: send url to validate one, or company_name (with website for precision) to search for one. Returns a job_id — pass it to getLinkedInCompanyPageResult to retrieve the canonical page URL plus accuracy and validity scores. Two modes: - Validate an existing page — supply url. - Search — supply company_name, adding website for precision. findAndValidateLinkedInProfile covers a PERSON — this operation looks for /company/, /school/ and /showcase/ pages only. These results are processed from the company website and from public web search: Google results, retrieved through Google Custom Search API or a SERP provider. No LinkedIn account, session or credential is used, and no third-party database is consulted. The company name and country you supply are sent to that search provider, and the company website you supply — or the domain of an email address you supply, which itself never leaves Delpha — is requested directly. A URL you submit for validation is never requested: its format is checked, and it may be searched for through that search provider. Cost: an accepted call spends 1 credit and starts a new job; a repeat with the same input starts another and is charged again. The call and its result are kept in your team's resolution history for its configured retention.

findAndValidateLinkedInProfile

ChatGPT
Submit an asynchronous job to find and validate the LinkedIn profile of a PERSON: send url to validate one, or first_name and last_name with company_name or website to search for one. Returns a job_id — pass it to getLinkedInProfileResult to retrieve the canonical profile URL plus accuracy and validity scores. Two modes: - Validate an existing profile — supply url. - Search — supply first_name + last_name plus company context (company_name and/or website); an email contributes only its domain, as website would. Company context narrows the search among people who share a name; without it a namesake can rank first, and for a very common name a namesake can rank first even with it. findAndValidateLinkedInCompanyPage covers a COMPANY's page — this operation looks for /in/ profiles only. The search is built only from the fields in this request; nothing carries over from a previous job. These results are processed in real time from public web search: Google results, retrieved through Google Custom Search API or a SERP provider. No LinkedIn account, session or credential is used, and no contact database or third-party database is consulted. The name, company and country you supply are sent to that search provider. An email address you supply never leaves Delpha: only its domain is used, as a company website, and a company website is requested directly only when no name is given. A URL you submit for validation is never requested: its format is checked, and it may be searched for through that search provider. Cost: an accepted call spends 1 credit and starts a new job; a repeat with the same input starts another and is charged again. The call and its result are kept in your team's resolution history for its configured retention.

findAndValidateUltimateParent

ChatGPT
Resolve a company's ultimate parent from one of its subsidiaries, brands or divisions: send company_name and website, both required. The parent returned is the commercial parent: the operating group the company is sold to and routed under. Passive holding entities set aside on the way up are flagged is_discarded in the ownership chain, and when a financial owner such as a fund sits above the operating group it is returned separately as ultimate_financial_parent. The result also carries the full ownership chain, the relationship type and a confidence score; each entity carries GLEIF metadata in lei_data when a match is found, null when none is. The resolution is anchored on the company's website, not on its name alone: the website binds the name to one specific entity and seeds the search. Ownership is resolved from a live web search plus GLEIF/LEI lookups, not from a static database. Async: poll getUltimateParentResult with the returned job_id. The company name, website and country you supply are sent to Delpha's AI providers, which search the web; the parent found is checked against GLEIF's public LEI register. Cost: an accepted call spends 1 credit and starts a new job; a repeat with the same input starts another and is charged again. The call and its result are kept in your team's resolution history for its configured retention.

findAndValidateWebsite

ChatGPT
Submit an asynchronous job to find and validate a company's website: send website to validate one, or name with country (or linkedin) to search for one. Returns a job_id — pass it to getWebsiteResult to retrieve the canonical URL plus accuracy, validity, completeness, and consistency scores. Two modes: - Validate an existing URL — supply website. The tool checks reachability and matches the site against the other entity signals. A redirect destination is adopted when it shares the input's registrable domain, when the evidence ranks it above the original, or when a scored search candidate corroborates it; otherwise the normalized input is kept. - Search — supply entity signals (name + country, or linkedin; a bare domain sent as website is validated instead) and the tool finds the most likely website. country materially improves accuracy and disambiguates same-named companies across regions. Optional. The name and country you supply are sent to a web-search provider and to Delpha's AI provider. A website you supply, or one found by search, is visited to check it. Cost: an accepted call spends 1 credit and starts a new job; a repeat with the same input starts another and is charged again. The call and its result are kept in your team's resolution history for its configured retention.

getEmailResult

ChatGPT
Fetch the result of a previously submitted findAndValidateEmail job by job_id. On success, the result payload contains: the validated email (normalized_value); email_status (closed enum: "Valid", "Invalid", "Unknown"); email_domain_qualification, which reports two properties of the address's domain — whether it is a public/personal mail domain or a company domain, and whether it accepts mail at any address (closed enum: "nominative@perso" = a public/personal mail domain that rejects unknown addresses; "catchall@perso" = a public/personal mail domain that accepts any address; "nominative@pro" = a company domain that rejects unknown addresses; "catchall@pro" = a company domain that accepts any address, so acceptance is not evidence the mailbox exists; "Unknown" = the domain could not be classified, for instance because it greylisted the probe or its server failed temporarily); a top-level label summarising the outcome (closed enum: "OK", "No", "OddFormat"); the qualified domain; the four scores (validity, completeness, accuracy, consistency); and ranked suggestions (alternative addresses scored by likelihood) when no exact match is found. Result fields (result, populated once status_code == 200): - label (string): Label for the email. One of: No, OK, OddFormat. - normalized_value (string): Normalized email value. - provider (string, nullable): Provider of the email, if any. - email_domain (string, nullable): Domain of the email. null when the address carries no parseable domain (a syntactically invalid address, which returns label: "No"). - email_domain_qualification (string): Qualification of the email domain. One of: nominative@pro, catchall@pro, nominative@perso, catchall@perso, Unknown. - email_status (string): Status of the email. Possible values: 'Invalid', 'Unknown', 'Valid'. One of: Invalid, Unknown, Valid. - email_address_qualification (string, nullable): Address-level qualification of the mailbox, when one applies: Spam Trap (an address Delpha holds on a list of addresses used to detect unsolicited mail rather than read by a person) or Role-based (a shared functional mailbox such as contact@/support@, not a person). null means neither applies. ⚠️ This takes precedence over email_domain_qualification, which describes the DOMAIN rather than this address: a Role-based mailbox on a nominative professional domain is still role-based. The vocabulary may grow, so an unrecognised value is informational rather than an error. - suggestions (array of EmailSuggestion): Suggestions for the email. - value (string): Suggested email value. - score (number): Confidence score for the suggestion. - website_domain (string, nullable): Website domain associated. - website_domain_qualification (string, nullable): Qualification of the website domain. One of: nominative@pro, catchall@pro, nominative@perso, catchall@perso, Unknown. - suggestions_from_website (array of EmailSuggestion): Suggestions from the website. Fields as in suggestions. - data_type (string): The type of data for this field One of: email, social_network, name, legal_id, phone, address, website. - scores (ScoresModel): Scores for the field - accuracy (number): Accuracy score - validity (integer): Validity score - completeness (number): Completeness score - consistency (integer): Consistency score Envelope: status_code 200 means the job succeeded and result is populated; 202 means it is still running and result is null. A failed job comes back with status "ERROR", its status_code, a stable code naming the cause and a message explaining it; an unknown or expired job_id is answered as a tool error. Polling: the MCP server holds this call and re-polls the job internally for up to ~180 seconds (this validation typically completes in ~5 seconds), so one call usually returns the final result. If status_code is still 202 after that, the job is still running and this tool accepts the same job i…

getLegalIDResult

ChatGPT
Fetch the result of a previously submitted findAndValidateLegalID job by job_id. On success, the result payload contains the normalized legal identifier, the resolved legal_id_type (which registry it belongs to), the validity / accuracy scores, a match object with the enriched company record (account name, address, annual revenue, employee count, industry, formation date, company type, website) when a confident match is found, and a suggestions array of alternative company records each ranked by confidence. Result fields (result, populated once status_code == 200): - data_type (string): The type of data for this field One of: email, social_network, name, legal_id, phone, address, website. - normalized_value (string): Normalized legal ID value. - label (string): Label for the legal ID. One of: No, OK, Unknown. - legal_id_type (string, nullable): The type of legal ID. Free-form: it normally matches one of the types accepted on submission. Null when no registry could be determined. - scores (ScoresModel): Scores for the field - accuracy (number): Accuracy score - validity (integer): Validity score - completeness (number): Completeness score - consistency (integer): Consistency score - match (LegalIDSuggestion, nullable): The match information - score (number): Confidence score for the suggestion. - account_name (string): The account name - industry (IndustryModel, nullable): The industry information - website (Website, nullable): The website - address (LegalIDAddress, nullable): The address information - financials (Financials, nullable): Filed financial figures for the company's most recent fiscal period, as published by its national register. Replaces the former annual_revenue field, which is no longer returned. - employees_nb (EmployeesNbModel, nullable): The employee number information - source (string, nullable): The source URL - company_type (CompanyTypeModel, nullable): The company type information - date (DateModel, nullable): The date information - legal_id_type (string): The legal ID type. Free-form: it normally matches one of the types accepted on submission, but a record sourced from the datalake may carry a historical type. - legal_id (string): The legal ID - headquarters_site (HeadquartersSite, nullable): The suggested entity's headquarters site, with its legal identifier — resolved from the datalake's parent link, never from the top of the ownership group. null when the record names no parent; the legal_id alone is absent when the parent record could not be resolved, and the name then falls back to the one stored inline on the link. - site_type (string, nullable): Whether this record is the company's headquarters: 'headquarters', 'branch', or 'unknown' when the datalake holds no value. Open vocabulary -- new values may be added, so treat this as a string, not a closed enum. - vat (string, nullable): The VAT identifier of the suggested entity, when the datalake has one. - suggestions (array of LegalIDSuggestion): Suggestions for the legal ID. Fields as in match. Envelope: status_code 200 means the job succeeded and result is populated; 202 means it is still running and result is null. A failed job comes back with status "ERROR", its status_code, a stable code naming the cause and a message explaining it; an unknown or expired job_id is answered as a tool error. Polling: the MCP server holds this call and re-polls the job internally for up to ~25 seconds (this validation typically completes in ~5-10 seconds), so one call usually returns the final result. If status_code is still 202 after that, the job is still running and this tool accepts the same job id again. Re-reading a result never re-runs or re-charges the job. Cost: no new charge. Reading a result finalizes the job's accounting once: it settles the charge made at submission when the result is first delivered, or refunds it when the job failed, exceeded its time limit or produced no usable result, and marks a timed-o…

getLinkedInCompanyPageResult

ChatGPT
Fetch the result of a previously submitted findAndValidateLinkedInCompanyPage job by job_id. On success, the result payload contains the canonical company page URL, accuracy and validity scores, and a recommendations array of candidate pages (each carrying url, headline, desc, company_name, location, and a confidence score) when the match is uncertain. In search mode the top-level label and scores are often "No" and 0 while recommendations still holds the candidates. Each candidate carries a desc and a headline; unrelated companies can share a name across countries, so those two fields are what tell them apart. Result fields (result, populated once status_code == 200): - data_type (string): The type of data for this field. One of: email, social_network, name, legal_id, phone, address, website. - normalized_value (string): Normalized LinkedIn company page URL. - label (string): Label for the LinkedIn value. One of: No, OK, Unknown. - scores (ScoresModel): Scores for the field. - accuracy (number): Accuracy score - validity (integer): Validity score - completeness (number): Completeness score - consistency (integer): Consistency score - recommendations (array of LinkedInCompanyPageRecommendation): Candidate company pages, best first. - url (string): Recommended LinkedIn company page URL (a /company/, /school/ or /showcase/ page). - score (number): Confidence score for the recommendation. - headline (string, nullable): The search result's headline — the title line Google renders for this page, usually the page name. - rank (integer, nullable): Rank of the recommendation. - desc (string, nullable): Description of the recommended page, as the search result renders it. - company_name (string, nullable): Company name shown on the recommended page. - location (string, nullable): Location shown on the recommended page. - match_score (number, nullable): Pure match quality of this candidate against the company in the request, before the ambiguity division. score = match_score / ambiguity_n. - ambiguity_n (integer, nullable): How many candidates scored within 10% of the best match. Greater than 1 means several pages match comparably well and the divided score reflects that ambiguity, not a poor match. - recommendation_status (string, nullable): Reading of the recommendation situation: 'confident' (one clear winner), 'ambiguous' (several candidates match comparably well — see each candidate's ambiguity_n), or 'no_match' (no credible page found). Vocabulary may grow; treat unknown values as informational. - type (string, nullable): The social network the assessed value belongs to. Always linkedin on these operations — Delpha assesses no other network today — it is provenance, not a discriminator. Envelope: status_code 200 means the job succeeded and result is populated; 202 means it is still running and result is null. A failed job comes back with status "ERROR", its status_code, a stable code naming the cause and a message explaining it; an unknown or expired job_id is answered as a tool error. Polling: the MCP server holds this call and re-polls the job internally for up to ~25 seconds (this validation typically completes in ~10 seconds), so one call usually returns the final result. If status_code is still 202 after that, the job is still running and this tool accepts the same job id again. Re-reading a result never re-runs or re-charges the job. Cost: no new charge. Reading a result finalizes the job's accounting once: it settles the charge made at submission when the result is first delivered, or refunds it when the job failed, exceeded its time limit or produced no usable result, and marks a timed-out job failed. A repeat returns the same answer and never charges again.

getLinkedInProfileResult

ChatGPT
Fetch the result of a previously submitted findAndValidateLinkedInProfile job by job_id. On success, the result payload contains the canonical profile URL, accuracy and validity scores, and a recommendations array of candidate profiles (each carrying url, headline, desc, company_name, location, profile_name, and a confidence score) when the match is uncertain. In search mode the top-level label and scores are often "No" and 0 while recommendations still holds the candidates. A namesake can outrank the intended person even when company context was supplied, so recommendations[0] is a ranked candidate rather than a confirmed match; each candidate's company_name and desc are what distinguish one from another. Result fields (result, populated once status_code == 200): - data_type (string): The type of data for this field. One of: email, social_network, name, legal_id, phone, address, website. - normalized_value (string): Normalized LinkedIn profile URL. - label (string): Label for the LinkedIn value. One of: No, OK, Unknown. - scores (ScoresModel): Scores for the field. - accuracy (number): Accuracy score - validity (integer): Validity score - completeness (number): Completeness score - consistency (integer): Consistency score - recommendations (array of LinkedInRecommendation): Candidate profiles, best first. - url (string): Recommended LinkedIn profile URL. - score (number): Confidence score for the recommendation. - headline (string, nullable): The search result's headline — the title line Google renders for this profile, usually 'Name - job title - company'. ⚠️ This is NOT LinkedIn's 'headline' profile field — that is job_title. - rank (integer, nullable): Rank of the recommendation. - desc (string, nullable): Description of the recommended profile, as the search result renders it. - company_name (string, nullable): Company the person works at, as the recommended profile shows it. - location (string, nullable): Location shown on the recommended profile. - profile_name (string, nullable): The person's name on the recommended profile. - job_title (string, nullable): Job title of the recommended profile, as LinkedIn shows it. Usually taken from the structured job-title slot of the search result; when that is absent it falls back to the profile's LinkedIn headline, so it can read as free text ('Fortune 100 Executive | P&L Leader') rather than a clean role, and Google sometimes clips it with an ellipsis. Null when the search result carried no job title. - match_score (number, nullable): Pure match quality of this candidate against the person in the request, before the ambiguity division. score = match_score / ambiguity_n. - ambiguity_n (integer, nullable): How many candidates scored within 10% of the best match. Greater than 1 means several profiles match comparably well and the divided score reflects that ambiguity, not a poor match. - recommendation_status (string, nullable): Reading of the recommendation situation: 'confident' (one clear winner), 'ambiguous' (several candidates match comparably well — see each candidate's ambiguity_n), or 'no_match' (no credible profile found). Vocabulary may grow; treat unknown values as informational. - fallback_used (boolean, nullable): True when the emitted recommendations come from the name-only fallback search: no credible profile was found at the queried company, but same-name profiles exist elsewhere (a possible job-change signal). - url_changed (boolean, nullable): True when the submitted profile URL is probably outdated: it was not found, while exactly one other profile matching the person was found with confidence. LinkedIn does not redirect a profile whose address was changed, so the old address stops working. The replacement is in suggested_url. - suggested_url (string, nullable): The profile that probably replaces an outdated submitted URL, set only when url_changed is true. It is also the first recommendation. - type (string, nullable): The social netwo…

getNameResult

ChatGPT
Fetch the result of a previously submitted validateAndNormalizeName job by job_id. On success, the result payload contains the normalized first / last name, a label (e.g. OK), per-field scores (validity, completeness, consistency, misspelled — each broken down into {first_name, last_name} objects — plus scalar accuracy and reversed (likelihood the first/last name are swapped)), and ranked suggestions for both first_name and last_name carrying alternative spellings with confidence scores. Result fields (result, populated once status_code == 200): - data_type (string): The type of data for this field One of: email, social_network, name, legal_id, phone, address, website. - normalized_value (NormalizedNameModel): Normalized name value. - first_name (string): The first name of the entity - last_name (string): The last name of the entity - label (string): Label for the name. One of: No, OK, Misspelled, Reversed. - scores (NameScoresModel): Scores for the field - accuracy (number): The accuracy of the name - reversed (number): The reversed of the name - misspelled (DoubleScoresModel): The misspelled of the names - consistency (DoubleScoresModel): The consistency of the names Fields as in misspelled. - validity (DoubleScoresModel): The validity of the names Fields as in misspelled. - completeness (DoubleScoresModel): The completeness of the names Fields as in misspelled. - suggestions (NameRecommendation): Recommendations for the name. - first_name (array of SingleNameRecommendation): The first name of the entity - last_name (array of SingleNameRecommendation): The last name of the entity Fields as in first_name. Envelope: status_code 200 means the job succeeded and result is populated; 202 means it is still running and result is null. A failed job comes back with status "ERROR", its status_code, a stable code naming the cause and a message explaining it; an unknown or expired job_id is answered as a tool error. Polling: the MCP server holds this call and re-polls the job internally for up to ~25 seconds (this validation typically completes in ~5 seconds), so one call usually returns the final result. If status_code is still 202 after that, the job is still running and this tool accepts the same job id again. Re-reading a result never re-runs or re-charges the job. Cost: no new charge. Reading a result finalizes the job's accounting once: it settles the charge made at submission when the result is first delivered, or refunds it when the job failed, exceeded its time limit or produced no usable result, and marks a timed-out job failed. A repeat returns the same answer and never charges again.

getPhoneResult

ChatGPT
Fetch the result of a previously submitted validateAndNormalizePhone job by job_id. On success, the result payload contains the E.164-formatted normalized_value, the phone_type (one of FIXED_LINE, MOBILE, FIXED_LINE_OR_MOBILE, TOLL_FREE, PREMIUM_RATE, SHARED_COST, VOIP, PERSONAL_NUMBER, PAGER, UAN, VOICEMAIL), the carrier name, the timezone, the zone (ISO 3166-1 alpha-2 country code), the area (an English place name for the number — a city or region for many fixed lines, otherwise usually the country; empty when no place is known), and the validity, completeness and consistency scores with a confidence rating of the parse. accuracy is not assessed for phone numbers and is always -1. Result fields (result, populated once status_code == 200): - data_type (string): The type of data for this field One of: email, social_network, name, legal_id, phone, address, website. - normalized_value (string, nullable): Normalized phone value. - phone_type (string, nullable): The type of phone number One of: FIXED_LINE, MOBILE, FIXED_LINE_OR_MOBILE, TOLL_FREE, PREMIUM_RATE, SHARED_COST, VOIP, PERSONAL_NUMBER, PAGER, UAN, VOICEMAIL. - carrier (string, nullable): The carrier of the phone number - timezone (string, nullable): The timezone of the phone number - zone (string, nullable): The zone of the phone number - area (string, nullable): The area of the phone number - activity_score (integer, nullable): How recently the line has shown activity, on the second-tier line-type provider's own 0-100 scale. null whenever that provider was not consulted — which is the common case, since it is called only to resolve an ambiguous line type. - is_prepaid (boolean, nullable): Whether the number is a prepaid line, from the second-tier line-type provider. null whenever that provider was not consulted — see activity_score. - scores (PhoneScoresModel): Scores for the field - accuracy (number): Accuracy score - validity (integer): Validity score - completeness (number): Completeness score - consistency (integer): Consistency score - confidence (number): How much to trust the normalization, from the phone library's own reliability verdict: 1 (high), 0.5 (medium) or 0 (low, or not reported). It rates the PARSE, not whether the line is reachable — that is validity. Envelope: status_code 200 means the job succeeded and result is populated; 202 means it is still running and result is null. A failed job comes back with status "ERROR", its status_code, a stable code naming the cause and a message explaining it; an unknown or expired job_id is answered as a tool error. Polling: the MCP server holds this call and re-polls the job internally for up to ~25 seconds (this validation typically completes in ~5 seconds), so one call usually returns the final result. If status_code is still 202 after that, the job is still running and this tool accepts the same job id again. Re-reading a result never re-runs or re-charges the job. Cost: no new charge. Reading a result finalizes the job's accounting once: it settles the charge made at submission when the result is first delivered, or refunds it when the job failed, exceeded its time limit or produced no usable result, and marks a timed-out job failed. A repeat returns the same answer and never charges again.

getUltimateParentResult

ChatGPT
Fetch the result of a previously submitted findAndValidateUltimateParent job by job_id. The resolver walks ownership upward from the queried company and returns as ultimate_parent the commercial parent — the operating group the company is sold to and routed under, not necessarily the top legal owner. Passive holding entities set aside on the way up stay in ownership_chain flagged is_discarded; when a financial owner such as a fund sits above the operating group, it is returned separately as ultimate_financial_parent. Top-level result fields: ultimate_parent (CompanyEntity), relationship_type (Wholly Owned / Joint Venture / Member Firm/Franchise / Portfolio Company / Brand/Division / Independent), confidence (a number in [0, 1] reported by the resolver), comment, source_url (cited URL, may be null), ownership_chain (bottom-up array; index 0 is the queried company), and ultimate_financial_parent (CompanyEntity or null). Each CompanyEntity carries legal_name, commercial_name, country, website, website_validated, is_ultimate_financial_parent, is_discarded and lei_data (GLEIF metadata or null). Result fields (result, populated once status_code == 200): - ultimate_parent (CompanyEntity): The commercial parent of the requested company: the operating group it is sold to and routed under. - legal_name (string, nullable): The official legal name of the entity. - commercial_name (string, nullable): The commonly-used commercial / trade name. - country (string, nullable): The country where the entity is headquartered or registered. - website (string, nullable): The entity's primary website URL. - website_validated (boolean, nullable): True if the website was reachable and resolved cleanly during normalization. - lei_data (LeiData, nullable): GLEIF Legal Entity Identifier metadata. Null if no match was found at >=80 fuzzy-match score. - is_ultimate_financial_parent (boolean): True for the chain entity that the resolver identified as the ultimate financial parent (when it differs from the commercial parent returned as ultimate_parent). - entity_type (string, nullable): The entity's legal form / classification as identified by the resolver (e.g., 'Corporation', 'Holding Shell/Foundation', 'Trust'). - ownership_status (string, nullable): Free-form ownership status of the entity as reported by the resolver (e.g., 'Unknown', 'Active'). - is_discarded (boolean, nullable): True when the resolver excluded this entity from the strategic operating chain (e.g., passive holding companies above an operating conglomerate). Lets callers distinguish operating links from holding overlays. - comment (string, nullable): Per-entity annotation from the resolver (e.g., 'Target operating entity', 'Passive holding for control purposes'). - relationship_type (string, nullable): How the requested company relates to the ultimate parent. One of: Wholly Owned, Member Firm/Franchise, Portfolio Company, Brand/Division, Independent, Joint Venture. - confidence (number): Resolver-reported confidence score in the resolved ultimate parent, from 0 to 1. - ownership_chain (array of CompanyEntity): Ordered chain from the requested company up to the ultimate parent. Empty if the requested company IS the ultimate parent. May contain intermediate holding entities; the entity with is_ultimate_financial_parent=True (if any) is also exposed at top level as ultimate_financial_parent for convenience. Fields as in ultimate_parent. - ultimate_financial_parent (CompanyEntity, nullable): Populated only when the ultimate financial parent differs from the commercial parent returned as ultimate_parent (e.g., a fund above the operating group is the actual financial owner). When populated, this is the same object as the chain entity whose is_ultimate_financial_parent is True. Fields as in ultimate_parent. - comment (string, nullable): The resolver's reasoning for the resolved hierarchy, as text. Useful for verification / auditability. - `source_…

getWebsiteResult

ChatGPT
Fetch the result of a previously submitted findAndValidateWebsite job by job_id. On success, the result payload contains the normalized_value URL, a label (e.g. OK), the four scores (validity, completeness, accuracy, consistency), and a recommendations array of alternative URLs each ranked by confidence. A redirect destination is adopted when it shares the input's registrable domain, when the evidence ranks it above the original, or when a scored search candidate corroborates it; otherwise the normalized input is kept. An adopted URL is reduced to scheme://host/, and a corroborated host may replace its host. Changed reports exactly that adopted move; Unknown means the request named no company, so accuracy had no basis, and is not a negative verdict on the URL. Result fields (result, populated once status_code == 200): - data_type (string): The type of data for this field One of: email, social_network, name, legal_id, phone, address, website. - normalized_value (string): Normalized website value. - label (string): Accuracy verdict for the submitted website. OK — the search confirmed it. Changed — the site has moved: a redirect landed on a different registrable domain and the evidence ranked that destination above the original, so it was adopted. No — a request that named a company found nothing supporting this website. Unknown — the request named no company, so accuracy had no basis (-1); this is not a negative verdict on the URL. A redirect destination is adopted when it shares the input's registrable domain, or when the evidence ranks it above the original, or when a scored search candidate corroborates it — otherwise the normalized input is kept, which is what happens to a same-name different-TLD landing the evidence does not prefer. An adopted URL is reduced to scheme://host/, possibly using a corroborated host. One of: No, OK, Changed, Unknown. - scores (ScoresModel): Scores for the field - accuracy (number): Accuracy score - validity (integer): Validity score - completeness (number): Completeness score - consistency (integer): Consistency score - recommendations (array of WebsiteRecommendation): Recommendations for the website. - url (string): Recommended website value. - score (number): Confidence score for the recommendation. - metadata (WebsiteMetadata, nullable): Google-search metadata (name, title, summary, rank) for the recommended website. Null when the recommendation comes from a path that does not produce search metadata (email-domain, social-network, or direct-website validation). - source_path (array of object): Ordered list of upstream blocks that produced this recommendation, each tagged with a name. Allows downstream consumers to attribute a recommendation to the engine path it came from (e.g. [{"name": "Name"}] for Google search by company name). Envelope: status_code 200 means the job succeeded and result is populated; 202 means it is still running and result is null. A failed job comes back with status "ERROR", its status_code, a stable code naming the cause and a message explaining it; an unknown or expired job_id is answered as a tool error. Polling: the MCP server holds this call and re-polls the job internally for up to ~25 seconds (this validation typically completes in ~10 seconds), so one call usually returns the final result. If status_code is still 202 after that, the job is still running and this tool accepts the same job id again. Re-reading a result never re-runs or re-charges the job. Cost: no new charge. Reading a result finalizes the job's accounting once: it settles the charge made at submission when the result is first delivered, or refunds it when the job failed, exceeded its time limit or produced no usable result, and marks a timed-out job failed. A repeat returns the same answer and never charges again.

validateAndNormalizeName

ChatGPT
Submit an asynchronous job to validate and normalize a person's name: send first_name and last_name, both required. Returns a job_id — pass it to getNameResult to retrieve the normalized first / last name, the validity / completeness / consistency scores, the misspelled and reversed scores, and ranked alternative spellings. Normalization fixes capitalization and spacing. In the last name it also drops a recognized title or suffix (e.g. Smith PhD becomes SMITH) and anything in parentheses or after a comma; the first name keeps its words. Characters outside the Latin script are removed — a name written entirely in another script normalizes to an empty string. It is meant for a name already held in a record — to clean it up before the record is used or stored, or to catch a typo or a first and last name entered the wrong way round. It does not search: it does not look a person up or return anything about them beyond the name itself, and everything it returns is derived from the two names supplied and Delpha's own reference data. Both first_name and last_name are required. This result is computed inside Delpha's own infrastructure, from the name you supply and Delpha's own reference data. Nothing leaves Delpha for this operation, and the submitted name is retained in your account's resolution history for its configured retention period. Cost: an accepted call spends 1 credit and starts a new job; a repeat with the same input starts another and is charged again. The call and its result are kept in your team's resolution history for its configured retention.

validateAndNormalizePhone

ChatGPT
Submit an asynchronous job to validate and normalize a phone number you supply: send phone, with country_code when it is not in E.164 form. Returns a job_id — pass it to getPhoneResult to retrieve the E.164-formatted number, its line type, carrier, time zone and country, validity / completeness / consistency scores, and a confidence rating of the parse. phone is required. A number in E.164 form (e.g. +33672557378) carries its own country. A national-format number (e.g. 0672557378) is normalized only when its country is supplied — country_code (ISO 3166-1 alpha-2); one sent without a country is rejected with 400. It is meant for a number already held in a record — to check it before the record is used or stored, or to bring numbers into one format. It does not search: it finds no phone number for a person or a company, and everything it returns describes the number supplied. This result is obtained by parsing the submitted number and verifying it against data from carriers and cross-carrier network enablers, through Delpha's providers. Delpha verifies only the number itself (validity, line type, carrier, connection status) and does not link it to an individual, a name or any other personal data. Those providers receive the number in E.164 form and a two-letter country code, and nothing else. Cost: an accepted call spends 1 credit and starts a new job; a repeat with the same input starts another and is charged again. The call and its result are kept in your team's resolution history for its configured retention.

findAndValidateEmail

Claude

findAndValidateLegalID

Claude

findAndValidateLinkedInCompanyPage

Claude

findAndValidateLinkedInProfile

Claude

findAndValidateName

Claude

findAndValidatePhone

Claude

findAndValidateUltimateParent

Claude

findAndValidateWebsite

Claude

getEmailResult

Claude

getLegalIDResult

Claude

getLinkedInCompanyPageResult

Claude

getLinkedInProfileResult

Claude

getNameResult

Claude

getPhoneResult

Claude

getUltimateParentResult

Claude

getWebsiteResult

Claude

Capabilities

WritesInteractive

Example Prompts

Click any prompt to copy it.

App Stats

32

Tools

3

Prompts

ChatGPT, Claude

Platforms

Works with

ChatGPT
Claude

Data refreshed daily