Skip to main content
Glama

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

Find the blocks that hold some text

geml_find
Read-only

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.

Input Schema

NameRequiredDescriptionDefault
caseNoMatch case exactly (default: case-insensitive)
headNoAdd the matching line as a third column
nameNoThe 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.
sourceYesThe document's full text. This server keeps no files: what you send is the document.
withinNoOptional: 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`.
patternYesText to look for inside block bodies

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description adds genuinely new behavioral facts: no match yields an empty result rather than an error, matching is substring and case-insensitive by default, the address is the innermost containing block, and cross-document `[[...#id]]` references cannot resolve in a stateless server and surface as `unresolvable-document`.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and scope, then progressively less essential detail; little is wasted since the statelessness note and error semantics are operationally important. The long compound sentences and heavy backtick/semicolon use make it denser than it needs to be, but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 6 parameters, no output schema, and no enum constraints, the description carries the full burden and does so: it defines the return row format, no-match behavior, error token, and the stateless source/document contract. An agent can invoke and interpret results without further inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline is 3, but the description adds semantics the schema does not carry: the innermost-block resolution rule, the effect of the implied search scope (contrast with `within`), and the case-insensitive default that `case` overrides. These clarify parameter behavior rather than restating field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search block CONTENT in the document') plus the exact output shape ('each hit is one `<name>\t<address>` row'). It explicitly distinguishes itself from the sibling geml_list by contrasting 'what a document contains' with 'which block holds the words'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative (geml_list) and the condition that selects this tool instead, and further routes the agent downstream by saying the returned address 'pastes straight into geml_get or geml_set'. The when-not case (a block matching many lines is reported once, no line numbers) is also stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.