ng-postcode-mcp
MCP server for Nigeria's National Digital Alphanumeric Postcode System (NDAPS), the building-level postcode NIPOST launched in October 2026. It lets AI assistants validate postcodes offline, look them up, autocomplete them and find them by location through the postcode.gov.ng API, and resolve described addresses to postcodes.
Built on the ng-postcode and ng-address-resolver libraries.
Tools
| Tool | What it does | Needs a key | Cost |
|---|---|---|---|
validate_postcode |
Checks structure offline; returns canonical forms, segments and a suggested fix for look-alike characters | No | Free |
lookup_postcode |
Confirms a code is assigned; level 2 adds the address, level 3 building use | Yes | Level 1 free, 2+ uses credits |
autocomplete_postcode |
Suggests the next segment of a partly typed code | Yes | Free tier |
find_postcode_at_location |
Returns the postcode of the nearest building to a coordinate | Yes | Free tier |
resolve_address |
Turns a described address ("back of Fabian Hotel, off NTA Road") or a location pin into a postcode, only as precisely as the evidence allows | Yes, plus a geocoder for text | Free tier |
All tools are read-only. Errors come back as messages the model can act on, such as a missing key or an exhausted credit balance.
How resolve_address answers
The assistant reads the address and passes its landmarks and map searches to the tool; the server makes no model calls of its own. The answer is never more precise than its evidence:
| Evidence | Answer |
|---|---|
| A postcode written in the address, or a location pin on a building | Building code |
| A landmark the address is | Building code, medium confidence |
| A building near a landmark ("behind", "opposite") | Area code, plus a question for the user |
| A street only | District code, low confidence |
| A town only, or nothing found | No code, plus a question |
Text alone rarely identifies a building, so ask users for a location pin when the exact building matters. This tool is pre-release: its NIPOST steps have not yet been run against the live API.
Install
Requires uv. Get an API key from the NIPOST developer dashboard; validate_postcode works without one.
Claude Code
claude mcp add ng-postcode -e NG_POSTCODE_API_KEY=nipost_live_... -- uvx ng-postcode-mcp
Claude Desktop, Cursor and other clients that use an mcpServers config:
{
"mcpServers": {
"ng-postcode": {
"command": "uvx",
"args": ["ng-postcode-mcp"],
"env": { "NG_POSTCODE_API_KEY": "nipost_live_..." }
}
}
}
Configuration
| Variable | Default | Purpose |
|---|---|---|
NG_POSTCODE_API_KEY |
none | NIPOST API key. Read from the environment only; never passed through tools. |
NG_POSTCODE_MAX_LEVEL |
1 |
Highest lookup level tools may request. Levels 2+ consume credits, so raise it deliberately. |
NG_POSTCODE_BASE_URL |
https://api.postcode.gov.ng |
Alternative API host, such as a staging stack. |
NG_GEOCODER_URL |
none | A Nominatim server resolve_address uses to place described addresses. Without it, only typed postcodes and location pins resolve. |
NG_GEOCODER_CONTACT |
none | A URL or email sent in the User-Agent. Required for the public Nominatim. |
The public Nominatim at https://nominatim.openstreetmap.org allows light personal use only; a service whose main job is geocoding must run its own instance. Map data © OpenStreetMap contributors.
Safety
- Lookups default to level 1, which is free. A model cannot spend credits unless you raise
NG_POSTCODE_MAX_LEVEL. - A mistyped code is never corrected and sent to the API silently. The server returns the suggestion and asks the model to confirm it with the user.
- Levels 2 and up return house addresses. Treat them as personal data under the Nigeria Data Protection Act.
resolve_addresssends the search strings to the geocoder you configure. With a third-party geocoder, that shares address text with it.
License
MIT
Metadata
Release files for ng-postcode-mcp 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ng_postcode_mcp-0.2.0.tar.gz | 13.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ng_postcode_mcp-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 23.8 kB
Release files / ng_postcode_mcp-0.2.0.tar.gz
| Download URL | ng_postcode_mcp-0.2.0.tar.gz |
|---|---|
| Size | 13.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
19e3616ce0572cfb350e317e778f12d126848e27297bf0640cf9094fc8af2c16
|
|
BLAKE2b-256 checksum How to use checksums |
6ba2e9ba09c52a237c23a7090f24f4d4c8f2e62a9cf3909352544114b946e6fb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.
Transparency logRelease files / ng_postcode_mcp-0.2.0-py3-none-any.whl
| Download URL | ng_postcode_mcp-0.2.0-py3-none-any.whl |
|---|---|
| Size | 10.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5ece495a3978a9b2b07141fab0feb67e56472e23d6ff763b028d5be004f72ff9
|
|
BLAKE2b-256 checksum How to use checksums |
e18d436398de4b9481ba02324833b940f9763f44a41e020e03bc4bfe47785135
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.
Transparency log