mcpbeat Sign in

GEML — a plain-text document format built to be edited in place, one section at a time MCP Server

by geml-spec Your server? Claim it
answering

GEML — a plain-text document format built to be edited in place, one section at a time is answering right now. Last checked 11 min ago. 615 installs a week from npm. It exposes 9 tools. Last commit 29 Oct 2026.

One section in, one section out — on Markdown/GEML files, bad writes refused.

Installs per day peak 460 · avg 117 · +106% w/w
a month agotoday
Uptime history 25 days of history
25 days agonow
100.0%
Uptime 24h
91 of 91 checks
9
Tools
read from the server
112 ms
Response time
average over 24h
615
Installs / week
npm and PyPI

What the code does

We read the source, 3 d ago · tools taken from the live server · rules 995398eba69f

A tool parameter reaches a dangerous call

A value the model can set ends up inside a file or shell call. That is not a flaw by itself — for a terminal server it is the job — but it is where things go wrong when it is not.

A tool parameter reaches a file or shell call geml_codemap_list.module → geml-parser/codemap/mcp-server.mjs:149, geml_check.root → geml-parser/src/mcp.ts:427, geml_codemap_list.module → geml-parser/codemap/mcp-server.mjs:152 и ещё 2
      const text = readFileSync(join(graphDir, doc), "utf8");
Capabilities

What this server is able to do. For an MCP server this is often the job itself — a terminal server runs commands because that is what it is for. Listed so you know what you are plugging in, not as an accusation.

  const braced = /(?:value|path)\s*=\s*\{([^}]*)\}/.exec(argstr);
In the project's build, not in the package

