120+ built-in contact data checks

Check your leads in Claude Code.

Give Claude Code a few rows from Clay, Google Sheets or a CSV. It sends them to ListPlus over MCP. You get the findings back in chat, with suggested fixes where available.

Claude CodeMCP · check_records

Check these contacts before outreach. Which emails need a fix? Do any leads share an inbox?

Shared inbox
ContactField_7Email
Anna Kelleroffice@nordwerk-muster.de
Ben Fischeroffice@nordwerk-muster.de
Keep both contacts.

Anna and Ben use the same office inbox at Nordwerk. Merging the rows would lose one person’s record.

These three checks are free in ListPlus.

JSON inrecords[1]
{
  "first_name": "Anna",
  "last_name": "Keller",
  "Field_7": "office@nordwerk-muster.de"
}
JSON outFinding excerpt
{
  "check": "email_shared",
  "field": "Field_7",
  "value": "office@nordwerk-muster.de"
}
See the four input rows and the check results
Tool argumentscheck_records
{
  "records": [
    {
      "first_name": "Lena",
      "last_name": "Graf",
      "Field_7": "lena.graf@gmial.com"
    },
    {
      "first_name": "Anna",
      "last_name": "Keller",
      "Field_7": "office@nordwerk-muster.de"
    },
    {
      "first_name": "Ben",
      "last_name": "Fischer",
      "Field_7": "office@nordwerk-muster.de"
    },
    {
      "first_name": "Tom",
      "last_name": "Lenz",
      "Field_7": "tom@mailinator.com"
    }
  ],
  "categories": [
    "email",
    "duplicates"
  ]
}
Response excerptcheck_records
{
  "fields": {
    "first_name": "first_name",
    "last_name": "last_name",
    "Field_7": "email"
  },
  "score": 6.5,
  "records": 4,
  "findings_total": 6,
  "by_record": [
    {
      "index": 0,
      "findings": [
        {
          "check": "email_typo",
          "name": "Email Domain Typo",
          "category": "email",
          "severity": "warning",
          "field": "Field_7",
          "value": "lena.graf@gmial.com",
          "message": "Possible domain typo detected",
          "fix": "lena.graf@gmail.com"
        }
      ]
    },
    {
      "index": 1,
      "findings": [
        {
          "check": "email_role_based",
          "name": "Role-Based Email",
          "category": "email",
          "severity": "warning",
          "field": "Field_7",
          "value": "office@nordwerk-muster.de",
          "message": "Role-based email address (not personal)"
        },
        {
          "check": "email_shared",
          "name": "Shared Email",
          "category": "duplicates",
          "severity": "info",
          "field": "Field_7",
          "value": "office@nordwerk-muster.de",
          "message": "Shared email address (2 contacts)"
        }
      ]
    },
    {
      "index": 2,
      "findings": [
        {
          "check": "email_role_based",
          "name": "Role-Based Email",
          "category": "email",
          "severity": "warning",
          "field": "Field_7",
          "value": "office@nordwerk-muster.de",
          "message": "Role-based email address (not personal)"
        },
        {
          "check": "email_shared",
          "name": "Shared Email",
          "category": "duplicates",
          "severity": "info",
          "field": "Field_7",
          "value": "office@nordwerk-muster.de",
          "message": "Shared email address (2 contacts)"
        }
      ]
    },
    {
      "index": 3,
      "findings": [
        {
          "check": "email_disposable",
          "name": "Disposable Email Domain",
          "category": "email",
          "severity": "critical",
          "field": "Field_7",
          "value": "tom@mailinator.com",
          "message": "Disposable/temporary email domain detected"
        }
      ]
    }
  ],
  "summary": [
    {
      "check": "email_role_based",
      "name": "Role-Based Email",
      "severity": "warning",
      "records": 2
    },
    {
      "check": "email_shared",
      "name": "Shared Email",
      "severity": "info",
      "records": 2
    },
    {
      "check": "email_typo",
      "name": "Email Domain Typo",
      "severity": "warning",
      "records": 1
    },
    {
      "check": "email_disposable",
      "name": "Disposable Email Domain",
      "severity": "critical",
      "records": 1
    }
  ],
  "options": [
    {
      "action": "enrich_records",
      "fields": [
        "phone"
      ]
    },
    {
      "action": "enrich_records",
      "fields": [
        "job_title"
      ]
    },
    {
      "action": "enrich_records",
      "fields": [
        "linkedin_profile_url"
      ]
    },
    {
      "action": "enrich_records",
      "fields": [
        "company_name"
      ]
    },
    {
      "action": "enrich_records",
      "fields": [
        "industry"
      ]
    },
    {
      "action": "enrich_records",
      "fields": [
        "city"
      ]
    },
    {
      "action": "enrich_records",
      "fields": [
        "country"
      ]
    }
  ]
}
See the suggested lookup for Anna

Now ask for Anna’s job title.

Anna shares an inbox with Ben. Is she the right person to contact? The check offers to find her job title. When you ask, Claude Code sends her name and company domain and gets the value back in chat.

Keep the results for your next run
Sample enrichmentenrich_records
Find Anna Keller’s job title at Nordwerk.
Returned to Claude CodeSales ManagerAnna Keller · nordwerk-muster.dejob_title
See the enrichment JSON
JSON in
{
  "records": [
    {
      "first_name": "Anna",
      "last_name": "Keller",
      "domain": "nordwerk-muster.de"
    }
  ],
  "fields": [
    "job_title"
  ]
}
JSON outResponse excerpt
{
  "status": "done",
  "records": [
    {
      "index": 0,
      "record": {
        "first_name": "Anna",
        "last_name": "Keller",
        "domain": "nordwerk-muster.de",
        "job_title": "Sales Manager"
      },
      "has": [
        "job_title"
      ]
    }
  ]
}

