# Lokal (npm · @lokal-id/mcp)

Indonesia-ready agents: NIK, phone, Rupiah, regions, postal codes, holidays, and PII masking.

- Trust score: 81/100 (high trust)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-22

## Components

- npm · `@lokal-id/mcp`: 81/100 (this document), [markdown](https://verifymcp.io/servers/lokal-id-lokal/lokal-id-mcp.md), [page](https://verifymcp.io/servers/lokal-id-lokal/lokal-id-mcp)

## Channel facts

- Registry: `npm`
- Package: `@lokal-id/mcp`
- Version: `0.5.0`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-22.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 0 of 1 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to lokal-id/lokal).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 0 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 66/100
  - AI-judged instruction clarity (good).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 20/100
  - Stability observed for 6 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 80/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 41% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 16 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 17 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### 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.

### Claude

```bash
claude mcp add lokal-id-lokal -- npx -y @lokal-id/mcp
```

### Cursor

```json
{
  "mcpServers": {
    "lokal-id-lokal": {
      "command": "npx",
      "args": [
        "-y",
        "@lokal-id/mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "lokal-id-lokal": {
      "command": "npx",
      "args": [
        "-y",
        "@lokal-id/mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add lokal-id-lokal -- npx -y @lokal-id/mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "lokal-id-lokal": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@lokal-id/mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add lokal-id-lokal --command npx --arg -y --arg @lokal-id/mcp
```

### Hermes

```yaml
mcp_servers:
  lokal-id-lokal:
    command: "npx"
    args: ["-y", "@lokal-id/mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "lokal-id-lokal": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@lokal-id/mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add lokal-id-lokal -t stdio -c npx -a -y @lokal-id/mcp
```

### Other

```json
{
  "mcpServers": {
    "lokal-id-lokal": {
      "command": "npx",
      "args": [
        "-y",
        "@lokal-id/mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-22 (score 81, +15)

- [security regression] Tool safety: pass → unverified
- [security regression] Stability: 0.17 → unverified
- [security improvement] Malware scan: unverified → pass
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified
- [functional] Package version: 0.4.1 → 0.5.0

### 2026-10-21 (score 66, −14)

- [security regression] Malware scan: pass → unverified
- [functional] Package version: 0.4.0 → 0.4.1

### 2026-10-19 (score 80, +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.

### 2026-10-18 (score 79, +26)

- [security improvement] Malware scan: unverified → pass
- [security improvement] Known CVEs: unverified → pass
- [functional improvement] Dependency health: unverified → 1.00

### 2026-10-17 (score 53, −14)

- [security regression] Malware scan: pass → unverified
- [security regression] Known CVEs: pass → unverified
- [security improvement] Provenance: fail → pass
- [security] The attested source repository moved: lokal-id/lokal
- [functional regression] Schema quality: 1508 → 2045
- [functional regression] Dependency health: 0.85 → unverified
- [functional improvement] Tool coverage: 23% → 41%
- [functional] Package version: 0.2.2 → 0.4.0
- [functional] Package version: 0.2.2 → 0.3.0

### 2026-10-16 (score 67)

First indexed and scored.

## MCP tools (16)

### `parse_nik` (~73 tokens)

Parse NIK

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.

Input parameters:

- `nik` (string, required): 16-digit NIK; spaces and dots are ignored

### `validate_npwp` (~85 tokens)

Validate NPWP

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.

Input parameters:

- `npwp` (string, required)

### `parse_qris` (~89 tokens)

Read a QRIS payload

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.

Input parameters:

- `payload` (string, required): The QRIS text, starting with 000201

### `set_qris_amount` (~126 tokens)

Make a dynamic QRIS with an amount

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.

Input parameters:

- `amount` (number|string, required): 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, required)

### `parse_phone` (~70 tokens)

Parse Indonesian phone number

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).

Input parameters:

- `phone` (string, required)

### `format_rupiah` (~62 tokens)

Format Rupiah

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.

Input parameters:

- `amount` (number, required): Amount in rupiah

### `parse_rupiah` (~81 tokens)

Parse Rupiah from text

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.

Input parameters:

- `text` (string, required)

### `search_wilayah` (~129 tokens)

Search Indonesian regions

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.

Input parameters:

- `level`: 1 provinsi, 2 kabupaten/kota, 3 kecamatan, 4 kelurahan/desa
- `limit` (integer)
- `query` (string, required)
- `within` (string): Only search inside this region code, e.g. "32" for Jawa Barat

### `list_wilayah` (~73 tokens)

List child regions

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).

Input parameters:

- `parent_code` (string)

### `lookup_kode_pos` (~76 tokens)

Look up kode pos

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).

Input parameters:

- `kode_pos` (string)
- `wilayah_code` (string)

### `list_holidays` (~55 tokens)

Indonesian public holidays

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.

Input parameters:

- `year` (integer, required)

### `working_days` (~114 tokens)

Indonesian working days

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).

Input parameters:

- `add` (integer): Working days to add (negative to go back)
- `cuti_bersama` (boolean)
- `from` (string, required)
- `to` (string)

### `scan_pii` (~197 tokens)

Scan files for Indonesian personal data

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.

Input parameters:

- `min_confidence` (string)
- `path` (string): File or directory, relative to the project root
- `types` (array)

### `read_file_masked` (~146 tokens)

Read a file with personal data masked

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.

Input parameters:

- `max_lines` (integer)
- `path` (string, required)
- `start_line` (integer)

### `write_file_unmasked` (~88 tokens)

Write a file, restoring masked values

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.

Input parameters:

- `content` (string, required)
- `overwrite` (boolean)
- `path` (string, required)

### `anonymize_file` (~251 tokens)

Make a copy of data with realistic stand-ins (Kembaran)

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.

Input parameters:

- `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, required): Output file, or a folder when there are several inputs
- `overwrite` (boolean)
- `paths` (array, required): Input files, relative to the project root
- `secret` (string): The same secret gives the same stand-ins on every run

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/lokal-id-lokal/lokal-id-mcp#diagnostics

## Score history

- 2026-10-22: 81
- 2026-10-21: 66
- 2026-10-20: 80
- 2026-10-19: 80
- 2026-10-18: 79
- 2026-10-17: 53
- 2026-10-16: 67

## Common questions

### 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.

## Links

- npm package: https://www.npmjs.com/package/@lokal-id/mcp
- Socket report: https://socket.dev/npm/package/@lokal-id/mcp
- Repository: https://github.com/lokal-id/lokal
- Changelog RSS feed: https://verifymcp.io/servers/lokal-id-lokal/lokal-id-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/lokal-id-lokal/lokal-id-mcp.json
- HTML version of this page: https://verifymcp.io/servers/lokal-id-lokal/lokal-id-mcp