Found in continuous integration, deployment or infrastructure files, or in a neighbouring package of the same monorepo. None of this is installed when you add the server: it describes how the project is built and released. We list it because a leaked key in a build pipeline is still a real problem, but it is not something this server does on your machine.

        return subprocess.run(
Builds a file path from a variable integrations/vscode/src/cli.ts:83
      const candidate = path.join(dir, name + ext);

Is this your server and something here is wrong? Tell us — corrections are free and do not require a plan.

A tool parameter here reaches a dangerous call

That is not a flaw by itself — but it is where things go wrong when it is not the job. We re-read this code on every release. Watch it and you hear from us the day another one appears.

Three servers free · no card

Connect this server

Endpoint below is the one we actually reach during checks — not the one copied from a README. Last verified 11 min ago.

run in your terminal
claude mcp add geml --transport http https://geml-mcp.supermarket.workers.dev/mcp
Settings → Connectors → Add custom connector, then paste this address
https://geml-mcp.supermarket.workers.dev/mcp
~/.codex/config.toml
[mcp_servers.geml]
url = "https://geml-mcp.supermarket.workers.dev/mcp"
.cursor/mcp.json
{
  "mcpServers": {
    "geml": {
      "url": "https://geml-mcp.supermarket.workers.dev/mcp"
    }
  }
}
.vscode/mcp.json
{
  "servers": {
    "geml": {
      "type": "http",
      "url": "https://geml-mcp.supermarket.workers.dev/mcp"
    }
  }
}

Available tools 9

Read directly from the server with tools/list, grouped by what they act on. If a tool disappears, we record the date.

geml
geml_add
Insert new content — one or more blocks, or prose — at the end of the document (`position: append`) or before/after the block named by `anchor`. Use this for content that does not exist yet; to change a block that does, use geml_set. Ids inside the content are kept. In a `.md` file Markdown lands as written, and GEML content is converted to Markdown as `to: "md"` converts it, the result's `notes` saying so; content Markdown cannot hold, such as a view without its source, is refused. Like every write here it is validated first: a missing anchor, an id that clashes with an existing one, or content that would break the document is refused. Returns `{ok, file, diagnostics, revision}`, with `notes` when the write did something to say out loud (a block it dropped, an address it changed); a refusal is `ok: false` with a `hint`, and the file is unchanged. This server is STATELESS: the document travels in `source` and a write comes back as `document` for you to save; it holds no other documents, so a cross-document reference such as `[[other.geml#id]]` cannot be resolved here and is reported as `unresolvable-document`.
geml_check
Validate a GEML document without changing it: returns every diagnostic with a stable `code`, a severity and a line, and an empty list means the document is valid. Use it to confirm a document is sound before reporting work as finished. Every write through this server runs the same check before it lands, so a refused write already carries this information. This server is STATELESS: the document travels in `source` and a write comes back as `document` for you to save; it holds no other documents, so a cross-document reference such as `[[other.geml#id]]` cannot be resolved here and is reported as `unresolvable-document`.
geml_delete
Remove one or more blocks, each named by an id or any address geml_list prints; a filter (`=== type`, `{key=value}`) removes every block it matches. Each block takes the blank line that separated it from its neighbours, so deleting what geml_add inserted leaves the file as it was. To undo a deletion, geml_revert the removed id; to change a block rather than remove it, use geml_set. References left pointing at a removed block come back as diagnostics but do NOT block the deletion — read them, then repair the references or revert. A selector that names nothing is skipped, so repeating a call changes nothing. Returns `{ok, file, diagnostics, revision}`, with `notes` when the write did something to say out loud (a block it dropped, an address it changed); a refusal is `ok: false` with a `hint`, and the file is unchanged. This server is STATELESS: the document travels in `source` and a write comes back as `document` for you to save; it holds no other documents, so a cross-document reference such as `[[other.geml#id]]` cannot be resolved here and is reported as `unresolvable-document`.
geml_find
Search block CONTENT in the document; each hit is one `<name>\t<address>` row. geml_list says what a document contains, this says which block holds the words — as an address that pastes straight into geml_get or geml_set, not a line number the next edit invalidates. The address is the innermost block holding the match, and a block matching on many lines is reported once. Substring, case-insensitive unless `case` is true. No match is an empty result, not an error. This server is STATELESS: the document travels in `source` and a write comes back as `document` for you to save; it holds no other documents, so a cross-document reference such as `[[other.geml#id]]` cannot be resolved here and is reported as `unresolvable-document`.
geml_get
Read ONE block from a GEML document instead of the whole file: only that block comes back, typically a few percent of the document. Pass the `address` geml_list prints as `id` — it also reaches blocks with no `#id`; to locate a block by its words instead, use geml_find first. An `id` that matches nothing, or a file that is not under the server root, is an error naming it. This server is STATELESS: the document travels in `source` and a write comes back as `document` for you to save; it holds no other documents, so a cross-document reference such as `[[other.geml#id]]` cannot be resolved here and is reported as `unresolvable-document`.
geml_list
List every addressable block in a GEML document — its address, kind and heading text — in one call, with no paging. Call this FIRST: what it returns is what every other tool here addresses, and it is cheaper and more reliable than reading the file to see what is in it. Rows marked `anon` have no `#id`; geml_get and geml_set take their `address` as `id`, while the other write tools need a real id, so give such a block one first. A file that is not under the server root is an error. This server is STATELESS: the document travels in `source` and a write comes back as `document` for you to save; it holds no other documents, so a cross-document reference such as `[[other.geml#id]]` cannot be resolved here and is reported as `unresolvable-document`.
geml_rename
Rename a block id AND every reference to it in the same document, in one id-boundary-safe write. Use this rather than geml_set or a text search-and-replace, which would also hit ids that merely share a prefix. A Markdown heading's anchor is its text, so it is renamed by changing the heading with geml_set (`part: head`), not here. An `old` id that does not exist, or a `new` one already taken, is refused. Returns `{ok, file, diagnostics, revision}`, with `notes` when the write did something to say out loud (a block it dropped, an address it changed); a refusal is `ok: false` with a `hint`, and the file is unchanged. This server is STATELESS: the document travels in `source` and a write comes back as `document` for you to save; it holds no other documents, so a cross-document reference such as `[[other.geml#id]]` cannot be resolved here and is reported as `unresolvable-document`.
geml_set
Replace ONE block and leave every other byte untouched — prefer this to rewriting a file. For content that does not exist yet use geml_add; to remove a block, geml_delete. The replacement is validated before it is written: if it would break the document, nothing is written and the diagnostics come back — fix the body rather than resending it. Removing content is not refused: if the replacement drops blocks, the write goes through and the result names each one, so check it after shortening a section; geml_revert puts one back. `part` replaces the whole block (default), its head line, a section's `intro`, or its body. In a Markdown file a heading's anchor is its text, as on GitHub: new heading text gives the heading a new address, and the document's links to the old one follow in the same write. GEML content written over a Markdown heading or prose is converted to Markdown, as in geml_add; a GEML block already in the file stays GEML. An `id` that matches no block, or several, is refused. Returns `{ok, file, diagnostics, revision}`, with `notes` when the write did something to say out loud (a block it dropped, an address it changed); a refusal is `ok: false` with a `hint`, and the file is unchanged. This server is STATELESS: the document travels in `source` and a write comes back as `document` for you to save; it holds no other documents, so a cross-document reference such as `[[other.geml#id]]` cannot be resolved here and is reported as `unresolvable-document`.
geml_to
Convert a WHOLE document and get the result back as text — the read half of the CLI's `geml <file> --to <fmt>`. `to: "geml"` on a Markdown file is the importer, the one thing the block tools cannot do; `to: "md"` projects a GEML document out (lossy); `to: "json"` returns the full document model, for when geml_list plus geml_get is not enough. Nothing is written — pass the result to geml_add or geml_set to land it. `to: "html"` also works but returns a whole self-contained page, usually tens of kilobytes this server cannot save: prefer the CLI (`geml <file> --to html -o out.html`) unless you want the markup in the conversation. A document with errors returns its diagnostics instead of a conversion, and a file that is not under the server root is an error. This server is STATELESS: the document travels in `source` and a write comes back as `document` for you to save; it holds no other documents, so a cross-document reference such as `[[other.geml#id]]` cannot be resolved here and is reported as `unresolvable-document`.

Endpoints

URLTransportStateLatencyChecked
https://geml-mcp.supermarket.workers.dev/mcp streamable-http answering 142 ms 11 min ago

Alternatives to GEML — a plain-text document format built to be edited in place, one section at a time

same job, measured the same way
PDFluent
by pdfluent

Read, search and fill PDFs as markdown, text, tables, forms. Your documents stay on your machine.

102 installs/wk local only
weave
by grunion-ai

Connected tables, relations, workflows and markdown documents in one SQLite file, over MCP.

local only
docx4j Word documents
by plutext

Read, convert and fill Word (.docx) documents: templates, Markdown/HTML in and out, PDF with math.

local only
Tablestakes
by oborchers

Read and edit HTML/Markdown tables in GitBook-synced documents via MCP tools.

68 installs/wk local only
Better Notion
by ai-aviate

Operate Notion with a single Markdown document — read, create, and update pages in one call.

35 installs/wk local only
mdprint documentation
by fokuus

Read-only mdprint product information, documentation and Markdown examples. No document uploads.

4 tools answering
docling.rs
by docling-project

Documents to Markdown for agents: PDF layout, tables and OCR, Office, HTML, scans. docling in Rust.

3 379 installs/wk local only
shuck-convert
by shan-zhu

Convert between document formats — DOCX/PDF to Markdown, Markdown to DOCX.

35 installs/wk local only

GEML — a plain-text document format built to be edited in place, one section at a time — questions

Answers built from our own checks of this server.

What can GEML — a plain-text document format built to be edited in place, one section at a time do?
It exposes 9 tools, read directly from the server on our last check. Among them: geml_add, geml_check, geml_delete, geml_find, geml_get, geml_list and 3 more. The full list with descriptions is on this page — we take it from the server itself via tools/list, not from a README. How MCP servers expose tools in the first place →
Is GEML — a plain-text document format built to be edited in place, one section at a time working right now?
We send a real MCP handshake every 15 minutes. Over the last 24 hours 91 of 91 checks got a reply (100.0%), average response time 112 ms. The bar chart above shows every period we have measured.
How do I connect GEML — a plain-text document format built to be edited in place, one section at a time?
Copy the ready config from this page. We generate it for Claude Code, Claude Desktop, Codex, Cursor and VS Code, each in the form that client actually reads. It is a remote server, so there is nothing to install — the client connects to the address.
Does GEML — a plain-text document format built to be edited in place, one section at a time need an API key?
No. GEML — a plain-text document format built to be edited in place, one section at a time completed a full MCP handshake with us as an anonymous client and listed its tools without asking for anything. All 9 of them are readable on this page. This is what we observed, not what the docs claim.
How fast is GEML — a plain-text document format built to be edited in place, one section at a time?
It answers our handshake in 112 ms on average, which is faster than 90% of all working MCP servers we measure. That puts it in the quick quarter of the ecosystem. The comparison comes from our own checks across the whole registry, every 15 minutes.
How many people use GEML — a plain-text document format built to be edited in place, one section at a time?
The npm package @geml/geml was installed 615 times in the last week. Week over week that is +106%. We show installs rather than GitHub stars on purpose: a star is a bookmark, an install is someone actually running it.
Is GEML — a plain-text document format built to be edited in place, one section at a time open source?
The code is open source: it is published under the MIT licence, written in JavaScript, 29 stars on GitHub and 1 open issue. The licence covers the code in the repository, not the hosted service at geml-mcp.supermarket.workers.dev, which runs on its operator's own terms.