{
  "markdown": "<!-- mcp-name: io.github.FixemBCN/mcp-bifrost -->\n\n<picture>\n  <source media=\"(prefers-color-scheme: dark)\"\n          srcset=\"https://raw.githubusercontent.com/FixemBCN/MCP-Bifrost/main/assets/Bifrost_Logo_DarkBackground.png\">\n  <img src=\"https://raw.githubusercontent.com/FixemBCN/MCP-Bifrost/main/assets/Bifrost_Logo_transparentBackground.png\"\n       alt=\"MCP-Bifrost\" width=\"60\" align=\"right\">\n</picture>\n\n# MCP-Bifrost\n\n**Rewrite 200 methods with a cheap model, without a single line of the\nresult passing through the expensive one's context — and without writing\nanything to disk that does not compile.**\n\n[![tests](https://github.com/FixemBCN/MCP-Bifrost/actions/workflows/tests.yml/badge.svg)](https://github.com/FixemBCN/MCP-Bifrost/actions/workflows/tests.yml)\n[![license](https://img.shields.io/badge/license-Apache--2.0-blue)](https://github.com/FixemBCN/MCP-Bifrost/blob/main/LICENSE)\n[![python](https://img.shields.io/badge/python-3.11%2B-blue)](https://www.python.org/)\n[![targets](https://img.shields.io/badge/targets-PHP%20%7C%20Python-777)](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/comparison.md)\n\nAn MCP server that takes code work already analysed and split up by an\norchestrating model, extracts the exact target block with the language's own\nparser, delegates the rewriting to a cheaper worker model, validates the\nresult, applies it atomically, and records the whole thing outside the\norchestrator's context.\n\nThe head decides. The muscle types. Bifrost is the nerve between them — and\nthe part that guarantees nothing reaches disk broken.\n\nIn the examples below the head is Claude and the muscle is DeepSeek, which is\nsimply the model that was to hand. Neither is a requirement. See\n[The worker](#the-worker) for why a 7B model on your own machine may be the\nmore interesting choice.\n\n---\n\n## Why\n\nA large codebase edited by an LLM has one real bottleneck, and it is not\nintelligence: it is context. Reading a 4,600-line file to change thirty lines\nof it burns the orchestrator's window on text it will never use again.\n\nBifrost's premise is that the mechanical half of coding — writing the\nreplacement text — does not need the expensive model, and does not need to\npass through its context at all.\n\n| | Orchestrator does it all | Via Bifrost |\n|---|---|---|\n| 202 methods × ~800 tok | **~161,000 tok** — exceeds a context window | ~15,000 tok |\n\n**The honest version** (see [RF-4](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/critical-review.md)): for a single\nsmall edit the saving is real but modest, because the orchestrator usually\nhad to read the code anyway to say what it wanted. The order-of-magnitude win\nis in volume — transformations across many symbols where the instruction can\nbe written without reading anything.\n\nThat is the use case this is built for. Not \"fix this bug.\"\n\n**And the number the log reports is a counterfactual.** The test suites in\nthis repository were written through Bifrost itself: 97,909 bytes applied\nfrom 1,608 bytes of instruction, which the formula scores at 61×. The\nrealised saving was zero, because the blocks were composed by the\norchestrator rather than by a worker, and every one of those bytes was paid\nbefore Bifrost saw them. The log records what crossed the boundary, not\nwhere it was written. [The worked\nexample](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/architecture.md)\nis in §11, kept unflattering on purpose.\n\n---\n\n## When *not* to use it\n\n- **Exploratory work.** \"Find why this crashes\" is not an instruction Bifrost\n  can execute. It needs to know the symbols before it starts.\n- **Single small edits.** The token arithmetic is marginal, and we say so\n  ([RF-4](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/critical-review.md)). Use your agent's normal edit tool.\n- **Latency-sensitive loops.** ~2.6 s per block, measured against DeepSeek.\n- **Anything that is not PHP or Python.** Adding a language means writing a\n  parser adapter, not rewriting the core — but it is not there today.\n- **Cross-file refactors where one edit's shape depends on another's\n  outcome.** `patch_group` gives atomicity, not sequencing.\n- **Codebases with no way of telling you something broke.** Every gate here\n  checks form; none understands meaning.\n\nHow this sits next to Aider, Serena and fast-apply models — including where\nthey are better — is in [`docs/comparison.md`](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/comparison.md).\n\n---\n\n## How it works\n\n```\nyou ──▶ Claude Code ──▶ MCP-Bifrost ──▶ worker model\n         analyses,        parses,          writes one\n         splits work      validates,       isolated block\n                          applies, logs\n                              │\n                              ├──▶ source file (atomic splice)\n                              └──▶ .bifrost/history.db\n```\n\nThe orchestrator decides what and how. The worker decides nothing. The server\nis the only component allowed to touch disk, and it refuses until every gate\npasses.\n\n### Validation gates\n\n| Gate | Checks | Default |\n|---|---|---|\n| **0 — offsets** | the block on disk is byte-identical to what we sent the worker | on |\n| **1 — syntax** | the rebuilt file passes `php -l` / `ast.parse()` | on |\n| **2 — one symbol** | the returned block defines exactly one symbol — a class counts as one, whatever it holds | on |\n| **3 — substance** | no call, variable or control keyword vanished silently | **off** |\n\n**Three are on by default, not four.** The substance gate is a coarse regex\ncheck that never fired during calibration, and a gate that rejects good\npatches is worse than one waiting to be armed. Enable it with\n`substance_gate=True` before bulk work.\n\nA \"perimeter check\" comparing bytes outside the target range was specified,\nbuilt, and then **deleted**: the server rebuilds the file as\n`original[:start] + block + original[end:]`, so the perimeter is preserved by\nconstruction and the check can never fail. Calibration confirmed it — the\ngate reported 9/9 while three files were left syntactically broken. See\n[RF-1](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/critical-review.md).\n\n### Rollback\n\nGit is already a content-addressed database, so it is used as one.\n`git hash-object -w` before each patch yields a blob SHA that goes in the\nlog; reverting is `git cat-file blob`. Deduplicated and compressed for free,\nworks with a dirty working tree, and there is no bespoke snapshot format to\nmaintain.\n\n---\n\n## The worker\n\nDeepSeek is what was to hand, and every number in this repository was\nmeasured against it. It is not a requirement, and it is probably not the most\ninteresting way to run this.\n\nThe worker's job is deliberately narrow. It receives one isolated block and\none instruction, and returns one block. It does not choose files, plan\nchanges, decide what to edit, or see anything else in the codebase. That is a\ntask a 7B coding model can do — and the gates exist precisely so a weak\nworker's mistakes are caught before they reach disk rather than after.\n\nWhich makes the local case the more compelling one:\n\n- **Your code never leaves the machine.** For a proprietary codebase that is\n  not a preference, it is a precondition.\n- **Cost goes to zero** on exactly the workload this is built for, where\n  hundreds of blocks in one run is normal rather than extreme.\n- **The context requirement is tiny.** One method, not one file. An 8k window\n  is plenty; the whole design is that the worker never sees more than it needs.\n- **A weak worker is an acceptable worker** when every output is parsed,\n  syntax-checked and diffed before it counts for anything. A bad block costs\n  a retry, not a corrupted file.\n\nThat last one is the real argument. Delegating code generation to a small\nlocal model is normally a bad idea because you cannot trust the output and\nchecking it by hand costs more than writing it. Bifrost's answer is that the\nchecking is mechanical, and the machine can do it.\n\nAny OpenAI-compatible endpoint works — Ollama, llama.cpp's server, LM Studio,\nvLLM:\n\n```json\n\"env\": {\n  \"BIFROST_WORKER_BASE_URL\": \"http://localhost:11434/v1\",\n  \"BIFROST_WORKER_MODEL\": \"qwen2.5-coder:7b\"\n}\n```\n\nNo key is needed when the endpoint is not the default one.\n\n### Worker compatibility\n\n**No local model has been measured yet.** The endpoint is configurable and\nthe protocol is a plain OpenAI-compatible chat completion, but this\nrepository does not publish claims it has not measured — and that includes\nclaims in its own favour.\n\nThe instrument exists. Point it at your endpoint:\n\n```bash\nBIFROST_TARGET=/path/to/your/codebase \\\nBIFROST_WORKER_BASE_URL=http://localhost:11434/v1 \\\nBIFROST_WORKER_MODEL=your-model \\\npython3 calibratge/calibra.py --cases 9\n```\n\n| Worker | Valid JSON | Byte-identical (identity task) | No lines lost | Unfenced | Latency |\n|---|---|---|---|---|---|\n| DeepSeek (`deepseek-chat`, API) | 9/9 | 3/3 | 3/3 | 9/9 | 2.6 s |\n| *your model here* | | | | | |\n\nIf you run it, open a PR with the row. Numbers that make a model look bad are\nas useful as numbers that make it look good — the table exists to say which\nworkers this actually works with, not to advertise.\n\n**One thing to expect.** DeepSeek returned zero of nine responses wrapped in\nmarkdown fences. Smaller models fence almost everything, and that is a\nparsing problem rather than a capability one. Bifrost already strips fences;\nif your model is otherwise sound but still fails on them, report it as a bug\nhere rather than as a mark against the model.\n\n---\n\n## What leaves the machine\n\nThe unit of work sent to a worker is one parsed block — a single method — and\nnever the file it came from. That is a consequence of the design rather than\na feature added to it: if the replacement code does not pass through the\norchestrator's context, it does not pass through anywhere else either.\n\n**What it does not mean.** The block does leave, in the clear, to whatever\nendpoint you configured. So does the instruction, which may itself describe\ninternal architecture.\n\n**What already guards it.** Heimdall runs *before* the send, not before the\nwrite. Where a secret is a self-contained token it is swapped for a\nplaceholder, the worker transforms the code around it, and the original goes\nback before the file is written — every placeholder must return exactly once\nor nothing is written at all. What cannot be safely redacted blocks the send\noutright. Measured false-positive rate on a real codebase: 2 findings across\n1,291 symbols, both correct refusals of code that *manipulates* keys rather\nthan holding one. That count is from 0.1.0, when the symbol map held methods\nand functions only; classes became addressable in 0.1.4, so a rerun today\ncounts a larger denominator.\n\nIf your constraint is that nothing may leave at all, the answer is a local\nworker, not a smaller payload.\n\n### Designed, not built\n\nTwo additions would close most of the remaining gap. Neither exists yet, and\nthey are named here rather than hidden in an issue because the design is the\ninteresting part:\n\n- **Egress log.** The log records the *size* of what was sent, not the bytes.\n  Recording them alongside what came back is nearly free, and it turns \"trust\n  us\" into \"audit it\".\n- **Comment and literal redaction.** Heimdall redacts things shaped like\n  secrets. The parser already produces the tree, so comments and string\n  literals — often the highest-risk payload and frequently irrelevant to the\n  transformation — could be replaced with opaque markers and restored on\n  return.\n\nThe obvious objection to the second is that quality may suffer when the\nworker cannot see the names. That is a measurable question, not an argument:\nnine cases with redaction, nine without, `calibratge/calibra.py`. Whichever\nway it comes out gets published.\n\n---\n\n## Quick start\n\nPython 3.11+. **No runtime dependencies** — the server runs on the standard\nlibrary, and each language is parsed by its own official tooling (`php` as an\nexternal binary, `ast` from the stdlib).\n\n```bash\npipx install mcp-bifrost      # or: uv tool install mcp-bifrost\n```\n\nAdd it to `.mcp.json` in the project you want to patch:\n\n```json\n{\n  \"mcpServers\": {\n    \"bifrost\": {\n      \"command\": \"mcp-bifrost\",\n      \"env\": { \"BIFROST_DB\": \".bifrost/history.db\" }\n    }\n  }\n}\n```\n\n**A tool the client only lists by name is easy to forget mid-task.** MCP\nclients that defer tool schemas show Bifrost's tools as bare names until\nsomething asks for them, and nothing about repeating the same mechanical edit\nfive times in a row prompts that ask on its own — that is exactly how the\nfirst six months of dogfooding went: `insert_case` sat unused for an entire\nsession while the same switch-case pattern got hand-edited over and over,\nwhich then collided across two parallel edits in exactly the way\n`insert_case`'s anchoring exists to prevent. Close the gap once, for this\nproject:\n\n```bash\nmcp-bifrost init-hook            # writes .claude/settings.json in this project\nmcp-bifrost init-hook --global   # or: ~/.claude/settings.json, for every project\n```\n\nThis adds a `PreToolUse` hook on `Edit`/`Write` that reminds the client to\ncheck for a fitting Bifrost tool before hand-editing — additively, so any\nhooks you already have stay in place. Run it again any time; it is a no-op\nonce the hook is there. Commit the project-level `.claude/settings.json` so\nthe nudge travels with the repo instead of living only on one machine.\n\nA reminder alone turned out not to be enough — a full build session with the\nhook installed and firing 50+ times still routed 96% of new files through a\nraw `Write` (see docs/critical-review.md, RF-13). A later session settled\nit: asked directly, the client admitted it was not using the tools, loaded\nthem, made one call, then hand-edited a new switch case, two new functions\nand two method rewrites anyway, with the reminder firing on every one. Text\nthat has already been read and agreed with does not change the next\ndecision.\n\nSo the hook *blocks* two cases outright:\n\n- **An `Edit` or `Write` to an existing file this server adapts** (`.php`,\n  `.py`) inside a project whose `.mcp.json` registers `bifrost`. The denial\n  names the tool for each shape — `insert_case`, `insert_symbol`,\n  `fix_symbol`, `fix_symbols`, `fix_range`, `patch_group`.\n- **A `Write` creating a file that does not exist yet**, in a directory\n  where three or more siblings already share its extension, naming the\n  suggested `create_file(model_from=<nearest sibling>)`.\n\nEverything else stays advisory. The first gate reads its scope off disk, so\n`--global` is safe: a `.php` or `.py` file in a project that never\nconfigured this server is never blocked. When an edit genuinely has no\nsymbol to address, `touch .bifrost/hook-override` lets the next one through\n— it is consumed on use, so it buys one edit rather than a silent\nsession-wide opt-out.\n\n#### If you develop this server, install the hook from a `main` worktree\n\nThe hook is enforced, global, and — installed editable from your development\ncheckout — it runs whatever branch that checkout happens to be on. Switching\nto a feature branch then silently changes the gate for every other project on\nthe machine, which is exactly the class of surprise this tool exists to\nremove. Keep a second worktree pinned to `main` and point the install at that\ninstead:\n\n```bash\ngit worktree add ../MCP-Bifrost-main main\npipx install --force --editable ../MCP-Bifrost-main\n```\n\nDevelopment continues in the original checkout, on any branch, with no effect\non the live hook. After merging to `main`, refresh the worktree deliberately:\n\n```bash\ngit -C ../MCP-Bifrost-main pull       # editable install: no reinstall needed\n```\n\nThe same applies to any `.mcp.json` that launches the server by path: point\nits `PYTHONPATH` at the `main` worktree, not at the checkout you develop in.\n\nOr from source, without installing:\n\n```bash\ngit clone https://github.com/FixemBCN/MCP-Bifrost.git\ncd MCP-Bifrost\npython3 -m unittest discover tests    # 308 tests, ~32s\npython3 -m mcp_bifrost.server         # same server, PYTHONPATH=.\n```\n\n**Without `php` on your PATH you will see `OK (skipped=80)`,** and that is the\nexpected result: those 80 tests drive the real PHP tokenizer, so on a machine\nwith no PHP there is nothing for them to prove. The remaining 228 — gates,\npatcher, budget, Heimdall, the Python adapter — run on the standard library\nalone. Install `php-cli` if you want the PHP half proven on your own machine;\n[CI](https://github.com/FixemBCN/MCP-Bifrost/actions/workflows/tests.yml) runs\nboth environments on every push. `git` guards 91 tests the same way.\n\n**The key does not go in that file.** Put it in `.bifrost.env` at your project\nroot, which the server reads when the environment does not carry it:\n\n```bash\necho \"DEEPSEEK_API_KEY=sk-...\" > .bifrost.env\nchmod 600 .bifrost.env\necho \".bifrost.env\" >> .gitignore\n```\n\nOr skip the key entirely and point `BIFROST_WORKER_BASE_URL` at a local\nmodel. Full instructions, and what to do before pointing this at anything\nthat matters, are in [the manual](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/manual.md).\n\n### Tools\n\n| Tool | What it does |\n|---|---|\n| `fix_symbols` | one instruction across many symbols — **the main one** |\n| `fix_symbol` / `fix_range` | rewrite one symbol, or an explicit line range — optional `verify` command, reverted on failure |\n| `insert_symbol` / `insert_case` | add a function, method or class, or a branch to a switch router |\n| `create_file` | write a new file, optionally by analogy with an existing one — optional `verify` command, deleted on failure |\n| `patch_group` | several operations as one transaction |\n| `export_docs` / `publish_session` | changelog from the log; batch onto a reviewable branch |\n| `revert_patch` / `revert_session` | undo one patch, or the whole batch |\n\n---\n\n## Calibration\n\nBefore writing a line of the server, one question had to be answered:\n\n> Given a real method from a real codebase, packed with the compact schema,\n> does the worker return code that can be applied without breaking anything?\n\nThe harness in `calibratge/` answers it. Zero dependencies — Python stdlib\nplus the `php` binary.\n\n```bash\nexport BIFROST_TARGET=/path/to/your/codebase\npython3 calibratge/calibra.py --dry-run    # show cases, no API calls\nexport DEEPSEEK_API_KEY=...\npython3 calibratge/calibra.py --cases 9\n```\n\n**Result: the premise holds.** 9/9 valid JSON, 3/3 byte-identical on the\nidentity task, 3/3 with no original lines lost, 0/9 wrapped in markdown\nfences, 2.6 s average latency.\n\nIt also caught a byte-offset bug that had nothing to do with the worker and\nwould have corrupted files silently in production. Full write-up:\n[docs/calibration.md](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/calibration.md).\n\n---\n\n## Repository layout\n\n| Path | What |\n|---|---|\n| `mcp_bifrost/` | the server |\n| [`CHANGELOG.md`](https://github.com/FixemBCN/MCP-Bifrost/blob/main/CHANGELOG.md) | what changed in each version, and why it was wrong before |\n| [`docs/`](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/) | manual, architecture, critical review, calibration, comparison, licensing |\n| `tests/` | 308 tests — 80 need `php`, 91 need `git`, skipped when absent |\n| [`brainstorm/`](https://github.com/FixemBCN/MCP-Bifrost/blob/main/brainstorm/) | the working record — how each decision was reached, including the reversed ones |\n| `calibratge/` | the measurement harness |\n| [`.github/`](https://github.com/FixemBCN/MCP-Bifrost/blob/main/.github/workflows/tests.yml) | the workflow the badge reports: the suite with `php`, and again without it |\n\n---\n\n## Behind the code\n\nTo be completely transparent: **not a single line of this codebase was\nwritten by hand.** It was conceptualised, challenged, implemented, tested and\ndocumented through a human-directed AI process. Here is what that actually\nmeant, as precisely as it can be stated.\n\n**Human — problem, decisions, direction.** I brought the initial\nspecification and made every product decision: which worker model, which\nlanguages, what to cut, what to build next, the licence, the naming, when to\nstop. Several reversed earlier ones — the licence started as a no-resale\nsource-available one and ended up Apache-2.0 once I decided reach mattered\nmore than control. I also decided what the system must refuse to do, which\nturned out to be the more consequential half.\n\n**Claude Opus — adversarial design.** Before implementation, Claude reviewed\nthe specification as an outsider looking for reasons it would fail, and\nproduced twelve findings. Two killed design elements I had approved: the\ncentral \"perimeter check\" the spec relied on turned out to be incapable of\nfailing, and the project's stated justification — token savings — was shown\nto be marginal for single edits and only decisive in bulk. Both are\npreserved, unedited, in [`brainstorm/`](https://github.com/FixemBCN/MCP-Bifrost/blob/main/brainstorm/).\n\n**Measurement before code.** Rather than trusting the design, a calibration\nharness was built first and run against the real worker on real code. It\nfailed 6 of 9 cases — none of them the worker's fault. The cause was a\nbyte-offset bug that would have silently corrupted any file containing an\naccented character. It also refuted two of Claude's own review findings.\nThose corrections sit above the original claims rather than replacing them.\n\n**Claude Opus — the core; delegated models — the periphery.** Claude wrote\nthe parsing, patching, validation gates, secret handling and engine directly.\nTwo peripheral modules and the whole of the original test suite were\ndelegated to smaller models (Haiku and Sonnet) running as subagents. That\nsuite has since roughly doubled: the tests added in 0.1.2–0.1.5 were written\nby Opus and applied through Bifrost itself, and they exist because the\noriginal 128 never executed the MCP server, the worker's HTTP client, the\nVCS layer or the Python adapter at all. The split was\ndeliberate rather than economical: a model starting cold on the patching code\nwould very plausibly have reintroduced the byte-offset bug, because the\nnatural way to write that code is the wrong way.\n\n**The delegated models found four real bugs** in code Claude had written,\nincluding one that detached a docblock from the method it documented and one\nwhere nested `switch` statements silently dropped branches. Both passed every\nvalidation gate. Adversarial review by a model with no stake in the code was\nthe only thing that caught them.\n\n**Human — review and acceptance.** I directed the sequence, inspected\nresults, challenged claims, and decided what stayed. Claude executed the\nvalidation and calibration runs; I read what came back and decided what it\nmeant.\n\n### What this process did not provide\n\nNo human has read all ~10,700 lines of this repository — roughly 4,600 of\nserver, 5,400 of tests and 700 of measurement harness — line by line. The\nconfidence here comes from tests checked against deliberately broken code,\nfrom measurements against a real codebase, and from a design that refuses to\nwrite anything it cannot verify — not from manual audit.\n\nIf that is not the kind of confidence you want in a tool that edits your\nsource files, that is a reasonable position, and the\n[responsibility section](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/manual.md#responsibility) is specific about\nwhat the gates do and do not catch.\n\n### Why this is in the README\n\nBifrost is a demonstration of its own premise. The valuable human\ncontribution was not typing the code: it was defining the problem,\ncontrolling the context, challenging the output, and insisting on enough\nvalidation that generated code could be trusted at all.\n\nThe repository deliberately keeps the reasoning, the rejected ideas, the\nadversarial review and the measurements — including the parts where the AI\nwas wrong and said so.\n\n**This account stops at the first release, and the work did not.** What has\nhappened since is in [`CHANGELOG.md`](https://github.com/FixemBCN/MCP-Bifrost/blob/main/CHANGELOG.md),\nwhich records each defect as it was found and what it had been doing\nunnoticed; how the design was arrived at before that is in\n[`brainstorm/`](https://github.com/FixemBCN/MCP-Bifrost/blob/main/brainstorm/)\nand [`docs/critical-review.md`](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/critical-review.md).\n\n---\n\n## Documentation\n\n| Document | What it is |\n|---|---|\n| [Manual](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/manual.md) | what it is, what it can do, how to install it, and what you are responsible for |\n| [Architecture](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/architecture.md) | what gets built and why |\n| [Critical review](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/critical-review.md) | a fresh-eyes pass hunting for reasons this fails — twelve findings, two later refuted by measurement |\n| [Calibration results](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/calibration.md) | what the worker actually did when asked |\n| [Comparison](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/comparison.md) | how this sits next to Aider, Serena and fast-apply — and where they win |\n| [Licensing](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/licensing.md) | what we consume, what we grant |\n\n[`brainstorm/`](https://github.com/FixemBCN/MCP-Bifrost/blob/main/brainstorm/) holds the working record: the original spec, the\ndesign journal across five revisions, the adversarial review, and the\ncalibration results. `docs/` is the reference and wins where the two differ.\n\n---\n\n## Responsibility\n\nThis tool edits your source files automatically using a language model.\nApache 2.0 means it is provided **as is, without warranty**: you are\nresponsible for what it does to your code. Read the diffs, run your tests,\ndeploy on purpose. The [manual](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/manual.md#responsibility) is specific\nabout what the gates do and do not catch.\n\n## Contributing\n\nContributions of every kind are welcome — including an argument that\nsomething here is wrong. This project has already deleted one validation gate\nfor being tautological and refuted two of its own claims with measurement.\n\nOne convention, and it is the one that matters: **every test must be able to\nfail.** Details in the [manual](https://github.com/FixemBCN/MCP-Bifrost/blob/main/docs/manual.md#contributing).\n\n## License\n\n[Apache License 2.0](https://github.com/FixemBCN/MCP-Bifrost/blob/main/LICENSE).\n\nBuilt on the [Model Context Protocol](https://modelcontextprotocol.io),\nMIT-licensed by Anthropic, PBC. MCP-Bifrost is an independent project and is\nnot affiliated with, endorsed by, or sponsored by Anthropic, PBC.\n",
  "bytes": 26736,
  "sha": "6f0250af94ec7b702f0fb93abd49b095001d8649995592ead2b04c24ead58cad",
  "repo_slug": "fixembcn/mcp-bifrost",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_fixembcn_mcp_bifrost_04e9f6fd/readme"
}