If the lookup takes longer, Claude Code gets a job ID and reads the result with get_job.

A lookup uses workspace credits. Ask for an estimate before running it. Connect your workspace

Use ListPlus as storage for your agents.

Running this again tomorrow? Ask Claude Code to create a ListPlus list, configure its rules and add the contacts with the values you’ve found.

  1. Pick up where you left off

    In a fresh chat, your agent can read Anna’s job title from the same record and work on the next missing field.

  2. Fetch just the rows that need work

    Ask your agent for contacts marked for review or leads that still need a work email. It can update those records in place.

  3. Let the list work after the chat ends

    When a row changes, the list checks it and can start a lookup or send a qualified contact to your CRM.

See how a new contact reaches HubSpot

Let the list qualify each new lead.

You want to reach operations leaders at companies with at least 200 employees. Add Mia to the sample list to see which steps it runs for her.

  1. Score the contact against your criteria

    Mia leads operations (+60 points). Her company has 250 employees (+25). The list gives her a fit score of 85.

  2. Run paid lookups only for leads that fit

    At 80 points or more, the first trigger looks for a missing work email. Below that threshold, the list skips the lookup.

    80
  3. Send the record when it’s ready

    When the lookup saves a verified address, the second trigger marks Mia as Qualified. A pipeline sends her contact to the destination you chose. Here it sends automatically to HubSpot.

Your contact list

Sample data
ContactEmailIn the listHubSpot
Lena Graf
lena.graf@gmial.comReview typoNot queued
Anna KellerSales Manager
office@nordwerk-muster.deTeam inboxNot queued
Ben Fischer
office@nordwerk-muster.deTeam inboxNot queued
Tom Lenz
tom@mailinator.comIgnoredNot queued

Claude Code added the four contacts you checked above.

Other destinations for ready contactsPOST to an n8n webhookAdd to a lemlist campaignSend to Salesforce

ListPlus Pro includes HubSpot sync (€69/month in Europe, $79/month elsewhere). Syncs use credits per successful request. Pipelines use credits per contact delivered. Plans and credit pricing

See the Claude Code prompt
Set up this list
Create a list for the contacts we just checked. Give 60 points to people who lead operations and 25 points if their company has at least 200 employees. Add 15 more for companies with 500 or more. At 80 points or above, look for a missing work email. When a direct address is verified, set the contact’s status to Qualified and use our HubSpot pipeline with automatic release. Tag shared inboxes and ignore disposable addresses. Then add the contacts and show me the results.
See how to set your own rules

Try the four sample contacts in Claude Code.

Run the command in your terminal to add ListPlus as an MCP server. Open /mcp in Claude Code to check the connection, then paste the sample prompt.

To check your own contacts, paste a few rows into Claude Code or give it the path to a CSV. The results appear in your chat.

REST API reference
Terminal
claude mcp add --transport http listplus https://listplus.ai/mcp --scope user
First prompt in Claude Code
Use ListPlus check_records on the contacts below. Show me shared inboxes, domain typos and disposable emails. Include suggested fixes where available. first_name,last_name,Field_7 Lena,Graf,lena.graf@gmial.com Anna,Keller,office@nordwerk-muster.de Ben,Fischer,office@nordwerk-muster.de Tom,Lenz,tom@mailinator.com
Watch the Claude Code setup

Videos and recipes

Check and fix your data

Videos

Recipes

Check and fix your contact data.
  1. Pass in the rows
  2. Read the report
  3. Apply the fixes
  4. Decide what moves on
Open full recipe
Review an export and release it row by row.
  1. Open the export in a review list
  2. Hold rows that need a decision
  3. Release row by row
Open full recipe
From a trade show CSV to a call queue.
  1. Set up the campaign list
  2. Score and check each contact
  3. Approve the lookup rule once
  4. Hand off contacts who are ready for a call
Open full recipe

Before you connect

I already use Clay. When would I add ListPlus?

Send a few rows from your Clay workflow to ListPlus for a quality report in Claude Code. You can request a missing field and take the result back to Clay. For recurring work, your agent can also store the records in ListPlus.

Which checks are free?

The rule-based checks in the example use no ListPlus credits and work without an API key, within the usage limits. Optional AI checks, mailbox verification and enrichment are separate actions that use credits.

Where should Claude Code save the results?

A one-off check returns a report in chat. A direct enrichment returns the fields found, so your agent can write them to your current data source. For recurring work, Claude Code can create a ListPlus list and update those records across sessions.

Do my columns need specific names?

ListPlus recognizes common field names and can identify email addresses, phone numbers and LinkedIn URLs from their values. In this example, the email column is called Field_7. Give ambiguous fields a descriptive header.

Does checking contacts write to my CRM?

The check returns a report. For a one-off handoff, select the contacts and start the HubSpot export yourself. It sends them in batches and uses credits per request. To send each lead to HubSpot or Salesforce as soon as it qualifies, set up a list trigger and a pipeline with automatic release. Pipeline deliveries use credits per contact.

Which lists can my agent change?

You choose the lists, columns and actions the connection can access. Enable Set up for Claude Code to create a list, score and triggers. Set a budget for enrichment rules. For handoffs, choose a connected pipeline with manual or automatic release.

Can I run this from n8n or a script?

Yes. Send the same rows as JSON to the REST API and use the findings in the next step of your workflow. A report includes the affected row, field, check and a suggested fix where available.

Check your own lead list.

Start with a few rows. Ask Claude Code which contacts need attention before your next sequence.