Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
ROOTNoThe directory the server is confined to. Use `.` or `${workspaceFolder}` to bind to the active project. Paths stay confined to this root, which a client cannot widen.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
geml_listA

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.

geml_findA

Search block CONTENT across the served documents; each hit is one <file>\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. Omit path to search every *.geml and *.md under the server root; a file you name is searched whatever its extension, a directory walks *.geml and *.md. No match is an empty result, not an error.

geml_getA

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.

geml_checkA

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.

geml_historyA

Read a document's recorded history. WITHOUT rev: list every revision, newest first — each entry's offset is the selector geml_revert takes as rev (-1 is the revision before the current one), and an empty list means the document has no sidecar yet and nothing can be reverted. WITH rev: the full text of that one revision, for reading what the document looked like then without restoring it.

geml_toA

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.

geml_setA

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.

geml_addA

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.

geml_deleteA

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.

geml_renameA

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.

geml_revertA

Undo ONE block, leaving every other block byte-for-byte unchanged — recover a single block after a bad edit without losing the good edits around it. rev defaults to undoing this block's LAST change (its previous distinct version), which holds even when other blocks were edited afterwards; or pass 0 for the tip, a -N offset, or a revision id from geml_history. Reverting across a revision where the block was deleted restores it; across one where it did not exist removes it. A rev that matches no revision, or a document with no history yet, 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.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4.6/5.0

Scored across 11 tools

Disambiguation5/5

Each tool has a distinct role and the descriptions explicitly disambiguate the tricky pairs: geml_set vs geml_add (change existing vs insert new), geml_delete vs geml_revert (remove vs undo one change), and geml_rename vs geml_set (id-safe rename vs heading text change, which geml_rename explicitly defers to geml_set). Read tools are also cleanly separated: geml_list (what exists), geml_get (read one block), geml_find (which block holds words), geml_to (convert whole document). No two tools appear to do the same thing.

Naming Consistency4/5

All tools share a uniform `geml_` snake_case prefix followed by a single token, which is highly predictable. Most are clear verbs (add, set, delete, rename, revert, list, find, get, check), with only minor deviations like the noun `history` and the preposition-ish `to`, both still readable in context.

Tool Count5/5

11 tools is squarely in the well-scoped range for a document manipulation server, and each tool earns its place by covering a distinct operation (CRUD, search, validate, history/undo, format conversion). There are no redundant or filler tools.

Completeness4/5

The surface covers a full lifecycle: create (add), read (get/list/find), update (set), remove (delete), plus validation (check), history and single-block undo (history/revert), and format conversion (to) — richer than typical CRUD. Minor gaps remain, such as no explicit new-document creation or block-move operation, but these are largely workable via add/set.

Maintenance

ActivityActive
ResponsivenessWithin a week