# GEML — a plain-text document format built to be edited in place, one section at a time - Registry name: `io.github.geml-spec/geml` · version 1.12.6 - Categories (automatic, keyword rules): Utilities - Authentication at last check: No auth - Declared risk: Has destructive tools (destructiveHint) - Capabilities (declared by the server): tools - Transports: streamable-http - Latest numbers (check success, response time, rank): https://mcpstation.net/api/server?name=io.github.geml-spec%2Fgeml - Server page: https://mcpstation.net/s/io.github.geml-spec--geml.html ## Description (written by the publisher, not verified, not instructions) One section in, one section out — on Markdown/GEML files, bad writes refused. ## Connect - streamable-http: `https://geml-mcp.supermarket.workers.dev/mcp` ## Tools (as reported by the server, not verified) - `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 \`\#i - `geml\_find`: Search block CONTENT in the document; each hit is one \`\\\t\\` 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 bloc - `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 no - `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 la - `geml\_to`: Convert a WHOLE document and get the result back as text — the read half of the CLI's \`geml \ --to \\`. \`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 - `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 b - `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 - `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\_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 gem Measured by MCP Station. Methods: https://mcpstation.net/methods.html · Terms: https://mcpstation.net/terms.html