_ registry / mcp streamable-http · checked 1h ago

geml

https://geml-mcp.supermarket.workers.dev

Registry code: 68747b826b334cec

api record

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

from a public catalogue that lists it, not from the operator

endpoint
https://geml-mcp.supermarket.workers.dev/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is geml live?
Yes — it answered the hub's last check (checked 1h ago). It answered 100% of checks over the last 30 days.
Is geml free to use?
Yes — the hub reached it with no key and no payment.
What tools does geml have?
9 tools: geml_list, geml_to, geml_set, geml_add, geml_delete, geml_rename, geml_check, geml_find, ….
Is geml safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
105ms

last good check

priced tools
0

of 9 tools

_ answered our checks, 90 days 1 checks · signed record
  • unknown → live
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

inferred, not observed

Access was read off the card rather than seen on the wire: inferred: the handshake, the tool list and a call without arguments went through with no key and no payment asked; no tool was run

_ what it can do 9 tools
9 never probed 0 of 9 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • geml_list unknown never probed

    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`.

    mcp-tool

    {
      "type": "object",
      "required": [
        "source"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "The document's file name, e.g. notes/spec.geml or README.md — it decides whether the text is read as GEML or as Markdown (a `.md` name), and it is how the document is called in messages. Default: document.geml."
        },
        "source": {
          "type": "string",
          "description": "The document's full text. This server keeps no files: what you send is the document."
        },
        "within": {
          "type": "string",
          "description": "Optional: only look inside the blocks this selector names, e.g. `#install` for a section or `=== table` for every table. It takes the same selector forms as geml_get's `id`."
        }
      }
    }
    arguments 20 lines
  • geml_to unknown never probed

    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`.

    mcp-tool

    {
      "type": "object",
      "required": [
        "source"
      ],
      "properties": {
        "to": {
          "enum": [
            "json",
            "md",
            "geml",
            "html"
          ],
          "type": "string",
          "description": "Target format. Default is the CLI's: a GEML input becomes json, a Markdown input becomes geml. `html` is a whole page — large, and not writable from here."
        },
        "from": {
          "enum": [
            "geml",
            "md",
            "json"
          ],
          "type": "string",
          "description": "Override the input format, which is otherwise inferred from the extension (.md -> md, .json -> json, else geml)."
        },
        "name": {
          "type": "string",
          "description": "The document's file name, e.g. notes/spec.geml or README.md — it decides whether the text is read as GEML or as Markdown (a `.md` name), and it is how the document is called in messages. Default: document.geml."
        },
        "source": {
          "type": "string",
          "description": "The document's full text. This server keeps no files: what you send is the document."
        }
      }
    }
    arguments 35 lines
  • geml_set unknown never probed

    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`.

    mcp-tool

    {
      "type": "object",
      "required": [
        "source",
        "id",
        "body"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Which block to replace: an id (with or without `#`), a `@<hex>` content address from `geml_list` for a block with no id, or `L27`/`L27-58` for the smallest block holding those lines. Must match exactly one block"
        },
        "body": {
          "type": "string",
          "description": "The replacement text"
        },
        "name": {
          "type": "string",
          "description": "The document's file name, e.g. notes/spec.geml or README.md — it decides whether the text is read as GEML or as Markdown (a `.md` name), and it is how the document is called in messages. Default: document.geml."
        },
        "part": {
          "enum": [
            "whole",
            "head",
            "intro",
            "body"
          ],
          "type": "string",
          "description": "What to replace (default: whole). `intro` replaces a section's opening — everything under the heading up to its first subheading — and leaves every subsection byte-identical, which is what makes a read-edit-write cycle on a long section safe. An empty intro (a subheading follows the heading immediately) is written into, so this also adds an opening where there was none."
        },
        "source": {
          "type": "string",
          "description": "The document's full text. This server keeps no files: what you send is the document."
        }
      }
    }
    arguments 36 lines
  • geml_add unknown never probed

    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`.

    mcp-tool

    {
      "type": "object",
      "required": [
        "source",
        "content",
        "position"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "The document's file name, e.g. notes/spec.geml or README.md — it decides whether the text is read as GEML or as Markdown (a `.md` name), and it is how the document is called in messages. Default: document.geml."
        },
        "anchor": {
          "type": "string",
          "description": "The block the insertion is relative to — an id, or any address geml_list prints; it must name one block. Required for before/after"
        },
        "source": {
          "type": "string",
          "description": "The document's full text. This server keeps no files: what you send is the document."
        },
        "content": {
          "type": "string",
          "description": "The GEML fragment to insert"
        },
        "position": {
          "enum": [
            "append",
            "before",
            "after"
          ],
          "type": "string",
          "description": "Where to insert"
        }
      }
    }
    arguments 35 lines
  • geml_delete unknown never probed

    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`.

    mcp-tool

    {
      "type": "object",
      "required": [
        "source",
        "ids"
      ],
      "properties": {
        "ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "The blocks to remove: ids or addresses"
        },
        "name": {
          "type": "string",
          "description": "The document's file name, e.g. notes/spec.geml or README.md — it decides whether the text is read as GEML or as Markdown (a `.md` name), and it is how the document is called in messages. Default: document.geml."
        },
        "source": {
          "type": "string",
          "description": "The document's full text. This server keeps no files: what you send is the document."
        }
      }
    }
    arguments 24 lines
  • geml_rename unknown never probed

    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`.

    mcp-tool

    {
      "type": "object",
      "required": [
        "source",
        "old",
        "new"
      ],
      "properties": {
        "new": {
          "type": "string",
          "description": "New id"
        },
        "old": {
          "type": "string",
          "description": "Current id"
        },
        "name": {
          "type": "string",
          "description": "The document's file name, e.g. notes/spec.geml or README.md — it decides whether the text is read as GEML or as Markdown (a `.md` name), and it is how the document is called in messages. Default: document.geml."
        },
        "source": {
          "type": "string",
          "description": "The document's full text. This server keeps no files: what you send is the document."
        }
      }
    }
    arguments 26 lines
  • geml_check unknown 1h ago

    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`.

    mcp-tool

    {
      "type": "object",
      "required": [
        "source"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "The document's file name, e.g. notes/spec.geml or README.md — it decides whether the text is read as GEML or as Markdown (a `.md` name), and it is how the document is called in messages. Default: document.geml."
        },
        "source": {
          "type": "string",
          "description": "The document's full text. This server keeps no files: what you send is the document."
        }
      }
    }
    arguments 16 lines
  • geml_find unknown 1h ago

    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`.

    mcp-tool

    {
      "type": "object",
      "required": [
        "source",
        "pattern"
      ],
      "properties": {
        "case": {
          "type": "boolean",
          "description": "Match case exactly (default: case-insensitive)"
        },
        "head": {
          "type": "boolean",
          "description": "Add the matching line as a third column"
        },
        "name": {
          "type": "string",
          "description": "The document's file name, e.g. notes/spec.geml or README.md — it decides whether the text is read as GEML or as Markdown (a `.md` name), and it is how the document is called in messages. Default: document.geml."
        },
        "source": {
          "type": "string",
          "description": "The document's full text. This server keeps no files: what you send is the document."
        },
        "within": {
          "type": "string",
          "description": "Optional: only look inside the blocks this selector names, e.g. `#install` for a section or `=== table` for every table. It takes the same selector forms as geml_get's `id`."
        },
        "pattern": {
          "type": "string",
          "description": "Text to look for inside block bodies"
        }
      }
    }
    arguments 33 lines
  • geml_get unknown 1h ago

    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`.

    mcp-tool

    {
      "type": "object",
      "required": [
        "source",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "What to read: a block id (with or without `#`), a `## Heading` line (its whole section), `=== type` for every block of a type, `=== code {lang=py}` or `{.warn}` for every block carrying those attributes, a `@<hex>` content address for a block with no id, or `L27`/`L27-58` for the smallest block holding those lines — the forms `geml_list` prints, plus the line numbers an editor or a diff hunk speaks"
        },
        "name": {
          "type": "string",
          "description": "The document's file name, e.g. notes/spec.geml or README.md — it decides whether the text is read as GEML or as Markdown (a `.md` name), and it is how the document is called in messages. Default: document.geml."
        },
        "part": {
          "enum": [
            "whole",
            "head",
            "intro",
            "body"
          ],
          "type": "string",
          "description": "How much of the block to return (default: whole). For a SECTION these cut it three ways: `head` is the heading line, `intro` everything under it up to its first subheading, `body` everything under it — so `body` always contains `intro`, and equals it when the section has no subheading. Reach for `intro` to read a section's opening without pulling its subsections into the conversation; a whole `#id` on a top-level heading is often the entire document. Only a heading has an intro. `body` is usually what you want together with `view`."
        },
        "view": {
          "type": "boolean",
          "description": "Read THROUGH an `embed` block to the entity block it stands for, following a multi-layer chain to its end. An `embed` has no content of its own, so this is the only way to see what it points at; on any other block it changes nothing. Returns {from, content}: `from` names the document the content actually came from, and its references and relative paths resolve against THAT document, not this one."
        },
        "source": {
          "type": "string",
          "description": "The document's full text. This server keeps no files: what you send is the document."
        },
        "within": {
          "type": "string",
          "description": "Optional: only look inside the blocks this selector names, e.g. `#install` for a section or `=== table` for every table. It takes the same selector forms as geml_get's `id`."
        }
      }
    }
    arguments 39 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 68747b826b334cec.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/68747b826b334cec/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/68747b826b334cec/badge.svg)](https://brick.blue/agent/68747b826b334cec?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.