{
  "markdown": "<div align=\"center\">\n\n# CodeCraft\n\n**A validation and data-lookup MCP server for Minecraft Bedrock.**\n\nYou bring the model. CodeCraft does not generate anything — it measures\nwhether what was generated is actually going to work.\n\n[![data](https://github.com/TanerTalas/codecraft/actions/workflows/data.yml/badge.svg)](https://github.com/TanerTalas/codecraft/actions/workflows/data.yml)\n[![license](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)\n[![MCP](https://img.shields.io/badge/MCP-9%20read--only%20tools-6f42c1.svg)](docs/MCP.md)\n[![Bedrock](https://img.shields.io/badge/Bedrock-1.26.40.5-3ba55d.svg)](data/1.26.40.5/index.json)\n\n**[Usage site](https://codecraft-ashy-seven.vercel.app/)** · setup, tool\nreference, and where validation ends\n\n</div>\n\n---\n\n## Why it exists\n\nIn Bedrock, **a field name recalled slightly wrong produces output that\nsilently does not work.** No error message, no red line. Everything looks fine\nuntil the pack is loaded into the game.\n\nA real example — both lines pass the schema, one of them never loads:\n\n```diff\n  \"modules\": [\n-   { \"type\": \"javascript\", \"entry\": \"scripts/main.js\" }\n+   { \"type\": \"script\", \"language\": \"javascript\", \"entry\": \"scripts/main.js\" }\n  ]\n```\n\nWith the top line the pack **did not appear in the behavior pack list at all.**\nIt did not even raise an error. The `javascript` type is left over from before\n1.16 and the schemas keep it for backward compatibility, but it does not load\nwith `@minecraft/server` 2.x. The schema says \"valid type\", the game says \"I\ncannot load this type\".\n\nThat one line was measured in the real game (30-08-2026). There are seven more\nclasses like it, all in [`docs/VALIDATION-LIMITS.md`](docs/VALIDATION-LIMITS.md)\nwith `ContentLog` evidence.\n\nCodeCraft closes that gap: **values are read from version-pinned data,** and\noutput is validated against the official schema and against a real `tsc`.\n\n## Nine tools\n\nAll nine are read-only. The server writes nothing, sends data nowhere, and\nkeeps no user data.\n\n| Tool | What it returns | When |\n|---|---|---|\n| `check_feasibility` | Whether Bedrock can do this at all; if not, why, and the alternative | **Before** anything is generated |\n| `get_version_info` | Which version number goes where, which modules, which `format_version`s are valid | Before writing files |\n| `get_schema` | The required fields and the field list at that node | Before writing files |\n| `lookup_id` | Whether an identifier exists, what type it is, what block states it has | For every identifier recalled from memory |\n| `validate_json` | Schema errors carrying a JSON pointer | For every JSON file produced |\n| `validate_command` | Command, arity, selector, block state | Before handing over a command |\n| `validate_script` | Real `tsc` diagnostics with line, column and TS code | For every API call |\n| `validate_python` | Syntax, embedded commands, and the `/connect` envelope | For out-of-game automation scripts |\n| `review_pack` | Every file, plus the things a schema structurally cannot see | The last step before handing anything over |\n\nThe order is not alphabetical, it is the **order of use** — and `tools/list`\npreserves it.\n\n## Setup\n\n| | |\n|---|---|\n| Endpoint | `https://codecraft-ashy-seven.vercel.app/mcp` |\n| Usage site | [`codecraft-ashy-seven.vercel.app`](https://codecraft-ashy-seven.vercel.app/) — four pages: home, setup, tools, limits |\n| Transport | Stateless Streamable HTTP, `POST` only |\n| Authentication | None — the endpoint is read-only and returns nothing private |\n\nIn Claude, open **Customize → Connectors** (*not* Settings; older guides point\nthere, and there is no custom connector field on that screen):\n\n1. Customize → Connectors → add a custom connector\n2. Paste the endpoint address\n3. Save\n\nThree things you should see once it connects — a single \"it worked\" is not\nenough:\n\n- The tool count is **9**, complete\n- The client classifies them as **\"read only tools\"** — a separate permission class\n- Our own titles are visible, e.g. *\"Can Bedrock do this\"* — the tool surface is English\n\nMore: [`docs/MCP.md`](docs/MCP.md)\n\n## Where validation ends\n\nThis table is not advertising, it is a statement of limits. \"Passed validation\"\nand \"works in the game\" are not the same thing — eight classes of error get\nthrough validation and break in the game, and every one of them was measured in\na real game.\n\n| Class | Does the schema catch it | What CodeCraft does |\n|---|---|---|\n| **A** · identity reference | No, but resolvable | `checkIdentities` finds it |\n| **A′** · path / sound reference | No | `checkReferences`, `checkSounds` — warning; the game itself says nothing |\n| **B** · filename ↔ identifier | **Structurally no** | `checkFileNames` tells you the right name |\n| **C** · texture / asset reference | No | `checkAssets` checks against the vanilla atlas |\n| **D** · valid but not intended | **Structurally no** | `checkPatterns` measures the known patterns |\n| **E** · manifest that never loads | No — the stale type is still listed | `checkManifest` names the right type |\n| **F** · Molang | No — nothing looks inside the string | `checkMolang`; `unknown-query` is an **error**, measured in game |\n| **G** · component name | No — both schema sources let it through | `checkComponents`, still a **warning** (see below) |\n| **H** · version-dependent required field | **Structurally no** — the requirement rides on `format_version` | `checkRecipes` — **error**, the recipe never loads |\n\n> **F and G are worth reading twice.** The game rejects both exactly as hard —\n> the whole block definition is dropped. F was raised to error and G was not,\n> because our own component index has a measured gap of **126 names**. What\n> decides severity is not only \"what does the game do\" but \"how complete is our\n> list\" — two separate questions, and neither is answered without measuring.\n\nThe tools **find and report, they do not write** — the endpoint is read-only,\nfixing is the caller's job. The half that is still open is written down too:\n[`docs/VALIDATION-LIMITS.md`](docs/VALIDATION-LIMITS.md)\n\n## Bedrock has five separate version numbers\n\nThis is where the confusion hurts most, and it is half the reason the tool\nexists:\n\n| Number | Example | Where it is used |\n|---|---|---|\n| Marketing number | `26.40` | Announcements only. **Never written into any file** |\n| Game / data version | `1.26.40.5` | `data/` folder name, data indexes |\n| `min_engine_version` | `[1, 26, 40]` | `manifest.json` — a three-part array |\n| `@minecraft/server` module version | `2.9.0` | `manifest.json` → `dependencies` |\n| `format_version` | `1.21.100`, `1.13.0`, `2` | Content files |\n\n**`format_version` is an axis of its own and has nothing to do with the game\nversion:** it is the schema version of that file type. Block `1.21.100`, feature\nrule `1.13.0`, spawn rule `1.8.0`, manifest `2`. It does not change when the\ngame version changes.\n\nThe module version is a trap of its own — the game version arrives *embedded\ninside* the prerelease tag:\n\n```\n2.9.0                              stable module version (npm \"latest\")\n2.11.0-beta.1.26.50-preview.27     module 2.11.0, game 1.26.50-preview.27\n```\n\nCorrect values are not recalled, they are **read from the schema** — which is\nexactly what `get_schema` and `get_version_info` are for.\n\n## Architecture\n\n```mermaid\nflowchart LR\n    C[\"Claude<br/>you bring the model\"] -->|MCP / HTTP| M[\"packages/mcp<br/>9 read-only tools\"]\n    M --> V[\"packages/validator<br/>ajv · tsc · commands · python\"]\n    V --> K[\"packages/knowledge<br/>lookup · version resolution\"]\n    K --> D[(\"data/<br/>indexes per version\")]\n    P[\"pipeline/<br/>daily cron\"] -->|produces| D\n    U[\"Mojang · Blockception<br/>npm · MicrosoftDocs\"] -->|fetches| P\n```\n\nDependencies point one way: `mcp → validator → knowledge → data`. Nothing\nimports backwards.\n\n**There is no build step.** Node runs the `.ts` files directly; `tsc` is used\nonly for type checking and, as a subprocess, for `validate_script`.\n\n## Data\n\n`data/` is not a database — it is a set of indexes that live in git and are\nversioned there. Eight collectors produce it from four upstream sources.\n\n| Source | What it gives | License |\n|---|---|---|\n| `Mojang/bedrock-samples` | Block/item/entity identifiers, command grammar, texture atlas | Minecraft EULA — *derived facts only* |\n| `Blockception/…json-schemas` | The schemas validation runs against | BSD-3-Clause |\n| npm `@minecraft/*` | Script type definitions | MIT |\n| `MicrosoftDocs/minecraft-creator` | Release notes | CC-BY-4.0 |\n\nA scheduled GitHub Action refreshes it, and a freshness check reports when the\ndata goes stale. The cron is set to 05:00 UTC — but it **does not run then.**\nAll five scheduled runs measured on 03-09-2026 started late, the earliest by\n4h24m, ~5h on average; GitHub queues scheduled jobs and delays them under load.\nSo the indexes can be up to **1 day + ~5 hours** old.\n\nRaw upstream data **never enters the repo.** Only derived facts are indexed:\nwhether an identifier exists, the name of a field, a version number. Reasoning\nand measurements: [`docs/SOURCES.md`](docs/SOURCES.md)\n\n## Invariants\n\n1. **The validation layer never calls an LLM.** No package in this repo depends\n   on an LLM SDK. The rule is not a sentence, it is a measurement:\n   `packages/mcp/test/no-llm.test.ts`\n2. **The endpoint is read-only.** All nine tools carry `readOnlyHint`\n3. **`data/` lives in git.** No database\n4. **The free tier is a requirement, not a constraint**\n5. **Raw upstream data never enters the repo**\n\n## How measurement is written down\n\nIn this repo, **\"it works\" and \"it was measured\" are different things.** A claim\nis written only once it has been measured, and how it was measured is written\nnext to it — with the date. A measurement that turns out wrong is not deleted;\nit is struck through and where it went is written down.\n\nThat is what the \"measured (date)\" comments in the code are: each one is the\nrecord of something that really did break, once.\n\n## Documents\n\nThe documents below are in Turkish — they are the developer's notebook. The\nproduct surface is English: the tools, the server instructions, every finding\nand error message, and the site.\n\n| | |\n|---|---|\n| [`CLAUDE.md`](CLAUDE.md) | Architecture, invariants, version axes |\n| [`docs/MCP.md`](docs/MCP.md) | Endpoint, setup, tool contract |\n| [`docs/mcp-kullanim.md`](docs/mcp-kullanim.md) | The tools in real use, measurement log |\n| [`docs/site-icerik.md`](docs/site-icerik.md) | The usage site's content and measurement log |\n| [`docs/SOURCES.md`](docs/SOURCES.md) | Data sources and their licenses |\n| [`docs/VALIDATION-LIMITS.md`](docs/VALIDATION-LIMITS.md) | What validation does not catch |\n| [`docs/COMMANDS.md`](docs/COMMANDS.md) | Command validation and its scope |\n| [`docs/WEBSOCKET.md`](docs/WEBSOCKET.md) | The WebSocket bridge and its measurement |\n\n## License\n\nThe code is [Apache-2.0](LICENSE). The repo carries third-party content under\nthree separate licenses and produces data derived from a fourth —\n[`THIRD-PARTY-NOTICES.md`](THIRD-PARTY-NOTICES.md) says which is which.\n\n---\n\n<div align=\"center\">\n\n**NOT AN OFFICIAL MINECRAFT PRODUCT.**\n**NOT APPROVED BY OR ASSOCIATED WITH MOJANG OR MICROSOFT.**\n\n</div>\n",
  "bytes": 11231,
  "sha": "8e13e941fbcd9f7111fdb586fb60b7cbb5a316a48ee13feceb11936a4b0c2445",
  "repo_slug": "tanertalas/codecraft",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_tanertalas_codecraft_2ebf9535/readme"
}