Lokal
NPM · @LOKAL-ID/MCP
Indonesia-ready agents: NIK, phone, Rupiah, regions, postal codes, holidays, and PII masking.
Available components
Last scanned (15 hours ago)
Scores higher than 65% of npm servers
Category Security
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 0 of 1 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to lokal-id/lokal). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 0 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability66
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 2045 tokens (~127/item across 16 items; 16 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management20
- Stability observed for 6 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage80
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 41% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 16 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 17 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 22 Oct 26 +15
- Tool safety: pass → unverified ▼ security
- Stability: 0.17 → unverified ▼ security
- Malware scan: unverified → pass ▲ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- First check of Schema quality: unverified functional
- Package version: 0.4.1 → 0.5.0 functional
- 21 Oct 26 −14
- Malware scan: pass → unverified ▼ security
- Package version: 0.4.0 → 0.4.1 functional
- 19 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Oct 26 +26
- Malware scan: unverified → pass ▲ security
- Known CVEs: unverified → pass ▲ security
- Dependency health: unverified → 1.00 ▲ functional
- 17 Oct 26 −14
- Malware scan: pass → unverified ▼ security
- Known CVEs: pass → unverified ▼ security
- Provenance: fail → pass ▲ security
- The attested source repository moved: lokal-id/lokal security
- Schema quality: 1508 → 2045 ▼ functional
- Dependency health: 0.85 → unverified ▼ functional
- Tool coverage: 23% → 41% ▲ functional
- Package version: 0.2.2 → 0.4.0 functional
- Package version: 0.2.2 → 0.3.0 functional
- 16 Oct 26 67
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 22 Oct 2026 · Analysed npm/@lokal-id/mcp@0.5.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | lokal-id/lokal |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/lokal-id/lokal/.github/workflows/release.yml@refs/tags/v0.5.0 |
| Rekor log index | 3379400427 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha512:42a6b4de22a207ff8659ed1c4bfa697171de5fb5362fe859457cdf95581672d5b1eb70032bb6ee42374e66db4e821d663f04faba76f2da31e5fc51d7f |
Background: How many MCP packages publish verified provenance →
Dependencies 1 package
| Packages resolved | 1 |
|---|---|
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
anonymize_file Make a copy of data with realistic stand-ins (Kembaran) ~251
Copy SQL dumps, CSV, JSON, or log files with every piece of Indonesian personal data replaced by a realistic stand-in, for staging, seeders, tests, or sharing with a vendor: valid NIKs in the same district with the same gender and birth year, phone numbers on the same operator, names with the same casing, addresses in the same area, e-mail at example.com. The same value gets the same stand-in in every file of one call, so joins still work. Runs on the user's machine and returns only counts: you never see the data. Use it instead of reading production data, and when asked to copy production data to staging or build seeders from it.
| Name | Type | Req | Description |
|---|---|---|---|
| keep | array | – | Types to leave as they are, e.g. ["FINANCIAL"] for a credit simulation |
| keep_birth_date | boolean | – | Keep whole birth dates instead of only the year |
| output | string | yes | Output file, or a folder when there are several inputs |
| overwrite | boolean | – | – |
| paths | array | yes | Input files, relative to the project root |
| secret | string | – | The same secret gives the same stand-ins on every run |
No output schema declared.
No examples provided.
format_rupiah Format Rupiah ~62
Format an amount as Rupiah the Indonesian way (Rp1.500.000), short form (Rp1,5 jt), and spelled out in words (terbilang) for receipts and invoices.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number | yes | Amount in rupiah |
No output schema declared.
No examples provided.
list_holidays Indonesian public holidays ~55
Libur nasional and cuti bersama for a year, from the official SKB 3 Menteri. Only years with a published decree are available; other years return an error rather than a guess.
| Name | Type | Req | Description |
|---|---|---|---|
| year | integer | yes | – |
No output schema declared.
No examples provided.
list_wilayah List child regions ~73
List the direct children of a region code — the data behind cascading address dropdowns. No code returns the 38 provinces; "32" returns the kabupaten/kota in Jawa Barat, and so on down to kelurahan/desa (which include their kode pos).
| Name | Type | Req | Description |
|---|---|---|---|
| parent_code | string | – | – |
No output schema declared.
No examples provided.
lookup_kode_pos Look up kode pos ~76
Kode pos (postal codes) for Indonesian regions. Give kode_pos to find the kelurahan/desa that use it, or wilayah_code to list every kode pos inside a region (e.g. "32.76" Kota Depok).
| Name | Type | Req | Description |
|---|---|---|---|
| kode_pos | string | – | – |
| wilayah_code | string | – | – |
No output schema declared.
No examples provided.
parse_nik Parse NIK ~73
Validate an Indonesian NIK (16-digit national ID) by structure and decode it: province, regency, district (Kemendagri), birth date, gender. Cannot prove the NIK is registered at Dukcapil.
| Name | Type | Req | Description |
|---|---|---|---|
| nik | string | yes | 16-digit NIK; spaces and dots are ignored |
No output schema declared.
No examples provided.
parse_phone Parse Indonesian phone number ~70
Normalize an Indonesian phone number (08xx, +62, 62, landline with area code) to E.164, display format, WhatsApp form, and original operator (Telkomsel, Indosat, Tri, XL, Axis, Smartfren).
| Name | Type | Req | Description |
|---|---|---|---|
| phone | string | yes | – |
No output schema declared.
No examples provided.
parse_qris Read a QRIS payload ~89
Read and check a QRIS payload (the text inside an Indonesian QRIS payment code): static or dynamic, merchant name and city, NMID, merchant criteria (UMI, UKE, …), amount, tip, merchant accounts, and whether the CRC checksum is intact. Errors and warnings are in Indonesian.
| Name | Type | Req | Description |
|---|---|---|---|
| payload | string | yes | The QRIS text, starting with 000201 |
No output schema declared.
No examples provided.
parse_rupiah Parse Rupiah from text ~81
Turn how Indonesians write money into a number: "Rp 25.000", "1,5jt", "2jtan", "50rb-an", "goceng", "2 ceban", "sejuta setengah", "dua ratus ribu". "m" means miliar.
| Name | Type | Req | Description |
|---|---|---|---|
| text | string | yes | – |
No output schema declared.
No examples provided.
read_file_masked Read a file with personal data masked ~146
Read a text, CSV, JSON, log, .xlsx, .docx, or text-based PDF file with Indonesian personal data replaced by stable placeholders ([NIK_1], [PHONE_2], [RELIGION_1] …). The same value always gets the same placeholder in this session, so joins, counts, grouping and deduplication still work. Real values never leave the user's machine. Spreadsheets come back as CSV, one block per sheet; Word documents as their text plus each table as CSV; PDFs one block per page.
| Name | Type | Req | Description |
|---|---|---|---|
| max_lines | integer | – | – |
| path | string | yes | – |
| start_line | integer | – | – |
No output schema declared.
No examples provided.
scan_pii Scan files for Indonesian personal data ~197
Scan a file or directory (text, CSV, JSON, logs, SQL, .xlsx, .docx, text-based PDF; up to 100 MB each) for personal data — identifiers (NIK, KK, NPWP, phone, email, bank account, BPJS, passport, SIM, NIP, card, plate, IP, coordinates), names, addresses, birth dates, and UU PDP categories (religion, marital status, gender, nationality, health, finances, criminal records, biometrics) — without revealing it: findings show only partially masked values. Also lists files and pages it could not scan (scanned or encrypted PDFs, .xls, .doc, images, archives). Use before reading data files and before committing fixtures or seeders.
| Name | Type | Req | Description |
|---|---|---|---|
| min_confidence | string | – | – |
| path | string | – | File or directory, relative to the project root |
| types | array | – | – |
No output schema declared.
No examples provided.
search_wilayah Search Indonesian regions ~129
Find official Kemendagri regions by name (provinsi, kabupaten/kota, kecamatan, kelurahan/desa) with their codes. Use for address forms, normalizing user-typed locations, and seed data instead of inventing region names.
| Name | Type | Req | Description |
|---|---|---|---|
| level | – | – | 1 provinsi, 2 kabupaten/kota, 3 kecamatan, 4 kelurahan/desa |
| limit | integer | – | – |
| query | string | yes | – |
| within | string | – | Only search inside this region code, e.g. "32" for Jawa Barat |
No output schema declared.
No examples provided.
set_qris_amount Make a dynamic QRIS with an amount ~126
Turn a QRIS payload into a dynamic one for an amount in Rupiah, optionally with a fixed or percentage fee, and recompute the CRC. The merchant account is unchanged. Returns the new payload, ready to render as a QR code.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number|string | yes | Rupiah, at most 2 decimals, e.g. 25000 |
| fee_fixed | number|string | – | A fixed fee in Rupiah on top of the amount |
| fee_percent | number|string | – | A percentage fee on top of the amount |
| payload | string | yes | – |
No output schema declared.
No examples provided.
validate_npwp Validate NPWP ~85
Validate the format of an Indonesian tax ID (NPWP): legacy 15-digit (XX.XXX.XXX.X-XXX.XXX), 16-digit, or NIK used as NPWP for individuals. Returns the 16-digit form DJP uses today. Format only: it does not check the DJP check digit or registration.
| Name | Type | Req | Description |
|---|---|---|---|
| npwp | string | yes | – |
No output schema declared.
No examples provided.
working_days Indonesian working days ~114
Working-day math with Indonesian holidays: is a date a working day, the date N working days after a date (SLA, delivery estimates), or the number of working days between two dates (inclusive). Cuti bersama counts as a day off unless cuti_bersama is false (private companies may work on them).
| Name | Type | Req | Description |
|---|---|---|---|
| add | integer | – | Working days to add (negative to go back) |
| cuti_bersama | boolean | – | – |
| from | string | yes | – |
| to | string | – | – |
No output schema declared.
No examples provided.
write_file_unmasked Write a file, restoring masked values ~88
Write content to a file after replacing Samaran placeholders ([NIK_1], [PHONE_2] …) from this session with the real values, locally. Use this to produce output (cleaned CSV, reports, migrations) from data you read with read_file_masked.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | yes | – |
| overwrite | boolean | – | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
How do I install the Lokal MCP server?
Lokal runs locally as an npm package, launched with npx -y @lokal-id/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @lokal-id/mcp
claude mcp add lokal-id-lokal -- npx -y @lokal-id/mcp
What is the Lokal MCP server?
Lokal is an MCP server listed in the public MCP registry as io.github.lokal-id/lokal. Indonesia-ready agents: NIK, phone, Rupiah, regions, postal codes, holidays, and PII masking. This page covers its npm package (@lokal-id/mcp).
Is the Lokal MCP server safe to use?
Lokal scores 81 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 22 October 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Lokal MCP server expose?
Lokal exposes 16 tools: parse_nik, validate_npwp, parse_qris, set_qris_amount, parse_phone, and 11 more. Their descriptions and schemas cost roughly 1,715 tokens of context every time the server is loaded.
Is the Lokal MCP server still maintained?
Lokal is still listed as active in the MCP registry. We last reached this channel on 22 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Lokal MCP server under?
Lokal declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.