# OSINT Person Intelligence MCP Pattern Build a dedicated entity-resolution layer above generic search MCPs when the task is person/skip-trace intelligence rather than raw search. ## Architecture ``` Hermes ↓ osint-person-mcp # entity resolution, scoring, dossier logic ↓ super-search MCP # raw search + extraction providers ↓ SearXNG / Exa / OpenCorporates / CourtListener / Firecrawl ``` Keep `super-search` generic. Put identity-specific logic in a separate MCP so the generic search engine does not become a grab bag of scoring and compliance behavior. ## Tool set Recommended tools: | Tool | Purpose | |---|---| | `person_search` | Query generation, search, source scoring, entity clustering, compliance notes | | `phone_search_variants` | Normalize phone and emit common variants | | `phone_search` | Search all phone variants and cluster matches | | `email_search` | Search email address and cluster matches | | `business_affiliation_search` | Search person + organization/business/location anchors | | `court_business_search` | Search court/business/public-record query variants | | `score_source` | Score URL/title/description reliability | | `dossier_report` | Convert structured JSON into concise markdown report | ## Source scoring Use durable source tiers: | Tier | Examples | Treatment | |---|---|---| | High | official school/government/court/publication sources | Strong evidence only when identity anchors also match | | Medium-high | LinkedIn, RocketReach, TheOrg, Tradeloop, ZoomInfo | Useful but needs corroboration | | Medium-low | Whitepages, 411, BeenVerified, NPD, FastBackgroundCheck | Lead only; mark unverified | | Low | obituaries/name-only pages | Usually weak/name-collision | | Reject | random blob/CDN/search-spam pages | Exclude from useful clusters | Do not let organization-only pages rank as likely person matches. An official SCAD page with no subject name is context, not identity evidence. ## Matching pitfalls - Ignore one-letter middle initials for alias matching. A lone `m` from `Germaine M. Brown` matches almost every page. - Normalize phone numbers into all common forms: digits, dashed, dotted, `(xxx) xxx-xxxx`, `+1 xxx xxx xxxx`, `+1-xxx-xxx-xxxx`. - Separate likely target, possible target, weak/different, and rejected results. - Preserve source URL, query, provider, matched fields, score, and timestamp for every lead. - Treat Atlanta/Savannah/location-only matches as insufficient without identity anchors. ## Compliance guardrails - OSINT results are leads, not verified facts. - Do not auto-contact from scraped or data-broker leads without human review. - Preserve source URL and timestamp for every claim. - Mark data-broker information as unverified until corroborated. ## DRE integration path 1. Add `Run OSINT` button on claim/debtor page. 2. Call `person_search` with debtor anchors. 3. Save JSON packet + markdown dossier to debtor record. 4. Require human review before any collection action uses a lead. 5. Later add paid providers only where MVP gaps are proven (People Data Labs, Trestle/Ekata-style phone intelligence, Pipl).