Atlas / MCP servers / adeniyikayodee / ng-postcode

ng-postcodeSAFE

mcp/adeniyikayodee/ng-postcode

Rust, Python, JavaScript, and Java libraries and MCP servers for Nigeria's NIPOST digital postcode (NDAPS): offline validation, lookup, and reverse geocoding.

Verdict
SAFE
Grade
B
Trust score
83 /100
Exposed tools
—
Transport
stdio · streamable-http
License
MIT
Stars
4
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://github.com/Adeniyikayodee/ng-postcode/actions/workflows/ci.yml) [](https://crates.io/crates/ng-postcode) [](https://pypi.org/project/ng-postcode/) [](https://pypi.org/project/ng-postcode-mcp/) [](https://www.npmjs.com/package/ng-postcode-js) [](https://www.npmjs.com/package/ng-postcode-mcp)

Developer tools for Nigeria's National Digital Alphanumeric Postcode System (NDAPS), the building-level postcode NIPOST launched in October 2026: libraries for Rust, Python, JavaScript, and Java, MCP servers for AI assistants on PyPI and npm, and a resolver that turns described addresses into postcodes.

A postcode has 11 characters in five segments, written EK-01-A03-FK-01: state, LGA, district, area and building unit.

Packages

Read from source at commit 5ec38d0edb43OBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (pypi)
claude mcp add ng-postcode-mcp --env NG_POSTCODE_API_KEY=${NG_POSTCODE_API_KEY} --env NG_POSTCODE_API_KEY=${NG_POSTCODE_API_KEY} -- uvx ng-postcode-mcp==0.6.0
claude-code (npm)
claude mcp add ng-postcode-mcp --env NG_POSTCODE_API_KEY=${NG_POSTCODE_API_KEY} --env NG_POSTCODE_API_KEY=${NG_POSTCODE_API_KEY} -- npx -y [email protected]
03

Trust audit

SAFEgrade B · trust 83/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
none-observed
Network
declared (5 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
found

Findings (18)

MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
mcp/tests/test_tools.py:226
secret = "nipost_test_never_echo_me"
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
python/tests/test_postcode.py:46
assert eval(repr(code)) == code
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
python/tests/test_readme.py:30
exec(compile(example, str(README), "exec"), {})
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
python/tests/test_readme.py:39
exec(compile(re.findall(r"```python\n(.*?)```", page, re.DOTALL)[0], str(GROUPING), "exec"), {})
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
js/packages/ng-postcode-js/test/spec.test.ts:31
JSON.parse(readFileSync(new URL(`../../../../spec/${name}.json`, import.meta.url), "utf8"));
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
js/packages/ng-postcode-mcp/test/server.test.ts:48
const shared = new URL("../../../../spec/mcp.json", import.meta.url);
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
js/packages/ng-postcode-mcp/test/server.test.ts:180
const environments = new URL("../../../../spec/mcp-env.json", import.meta.url);
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
js/packages/ng-postcode-mcp/test/server.test.ts:245
const calls = new URL("../../../../spec/mcp-calls.json", import.meta.url);
LOWNetwork egress · net.env_exfil · CWE-200, CWE-319
mcp/tests/test_http.py:40
os.environ.items() ... httpx.
Why it matters. reads secrets in the same file that sends data out
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.github/workflows/ci.yml:130
-DcentralBaseUrl=http://127.0.0.1:9 deploy > /dev/null 2>&1 || true
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/llms-full.txt:792
NG_POSTCODE_TRANSPORT=http uvx ng-postcode-mcp        # http://127.0.0.1:8000/mcp
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
java/api/src/test/java/io/github/adeniyikayodee/ngpostcode/api/ClientTest.java:44
String base = "http://127.0.0.1:" + server.getAddress().getPort();
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
java/api/src/test/java/io/github/adeniyikayodee/ngpostcode/api/ClientTest.java:125
String base = "http://127.0.0.1:" + server.getAddress().getPort();
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
java/api/src/test/java/io/github/adeniyikayodee/ngpostcode/api/ClientTest.java:137
String base = "http://127.0.0.1:" + server.getAddress().getPort();
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
python/tests/test_convert.py:38
"id,pc\n1,ek 01 a03 fk 01\n2,EK-O1-A03-FK-01\n3,360001\n4,\n", encoding="utf-8"
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
js/package.json
@biomejs/biome, @types/node, typescript, vitest
Why it matters. 4 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
js/packages/ng-postcode-mcp/package.json
@modelcontextprotocol/server, ng-postcode-js, @modelcontextprotocol/client
Why it matters. 3 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWInventory / provenance · mcp.no_tools_extracted · CWE-1104
mcp/server.json
Why it matters. the tool list is enumerated at runtime by tools/list, not declared in source
Fix. the page says so rather than showing an empty table

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 5ec38d0edb43full audit observations/trust-audit/mcp-server/adeniyikayodee__ng-postcode.json · Report an issue / request a re-scan
04

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-115ec38d0edb43SAFEB83first audit
05

Questions

What is the ng-postcode MCP server?

Rust, Python, JavaScript, and Java libraries and MCP servers for Nigeria's NIPOST digital postcode (NDAPS): offline validation, lookup, and reverse geocoding.

Is ng-postcode safe to connect to an agent?

The audit found nothing in the source that contradicts what it says it does, and graded it B (83/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B.

What credentials does ng-postcode need?

It reads NG_POSTCODE_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does ng-postcode run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as ng-postcode-smithery-publish at 0.6.0.

How current is this page?

The grade is for one exact copy of the source (5ec38d0edb43), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement