Skip to main content
Glama
ianderso
by ianderso

gramps-evidence-mcp

CI PyPI

An MCP server that gives an AI assistant read/write access to a Gramps genealogy tree, plus a read-only "reference layer" over legacy GEDCOM exports.

83 tools, built around evidence discipline. The premise is that an assistant turned loose on a family tree will happily invent a plausible ancestor, so the write paths here are shaped to make every claim carry its source: facts are created with citations attached, uncite deletes what it orphans, parent-child links are cited independently because one citation object cannot carry two confidences, and an audit set — list_unsourced_facts, get_backlinks, find_duplicates, and server-side queries through query_objects and query_records — exists to find the places where that discipline slipped.

Legacy trees (Ancestry / FamilySearch exports) are consulted through the read-only reference layer as untrusted hints, never a source of truth.

The server is a REST client of Gramps Web (gramps-webapi). It never touches the Gramps database files directly — see How it connects.

Living-person privacy filtering is on by default — see Privacy.

This is an independent project. It is not made, endorsed or supported by the Gramps project.


Contents


Related MCP server: Gramps MCP

How it connects

The server speaks HTTP to gramps-webapi and never opens the Gramps database files. The API server is the sole owner of the database, so this server and the Gramps Web frontend can both write without contending for the desktop app's exclusive lock. The package imports no gramps.gen.* module and needs no sys.path surgery.

One caveat: side by side means the Gramps Web frontend and this server, both talking to the same gramps-webapi. It does not mean pointing the Gramps desktop app at the same database file that gramps-webapi is serving -- that reintroduces the two-writer problem. Treat the Gramps Web tree as the source of truth and round-trip with the desktop app through export/import.

See docs/ARCHITECTURE.md for the layer breakdown.


Setup

You need a running Gramps Web instance, and uv to run the server.

Option A — you already run Gramps Web

If Gramps Web is already up anywhere you can reach, you don't need the bundled docker-compose. Just point the MCP at it:

  1. Note the API base URL, e.g. http://gramps.example.org:5000. The REST API lives under …/api.

  2. Create a dedicated MCP user with at least the editor role (writes need editor; owner also works). From a shell on the Gramps Web host / container:

    gramps-web user add mcp 'A_STRONG_PASSWORD' --fullname 'MCP client' --role 3

    (On the official image the wrapper is gramps-web; the underlying command is python3 -m gramps_webapi user add ….)

  3. Put the URL + credentials in your environment (see Configuration).

Option B — run Gramps Web locally with the bundled compose

A ready-to-go stack is in docker/docker-compose.yml: SQLite backend, bind-mounted data and media directories (a plain directory tree you can copy or back up like any other), and host port 5555 → container 5000. Port 5555 avoids macOS's AirPlay Receiver, which occupies 5000.

docker compose -f docker/docker-compose.yml up -d

Then create the first owner (browser wizard at http://localhost:5555, or CLI) and the dedicated MCP editor user:

docker compose -f docker/docker-compose.yml exec grampsweb \
    gramps-web user add owner 'OWNER_PW' --fullname 'Owner' --role 4
docker compose -f docker/docker-compose.yml exec grampsweb \
    gramps-web user add mcp 'MCP_PW' --fullname 'MCP client' --role 3

The tree named by GRAMPSWEB_TREE (default MyTree) is created on first start.

Install the MCP server

uvx gramps-evidence-mcp

That runs the server over stdio, which is how an MCP client starts it. You normally put it in the client's configuration (below) rather than running it yourself.


Configuration

Secrets live in the environment; everything else in a TOML file. The TOML file therefore never contains credentials.

Environment variables

Set them in the client configuration, or in a .env file in the directory the server starts in (see .env.example). Real environment variables win over the file.

Var

Meaning

GRAMPS_MCP_API_URL

Base URL of gramps-webapi, e.g. http://gramps.example.org:5000

GRAMPS_MCP_USERNAME

The dedicated MCP user

GRAMPS_MCP_PASSWORD

Its password

GRAMPS_MCP_CONFIG

Path to the TOML config (default ./gramps_mcp.toml, from the working directory)

GRAMPS_MCP_EXPOSE_PRIVATE

Override the TOML expose_private flag

GRAMPS_MCP_TRANSPORT

stdio (default) or http — see Remote access

GRAMPS_MCP_HOST, GRAMPS_MCP_PORT

Where http listens (default 127.0.0.1:8090)

TOML file (see gramps_mcp.example.toml)

[server]
expose_private = false          # see Privacy below

[[reference]]
path  = "~/gedcoms/export_one.ged"
label = "Ancestry (one branch)"
trust = "User-built; many hints unsourced. Verify everything."

A desktop client starts the server in a directory of its own choosing, so give GRAMPS_MCP_CONFIG as an absolute path.


Client configuration

Claude Desktop — add to claude_desktop_config.json (on macOS, ~/Library/Application Support/Claude/):

{
  "mcpServers": {
    "gramps": {
      "command": "uvx",
      "args": ["gramps-evidence-mcp"],
      "env": {
        "GRAMPS_MCP_API_URL": "http://gramps.example.org:5000",
        "GRAMPS_MCP_USERNAME": "mcp",
        "GRAMPS_MCP_PASSWORD": "MCP_PW",
        "GRAMPS_MCP_CONFIG": "/path/to/gramps_mcp.toml"
      }
    }
  }
}

Claude Code:

claude mcp add gramps \
    -e GRAMPS_MCP_API_URL=http://gramps.example.org:5000 \
    -e GRAMPS_MCP_USERNAME=mcp -e GRAMPS_MCP_PASSWORD=MCP_PW \
    -e GRAMPS_MCP_CONFIG=/path/to/gramps_mcp.toml \
    -- uvx gramps-evidence-mcp

Any other MCP client that launches stdio servers works the same way: the command is uvx gramps-evidence-mcp, with the variables above in its environment. Restart the client after editing its configuration.

To run from a clone instead, replace uvx gramps-evidence-mcp with uv --directory /path/to/gramps-evidence-mcp run gramps-evidence-mcp.


Remote access (Claude web / mobile)

The configuration above uses the stdio transport: the client launches the server as a local subprocess. Claude web (claude.ai) and the mobile apps can't do that — they connect to a remote server over HTTPS using the Streamable HTTP transport, added as a Custom Connector. Three differences to plan for:

  1. Transport must be HTTP, not stdio.

  2. Reachability — Anthropic's servers dial out to yours, so it needs a public HTTPS URL. A LAN address like http://192.168.1.50:5000 won't work.

  3. Auth — it's write access to a database of living relatives, so it must sit behind authentication. The server has none of its own. Never expose it authless.

If you don't specifically need a browser/phone, a desktop client already gives you the same models with this server working locally (stdio, no public exposure). The steps below are only for genuine remote access.

1. Serve it over HTTP

GRAMPS_MCP_TRANSPORT=http uvx gramps-evidence-mcp

That serves the MCP endpoint at http://127.0.0.1:8090/mcp; GRAMPS_MCP_HOST and GRAMPS_MCP_PORT change where. The other GRAMPS_MCP_* variables apply as before.

Bound to a loopback address, the server accepts only requests whose Host is localhost or 127.0.0.1 — the MCP SDK's protection against DNS rebinding. A tunnel or proxy on the same machine must therefore send Host: localhost (cloudflared's httpHostHeader setting does this). In a container, bind 0.0.0.0 instead, as below, and let the container network do the isolating.

2. Deploy it next to Gramps Web

Run it in a container on the same host as Gramps Web so it talks to the API over the internal network. A minimal Dockerfile:

FROM python:3.13-slim
RUN pip install uv
ENV GRAMPS_MCP_TRANSPORT=http GRAMPS_MCP_HOST=0.0.0.0 GRAMPS_MCP_PORT=8090
EXPOSE 8090
CMD ["uvx", "gramps-evidence-mcp"]

Add it to your Gramps Web compose (same network), pointing at the API by service name and reading secrets from the environment:

  gramps_evidence_mcp:
    build: /path/to/dockerfile-dir
    restart: unless-stopped
    environment:
      GRAMPS_MCP_API_URL: "http://grampsweb:5000"   # internal service name
      GRAMPS_MCP_USERNAME: "mcp"
      GRAMPS_MCP_PASSWORD: "${MCP_PW}"
    # no host port needed if the tunnel (below) runs in the same compose network

3. Expose it publicly with TLS

A reverse tunnel avoids port-forwarding and gives you TLS and a stable hostname. Any of these work:

  • Cloudflare Tunnel — run cloudflared alongside the server and route a hostname such as https://gramps-mcp.example.org → http://gramps_evidence_mcp:8090.

  • Tailscale Funnel — public HTTPS over your own tailnet.

  • ngrok http 8090 for a quick throwaway test.

Or terminate TLS yourself with any reverse proxy in front of port 8090.

4. Put auth in front

claude.ai custom connectors speak the MCP OAuth 2.0 flow. Put an identity proxy in front of the tunnel hostname — Cloudflare Access, Authelia, oauth2-proxy and similar all tie into the OAuth flow the connector expects. The server does not authenticate callers itself; see docs/ROADMAP.md.

5. Add the connector in claude.ai

Settings → Connectors → Add custom connector → paste https://gramps-mcp.example.org/mcp, complete the auth prompt, and the 83 tools appear in chat. (Custom connectors require a paid Claude plan; on Team/Enterprise an admin may need to enable them.)

Security reminder: this endpoint can create, edit, and delete records in a tree containing living people. Keep it behind auth, prefer a private tunnel over an open port, and consider a Gramps Web user with a read-only role if you only need lookups remotely — the server's write tools then fail with a permission error instead of writing.


The evidence model & transactions

The server enforces the Gramps evidence model:

Repository  →  Source  →  Citation  →  fact (Event / Attribute)

Every fact-recording write requires a citation. You either reference an existing citation/source or create one inline. The only way to record a fact without a citation is to explicitly pass require_citation=False, which stamps the event with an UNSOURCED=true attribute so list_unsourced_facts can find it later. Confidence levels map to Gramps' 0–4 scale (very_low, low, normal, high, very_high).

How writes map to DbTxn transactions

gramps-webapi wraps every object create/update in its own server-side DbTxn (labelled New Person, Edit Event, …), so all writes go through proper transactions and stay in Gramps' undo history. A composite operation (e.g. add_person with a cited birth) is performed as an ordered sequence of these object writes — source → citation → event → person — with references wired up as it goes.

Design note (documented deviation): gramps-webapi also offers a raw POST /api/transactions/ endpoint that can bundle several objects into a single DbTxn with a custom description. We intentionally don't use it, because that endpoint bypasses the server-side helpers that (a) auto-assign handle and gramps_id and (b) coerce English type strings ("Birth") into internal Gramps type dicts. Using it would force this client to reimplement Gramps' ID allocation and type internals and to invent gramps_ids, risking a desynced ID counter. The per-object-transaction approach is safer and keeps undo coherent; the trade-off is that one logical add appears as a few undo entries rather than one.


Privacy

The tree contains living people. With expose_private = false (the default), bulk output leaves out anyone private or probably living:

  • Probably living means born less than 110 years ago with no recorded death — or with neither a birth nor a death recorded, which errs toward privacy. A death event counts as recorded even without a date. 110 is the conventional genealogical "presumed dead" cutoff; it does not permanently hide clearly historical people.

  • Private means the Gramps private flag, on a record of any type.

What that means tool by tool:

Output

A private or probably-living person…

search_people, get_ancestors, get_descendants, query_objects, query_records

…appears as a redacted stub: ids only, no name or facts, so it can still be fetched deliberately. A query_records family row is judged by both parents.

list_unsourced_facts across the whole tree

…has their facts left out and counted, and appears once as a stub.

find_duplicates

…is left out. A namesake group is reported only while two historical people remain in it.

get_timeline, consolidated_timeline

…has their events left out and counted when they are folded in as a relative. The people you name are shown; a family's own members are judged like relatives, so a living couple's family timeline comes back empty.

get_facts

…is excluded by the server before it computes anything.

run_report

…is left out of any report that has the options for it — 21 of Gramps' 25 reports have living_people, and 24 incl_private: they are sent as "Not included" and false unless you pass either. Gramps' own default includes both. The result's privacy_options shows what was applied.

consult_reference

…is left out of the matches and counted. Exports from Ancestry and similar sites privatize nobody.

A lookup by id is not filtered. get_person, get_object, the other typed getters, and list_unsourced_facts for one named person answer in full. This is a personal tool the tree's owner runs against their own data: the goal is to prevent accidental bulk leakage — search dumps, tree walks, shared reports — not to lock the owner out. Asking for one record by id is a deliberate act.

Writes are never filtered. Adding, citing, editing, merging and deleting work on living and private people like anyone else.

Ask, and one call shows everyone. Every tool in the table takes include_private. Passed as true, that call answers in full — living people, private records, Gramps' own report defaults — and the next call is filtered again. It is meant for when you ask for living relatives by name ("list my cousins born after 1950"), and the tool descriptions tell the assistant so. Each use is logged with the tool's name, never the records.

Not filtered, by design or by limitation:

  • export_backup is a lossless backup, and a backup that drops living people cannot restore the tree.

  • verify_tree returns Gramps' own findings as it words them.

  • get_dna_matches answers for the person you name, but each match is another person — usually a living one — identified by handle, with segment data.

  • Events, citations, notes and media are judged by their own private flag only. An event row carries no link back to its person, so a living person's birth event is visible to an event query unless the event itself is private.

  • Timeline entries are judged by their person, not by the event's own private flag, which the timeline endpoint does not report.

  • A stub still says that a record matched. A query for a name and a birth year that returns a stub confirms that the id is a person fitting both. The filter prevents accidental disclosure, not a determined search.

To turn the filter off for every call instead, set expose_private = true in the TOML file or GRAMPS_MCP_EXPOSE_PRIVATE=true in the client's configuration — for a full audit, or a tree with no living people in it. That reduces privacy protection for everything the assistant reads.

Logs never contain record contents — only handles, ids, and operation names. Request URLs are kept out of the log too, because a query filter travels in one.


Tool reference

83 tools. Every tool that mutates the tree re-fetches the whole object before PUTting it back — edits through service._mutate() — see the keys= trap.

Every tool declares MCP annotations saying whether it only reads, adds, or changes and removes, so a client can approve reads automatically and ask before the rest. 43 tools only read.

Unknown parameters are refused. A misspelt or invented argument is an error that lists the parameters the tool does take. It is not silently dropped, which used to turn query_objects(query=...) — the parameter is gql — into an unfiltered listing of the first 200 objects.

Create

Tool

Purpose

add_person

Create a person, optionally with cited birth/death events.

add_family

Link parents + children with an optional cited marriage.

add_event_to_person

Add a cited event (residence, census, occupation…) to a person.

add_event_to_family

Add a dated/placed event (marriage, divorce…) to a family.

add_child_to_family

Add an existing person as a child of an existing family.

add_alternate_name

Add a non-primary name (AKA, married name, nickname) to a person.

add_source

Create a Source (record set, book, certificate), optionally in a repository.

add_citation

Create/reuse a standalone Citation on a Source.

add_repository

Create a Repository (archive, library, cemetery, website).

add_place

Create a place deliberately, typed and parented, instead of letting one appear as a side effect of naming it in an event.

add_note

Create a note, optionally attached to an object. Re-reads the target and returns verified: false rather than claiming an attachment it can't demonstrate.

add_media

Upload an image, PDF, audio or video file as a standalone Media object; reuses an identical file by md5.

attach_media

Link a file (uploading it) or an existing Media object to an object.

add_attribute

Add a typed key/value attribute (Attribute on objects, SrcAttribute on sources/citations).

add_url

Add a web URL to a person, place or repository.

add_dna_match

Record a DNA match as evidence: stored as Gramps Web stores one, cited to the test that found it. Refuses segment data that does not parse, and a second record of the same pair.

Cite — attaching evidence to a claim

Tool

Purpose

cite_event

Attach a citation to an event that already exists.

cite_object

Attach a citation to any object that carries one — notably a family.

cite_child_link

Cite the parent-child link itself. Always mints the link its own citation, because one citation object cannot carry two different confidences.

uncite

Detach a citation, deleting it if that leaves it orphaned. Always delete — detach-without-delete has produced orphan debris twice.

Edit — correcting what is already there

Tool

Purpose

update_citation

Locator, confidence, date — or re-point the citation at a different source.

update_event

Date, place, description, type.

update_source

Title, author, pubinfo, abbrev.

update_media

Description, date, path.

update_person

Gender, primary name (the old one is kept as an alternate), privacy flag.

update_object_fields

Scalar fields on anything else (places, notes, repositories). Structural lists are refused.

update_place

Place type, parent enclosure, name, title, coordinates. The parent must already exist (never minted from a name), cycles are refused, and multi-entry dated enclosures are refused rather than flattened.

update_url

Edit or remove ONE existing URL entry on a person/place/repository, matched by substring — must match exactly one. The fix for a link filed under the wrong type.

link_repository

Link an existing source to an existing repository, with call number and medium.

tag_object

Attach a named Tag to an object, creating the tag if it doesn't exist.

set_private

Set or clear the Gramps private flag on an object.

merge_objects

Merge duplicates via the server's own merge, inside one transaction. Dry-run by default.

detach_object

Remove an event/media/note/tag/child reference; optionally delete if orphaned.

delete_object

Permanently delete an object by handle or Gramps ID.

Read

Tool

Purpose

get_person

Full detail: name, gender, events (+ citation counts), families, media.

get_family

Relationship, parents, children, event count.

get_event

Type, date, place, description, citation count.

get_source

Title, author, pubinfo, abbrev — and its real citation count.

get_repository

Name, type, URLs, and the sources it holds.

get_object

Raw record for any type. Returns the record as stored, which is what an edit needs.

get_place

Name, title, type, enclosure chain, coordinates, URLs.

get_citation

Page, confidence, date, source — and cited_by_count, where zero means orphan debris.

get_note

Type and full text. Notes hold reasoning, so nothing is truncated.

get_media

Path, mime, checksum, and how many objects reference it.

consolidated_timeline

One timeline merging several people or families — a household moving through censuses together.

get_timeline

Chronological events for a person or family, each with age, citation count and best confidence, plus an uncited_count.

get_relationship

How two people are related, in words and in generation distances. all_paths for a tree where the answer is not unique.

assess_living

The server's own living/dead verdict, walking relatives, with optional estimated dates and reasoning.

event_span

Elapsed time between two events — the arithmetic behind every age-at-event check.

get_facts

Record-holders — oldest at death, youngest parent, most children — across the tree, or across one person's ancestors or descendants. An implausible holder is usually a data error.

get_dna_matches

DNA matches with total and largest shared centiMorgans, and any common ancestor identified. unattributed_count is the open research.

get_ydna

Y-DNA haplogroup, broadest clade to terminal. Speaks to the direct paternal line only.

parse_dna_segments

Parse pasted shared-segment data into segments and totals. Reports a parse failure as such, rather than as an absence of shared DNA.

get_researcher

Researcher details, which travel inside every export.

list_reports

The 25 reports Gramps can generate: Ahnentafel, descendant, family group, kinship, fan and relationship charts, statistics, end-of-line.

get_report_options

One report's default options. Reports take a whole option dict, so this is what an override merges over.

run_report

Generate a report. Living people and private records are left out unless you ask for them.

search_people

Name substring + optional birth-year range (privacy-filtered).

get_ancestors / get_descendants

Walk the tree N generations (privacy-filtered).

list_tags

Every tag with handle, name and colour.

list_object_types

The tree's type vocabularies (an unknown type string becomes a new custom type).

Audit

Tool

Purpose

query_objects

Filter any collection server-side with GrampsQL. The workhorse for audits — read the syntax traps below.

get_backlinks

What references this object — the only correct way to ask "is this source cited?".

find_duplicates

Candidate duplicates by strategy: media_checksum, source_title, citation_page, vital_events, person_name.

list_unsourced_facts

Events with no citation, or tagged UNSOURCED.

db_stats

Counts of people/families/events/citations/etc.

query_records

The structured query engine. Indexed columns, json_path into the stored object, relationship traversal, regex/like/in, ordering, keyset paging. The only way to filter events by type.

list_event_types

The tree's event type vocabulary with the integers it stores. An unexpected name here is usually a typo Gramps accepted as a custom type.

list_filter_rules

Gramps' filter-rule vocabulary — "is a descendant of", "has a common ancestor with" — which neither GrampsQL nor query_records can express.

list_custom_filters

Saved filters on this instance, reusable by name.

create_filter

Save a reusable selection built from those rules.

delete_filter

Delete a saved filter. Touches the definition only.

verify_tree

Gramps' own genealogical plausibility checks — a mother at nine, a 120-year marriage, an unparseable date. A different audit from the citation sweeps.

ocr_media

OCR a document image server-side (tesseract, 43 languages). A finding aid, not evidence — read the image before citing it.

Ops

Tool

Purpose

export_backup

Full-tree Gramps XML dump to a new file; never replaces one. Run this before any bulk write.

list_transactions

Recent writes: what changed, when, by which user. Also how you check whether another session is writing.

undo_transaction

Undo a transaction, after a conflict check. Dry-run by default. Returns a task_id.

list_tasks

Recent background jobs for this tree, newest first.

get_transaction

One transaction in full, including the objects it changed. Read before undoing.

get_task

Whether a background job finished, and whether it worked. Undo, verification and reindex all dispatch to a worker.

reindex_search

Rebuild the full-text index. Nothing refreshes it after writes, so search_text silently misses anything added since.

Reference layer (read-only, never touches the tree)

Tool

Purpose

consult_reference

Look a person up in the legacy GEDCOM exports as an untrusted hint. See Reference layer.

Querying with GrampsQL

query_objects filters in the database rather than pulling a collection and sifting it in Python. The syntax has traps, verified against gramps-webapi 3.21.1:

  • Equality is a single =. page == "" is a parse error.

  • ~ is substring: description ~ "1871".

  • .length works on any list: media_list.length = 0.

  • A field the object does not have matches nothing, without an error. A zero count can mean a misspelt field.

  • type is such a field on events. type = "Birth" matches nothing, silently, on a tree with hundreds of births. Use query_records with event_type instead.

  • A source has no citation_list — citations point at sources. Use get_backlinks to find uncited sources. Querying citation_list on sources matched every source on 3.20.1 and matches none on 3.21.1.

  • Booleans compare as integers: private = 1, not private = true.

Useful ones:

citations   confidence >= 3 AND page = ""     high-confidence claims with no locator
sources     media_list.length = 0             documents with no image attached
media       desc = ""                         media nothing identifies

Every tool has an LLM-facing docstring explaining when to use it, parameter semantics, and good citation practice.


Reference layer (legacy GEDCOMs)

consult_reference searches the GEDCOM files listed in your TOML config and returns, per file, matching individuals and their claimed facts. Crucially, each fact is flagged whether the legacy tree attached a source, with the source text if present — so the assistant can distinguish "Ancestry cites an actual death certificate" from "unsourced guess."

  • Parses GEDCOM 5.5.1, including the Ancestry dialect (_APID, _TREE, …). Custom underscore tags are carried through, not choked on.

  • Files load lazily and their parsed form is cached on disk (keyed by path/size/mtime), so a big export is parsed once.

  • Each file has a trust note surfaced in results.

These are untrusted hints. The intended loop: consult a hint → decide which real record to hunt down → create the fact in the tree citing that record — never copy a hint in as if it were sourced.

Your real GEDCOMs are never committed (.gitignore excludes *.ged except the synthetic test fixture).


Worked example: a person, with a cited birth

