Skip to main content
Glama
scka-de
by scka-de
README.md
# opensanctions-mcp

MCP server for sanctions screening and PEP checks via the [OpenSanctions](https://www.opensanctions.org/) API.

Lets AI agents (Claude, Cursor, Windsurf, GPT) screen persons and companies against 320+ sanctions and PEP lists from OFAC, EU, UN, UK HMT, and more.

> **Disclaimer:** This tool provides informational data only. It is not legal or compliance advice. Always verify matches with official sources before taking action.

## Quick Start

Add to your MCP client config:

```json
{
  "mcpServers": {
    "opensanctions": {
      "command": "npx",
      "args": ["-y", "opensanctions-mcp"],
      "env": {
        "OPENSANCTIONS_API_KEY": "your-key-here"
      }
    }
  }
}
```

Get a free API key at [opensanctions.org/api](https://www.opensanctions.org/api/).

### Where to add this config

- **Claude Desktop:** `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows)
- **Cursor:** Settings > MCP Servers
- **Windsurf:** `~/.windsurf/config.json`

## Tools

### search_entities

Search the OpenSanctions database by name or keyword.

```
"Search for entities named Viktor Bout"
"Find companies related to Iran sanctions"
```

### match_entity

Screen a person or company against sanctions and PEP lists using structured properties. This is the primary screening tool.

```
"Screen Viktor Bout, born 1967-01-13, Russian national, against sanctions lists"
"Check if Acme Corp is on any EU sanctions list"
```

### get_entity

Fetch complete details for a specific entity, including relationships to other entities (companies, associates, family members).

```
"Get full details for entity NK-2Ciy8EG7jz1YHMGCxYLb25"
```

### list_datasets

List available sanctions and PEP datasets. No API key required.

```
"What sanctions lists are available?"
"Show me EU-related datasets"
```

### get_dataset

Get details about a specific dataset (publisher, entity count, last updated). No API key required.

```
"Tell me about the OFAC SDN list"
```

### investigate_entity

Run a full compliance investigation in one call: match, fetch details, map relationships, and return structured data.

```
"Investigate Viktor Bout for sanctions exposure"
"Run a compliance check on Acme Corp, jurisdiction Belgium"
```

## Configuration

| Environment Variable | Required | Default | Description |
|---|---|---|---|
| `OPENSANCTIONS_API_KEY` | Yes* | — | API key for the hosted OpenSanctions API. Get one at [opensanctions.org/api](https://www.opensanctions.org/api/). |
| `OPENSANCTIONS_API_URL` | No | `https://api.opensanctions.org` | API URL. Set to your self-hosted yente instance. |
| `OPENSANCTIONS_DATASET` | No | `default` | Dataset to screen against. `default` includes all 320+ sources. |
| `OPENSANCTIONS_MAX_RETRIES` | No | `3` | Max retries for failed API calls. |
| `DEBUG` | No | — | Set to any value to enable debug logging. |

*Not required for `list_datasets`, `get_dataset`, or when using a self-hosted yente instance without auth.

## Self-hosted yente

If you run your own [yente](https://github.com/opensanctions/yente) instance, point the server at it:

```json
{
  "mcpServers": {
    "opensanctions": {
      "command": "npx",
      "args": ["-y", "opensanctions-mcp"],
      "env": {
        "OPENSANCTIONS_API_URL": "http://localhost:8000"
      }
    }
  }
}
```

No API key needed for self-hosted yente.

## Development

```bash
git clone https://github.com/scka-de/opensanctions-mcp.git
cd opensanctions-mcp
npm install
npm test          # run tests (fixtures, no API key needed)
npm run build     # compile to dist/
npm run dev       # run in dev mode
npm run lint      # check code style
```

## License

MIT

TDQS

A4.4/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct purpose with minimal overlap: list_datasets enumerates datasets, get_dataset retrieves dataset details, search_entities performs keyword searches, match_entity conducts structured screening with scores, get_entity fetches full entity details, and investigate_entity runs comprehensive investigations. The descriptions explicitly differentiate them, such as noting that search_entities is for exploratory queries while match_entity is for formal screening.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using snake_case: list_datasets, get_dataset, search_entities, match_entity, get_entity, and investigate_entity. This uniformity makes the tool set predictable and easy to navigate, with no deviations in naming conventions.

Tool Count5/5

With 6 tools, the server is well-scoped for its domain of sanctions and PEP data access. Each tool serves a specific function in the workflow, from listing and getting datasets to searching, matching, and investigating entities, without being overly sparse or bloated.

Completeness5/5

The tool set provides complete coverage for the OpenSanctions domain, including dataset enumeration (list_datasets, get_dataset), entity discovery (search_entities, match_entity), detailed retrieval (get_entity), and advanced analysis (investigate_entity). There are no obvious gaps; agents can perform full workflows from initial screening to in-depth investigation.

Maintenance

ActivityInactive
ResponsivenessNo issues