kbbi-mcp
An MCP server for querying KBBI (Kamus Besar Bahasa Indonesia / KBBI Daring).
Python: 3.13+
This project exposes a single, stable JSON tool output so LLM clients can decide how to format, translate, or summarize results.
Relationship to KBBI Daring
This project is unofficial and is not affiliated with or endorsed by the official KBBI Daring service.
Features
MCP tool: kbbi_lookup(query: str)
MCP resource: kbbi://{query} (same payload as kbbi_lookup)
No login/auth flow required
Uses official KBBI VI Daring by default
Configure in an MCP client (JSON)
Most MCP clients (including Claude Desktop) use a JSON config with a top-level mcpServers object. This mcpServers format is an emergent standard across the MCP ecosystem (see: https://gofastmcp.com/integrations/mcp-json-configuration.md).
mcpServers-based clients (Claude Desktop / Cursor / Windsurf)
This matches the convention used by many Python MCP servers.
Where to put it:
Claude Desktop: ~/.claude/claude_desktop_config.json
Cursor: .cursor/mcp.json (project) or ~/.cursor/mcp.json (global)
Windsurf: ~/.codeium/windsurf/mcp_config.json
{
"mcpServers": {
"kbbi": {
"command": "uvx",
"args": ["kbbi-mcp"]
}
}
}
Note: this example uses uvx (part of uv) to run the server. Install uv here: https://docs.astral.sh/uv/getting-started/installation/
If you don’t want to depend on uv, install kbbi-mcp into an environment and point your client to that environment’s executable. For example:
Use the console script (recommended when available): kbbi-mcp
Or run the module: python -m kbbi_mcp
The server performs direct lookups to the official KBBI VI Daring site.
Local development (run from this repo)
You’ll need uv installed: https://docs.astral.sh/uv/getting-started/installation/
To run the server over stdio directly from this checkout:
uv run kbbi-mcp
To point an MCP client at this checkout, use an mcpServers entry like this (replace the path with the absolute path of your clone):
{
"mcpServers": {
"kbbi-dev": {
"command": "uv",
"args": ["--directory", "/path/to/kbbi-mcp", "run", "kbbi-mcp"]
}
}
}
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, only when nothing was found
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"}.
Data source
Lookup behavior:
Official source: https://kbbi.kemendikdasmen.go.id/entri/{query}
Optional environment variables:
KBBI_BASE_URL (default: https://kbbi.kemendikdasmen.go.id)
KBBI_TIMEOUT_SECONDS (default: 10.0)
KBBI_LOG_LEVEL (default: INFO): level of the server’s logs, written to stderr
Metadata
Release files for kbbi-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 | Provenance | |
|---|---|---|---|---|
| kbbi_mcp-0.2.0.tar.gz | 10.9 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| kbbi_mcp-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 23.8 kB
Release files / kbbi_mcp-0.2.0.tar.gz
| Download URL | kbbi_mcp-0.2.0.tar.gz |
|---|---|
| Size | 10.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fe54995bc5ae801773f59ec27e03ea734f64b0c0470fe2f3dd9dd5d6e3f97e4a
|
|
BLAKE2b-256 checksum How to use checksums |
f73278ab6ade85d822db53738d173735a75117f0f89c569a0ab161332b7621ef
|
| 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.0-py3-none-any.whl
| Download URL | kbbi_mcp-0.2.0-py3-none-any.whl |
|---|---|
| Size | 12.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1c3830c8b62484b02c8154703e4d4814179432ba628814b5f7a4818660d4b999
|
|
BLAKE2b-256 checksum How to use checksums |
d7c591f53b903c1b590d3589e4e538836005d3a107a84be5a5c71dc27013910e
|
| 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.0
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.