{"_id":"@braynexservices/nigeria-mcp-nigsac-sanctions","_rev":"2-b42a20589f2129b126c3b61e3dcb1aab","name":"@braynexservices/nigeria-mcp-nigsac-sanctions","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@braynexservices/nigeria-mcp-nigsac-sanctions","version":"0.1.0","keywords":["mcp","model-context-protocol","nigeria","sanctions","sanctions-screening","compliance","nigsac","kyc"],"author":{"url":"Braynex Services Ltd — https://www.braynexservices.com","name":"Samuel Orie","email":"braynexservices@gmail.com"},"license":"MIT","_id":"@braynexservices/nigeria-mcp-nigsac-sanctions@0.1.0","maintainers":[{"name":"braynexservices","email":"braynexservices@gmail.com"}],"homepage":"https://www.braynexservices.com","bugs":{"url":"https://github.com/braynexservices/nigeria-mcp/issues"},"bin":{"nigeria-mcp-nigsac-sanctions":"dist/stdio.js"},"dist":{"shasum":"e7198aa0108ebd433b393ac465ae438737effb7b","tarball":"https://registry.npmjs.org/@braynexservices/nigeria-mcp-nigsac-sanctions/-/nigeria-mcp-nigsac-sanctions-0.1.0.tgz","fileCount":31,"integrity":"sha512-ZaVNCdSerfyeSv3WcpOwYkBvSw5QVO5dyOqJeiYni6UCHaddKCCl9wZ9WU4xlabMxf5ZlHUwj5TLwuRvpgJdCA==","signatures":[{"sig":"MEQCIHCx4eo2DuSJraML7rXxkJhdnpoi1EhvlQvL9bc82FC4AiBUHPLkgi+7YaEYP0LDri+dCp6+doTqYVgn0kTA53i6ug==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41013},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"a212543133ceacfdf5cbe48ba7be915222c9c004","mcpName":"io.github.Braynexservices/nigeria-nigsac-sanctions","private":false,"scripts":{"build":"tsc","smoke":"tsx scripts/smoke.ts","prepack":"tsc","smoke:live":"tsx scripts/live.ts","start:stdio":"tsx src/stdio.ts"},"_npmUser":{"name":"braynexservices","email":"braynexservices@gmail.com"},"repository":{"url":"git+https://github.com/braynexservices/nigeria-mcp.git","type":"git","directory":"lanes/nigsac-sanctions"},"_npmVersion":"11.6.1","description":"Screen a person or company name against Nigeria's official NIGSAC sanctions register as an MCP tool — a best-effort, diacritic-folded, transliteration-tolerant screening signal for human review. Live register, keyless.","directories":{},"displayName":"Nigeria NIGSAC Sanctions MCP","_nodeVersion":"24.11.0","dependencies":{"zod":"^3.25.76","@braynexservices/nigeria-mcp-core":"^0.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_npmOperationalInternal":{"tmp":"tmp/nigeria-mcp-nigsac-sanctions_0.1.0_1784437929820_0.22852040970509013","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@braynexservices/nigeria-mcp-nigsac-sanctions","displayName":"Nigeria NIGSAC Sanctions MCP","version":"0.1.1","description":"Screen a person or company name against Nigeria's official NIGSAC sanctions register as an MCP tool — a best-effort, diacritic-folded, transliteration-tolerant screening signal for human review. Live register, keyless.","homepage":"https://www.braynexservices.com","repository":{"type":"git","url":"git+https://github.com/braynexservices/nigeria-mcp.git","directory":"lanes/nigsac-sanctions"},"bugs":{"url":"https://github.com/braynexservices/nigeria-mcp/issues"},"keywords":["mcp","model-context-protocol","nigeria","sanctions","sanctions-screening","compliance","nigsac","kyc"],"private":false,"publishConfig":{"access":"public"},"type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"build":"tsc","prepack":"tsc","start:stdio":"tsx src/stdio.ts","smoke":"tsx scripts/smoke.ts","smoke:live":"tsx scripts/live.ts"},"dependencies":{"@braynexservices/nigeria-mcp-core":"^0.3.0","zod":"^3.25.76"},"devDependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"license":"MIT","author":{"name":"Samuel Orie","email":"braynexservices@gmail.com","url":"Braynex Services Ltd — https://www.braynexservices.com"},"engines":{"node":">=20"},"bin":{"nigeria-mcp-nigsac-sanctions":"dist/stdio.js"},"mcpName":"io.github.Braynexservices/nigeria-nigsac-sanctions","gitHead":"d90447b167e5d8821ca45aea6970f958fafae28e","_id":"@braynexservices/nigeria-mcp-nigsac-sanctions@0.1.1","_nodeVersion":"24.11.0","_npmVersion":"11.6.1","dist":{"integrity":"sha512-NNfGwT4mM7LrqoEKW/Ct6mRzFS9h1mX+5mmjcsEx3JDqmSTuUaJ0pF+bjaMoFw0+NiA1zQCK/6qJQyf03sb46w==","shasum":"1d00da6e6b41e641f7cd1ba0c8eabc3444e071ef","tarball":"https://registry.npmjs.org/@braynexservices/nigeria-mcp-nigsac-sanctions/-/nigeria-mcp-nigsac-sanctions-0.1.1.tgz","fileCount":31,"unpackedSize":41054,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIG5rbDF4xmqlBrjTX6Hx5S8P1qdHmTqKOpPRmAQF5zkyAiEAwCdO0805zdVYnJPRo/ZY+9lTx3a79N/kf46Jp/Kk3Wk="}]},"_npmUser":{"name":"braynexservices","email":"braynexservices@gmail.com"},"directories":{},"maintainers":[{"name":"braynexservices","email":"braynexservices@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nigeria-mcp-nigsac-sanctions_0.1.1_1784464138199_0.3568048106060544"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-19T05:12:09.734Z","modified":"2026-07-19T12:28:58.498Z","0.1.0":"2026-07-19T05:12:09.966Z","0.1.1":"2026-07-19T12:28:58.363Z"},"bugs":{"url":"https://github.com/braynexservices/nigeria-mcp/issues"},"author":{"name":"Samuel Orie","email":"braynexservices@gmail.com","url":"Braynex Services Ltd — https://www.braynexservices.com"},"license":"MIT","homepage":"https://www.braynexservices.com","keywords":["mcp","model-context-protocol","nigeria","sanctions","sanctions-screening","compliance","nigsac","kyc"],"repository":{"type":"git","url":"git+https://github.com/braynexservices/nigeria-mcp.git","directory":"lanes/nigsac-sanctions"},"description":"Screen a person or company name against Nigeria's official NIGSAC sanctions register as an MCP tool — a best-effort, diacritic-folded, transliteration-tolerant screening signal for human review. Live register, keyless.","maintainers":[{"name":"braynexservices","email":"braynexservices@gmail.com"}],"readme":"# Nigeria NIGSAC Sanctions MCP\n\n> Screen a person or company name against Nigeria's official sanctions register, exposed to AI agents as an MCP tool.\n\n**Status:** 🌐 **LIVE + keyless (no API key)**\n**Package:** `@braynexservices/nigeria-mcp-nigsac-sanctions` v0.1.0 · depends on `@braynexservices/nigeria-mcp-core`\n**Author:** Samuel Orie (Founder) · **Owner:** [Braynex Services Ltd](https://www.braynexservices.com) · **License:** [MIT](./LICENSE)\n**© 2026 Braynex Services Ltd** — MIT licensed (copyright retained; see the [`NOTICE`](./NOTICE)).\n\n> ⚠️ **Screening signal, not compliance clearance.** A `POTENTIAL_MATCH` is a prompt for human review; a `CLEAR` is not a legal determination. Read **[Scope & limitations](#scope--limitations)** before you rely on this for anything. Not a sole KYC/AML control.\n\n---\n\n## What it does\nScreens a person or company name against the **official NIGSAC (Nigeria Sanctions Committee) register** — the Nigerian designations of both individuals and entities, published under the Terrorism (Prevention and Prohibition) Act 2022. The list is **scraped live** from the NIGSAC portal (keyless), cached, and matched locally. Each screen returns `CLEAR` or `POTENTIAL_MATCH` with candidate names and 0-1 similarity scores. Public designation data — the listed names are published sanctions designations, not private PII; the query name is pass-through and never persisted.\n\nMatching is **best-effort and deliberately recall-leaning** — it over-flags so a human never misses a real designation. That means a `POTENTIAL_MATCH` is a *signal for review*, not proof of a hit, and a `CLEAR` covers the **Nigerian list only**.\n\n## Tool\n\n### `screen_sanctions`\n| Param | Required | Notes |\n|---|---|---|\n| `name` | ✓ | Person or company name to screen (3–256 chars) |\n\nReturns `status` (`CLEAR` \\| `POTENTIAL_MATCH`), `matches` (candidates, highest similarity first — each with `name`, `listType`, `similarity` 0–1), `listVersion` (snapshot fetch-date + entry count), plus `source` and `retrievedAt` provenance.\n\n**Example — a `CLEAR` result** (default live register):\n```jsonc\n// → screen_sanctions({ \"name\": \"Acceptance Test Person\" })\n\"\\\"Acceptance Test Person\\\" — CLEAR: no candidate matches on the NIGSAC Nigerian list (source: nigsac, list nigsac-2026-07-18-69). Not a legal clearance; covers the Nigerian list only.\"\n// structuredContent:\n// { query:\"Acceptance Test Person\", status:\"CLEAR\", matches:[],\n//   listVersion:\"nigsac-2026-07-18-69\", source:\"nigsac\", retrievedAt }\n```\n\n**Example — a `POTENTIAL_MATCH` result** (shown against the offline `mock` stub for a reproducible hit):\n```jsonc\n// → screen_sanctions({ \"name\": \"IBRAHIM TEST DOE\" })\n\"\\\"IBRAHIM TEST DOE\\\" — POTENTIAL_MATCH: IBRAHIM TEST DOE (100%) — human review required (source: mock, list mock-fixtures-2026-07)\"\n// structuredContent:\n// { query:\"IBRAHIM TEST DOE\", status:\"POTENTIAL_MATCH\",\n//   matches:[{ name:\"IBRAHIM TEST DOE\", listType:\"NIGSAC UNSC\", similarity:1 }],\n//   listVersion:\"mock-fixtures-2026-07\", source:\"mock\", retrievedAt }\n```\n\n> **`similarity`** is 0–1 (1 = exact normalized match). A partial score (e.g. a query that shares most tokens with a longer listed designation) still surfaces as a candidate — by design. The percentage is a matching confidence, **not** a probability that the subject is sanctioned.\n\n## Configuration — `SANCTIONS_PROVIDER`\n\n| Value | Behaviour |\n|---|---|\n| `nigsac` *(default)* | **Live** — fetches + parses the official NIGSAC register and screens against it. Keyless. **This is the default**; unlike other lanes, sanctions does not default to mock (a synthetic list would silently `CLEAR` every real name). |\n| `mock` | Offline synthetic stub — an explicit opt-in (2 fake entries, `IBRAHIM TEST DOE` / `ACME SHELL CORP LTD`) for dev/eval with zero network. Never real designations. |\n\nNo API key required.\n\n**`NIGSAC_LIST_URL`** *(optional)* — override the source. Point it at either an HTML list page (parsed like the default portal) **or** a founder-hosted JSON array of `{ name, listType }` (auto-detected by a leading `[`). Useful if the portal layout changes or you host a mirror.\n\n## Scope & limitations\n\n**Read this before relying on a result.** This lane is a screening aid, not a compliance product.\n\n- **It deliberately over-flags.** Matching is best-effort **fuzzy**: diacritic-**folded** (`Bàbátúndé` matches `BABATUNDE`), transliteration-**tolerant** (`Mohammed` ~ `Muhammad`), and **containment-scored** (a shorter query still scores high against a longer listed designation instead of being diluted). A false `POTENTIAL_MATCH` costs a human a moment; a false `CLEAR` misses a real designation — so the scorer leans to recall. **A `POTENTIAL_MATCH` is a signal for human review, NOT a legal determination or compliance clearance.**\n- **Nigerian list only.** Scope is the domestic NIGSAC register. A `CLEAR` means *\"not on the Nigerian list\"* — **not** *\"unsanctioned everywhere\"*. The **UN consolidated list is not screened here** (NIGSAC links it off-site; wiring it is a separate lane's job). Do not read a `CLEAR` as global.\n- **Fail-loud, never a false `CLEAR`.** The live adapter **refuses to screen** if the register parses to an implausibly small number of entries (below a plausibility floor — the real register is ~69 rows). A changed layout, error, or challenge page raises an actionable error instead of screening against a truncated list and clearing real names.\n- **Freshness is visible.** The list is cached with a TTL (re-fetched at most every ~6h; it changes rarely) and fetched with a 15s timeout + backoff-retry on transient failures. Every result carries a `listVersion` (fetch date + entry count, e.g. `nigsac-2026-07-18-69`) so callers can see exactly how fresh the snapshot is.\n- **NOT compliance-grade.** Do **not** use this as a sole KYC/AML control. It is one screening input among many — pair any hit with authoritative verification and human judgement.\n\n## Run it\n\n```bash\nnpm install && npm run build      # from repo root\n\nnpm run smoke      -w @braynexservices/nigeria-mcp-nigsac-sanctions   # offline (mock stub)\nnpm run smoke:live -w @braynexservices/nigeria-mcp-nigsac-sanctions   # live (real NIGSAC register)\n\nnpm run start:stdio -w @braynexservices/nigeria-mcp-nigsac-sanctions  # serve over stdio (live by default)\n```\n\n**MCP Inspector** (interactive GUI):\n```bash\nnpx @modelcontextprotocol/inspector node lanes/nigsac-sanctions/dist/stdio.js\n```\n\n**Claude Desktop / Code** — add to your MCP config (needs Node.js ≥ 20):\n```json\n{\n  \"mcpServers\": {\n    \"nigeria-nigsac-sanctions\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@braynexservices/nigeria-mcp-nigsac-sanctions\"]\n    }\n  }\n}\n```\nThe default is the **live register** — no `env` block is needed. To run fully offline against the synthetic stub instead, add `\"env\": { \"SANCTIONS_PROVIDER\": \"mock\" }`. Running from a clone: `\"command\": \"node\", \"args\": [\"/path/to/nigeria-mcp/lanes/nigsac-sanctions/dist/stdio.js\"]`. Then ask, e.g., *\"Screen 'Ada Umeh Ltd' against the Nigerian sanctions list.\"*\n\n## Verification\n`npm run verify` (repo root) → build + all lane smokes + eval. This lane: an offline end-to-end smoke (exact / fuzzy-containment / `CLEAR` paths vs the mock stub) plus `smoke:live` against the real NIGSAC register (verified live 2026-07-18: HTTP 200, two tables — individuals + entities — 69 entries; parse quality confirmed against real rows). The live adapter's plausibility floor and cache/retry behaviour are exercised in review.\n","readmeFilename":"README.md"}