Skip to main content

kbbi-mcp

CI PyPI Python License Install in VS Code Install in Cursor

An MCP server that lets AI assistants look up Indonesian words in KBBI (Kamus Besar Bahasa Indonesia), the official Indonesian dictionary. It returns structured entries (homographs, pronunciation, root words, word classes, definitions, and examples) so the assistant can explain, translate, or quote them for you.

This is an unofficial client; see Disclaimer.

Example prompts

  • What does “gemas” mean according to KBBI?

  • Apa arti kata “mempunyai”? Apa kata dasarnya?

  • Explain “layarnya tidak makan” using KBBI.

Getting started

The server runs locally over stdio with uv’s uvx; no API key or account is needed. Most clients accept this standard config:

{
    "mcpServers": {
        "kbbi": {
            "command": "uvx",
            "args": ["kbbi-mcp"]
        }
    }
}

Claude Code

claude mcp add kbbi -- uvx kbbi-mcp

Codex CLI

codex mcp add kbbi -- uvx kbbi-mcp

Gemini CLI

gemini mcp add kbbi uvx kbbi-mcp

VS Code

Click the Install in VS Code badge at the top, or run:

code --add-mcp '{"name":"kbbi","command":"uvx","args":["kbbi-mcp"]}'

Cursor

Click the Install in Cursor badge at the top, or add the standard config to ~/.cursor/mcp.json (or .cursor/mcp.json in a project).

Claude Desktop

Open Settings → Developer → Edit Config and add the standard config to claude_desktop_config.json:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Other clients

Use the standard config above. Without uv, install the package with pip install kbbi-mcp and use kbbi-mcp (or python -m kbbi_mcp) as the command.

Tool: kbbi_lookup

Input

  • query (string): a word or phrase

Example tool arguments:

{
    "query": "makan"
}

Output

Returns a JSON object:

  • found (bool): whether entries is non-empty

  • query (string): the trimmed query

  • url (string): the KBBI page that was read

  • entries (list): one item per headword; homographs such as makan¹ and makan² are separate entries

  • suggestions (list of strings): similar headwords when nothing was found, if the page lists any (usually empty; see Limitations)

Each entry has:

  • headword (string): syllable dots removed (ma.kan → makan)

  • homograph (int | null): the superscript number, if any

  • pronunciation (string | null): e.g. /gêmas/

  • root_words (list of strings): e.g. ["punya"] for mempunyai

  • senses (list), in page order, each with:

    • labels: {code, name, description} for word classes (v, n, …) and usage labels (ki, Tas, …)

    • gloss (string): the definition text

    • examples: {text, meaning}; -- or ~ in text stands for the headword, and meaning (string | null) explains idiomatic examples

Every key is always present (null or an empty list when absent), so the output shape is stable.

An empty query or a failed lookup (e.g. KBBI unreachable) is reported as an MCP tool error (isError: true) with a message, not as a JSON payload.

Example tool output:

{
    "found": true,
    "query": "gemas",
    "url": "https://kbbi.kemendikdasmen.go.id/entri/gemas",
    "entries": [
        {
            "headword": "gemas",
            "homograph": null,
            "pronunciation": "/gêmas/",
            "root_words": [],
            "senses": [
                {
                    "labels": [
                        {
                            "code": "a",
                            "name": "Adjektiva",
                            "description": "kata yang menjelaskan nomina atau pronomina"
                        }
                    ],
                    "gloss": "sangat jengkel (marah) dalam hati",
                    "examples": [
                        {
                            "text": "saya sangat -- pada anak itu karena selalu mengotori lantai",
                            "meaning": null
                        }
                    ]
                },
                {
                    "labels": [
                        {
                            "code": "a",
                            "name": "Adjektiva",
                            "description": "kata yang menjelaskan nomina atau pronomina"
                        }
                    ],
                    "gloss": "sangat suka (cinta) bercampur jengkel; jengkel-jengkel cinta",
                    "examples": [
                        {
                            "text": "-- aku melihat anak ini",
                            "meaning": null
                        }
                    ]
                }
            ]
        }
    ],
    "suggestions": []
}

