People Data Labs MCP by usefulapi

Enrich and search people and companies, resolve identities, and enrich IP addresses.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
92%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,631Tokens (tool definitions)
~3.1 KBTypical response size
Significant attention impact (2.06% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "peopledatalabs": {
      "url": "https://peopledatalabs.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://peopledatalabs.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (8)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢pdl_person_enrich(name, first_name, last_name, email, phone, ...)

Find the single best-matching person profile for a set of identifying attributes (name, email, phone, profile URL, company, etc.). Returns one record plus a likelihood score (1-10), or a 404 'no match' body. Use uniquely-identifying inputs for best results. API: GET /person/enrich.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "description": "Full name, e.g. 'Sean Thorne'.",
      "type": "string"
    },
    "first_name": {
      "description": "First / given name.",
      "type": "string"
    },
    "last_name": {
      "description": "Last / family name.",
      "type": "string"
    },
    "email": {
      "description": "Email address, or an array of email addresses.",
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ]
    },
    "phone": {
      "description": "Phone number (E.164 or local).",
      "type": "string"
    },
    "profile": {
      "description": "Social profile URL(s), e.g. a LinkedIn URL. String or array.",
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ]
    },
    "lid": {
      "description": "LinkedIn numerical ID.",
      "type": "string"
    },
    "pdl_id": {
      "description": "PDL persistent ID for a person record.",
      "type": "string"
    },
    "company": {
      "description": "Company name, website, or PDL company id the person works at.",
      "type": "string"
    },
    "school": {
      "description": "School name or website the person attended.",
      "type": "string"
    },
    "location": {
      "description": "Free-text location, e.g. 'San Francisco, CA, USA'.",
      "type": "string"
    },
    "region": {
      "description": "State / region, e.g. 'california'.",
      "type": "string"
    },
    "locality": {
      "description": "City / locality, e.g. 'san francisco'.",
      "type": "string"
    },
    "postal_code": {
      "description": "Postal / ZIP code (assumed US if no country).",
      "type": "string"
    },
    "country": {
      "description": "Country name, e.g. 'united states'.",
      "type": "string"
    },
    "birth_date": {
      "description": "Birth date (yyyy or yyyy-mm-dd).",
      "type": "string"
    },
    "min_likelihood": {
      "description": "Only return a 200 if match confidence >= this (1-10).",
      "type": "integer",
      "minimum": 1,
      "maximum": 10
    },
    "required": {
      "description": "Only return a match that contains these fields, e.g. 'emails AND mobile_phone'.",
      "type": "string"
    },
    "titlecase": {
      "description": "Titlecase the returned data (default false = lowercase).",
      "type": "boolean"
    },
    "pretty": {
      "description": "Pretty-print the JSON response.",
      "type": "boolean"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢pdl_person_identify(name, first_name, last_name, email, phone, ...)

Given broad, possibly-ambiguous attributes about a person, return up to 20 strongly-related profiles ranked by match score. Sits between enrich (1:1) and search (open-ended) — ideal when you can't uniquely resolve someone. API: GET /person/identify.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "description": "Full name, e.g. 'Sean Thorne'.",
      "type": "string"
    },
    "first_name": {
      "description": "First / given name.",
      "type": "string"
    },
    "last_name": {
      "description": "Last / family name.",
      "type": "string"
    },
    "email": {
      "description": "Email address, or an array of email addresses.",
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ]
    },
    "phone": {
      "description": "Phone number (E.164 or local).",
      "type": "string"
    },
    "profile": {
      "description": "Social profile URL(s), e.g. a LinkedIn URL. String or array.",
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ]
    },
    "lid": {
      "description": "LinkedIn numerical ID.",
      "type": "string"
    },
    "pdl_id": {
      "description": "PDL persistent ID for a person record.",
      "type": "string"
    },
    "company": {
      "description": "Company name, website, or PDL company id the person works at.",
      "type": "string"
    },
    "school": {
      "description": "School name or website the person attended.",
      "type": "string"
    },
    "location": {
      "description": "Free-text location, e.g. 'San Francisco, CA, USA'.",
      "type": "string"
    },
    "region": {
      "description": "State / region, e.g. 'california'.",
      "type": "string"
    },
    "locality": {
      "description": "City / locality, e.g. 'san francisco'.",
      "type": "string"
    },
    "postal_code": {
      "description": "Postal / ZIP code (assumed US if no country).",
      "type": "string"
    },
    "country": {
      "description": "Country name, e.g. 'united states'.",
      "type": "string"
    },
    "birth_date": {
      "description": "Birth date (yyyy or yyyy-mm-dd).",
      "type": "string"
    },
    "titlecase": {
      "description": "Titlecase the returned data (default false = lowercase).",
      "type": "boolean"
    },
    "pretty": {
      "description": "Pretty-print the JSON response.",
      "type": "boolean"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢pdl_person_search(query, sql, size, from, scroll_token, ...)

Search the full PDL Person Dataset with an Elasticsearch query object OR a SQL string over the Person Schema (e.g. everyone with job_title_role='engineering' at a company). Returns matching profiles sorted by completeness; paginate with scroll_token. Each returned record costs 1 credit. API: POST /person/search.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "description": "Elasticsearch query as a JSON string, e.g. {\"query\":{\"term\":{\"job_company_name\":\"people data labs\"}}} — pass the value of \"query\".",
      "type": "string"
    },
    "sql": {
      "description": "SQL query string, e.g. SELECT * FROM person WHERE job_company_name='people data labs'.",
      "type": "string"
    },
    "size": {
      "description": "Number of records to return (1-100). Default 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "from": {
      "description": "Legacy offset (0-9999). Prefer scroll_token.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9999
    },
    "scroll_token": {
      "description": "Pagination token from a previous response.",
      "type": "string"
    },
    "dataset": {
      "description": "Dataset(s) to search: resume, email, phone, mobile_phone, street_address, consumer_social, developer, all. Comma-separate; prefix '-' to exclude.",
      "type": "string"
    },
    "titlecase": {
      "description": "Titlecase the returned data.",
      "type": "boolean"
    },
    "pretty": {
      "description": "Pretty-print the JSON response.",
      "type": "boolean"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢pdl_company_enrich(name, website, ticker, profile, pdl_id, ...)

Find the single best-matching company record. Requires a non-ambiguous input — name OR website OR ticker OR profile (website/ticker/profile resolve more reliably than name). Returns firmographics (industry, size, location, etc.) or a 404 'no match' body. API: GET /company/enrich.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "description": "Company name, e.g. 'People Data Labs'.",
      "type": "string"
    },
    "website": {
      "description": "Company website, e.g. 'google.com' (most reliable).",
      "type": "string"
    },
    "ticker": {
      "description": "Stock ticker for a public company, e.g. 'AAPL'.",
      "type": "string"
    },
    "profile": {
      "description": "Company social profile URL, e.g. a LinkedIn company URL.",
      "type": "string"
    },
    "pdl_id": {
      "description": "PDL id for a company record.",
      "type": "string"
    },
    "location": {
      "description": "Company location free-text.",
      "type": "string"
    },
    "locality": {
      "description": "Company city / locality.",
      "type": "string"
    },
    "region": {
      "description": "Company state / region.",
      "type": "string"
    },
    "country": {
      "description": "Company country.",
      "type": "string"
    },
    "titlecase": {
      "description": "Titlecase the returned data.",
      "type": "boolean"
    },
    "pretty": {
      "description": "Pretty-print the JSON response.",
      "type": "boolean"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢pdl_company_search(query, sql, size, from, scroll_token, ...)

Search the full PDL Company Dataset with an Elasticsearch query object OR a SQL string over the Company Schema (e.g. all SaaS companies with 50-200 employees in the US). Paginate with scroll_token. Each returned record costs 1 credit. API: POST /company/search.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "description": "Elasticsearch query as a JSON string, e.g. {\"query\":{\"term\":{\"industry\":\"computer software\"}}} — pass the value of \"query\".",
      "type": "string"
    },
    "sql": {
      "description": "SQL query string, e.g. SELECT * FROM company WHERE industry='computer software'.",
      "type": "string"
    },
    "size": {
      "description": "Number of records to return (1-100). Default 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "from": {
      "description": "Legacy offset (0-9999). Prefer scroll_token.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9999
    },
    "scroll_token": {
      "description": "Pagination token from a previous response.",
      "type": "string"
    },
    "titlecase": {
      "description": "Titlecase the returned data.",
      "type": "boolean"
    },
    "pretty": {
      "description": "Pretty-print the JSON response.",
      "type": "boolean"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢pdl_ip_enrich(ip, return_person, min_confidence, titlecase, pretty)

Enrich an IP address with its location, company, and (optionally) associated person data via a 1:1 match against PDL's IP dataset. API: GET /ip/enrich.

Input Schema

{
  "type": "object",
  "properties": {
    "ip": {
      "type": "string",
      "description": "The IP address to enrich, e.g. '72.212.42.169'."
    },
    "return_person": {
      "description": "Include associated person data if available.",
      "type": "boolean"
    },
    "min_confidence": {
      "description": "Minimum confidence level required to return a match.",
      "type": "string",
      "enum": [
        "very high",
        "high",
        "moderate",
        "low",
        "very low"
      ]
    },
    "titlecase": {
      "description": "Titlecase the returned data.",
      "type": "boolean"
    },
    "pretty": {
      "description": "Pretty-print the JSON response.",
      "type": "boolean"
    }
  },
  "required": [
    "ip"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢pdl_autocomplete(field, text, size, titlecase, pretty)

Get suggested values for a search field along with the number of available records for each — useful for building valid Person/Company Search queries. Free on all plans. API: GET /autocomplete.

Input Schema

{
  "type": "object",
  "properties": {
    "field": {
      "type": "string",
      "description": "Field to autocomplete: e.g. company, school, location, region, country, industry, title, role, sub_role, skill, major."
    },
    "text": {
      "description": "Partial text to get suggestions for, e.g. 'stanf'.",
      "type": "string"
    },
    "size": {
      "description": "Max suggestions to return. Default 10.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "titlecase": {
      "description": "Titlecase the returned data.",
      "type": "boolean"
    },
    "pretty": {
      "description": "Pretty-print the JSON response.",
      "type": "boolean"
    }
  },
  "required": [
    "field"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢pdl_job_posting_search(query, sql, size, scroll_token, pretty)

Search PDL's Job Posting Dataset (millions of active & historical postings sourced from company career pages) with an Elasticsearch query object OR a SQL string. Beta — may require plan access (HTTP 403 if not enabled). Each returned posting costs 1 credit. API: POST /job_posting/search.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "description": "Elasticsearch query as a JSON string, e.g. {\"query\":{\"term\":{\"title_role\":\"engineering\"}}} — pass the value of \"query\".",
      "type": "string"
    },
    "sql": {
      "description": "SQL query string over the job posting dataset.",
      "type": "string"
    },
    "size": {
      "description": "Number of records to return (1-100). Default 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "scroll_token": {
      "description": "Pagination token from a previous response.",
      "type": "string"
    },
    "pretty": {
      "description": "Pretty-print the JSON response.",
      "type": "boolean"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
failed observationversion not recorded—
failed observationversion not recorded—