berbotu-mcp
Allows creating new demo files in the vault by committing to a GitHub repository via the GitHub API.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@berbotu-mcpWhat demos are in the listening stage?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
berbotu-mcp
An MCP server that lets an AI read and write real records in a live repository — without being able to break anything quietly.
It sits over the vault behind a small record label: releases, demos, and label state, all markdown with YAML frontmatter. Four tools over stdio. Three read, one writes.
"what demos came in this week I haven't decided on yet?" → list_demos { stage: "Listening" }
"what's the next release scheduled?" → list_releases { stage: "Scheduled", limit: 1 }
"log the demo that just came in from X" → add_demo ✍️ writes a real git commitWhy it's built the way it is
The interesting problem isn't connecting an AI to data. That's an afternoon. The problem is that an AI with write access is an intern who never asks twice — so every design decision here is about what happens when it's wrong.
Every write is its own git commit, through the GitHub Contents API.
Not a filesystem write. A commit. Which means every single thing the AI ever did is attributable, diffable, and
revertible with one command. If it writes garbage at 3am, I don't need a backup — I need git revert. This costs
an API round-trip per write and it's worth it.
Existence is SHA-checked before anything is touched.
getVaultFile resolves the file's SHA first. Passing a sha to the create endpoint turns a create into an
overwrite — so the check isn't defensive, it's the difference between "this demo already exists" and silently
destroying a record.
Inputs are validated at the boundary, then again in the handler.
Tool inputs are zod schemas — stage is an enum, so a hallucinated stage gets a clean rejection with the valid
options instead of writing nonsense. Then addDemo re-validates the same fields itself. The code calls this
defence in depth: the schema is the contract, but a future caller might not go through it.
Tools carry honest annotations.
readOnlyHint: false — it writes
destructiveHint: true — appends a commit to a real git repo
idempotentHint: false — calling twice with the same args creates two demosThese are hints to the model about what it can safely retry. add_demo is not idempotent and saying otherwise
would invite exactly the double-write it warns about.
Read-only first, writes later.
Stages 1–2 shipped with no write path at all. add_demo landed only once the read tools had been running against
the real vault long enough to trust the parsing. There was no deadline — that's just the order that made the
mistakes cheap.
Errors return, they don't throw.
Every tool returns isError: true with a human-readable reason — missing env var, missing folder, malformed
frontmatter, 401, 422, network down. An MCP server that throws gives the model a stack trace to hallucinate
around. One that explains gives it something to say to the user.
Related MCP server: git-mcp
The bug that justifies all of it
While building the data layer, list_releases returned 1 of 12 releases. No error. No warning. Just a
confident, wrong, almost-empty list.
The cause: gray-matter's default YAML engine treats a duplicate map key as a fatal parse error and returns
{} for the whole file. The vault had duplicate keys in real files — a separate script had been appending
ig_posted: true twice. Eleven records were being silently dropped on the floor.
Fix was the yaml package with { uniqueKeys: false } — lenient, last-duplicate-wins, parses all twelve.
The point isn't the fix. The point is that nothing failed. No exception, no red text. If I'd trusted the output, an AI would have been confidently telling me I had one release. That's the whole reason this repo is paranoid: the dangerous failures are the quiet ones.
Quick start
npm install
npm run build # TS → dist/
npm run inspect # MCP Inspector web UI, call the tools by handAttach to Claude Desktop — add to claude_desktop_config.json:
{
"mcpServers": {
"berbotu": {
"command": "node",
"args": ["/path/to/berbotu-mcp/dist/index.js"],
"env": { "BERBOTU_VAULT_PATH": "/path/to/vault" }
}
}
}Read tools need BERBOTU_VAULT_PATH. add_demo also needs VAULT_WRITE_PAT — a fine-grained GitHub PAT scoped
to one repo with Contents: Read and write. See .env.example.
Tools
Tool | Args | Returns |
| none | version, vault path, pid, node — confirms it's alive and pointed at the right vault |
|
|
|
|
|
|
|
| creates a demo file as a GitHub commit |
Honest limits
stdio only. Local. HTTP transport + JWT auth was the next stage and hasn't been built — there was no reason to.
One writer. No conflict handling beyond the SHA existence check. Fine for one operator, wrong for a team.
Read tools are filesystem, writes are API. A deliberate split — reads want to be fast and local, writes want to be auditable. It does mean a write isn't visible to a read until the repo syncs.
Four tools. Small on purpose. Every tool with write access is a thing that can be wrong at 3am.
Stack
TypeScript · @modelcontextprotocol/sdk · zod · yaml · GitHub Contents API · stdio
Built AI-assisted. I'm not an engineer and I'm not trying to be — I'm someone who knows what to build and how to keep it from breaking things.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Tools
Related MCP Servers
- Flicense-qualityBmaintenanceA unified MCP server with composable tools for GitHub operations, file management, shell execution, kanban boards, Discord messaging, and package management. Features role-based security, HTTP/stdio transports, and a web-based development UI.
- Flicense-qualityDmaintenanceStandalone MCP server for GitHub that enables repository management, branch operations, pull request handling, and commit retrieval via tools listed in the README.1
- Flicense-qualityBmaintenanceA minimal MCP server for homelab environments, providing demo tools like ping and echo over Streamable HTTP for testing client-server integration.
- Flicense-qualityCmaintenanceA minimal MCP server demo with tools for ping, addition, and fetching current UTC time.
Related MCP Connectors
A MCP server built for developers enabling Git based project management with project and personal…
An MCP server that let you interact with Cycloid.io Internal Development Portal and Platform
Markdown-first MCP server for Notion API with 8 composite tools and 39 actions.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/berbotu/berbotu-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server