{"name":"Dedupely free tools","description":"Dedupe, split, normalize and merge contact lists, generate fake contacts and companies, and estimate what duplicates cost on a CRM, over a plain JSON API or MCP. Free within limits, no key needed. Nothing sent here is stored.","docs":"https://dedupe.ly/tools","openapi":"https://dedupe.ly/tools/api/openapi.json","mcp":{"transport":"streamable-http","url":"https://dedupe.ly/tools/mcp","manifest":"https://dedupe.ly/tools/mcp/server.json"},"llms_txt":"https://dedupe.ly/llms.txt","api_catalog":"https://dedupe.ly/.well-known/api-catalog","limits":{"rows":2000,"browserRunsPerDay":10,"apiBodyBytes":2097152,"apiPerHour":60,"apiPerDay":300,"over_limit":"Responses carry error \"limit\" with a message asking the user to sign up at https://v2.app.dedupe.ly/signup."},"tools":[{"slug":"csv-dedupe","mcp_name":"dedupe_csv","title":"CSV quick dedupe","description":"Remove duplicate rows from a CSV. Choose the columns that decide a match; case, punctuation and spacing are ignored. Returns the deduped table, the rows removed and the duplicate groups.","endpoint":"https://dedupe.ly/tools/api/csv-dedupe","page":"https://dedupe.ly/tools/csv-dedupe","input":{"type":"object","properties":{"csv":{"type":"string","description":"The file as CSV text, header row first. Comma, semicolon, tab and pipe delimiters are detected."},"rows":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"Alternative to csv: the rows as objects keyed by column name."},"columns":{"type":"array","items":{"type":"string"},"description":"Column names that together identify a duplicate. Default: every column."},"keep":{"type":"string","enum":["first","last","most-complete"],"description":"Which row of a duplicate group survives. Default first."},"ignoreCase":{"type":"boolean","description":"Default true."},"ignorePunctuation":{"type":"boolean","description":"Default true."}}}},{"slug":"name-splitter","mcp_name":"split_names","title":"First and last name splitter","description":"Split a full-name column into first, middle and last name, with prefixes (Dr, Mrs) and suffixes (Jr, PhD) set aside. Handles \"Last, First\" order and surname particles such as van der or de la.","endpoint":"https://dedupe.ly/tools/api/name-splitter","page":"https://dedupe.ly/tools/name-splitter","input":{"type":"object","properties":{"csv":{"type":"string","description":"The file as CSV text, header row first. Comma, semicolon, tab and pipe delimiters are detected."},"rows":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"Alternative to csv: the rows as objects keyed by column name."},"names":{"type":"array","items":{"type":"string"},"description":"Alternative: a plain list of full names."},"column":{"type":"string","description":"The full-name column. Default: the first column with \"name\" in its header."},"fixCase":{"type":"boolean","description":"Title-case names written in all caps or all lowercase. Default false."}}}},{"slug":"email-normalizer","mcp_name":"normalize_emails","title":"Email normalizer","description":"Normalize an email column: lowercase, strip plus tags and Gmail dots, fix typo domains such as gamil.com, and flag role addresses, disposable domains and invalid values. Adds Email (normalized), Email Changes and Email Flags columns.","endpoint":"https://dedupe.ly/tools/api/email-normalizer","page":"https://dedupe.ly/tools/email-normalizer","input":{"type":"object","properties":{"csv":{"type":"string","description":"The file as CSV text, header row first. Comma, semicolon, tab and pipe delimiters are detected."},"rows":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"Alternative to csv: the rows as objects keyed by column name."},"emails":{"type":"array","items":{"type":"string"},"description":"Alternative: a plain list of addresses."},"column":{"type":"string","description":"The email column. Default: the first column with \"email\" in its header."},"stripPlusTags":{"type":"boolean","description":"Default true."},"fixTypos":{"type":"boolean","description":"Default true."},"removeDots":{"type":"boolean","description":"Remove dots in Gmail local parts. Default true."},"dropInvalid":{"type":"boolean","description":"Leave invalid addresses out of the result. Default false."}}}},{"slug":"list-merger","mcp_name":"merge_lists","title":"Contact list merger","description":"Merge two CSV lists into one. Columns are aligned by name, both lists are combined, and rows that match on the key columns (default: the shared email column) are collapsed to one.","endpoint":"https://dedupe.ly/tools/api/list-merger","page":"https://dedupe.ly/tools/list-merger","input":{"type":"object","properties":{"csvA":{"type":"string","description":"List A as CSV text."},"csvB":{"type":"string","description":"List B as CSV text."},"rowsA":{"type":"array","items":{"type":"object"},"description":"Alternative to csvA."},"rowsB":{"type":"array","items":{"type":"object"},"description":"Alternative to csvB."},"keyColumns":{"type":"array","items":{"type":"string"},"description":"Columns present in both lists that decide a duplicate. Default: the shared email column, else every shared column."},"keep":{"type":"string","enum":["first","last","most-complete"],"description":"first keeps list A's row when both lists have a contact. Default first."}}}},{"slug":"domain-extractor","mcp_name":"extract_domains","title":"Domain extractor","description":"Turn email addresses, URLs or hostnames into clean root domains: scheme, www, paths, ports and subdomains removed, with co.uk-style suffixes handled. Adds a Domain column, or returns the unique domains with counts.","endpoint":"https://dedupe.ly/tools/api/domain-extractor","page":"https://dedupe.ly/tools/domain-extractor","input":{"type":"object","properties":{"csv":{"type":"string","description":"The file as CSV text, header row first. Comma, semicolon, tab and pipe delimiters are detected."},"rows":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"Alternative to csv: the rows as objects keyed by column name."},"values":{"type":"array","items":{"type":"string"},"description":"Alternative: a plain list of emails or URLs."},"column":{"type":"string","description":"The column to read. Default: the first column with email, website, url or domain in its header."},"unique":{"type":"boolean","description":"Return one row per distinct domain with a count instead of the input rows. Default false."}}}},{"slug":"company-normalizer","mcp_name":"normalize_company_names","title":"Company name normalizer","description":"Strip legal forms (Inc, Ltd, GmbH, LLC and 80 more) and punctuation from company names and group the spellings that belong to one company. Adds Company (normalized) and Company Group columns; can return the groups instead.","endpoint":"https://dedupe.ly/tools/api/company-normalizer","page":"https://dedupe.ly/tools/company-normalizer","input":{"type":"object","properties":{"csv":{"type":"string","description":"The file as CSV text, header row first. Comma, semicolon, tab and pipe delimiters are detected."},"rows":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"Alternative to csv: the rows as objects keyed by column name."},"names":{"type":"array","items":{"type":"string"},"description":"Alternative: a plain list of company names."},"column":{"type":"string","description":"The company column. Default: the first column with company, account or organization in its header."},"groups":{"type":"boolean","description":"Return one row per company group with its variants and count. Default false."}}}},{"slug":"test-data-generator","mcp_name":"generate_test_data","title":"CRM test data generator","description":"Generate fictional contacts, companies or deals in HubSpot, Pipedrive, Salesforce or generic import columns, with a chosen share of duplicates injected the way real ones happen: second emails, reversed names, reformatted phones, legal suffixes, caps, stray spaces, typo domains, half-empty records. Deterministic per seed. CSV only; nothing is written to a CRM.","endpoint":"https://dedupe.ly/tools/api/test-data-generator","page":"https://dedupe.ly/tools/test-data-generator","input":{"type":"object","properties":{"rows":{"type":"integer","minimum":1,"maximum":2000,"description":"Total rows including duplicates. Default 200, max 2000."},"duplicateRate":{"type":"number","minimum":0,"maximum":0.9,"description":"Share of rows that are duplicate copies. Default 0.15."},"object":{"type":"string","enum":["contacts","companies","deals"],"description":"Default contacts."},"shape":{"type":"string","enum":["generic","hubspot","pipedrive","salesforce"],"description":"Column names of that CRM's import. Default generic."},"patterns":{"type":"array","items":{"type":"string","enum":["email-variant","name-reversed","phone-format","company-suffix","casing","whitespace","typo-domain","missing-field"]},"description":"Duplicate patterns to use. Default all."},"labelGroups":{"type":"boolean","description":"Add Duplicate Group and Duplicate Patterns columns that name the truth, for measuring a dedupe. Default false."},"seed":{"type":"integer","description":"Reproduce a previous file."}}}},{"slug":"csv-to-excel","mcp_name":"csv_to_excel","title":"CSV to Excel converter","description":"Convert a CSV to an Excel workbook (.xlsx, or legacy .xls). Values with a leading zero, a plus sign or more than 15 digits stay text, so ZIP codes, phone numbers and long IDs survive; other numbers become numbers; the header row is bold and frozen. Returns the file as base64 in file.base64.","endpoint":"https://dedupe.ly/tools/api/csv-to-excel","page":"https://dedupe.ly/tools/csv-to-excel","input":{"type":"object","properties":{"csv":{"type":"string","description":"The file as CSV text, header row first. Comma, semicolon, tab and pipe delimiters are detected."},"rows":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"Alternative to csv: the rows as objects keyed by column name."},"format":{"type":"string","enum":["xlsx","xls"],"description":"Default xlsx. .xls holds 65,536 rows and 256 columns at most."},"sheetName":{"type":"string","description":"Default Sheet1."},"numbers":{"type":"boolean","description":"Store plain numbers as numbers. Default true; false keeps every cell as text."}}}},{"slug":"excel-to-csv","mcp_name":"excel_to_csv","title":"Excel to CSV converter","description":"Convert an Excel workbook (.xlsx or legacy .xls, sent as base64) to CSV: values as shown, formulas as their last result, dates as year-month-day, every sheet available. Returns the chosen sheet as the table and csvText in the chosen delimiter, plus every sheet when sheet is \"all\".","endpoint":"https://dedupe.ly/tools/api/excel-to-csv","page":"https://dedupe.ly/tools/excel-to-csv","input":{"type":"object","required":["file"],"properties":{"file":{"type":"string","description":"The .xlsx or .xls file as base64."},"sheet":{"type":"string","description":"Sheet name, its number from 1, or \"all\". Default: the first sheet with data."},"delimiter":{"type":"string","enum":[",",";","\t"],"description":"Default comma."},"bom":{"type":"boolean","description":"Start the CSV with a UTF-8 byte order mark, for opening in Excel. Default false."}}}},{"slug":"csv-validator","mcp_name":"validate_csv","title":"CSV validator and column profiler","description":"Validate a CSV and profile its columns. Finds stray and unclosed quotes, rows with the wrong number of fields, blank and duplicate rows, empty or repeated headers, a byte order mark, mixed line endings, bytes that are not UTF-8 and double-decoded text; then gives every column its type, fill rate, distinct and repeated values, values that break its type, ranges and most common values. Send the raw text in csv.","endpoint":"https://dedupe.ly/tools/api/csv-validator","page":"https://dedupe.ly/tools/csv-validator","input":{"type":"object","required":["csv"],"properties":{"csv":{"type":"string","description":"The file as CSV text, exactly as saved: the structure checks read the raw text."}}}},{"slug":"vcf-to-csv","mcp_name":"vcf_to_csv","title":"VCF to CSV converter","description":"Convert a vCard (.vcf) file to CSV: every card in the file, vCard 2.1, 3.0 and 4.0, quoted-printable and UTF-8 names decoded, every email, phone and address kept with its type, first and last name split from the full name when the card has only that. shape \"google\" writes Google Contacts' import headers.","endpoint":"https://dedupe.ly/tools/api/vcf-to-csv","page":"https://dedupe.ly/tools/vcf-to-csv","input":{"type":"object","required":["vcf"],"properties":{"vcf":{"type":"string","description":"The .vcf file as text."},"shape":{"type":"string","enum":["generic","google"],"description":"Column names. Default generic."}}}},{"slug":"csv-to-vcf","mcp_name":"csv_to_vcf","title":"CSV to VCF converter","description":"Convert a CSV contact list to one vCard 3.0 (.vcf) file that iPhone, Android, Google Contacts and Outlook import. Columns are recognized by their headers (generic names, Google Contacts' and CRM exports), every email and phone column is kept with its type, and a full name is split when there is no first and last name. Returns the file as text in vcf.","endpoint":"https://dedupe.ly/tools/api/csv-to-vcf","page":"https://dedupe.ly/tools/csv-to-vcf","input":{"type":"object","properties":{"csv":{"type":"string","description":"The file as CSV text, header row first. Comma, semicolon, tab and pipe delimiters are detected."},"rows":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"Alternative to csv: the rows as objects keyed by column name."}}}},{"slug":"import-checker","mcp_name":"check_crm_import","title":"CRM import checker","description":"Check a CSV against a CRM's import rules before uploading it: HubSpot, Pipedrive, Close, Nimble, Salesforce, Zoho CRM, Google Contacts. Reports, row by row, what the importer skips, which values it imports empty, which rows it merges or duplicates by its own matching rule, and what needs a look; fixes what can be fixed (emails, phones to +country code, dates to year-month-day, numbers, domains, option names) and returns the fixed file as fixedCsv. Rules come from each CRM's help pages; account-specific settings (custom options, owners, existing records) cannot be checked from the file.","endpoint":"https://dedupe.ly/tools/api/import-checker","page":"https://dedupe.ly/tools/import-checker","input":{"type":"object","required":["crm"],"properties":{"csv":{"type":"string","description":"The file as CSV text, header row first. Comma, semicolon, tab and pipe delimiters are detected."},"rows":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"Alternative to csv: the rows as objects keyed by column name."},"crm":{"type":"string","enum":["hubspot","pipedrive","close","nimble","salesforce","zoho","google-contacts"]},"object":{"type":"string","enum":["contacts","companies","leads"],"description":"What the file holds. Default contacts. Leads exist on Salesforce and Zoho CRM; Close, Nimble and Google Contacts take one file."},"dateOrder":{"type":"string","enum":["auto","MDY","DMY","YMD"],"description":"How dates in the file are written. Default auto: the order that reads the most values."},"defaultCountry":{"type":"string","description":"ISO country code for phone numbers written without a country code. Default US."},"decimal":{"type":"string","enum":[".",","],"description":"Decimal separator in number columns. Default \".\"."}}}},{"slug":"import-template","mcp_name":"get_crm_import_template","title":"CRM import template","description":"The CSV import template for HubSpot, Pipedrive, Close, Nimble, Salesforce, Zoho CRM, Google Contacts: the column headers each importer maps on its own, with three example rows of invented data on reserved .example domains.","endpoint":"https://dedupe.ly/tools/api/import-template","page":"https://dedupe.ly/tools/import-template","input":{"type":"object","required":["crm"],"properties":{"crm":{"type":"string","enum":["hubspot","pipedrive","close","nimble","salesforce","zoho","google-contacts"]},"object":{"type":"string","enum":["contacts","companies","leads"],"description":"Default contacts."}}}},{"slug":"job-title-normalizer","mcp_name":"normalize_job_titles","title":"Job title normalizer","description":"Clean a job title column and sort each title into a seniority level (C-level, VP, Director, Manager, Individual contributor) and a department (Sales, Marketing, Engineering, Product, Finance, Operations, HR, IT, Support, Legal, Executive). Spells out short forms (Sr, Mgr, Mktg, Dir), keeps acronyms (CEO, VP, SDR) unless asked, fixes shouted or lowercase titles, strips \"| Hiring\", \"@ Company\", credentials and emoji. Titles the rules cannot decide get no level rather than a guess. Adds Job Title (clean), Seniority and Department columns; the original is kept.","endpoint":"https://dedupe.ly/tools/api/job-title-normalizer","page":"https://dedupe.ly/tools/job-title-normalizer","input":{"type":"object","properties":{"csv":{"type":"string","description":"The file as CSV text, header row first. Comma, semicolon, tab and pipe delimiters are detected."},"rows":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"Alternative to csv: the rows as objects keyed by column name."},"titles":{"type":"array","items":{"type":"string"},"description":"Alternative: a plain list of job titles."},"column":{"type":"string","description":"The job title column. Default: the first column with title, position or role in its header."},"spellOut":{"type":"boolean","description":"Also spell out acronyms: VP becomes Vice President, SDR Sales Development Representative. Default false."}}}},{"slug":"phone-number-formatter","mcp_name":"format_phone_numbers","title":"Bulk phone number formatter","description":"Format a phone column to E.164, international and national format. Numbers written without a country code take the default country; trunk prefixes, 00/011 dialling prefixes, extensions and \"(0)\" are handled for 44 countries, and \"+\" numbers from any other country still get E.164. Flags invalid lengths and numbers in ranges reserved for fiction, and counts numbers that only matched once formatted. Up to 300 numbers a file.","endpoint":"https://dedupe.ly/tools/api/phone-number-formatter","page":"https://dedupe.ly/tools/phone-number-formatter","input":{"type":"object","properties":{"csv":{"type":"string","description":"The file as CSV text, header row first. Comma, semicolon, tab and pipe delimiters are detected."},"rows":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"description":"Alternative to csv: the rows as objects keyed by column name."},"numbers":{"type":"array","items":{"type":"string"},"description":"Alternative: a plain list of phone numbers."},"column":{"type":"string","description":"The phone column. Default: the first column with phone, mobile or tel in its header."},"defaultCountry":{"type":"string","enum":["US","CA","GB","IE","DE","FR","ES","IT","PT","NL","BE","CH","AT","SE","NO","DK","FI","PL","CZ","AU","NZ","IN","SG","HK","JP","KR","CN","BR","MX","AR","CL","CO","ZA","NG","KE","AE","SA","IL","TR","PH","MY","ID","TH"],"description":"Country for numbers written without a country code. Default US."}}}},{"slug":"fake-contact-generator","mcp_name":"generate_mock_data","title":"Fake contact and company generator","description":"Generate fake contacts or companies as CSV in the columns you choose: names, emails at the company domain (always on the reserved .example top-level domain), phones from ranges reserved for fiction, job titles, companies, industries, addresses in the US, Canada or UK, dates and IDs. Each field is a column name and a type. Deterministic per seed. Up to 2,000 rows; nothing is written to a CRM.","endpoint":"https://dedupe.ly/tools/api/fake-contact-generator","page":"https://dedupe.ly/tools/fake-contact-generator","input":{"type":"object","properties":{"object":{"type":"string","enum":["contacts","companies"],"description":"Which preset to start from when fields is empty. Default contacts."},"fields":{"type":"array","items":{"type":"object","required":["type"],"properties":{"name":{"type":"string","description":"Column header. Default: the type's usual header."},"type":{"type":"string","enum":["id","uuid","first_name","last_name","full_name","email","phone","job_title","department","linkedin_url","lifecycle_stage","lead_source","company","domain","website","industry","employees","annual_revenue","founded_year","street","city","region","postal_code","country","created_at"]}}},"description":"The columns, in order. Default: the object's preset."},"rows":{"type":"integer","minimum":1,"maximum":2000,"description":"Default 100, max 2000."},"country":{"type":"string","enum":["us","ca","uk","mixed"],"description":"Where the addresses and phones are. Default us."},"seed":{"type":"integer","description":"Reproduce a previous file."}}}},{"slug":"duplicate-cost-calculator","mcp_name":"estimate_duplicate_cost","title":"Duplicate cost calculator","description":"Estimate what duplicate records cost on a CRM: the monthly and yearly amount they add to the subscription under that CRM's own list prices (HubSpot marketing contacts, Pipedrive Campaigns, Salesforce storage and Account Engagement, Zoho CRM storage, Close, Nimble and Google Contacts limits), plus the hours and cost of merging them by hand. Takes no file; returns the cost lines as a table with the sources the prices came from.","endpoint":"https://dedupe.ly/tools/api/duplicate-cost-calculator","page":"https://dedupe.ly/tools/duplicate-cost-calculator","input":{"type":"object","required":["crm","records"],"properties":{"crm":{"type":"string","enum":["hubspot","pipedrive","salesforce","zoho","close","nimble","google-contacts"]},"plan":{"type":"string","description":"The plan, which decides how records reach the bill. hubspot: marketing-starter, marketing-professional, marketing-enterprise, sales-service, free; pipedrive: campaigns-standard, campaigns-premium, no-campaigns; salesforce: enterprise, unlimited, suite, core, mcae, mcae-premium; zoho: free, standard, professional, enterprise, ultimate; close: solo, essentials, growth, scale; nimble: business; google-contacts: account. Default: the CRM's most common paid plan."},"records":{"type":"integer","minimum":0,"description":"Records of the kind the plan counts (marketing contacts on HubSpot Marketing Hub, subscribed contacts on Pipedrive Campaigns, leads on Close), duplicates included."},"duplicateRate":{"type":"number","minimum":0,"maximum":0.9,"description":"Share of those records that are extra copies. Default 0.3."},"duplicates":{"type":"integer","minimum":0,"description":"Alternative to duplicateRate: the count of extra copies."},"users":{"type":"integer","minimum":1,"description":"Paid users, where storage or an upgrade depends on it. Default 1."},"billing":{"type":"string","enum":["annual","monthly"],"description":"Default annual."},"minutesPerMerge":{"type":"number","minimum":0,"description":"Minutes to merge one duplicate by hand. Default 4."},"hourlyRate":{"type":"number","minimum":0,"description":"Hourly cost in USD of whoever merges. Default 50."}}}}]}