Resource: kbbi://{query}

This server also exposes the same payload as a read-only MCP resource (application/json).

  • kbbi://makan

For low-level debugging, a client would read it using resources/read with {"uri": "kbbi://makan"}.

Configuration

Optional environment variables:

  • KBBI_TIMEOUT_SECONDS (default: 10.0): timeout for each request to KBBI

  • KBBI_LOG_LEVEL (default: INFO): level of the server’s logs, written to stderr

  • KBBI_BASE_URL (default: https://kbbi.kemendikdasmen.go.id): the KBBI site to query

For example, with Claude Code: claude mcp add kbbi -e KBBI_TIMEOUT_SECONDS=20 -- uvx kbbi-mcp. In the standard config, add an "env": {"KBBI_TIMEOUT_SECONDS": "20"} object next to "args".

Limitations

  • Lookups are anonymous. KBBI shows etymology, related entries, and suggestions for missing words only to signed-in users, so they are not returned (suggestions is usually empty).

  • Each lookup fetches https://kbbi.kemendikdasmen.go.id/entri/{query}. KBBI limits anonymous searches, so avoid rapid bulk lookups. Results are cached in memory while the server runs.

  • The result depends on KBBI’s page markup; if KBBI changes it, parsing may break until this package is updated.

Debugging

Use the MCP Inspector:

npx @modelcontextprotocol/inspector uvx kbbi-mcp

Development

With uv installed, run the server over stdio from a checkout:

uv run kbbi-mcp

To point an MCP client at the checkout, use uv with --directory (an absolute path to your clone):

{
    "mcpServers": {
        "kbbi-dev": {
            "command": "uv",
            "args": ["--directory", "/path/to/kbbi-mcp", "run", "kbbi-mcp"]
        }
    }
}

Checks (see AGENTS.md):

uv sync --frozen --group dev
uv run ruff format .
uv run ruff check .
uv run ty check
uv run pytest

Tests use saved KBBI pages in tests/fixtures and make no network requests. Set KBBI_MCP_RUN_NETWORK_TESTS=1 to also run a live smoke test.

Disclaimer

This project is unofficial and is not affiliated with or endorsed by the Language Development and Cultivation Agency (Badan Bahasa) or KBBI Daring. Dictionary content belongs to its copyright holders; see KBBI’s legal notice. This server is meant for personal, non-commercial lookups. You are responsible for how you use the results.

License

BlueOak-1.0.0.

Metadata

Release files for kbbi-mcp 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for kbbi-mcp 0.2.1
File Size Uploaded Provenance
kbbi_mcp-0.2.1.tar.gz 12.1 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for kbbi-mcp 0.2.1
File Interpreter ABI Platform
kbbi_mcp-0.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 26.1 kB

Release files / kbbi_mcp-0.2.1.tar.gz

Download URL kbbi_mcp-0.2.1.tar.gz
Size 12.1 kB
Tags Source
SHA-256 checksum
How to use checksums
910bf8e265c6a6061188837cfa17e6024a90953561ea51bda302a5c7fe6076f1
BLAKE2b-256 checksum
How to use checksums
2494e5a636a955d53908c2aba6b8326349585722a1458026e66df31665dae5af
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.20 {"installer":{"name":"uv","version":"0.12.20","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / kbbi_mcp-0.2.1-py3-none-any.whl

Download URL kbbi_mcp-0.2.1-py3-none-any.whl
Size 14.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
75530c372a2fbf8097653264321b618a4893f725c98a1e7c0849baf02dbdec1c
BLAKE2b-256 checksum
How to use checksums
4b913bf3ef65b7e909b131afae3afccfcdab44bee74c38cfbad135f35233f4e3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.20 {"installer":{"name":"uv","version":"0.12.20","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for kbbi-mcp 0.2.1

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page