Skip to main content
Glama
Bonafon2009

Forensic Company MCP

by Bonafon2009

Forensic Company MCP

MCP server in Python for corporate OSINT / compliance research.

Tools

  • server_info

  • normalize_company_name

  • compare_company_names

  • compare_addresses

  • search_gleif_company

  • screen_opensanctions_company

  • get_opensanctions_entity

  • build_relationship_graph

The server deliberately labels matches and shared attributes as investigative leads rather than proof of wrongdoing.

Related MCP server: WhiteIntel MCP Server

1. Create the environment

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env

Python 3.10+ is supported by MCP SDK v2.

2. Optional OpenSanctions key

Edit .env:

OPENSANCTIONS_API_KEY=YOUR_KEY

Do not put this key in Expo or React Native source code.

3. Run locally

uvicorn server:app --host 127.0.0.1 --port 8000 --reload

MCP endpoint:

http://127.0.0.1:8000/mcp

Health check:

http://127.0.0.1:8000/health

4. Test it

In another terminal:

source .venv/bin/activate
python client_test.py

Or use MCP Inspector:

npx -y @modelcontextprotocol/inspector

Then connect the inspector to:

http://127.0.0.1:8000/mcp

5. Render

Build command:

pip install -r requirements.txt

Start command:

uvicorn server:app --host 0.0.0.0 --port $PORT

Set these environment variables in Render:

OPENSANCTIONS_API_KEY=...
MCP_ALLOWED_HOSTS=YOUR-SERVICE.onrender.com,YOUR-SERVICE.onrender.com:*
CORS_ORIGINS=https://YOUR-FRONTEND.example

For a native-only React Native client, CORS_ORIGINS is less important because CORS is a browser rule. Keep the MCP provider API keys server-side either way.

Example graph input

Call build_relationship_graph with companies_json containing:

[
  {
    "name": "Empresa A",
    "address": "Av. Ejemplo 100, Monterrey, NL",
    "officers": ["Persona Uno"]
  },
  {
    "name": "Empresa B",
    "address": "Avenida Ejemplo 100, Monterrey, NL",
    "officers": ["Persona Uno", "Persona Dos"]
  }
]

The tool returns nodes and relationship edges such as shared_address and shared_officer.

Important

A sanctions hit, shared address, shared officer, or high name similarity is not by itself evidence of money laundering, a shell company, fraud, or any crime. Preserve the source, entity IDs, dates, and original records so findings can be independently verified.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to investigate corporate ownership, trace ultimate beneficial owners, screen sanctions, detect offshore exposure, and access fully cited dossiers from 130M+ entities across 31 global registries.
    21
    96 npm
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables LLM clients to investigate Brazilian companies by CNPJ or name, mapping corporate relationships and gathering structured, source-attributed public evidence from official registries, news, social profiles, judicial proceedings, and PEP checks.
    6
    14 PyPI
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI assistants to look up, resolve, verify and sanctions-screen legal entities across the UK and Europe by merging company registries, GLEIF LEIs and VIES VAT data into one profile with per-field provenance. Supports KYB and due-diligence workflows through name and identifier search, officer and ownership tracing, filings and insolvency checks, and honest reporting of gaps, stale sources or unavailable data.
    9
    Elastic 2.0