MCP server for PEP and sanctions screening with fuzzy matching search
Strong foundation with 16 well-named tools using consistent verb_noun patterns (list_, create_, update_, delete_, get_, screen_, batch_). All tools have descriptions (avg 85 chars, within 10-1024 range). Input schemas present for all tools with Zod validation. However, output schemas are not documented in code, responses are formatted via formatters.ts but return types are not declared to the LLM. Error handling exists (SSRF validation, permission checks) but recovery guidance is minimal. Security is solid: permission gates on admin tools, audit logging, URL validation. Composition is clean: tools are single-responsibility, chainable (e.g., screen_person → get_entity_details). Missing: tool annotations (readOnlyHint, destructiveHint), explicit output schema documentation, and richer error messages.
Screen multiple entities (up to 200) against PEP and sanctions lists.
Add a new custom data source for crawling.
Delete a custom data source. Cannot delete built-in sources.
Get the status of recent crawls.
Get overall data coverage and source statistics.
Get the full profile of an entity including aliases, sanctions lists, and relationships.
Output schemas not documented. Tools return formatted text via formatters.ts, but LLMs cannot see the structure of response fields (e.g., what fields are in entity details, network graph, or crawl status). This forces LLMs to parse unstructured text and risks missing critical fields for chaining.
Tool annotations missing. No readOnlyHint on read tools (screen_person, get_entity_details) or destructiveHint on delete_source. This prevents clients from rendering UI hints or enforcing safety policies.
Error messages lack recovery guidance. SSRF validation returns 'Blocked: <msg>' but does not suggest alternatives. Permission failures do not hint at required scopes. LLMs cannot self-correct without actionable error text.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 70 | 2026-07-28+ | v2 |
Traverse the relationship graph around an entity to discover connections.
Get the current fuzzy matching configuration.
Get coverage statistics for a specific data source.
List all configured data sources.
Fuzzy search for a company against sanctions lists. Returns matches with confidence scores.
Fuzzy search for a person against PEP and sanctions lists. Returns matches with confidence scores.
Test-fetch a data source to validate its configuration.
Manually trigger a data crawl. Omit sourceId to crawl all enabled sources.
Update fuzzy matching thresholds and weights.
Update an existing data source configuration.
Pagination not visible in tool definitions. batch_screen accepts up to 200 entities but no limit parameter. get_crawl_status has a limit param (good) but no total_count or next_cursor in documented output. Large result sets risk context window exhaustion.
Parameter constraints not fully specified. threshold params in screen_person/screen_company default to 0.6 but no min/max bounds stated. depth in get_entity_network is 1-4 but not enforced in schema. LLMs may pass invalid values.