You: Add Martha Ellery, female, born 12 Jan 1890 in Columbus, Ohio. I have her birth certificate (Ohio certificate #12345); cite it at very-high confidence.

The assistant calls one tool:

add_person({
  "given": "Martha", "surname": "Ellery", "gender": "female",
  "birth": {
    "type": "Birth",
    "date": "12 Jan 1890",
    "place": "Columbus, Ohio, USA",
    "citation": {
      "source_title": "Ohio Birth Certificate #12345",
      "page": "certificate no. 12345",
      "confidence": "very_high"
    }
  }
})

Behind the scenes the server: creates the Source "Ohio Birth Certificate #12345" → creates a Citation on it (page + very-high confidence) → finds or creates the Place "Columbus, Ohio, USA" → creates the Birth Event (dated, placed, carrying the citation) → creates the Person referencing that event as their primary birth. It returns the new gramps_id (e.g. I0001).

Ask list_unsourced_facts any time to see what still needs a source. If you add a fact you can't yet source, pass require_citation=false and it'll be tagged UNSOURCED for that audit list.


Development

git clone https://github.com/ianderso/gramps-evidence-mcp
cd gramps-evidence-mcp
uv sync --extra dev
uv run pytest

The suite runs against an in-memory fake of gramps-webapi served through respx, so it needs no Gramps Web instance, and it fails any test that tries to open a real connection. It exercises the tool surface the way a client calls it: every tool's schema, the refusal of unknown arguments, the whole-object write rule across every editing tool, the privacy filter on each bulk output, and the error envelope every tool returns instead of raising.

CONTRIBUTING.md says what a change is expected to carry.


Limitations

  • Built against gramps-webapi 3.20.1 and 3.21.1 (Gramps 6.0). Your instance's /api/openapi.json is authoritative — check it if a call behaves unexpectedly, and see docs/PITFALLS.md for where the API's behaviour has surprised before.

  • No tree selector. On gramps-webapi the tree is bound to the account you authenticate as; no data endpoint takes a tree parameter. To work against a different tree, use credentials belonging to it.

  • Type strings ("Birth", "Married") rely on the server's English/locale type coercion. If your instance runs a non-English default locale, prefer canonical English type names.

  • search_people, list_unsourced_facts and find_duplicates read whole collections. That suits a personal tree of a few thousand people; they are not built for very large databases.

  • get_facts is computed by the server on every call and takes tens of seconds on a tree of under a thousand people; the call is allowed three minutes.


Repository layout

src/gramps_evidence_mcp/    the MCP server
  server.py                 tool definitions (the 83 tools) and the entry point
  service.py                genealogy operations; edits go through _mutate()
  client.py                 gramps-webapi REST client
  mapping.py                Gramps object <-> JSON shapes
  models.py                 Pydantic input models shared by the tools
  privacy.py                living-person assessment and redaction
  gedcom_ref.py             read-only reference layer over legacy GEDCOMs
  config.py                 env vars + TOML
tests/                      against an in-memory fake; no live server needed
docker/                     docker-compose for a local Gramps Web
docs/
  ARCHITECTURE.md           how the server is put together
  PITFALLS.md               gramps-webapi behaviours that have cost real data
  ROADMAP.md                what is planned (nothing), and what is not

docs/PITFALLS.md is required reading before writing a script against gramps-webapi directly. Every item in it was learned by losing something: a keys= PUT that wiped parent links on 65 families, a citation handle reused across two claims that mis-graded 107 parent-child links, and two concurrent sessions that took the write path down for ~18 hours.

Available Tools

83 tools
add_alternate_nameA

Add an alternate (non-primary) name to a person.

Use for maiden/married names, aliases, anglicized forms, or nicknames-of-record. The person's primary name is left unchanged.

ParametersJSON Schema
NameRequiredDescriptionDefault
givenNoGiven/first name(s) for the alternate name.
personYesPerson handle or gramps_id (e.g. 'I0001').
surnameNoFamily name / surname.
nicknameNoNickname.
name_typeNoKind of alternate name, e.g. 'Also Known As', 'Birth Name', 'Married Name'.Also Known As
name_prefixNoSurname prefix, e.g. 'van', 'de'.
name_suffixNoSuffix, e.g. 'Jr.', 'III'.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=false, so safety and repeatability are partly covered. The description adds one useful behavioral fact — 'The person's primary name is left unchanged' — but says nothing about duplicate alternate names, permissions, or what a repeated call does despite idempotentHint being false.

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

Conciseness5/5

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

Three short lines, front-loaded with the action and scope, followed by use cases and the key side-effect. No filler or redundancy.

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

Completeness4/5

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

For a non-destructive mutation tool with full schema coverage and annotations on safety, the description covers purpose, scope, use cases and the primary-name guarantee. Only edge cases (duplicates, repeat calls, error behavior) are unaddressed.

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

Parameters3/5

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

Schema description coverage is 100% across all 7 parameters, so the schema already explains given, surname, nickname, name_type, prefixes/suffixes and the person handle. The description adds no parameter-level detail beyond that, which is the correct baseline when the schema does the work.

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 ('Add') and resource ('alternate (non-primary) name to a person'), and explicitly carves out the non-primary scope so it is distinguishable from update_person or add_person, which handle the primary name.

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

Usage Guidelines4/5

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

The second line enumerates concrete when-to-use cases (maiden/married names, aliases, anglicized forms, nicknames-of-record), giving clear context. It does not, however, name an alternative tool or state when not to use this one (e.g. correcting the primary name).

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

add_attributeA

Add a typed key/value attribute to an object.

Sources and citations use a SrcAttribute; everything else uses an Attribute. The right class is chosen automatically from object_type.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesAttribute type/name, e.g. 'Occupation', 'National ID'.
valueYesAttribute value, e.g. 'Blacksmith'.
targetYesHandle or gramps_id of the object.
object_typeYesType of the object: 'person', 'event', 'family', 'media', 'source', 'citation'.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare the write/non-idempotent/non-destructive profile, so the description's main added value is the internal behavior that the right class (SrcAttribute vs Attribute) is chosen automatically from object_type. It still omits anything about permissions, duplicate attribute names, or failure modes.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core action and followed by the only non-obvious behavioral rule. No filler.

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

Completeness4/5

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

For a 4-required-param mutation tool with full schema coverage and annotations carrying the safety profile, the description covers the action and the object_type→class rule adequately. Gaps around duplicate attributes and error conditions are minor.

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

Parameters3/5

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

Schema coverage is 100%, so all four parameters are already documented in the schema. The description adds one genuinely useful semantic link (object_type drives class selection) but no format or syntax details, so baseline 3 fits.

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

Purpose4/5

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

States a specific verb ('Add') and resource ('typed key/value attribute to an object'), which is clear and actionable. It does not, however, differentiate itself from adjacent mutation siblings such as update_object_fields or cite_object.

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

Usage Guidelines3/5

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

Usage is only implied: 'to an object' and the class-selection note give the agent enough to know it is an attribute-writing tool, but there is no explicit when-to-use vs alternative (e.g. update_object_fields) and no note on prerequisites like target existence or duplicate handling.

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

add_child_to_familyA

Add an existing person as a child of an existing family.

Links the child both ways: a ChildRef is added to the family and the family is added to the child's parent-family list. The child must already exist. Duplicate children are skipped.

ParametersJSON Schema
NameRequiredDescriptionDefault
frelNoRelationship to the father, e.g. 'Birth', 'Adopted', 'Stepchild'.Birth
mrelNoRelationship to the mother, e.g. 'Birth', 'Adopted', 'Stepchild'.Birth
childYesChild person handle or gramps_id.
familyYesFamily handle or gramps_id (e.g. 'F0001').

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare the mutation profile (readOnly=false, destructive=false, openWorld=false), so the description earns credit for going beyond them by explaining the bidirectional side effect (ChildRef on the family plus the family added to the child's parent-family list) and the duplicate-handling rule. The 'duplicate children are skipped' wording sits in mild tension with idempotentHint=false, but it reads as a data-integrity rule rather than a claim of full operation idempotency, so it is not a hard contradiction.

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?

The core action is front-loaded in the first sentence, with side effects and preconditions following in short supporting sentences. It is tight overall, with only a small amount of wordiness in the 'Links the child both ways' sentence.

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

Completeness4/5

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

For a 4-parameter mutation tool with full schema coverage and no output schema, the description covers what is created, the precondition, and duplicate handling. Error behavior (e.g., nonexistent family/child) and permission requirements are unstated, but those gaps are minor.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents family, child, frel, and mrel with examples. The description adds only the 'child must already exist' constraint and implies the family must pre-exist; it adds no format or value details for the two relationship parameters beyond what the schema provides.

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?

The description gives a specific verb (Add) and resource (an existing person as a child of an existing family) that is unmistakably distinct from sibling tools like add_person, add_family, add_event_to_family, or link_repository. An agent can identify the operation without opening the schema.

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

Usage Guidelines3/5

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

It supplies an important precondition ('The child must already exist'), which tells the agent to create the person first via add_person rather than passing new data. However, it never states when to choose this tool over alternatives or explicitly rules any sibling in/out, so usage guidance remains implied.

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

add_citationA

Create a standalone Citation on a Source (or reuse an existing one).

Usually you don't call this directly -- pass a CitationInput to add_person / add_event_to_person / add_family instead, which creates the citation and attaches it to the fact in one step. Use this when you want a reusable citation handle to attach to several facts.

ParametersJSON Schema
NameRequiredDescriptionDefault
citationYesCitation details.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare the write profile (readOnly=false, idempotent=false, destructive=false), so the bar is lower. The description adds real context: this creates a citation that can also spawn a new source, and reuse is preferred over duplication. It does not say what is returned or how to obtain the handle for later reuse, which is the one operational detail left implicit.

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

Conciseness5/5

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

Three short sentences, zero waste; the core action leads and the routing caveat follows immediately. Nothing could be cut without losing guidance.

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

Completeness4/5

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

For a single-param create tool with 100% schema coverage and annotations covering the safety profile, the description is nearly complete. The only gap is not stating that a citation handle is returned (the thing needed to reuse the citation later), which the description itself makes relevant.

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

Parameters3/5

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

Schema coverage is 100% and CitationInput already documents the citation/source/source_title precedence and every field. The description only reinforces the reuse-vs-create duality the schema already states, adding no new syntax or format detail, so the baseline 3 applies.

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?

Specific verb+resource ('Create a standalone Citation on a Source') with the reuse alternative stated in the same sentence. It cleanly separates this tool from the attachment-style siblings (add_person, add_event_to_person, add_family) that are the usual path.

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?

Explicit when-not ('Usually you don't call this directly -- pass a CitationInput to add_person / add_event_to_person / add_family instead') and explicit when-to ('when you want a reusable citation handle to attach to several facts'). The routing decision is fully specified.

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

add_dna_matchA

Record a DNA match as evidence, cited to the test that found it.

Stored as Gramps Web stores a match, so its interface and get_dna_matches read it back. Nothing is written unless the segments parse: unreadable data would otherwise record a match sharing no DNA.

A match proves the two share DNA, not how they are related. Record any relationship separately, with its own evidence.

ParametersJSON Schema
NameRequiredDescriptionDefault
matchYesHandle or gramps_id of the matching person. Add them first if they are not in the tree.
personYesHandle or gramps_id of the tested person, whose results list the match.
citationYesThe test the match came from: source or source_title naming the company and kit, page for where the match is shown, confidence in the match itself. A new citation is always minted.
segmentsYesThe shared segments as the testing company exports them: rows of chromosome, start, stop, centiMorgans, SNPs, comma- or tab-separated, with an optional side of M, P or U. A header row is tolerated.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations declare this is a non-read-only, non-destructive, non-idempotent write, so the safety profile is covered. The description adds genuinely useful behavior not in the annotations: atomic validation ('Nothing is written unless the segments parse'), the storage/interop guarantee that get_dna_matches will read it back, and the always-mint-a-new-citation semantics. It stops short of permissions, error modes, or return shape, so not a 5.

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?

Three short, front-loaded sentences: purpose first, then behavioral guarantee, then a scope caveat. Mostly waste-free, though the explanatory clause 'unreadable data would otherwise record a match sharing no DNA' is slightly verbose relative to the point it makes.

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

Completeness4/5

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

For a four-required-parameter write tool with no output schema and fully documented parameters, the description supplies the rationale, the atomicity guarantee, and the conceptual boundary against relationship recording – enough for correct invocation. A return-value or permission note would close the remaining gap, but nothing essential for calling it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% – the segments, citation, person, and match parameters are all richly documented in the schema itself, including the citation precedence rules and segment format. The description reinforces the citation semantics ('cited to the test that found it') but adds no syntax or format detail beyond the schema. Baseline 3 applies when the schema does the heavy lifting.

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 ('Record a DNA match as evidence, cited to the test that found it') and scopes it clearly against the read-side sibling by noting get_dna_matches reads the stored match back. An agent can distinguish this from get_dna_matches, parse_dna_segments, and get_ydna without opening a schema.

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

Usage Guidelines3/5

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

The description draws a useful boundary ('A match proves the two share DNA, not how they are related. Record any relationship separately'), which implies when this tool is and isn't the right one. However, it never names an alternative tool (e.g. parse_dna_segments for validating raw data) or states prerequisites beyond 'add them first if they are not in the tree' (which lives in the schema). Guidance is implied rather than explicit.

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

add_event_to_familyA

Add a dated/placed event (fact) to an existing family.

Use for family-level facts: marriage, divorce, residence, census. The event is added with the 'Family' role. Cite it to the record establishing the fact.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventYesThe event to add (type, date, place, citation).
familyYesFamily handle or gramps_id (e.g. 'F0001').
require_citationNoRequire a citation (default). False records it UNSOURCED.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare this is a non-read-only, non-destructive, non-idempotent write; the description adds useful context about the 'Family' role assignment and citation practice. It does not mention the require_citation default or that setting it false deliberately records an UNSOURCED fact, nor whether repeat calls duplicate events.

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?

Three short sentences, front-loaded with the action and then the scope constraint and examples; no filler. The final sentence ('Cite it to the record establishing the fact') is a little vague about which record, slightly diluting an otherwise tight definition.

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

Completeness3/5

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

For a 3-parameter mutation tool with no output schema and full schema documentation, the essentials are largely carried by the schema and annotations. However, the description never confirms what a successful call produces or how it interacts with require_citation being false, which is a meaningful behavioral gap for an agent.

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

Parameters3/5

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

Schema description coverage is 100%, so the event type/date/place/citation fields and their resolution rules are already fully documented in the schema. The description only restates the citation habit ('cite it to the record establishing the fact') without adding syntax or precedence detail, which matches the baseline 3 for schema-covered params.

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?

Names a specific verb+resource ('add a dated/placed event to an existing family') and immediately carves out scope ('Use for family-level facts'), which implicitly distinguishes it from the sibling add_event_to_person. An agent can tell what this tool does without opening the schema.

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

Usage Guidelines4/5

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

Explicitly says when to use it (family-level facts) and gives concrete examples (marriage, divorce, residence, census), plus the notable behavior that the event gets the 'Family' role. It stops short of naming add_event_to_person as the alternative for person-level facts, so the routing rule is inferred rather than stated.

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

add_event_to_personA

Add a dated/placed event (fact) to an existing person.

Use for facts beyond birth/death: residence, occupation, census, baptism, immigration, marriage-adjacent events, etc. The event's citation should point at the record establishing the fact. Adding a 'Birth'/'Death' event will set the person's primary birth/death reference if not already set.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventYesThe event to add (type, date, place, citation).
personYesPerson handle or gramps_id (e.g. 'I0007').
require_citationNoRequire a citation (default). False records it UNSOURCED.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare this is a non-read-only, non-idempotent, non-destructive write. The description adds genuinely non-obvious behavior: that adding a 'Birth'/'Death' event will set the person's primary reference if not already set, and that citations should point at the establishing record. It does not mention e.g. duplicate-event handling or error cases for a missing person.

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

Conciseness5/5

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

Three tight sentences with the core action front-loaded, followed by scope and side-effect caveats. No filler or redundancy.

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

Completeness4/5

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

For a mutation tool with full schema coverage and no output schema, the description covers purpose, scope, citation expectation, and a key side effect. It omits any mention of the return value or failure behavior (e.g. nonexistent person handle), a minor gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents person, event.type, date, place, citation, and require_citation. The description only reinforces citation intent and the type-specific Birth/Death side effect, adding marginal value over the structured fields.

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

Purpose4/5

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

States a specific verb (add) and resource (dated/placed event/fact) and scopes it to 'an existing person', which separates it from the sibling add_event_to_family by target entity. It does not explicitly name or contrast with the sibling tool, so it falls just short of a 5.

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

Usage Guidelines4/5

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

'Use for facts beyond birth/death: residence, occupation, census, baptism, immigration...' gives clear positive usage context with concrete examples. There is no explicit when-not or named alternative tool, but the intended context is unambiguous.

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

add_familyA

Create a family linking parents and children, with an optional cited marriage.

All members must already exist (create them first with add_person). Creating the family automatically links each person's family/parent-family lists, so you don't need to update the individuals separately. Cite the marriage event to a marriage record where possible.

ParametersJSON Schema
NameRequiredDescriptionDefault
fatherNoFather: handle or gramps_id.
motherNoMother: handle or gramps_id.
childrenNoChild handles or gramps_ids.
marriageNoOptional marriage event; type defaults to 'Marriage'. Cite it.
relationshipNoFamily relationship type, e.g. 'Married', 'Unmarried', 'Civil Union'.Married
require_citationNoRequire a citation on the marriage event (default).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower. The description still adds genuine behavioral context the annotations cannot convey: the automatic bidirectional linking of family/parent-family lists, the existence prerequisite, and the expectation that the marriage event be cited.

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?

Four sentences, front-loaded with the core action and then the prerequisite, side effect, and citation advice in descending priority. Slightly more text than strictly needed, but each sentence carries distinct information.

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

Completeness4/5

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

For a 6-parameter creation tool with no output schema, the description covers the key gaps: prerequisites, automatic linkage, and citation expectations. It does not say what the return value contains or how missing father/mother are handled, but nothing critical to correct invocation is absent.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter (father, mother, children, marriage, relationship, require_citation) is already documented in the schema, including the CitationInput precedence rules. The description's 'optional cited marriage' and 'cite to a marriage record where possible' add only marginal guidance beyond that, so baseline 3 applies.

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+resource ('Create a family linking parents and children') and immediately scopes it with the optional marriage event. An agent can distinguish this from add_person and add_child_to_family without opening any schema.

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

Usage Guidelines4/5

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

Gives a clear prerequisite ('All members must already exist — create them first with add_person') and tells the agent not to also update individuals separately, which is a real when-to-use cue. It stops short of naming sibling alternatives like add_child_to_family or add_event_to_family explicitly.

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

add_mediaA

Upload a document as a standalone Media object, reusing an identical file already in the tree.

One image, one Media object -- then attach it wherever it belongs with attach_media(media_ref=...) and cite it once per fact it proves. Uploading the same photograph once per person it depicts is the duplicate pattern that later has to be unpicked by hand.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_pathYesLocal path to the image, PDF, audio or video file to upload.
descriptionYesWhat the document IS -- archival identity, not the person it mentions ('1900 US census, Cedar Flat, Brannock Co., Ohio, ED 12 sheet 4A'). Files are stored under checksum names.
dedup_by_checksumNoReuse an existing Media object if the identical file is already in the tree. Leave True.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare the safety profile (not read-only, not destructive, not idempotent). The description adds genuine behavioral context beyond them: identical files are reused rather than duplicated, files are stored under checksum names, and a Media object is meant to be cited once but attached in many places. It does not describe auth requirements or the returned reference explicitly.

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?

The purpose is front-loaded in the first sentence, followed by workflow guidance. The closing sentence about re-uploading the same photograph is slightly editorial but earns its place by motivating the dedup/citation model, so it is not wasted.

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

Completeness4/5

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

For a simple 3-parameter creation tool with full annotation coverage and no output schema, the description covers purpose, dedup behavior, and the downstream attach/cite workflow. The only gap is that the return value (the media reference used by attach_media) is only implied, not stated.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all three parameters, including the dedup_by_checksum default. The description reinforces the dedup semantics ('reusing an identical file already in the tree') but adds no syntax or format detail beyond the schema, so the baseline of 3 applies.

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 ('Upload a document as a standalone Media object') plus the dedup behavior, and implicitly distinguishes itself from attach_media and update_media by framing itself as the creation step. An agent can tell it apart from its siblings without opening the schema.

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

Usage Guidelines4/5

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

Explicitly routes the agent to the follow-up step ('attach it wherever it belongs with attach_media(media_ref=...)') and warns against the duplicate-per-person upload pattern, giving a clear context of use. It stops short of an explicit when-not-to-use rule (e.g., when to use update_media instead), so not a 5.

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

add_noteA

Create a research/general note, optionally attached to an object.

Use notes for research logs, reasoning about conflicting evidence, or transcriptions. Attach to a person/event/source by giving target + target_type.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe note text.
targetNoOptional object handle/gramps_id to attach the note to.
note_typeNoNote type, e.g. 'General', 'Research'.General
target_typeNoType of the target: 'person', 'family', 'event', 'source', 'citation', 'place', 'repository', 'media'.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the description need not restate them. It adds useful context on the attachment mechanism and typical content, but says nothing about required permissions, whether the note is linked atomically, or what happens on failure. Adequate but not rich.

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?

Two sentences, front-loaded with the core action, no filler. The second sentence is slightly loose (use-case examples plus an attachment line) but each clause carries information.

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

Completeness4/5

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

For a create tool with full schema coverage, annotations carrying the safety profile, and no output schema, the description supplies the purpose and attachment semantics an agent needs. Missing only edge details like permission requirements or what the created note's handle looks like.

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

Parameters3/5

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

Schema description coverage is 100%, so both target and target_type are already documented in the schema, and note_type carries its own default and example. The description adds only the relational hint that target + target_type go together, which is marginally beyond the schema. Baseline 3 is correct.

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

Purpose4/5

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

States a specific verb and resource ('Create a research/general note') and clarifies the scope ('optionally attached to an object'), which cleanly separates it from the read-side sibling get_note. It is clear but never explicitly names a sibling tool or the boundary with add_attribute/add_url, so it stops short of a 5.

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

Usage Guidelines4/5

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

Explicitly says when to reach for it ('research logs, reasoning about conflicting evidence, or transcriptions') and how to attach it ('give target + target_type'). There is no when-not guidance or named alternative, so it falls just short of the top band.

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

add_personA

Create a new person, optionally with cited birth and/or death events.

Use this to add someone to the tree. Good practice: attach the birth event with a citation to the specific record that proves it (a birth or baptism certificate, a census entry), setting the citation's confidence honestly. If you only have a legacy-tree hint with no underlying record, either omit the event or set require_citation=False so it's flagged for follow-up.

Returns the new person's handle and gramps_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
birthNoOptional birth event. Include a citation unless recording as unsourced. The event type defaults to 'Birth'.
deathNoOptional death event; type defaults to 'Death'.
givenYesGiven/first name(s), e.g. 'John Robert'.
genderNofemale, male, or unknown.unknown
surnameNoFamily name / surname.
name_prefixNoSurname prefix, e.g. 'van', 'de'.
name_suffixNoSuffix, e.g. 'Jr.', 'III'.
require_citationNoIf True (default), any birth/death event MUST carry a citation or the call fails. Set False to record the event anyway, stamped with the UNSOURCED attribute so list_unsourced_facts can find it later.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare the write/non-idempotent/non-destructive profile, so the bar is lower. The description adds real behavioral value beyond them: the call can FAIL when require_citation is True and no citation is supplied, and the unsourced alternative stamps an UNSOURCED attribute detectable by list_unsourced_facts. It further states the return payload (handle and gramps_id).

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?

Three short paragraphs, front-loaded with the core action before the citation-practice guidance, and every sentence carries actionable content. Slightly more text than strictly needed for a single creation tool, but nothing is filler.

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

Completeness4/5

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

No output schema exists, but the description names the return values, and given the very rich nested input schema the citation workflow is fully covered. Remaining gap: no note on duplicate detection or how this interacts with find_duplicates/merge_objects for a non-idempotent create.

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. The description nonetheless adds operational meaning to require_citation (it is a hard failure gate, not just a flag) and to the citation field (cite the specific record that proves the fact, set confidence honestly), which the schema alone does not convey.

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 ('Create a new person') plus the optional scope (cited birth/death events), which cleanly distinguishes it from siblings like add_family, add_event_to_person, and update_person. An agent can pick this out without opening the schema.

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

Usage Guidelines4/5

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

Gives clear context ('Use this to add someone to the tree') and a decision rule for the citation case vs. the legacy-hint case with require_citation=False. It does not name sibling alternatives such as add_event_to_person for adding events to an existing person, so routing is implied rather than explicit.

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

add_placeA

Create a place deliberately, with a type and a parent.

Use this instead of letting a place appear as a side effect of naming one in an event. That route produces an untyped, unparented place whose title is the bare string you typed, which is how duplicate hierarchies start.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoPostal or FIPS code.
nameYesThe place's own name, e.g. 'Cedar Flat'.
titleNoFull display title, e.g. 'Cedar Flat, Brannock, Ohio, USA'. Defaults to the name. This is what event place matching compares against, so set it properly.
parentNoHandle or gramps_id of an existing enclosing place. Must already exist — it is never created for you.
latitudeNoLatitude, decimal degrees.
longitudeNoLongitude, decimal degrees.
place_typeNoGramps place type: Town, City, County, State, Country, Parish, Cemetery, and so on.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare write/non-idempotent/non-destructive behavior. The description adds genuine context beyond that: the parent must already exist and is never auto-created, and the implicit-event route yields untyped, unparented places that seed duplicate hierarchies. It does not discuss permissions or what the call returns, but the added failure-mode context is valuable.

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-loads the action, then justifies the alternative-route warning in a single flowing sentence. Slightly verbose in the duplicate-hierarchy explanation, but no sentence is pure filler.

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?

For a 7-parameter create tool with full schema coverage, no output schema, and annotations covering the safety profile, the description supplies exactly the missing piece an agent needs: why to call this instead of the implicit route. Nothing required to invoke it correctly is absent.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter is already documented in the schema, including the title/parent semantics. The description only reinforces the type and parent concept generically, adding no syntax or format detail beyond the schema. Baseline 3 is appropriate.

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?

Specific verb ('Create') plus resource ('a place') with the two defining attributes (type, parent) named up front. It also implicitly distinguishes itself from the event-naming route that creates places as a side effect, so an agent can tell what this tool is for.

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

Usage Guidelines4/5

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

Gives an explicit when-to-use rule: use this rather than letting a place appear as a side effect of naming one in an event. It does not mention the sibling update_place or when to prefer editing an existing place over adding one, so it stops short of full alternative routing.

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

add_repositoryA

Create a Repository (an institution or place that holds sources).

Repositories sit at the top of the evidence model: Repository -> Source -> Citation -> fact. Create these for archives, libraries, cemeteries, or websites you'll cite sources from.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoOptional website URL.
nameYesRepository name, e.g. 'National Archives (NARA)'.
repository_typeNoType: 'Library', 'Archive', 'Cemetery', 'Church', 'Website', etc.Archive

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare this is a non-read-only, non-destructive, non-idempotent write, so the safety profile is covered. The description adds conceptual domain context but nothing behavioral beyond the annotations — no mention of duplicate handling (relevant given idempotentHint=false), required permissions, or what the call returns.

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 the core definition, followed by a compact hierarchy note and a usage sentence; nothing is padded. The hierarchy explanation is useful framing rather than filler, though the definition of "Repository" is restated in slightly different words.

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

Completeness4/5

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

For a simple three-parameter create tool with full schema documentation and annotations covering the write-safety profile, the description supplies enough domain framing to call it correctly. It is only slightly short given there is no output schema — the return value (e.g., the new repository identifier) is never described.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters (name, url, repository_type) are already documented in the schema. The description's list of repository kinds loosely overlaps with the repository_type enum examples but adds no format or syntax detail beyond what the schema provides. Baseline 3 is appropriate.

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?

The description gives a specific verb and resource ("Create a Repository") and immediately defines the entity: "an institution or place that holds sources." It also places the entity in the evidence model (Repository -> Source -> Citation -> fact), which distinguishes it from siblings like add_source and add_citation without requiring the agent to open any schema.

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

Usage Guidelines4/5

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

It states clear usage context by enumerating the kinds of things to create repositories for (archives, libraries, cemeteries, websites you'll cite sources from). That tells the agent when this tool applies, but it names no alternative tool or exclusion condition, so it stops short of full routing guidance.

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

add_sourceA

Create a Source (a body of evidence: a record set, book, certificate, website).

In the Gramps evidence model a Source is what you cite through a Citation. Create the source once, then create citations against it for each fact it supports. Optionally link it to a Repository (where the source is held).

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesSource title, e.g. '1900 U.S. Federal Census'.
authorNoAuthor/creator of the source.
repositoryNoRepository handle/gramps_id that holds this source.
call_numberNoCall number / reference within the repository.
abbreviationNoShort abbreviation.
publication_infoNoPublication info (publisher, date, series).

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful domain behavior (a source is created once and reused, repository linkage is optional) but says nothing about duplicate handling or what happens if a similar source already exists, which matters given idempotentHint=false.

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 the imperative verb and resource, and the following sentences each add domain context (evidence model, citation relationship, repository linkage) rather than restating the name. Slightly verbose but no sentence is pure padding.

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

Completeness4/5

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

For a creation tool with a fully documented schema and no output schema, the description supplies the essential domain model an agent needs in Gramps (Source vs Citation, optional Repository). The main omission is duplicate/already-exists behavior, which the annotations leave open.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters are already documented in the schema. The description adds only the optional Repository concept ('where the source is held'), which is a marginal conceptual clarification rather than new format or syntax guidance. Baseline 3 is appropriate.

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 (Create) and resource (Source), then defines the resource concretely as a body of evidence (record set, book, certificate, website). It also positions it against the sibling add_citation by explaining that a Source is cited *through* a Citation, so an agent can distinguish the two without opening schemas.

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

Usage Guidelines4/5

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

Provides clear workflow guidance: create the source once, then create citations against it for each fact, and optionally link a Repository. This implicitly routes the agent to add_citation for the next step. It lacks an explicit when-not-to-use or a named alternative for a different scenario, so it stops short of a 5.

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

add_urlA

Add a web URL to a person, place, or repository.

Only these three object types carry a URL list. For sources/citations, record a web address as an attribute (add_attribute) instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL, e.g. 'https://www.findagrave.com/memorial/123'.
targetYesHandle or gramps_id of the object.
url_typeNoURL type, e.g. 'Web Home Page', 'Web Search', 'E-mail'.Web Home Page
descriptionNoOptional link description.
object_typeYesType of the object: 'person', 'place', or 'repository' only.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=false). The description adds a useful scope constraint about which object types carry URL lists, but that constraint is largely mirrored in the object_type schema field, and it does not explain what happens on duplicate calls or invalid URLs. With annotations covering the main behavioral signals, a 3 is appropriate.

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

Conciseness5/5

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

Two tightly written sentences with no filler. The primary action is front-loaded, and the alternative routing follows immediately, making the description easy to scan.

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

Completeness4/5

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

For a write tool with no output schema and full schema coverage, the description provides the essential routing and scope information, while annotations carry the safety profile. It stops short of warning about duplicate creation (idempotentHint=false) or update scenarios, but nothing critical for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so all five parameters are documented in the schema itself. The description adds no syntax or format details beyond what the schema provides, so the baseline of 3 applies.

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?

The description gives a specific verb and resource ("Add a web URL") and immediately bounds the scope to three object types, which an agent can use to distinguish it from sibling tools like add_attribute or update_url. It also explicitly names where the same data belongs for other object types, so the tool's identity is unambiguous.

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?

It states when to use the tool (person, place, or repository) and when not to (sources/citations), naming add_attribute as the correct alternative for that case. The only minor gap is not mentioning update_url for existing links, but the core routing decision is fully supplied.

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

assess_livingA
Read-only

Ask the server whether a person is probably still alive, and why.

The server walks relatives to decide, so it handles people with no dates of their own — someone undated whose children died a century ago. Use it before publishing or sharing anything, and use explain when you want to see the reasoning rather than just the verdict.

Note this is advisory. Bulk output is filtered by this server's own rule regardless of what this returns.

ParametersJSON Schema
NameRequiredDescriptionDefault
personYesHandle or gramps_id of the person.
explainNoAlso return the estimated birth and death dates and which relative they were derived from.
average_generation_gapNoYears per generation used when estimating.
max_age_probably_aliveNoAge beyond which a person is presumed dead.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint=false, but the description adds genuinely useful behavior: it is advisory, it handles undated people via relative inference, and bulk output is filtered by the server's own rule regardless of the return value. These caveats go beyond what the annotations convey.

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 the core purpose, then the mechanism, then usage. Three short paragraphs, each earning its place, though the mechanism sentence is slightly elaborate.

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

Completeness4/5

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

For a read-only assessment tool with no output schema, the description covers what is returned (a verdict, plus reasoning under `explain`) and the advisory caveat. Nothing essential for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters are already documented in the schema. The description only restates the purpose of `explain`, adding no syntax or format detail beyond the schema, so the baseline 3 is appropriate.

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 ('assess/ask whether a person is probably still alive') and resource (a person), and immediately clarifies the key mechanism — the server walks relatives rather than relying only on the person's own dates. No sibling tool does anything comparable, so it is clearly distinguishable.

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

Usage Guidelines4/5

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

Gives explicit context ('use it before publishing or sharing anything') and routes to the reasoning mode ('use `explain` when you want to see the reasoning rather than just the verdict'). It does not name a distinct alternative tool or state when NOT to use it, so it stops short of a 5.

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

attach_mediaA

Attach an image or document to an object -- a new upload, or one already in the tree.

With file_path, the bytes are uploaded into the tree's managed media directory (so don't point at files you don't want copied); if that exact file is already present it is reused rather than duplicated. With media_ref, an existing Media object is linked.

One image should be ONE Media object, linked from each object it belongs to and cited once per fact it proves. Uploading the same photograph separately for the husband and the wife creates duplicates that have to be unpicked later. The write is verified afterwards: verified: false means nothing attached, whatever the rest of the result says.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYesObject handle/gramps_id to attach media to.
file_pathNoAbsolute path to a local image, PDF, audio or video file to upload. Use this OR media_ref.
media_refNoHandle or gramps_id of a Media object ALREADY in the tree. Prefer this when the same document supports several people.
descriptionNoWhat the document IS, in archival terms. Only used when uploading a new file.
target_typeNoType of the target object: 'person', 'event', 'source', etc.person

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only declare the coarse safety profile (not read-only, not destructive, not idempotent); the description adds genuinely non-obvious behavior: bytes are copied into the tree's managed media directory, an already-present identical file is reused rather than duplicated, and the write is post-verified with `verified: false` meaning nothing attached. That last point is critical signal beyond any structured field.

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?

The core action is front-loaded in the first line, and each paragraph carries a distinct payload (upload semantics, linking semantics, duplicate warning + verification). The "ONE Media object... cited once per fact" passage is somewhat discursive, but it earns its place as anti-pattern guidance.

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?

For a mutation tool with no output schema, the description compensates by explaining the return signal (`verified: false`) and the dedup/verification behavior. Combined with annotations covering the safety profile, an agent has enough to invoke it correctly and interpret the result.

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?

With 100% schema coverage the baseline is 3, but the description adds meaning beyond the schema: it frames file_path/media_ref as mutually exclusive choices, explains the dedup side effect of file_path, and states the reuse preference for media_ref. The "Use this OR media_ref" framing and dedup semantics are not in the schema prose.

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

Purpose4/5

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

States a precise verb+resource ("Attach an image or document to an object") and enumerates its two operating modes: upload via file_path, link via media_ref. It does not name the sibling it differs from (add_media vs. attach/link), so sibling routing is left to inference rather than stated.

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?

Gives explicit when-to-use conditions for each mode: file_path when uploading bytes, media_ref "when the same document supports several people." Also supplies a caution ("don't point at files you don't want copied") and a strong anti-pattern (uploading the same photo separately for husband and wife creates duplicates). This is real conditional guidance, not vague context.

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

cite_eventA

Attach a citation to an event that ALREADY exists.

Use this to source an event you didn't create with an inline citation -- e.g. one added through the Gramps web UI, or an unsourced event surfaced by list_unsourced_facts. The citation is resolved/created (existing handle/id, or an inline source_title + page + confidence) and appended to the event's citation list (no duplicates). Does not change any other event field.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventYesEvent handle or gramps_id (e.g. 'E0007').
citationYesCitation to attach to the event.

TDQS

A4/5.0
Behavior4/5

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

Beyond the annotations (which already signal a safe, non-destructive write), it discloses that the citation is resolved-or-created and appended to the citation list, that duplicates are suppressed, and that no other event field is modified. This is useful mutation context. The only nuance is mild tension between "no duplicates" and idempotentHint=false, but it does not rise to a contradiction.

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

Conciseness5/5

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

Front-loaded with the core action in the first sentence, followed by usage and then mutation behavior. Every sentence earns its place: scope, when-to-use examples, resolution behavior, and the no-side-effects guarantee, with no filler.

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

Completeness4/5

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

For a two-parameter mutation tool with a nested citation object and no output schema, the description covers purpose, usage, and side-effect behavior adequately. It is nearly complete; the only unaddressed element is what the call returns, which is a minor gap given the mutation nature of the tool.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters and the nested CitationInput (including its precedence rules) are already fully documented in the schema. The description restates the resolution modes ("existing handle/id, or an inline source_title + page + confidence") without adding format or precedence detail beyond the schema, so the baseline of 3 is appropriate.

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

Purpose4/5

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

The description states a specific verb (attach) and resource (citation to an event) with a scoping qualifier ("that ALREADY exists"), which cleanly separates it from event-creation tools like add_event. It does not explicitly contrast against the obvious siblings cite_object (generic) or cite_child_link, so an agent must infer the tiebreak rather than being routed to the right sibling.

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

Usage Guidelines4/5

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

"Use this to source an event you didn't create with an inline citation" gives clear when-to-use context, reinforced with concrete examples (Gramps web UI events, results from list_unsourced_facts). However, it names no alternative tool and states no exclusions, so the agent isn't told when to prefer cite_object or how to handle events it did create.

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

cite_objectA

Attach a citation to any object that carries one -- not just events.

cite_event covers facts; this covers the rest. The important case is the FAMILY, whose citation supports a claim no event makes: that these two people were a couple. Person-level citations are for evidence about the individual as a whole (an identity document) rather than about one dated fact -- prefer citing the specific event where one exists.

To cite a parent-child link, use cite_child_link: that is a different claim and needs its own citation.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesHandle or gramps_id of the object to cite.
citationYesCitation to attach.
object_typeYesperson, family, event, place, media, source, or citation.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare the mutation profile (readOnly=false, destructive=false, idempotent=false), so the bar is lower. The description adds genuine domain behavior: what a citation on a FAMILY actually asserts (a couple claim) versus a person-level identity claim. It omits that repeated calls create duplicate citations (non-idempotent), a minor gap against the annotation.

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 the core verb+scope, then progressively adds routing detail. Each sentence carries distinct information, though the family/person elaboration is dense and could be tightened slightly.

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

Completeness4/5

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

No output schema exists and none is needed for an attach operation, and the schema fully documents parameters. The description completes the picture by mapping each object type to the claim it supports. It could note idempotency behavior on repeat calls, but otherwise nothing an agent needs is missing.

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 description coverage is 100%, so the baseline is 3. The description goes beyond the schema's flat object_type list by explaining the semantic weight of each target type and which citation is preferred per object, adding real meaning to the object_type parameter.

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+resource ('Attach a citation to any object') and immediately scopes it against siblings: cite_event covers facts, cite_child_link covers parent-child links. An agent can route to this tool without opening any schema.

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?

Explicit when-to-use (family-level and person-level claims that no event makes), when-not (prefer citing the specific event where one exists), and named alternatives (cite_event, cite_child_link). This is textbook routing guidance.

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

consolidated_timelineA
Read-only

Merge several people or families into one chronological timeline.

The way to see a household move together through censuses, or to check whether a family's events are mutually consistent. Carries the same citation count and confidence per event as get_timeline, with an uncited_count across the whole set.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum events.
anchorNoHandle or gramps_id of the central person, so ages are reported relative to them.
targetsYesHandles or gramps_ids to merge into one timeline.
event_typesNoComma-delimited event type names to include, e.g. 'Birth,Death,Census'. Omit for all.
object_typeNoEither 'person' or 'family'.person
include_privateNoShow living people and private records in full. Only when the user asks for them; they are withheld by default.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds return-shape behavior that the annotations cannot: per-event citation count and confidence, plus an aggregate uncited_count. It does not mention ordering or how the merge resolves conflicting dates, which would be the remaining behavioral detail for a merge tool.

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?

Three sentences, front-loaded with purpose, then intent, then output characteristics. The middle sentence earns its place by grounding the tool in real use cases, though it could be tightened slightly.

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

Completeness4/5

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

For a read-only, no-output-schema tool, the description supplies meaningful return context (citation count, confidence, uncited_count) and the merge intent. It stops short of describing event ordering or deduplication across merged subjects, which is the one gap an agent might wonder about.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters including targets, anchor, and include_private are already documented in the schema. The description adds no syntax, format, or cardinality detail beyond what the schema states, so the baseline of 3 applies.

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?

The description states a specific verb and resource ('Merge several people or families into one chronological timeline') and clarifies the semantics of the merge (one unified timeline rather than separate ones). It also positions itself against the sibling get_timeline by noting output parity, so an agent can distinguish it without opening the schema.

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

Usage Guidelines4/5

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

It gives two concrete when-to-use scenarios: watching a household move through censuses, and checking family event consistency. This is clear context, but there is no explicit when-not guidance or named alternative to pick instead (it only references get_timeline for output parity, not as a routing choice).

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

consult_referenceA
Read-only

Consult the legacy GEDCOM reference layer for HINTS (never authoritative).

Searches the configured Ancestry/FamilySearch exports and returns, per file, matching individuals and their claimed facts. Crucially, each fact is flagged whether the legacy tree attached a source, with the source text if present -- so you can distinguish 'they cite an actual death certificate' from 'unsourced guess'. These are UNTRUSTED hints: use them to decide what real record to hunt for, then create the fact in the tree citing that record -- do not copy a hint in as a sourced fact. Probably-living people are withheld and counted.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName (or name substring) to look up.
year_toleranceNoAllowed birth-year difference when matching.
include_privateNoShow living people and private records in full. Only when the user asks for them; they are withheld by default.
approx_birth_yearNoApproximate birth year to disambiguate (± a few years).

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only cover readOnly/openWorld, so the description does the heavy lifting: it discloses that results are UNTRUSTED hints, that each fact is flagged for whether a source was attached (with source text), and that probably-living people are withheld and counted. This is exactly the behavioral context an agent needs to interpret and trust the output correctly.

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 the core statement, then the trust model and workflow directive. Every sentence carries information, though the source-flag sentence is a slightly long construction that could be tightened without losing meaning.

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

Completeness4/5

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

For a read-only search tool with no output schema, the description adequately explains what comes back (per-file individuals, facts, source flags) and the privacy behavior. It does not discuss result limits, pagination, or how many files are scanned, which is a minor remaining gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the four parameters are already fully documented in the schema; the description adds no syntax or matching detail beyond it. It does clarify why include_private matters ('Probably-living people are withheld and counted'), but that is general context rather than added per-parameter semantics.

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 ('consult') and resource ('legacy GEDCOM reference layer') and immediately scopes it: it searches configured Ancestry/FamilySearch exports and returns matching individuals and claimed facts. This clearly distinguishes it from siblings like search_people/query_records, which operate on the tree itself rather than the external reference layer.

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?

Explicitly states when to use the results ('use them to decide what real record to hunt for, then create the fact in the tree citing that record') and when not to ('do not copy a hint in as a sourced fact'). The authoritative-vs-hint distinction tells the agent exactly how this tool fits into the citation workflow without naming every sibling.

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

create_filterA

Save a reusable custom filter built from Gramps' own rules.

Worth doing for a selection you will run repeatedly — an audit scope, a branch of the tree — because the filter then has a name rather than being retyped each time.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFilter name, used to apply it later.
rulesYesRules, each {'name': <rule>, 'values': [...], 'regex': false}. Rule names come from list_filter_rules.
invertNoReturn everything the rules do NOT match.
commentNoNote on the filter's purpose.
functionNoHow rules combine: 'and', 'or', or 'one'.and
namespaceYesSingular, capitalised: Person, Family, Event, Place, Citation, Source, Repository, Media, Note.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, non-idempotent), so the bar is lowered. The description adds the value proposition of naming a filter for reuse but says nothing about name collisions, persistence scope, or failure modes for a write operation.

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?

Two sentences with the action front-loaded ('Save a reusable custom filter'), and the second sentence earns its place by justifying the tool's existence. Slightly wordy but no waste.

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

Completeness4/5

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

For a create tool with no output schema, 100% schema coverage and annotations carry most of the burden; the description adds the motivating rationale. It is nearly complete, only missing a pointer to list_filter_rules for valid rule names.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all six parameters including the namespace enum-like list and rule structure. The description adds no parameter syntax or format detail beyond what the schema provides, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb+resource: 'Save a reusable custom filter' built from Gramps rules. Clear what it does, but it never names the sibling tools (list_custom_filters, delete_filter) that would let an agent place it in the filter lifecycle without opening schemas.

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

Usage Guidelines3/5

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

Gives a motivating condition — 'a selection you will run repeatedly — an audit scope, a branch of the tree' — which implies usage context. However it names no alternatives and no prerequisites; it does not say that rule names must first come from list_filter_rules or how this differs from simply querying.

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

db_statsA
Read-only

Counts of people, families, events, citations, sources, repositories, places, media, and notes in the tree. A quick health/overview check.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the scope 'in the tree' and the overview-check framing, but nothing about return shape (e.g., a per-type count mapping) or whether it includes soft-deleted/private objects.

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?

Two sentences, front-loaded with the resource list and tailed with the purpose. The nine-item enumeration is long but each item is load-bearing since it defines the result's coverage.

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

Completeness4/5

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

For a zero-parameter, read-only counting tool with annotations covering safety, the description is nearly sufficient; the only minor gap is not hinting at the response shape (counts keyed by object type), which is easily inferred from the enumeration.

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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; per the rubric an empty schema sets a baseline of 4.

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

Purpose4/5

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

States a specific verb (counts) and enumerates exactly which resources are counted (people, families, events, citations, sources, repositories, places, media, notes), which distinguishes it from aggregation siblings like verify_tree or run_report. It stops short of naming a sibling explicitly, so it lands just below top marks.

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

Usage Guidelines3/5

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

The trailing phrase 'A quick health/overview check' implies when an agent would reach for this tool, but there is no explicit when-to-use vs when-not, and no alternatives (e.g., query_records, verify_tree) are named for deeper analysis.

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

delete_filterA
Destructive

Delete a saved custom filter.

Deletes the filter definition only. Nothing in the tree is touched.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the filter to delete.
namespaceYesPlural namespace, e.g. 'people'.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuinely useful blast-radius context beyond that: only the filter definition is removed and no tree objects are affected. It doesn't state behavior when the filter doesn't exist or whether the deletion is undoable, which would complete the picture.

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

Conciseness5/5

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

Two short sentences, zero filler, with the core action front-loaded and the scope constraint immediately after. Every sentence earns its place.

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

Completeness4/5

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

For a simple two-parameter deletion with full annotation coverage and no output schema, the definition gives the agent what it needs to call it safely, including the key reassurance about tree data. It stops short of noting idempotency or recoverability, which the idempotentHint=false annotation leaves open.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (name, namespace) are documented in the schema with examples. The description adds no additional meaning to either parameter, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Delete a saved custom filter') that clearly separates it from creation/list siblings like create_filter and list_custom_filters. The added scope line 'Nothing in the tree is touched' further distinguishes it from the broader delete_object sibling, though no sibling is named explicitly.

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

Usage Guidelines3/5

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

Usage is implied by the narrow object of deletion (a saved filter definition), and the clarification that tree data is unaffected gives context for choosing it over delete_object. However there is no explicit when-to-use, when-not-to-use, or named alternative guidance.

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

delete_objectA
Destructive

Permanently delete an object from the tree by handle or gramps_id.

DESTRUCTIVE and irreversible. Deleting an object does not clean up references to it, so this can leave dangling references (e.g. deleting a person still referenced by a family, or an event still listed on a person). Prefer deleting leaf objects, and detach references first where possible.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYesHandle or gramps_id of the object to delete.
object_typeYesType to delete: 'person', 'family', 'event', 'place', 'source', 'citation', 'repository', 'media', 'note', 'tag'.

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, and the description adds real substance beyond them: irreversibility, the fact that references are NOT cleaned up, and a concrete example (a person still referenced by a family). That is exactly the extra context an agent needs before a destructive call.

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-loads the action and the destructive nature in the first two lines, with the caveat and remediation guidance after. The sentence on dangling references is somewhat long but each clause carries actionable information; little waste overall.

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

Completeness4/5

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

With a small two-parameter schema, full schema coverage, no output schema, and annotations covering the safety profile, the description is nearly complete for correct invocation. It could still mention whether the object handle becomes invalid or whether an undo exists, which would close the remaining gap.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters and their accepted identity forms are already documented in the schema. The description's 'handle or gramps_id' phrasing restates the schema rather than adding new semantics, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb (permanently delete) and resource (object from the tree) plus the two accepted identifiers (handle or gramps_id). The warning about dangling references implicitly distinguishes it from detach_object, but no sibling is named explicitly, so an agent must infer the boundary.

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

Usage Guidelines4/5

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

Gives concrete when-not guidance: prefer deleting leaf objects and detach references first where possible. That steers the agent away from this tool in the risky case, though it never names detach_object or merge_objects as the literal alternatives.

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

detach_objectA
Destructive

Remove a reference from an object: an event from a person, an image from a source, a tag, a note, a child from a family.

The reference is removed; the object itself survives unless delete_if_orphan is set AND nothing else points at it -- which is checked, because deleting something other facts still reference leaves dangling handles behind.

ParametersJSON Schema
NameRequiredDescriptionDefault
childYesHandle or gramps_id of the thing to detach.
parentYesIts handle or gramps_id.
child_kindYesWhat to detach: event, media, note, tag, citation, child (a person from a family), person (a person_ref), or repository.
parent_typeYesType of the object holding the reference.
delete_if_orphanNoAlso delete the detached object if nothing else references it. Off by default -- detaching and deleting are different decisions.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=false. The description adds substantial behavioral context beyond annotations: the referenced object survives by default, deletion only happens if delete_if_orphan is set AND no other references point to it, and this orphan check exists to avoid dangling handles. That is exactly the kind of operational nuance an agent needs for a destructive mutation.

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

Conciseness5/5

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

Two short paragraphs, front-loaded with the core purpose and then the critical conditional-deletion behavior. Every sentence carries information; there is no filler or repetition.

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

Completeness4/5

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

For a destructive mutation tool with no output schema, the description covers the essential behavior: references are removed, objects survive by default, and deletion is conditional and checked. It does not describe failure modes such as a missing reference, but the annotations and schema carry enough of the remaining burden that the definition is largely complete.

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 description coverage is 100%, so the baseline is 3. The description reinforces the child_kind examples and, more importantly, explains the rationale and guard condition behind delete_if_orphan beyond the schema's wording ('which is checked, because deleting something other facts still reference leaves dangling handles behind'). This adds useful semantic depth, though most parameter detail still lives in the schema.

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?

The description states a specific verb and resource: remove a reference from an object, with concrete examples (event from person, image from source, tag, note, child from family). It clearly distinguishes detaching from deleting an object, so an agent can differentiate it from sibling tools like delete_object or uncite without opening schemas.

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

Usage Guidelines4/5

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

The description gives clear context for when to use this tool: to remove a reference while preserving the underlying object. It also explains the conditional delete_if_orphan behavior, which helps distinguish detaching from deleting. However, it does not explicitly name alternative tools or state when-not to use this tool versus siblings.

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

event_spanA
Read-only

Measure the elapsed time between two events.

The arithmetic behind most plausibility checks: age at marriage, years between a census and a death, how long a widow waited. Doing this by hand from two formatted date strings is where transcription errors hide.

ParametersJSON Schema
NameRequiredDescriptionDefault
as_ageNoPhrase the result as an age rather than an interval.
event1YesHandle or gramps_id of the first event.
event2YesHandle or gramps_id of the second event.
precisionNoHow many units to include (years, months, days).

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds that the result is derived arithmetic over formatted dates and that manual computation invites transcription errors, which frames it as a deterministic calculation, but says nothing about error handling for unparseable or imprecise dates.

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?

Three short sentences, front-loaded with the operation and followed by rationale; nothing is redundant. The third sentence is motivation rather than specification, so it is close to but not quite maximally economical.

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

Completeness3/5

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

With no output schema, the description should describe the returned value, especially how as_age and precision shape it (interval vs. age, units included). That gap leaves an agent unsure what it will actually receive, though the core operation is fully described.

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

Parameters3/5

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

Schema description coverage is 100%, so as_age, precision, and the event handles are already documented in the schema; baseline 3 applies. The description actually refers to 'two formatted date strings' while the parameters are event handles or gramps_ids, a mild imprecision it never resolves.

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

Purpose4/5

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

States a specific verb and resource: 'Measure the elapsed time between two events,' which is unambiguous about what the tool computes. It does not, however, distinguish itself from timeline-flavored siblings like consolidated_timeline or get_timeline, so an agent must infer the boundary itself.

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

Usage Guidelines4/5

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

The second sentence gives concrete usage contexts ('age at marriage, years between a census and a death') that tell an agent when this tool is the right choice. There is no explicit when-not guidance or named alternative, keeping it short of the top band.

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

export_backupA

Write a full-tree export to disk. Take one before any bulk write.

Cheap insurance: a few seconds and one file. A bulk write that goes wrong cannot always be undone transaction by transaction; a dump can be re-imported.

ParametersJSON Schema
NameRequiredDescriptionDefault
dest_pathNoA new file in an existing directory; an existing file is never replaced. Omit for a timestamped file in the cache directory.
export_formatNo'gramps' (Gramps XML, lossless -- use this for a safety dump), 'ged', 'json', or 'csv'.gramps

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare this is a non-read, non-destructive, non-idempotent write, and the description is consistent with that. It adds behavior beyond the annotations: the output is a single full-tree file, the operation is fast ('a few seconds'), and the dump can be re-imported to recover from a botched bulk write. It stops short of stating what the call returns or required permissions.

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?

The imperative action is front-loaded in the first sentence and the trigger condition follows immediately. The 'cheap insurance' framing is mildly rhetorical but it carries real justification (low cost, high recovery value) rather than padding.

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

Completeness4/5

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

For a two-parameter write tool with no output schema, the description covers why and when to call it, but does not say what the call returns (e.g., the path of the written file), which is the one piece an agent calling it blind would want.

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

Parameters3/5

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

Schema description coverage is 100%, so both dest_path and export_format are already fully documented in the schema, including the never-overwrite rule and format trade-offs. The description adds no parameter-level detail, so the baseline 3 applies.

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?

The opening sentence gives a specific verb and resource with scope: 'Write a full-tree export to disk.' The scope word 'full-tree' separates it from partial or object-level operations, and no sibling tool performs exports, so the agent can identify it immediately without opening the schema.

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

Usage Guidelines4/5

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

It gives an explicit invocation trigger: 'Take one before any bulk write,' and explains why (a failed bulk write cannot always be undone transaction by transaction). No alternative or exclusion is named, but none exists in the sibling set, so the guidance is actionable even if not framed as a comparison.

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

find_duplicatesA
Read-only

Find likely-duplicate objects. Reports only -- it never merges anything.

Duplicates are not merely untidy: a duplicate SOURCE makes a single-sourced fact look corroborated, which is a false evidentiary claim. But the reverse error is just as real -- an index entry and the register page it indexes are TWO documents and must stay separate. This tool finds candidates; deciding which are truly the same document is yours. Merge with merge_objects.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesmedia_checksum (same file uploaded twice), source_title (same document entered twice), citation_page (same source+page cited more than once, flagging any graded differently), vital_events (a person with two Births), person_name (same name, possible same person).
limitNoMax groups to return.
include_privateNoShow living people and private records in full. Only when the user asks for them; they are withheld by default.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so safety is covered; the description adds operational detail beyond that by clarifying that read-only means "never merges" and that output is candidate groups, not decisions. It also explains the evidentiary rationale for why the tool errs toward caution. No mention of permissions, cost, or performance characteristics.

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 the action and its scope in the first sentence. The middle sentences are editorial but functional — they justify why duplicate detection is non-trivial and warn against over-merging. It runs slightly long for the functional payload, but every sentence carries usable guidance.

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

Completeness4/5

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

For a read-only search tool with full schema coverage and no output schema, the description covers the detection/decision boundary and points at merge_objects for follow-through. It does not describe the shape of the returned report (the grouping is only implied by the limit parameter's "Max groups to return"), which is a minor gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the kind enum values, limit, and include_private are all documented in the schema itself, including the privacy default. The description text adds no parameter-level detail beyond the schema, so the baseline 3 applies.

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 + resource ("Find likely-duplicate objects") and immediately scopes the behavior ("Reports only -- it never merges anything"). It explicitly names the sibling it is not (merge_objects), so an agent can separate detection from mutation without opening either schema.

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

Usage Guidelines4/5

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

Gives clear conditions: this tool produces candidates, the human decides which are truly the same, and merge_objects performs the merge. It supplies the false-positive caution (index entry vs. register page must stay separate), which is real usage guidance. It stops short of explicit when-not triggers against other read tools like verify_tree or list_unsourced_facts.

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

get_ancestorsA
Read-only

Walk a person's ancestors up to N generations (a nested parents tree).

Living/private ancestors appear as redacted stubs unless include_private is set.

ParametersJSON Schema
NameRequiredDescriptionDefault
personYesRoot person handle or gramps_id.
generationsNoHow many generations up.
include_privateNoShow living people and private records in full. Only when the user asks for them; they are withheld by default.

TDQS

A4/5.0
Behavior4/5

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

Annotations only say the call is read-only and closed-world; the description adds the substantive behavior that living/private ancestors are returned as redacted stubs unless include_private is set. That is real value beyond the structured fields, though nothing is said about depth limits on the returned tree or performance.

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

Conciseness5/5

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

Two short sentences, no filler. The core traversal purpose is front-loaded and the privacy caveat follows, which is the right order for an agent deciding whether to call it.

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

Completeness4/5

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

For a read-only tree traversal with fully documented parameters and no output schema, the description covers purpose, output shape, and the privacy caveat. It is nearly complete, missing only guidance on when this tool is the right choice over the neighboring lookup tools.

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

Parameters3/5

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

Schema coverage is 100% and all three parameters carry their own descriptions, so the schema already does the work. The description's privacy sentence corroborates the include_private semantics but adds no syntax, defaults, or bounds beyond what the schema states.

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 ('Walk a person's ancestors up to N generations') and even characterizes the return shape ('a nested parents tree'). The ancestor/descendant split makes it unambiguously distinct from get_descendants without naming it.

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

Usage Guidelines3/5

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

The description implies the traversal use case and clarifies the privacy condition, but never states when to prefer this over get_person, get_family, get_relationship, or get_descendants. Usage is inferable rather than explicit.

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

get_citationA
Read-only

Read one citation: page, confidence, date, and its source.

cited_by_count is the useful part. Zero means nothing references this citation — it is orphan debris, and uncite should have deleted it.

ParametersJSON Schema
NameRequiredDescriptionDefault
citationYesHandle or gramps_id of the citation.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds value by explaining the returned fields and interpreting `cited_by_count` zero as orphan debris, which helps an agent understand the result beyond the annotation.

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

Conciseness5/5

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

The description is two short paragraphs, front-loading the core action and then the key field interpretation. Every sentence earns its place without fluff.

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

Completeness4/5

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

For a simple read tool with one documented parameter and read-only annotations, the description covers the returned fields and the meaning of the important count. It does not cover error behavior, but no output schema exists and the annotations handle safety.

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

Parameters3/5

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

Schema description coverage is 100% for the single `citation` parameter, so the schema already documents handle or gramps_id. The description adds no additional parameter semantics.

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

Purpose4/5

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

The description opens with a specific verb and resource ('Read one citation') and enumerates the fields returned (page, confidence, date, source). It is clear, though it does not explicitly differentiate itself from other get_* sibling tools beyond the resource noun.

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

Usage Guidelines3/5

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

It provides implied usage by highlighting `cited_by_count` as the useful part and explaining that zero indicates orphan debris that `uncite` should have removed. It does not explicitly state when to choose this tool over alternatives like `get_source` or `query_objects`.

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

get_descendantsA
Read-only

Walk a person's descendants up to N generations (a nested children tree).

Living/private descendants appear as redacted stubs unless include_private is set.

ParametersJSON Schema
NameRequiredDescriptionDefault
personYesRoot person handle or gramps_id.
generationsNoHow many generations down.
include_privateNoShow living people and private records in full. Only when the user asks for them; they are withheld by default.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnlyHint=true, openWorldHint=false), and the description adds real behavioral context: the return value is a nested children tree, and living/private descendants are silently redacted to stubs by default. That redaction default is exactly the kind of non-obvious behavior an agent needs before summarizing output.

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

Conciseness5/5

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

Two sentences, zero filler. The core action is front-loaded in the first sentence and the privacy caveat follows immediately where it matters.

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

Completeness4/5

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

With no output schema, the description usefully describes the returned structure (nested children tree with redacted stubs) and the privacy default, which is enough for correct invocation. It does not mention depth limits or what happens for a nonexistent root person, but those are covered by the schema's min/max constraints.

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 description coverage is 100%, so the baseline is 3. The description goes slightly beyond by framing 'generations' as a downward walk depth and by explaining the practical consequence of include_private (redacted stubs vs. full records), which the schema states only as 'show ... in full'.

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

Purpose4/5

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

States a specific verb ('walk') and resource ('a person's descendants'), plus the result shape ('a nested children tree'). The distinction from the sibling get_ancestors is carried by the word 'descendants' rather than an explicit contrast, so it is clear but not maximally differentiated.

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

Usage Guidelines3/5

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

Usage is implied by the scope statement ('up to N generations') and the privacy note, but the description never says when to reach for this versus get_person, get_family, or get_ancestors, nor does it name an alternative. The only quasi-guidance ('unless include_private is set') duplicates what the schema already states.

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

get_dna_matchesA
Read-only

List the DNA matches recorded against a person.

Each match reports total shared centiMorgans and the largest single segment — the two figures a relationship estimate actually rests on — plus any common ancestor already identified.

DNA evidence works differently from documentary evidence. A match proves a biological relationship exists; it does not say which one. Shared cM constrains the possibilities and rarely resolves them, and it says nothing about the paper trail. unattributed_count is the useful number: matches with no common ancestor identified are the open research.

ParametersJSON Schema
NameRequiredDescriptionDefault
personYesHandle or gramps_id of the tested person.
include_rawNoInclude the unparsed note text the segments came from.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds valuable return-value context: each match reports total shared cM, largest segment, and any common ancestor, plus it explains the interpretive meaning of the data. It stops short of describing pagination, sorting, or the effect of include_raw.

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?

The description front-loads the core purpose in the first sentence, then adds output details and domain caveats. It is somewhat prose-heavy, but the additional context about DNA evidence and `unattributed_count` earns its place for correct interpretation.

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

Completeness4/5

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

With no output schema, the description carries the burden of explaining return values, and it does so by naming total shared cM, largest segment, common ancestor, and unattributed_count. It omits any mention of include_raw, but the input schema covers that parameter, so the definition is largely complete for an agent to call the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both parameters, including person and include_raw. The description does not add any parameter-specific syntax, format, or edge-case meaning beyond what the schema provides, so the baseline score of 3 is appropriate.

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

Purpose4/5

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

The description states a specific verb and resource: 'List the DNA matches recorded against a person.' It is clear what the tool does, though it does not explicitly differentiate itself from sibling tools such as get_ydna or parse_dna_segments.

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

Usage Guidelines3/5

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

The description provides useful context about DNA evidence and points to `unattributed_count` as the key number for open research. However, it does not state when to use this tool versus alternatives like get_ydna, nor does it give explicit prerequisites or exclusions.

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

get_eventA
Read-only

Get an event: type, date, place handle, description, citation count, and attributes. Use to inspect an event before citing or editing it.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventYesEvent handle or gramps_id, e.g. 'E0001'.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered by structured data. The description adds the list of returned fields, which is useful behavioral context, but says nothing about behavior on a missing/invalid handle or any output/pagination characteristics.

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

Conciseness5/5

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

Two tight sentences, front-loaded with the purpose and closed with the usage cue; no filler or redundancy.

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

Completeness4/5

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

For a simple read-only single-param tool with full schema coverage and annotations covering the safety profile, the description is largely sufficient, especially since it lists the return fields despite there being no output schema. Only edge-case behavior on invalid handles is unaddressed.

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

Parameters3/5

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

With a single parameter and 100% schema description coverage, the schema already documents 'event' with an example ('E0001'), so the baseline is 3. The description adds no additional syntax or format guidance beyond what the schema provides.

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

Purpose4/5

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

States a specific verb and resource ('Get an event') and enumerates the returned fields (type, date, place handle, description, citation count, attributes), so the agent knows exactly what this retrieves. It is clearly distinguishable from list_event_types, update_event, and query_objects, though it never explicitly contrasts itself with the generic get_object sibling.

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

Usage Guidelines4/5

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

'Use to inspect an event before citing or editing it' gives concrete workflow context that tells the agent when this tool is appropriate (a pre-read for cite/edit flows). It stops short of naming alternatives or stating exclusions, so it is clear context without routing rules.

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

get_factsA
Read-only

Read the tree's record-holders: oldest at death, youngest parent, most children.

Superlatives across a set of people, not statistics about one person. An implausible holder — a father at eight, a death at 130 — is usually a data error, which makes this a quick plausibility check. Living and private people are excluded unless include_private is set. Slow: the server computes it all per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
rankNoRecord-holders to return per statistic.
personNoHandle or gramps_id a built-in person_filter is anchored on.
person_filterNoNarrow the set: 'Ancestors', 'Descendants', 'DescendantFamilies' or 'CommonAncestor' of person, or a saved custom person filter's name. Omit for the whole tree.
include_privateNoShow living people and private records in full. Only when the user asks for them; they are withheld by default.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the readOnly/openWorld annotations, the description discloses real behavioral traits: living and private people are withheld unless include_private is set, and the call is slow because the server computes everything per call. These are genuine operational facts an agent needs and are not captured by annotations.

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

Conciseness5/5

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

Front-loaded with the core output definition, then one line each for scope, plausibility use, privacy behavior, and performance. No filler; every sentence carries distinct information.

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

Completeness4/5

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

For a read-only tool with no output schema, it conveys the kind of results returned, the exclusion rule, and the performance cost. It lacks a full enumeration of all statistics produced and pagination/ranking return detail, but is otherwise sufficient to call correctly.

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

Parameters3/5

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

Schema coverage is 100%, so rank, person, person_filter, and include_private are already documented in the schema. The description restates the include_private exclusion behavior but adds no syntax or format meaning beyond what the schema provides, so the baseline 3 applies.

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 (read) and resource (the tree's record-holders) and enumerates concrete outputs — oldest at death, youngest parent, most children. The clause 'Superlatives across a set of people, not statistics about one person' crisply distinguishes it from single-person stat tools like db_stats or get_person.

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

Usage Guidelines4/5

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

Gives a clear when-to-use scenario: an implausible holder signals a data error, making this a quick plausibility check. It does not name specific sibling alternatives (e.g. verify_tree, db_stats) or state when not to use it, so it stops short of full routing guidance.

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

get_familyA
Read-only

Get a family: relationship type, parent handles, child handles, event count.

ParametersJSON Schema
NameRequiredDescriptionDefault
familyYesFamily handle or gramps_id, e.g. 'F0001'.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavioral value by naming the shape of the result (relationship type, parent/child handles, event count), which is the only output contract available since no output schema exists. It does not say what happens for an unknown handle, but that is a minor omission.

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

Conciseness5/5

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

One sentence, front-loaded with the verb and resource, followed immediately by the result contents. Every clause earns its place; nothing is redundant or padded.

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

Completeness4/5

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

For a single-parameter read tool with full schema coverage and safety annotations, the description supplies everything an agent needs: identity, input form, and a summary of return fields. Only error behavior for a missing family is left unstated, which is a small gap.

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

Parameters3/5

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

Schema description coverage is 100% and the single 'family' parameter is documented as accepting a family handle or gramps_id with an example. The description adds nothing beyond what the schema already says, so the baseline 3 applies.

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

Purpose4/5

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

The description states a specific verb+resource ('Get a family') and enumerates the returned fields (relationship type, parent handles, child handles, event count), which clearly separates it from get_person, get_event, and add_family. It stops short of explicitly naming a sibling it is not, so it lands just below the top band.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no prerequisite (e.g. that a family handle/gramps_id must already be known), and no pointer to alternatives like search_people or get_relationship. With ~70 sibling tools, the agent gets no routing help at all.

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

get_mediaA
Read-only

Read one media object: path, mime type, checksum, description, date.

referenced_by_count above one is usually correct — one image cited from every fact it proves. Several media objects sharing a checksum is the duplicate that find_duplicates(kind='media_checksum') hunts.

ParametersJSON Schema
NameRequiredDescriptionDefault
mediaYesHandle or gramps_id of the media object.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful interpretation context beyond that: that referenced_by_count>1 is normal, and that shared checksums indicate duplicates. It omits failure behavior (e.g., missing handle) but that is a minor gap.

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?

The first line is tightly front-loaded and efficient. The second paragraph is somewhat tangential for a single-object read (explaining aggregate referenced_by_count semantics) but still earns its place as interpretation guidance.

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

Completeness4/5

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

With no output schema, the description compensates by enumerating the returned fields, and the annotations cover safety. For a one-parameter read tool this is nearly complete; only error/absence handling is unaddressed.

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

Parameters3/5

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

Schema description coverage is 100% and the single 'media' parameter is documented in the schema as a handle or gramps_id. The description adds no parameter detail beyond the returned-field list, so the baseline 3 applies.

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 ('Read one media object') and enumerates the returned fields (path, mime type, checksum, description, date), which clearly separates it from add_media, update_media, and ocr_media siblings.

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

Usage Guidelines3/5

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

Usage is implied by 'Read one media object' and the checksum sentence implicitly routes duplicate hunting to find_duplicates(kind='media_checksum'). However there is no explicit statement of when to prefer get_media over get_object, query_objects, or other retrieval siblings, nor any prerequisites.

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

get_noteA
Read-only

Read one note in full, with its type and what it is attached to.

Notes hold the researcher's own reasoning — why a conflict was resolved one way, what a hard-to-read page actually said — so the text comes back whole rather than truncated.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteYesHandle or gramps_id of the note.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description usefully adds that the text is returned untruncated and that type/attachment metadata is included, but says nothing about permissions, error behavior for a bad handle, or response shape.

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?

Two short sentences, front-loaded with the action and followed by a rationale for why the full text matters. The second sentence is explanatory rather than operational, but it is brief and does justify itself.

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?

For a single-parameter, read-only getter with no output schema, the description covers the essentials: what is read, that it is complete rather than truncated, and what metadata accompanies the text. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the single 'note' parameter is documented as 'Handle or gramps_id of the note.' The description adds no syntax, format, or lookup-rule detail beyond that, so the baseline 3 for schema-documented parameters is correct.

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

Purpose4/5

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

The description states a specific verb and resource ('Read one note in full') and even names what the response carries (its type and what it is attached to), so an agent knows exactly what it gets. It does not, however, distinguish itself from sibling getters like get_object or query_objects, which is the only thing keeping it from a 5.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: 'comes back whole rather than truncated' hints that this is the tool to reach for when complete note text matters, but there is no explicit when-to-use or when-not-to-use rule and no named alternative (get_object, query_objects). Adequate but leaves the routing decision to inference.

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

get_objectA
Read-only

Read any object's raw record -- including places, media, notes and citations, which have no shaped getter.

Returns the record as stored, which is what you want before editing one. For people and sources the shaped getters (get_person, get_source) are easier to read.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesHandle or gramps_id.
keysNoComma-separated fields to return. Omit for the whole record.
object_typeYesperson, family, event, place, source, citation, repository, media, note, or tag.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine value beyond that by disclosing that the return is the raw stored record rather than a shaped view, which is the key behavioral distinction motivating its use. It stops short of describing error handling for a missing ref or the effect of the keys field, which keeps it out of the top band.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core capability and its scope before the advice on alternatives. No sentence is redundant and the routing hint lands last where it is most useful.

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

Completeness4/5

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

For a read-only lookup with full schema coverage and no output schema, the description covers purpose, scope and the alternative-tool decision well. It leaves minor gaps around failure behavior for an unknown ref and how keys interacts with the 'raw record' promise, but nothing that would cause a misinvocation.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters (object_type, ref, keys) are already documented in the schema, including the 'handle or gramps_id' format and the comma-separated fields semantics. The description adds only the framing of 'raw record' versus a shaped getter and no additional parameter detail, so the baseline 3 applies.

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?

It states a specific verb and resource ('Read any object's raw record') and immediately delimits scope by naming the object types it uniquely serves (places, media, notes, citations). It also distinguishes itself from the shaped getters get_person and get_source, so an agent can route correctly without opening a schema.

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?

It gives an explicit use condition ('what you want before editing one') and names the alternatives with the condition that selects them ('for people and sources the shaped getters ... are easier to read'). The selection rule between get_object and its siblings is fully specified.

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

get_personA
Read-only

Get full detail for one person: name, gender, events (with citation counts), family links, and media count.

Direct lookup is allowed even for living/private individuals (this is your own local tool); only bulk/list tools filter them. Use this to inspect someone before adding facts, or to check whether an event is already cited.

ParametersJSON Schema
NameRequiredDescriptionDefault
personYesPerson handle or gramps_id, e.g. 'I0001'.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered structurally. The description adds genuinely non-obvious behavior the annotations cannot express: single-object lookups bypass the living/private filter that bulk/list tools apply. It stops short of noting error behavior for an unknown handle or result-size limits.

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?

Three short sentences, front-loaded with the return payload and followed by the privacy rule and usage triggers. The parenthetical '(this is your own local tool)' is mildly redundant, but nothing else wastes space.

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

Completeness4/5

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

With no output schema, the description usefully enumerates the returned fields, and it covers the one non-obvious behavioral rule for this tool. Missing only minor details such as failure mode on a bad handle or how citation counts are scoped.

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

Parameters3/5

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

Only one parameter with 100% schema description coverage, including the example handle 'I0001', so the schema does the heavy lifting. The description adds only the implication of a single-valued lookup, which is the baseline case.

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 (get) and resource (person) and enumerates the exact payload: name, gender, events with citation counts, family links, media count. An agent can distinguish this from get_family, get_object or search_people without opening any schema.

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

Usage Guidelines4/5

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

Gives two concrete triggers: inspecting someone before adding facts, and checking whether an event is already cited. It also carves out the privacy boundary versus bulk/list siblings, though it never names a specific alternative tool the way an explicit when/when-not statement would.

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

get_placeA
Read-only

Read one place: name, title, type, enclosure, coordinates and URLs.

The enclosed_by handles are the jurisdictional chain. A place with none is orphaned in the hierarchy, which is usually a place that got minted from an event's place string rather than created deliberately.

ParametersJSON Schema
NameRequiredDescriptionDefault
placeYesHandle or gramps_id of the place.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuine behavioral context beyond them by explaining that `enclosed_by` is the jurisdictional chain and that an empty chain marks an orphaned, event-minted place, which helps the agent interpret results. It does not cover failure behavior for an unknown handle.

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?

Two short paragraphs, with the core purpose front-loaded in the first sentence. The second paragraph earns its space by explaining a non-obvious returned field, though it could be tightened slightly.

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

Completeness4/5

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

With no output schema, the description correctly carries the return-shape burden by listing the fields. For a one-parameter read tool that is close to complete; only error/not-found behavior and the coordinate format are left unstated.

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

Parameters3/5

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

Schema description coverage is 100% and the single `place` parameter is documented as 'Handle or gramps_id'. The description's use of 'handles' loosely corroborates the input but adds no format, resolution, or ambiguity-handling detail beyond the schema, so the baseline 3 applies.

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 ('Read one place') and enumerates what comes back: name, title, type, enclosure, coordinates and URLs. This clearly separates it from the write siblings (add_place, update_place) and from other get_* readers on different resource types.

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

Usage Guidelines3/5

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

Usage is implied by the verb and the required `place` handle, but the description never states when to reach for this versus get_object/query_objects or how it pairs with update_place. The second paragraph tells the agent how to interpret one returned field, not when to call the tool.

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

get_relationshipA
Read-only

Work out how two people in the tree are related.

Returns the relationship in words plus the generation distance from each person to their common ancestor. related is false when no common ancestor was found within the search depth — which is a finding in itself if you expected one.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoGenerations to search. Server default if omitted.
person1YesHandle or gramps_id of the first person.
person2YesHandle or gramps_id of the second person.
all_pathsNoReport every relationship path, not just the closest. Use this when two people may be related more than one way.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, openWorldHint=false), so the bar is lower, yet the description still adds real behavioral context: the textual response form, the generation-distance output, and the meaning of a negative result bounded by search depth. It does not say what happens on an unknown handle or how depth defaulting behaves, keeping it out of the top band.

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

Conciseness5/5

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

Three short sentences with the core operation front-loaded, followed by the return shape and the negative-case caveat. No filler and nothing that repeats structured fields verbatim.

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

Completeness4/5

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

With no output schema, the description correctly takes on the return semantics (relationship wording plus generation distance to the common ancestor) and the false case. It is nearly complete; only error behavior for invalid handles and the effect of an omitted depth are unstated.

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

Parameters3/5

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

Schema description coverage is 100%, including a good description of `all_paths` and the person handle/gramps_id formats, so the schema carries the burden. The description only indirectly gestures at the `depth` parameter via the search-depth note and adds no format or constraint detail beyond the schema.

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

Purpose4/5

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

State a specific verb and resource: computing the relationship between two named people. It is clearly distinct in substance from single-person readers like get_ancestors, get_descendants and get_family, but it never names a sibling or otherwise explicitly delineates itself from them.

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

Usage Guidelines3/5

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

Usage is implied rather than stated. The description usefully explains that a false `related` result is itself informative when a relationship was expected, which guides interpretation, but it gives no explicit when-to-use vs. alternatives (e.g. get_ancestors for one-sided lineage) and no indication of how `depth` should be chosen.

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

get_report_optionsA
Read-only

Read one report's default options before running it.

Reports take a full option dict, not a partial one, so the way to change a single setting is to read these defaults and override that key.

ParametersJSON Schema
NameRequiredDescriptionDefault
report_idYesReport id, e.g. 'ancestor_report'.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: reports accept a full option dict, not a partial one, which changes how a caller must use the result. It doesn't describe the shape or size of the returned option dict.

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

Conciseness5/5

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

Two short sentences, front-loaded with the action, and the second sentence earns its place by explaining the non-obvious full-dict constraint. No padding.

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

Completeness4/5

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

For a one-parameter read tool with a full annotation set and no output schema, the description covers purpose and the key usage constraint adequately. The only gap is that it doesn't indicate what the returned options dict looks like or how to use it in a follow-up run_report call.

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

Parameters3/5

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

Schema description coverage is 100% for the single report_id parameter, which the schema already documents with an example. The description adds no syntax, format, or lookup guidance for report_id, so the baseline 3 applies.

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

Purpose4/5

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

The description gives a precise verb (read) and resource (one report's default options), and the phrase 'before running it' implicitly separates it from run_report and list_reports in the sibling set. It stops short of naming those siblings explicitly, so an agent must infer the routing rather than being told.

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

Usage Guidelines4/5

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

Clear context for when to call it: before running a report, and specifically when you want to change one setting. It doesn't name an alternative tool or state exclusions, but the workflow condition that selects this tool is unambiguous.

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

get_repositoryB
Read-only

Get a repository: name, type, URLs, address count, and (if available) the number of sources it holds.

ParametersJSON Schema
NameRequiredDescriptionDefault
repositoryYesRepository handle or gramps_id, e.g. 'R0001'.

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful return-content context (name, type, URLs, address count, source count) in the absence of an output schema, but says nothing about lookup failure behavior or handle resolution.

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?

One efficient, front-loaded sentence with no filler; the verb comes first and the returned fields follow compactly. The '(if available)' hedge is the only slightly loose element.

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

Completeness4/5

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

For a single-parameter read tool with full schema coverage and safety annotations, the description covers the important unknown (what comes back). It would be complete at 5 with a note on missing-handle behavior, but nothing essential is absent.

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

Parameters3/5

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

Schema description coverage is 100% and the single 'repository' parameter is fully documented in the schema with a handle/gramps_id example. The description adds no parameter syntax or format detail beyond that, so the baseline 3 applies.

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

Purpose4/5

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

Clear verb+resource ('Get a repository') and it enumerates the returned fields, so the agent knows exactly what it retrieves. However, it does not distinguish itself from generic siblings such as get_object or query_records, which could also fetch a repository.

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

Usage Guidelines2/5

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

No statement of when to use this vs get_object, query_records, or query_objects. The agent is left to infer that this is the repository-specific fetch, with no exclusions or prerequisites given.

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

get_researcherA
Read-only

Read the researcher details recorded for this tree.

These are embedded in every export, so they travel with any GEDCOM or Gramps XML you hand to someone else. Worth checking before sharing one.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful context that this data is embedded in every export and travels with GEDCOM/Gramps XML, but says nothing about the returned fields or scope of the read. A 3 is appropriate given annotations carry the behavioral load.

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?

Two sentences, front-loaded with the action, and every sentence contributes (what it reads, why it matters). Slightly more prose than strictly needed for the export-embedding point, but no filler.

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

Completeness4/5

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

For a zero-parameter read tool with no output schema, the description covers what it returns (researcher metadata), why it exists, and when to check it. Only the specific returned fields are unstated, a minor gap.

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?

The tool takes zero parameters, so there is no parameter meaning to convey. Baseline 4 applies; the description correctly does not invent parameter semantics.

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

Purpose4/5

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

States a clear verb ('Read') and resource ('the researcher details recorded for this tree'), which is distinct from the person/family/place get_* siblings. It does not explicitly contrast itself with any sibling, but the resource is specific enough that an agent can tell it apart.

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

Usage Guidelines4/5

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

Gives a concrete when-to-use signal: check it 'before sharing' an export. It does not name when-not to use it or point at alternatives, but the triggering context is explicit and actionable.

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

get_sourceA
Read-only

Get a source: title, author, publication info, abbreviation, linked repositories, media/note counts, attributes, and citation count.

Use to inspect a source before citing through it or editing it.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYesSource handle or gramps_id, e.g. 'S0001'.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful return-field context but does not disclose deeper behavioral traits such as error handling, authentication needs, or rate limits.

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

Conciseness5/5

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

The definition is two sentences, front-loads the core purpose and return contents, and follows with a concise usage note. Every phrase earns its place.

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?

No output schema exists, but the description explicitly lists the returned data fields, compensating well. Annotations cover the safe-read nature, and the usage sentence tells the agent when to reach for it.

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

Parameters3/5

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

Schema description coverage is 100%; the single 'source' parameter is documented with an example handle ('S0001'). The description adds no additional parameter semantics beyond what the schema already provides, so the baseline of 3 is appropriate.

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?

The description uses a specific verb ('Get') and resource ('a source'), then enumerates the fields returned. This clearly distinguishes it from sibling getters for other object types and from mutation tools like add_source or update_source.

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

Usage Guidelines4/5

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

It gives a clear context for use: 'inspect a source before citing through it or editing it.' That tells the agent when this tool is relevant, though it does not explicitly name alternatives or exclusions.

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

get_taskA
Read-only

Check whether a background job has finished, and whether it worked.

Undo, verification, import and reindex are dispatched to a worker and answer before the work is done. Poll this until finished is true, then read succeeded. Submitting one of those operations and never checking leaves you assuming an outcome you have not seen.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesTask id returned by whatever dispatched the work, e.g. the task_id from undo_transaction or verify_tree.

TDQS

A4.7/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 important async behavior: those operations answer before completion. It discloses the polling requirement and the relevant result fields (`finished`, `succeeded`), which is exactly what an agent needs for a job-status tool.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, then efficiently adds async context, polling instructions, and a warning. Every sentence contributes to correct invocation, and there is no redundant or filler text.

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?

For a read-only polling tool with one fully documented parameter and no output schema, the description supplies the missing return semantics by naming `finished` and `succeeded`. It also explains the broader workflow that necessitates polling, making the definition complete enough to invoke correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the `task_id` parameter is already documented in the schema, including an example link to `undo_transaction` or `verify_tree`. The description does not add new syntax, format, or constraint details beyond the schema, so the baseline score of 3 is appropriate.

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?

The description states a specific verb and resource: check whether a background job has finished and whether it worked. It distinguishes this from sibling operations by explaining that get_task retrieves the result of dispatched async work, not the work itself.

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?

It explicitly names the operations that require polling: undo, verification, import, and reindex. It then gives concrete usage instructions: poll until `finished` is true, then read `succeeded`, and warns against submitting such operations without checking the result.

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

get_timelineA
Read-only

Build a chronological timeline of someone's life events.

Each entry carries their age at the time, how many citations support the event, and the strongest confidence among them — so a timeline doubles as a readable audit of where the evidence thins out. uncited_count says how many events on it rest on nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum events to return.
targetYesHandle or gramps_id of the person or family.
ancestorsNoGenerations of ancestors whose events to fold in.
offspringNoGenerations of descendants whose events to fold in.
object_typeNoEither 'person' or 'family'.person
include_privateNoShow living people and private records in full. Only when the user asks for them; they are withheld by default.

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely new behavioral context beyond that: each entry carries age at the time, citation counts, strongest confidence, and an 'uncited_count' that signals how much of the timeline rests on no evidence. That audit-oriented framing is useful, though it says nothing about ordering ties, pagination, or how many events come back.

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?

The purpose is front-loaded in the first sentence and the remainder is spent on return-value semantics rather than filler. The second sentence is slightly ornate ('doubles as a readable audit of where the evidence thins out') but it does carry information.

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

Completeness4/5

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

With no output schema, the description usefully compensates by describing the shape and meaning of each entry and of 'uncited_count'. Combined with a fully documented schema and read-only annotations, an agent has enough to call it correctly, though the family mode and generational folding behavior remain unexplained.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters are already documented in the schema, which sets the baseline at 3. The description adds nothing about 'target' resolution, 'object_type', or the ancestor/offspring folding semantics, and 'uncited_count' it references is a return field rather than a parameter.

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

Purpose4/5

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

The description opens with a specific verb and resource: 'Build a chronological timeline of someone's life events.' That is far more informative than a tautology, but it never distinguishes itself from the sibling tool 'consolidated_timeline', which appears to serve an overlapping purpose. Without that differentiation the agent cannot reliably choose between the two.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no stated prerequisites, and no mention of when to prefer 'consolidated_timeline' or 'get_ancestors'/'get_descendants' over folding ancestor/descendant events in here. The 'only when the user asks' note about private records is a parameter-level caution inside the schema, not usage routing in the description.

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

get_transactionA
Read-only

Read one transaction in full, including the objects it changed.

list_transactions summarises; this shows what actually moved. Read it before undoing anything.

ParametersJSON Schema
NameRequiredDescriptionDefault
transaction_idYesId from list_transactions.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds valuable behavioral context the annotations do not: the return content includes the objects the transaction changed, and it implicitly links to the undo workflow. It stops short of describing the full response shape, but that is a minor gap against existing annotations.

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

Conciseness5/5

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

Three short, front-loaded clauses with zero filler: definition first, sibling contrast second, operational advice last. Every sentence earns its place.

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

Completeness4/5

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

With no output schema, the description usefully discloses that the result includes the changed objects, which is the key thing an agent needs beyond the trivial input. Coverage is strong for a read tool, though a fuller description of the payload structure would push it higher.

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

Parameters3/5

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

Only one parameter with 100% schema description coverage, so the schema already documents the transaction_id and its provenance ('Id from list_transactions'). The description adds no syntax or format detail beyond the schema, which is the expected baseline when the schema does the heavy lifting.

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 ('read one transaction in full') and immediately scopes it ('including the objects it changed'), distinguishing it from list_transactions by contrast. An agent can tell exactly what it does and how it differs from the summarizing sibling.

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 (list_transactions) and the condition that selects this tool over it ('list_transactions summarises; this shows what actually moved'), plus a concrete trigger for invocation ('read it before undoing anything'). Usage is explicit and actionable.

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

get_ydnaA
Read-only

Report a person's Y-DNA haplogroup, from broadest clade to terminal.

Y-DNA follows the direct paternal line only, so it speaks to one thread of a tree and is silent on every other. A shared terminal clade indicates a common paternal ancestor, usually far further back than any record reaches — it corroborates a surname line rather than proving a named link.

has_data is false when the person has no Y-DNA recorded, which is the normal case.

ParametersJSON Schema
NameRequiredDescriptionDefault
personYesHandle or gramps_id of the tested person.
include_rawNoInclude the raw SNP data string.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: it discloses the key output flag ('has_data is false when the person has no Y-DNA recorded, which is the normal case') and the interpretation limits of the data, which helps an agent avoid overclaiming a proven link.

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

Conciseness3/5

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

The purpose is front-loaded, which is good, but the definition runs to four short paragraphs for a two-parameter read-only getter. The middle paragraph on common paternal ancestors is genuinely interpretive but somewhat tangential to invoking the tool, and could be tightened.

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

Completeness4/5

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

No output schema exists, so the description carries return-value burden, and it does explain the critical has_data field and the clade ordering. It does not fully describe the overall return structure (e.g., how the terminal haplogroup is presented), but for a read-only tool with a documented schema it is largely complete.

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

Parameters3/5

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

Schema coverage is 100%, and both parameters (person, include_raw) are fully documented in the schema, including the raw SNP string. The description adds nothing about parameter syntax or the meaning of include_raw, so it sits at the baseline 3 where the schema does the heavy lifting.

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: 'Report a person's Y-DNA haplogroup, from broadest clade to terminal.' It is clearly distinct from siblings like get_dna_matches and parse_dna_segments, which handle matches and segment parsing rather than a single person's haplogroup.

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

Usage Guidelines3/5

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

The description gives interpretive context (paternal-line-only scope, what a shared terminal clade implies) but never explicitly says when to use this tool versus get_dna_matches or other DNA tools. Usage is implied rather than stated, and the 'normal case' of has_data=false is a useful hint but not a routing rule.

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

list_custom_filtersA
Read-only

List the custom filters already saved on this instance.

A saved filter can be reused by name from query_objects and the timelines, so a complicated selection is defined once.

ParametersJSON Schema
NameRequiredDescriptionDefault
namespaceNoRestrict to one namespace. Omit for all.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds cross-tool behavioral context (filters are reusable by name elsewhere), which is genuinely useful, but says nothing about ordering, pagination, or return shape. With annotations carrying the safety burden, a 3 is appropriate.

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?

Two short sentences, front-loaded with the core action, and no filler. The second sentence is contextual rather than wasteful, though it could be tightened slightly.

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

Completeness4/5

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

For a simple read-only listing tool with one documented optional parameter, annotations covering safety, and no output schema, the description gives the agent enough to invoke it correctly. Return format is unspecified, but with no output schema that omission is minor.

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

Parameters3/5

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

There is a single optional parameter (namespace) and schema description coverage is 100%, so the schema already documents it fully including the 'omit for all' default. The description adds no parameter-level detail beyond what the schema provides, making the baseline 3 correct.

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

Purpose4/5

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

The description states a specific verb and resource ('List the custom filters') and scopes it to the instance, so an agent knows exactly what is returned. It does not explicitly distinguish itself from nearby siblings like list_filter_rules or list_tags, which would be needed for a 5.

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

Usage Guidelines4/5

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

The second sentence explains the ecosystem context: saved filters can be reused by name from `query_objects` and the timelines, which tells the agent why this listing is useful. It stops short of stating when-not to use it or naming an alternative tool, so it is clear context without explicit exclusions.

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

list_event_typesA
Read-only

List the event type names this tree uses, with their stored integers.

Useful before a query_records filter, and as a check on itself: an unexpected type name in the list is usually a typo that Gramps silently accepted as a new custom type.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: unexpected type names usually signal typos that Gramps silently accepted as new custom types, which tells the agent how to interpret surprising output.

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

Conciseness5/5

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

Two short sentences, front-loaded with what is returned, followed by the interpretive caveat. Nothing is padded or repeated from the schema or annotations.

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

Completeness4/5

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

No output schema exists, but the description explains the return shape (type names paired with stored integers) and warns about the anomalous-case interpretation. For a zero-param read tool this is nearly complete; minor gaps remain around ordering or scale of the list.

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?

The tool takes zero parameters, so the schema has nothing to document and this dimension has no burden. The description correctly implies a whole-tree, unfiltered listing rather than adding spurious parameter detail.

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 (List) and resource (event type names) plus the exact payload ('with their stored integers'). It is clearly distinguishable from the sibling list_object_types, which covers a different resource domain.

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

Usage Guidelines4/5

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

Explicitly anchors usage: 'Useful before a query_records filter' names the downstream sibling and the condition that makes this call worthwhile. It omits any when-not-to-use or prerequisite guidance, so it falls short of a full 5.

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

list_filter_rulesA
Read-only

List the filter rules Gramps offers in a namespace.

This is the vocabulary that query_records and GrampsQL cannot reach: "is a descendant of", "has a common ancestor with", "matches another filter". Read it before building a custom filter with create_filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
namespaceNoPlural namespace: people, families, events, places, sources, citations, repositories, media, notes.people

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond the annotations: the rules represent semantic capabilities ("is a descendant of", "has a common ancestor with") that neither query_records nor GrampsQL can express. It does not describe the return shape, but the conceptual payload is well characterized.

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-loads the core action in the first sentence, then qualifies it with the query_records/GrampsQL limitation and the create_filter precondition. The quoted example phrases are illustrative rather than filler, though the prose is slightly loose.

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

Completeness4/5

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

For a single-parameter read-only list tool with annotations and no output schema, the description supplies enough: what is listed, the scope (namespace), the conceptual nature of the rules, and how it relates to create_filter. Only the return format is unaddressed, which is a minor gap.

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

Parameters3/5

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

Schema description coverage is 100% and the namespace parameter's allowed values are fully enumerated in the schema. The description only restates that a namespace is involved, adding no format or default guidance beyond what the schema already provides; baseline 3 applies.

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?

Specific verb (List) plus resource (filter rules) scoped to a namespace, and it explicitly distinguishes the tool from `query_records`/GrampsQL and from `create_filter` by describing this as the vocabulary those cannot reach. An agent can identify this tool's role without inspecting the schema.

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

Usage Guidelines4/5

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

"Read it before building a custom filter with create_filter" gives a clear precondition and names the related tool. It lacks an explicit when-not-to-use statement, but the intended usage context is unambiguous.

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

list_object_typesA
Read-only

The tree's type vocabularies (event types, attribute types, and so on).

Check an unfamiliar type string here first: Gramps accepts an unrecognised one as a NEW custom type rather than rejecting it, so a typo permanently enters the tree's vocabulary.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely non-obvious domain behavior — that Gramps silently accepts unrecognised types as new custom types, making typos permanent — which is valuable context not derivable from the structured fields.

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

Conciseness5/5

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

Two tight sentences, zero waste. The scoping statement leads and the actionable warning follows, both earning their place.

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

Completeness4/5

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

For a no-parameter, no-output-schema lookup, the description conveys what it returns and when to reach for it. It could briefly note the shape of the returned vocabularies, but nothing essential for correct invocation is missing.

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?

The tool takes zero parameters, so there is nothing for the schema or description to disambiguate. The baseline of 4 applies; the description neither helps nor harms here.

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

Purpose4/5

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

The description states the resource clearly — the tree's type vocabularies, enumerated as event types, attribute types, and others. The verb is only implied by the tool name, and the overlapping sibling list_event_types is not distinguished from this broader listing, so it falls short of full sibling differentiation.

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

Usage Guidelines4/5

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

It gives an explicit, well-motivated trigger: check an unfamiliar type string here first, backed by the consequence of skipping it. That is a clear 'when to use' with rationale, though it names no alternative tool and states no exclusions.

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

list_reportsA
Read-only

List the reports this Gramps instance can generate.

Gramps ships a full report engine — Ahnentafel, descendant reports, family group sheets, kinship, fan and relationship charts, statistics, and an end-of-line report that lists exactly where research stops. Each entry names the option keys it accepts; read the defaults with get_report_options before overriding any.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful context beyond annotations: the reports are generated by a bundled engine (Ahnentafel, descendant reports, kinship, etc.) and each list entry carries the option keys it accepts. It does not discuss pagination or cost, but for a local read-only enumeration that is minor.

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?

The first sentence front-loads the purpose, and the second sentence usefully conveys the breadth of the report catalogue. The enumeration of report types is somewhat long but earns its place by conveying scope; the closing sentence adds an actionable next step.

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

Completeness4/5

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

With no output schema, the description carries the return-value burden and does so partially — it tells the agent each entry names the option keys it accepts, which anticipates the follow-up get_report_options call. It does not describe the full shape of an entry (name, description fields), leaving a small gap.

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% and the tool takes zero parameters, so there are no parameter semantics to document — baseline 4 applies. The description correctly implies a no-argument call by framing the output rather than any input.

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 ('List the reports this Gramps instance can generate') and implicitly scopes it as a discovery/enumeration call distinct from run_report and get_report_options. An agent can tell what this returns and how it differs from the sibling report tools.

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

Usage Guidelines4/5

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

Explicitly routes the agent to a sibling in a specific condition: 'read the defaults with get_report_options before overriding any.' This establishes the list → inspect options → run workflow. However, it does not explicitly state when not to use this tool or contrast it with run_report/export_backup.

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

list_tagsA
Read-only

List all tags in the tree with their handle, name, and color.

Use to see what labels already exist before tagging (tag_object matches by exact name).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the returned field set, which is useful, but says nothing about ordering, pagination, or scope of the 'tree' beyond the bare term. Some added value over annotations, but not rich.

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

Conciseness5/5

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

Two short sentences, the purpose front-loaded and the usage hint second. Every clause earns its place with no filler or repetition of the schema.

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?

For a zero-parameter read-only tool with no output schema, the description supplies the return fields and the reason to call it. Nothing an agent needs to invoke it correctly is absent.

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?

The tool takes zero parameters (schema coverage 100%), so there is nothing for the description to disambiguate; the baseline for a parameterless tool is 4. The handle/name/color mention describes outputs, not inputs, and does not mislead.

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 ('List all tags in the tree') and enumerates the returned fields (handle, name, color), so an agent knows exactly what it gets. It is clearly a read-only enumeration tool, distinguishable from mutation siblings like tag_object.

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?

Explicitly names the situation ('see what labels already exist before tagging') and the alternative it feeds into ('tag_object matches by exact name'), which routes the agent correctly. The when-to-use condition is concrete rather than implied.

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

list_tasksA
Read-only

List recent background jobs for this tree, newest first.

Use when you have lost a task_id, or to see whether anything is still running before starting a write session.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum tasks to return.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, covering the safety profile. The description adds ordering ('newest first') and scope ('for this tree'), which is useful but modest; it does not cover return format or pagination behavior beyond the limit parameter.

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

Conciseness5/5

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

Two short sentences with the core scope and ordering front-loaded, followed by concise usage guidance. No filler or repetition.

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

Completeness4/5

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

For a simple list tool with full parameter coverage and annotations that already declare its safety profile, the description is nearly complete. It could note the default limit or pagination, but those are minor gaps.

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

Parameters3/5

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

Schema description coverage is 100% for the single limit parameter, so the schema already documents it fully. The description mentions no parameter details, making the baseline 3 appropriate when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb and resource ('List recent background jobs for this tree') plus the ordering ('newest first'). It differentiates from get_task indirectly by noting the 'lost a task_id' scenario, but does not explicitly name the alternative.

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

Usage Guidelines4/5

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

Gives two concrete when-to-use cases: recovering a lost task_id, and checking for running jobs before a write session. No explicit when-not conditions, but the context is clear enough to select this over siblings.

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

list_transactionsA
Read-only

Recent writes to the tree: what changed, when, by which user.

Each entry's transaction_id is what undo_transaction takes. Useful for "what did that bulk pass actually do?" and for finding the transaction to reverse when it did the wrong thing.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many, newest first.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful audit-log context: entries are recent writes, include actor/timestamp/change details, and expose transaction_id as the value consumed by undo_transaction. It does not cover pagination or auth details beyond the schema.

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

Conciseness5/5

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

Front-loads the resource and returned fields in the first sentence, then immediately explains the actionable transaction_id and typical use cases. Every sentence earns its place.

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?

For a simple one-parameter read-only list tool with no output schema, the description is complete enough: it explains what entries contain, what the transaction_id is for, and why an agent would call it. No important invocation context is missing.

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

Parameters3/5

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

Schema coverage is 100%, and the sole parameter is documented in the schema as 'How many, newest first.' The description adds no additional syntax or meaning for limit, so the baseline 3 is appropriate.

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: listing recent writes to the tree, with what changed, when, and by which user. It also links the returned transaction_id to undo_transaction, distinguishing this audit-list tool from the undo action.

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

Usage Guidelines4/5

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

Gives two concrete use cases: auditing what a bulk pass did and finding the transaction to reverse. It does not explicitly state when not to use it or name all alternatives such as get_transaction, so it stops short of a 5.

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

list_unsourced_factsA
Read-only

Audit: list events that lack a citation or are tagged UNSOURCED.

This is the core quality query for a fully-cited tree -- run it to find facts that still need a source. Returns each offending event with its person, type, date, and the reason ('no-citation' or 'tagged-unsourced').

ParametersJSON Schema
NameRequiredDescriptionDefault
personNoOptional: restrict to one person (handle/gramps_id).
include_privateNoShow living people and private records in full. Only when the user asks for them; they are withheld by default.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered; the description adds genuine value beyond that by describing the exact return shape (person, type, date, reason) and the two reason values. It omits any note on result limits, ordering, or pagination, which is the remaining gap.

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 'Audit: list events...' so the purpose lands immediately, then a short usage sentence and a return-value sentence. Slightly fragmented by line breaks but every sentence earns its place; no filler.

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

Completeness4/5

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

With no output schema, the description carries the return-value burden and does so adequately by naming the fields and reason codes. For a two-parameter read-only audit query this is nearly complete, missing only result-set size and ordering behavior.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters (person, include_private) are already fully documented in the schema, including the privacy default behavior. The description adds no syntax or format detail beyond that, so the baseline 3 applies.

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 (list) and a precisely scoped resource (events lacking a citation or tagged UNSOURCED), and even enumerates the two disqualifying conditions. An agent can distinguish this audit query from generic retrieval siblings like get_facts or query_objects without opening any schema.

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

Usage Guidelines4/5

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

Explicitly frames it as 'the core quality query for a fully-cited tree' and says to run it 'to find facts that still need a source', which is a clear usage context. It does not name alternatives or exclusions (e.g. verify_tree, find_duplicates), so it stops short of full when-not guidance.

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

merge_objectsA
Destructive

Merge two objects that are the same thing. Dry-run by default.

This uses Gramps' own server-side merge: every reference to drop is re-pointed at keep and the subordinate lists are unioned, in one transaction. Do NOT do this by hand: a manual merge that misses one of the lists the dropped object carries loses what was on it.

Before merging, be sure they really are one thing. Two records OF the same event are two documents: an index entry and the register page it indexes stay separate, and merging them would turn two independent citations into one, silently weakening every fact that rested on both. Conversely, the same census page entered once per household member IS one document, and leaving the duplicates makes single-sourced facts look corroborated.

Reversible: the merge is one transaction, so list_transactions + undo_transaction can back it out.

ParametersJSON Schema
NameRequiredDescriptionDefault
dropYesHandle or gramps_id of the object absorbed into it.
keepYesHandle or gramps_id of the object that SURVIVES.
dry_runNoTrue (default) reports what would move without changing anything. Set False to apply.
object_typeYesperson, family, event, place, source, citation, repository, media, or note.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare destructiveHint=true and readOnlyHint=false, but the description adds real behavior: dry-run is the default, the operation runs as a single atomic transaction, references to `drop` are re-pointed and subordinate lists unioned, and it is reversible via the transaction log. It also discloses the failure mode of the manual alternative (silent loss of dropped-object lists). Nothing here contradicts the annotations.

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 the action and the dry-run default, then proceeds in tight paragraphs covering mechanics, judgment criteria, and reversibility. It is longer than average, and the duplicated emphasis on the manual-merge hazard appears twice, but every sentence carries actionable content rather than filler.

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?

For a 4-parameter mutation tool with no output schema, the description supplies everything an agent needs: default dry-run behavior, atomicity, reversibility route, and the domain judgment required to pick the right inputs. An agent could invoke this correctly without further documentation.

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 meaning the schema does not: it explains mechanically what happens to `keep` vs `drop` (references re-pointed, lists unioned) and reinforces that dry_run returns what would move rather than applying it. It does not expand on the object_type enumeration beyond the schema's own list, keeping it short of a 5.

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 (merge two objects) with the crucial scope qualifier 'that are the same thing', which is exactly the judgment the tool demands. It is clearly distinguishable from siblings like find_duplicates (which locates candidates), delete_object (which removes), and detach_object (which unlinks rather than absorbs).

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?

Goes well beyond a context hint: it gives explicit when-to-use and when-NOT-to-merge criteria with concrete counter-examples (an index entry vs. the register page it indexes stay separate; the same census page entered per household member IS one document). It also names the alternative path for reversal (list_transactions + undo_transaction) and warns against doing the merge by hand.

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

ocr_mediaA
Read-only

Run OCR on a document image, server-side, to locate text within it.

A finding aid, not evidence. OCR output is a machine's guess at the writing, and it is at its worst on exactly the handwritten records that matter most. Use it to find WHERE something appears in a long scan; read the image before citing what it says.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoTesseract language code ('eng', 'deu', 'swe', 'nor', ...).eng
mediaYesMedia handle or gramps_id.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only declare readOnlyHint and openWorldHint, so the description carries the behavioral load and does so well: it discloses server-side execution and, more importantly, that output is a low-confidence machine guess that degrades on handwriting. It stops short of any operational detail (runtime, size limits, failure behavior), which keeps it just under a 5.

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

Conciseness5/5

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

Three short lines, all front-loaded: operation first, then the epistemic caveat. Every sentence earns its place, with no restatement of the tool name or title.

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

Completeness4/5

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

With no output schema, the description should signal the return shape; 'locate text within it' implies positional results but does not specify format. That is the only meaningful gap for a two-parameter read-only tool with a fully documented schema.

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

Parameters3/5

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

Schema description coverage is 100% — both 'media' (handle or gramps_id) and 'lang' (Tesseract codes) are documented in the schema. The description adds nothing about either parameter, so the baseline 3 applies.

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 (OCR), resource (document image), and execution model (server-side), plus the goal of locating text. No sibling tool performs OCR, so this is immediately distinguishable from the surrounding media/person/event management tools.

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

Usage Guidelines4/5

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

Gives a clear when-to-use condition ('find WHERE something appears in a long scan') and a when-not-to-trust-it warning ('read the image before citing what it says'). It does not name a specific alternative tool, but the guidance is strong and actionable for a niche operation.

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

parse_dna_segmentsA
Read-only

Parse pasted shared-segment data into structured segments and totals.

Use this to check what a match file actually contains before recording it. Returns each segment plus the total and largest-segment centiMorgans.

If nothing parses, parsed is false and the reason is given. That distinction matters: the server answers unreadable input with zero segments and a success status, which would otherwise read as "this person shares no DNA" rather than "I could not read that".

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesRaw shared-segment data, as a testing company exports it: rows of chromosome, start, stop, centiMorgans, SNPs, separated by commas or tabs, with an optional side of M, P or U. A header row is tolerated.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and openWorldHint=false, and the description adds substantial context beyond them: the return shape (segments, total and largest-segment centiMorgans) and the crucial failure semantics where `parsed` is false with a reason, explicitly contrasted against the server's misleading zero-segment success response.

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

Conciseness5/5

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

Front-loads the purpose in one sentence, then usage, then return values, then the subtle failure case. Every sentence carries distinct information and none is redundant with the schema or annotations.

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 no output schema, the description still tells the agent what comes back (segments, total cM, largest-segment cM, `parsed` flag plus reason) and warns about the zero-segment/success ambiguity. Nothing needed to interpret a result correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the schema field already specifies the CSV/TSV row format, optional side letter and tolerated header row. The description adds only the framing term 'pasted shared-segment data', so the schema does the heavy lifting and the baseline 3 applies.

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 ('parse ... shared-segment data into structured segments and totals') and clearly separates itself from the DNA-writing siblings like add_dna_match and the reading sibling get_dna_matches. An agent can identify the tool's job without opening the schema.

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

Usage Guidelines4/5

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

Gives concrete usage context ('check what a match file actually contains before recording it'), which implies the workflow position relative to add_dna_match. It does not, however, explicitly name that sibling or state when not to use this tool, so it falls short of a full when/when-not/alternatives map.

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

query_objectsA
Read-only

Query any collection with a server-side filter. The workhorse for audits.

Use this instead of fetching a collection and filtering it yourself: whole-collection pulls are slow on any real tree, and the filter runs in the database. Typical audit questions it answers directly:

  • uncited high-confidence claims: citations where confidence >= 3 AND page = ""

  • documents with no image: sources where media_list.length = 0

  • anonymous media: media where desc = ""

To ask "what cites this source?" use get_backlinks -- a source has no citation_list, because citations point at IT, and reading citation_list on a source reports zero for every source in the tree.

Private records and living people come back as redacted stubs.

ParametersJSON Schema
NameRequiredDescriptionDefault
gqlNoGrampsQL filter, applied server-side over the RAW object JSON. Single '=' for equality (NOT '=='), '~' for substring, '<list>.length' for sizes, combined with AND/OR. Examples: 'confidence >= 3 AND page = ""' (high-confidence citations with no locator), 'media_list.length = 0' (sources with no image), 'desc = ""' (undescribed media), 'description ~ "1871"'. TRAPS: a field the object lacks is not an error, it matches nothing -- event 'type' is one (use query_records). Booleans compare as 0/1: 'private = 1', never 'private = true'.
keysNoComma-separated fields to return, e.g. 'gramps_id,title,media_list'. Strongly recommended -- whole objects are large. NEVER build a write payload from a keys= result: writes replace the whole record.
pageNoPage of results, 1-based.
sortNoSort key; prefix '-' for descending (e.g. '-change').
limitNoMax rows to return.
handlesNoFetch these specific handles in one request.
gramps_idsNoFetch these specific gramps_ids (e.g. ['S0001','S0002']).
object_typeYesOne of: person, family, event, place, source, citation, repository, media, note, tag.
include_privateNoShow living people and private records in full. Only when the user asks for them; they are withheld by default.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already mark the operation as read-only, but the description adds important behavior beyond that: private records and living people are returned as redacted stubs unless include_private is requested. It also explains that filtering runs in the database, which sets performance expectations.

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?

The description is front-loaded with the core purpose and then structured with examples and an alternative-tool note. It is slightly redundant because the gql examples are also present in the schema, but the overall length is justified for a complex query tool.

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

Completeness4/5

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

Given the rich schema and read-only annotations, the description covers the most important missing context: server-side filtering, audit use cases, privacy redaction, and the get_backlinks alternative. It does not describe the response shape or pagination behavior, which is a minor gap because no output schema exists.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all parameters, including gql syntax, traps, keys, pagination, sorting, and handle/id lookups. The description reinforces the server-side filter concept and gives audit examples, but it does not add parameter semantics beyond what the schema provides.

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?

The description states a specific verb and resource: query any collection with a server-side filter. It also differentiates the tool from the common manual approach of fetching and filtering client-side, and names the get_backlinks alternative for reverse-citation questions.

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?

It explicitly says when to use this tool instead of whole-collection pulls and when to use get_backlinks instead. The audit examples further clarify the intended use cases without leaving the agent to infer them.

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

query_recordsA
Read-only

Query any collection server-side, with columns, filters and sorting.

More capable than query_objects and the tool to reach for on an audit. It reads indexed columns, reaches arbitrary paths inside the stored object, and follows relationships — so "families where the mother died before the father" or "events whose place is in Ohio" are single queries.

It is the only way to filter events by type. GrampsQL cannot: the word is shadowed, so type = "Birth" silently matches nothing. Pass event_type here instead.

Returns rows plus a total count and a next_after cursor. Private records, living people and families with a living parent come back as redacted stubs.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoCursor from a previous response's next_after, for paging past the first page.
limitNoMaximum rows (1-500).
whereNoConditions combined with AND. Each is {"column": <name or json_path>, "op": <op>, "value": ...}. Operators: eq, ne, lt, lte, gt, gte, like, regex, contains, in. Use "value_column" instead of "value" to compare two columns.
selectNoColumns to return. A plain column name, or {"json_path": [...], "as": "label"} to reach into the stored object. A path may cross a relationship: person->birth/death, family->father/mother, event->place. Omit for the default columns.
order_byNoSort keys, each {"column": ..., "direction": "asc" or "desc"}. json_path is not usable here.
event_typeNoEvents only. Filter by type name such as 'Birth' or 'Census'. Translated to the integer the tree stores, which is the only way event type is filterable at all.
where_exprNoAn expression instead of `where`, e.g. "surname == 'Smith'".
object_typeYesCollection to query: person, family, event, place, source, citation, repository, media, note, or tag.
include_privateNoShow living people and private records in full. Only when the user asks for them; they are withheld by default.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely non-structured behavior: returns rows plus a total count and a `next_after` cursor, and that private records, living people and families with a living parent come back as redacted stubs. It does not cover permissions/rate limits, but the redaction and paging disclosures are substantive.

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

Conciseness5/5

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

Front-loads what the tool is and its key differentiator, then layers capability, the event_type gotcha, and return/redaction behavior. Every sentence carries an operational fact; none is filler.

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?

For a 9-parameter read tool with no output schema, the description compensates by describing the return shape (rows, total count, next_after cursor) and the redaction behavior. An agent has enough to call it correctly and interpret results reasonably.

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. The description adds meaning beyond the schema by explaining why `event_type` exists (the word is shadowed in GrampsQL, so plain filtering silently matches nothing) and constraining `include_private` to 'only when the user asks for them.' That is more than a restatement of the schema text.

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 ('Query any collection server-side') and immediately distinguishes itself from the sibling `query_objects` by capability. It also names the collection scope (person, family, event, etc.), so the agent can differentiate it from get_* and search_people without opening a schema.

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?

Explicitly routes the agent: 'More capable than query_objects and the tool to reach for on an audit,' plus the when-to-use-for-events rule and the alternative (GrampsQL) that fails. Both the positive case and the substitution case are stated.

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

run_reportA
Idempotent

Generate a report and return the file it produced.

Living people and private records are left out (living_people 0, incl_private false) unless you pass those options or include_private; Gramps' own default includes both.

Usually runs in the background, returning a task_id to poll with get_task.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNoLanguage code for the report output.
optionsNoOverrides for the report's defaults, merged over them. Common keys: 'pid' (the central person's gramps_id), 'maxgen', 'off' (output format), 'living_people'.
report_idYesReport id, from list_reports.
include_privateNoShow living people and private records in full. Only when the user asks for them; they are withheld by default.

TDQS

A3.8/5.0
Behavior4/5

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

With annotations present (readOnlyHint=false, idempotentHint=true), the description adds real behavioral value beyond them: privacy defaults that differ from Gramps' own defaults, and the dual return path (file vs. background task_id). The background/polling behavior is exactly the kind of context an agent needs and no annotation conveys. It does not, however, state permissions or side effects of writing the file.

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?

Three compact sentences, front-loaded with the action and return. The parenthetical option dump is slightly noisy but each sentence carries load (privacy defaults, return path, polling).

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

Completeness4/5

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

With no output schema, the description carries the burden of describing return values and does so (file, or task_id to poll with get_task). Privacy semantics and the background-execution caveat are covered, leaving only permissions/error behavior unstated.

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 genuine nuance beyond the schema by explaining that living_people/incl_private defaults diverge from Gramps' own defaults, and by connecting options/include_private to that behavior. This is meaningful added meaning, not just repetition.

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

Purpose4/5

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

The description states a specific verb+resource ('Generate a report and return the file it produced'), which clearly distinguishes it from list_reports and get_report_options among siblings. It stops short of naming those siblings explicitly, so an agent must infer the boundary from the domain.

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

Usage Guidelines3/5

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

It gives a conditional trigger ('unless you pass those options or include_private') and explains polling via get_task, which is useful routing. However it never states when to call run_report vs. list_reports/get_report_options, nor any prerequisite (like needing a valid report_id from list_reports, which is only implied by the schema).

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

search_peopleA
Read-only

Search people by name substring and optional birth-year range.

Bulk output: probably-living people (born < 110 years ago with no recorded death) and records marked private are returned as redacted stubs (ids only) unless include_private is set. Fetch a specific person by id with get_person if you need their detail.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName substring to match (case-insensitive).
birth_year_maxNoLatest birth year.
birth_year_minNoEarliest birth year.
include_privateNoShow living people and private records in full. Only when the user asks for them; they are withheld by default.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint=false; the description adds genuinely non-obvious behavior: probably-living (born <110y, no recorded death) and private records are returned as redacted id-only stubs unless include_private is set. This is exactly the kind of disclosure an agent cannot get from structured fields.

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

Conciseness5/5

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

Front-loaded with the core purpose, then the redaction caveat, then the alternative tool. The parenthetical defining 'probably-living' earns its place, and there is no filler.

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

Completeness4/5

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

There is no output schema, so the description bears the burden of describing results, and it does explain the redacted-stub output shape well. It omits return-format details like pagination or result limits, leaving a minor gap for a bulk search tool.

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 semantic value by tying include_private to the redaction behavior ('unless include_private is set') and clarifying the birth-year range scope of the search. It slightly exceeds the schema-only baseline without introducing new parameter syntax.

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 people by name substring and optional birth-year range') and explicitly distinguishes the tool from the sibling get_person, which it names for detail retrieval. An agent can tell what this does and what it is not for without opening the schema.

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

Usage Guidelines4/5

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

Gives clear context on the default redaction behavior and routes the agent to get_person when full detail is needed, and notes include_private should be used only when the user asks. It stops short of positioning this against other query siblings like query_objects or query_records, so it is short of the explicit when/when-not bar.

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

set_privateA
DestructiveIdempotent

Set (or clear) the Gramps private flag on an object.

Private records are withheld from bulk output (queries, searches, tree walks, timelines, reports) unless a call passes include_private.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYesHandle or gramps_id of the object.
privateNoTrue to mark private (default), False to un-mark.
object_typeYesType of the object: 'person', 'family', 'event', 'source', etc.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description adds real value beyond those: it explains what marking private actually does (withheld from queries, searches, tree walks, timelines, reports unless include_private is passed) and that the operation is reversible via 'clear'. This is useful behavioral context, though it doesn't discuss permissions or return shape.

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

Conciseness5/5

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

Two sentences, front-loaded with the core action, and the second sentence earns its place by defining the semantic effect of the flag. No filler or redundancy.

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

Completeness4/5

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

For a self-contained mutation tool whose safety profile is fully covered by annotations and whose parameters are fully documented by the schema, the description is complete: it defines the operation and the meaning of the flag. The absence of an output schema is not a gap since no return value is needed.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all three parameters, giving a baseline of 3. The description reinforces the meaning of the private flag but adds no syntax or format detail beyond the schema.

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

Purpose4/5

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

States a specific verb and resource: 'Set (or clear) the Gramps private flag on an object.' This is unambiguous and far from a tautology. It doesn't explicitly differentiate from any sibling (e.g., tag_object), but no sibling shares this exact resource, so the purpose stands clearly on its own.

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

Usage Guidelines3/5

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

The description explains the consequence of the flag and that it can be set or cleared, which implies when you'd reach for the tool. However, it gives no explicit when-to-use/when-not guidance or named alternatives, so usage remains inferred rather than stated.

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

tag_objectA

Attach a named Tag to an object, creating the Tag if it doesn't exist yet.

Tags are lightweight cross-cutting labels ('Verified', 'Needs review', 'DNA-confirmed'). Matching is by exact name; an existing tag is reused.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagYesTag name (found-or-created by exact match), e.g. 'Verified'.
colorNoOptional hex color for a newly-created tag, e.g. '#FF8800'. Defaults to '#4444FF'. Ignored if the tag already exists.
targetYesHandle or gramps_id of the object to tag.
object_typeYesType of the object to tag: 'person', 'family', 'event', 'source', 'citation', 'place', 'repository', 'media', 'note'.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare the safety profile (readOnly=false, destructive=false, openWorld=false, idempotent=false). The description adds real behavioral context beyond that: tags are found-or-created, matched by exact name, and existing tags are reused rather than duplicated. It stops short of describing failure modes or what happens if the object already carries the tag.

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

Conciseness5/5

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

Three short sentences: the action and its create-if-missing behavior are front-loaded, followed by purpose examples and the matching rule. No filler; every sentence earns its place.

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

Completeness4/5

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

For a 4-parameter mutation with annotations and no output schema, the description covers the essential semantics (attach, create-if-missing, exact matching). It does not state what the call returns or how it behaves if the tag is already attached to the object, which is the main remaining gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents tag, target, object_type, and color (including the default and the 'ignored if the tag already exists' rule). The description's 'exact name' note largely restates the schema's 'found-or-created by exact match', adding little new parameter meaning. Baseline 3 applies.

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 (attach a Tag to an object) plus the find-or-create behavior. An agent can distinguish this from siblings like list_tags, add_attribute, or cite_object without opening any schema.

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

Usage Guidelines3/5

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

The description conveys what tags are for via examples ('Verified', 'Needs review', 'DNA-confirmed'), which implies the usage context, but it never says when to prefer tag_object over related labeling tools such as add_attribute or cite_object, nor any exclusions. Usage is inferable but not stated.

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

unciteA
Destructive

Detach a citation from an object, deleting it if it is left orphaned.

Detaching without deleting is how orphan citations accumulate: the fact the citation supported is gone, but the citation sits in the database still looking like evidence of something. Use this when a citation was attached to the wrong fact, or when a superseded bucket citation is replaced by the real record.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesHandle or gramps_id of that object.
citationYesCitation handle or gramps_id to remove.
object_typeYesType of the object to detach from.
delete_if_orphanNoDelete the citation if nothing else references it after detaching. Leave True unless you are keeping it deliberately.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuine context beyond that: the citation may be deleted when orphaned, and the narrative explains the downstream consequence of orphan accumulation. It does not address reversibility (undo_transaction) or return format, so not a 5.

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

Conciseness3/5

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

The first sentence is well front-loaded and carries the core action. The second paragraph is editorializing ("still looking like evidence of something") and could be tightened, though the rationale for avoiding orphans does have some instructional value.

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

Completeness4/5

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

For a destructive mutation with full annotation coverage and a fully described schema, the description supplies purpose, triggers, and the orphan-deletion consequence. It omits return information and reversibility, but with no output schema present the remaining gap is minor.

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

Parameters3/5

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

Schema coverage is 100% and all four parameters are self-documented, including delete_if_orphan's warning to leave it True. The description's orphan discussion overlaps conceptually with that parameter but adds no syntax or format detail. Baseline 3 is appropriate when the schema does the heavy lifting.

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+resource ("Detach a citation from an object") and immediately adds the consequential modifier "deleting it if it is left orphaned." An agent can distinguish this from siblings like cite_object, update_citation, and detach_object without opening any schema.

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

Usage Guidelines4/5

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

Gives concrete when-to-use conditions: "Use this when a citation was attached to the wrong fact, or when a superseded bucket citation is replaced by the real record." There are no explicit exclusions or named alternatives (e.g. detach_object vs. uncite), so it stops short of a 5.

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

undo_transactionA
Destructive

Undo a past transaction, after checking whether it can be undone cleanly.

A conflict means an object was edited again after this transaction; undoing anyway throws that later edit away. The conflict check is free and runs first, so the default tells you what you are dealing with before anything changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoUndo even when there are conflicts. This DISCARDS edits made to those objects after the transaction. Use deliberately.
dry_runNoTrue (default) only checks whether the undo is clean. Set False to actually undo.
transaction_idYesFrom list_transactions.

TDQS

A4.3/5.0
Behavior5/5

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

With annotations already declaring destructiveHint=true, the description adds valuable behavior beyond structured data: the conflict check is free and runs first, a conflict means a later edit was made, forcing the undo discards that later edit, and the default dry-run tells the agent what it is dealing with before changes occur. This is rich, non-redundant behavioral context.

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

Conciseness5/5

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

Three compact sentences with no waste. The core purpose and safety check are front-loaded, followed by the conflict consequence and the default behavior. Every sentence earns its place.

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?

For a destructive mutation tool with rich annotations and full schema coverage, the description supplies the missing behavioral context: conflict semantics, default dry-run behavior, and the consequence of forcing an undo. No output schema exists, so return values need not be explained, and the definition is complete enough for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so the parameters are fully documented in the schema. The description does not add syntax or format details beyond what the schema already provides, so the baseline of 3 applies.

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

Purpose4/5

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

The description states a specific verb and resource: 'Undo a past transaction.' It adds the conflict-check behavior, making the scope precise. However, it does not explicitly differentiate this tool from related siblings like list_transactions or get_transaction, so it falls short of the top score.

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

Usage Guidelines4/5

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

It clearly frames the tool as an undo operation that checks for conflicts first, and explains that the default is a safe check before anything changes. This gives strong context for use, though it does not explicitly state when not to use it or name alternative tools.

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

update_citationA
DestructiveIdempotent

Edit a citation's locator, confidence, date, or the source it points at.

A page-less citation on a long document is not a locator, and a confidence is a per-instance judgement, not a property of the source class.

IMPORTANT: a citation carries ONE confidence, and it belongs to ONE claim. Every fact attached to this citation shares whatever you set here. If the same page supports a second, different claim (a census page proving both "this child appears here" and "these are her parents"), make a SECOND citation on the same source and page -- do not re-grade this one.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate recorded/accessed.
pageNoThe locator: WHERE in the source this fact appears ('p. 45, entry 12', 'ED 12, sheet 4A, dwelling 57', memorial number). Omit to leave unchanged.
sourceNoRE-POINT this citation at a different source (handle or gramps_id). Use when a fact was cited to a compiled bucket but the real record is in the tree, or when a container source has been split.
citationYesCitation handle or gramps_id (e.g. 'C0001').
confidenceNoRe-grade this citation. very_high is for an original record read from an image, and nothing else.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations cover the safety profile (destructiveHint=true, idempotentHint=true), and the description adds genuinely new behavioral context: a citation holds ONE confidence shared by every attached fact, so re-grading propagates to all of them. That shared-state consequence is exactly the kind of side effect annotations cannot express.

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

Conciseness3/5

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

The IMPORTANT block is well front-loaded and the census example makes the rule concrete. The middle aphoristic sentence about page-less citations and per-instance confidence is opaque and only loosely actionable, costing some signal-to-noise.

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

Completeness4/5

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

All five parameters are described in-text or in schema at 100% coverage, no output schema exists, and the annotations carry safety. The one gap is that no return/confirmation behavior is described, but for a straightforward in-place edit that is minor.

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 goes further by framing the page/confidence distinction ('a page-less citation is not a locator', 'confidence is a per-instance judgement, not a property of the source class'), which shapes how an agent should choose values.

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

Purpose4/5

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

The opening sentence gives a specific verb (Edit) plus the exact editable resources (locator, confidence, date, source pointer), which is enough to separate it from add_citation/get_citation. It does not, however, explicitly contrast itself with the closely related siblings update_source or the generic update_object_fields, so the differentiation is implicit rather than stated.

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

Usage Guidelines3/5

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

The IMPORTANT paragraph gives real usage guidance for one decision: when the same page supports a second claim, add a new citation instead of re-grading. That is valuable, but it is a narrow in-tool rule; there is no guidance on when to reach for update_citation versus add_citation, uncite, or update_source.

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

update_eventA
DestructiveIdempotent

Edit an existing event's date, place, and/or description.

Only the fields you provide are changed; the rest are left as-is. This does NOT change the event's citations -- use cite_event to add a source.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoNew date, free text in Gramps style ('1899', 'ABT 1900'). Omit to leave unchanged.
eventYesEvent handle or gramps_id (e.g. 'E0007').
placeNoNew place: existing handle/gramps_id, exact title, or exact unique name — created only if nothing matches. Omit to leave unchanged.
descriptionNoNew free-text description. Omit to leave unchanged.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=false, so the description's job is to add context. It does add the important partial-update semantics and the citation-scope limitation, which go beyond the annotations. It stops short of describing undo/reversibility or the response shape.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core action, then the partial-update rule, then the sibling pointer. No filler or redundancy.

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

Completeness4/5

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

For a mutation tool with full annotations and no output schema, the description covers the essential semantics: partial updates, field omission behavior, and the citation boundary. Only minor gaps remain (no mention of undo/error behavior or return value), which the annotations and schema largely absorb.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents 'event', 'date', 'place', and 'description' including Gramps date syntax and the place-resolution rules. The description only names the same fields, so the baseline 3 applies; it adds no syntax or format detail beyond the schema.

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 (Edit) and resource (event) plus the exact editable fields (date, place, description). This cleanly distinguishes it from sibling mutators like update_place, update_person, or update_citation without needing to open any schema.

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?

Explicitly states the partial-update rule ('Only the fields you provide are changed; the rest are left as-is') and an exclusion with an alternative route ('This does NOT change the event's citations -- use cite_event'). Both when-to-use and when-not-to-use are covered.

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

update_mediaB
DestructiveIdempotent

Edit a media object's description, date, or path.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate of the document/photo.
pathNoStored path/filename.
mediaYesMedia handle or gramps_id.
descriptionNoWhat this document IS ('1900 US census, Cedar Flat, Brannock Co., Ohio, ED 12 sheet 4A'). Files are stored under checksum names, so without this the media list says nothing about the document.

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the mutation/safety profile is covered. The description adds nothing about partial-update semantics (what happens to unspecified fields), permissions, or reversibility, so it only marginally extends beyond the structured data.

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

Conciseness5/5

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

A single front-loaded sentence with zero filler; every word earns its place.

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

Completeness3/5

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

For a destructive, idempotent mutation with no output schema, the description omits partial-update behavior and any mention of the required media handle as the target selector. Annotations carry the safety profile, but an agent still lacks full behavioral context.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters are documented in the schema, including a detailed explanation of the 'description' field's purpose. The description merely paraphrases three of the four fields and omits the required 'media' handle, adding no semantics beyond the schema. Baseline 3 applies.

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

Purpose4/5

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

States a specific verb (Edit) and resource (media object) plus the three editable fields, which cleanly distinguishes it from add_media, get_media, and attach_media. It lacks explicit sibling differentiation against update_object_fields, but the purpose is unambiguous.

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

Usage Guidelines2/5

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

No guidance on when to use this versus update_object_fields or the generic update path, and no stated prerequisites (e.g., needing an existing media handle). The agent must infer context entirely.

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

update_object_fieldsA
DestructiveIdempotent

Set scalar fields on any object -- the escape hatch for places, notes, repositories and the rest.

Only scalar fields are settable. Structural lists (citation_list, event_ref_list, media_list, ...) are refused on purpose: replacing one wholesale is exactly how references get silently dropped. Each has its own tool -- cite_object, detach_object, tag_object, attach_media.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesHandle or gramps_id.
fieldsYesScalar fields to set, e.g. {'name': 'Cedar Flat, Brannock, Ohio, USA'} on a place, or {'text': '...'} on a note.
object_typeYesType of object to edit.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the write/idempotent profile is covered. The description adds genuine context beyond them: scalar-only scope and the rationale that wholesale list replacement silently drops references. It stops short of noting permission needs or error behavior for invalid field names.

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

Conciseness5/5

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

Four short sentences, purpose front-loaded, then the constraint, its rationale, and the alternatives. Every sentence carries distinct information with no repetition of schema or annotation content.

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

Completeness4/5

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

With no output schema and a deliberately generic three-parameter signature, the definition covers what it does, its key restriction, and where to go instead. Missing only edge details such as failure modes on unknown field names or required permissions, which are minor for this tool.

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 description coverage is 100%, so the baseline is 3. The description earns above that by constraining the otherwise open 'fields' object to scalar values and giving concrete examples (name on a place, text on a note), clarifying semantics the schema alone leaves ambiguous.

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: 'Set scalar fields on any object', plus the framing 'escape hatch for places, notes, repositories'. It also distinguishes itself from the structural-list siblings by name, so an agent can tell it apart without opening another schema.

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

Usage Guidelines4/5

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

Explicitly says what is not settable (structural lists) and routes those cases to cite_object, detach_object, tag_object and attach_media. It does not, however, state when to prefer the typed siblings (update_place, update_person, update_source) over this generic escape hatch, so the when-to-use side is only partly covered.

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

update_personA
DestructiveIdempotent

Edit a person's gender, primary name, or privacy flag.

Replacing the primary name preserves the old one as an 'Also Known As': a name in the tree came from some record, and dropping it loses the link to whatever document used it. To add a name without replacing the primary one, use add_alternate_name.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew PRIMARY name. The current primary name is kept as an alternate rather than discarded.
genderNofemale, male, or unknown.
personYesPerson handle or gramps_id (e.g. 'I0001').
privateNoGramps private flag.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, but the description adds real value by explaining WHAT is preserved: the old primary name becomes an 'Also Known As' rather than being discarded, along with the reason (preserving the record/document link). This meaningfully clarifies the 'destructive' hint. It does not say whether unspecified fields are left unchanged, which would complete the mutation contract.

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?

The action and affected fields are front-loaded in the first sentence, followed by the preservation rationale and the sibling routing tip. The middle explanation is slightly verbose but earns its place by justifying the destructive behavior.

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

Completeness4/5

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

For a 4-parameter mutation tool with no output schema, the description covers purpose, the key side effect, and the main alternative, with safety profile carried by annotations. What is missing is the partial-update contract (are omitted fields left untouched?) and any permission/prerequisite note.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents person, name, gender, and private in detail. The description enumerates the three editable attributes, which lightly reinforces the schema but adds no format, default-null, or partial-update semantics beyond it. Baseline 3 is appropriate when the schema does the heavy lifting.

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?

The opening sentence names a specific verb (Edit) plus the exact resource and mutable fields (gender, primary name, privacy flag), so an agent immediately knows the tool's scope. It also distinguishes itself from the sibling add_alternate_name, which handles a different case.

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

Usage Guidelines4/5

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

It explicitly routes the agent: use add_alternate_name when you want to add a name without replacing the primary one. That is clear when-to-use guidance with a named alternative. It does not address the overlap with the sibling set_private, which also appears to touch the privacy flag, leaving one ambiguity unresolved.

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

update_placeA
DestructiveIdempotent

Edit a place's type, parent enclosure, name, title, or coordinates.

This is the tool update_object_fields deliberately refuses to be: place_type and the enclosure are structural, so they get guard rails here -- the parent must already exist, setting it cannot create an enclosure cycle, and a place holding several dated enclosures (a territory-to-state succession) is refused rather than silently flattened. Aim for every place typed, every non-country place parented, and street addresses on events rather than in the place tree.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoPlace code (postal etc.).
nameNoNew place NAME (the short local name, e.g. 'Cedar Flat'). Omit to leave unchanged.
placeYesPlace handle or gramps_id (e.g. 'P0001').
titleNoNew full TITLE (e.g. 'Cedar Flat, Brannock County, Ohio, USA') -- the string event-place resolution matches against.
parentNoHandle or gramps_id of the ENCLOSING place (e.g. the county a city sits in). Must already exist -- never created from a name. Replaces the current single enclosure; refused if the place carries several dated enclosures.
latitudeNoLatitude, e.g. '40.1532'.
longitudeNoLongitude, e.g. '-82.4101'.
place_typeNoNew place type: 'Country', 'State', 'County', 'City', 'Town', 'Village', 'Cemetery', etc. Omit to leave unchanged.
remove_parentNoClear the enclosure instead of setting one.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations cover safety (destructive, idempotent, closed-world), and the description adds distinct behavioral disclosures beyond them: the parent must already exist, cannot create an enclosure cycle, and a place with several dated enclosures is refused rather than flattened. These refusal semantics are exactly what an agent needs before mutating structural data.

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 the verb+resource, and the constraint paragraph earns its place. The 'This is the tool update_object_fields deliberately refuses to be' flourish is slightly rhetorical, but overall the text is dense and purposeful.

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

Completeness4/5

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

For a destructive mutation tool with no output schema and full schema coverage, the description supplies the missing behavioral layer (refusal rules, structural guard rails) an agent needs. It could state explicit permissions or reversibility, but coverage is strong.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all nine parameters, including the parent/replace-enclosure constraints. The description restates the editable fields and the parent guard rails, adding marginal meaning over the schema, so the baseline 3 is appropriate.

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?

The first sentence names a specific verb (edit) and enumerates the resources touched (type, parent enclosure, name, title, coordinates). It then explicitly positions itself against sibling update_object_fields, so an agent can distinguish the two without opening either schema.

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

Usage Guidelines4/5

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

Clear routing signal: this is where structural place edits go, unlike update_object_fields. Guard conditions (parent must exist, no cycle, refuse multi-dated enclosures) and workflow aims (type every place, parent every non-country place) give strong context, though no explicit 'when not to use this tool' is stated.

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

update_sourceB
DestructiveIdempotent

Edit an existing source's title, author, publication info, and/or abbreviation.

Only the fields you provide are changed; the rest are left as-is.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoNew title. Omit to leave unchanged.
authorNoNew author. Omit to leave unchanged.
sourceYesSource handle or gramps_id (e.g. 'S0001').
abbreviationNoNew abbreviation. Omit to leave unchanged.
publication_infoNoNew publication info. Omit to leave unchanged.

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=true, so the safety profile is covered structurally. The description adds the useful partial-update contract ('only the fields you provide are changed; the rest are left as-is'), which explains idempotence in practice but says nothing about what destruction means here or how failures behave.

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?

Two short sentences, front-loaded with the action and target, no filler. The second sentence slightly duplicates the per-parameter 'Omit to leave unchanged' notes already in the schema, which keeps it from being maximally tight.

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

Completeness4/5

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

For a low-complexity single-object update with full schema coverage and annotations covering safety, the description supplies the necessary scope and mutation semantics. Return behavior is unspecified, but no output schema exists and this is a straightforward edit, so the gap is minor.

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

Parameters3/5

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

Schema description coverage is 100%, with each parameter individually documented as 'New X. Omit to leave unchanged.' The description restates the same field list and the same omit-to-preserve semantics, adding little beyond the schema, so the baseline 3 is appropriate.

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

Purpose4/5

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

States a specific verb (edit/update) and resource (an existing source) and enumerates the mutable fields, so the agent knows exactly which object this targets. It does not differentiate itself from adjacent mutation siblings such as update_object_fields or update_citation, but the resource is unambiguous.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool versus alternatives like update_object_fields, nor any prerequisite or permission guidance. The only conditional information given is about which fields change, not about tool selection.

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

update_urlA
DestructiveIdempotent

Edit or remove ONE existing URL entry on a person, place, or repository.

add_url can only append -- this corrects an entry already there (the classic case: a Find a Grave link filed under the wrong type). The other fields on the object are untouched.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoNew URL path. Omit to keep.
matchYesCase-insensitive substring identifying WHICH url entry to edit, tested against each entry's path and description (e.g. 'findagrave.com/memorial/123'). Must match exactly one entry; matching none or several returns the candidate list instead of guessing.
removeNoRemove the matched entry instead of editing it.
targetYesHandle or gramps_id of the object.
url_typeNoNew URL type, e.g. 'Find A Grave', 'Web Home Page'. Omit to keep.
descriptionNoNew link description. Omit to keep.
object_typeYesType of the object: 'person', 'place', or 'repository' only.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds useful side-effect context beyond annotations: only one URL entry is touched and 'the other fields on the object are untouched.' It does not cover permissions or undo behavior, so it is not a 5.

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

Conciseness5/5

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

Front-loaded with the action and scope, then the add_url contrast, with a short illustrative parenthetical. Three sentences, none wasted.

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?

For a targeted mutation tool, the description covers purpose, scope, the add_url alternative, and non-target-field preservation, while annotations supply the safety profile and the schema explains match failure and all parameters. Nothing essential for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter is already documented in the schema. The description adds a usage rationale for correcting a wrong URL type, but no parameter syntax or constraint beyond what the schema provides, making the baseline 3 appropriate.

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+resource+scope: 'Edit or remove ONE existing URL entry on a person, place, or repository.' It distinguishes from the sibling add_url ('add_url can only append'), so an agent can select it without opening another schema.

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?

Explicitly names the alternative add_url and the condition that selects this tool: correcting an existing entry, with the Find a Grave example. This clearly establishes when to use this tool versus the append-only sibling.

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

verify_treeA
Read-only

Run Gramps' own genealogical plausibility checks over the whole tree.

This is a different audit from the citation ones. list_unsourced_facts asks whether a claim has evidence; this asks whether a claim is possible — a mother bearing a child at nine, a marriage lasting 120 years, a date that will not parse. A wrong date can be impeccably sourced, so these catch what a citation sweep cannot.

Leave the thresholds alone on a first run; the server's defaults are the conventional ones. Tighten a specific bound when chasing a specific class of error.

May run in the background, in which case a task_id comes back — poll it with get_task.

ParametersJSON Schema
NameRequiredDescriptionDefault
tree_idNoTree to check. Leave empty to use the tree these credentials are bound to, which is the usual case.
max_spousesNoFlag more spouses than this. Server default 3.
estimate_ageNoEstimate missing or inexact dates when checking ages. Finds more, at the cost of guessing.
max_father_ageNoFlag a father older than this. Server default 65.
max_mother_ageNoFlag a mother older than this. Server default 48.
min_father_ageNoFlag a father younger than this. Server default 18.
min_mother_ageNoFlag a mother younger than this. Server default 17.
max_age_at_deathNoFlag a death later than this age. Server default 90.
max_age_to_marryNoFlag a marriage older than this. Server default 50.
min_age_to_marryNoFlag a marriage younger than this. Server default 17.
flag_invalid_datesNoReport dates the parser cannot read.
max_children_fatherNoFlag a man with more children than this. Default 15.
max_children_motherNoFlag a woman with more children than this. Default 12.
max_widowhood_yearsNoFlag a longer widowhood before remarriage. Default 30.
max_child_birth_spanNoFlag a longer span of one couple's births. Default 25.
max_husband_wife_age_gapNoFlag a wider spousal age gap. Server default 30.
max_years_between_childrenNoFlag a longer gap between siblings. Default 8.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), so the bar is lower, and the description adds real behavioral context: runs may be asynchronous and return a task_id to poll via get_task. It does not describe the shape of the findings or whether results are paginated, which keeps it out of the top band.

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-loads the core action, then uses short paragraphs to separate the sibling contrast, the threshold advice, and the async note. Slightly verbose in the explanatory middle paragraph, but each sentence carries a distinct instruction.

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

Completeness4/5

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

For a 17-parameter, no-output-schema check tool, the description covers purpose, routing, tuning advice and the async return path. The only gap is the format of the flagged findings, which an agent might reasonably want before invoking.

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% and each of the 17 parameters is individually documented, so the baseline is 3. The description adds cross-parameter guidance the schema cannot: thresholds are conventional server defaults and should be left alone unless targeting a specific error class, and estimate_age trades coverage for guessing.

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 ('run genealogical plausibility checks over the whole tree') and explicitly distinguishes itself from the citation-oriented sibling list_unsourced_facts by contrasting 'has evidence' with 'is possible'. An agent can pick this over other audit-style tools without opening any schema.

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?

Gives explicit when-to-use vs the closest alternative, plus concrete operational guidance: leave thresholds at defaults on a first run, tighten one bound only when chasing a specific error class, and poll get_task when the run goes to the background. Nothing essential is left to inference.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 83 tool updatesv0.1.0
    • First observedadd_alternate_name
    • First observedadd_attribute
    • First observedadd_child_to_family
    • First observedadd_citation
    • First observedadd_dna_match
    • First observedadd_event_to_family
    • First observedadd_event_to_person
    • First observedadd_family
    • First observedadd_media
    • First observedadd_note
    • First observedadd_person
    • First observedadd_place
    • First observedadd_repository
    • First observedadd_source
    • First observedadd_url
    • First observedassess_living
    • First observedattach_media
    • First observedcite_child_link
    • First observedcite_event
    • First observedcite_object
    • First observedconsolidated_timeline
    • First observedconsult_reference
    • First observedcreate_filter
    • First observeddb_stats
    • First observeddelete_filter
    • First observeddelete_object
    • First observeddetach_object
    • First observedevent_span
    • First observedexport_backup
    • First observedfind_duplicates
    • First observedget_ancestors
    • First observedget_backlinks
    • First observedget_citation
    • First observedget_descendants
    • First observedget_dna_matches
    • First observedget_event
    • First observedget_facts
    • First observedget_family
    • First observedget_media
    • First observedget_note
    • First observedget_object
    • First observedget_person
    • First observedget_place
    • First observedget_relationship
    • First observedget_report_options
    • First observedget_repository
    • First observedget_researcher
    • First observedget_source
    • First observedget_task
    • First observedget_timeline
    • First observedget_transaction
    • First observedget_ydna
    • First observedlink_repository
    • First observedlist_custom_filters
    • First observedlist_event_types
    • First observedlist_filter_rules
    • First observedlist_object_types
    • First observedlist_reports
    • First observedlist_tags
    • First observedlist_tasks
    • First observedlist_transactions
    • First observedlist_unsourced_facts
    • First observedmerge_objects
    • First observedocr_media
    • First observedparse_dna_segments
    • First observedquery_objects
    • First observedquery_records
    • First observedreindex_search
    • First observedrun_report
    • First observedsearch_people
    • First observedset_private
    • First observedtag_object
    • First observeduncite
    • First observedundo_transaction
    • First observedupdate_citation
    • First observedupdate_event
    • First observedupdate_media
    • First observedupdate_object_fields
    • First observedupdate_person
    • First observedupdate_place
    • First observedupdate_source
    • First observedupdate_url
    • First observedverify_tree

TDQS

A3.6/5.0

Scored across 83 tools

Disambiguation4/5

Most tools target distinct resources and actions, and descriptions often explicitly distinguish generic from specific tools (e.g. get_object vs get_person, cite_object vs cite_event). However, overlaps remain: query_objects vs query_records, add_media vs attach_media, and list_object_types vs list_event_types could still cause misselection.

Naming Consistency4/5

The set is overwhelmingly snake_case and action-oriented, with predictable verb_noun names across most CRUD, audit, and lifecycle operations. Minor deviations such as db_stats, event_span, consolidated_timeline, and uncite slightly break the strict verb_noun pattern.

Tool Count1/5

83 tools is far beyond a practical MCP surface for an agent, even for a complex genealogy evidence domain. While many tools are specialized and defensible, the count itself creates excessive selection burden and is an extreme mismatch for efficient tool use.

Completeness4/5

The surface is very comprehensive, covering people, families, events, sources, citations, repositories, media, places, DNA, reports, filters, transactions, and audits. Minor gaps exist, notably the apparent absence of a generic search_text tool despite reindex_search referencing one, with some operations reachable only through generic escape hatches.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to create, edit, and query genealogical data from GEDCOM files. Supports complex genealogy searches, automatic data enrichment from web sources, relationship analysis, and biography generation for individuals and families.
    16
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with Gramps genealogy databases for intelligent family tree research and management. Provides comprehensive tools for searching family data, creating records, analyzing relationships, and tracking genealogy research through natural language.
    43
    AGPL 3.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to query, validate, and safely update GEDCOM family-history files through a local MCP server with read-only tools and reviewable changesets.
    1
    MIT