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.

97 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)

GRAMPS_MCP_TRANSKRIBUS_USERNAME, GRAMPS_MCP_TRANSKRIBUS_PASSWORD

Optional. A Transkribus account (Scholar plan or above), for ocr_media's handwriting routes. Both or neither. See Reading documents

GRAMPS_MCP_TRANSKRIBUS_PAGE_BUDGET

Pages a calendar month ocr_media may send to Transkribus without the caller's per-call spend_credits. Default 0: every page asks

GRAMPS_MCP_TRANSKRIBUS_API_URL

Transkribus' processing API (default https://transkribus.eu/processing/v1, Metagrapho v1)

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 97 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).

Type names are Gramps' own. Gramps stores any type name it does not know exactly — "birth", "Web Home Page" — as a new custom type, beside the standard one it was meant to be, and keeps it in the tree's vocabulary for good. So every write matches a type name first: against Gramps' standard names and the tree's custom ones, ignoring case and punctuation, then through a few unambiguous synonyms ("Born" is Birth, "microfilm" is Film). A name that still matches nothing is refused with the closest names; allow_new_type creates it when a new custom type is meant ("Land Grant", a "Territory" place). docs/PITFALLS.md section 26 has the details.

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.

check_family_links

…has the link problems found on them left out and counted.

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.

  • list_research_tasks judges a task by its own private flag, and its description by its note's. A task's title can name a living person; mark such a task private.

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

  • ocr_media reads the media object you name, as a lookup by id does, private or not. It never sends a private one to Transkribus, a third party; a public image of a living person's record would go, so mark such a record private.

  • 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

97 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. 45 tools only read. ocr_media reads, but is annotated as neither read-only nor closed-world: it can fetch from the Library of Congress and the Internet Archive, spend Transkribus credits, and store a transcript note.

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; each event's type may be left out.

add_family

Link parents + children with an optional cited marriage. A child may be given with its relationship to each parent — a stepchild in the same call.

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_event_ref

Share an existing event with another person, in a role (Witness, Informant, Godparent…): one census entry or burial, one set of citations. What is the person's own — their line on the sheet, their age — goes on the reference as attributes (As enumerated, Age).

add_alternate_name

Add a non-primary name (AKA, married name, nickname) to a person, with the citation for that form of the name.

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. Any length in one call; a server error says whether anything was written, and an attach that failed takes the new note back.

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, and one of a person's names (object_type="name"), the primary or an alternate.

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. A citation that is the only holder of a note or image is kept instead, unless carry_to names a citation to move them to.

Edit — correcting what is already there

Tool

Purpose

update_citation

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

update_citations

The same for many citations in one call — a sweep. expect_page_prefix reports a row whose page changed since the sweep was planned instead of overwriting it.

update_event

Type (checked against the tree's vocabulary), date, place, description, in place, keeping the event's id and everything attached to it. Clears a place or date no source states.

update_source

Title, author, pubinfo, abbrev.

update_media

Description, date, path.

update_person

Gender, primary name (the old one is kept as an alternate, unless it was a data-entry error — then it is corrected in place and the reason recorded in a note), privacy flag.

update_alternate_name

Correct, retype or remove one alternate name in place, keeping its citations. A cited name is not removed.

update_child_ref

A child's relationship to the father or mother — Birth, Stepchild, Adopted… — in place, keeping the link's citations and the birth order.

move_child

Move a child to another family, keeping the link's citations, notes and privacy, placed in birth order; every link back to the old family goes, a duplicated one too.

set_family_parent

Set, replace (when asked) or remove the father or mother of an existing family, keeping both sides of each person's link.

update_event_ref

A person's reference to a shared event, in place: the role, or an attribute set, added or removed by name, keeping its citations.

update_attribute

Set or remove ONE attribute on a person, family, event, media object, source or citation, in place, keeping its citations; picked by name, and by part of its value where the name repeats. A removed attribute's citations are named.

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.

link_repositories

The same for many sources in one call, each row reported.

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, and the dry run names what else Gramps would merge — a person merge can merge two families, a family merge two fathers — and what it refuses. For places, settles the survivor's enclosures rather than keeping both places' parents.

detach_object

Remove an event/media/note/tag/child/repository reference, or a place's extra parent; optionally delete if orphaned. A tag can be named; a repository link narrowed to one call number.

delete_object

Permanently delete an object by handle or Gramps ID. Refused when it would strand a note or image only it holds, and for a source that still has citations.

Read

Tool

Purpose

get_person

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

get_family

Relationship, parents, children, event count.

get_event

Type, date (with its modifier: "between 1882 and 1883", never "1882"), 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 type names the write tools accept: Gramps' standard ones and the tree's custom ones.

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.

check_family_links

Person↔family links checked in both directions: a family listed twice, a link one side lacks, a link to nothing. Each finding says how to repair it.

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. Refuses the forms the server answers wrongly — type as a column, a date's year, a list compared with anything but in — and says what works.

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

Read a document image with the engine that suits it: existing OCR text or Tesseract for print, the image itself for an English hand, Transkribus for German and Norwegian handwriting, FamilySearch's index for census tables. A finding aid, not evidence — read the image before citing it. See Reading documents.

Research tasks — Gramps Web's own task list

Tool

Purpose

add_research_task

Add a task to Gramps Web's Tasks view, written as its New Task form writes one: a Source tagged ToDo, with Status and Priority source attributes and the description as a To Do note.

list_research_tasks

The tasks, in the Tasks view's order, with status, priority, tags, attributes and description; filtered by status, tag or attribute value. A private task is a redacted stub.

update_research_task

Set a task's status, priority, privacy or attributes — each replaced, never appended beside the old value, which Gramps Web would not show — or add a paragraph to its description. A private task's description note is private too; making the task public leaves a private note private unless private_note=false.

A task made here and one made in Gramps Web are the same thing: either shows in the Tasks view, and in desktop Gramps' To Do gramplet through its note. A task is a to-do, not evidence, so it is never cited. These are not the background jobs list_jobs reports.

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_jobs

Recent background jobs for this tree, newest first.

get_transaction

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

get_record_history

Who added, edited or deleted one record, and when — each change with its transaction. A deleted record by its handle. field narrows it to the writes that changed one field, with its value before and after. On gramps-webapi 3.21 it reads the whole transaction log instead, which is slower, and says so.

get_job

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 behind Gramps Web's search box. The server updates it after each write; rebuild after a large import, or when search misses something the tree holds.

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 on every CI run against gramps-webapi 3.21.1, 3.22.3 and 3.23.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 matches none, cited or not.

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

  • A list is searched through its items. ~ on the list itself asks whether the value is an item, so urls ~ "http" matches nothing. query_objects refuses it and names the form that works: .any. (or .all.) reaches the items, and get_<type> follows a handle.

  • Every condition reads the whole collection, object by object, so a GrampsQL read is allowed 120 seconds: an OR of two list conditions took 29 seconds over 6,000 citations.

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
person      urls.any.path ~ "findagrave"                 a URL anywhere among a person's links
citation    note_list.any.get_note.text.string ~ "x"     a citation whose note mentions x

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


Reading documents: ocr_media

Gramps Web's own OCR is Tesseract, which reads print. The documents a family history turns on are handwritten — wills, deeds, letters, German church books in Kurrent, Norwegian parish registers — and which reader to trust depends on the hand and the language. ocr_media routes by what the caller says the document is (doc_type) and its language (lang):

Document

Read by

Why

print

Text the media already carries — a Transcript note, a PDF's text layer — or the Library of Congress's or the Internet Archive's OCR for a page a URL in its sources names; otherwise Tesseract, through Gramps Web

Existing text costs nothing; Tesseract reads print well

hand, English

The image, returned as MCP image content with a diplomatic transcription instruction for the calling model: spelling as written, line breaks and abbreviations kept, [?] where unsure. second_witness adds Transkribus, and the result asks for every name and number where the two readings differ

Vision models read 18th- and 19th-century English hands at 5.7–7 % character error, better than dedicated engines (Humphries et al.)

hand, German

Transkribus only (its German Kurrent model). Without Transkribus, refused — never a vision read, even when asked, and not for a German table or volume either

Vision models measure 48.8 % character error on historical German (METATR, May 2026, READ-2016)

hand, Norwegian

Transkribus (NorHand 1820–1940), with the image to check it; without Transkribus, the image and a warning of its error rate

Vision models measure about 10 % on Norwegian (METATR, NorHand)

hand, other languages

Transkribus' general model (Text Titan II), with the image; without it, the image and a warning

No benchmark known for a vision read

table

Not read: FamilySearch's index (get_records_on_image in familysearch-mcp)

An engine reads across a row and loses which cell belongs to which person

volume

FamilySearch Full-Text Search first, then Transkribus page by page

Searching a volume beats reading it

engine asks for one reader outright: existing, tesseract, vision (refused for German handwriting) or transkribus. A returned image is scaled to what a current Claude model reads without scaling it again (2576 pixels on the long edge, 3.75 megapixels); region=[x1, y1, x2, y2], in percent, returns part of the page at full detail. A PDF is read a page at a time (page): its text layer, and the scan embedded in the page; a page with no scan is rendered by Gramps Web, which renders only the first.

Every result carries its provenance — {engine, model, date} — and the same caveat: the transcript is never the evidence; the citation stays on the image. store=true keeps a machine reading as a Transcript note on the media object, headed with its engine, model and date, and Transkribus' PAGE XML in a second, preformatted note, since Transkribus deletes it a day after the job. A vision reading is the calling model's to keep, with add_note. A later call for print finds a stored reading and returns it rather than reading again.

Transkribus is optional, and costs money. API jobs are charged half the app's rate — about 0.5 credits, roughly €0.12, a page — so a page is sent only when the call passes spend_credits=true or this month's GRAMPS_MCP_TRANSKRIBUS_PAGE_BUDGET has room. Each result says what it spent and how many pages the month has used; the count is kept in transkribus-usage.json in the cache directory; a page is counted before it is sent, and not sent if it cannot be counted. A job for the same file, page and model within a day is fetched again, not paid for again; a failed one is dropped, so the next call can try afresh. A private media object is never sent, nor a page in a language no model here covers. Images go to READ-COOP in Austria; its documentation says an image is used for its job only and not stored, and its terms let it use submitted material to improve its products.

The Transkribus path is built to the published API and has not yet been exercised live. It follows the Metagrapho v1 OpenAPI document and READ-COOP's documented login, and is tested against fixtures of those shapes; no account was used to build it. The Library of Congress and Internet Archive paths, the image and PDF handling and Tesseract through a task queue were checked against a live tree and the live archives on 2026-10-06.


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.

A second suite, tests/live, runs against a real, throwaway gramps-webapi -- 3.21.1, 3.22.3 and 3.23.1 in CI, installed from PyPI with no Docker needed. It checks every server behaviour docs/PITFALLS.md describes, drives the tools end to end, and runs the same scenarios against the fake and the server and requires the same answers, so the fake cannot drift from what it stands in for. CONTRIBUTING.md says how to run it.

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


Limitations

  • Requires gramps-webapi 3.21 or later (Gramps 6.0); tested on every CI run against 3.21.1, 3.22.3 and 3.23.1. On an older server every tool answers with an unsupported_server error naming its version: 3.20 lacks the query endpoints the searches and privacy filter use. 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 names ("Birth", "Married") are matched against Gramps' English standard names and the tree's custom ones, ignoring case and punctuation, with a few clear synonyms ("Born" is Birth). Anything else is refused with the closest names unless allow_new_type asks for a new custom type, so a type name in another language is refused rather than stored: give the English name. See docs/PITFALLS.md section 26.

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

  • ocr_media's Transkribus path has not been run against the live service. Gramps Web renders only a PDF's first page, so a later page with no scan embedded in it cannot be read as an image.


Repository layout

src/gramps_evidence_mcp/    the MCP server
  server.py                 tool definitions (the 97 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
  ocr.py                    ocr_media's routing, images, archives and Transkribus
  config.py                 env vars + TOML
tests/                      against an in-memory fake; no live server needed
  live/                     against a throwaway gramps-webapi (CI: 3.21.1, 3.22.3, 3.23.1)
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

97 tools
add_alternate_nameA

Add an alternate (non-primary) name to a person, cited to the record using it.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
givenNoGiven/first name(s) for the alternate name.
personYesPerson handle or gramps_id (e.g. 'I0001').
surnameNoFamily name / surname.
citationNoThe record that gives this form of the name. It goes on the name itself -- 'this record spells it so' -- not on the person. Cite an existing name with cite_object(object_type='name').
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'.
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds value beyond that: it discloses that the primary name is untouched (scope of effect), that the citation attaches to the name rather than the person, and that the entry is reversible/correctable later. It omits return/confirmation behavior and any duplicate-name handling, which is a modest gap for a mutation 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?

Three tight sentences with no filler: purpose first, then use cases, then the reversibility/alternative pointer. Every sentence earns its place and the most decision-relevant fact (primary name unchanged) is front-loaded.

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 rich annotations, a 100%-documented 9-parameter schema, and no output schema, the description supplies what the structured fields cannot: the non-destructive effect on the primary name and the sibling that handles later edits. Only the success/return behavior and duplicate-name handling are left implicit, which is acceptable absent an output 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% and every parameter carries a detailed description, so the baseline is 3. The description's 'cited to the record using it' restates the schema's citation semantics rather than adding new syntax or format guidance, so it neither compensates nor detracts.

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: adding an alternate (non-primary) name to a person. It explicitly distinguishes the non-primary scope ('The person's primary name is left unchanged') and names update_alternate_name as the distinct sibling for correcting/removing, so an agent can tell it apart from update_alternate_name and update_person 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?

Gives concrete usage contexts (maiden/married names, aliases, anglicized forms, nicknames-of-record) and routes the post-hoc correction path to update_alternate_name. It does not, however, state explicit exclusions (e.g., 'do not use this to change the primary name — use update_person'), so guidance is clear but not fully bounded.

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. update_attribute changes or removes one already there.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesAttribute type/name, e.g. 'Occupation', 'Identification Number', or a custom name the tree already has.
valueYesAttribute value, e.g. 'Blacksmith'.
targetYesHandle or gramps_id of the object.
object_typeYesType of the object: 'person', 'event', 'family', 'media', 'source', 'citation'.
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare the full safety profile (readOnly=false, destructive=false, idempotent=false), so much of the disclosure burden is lifted. The description adds only the 'typed key/value' framing and no information on duplicate names, permissions, or failure behavior beyond what annotations and the allow_new_type schema field provide.

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 followed immediately by the disambiguating contrast. Every clause earns its place; nothing is repeated from the schema.

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 with full annotation coverage, 100% schema coverage, and no output schema, the definition is nearly sufficient. It could note what happens when an attribute name already exists on the target, but the essential call information is present.

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 including allow_new_type are already documented in the schema, including the near-miss refusal behavior. The description's 'typed' phrasing adds no syntax or format 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?

States a specific verb and resource ('Add a typed key/value attribute to an object'), and immediately contrasts with update_attribute, which is the closest sibling in the catalog. An agent can distinguish add vs. modify/remove 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?

Explicitly names the alternative tool (update_attribute) and the condition that selects it ('changes or removes one already there'), which is exactly the when-not guidance an agent needs. It does not cover the add_url/add_note siblings, but the primary routing decision is resolved.

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').
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations declare this is a mutating but non-destructive operation, and the description adds meaningful behavior beyond that: it links both directions (ChildRef on the family plus the family on the child's parent-family list), requires the child to pre-exist, and skips duplicates. The 'duplicate children are skipped' clause sits slightly awkwardly against idempotentHint=false, but it is not a direct contradiction and is useful 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?

Four short sentences, front-loaded with the core action and then the side effect, prerequisite, and duplicate behavior. Every sentence carries information, 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?

For a mutation tool with five params, no output schema, and annotations covering the safety profile, the description is nearly complete: it covers purpose, side effects, prerequisite, and duplicate handling. It omits error conditions and does not touch on the nuanced allow_new_type behavior, but the schema covers that fully.

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 five parameters including frel, mrel, and allow_new_type. The description adds no parameter-level meaning beyond referring to 'existing' child and family, 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 and resource: 'Add an existing person as a child of an existing family.' It is immediately clear what the tool does, but it does not explicitly differentiate itself from siblings like update_child_ref, set_family_parent, or move_child, leaving the agent to 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 Guidelines3/5

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

The description provides a prerequisite ('The child must already exist') but does not say when to use this tool versus alternatives such as update_child_ref, move_child, or set_family_parent. Usage is implied rather than explicitly guided, which is the minimum viable level.

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 it is a non-read-only, non-idempotent, non-destructive, closed-world write, so the safety profile is already covered. The description adds real behavioral context beyond them: that a citation handle is reusable across facts, that a citation carries a single confidence (so reuse must match the claim), and that source_title causes a new source AND citation to be created as a side effect. It does not say what the call returns (a handle id), which is the one remaining behavioral gap.

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 sentences, front-loaded with the core action, followed by the routing guidance and the positive use case. No filler, no repetition of schema content, and the most important sentence (don't call this directly) comes first.

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-object create tool with a fully documented nested schema but no output schema, the description covers purpose, routing, and side effects well. The only thing an agent might still want is what the call returns (the new or reused citation handle) so it can pass it to later calls, since no output schema supplies that.

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 every field, including the citation/source/source_title precedence rule. The description restates the reuse-vs-create distinction but adds no syntax, format, or constraint detail beyond what the CitationInput 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?

States a specific verb and resource ('Create a standalone Citation on a Source') plus the secondary mode ('or reuse an existing one'). The parenthetical immediately frames the two operating modes, and the following sentences distinguish it from the add_person/add_event_to_person/add_family siblings.

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 says when NOT to call it ('Usually you don't call this directly -- pass a CitationInput to add_person / add_event_to_person / add_family instead') and names the exact alternative tools. Then names the positive condition for calling it directly ('when you want a reusable citation handle to attach to several facts'). This is textbook when/when-not/alternatives routing.

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 already declare the write profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false), so the bar is lower, and the description still adds real context: a validation gate ('Nothing is written unless the segments parse'), the storage format guarantee that get_dna_matches reads back, and the atomicity implied by refusing unparseable data. It does not state what the call returns or whether auth/permissions are required.

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 verb and resource before the mechanics and the caveat. Each paragraph carries information (validation, storage, relationship caveat), though the middle paragraph's format-compatibility explanation is slightly more than an agent needs to invoke the call.

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-idempotent write tool with no output schema, the description covers the essentials: what is recorded, that validation gates the write, that a new citation is minted, and how the result is read back via get_dna_matches. The main gap is the return value (e.g. the new match handle or transaction id), which nothing else documents.

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 four parameters in detail, including the CitationInput precedence rules. The description reinforces the citation parameter's meaning ('the test the match came from') and the segment-row format, but adds little 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.

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 and resource ('Record a DNA match') plus the scoping constraint that it is cited to the test that found it. It implicitly distinguishes itself from the read-side sibling get_dna_matches, which it names as the reader. It does not, however, distinguish itself from closely related siblings like parse_dna_segments or add_citation, which an agent might also consider.

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 final paragraph gives explicit when-not guidance: 'A match proves the two share DNA, not how they are related. Record any relationship separately, with its own evidence.' That steers an agent away from a plausible misuse. It stops short of naming a concrete alternative tool (e.g. a relationship/event add) or noting that segments can be checked with parse_dna_segments first.

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

add_event_refA

Share an existing event with another person, in a role.

For one census entry, residence or burial that several people took part in: each references the same event, so its citations and later corrections serve all of them. Refused if the person already has it; update_event_ref edits that reference. A new fact is add_event_to_person.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNoThe person's role in it: 'Primary', 'Witness', 'Informant', 'Godparent', 'Family', 'Clergy', or a custom role the tree already has.Primary
eventYesHandle or gramps_id of the EXISTING event, e.g. 'E0007'.
personYesHandle or gramps_id of the person to add the event to.
attributesNoAttributes of this person's reference: what is theirs alone, e.g. {'As enumerated': '<their line on the sheet>', 'Age': '34'}. A name is matched against standard names, the tree's, and those on the event's other references.
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare write/not-destructive/not-idempotent, and the description corroborates the non-idempotent profile by stating it is 'Refused if the person already has it.' It also discloses the shared-citation behavior of references, which annotations cannot express. It does not cover permissions/auth or what the call returns, keeping it short of 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 tight sentences, front-loaded with the verb and resource, then the scenario, then the routing rules. Every sentence carries distinct information with no repetition of schema 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?

For a write tool with no output schema, it covers purpose, the sharing model, refusal behavior, and sibling routing — enough to invoke it correctly. The only omission is any hint of the return value or side effects on the tree, a minor gap given the annotations.

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 role, event, person, attributes and allow_new_type in detail. The description only alludes to the role concept ('in a role') and adds no format or constraint information beyond the schema. 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 (share/add a reference to) and resource (an EXISTING event) for a person in a role. It explicitly distinguishes itself from the two nearest siblings: 'update_event_ref edits that reference' and 'A new fact is add_event_to_person.' An agent can route correctly 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 Guidelines5/5

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

Gives a concrete when-to-use scenario (a census entry, residence or burial several people took part in) plus the rationale (shared citations and later corrections). It also states the when-not (refused if the person already has it) and names the correct alternatives for that case and for creating a new fact.

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

A4.1/5.0
Behavior4/5

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

Annotations already establish this is a non-destructive write. The description adds behavioral detail beyond that: the event is attached with the 'Family' role, and it should be cited to the establishing record. It does not discuss idempotency or what happens on duplicate events, but the added role/citation context is useful.

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 front-loaded sentences with the action first and purpose next; nothing is padding. The final citation sentence is slightly redundant with the require_citation default but still earns its place as 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 mutation tool with a fully documented input schema and no output schema, the description supplies the conceptual frame (family-level fact, Family role, citation) an agent needs. It is mostly complete, missing only edge behavior such as duplicate handling.

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 date formats, the place resolution order, citation precedence, and the require_citation default. The description adds no parameter syntax 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?

State a specific verb and resource ('Add a dated/placed event (fact) to an existing family') and bounds the scope ('family-level facts: marriage, divorce, residence, census'). This cleanly distinguishes it from the sibling add_event_to_person 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 when-to-use guidance via the example fact types and the 'Family role' framing, which implies person-level facts belong elsewhere. It stops short of explicitly naming add_event_to_person as the alternative or stating exclusions, so it is strong but not fully 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_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.4/5.0
Behavior4/5

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

Annotations only flag non-readonly/non-idempotent; the description adds real behavioral context: adding Birth/Death sets the primary birth/death reference if unset, the citation should point at the establishing record, and require_citation=false records the fact UNSOURCED. It omits failure modes (unknown person handle) and any return information.

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, purpose first, then usage, then side effects. No filler and nothing redundant with the schema.

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-idempotent write tool with no output schema, the description covers purpose, usage scope, and the key mutation side effect. It could note error behavior and whether the created event handle is returned, but the rich schema carries most remaining burden.

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 adds semantic intent for the citation parameter (must point at the record establishing the fact) and the birth/death side effect of the event type, which is meaning the schema 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 ('Add a dated/placed event (fact) to an existing person'), and the 'to an existing person' scoping distinguishes it from the family-scoped sibling add_event_to_family without needing 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?

'Use for facts beyond birth/death: residence, occupation, census, baptism, immigration...' gives concrete positive usage context. It stops short of naming the alternative (add_event_to_family) or an explicit when-not-to-use, and the birth/death caveat slightly muddies the stated boundary.

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.
childrenNoChildren: handles or gramps_ids, each a birth child of both parents, or {person, frel, mrel} for a stepchild, adopted or foster child.
marriageNoOptional marriage event; type defaults to 'Marriage'. Cite it.
relationshipNoFamily relationship type, e.g. 'Married', 'Unmarried', 'Civil Union'.Married
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.
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 already declare the write/safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=false). The description adds real behavioral context beyond that: the side effect that family/parent-family lists on each person are linked automatically, the prerequisite that referenced people must exist, and the citation expectation for the marriage.

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 action, then prerequisites, then the auto-linking side effect and citation advice. Four sentences, each carrying distinct information; only the closing citation sentence overlaps mildly with the schema's 'Cite 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 write tool with no output schema and a rich 7-parameter schema, the description covers the prerequisite, the auto-linking behavior, and citation guidance. It could say more about what is returned or about idempotency/re-run behavior, but 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%, so every parameter (father, mother, children, marriage, relationship, allow_new_type, require_citation) is already documented in the schema, including the ChildLink frel/mrel and CitationInput precedence. The description mentions marriage citation 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 and resource ('Create a family linking parents and children') plus the optional cited marriage, so the agent can distinguish it from add_person and the granular family-mutation siblings (add_child_to_family, set_family_parent). The scope of what the tool produces 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 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 when citing is warranted ('Cite the marriage event to a marriage record where possible'). It does not, however, address when to prefer this tool over the granular siblings like add_child_to_family or move_child.

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.3/5.0
Behavior4/5

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

Annotations already disclose that this is a non-read-only, non-destructive, non-open-world operation. The description adds useful behavioral context beyond that: the upload is standalone, identical files are reused via checksum, and duplicate uploads create cleanup work later. It does not cover permissions or exact return behavior, but annotations lower the burden.

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 action and then gives workflow and anti-duplication context. Every sentence is relevant, though the second paragraph is slightly editorial in phrasing and could be marginally tighter.

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 full schema coverage, annotations, and no output schema, the description provides enough context to call the tool correctly: it explains the upload-as-standalone-object model, the dedup behavior, and the follow-up attach/cite workflow. It stops short of describing return values or edge cases such as dedup_by_checksum=false, but nothing critical 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 the schema already fully documents file_path, description, and dedup_by_checksum. The description echoes the reuse/dedup concept but adds no parameter syntax or constraints beyond what the schema provides, making 3 the appropriate baseline.

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: upload a document as a standalone Media object. It distinguishes this tool from the sibling attach_media by explaining that add_media creates the Media object, which is then attached elsewhere.

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 explicit workflow guidance: create one Media object per image, then use attach_media(media_ref=...) to attach it, and cite it once per fact. It also warns against the duplicate pattern of uploading the same photograph repeatedly, which is an explicit misuse scenario.

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. Any length is written in one call; a server error says whether anything was.

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'.
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare non-destructive, non-idempotent, closed-world behavior, so the bar is lower. The description still adds real value by disclosing atomicity and failure semantics ('Any length is written in one call; a server error says whether anything was'), which tells the agent it won't be silently partially written. Auth requirements and return payload are not covered.

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 purpose in the first sentence, then usage, then behavior; every sentence carries content. Minor deduction for the truncated final clause ('a server error says whether anything was') and the stray blank line that slightly interrupt readability.

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 ideally say what comes back (e.g. the new note handle); it only gestures at this via the error-semantics sentence. Otherwise a mutation tool with annotations and full schema coverage is adequately documented for correct invocation.

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 an extra point by explaining the semantic coupling between two parameters ('Attach ... by giving target + target_type'), which the schema lists separately without stating that relationship.

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 ... note') and immediately qualifies scope with the optional attachment to an object. The verb clearly separates it from the read sibling get_note, and the 'research/general' qualifier ties it to the note_type parameter an agent will see in 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 contexts ('research logs, reasoning about conflicting evidence, or transcriptions') and the how-to for attaching ('giving target + target_type'). It does not name exclusions or contrast with near neighbors like add_research_task, so it stops short of explicit when-not guidance.

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.4/5.0
Behavior5/5

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

Beyond the annotations (which only declare this is a non-read-only, non-idempotent write), the description discloses concrete behavior: the call FAILS if a birth/death event lacks a citation under the default require_citation=True, unsourced events get stamped with an UNSOURCED attribute that list_unsourced_facts can later surface, and it states the return value (handle and gramps_id). Those failure modes and side effects are not derivable from the annotations or 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?

Four sentences, front-loaded with the core purpose, then the citation workflow, then the fallback for unsourced hints, then the return value. Every sentence carries actionable information and none restates the tool name or 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?

There is no output schema, and the description fills that gap by naming the returned handle and gramps_id. Combined with the citation-requirement semantics and the UNSOURCED follow-up path, an agent has everything needed to invoke an 8-parameter mutation correctly.

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, but the description adds real interpretive value by explaining the intent behind require_citation (hard failure vs. flagged follow-up) and by instructing the agent to set citation confidence honestly. It reinforces rather than repeats the schema, so it earns one point above baseline.

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 specific verb+resource ('Create a new person') and narrows scope with 'optionally with cited birth and/or death events', which is enough to separate it from pure event tools like add_event_to_person. It stops short of naming any sibling it must not be confused with (e.g. add_family), so it is clear but not fully differentiated.

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 add someone to the tree' anchors when to reach for it, and the citation guidance supplies conditional rules: cite the specific record when you have one, and either omit the event or set require_citation=False when only a legacy hint exists. No explicit 'use X instead when Y' routing to siblings is given, so it is strong context rather than full when/when-not guidance.

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, Farm, Building, and so on, or a custom type the tree already has.
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare the mutation profile (readOnlyHint false, destructiveHint false, non-idempotent). The description adds real behavioral context: the deliberate route yields typed/parented places, while the implicit route produces duplicates. It stops short of noting that a repeated call is not idempotent and can itself create duplicate places, which would be the one remaining behavioral 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 the core action in the first sentence, and the following sentences justify the 'deliberately' framing rather than padding it. Slightly more explanation of the anti-pattern than strictly needed, but every sentence 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 and no output schema, the description covers purpose, timing, and consequences well. The one missing piece is what the call returns (e.g., the new place's handle/gramps_id), which matters since no output schema exists to tell the 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 baseline is 3. The description only echoes 'a type and a parent,' adding no syntax, format, or matching semantics beyond what the schema already documents for all eight parameters.

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 place') with the distinguishing scope 'deliberately, with a type and a parent.' It also contrasts against the implicit side-effect route, so an agent can tell what this tool does differently from letting an event naming produce a place.

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 ('Use this instead of letting a place appear as a side effect of naming one in an event') with the failure consequence of the alternative ('untyped, unparented place... duplicate hierarchies'). Nothing is left to inference about when this tool is the right choice.

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

add_repositoryB

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)'.
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.
repository_typeNoType: 'Library', 'Archive', 'Cemetery', 'Church', 'Web site', etc.Archive

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare a non-destructive, non-idempotent, closed-world write, so the safety profile is covered. The description adds the domain-model context but says nothing about duplicate-name handling, what identity the new repository receives, or what the call returns — the near-miss type-refusal behavior lives only in the schema's allow_new_type text.

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 entity, then a short conceptual gloss. Three sentences with minimal waste; the hierarchy line earns its place by orienting the agent in the evidence model.

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?

Annotations carry the safety profile and there is no output schema to explain, so the description is nearly sufficient. Missing nothing critical, but for a create tool it would help to note that a duplicate/identical repository is not deduplicated here (find_duplicates and merge_objects exist) and roughly what comes back.

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 (name, url, repository_type, allow_new_type) are already documented with examples and defaults. The description's phrase 'institution or place that holds sources' lightly reinforces what `name` means but adds no syntax, format, or constraint detail.

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 Repository') and immediately defines the resource as 'an institution or place that holds sources.' The evidence-model line (Repository -> Source -> Citation -> fact) places it relative to add_source and add_citation, giving implicit sibling differentiation, though it never names those tools directly.

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?

'Create these for archives, libraries, cemeteries, or websites you'll cite sources from' gives a domain context for use, but largely restates the repository_type values already documented in the schema. No alternative is named (e.g., link_repository for attaching an existing repository to a source), so the agent must infer when this tool wins over its siblings.

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

add_research_taskA

Add a research task to Gramps Web's own task list (its Tasks view).

Written exactly as Gramps Web's New Task form writes one: a Source tagged ToDo, Status 'Open', a Priority, and the description as a To Do note. A task is a to-do, never evidence: never cite it.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoTags besides ToDo, found or created by exact name, e.g. ['Probate'].
titleYesWhat to do, in one line, as the Tasks list shows it.
privateNoMark the task and its note private.
priorityNohigh, medium or low.medium
attributesNoMore source attributes, name to value, e.g. {'Bears-On': 'I0035'}. Status and Priority have parameters of their own.
descriptionNoDetails. Stored as the task's first note, type To Do.
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already establish this is a write operation that is neither idempotent nor destructive, so the bar is lower; the description adds real context by disclosing the internal write shape (Source tagged ToDo, Status 'Open', a Priority, and the description stored as a To Do note). It does not mention potential duplicate creation despite idempotentHint=false, nor any permission requirements.

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, with the action and its target front-loaded and the cautionary rule last. Every clause carries information the agent cannot get from the name or schema alone.

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 7-parameter, non-idempotent write tool with no output schema, the description covers what it creates and the key domain constraint well. The remaining gap is the response (whether the created task's identifier is returned) and duplicate-creation behavior, which would help an agent chain a follow-up update_research_task call.

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 framing beyond the schema: it explains that this is written as a Source with the description as a To Do note and a Status of 'Open', which explains how priority/description map onto stored fields. It still says nothing about tags or allow_new_type behavior beyond what the schema already 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 ('Add a research task to Gramps Web's own task list (its Tasks view)') and pins it to the Tasks view, which cleanly separates it from list_research_tasks and update_research_task. The second sentence clarifies what artifact is actually produced, so the agent knows this is not note/citation creation.

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 positive context (modeling a task the way Gramps Web's New Task form does) plus a hard exclusion: 'A task is a to-do, never evidence: never cite it,' which steers the agent away from representing this as a source of evidence. It does not name sibling alternatives such as update_research_task for later modification, so it falls short of requiring the top score.

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.
media_typeNoMedium of the source at that repository, e.g. 'Book', 'Film', 'Electronic'. Only used with repository.Unknown
repositoryNoRepository handle/gramps_id that holds this source.
call_numberNoCall number / reference within the repository.
abbreviationNoShort abbreviation.
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.
publication_infoNoPublication info (publisher, date, series).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover the safety profile (write, non-destructive, non-idempotent, closed-world), so the bar is lower. The description adds genuinely useful behavioral context beyond them: the evidence-model relationship to citations and the optional repository link. It stops short of operational details such as duplicate handling on a non-idempotent create 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?

Four sentences, front-loaded with the definition and then the workflow, with no filler. The parenthetical gloss on 'Source' and the citation relationship both earn their space, though the text is slightly longer than strictly needed for an 8-param create 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?

For a create tool with full schema coverage and safety annotations, the description supplies the domain framing an agent needs to call it correctly. No output schema exists, so the return value is unspecified, and duplicate/error behavior for a non-idempotent create is left implicit — the only notable 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% and every one of the 8 parameters is documented in the schema itself (title, author, repository, call_number, allow_new_type, etc.). The description adds no parameter-level syntax or format guidance, 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?

States a specific verb (Create) plus resource (Source) and defines the resource in domain terms ('a body of evidence: a record set, book, certificate, website'). It also separates itself from the closely-related add_citation by explaining that a Source is cited *through* a Citation, so an agent can distinguish the two 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 Guidelines4/5

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

Gives real context: create the source once, then create citations against it per fact, and optionally link it to a Repository. This tells the agent where add_source sits in the workflow, but it never states a when-not (e.g. use update_source for existing sources, or what to do if it may already exist).

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: 'Web Home', 'Web Search', 'E-mail', 'FTP', or a custom type the tree already has.Web Home
descriptionNoOptional link description.
object_typeYesType of the object: 'person', 'place', or 'repository' only.
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare the mutation profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false), so the bar is lower. The description adds real domain context not present in the annotations or schema: only these three object types carry a URL list. It stops short of saying what happens on a duplicate URL or how a rejected near-miss type surfaces, though the allow_new_type schema text covers the latter.

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 primary action stated first and the routing rule second. 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 6-parameter mutation tool with no output schema, the description covers target scope and alternative-tool routing, and all parameters are fully documented in the schema. It omits any indication of the return value or duplicate/upsert behavior, which is a minor gap given the annotations already convey the safety profile.

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 the object_type enum-ish restriction and the allow_new_type behavior, so the schema does the heavy lifting. The description reinforces the object_type constraint but adds no further syntax, defaults, or format guidance beyond what the properties already state. 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 ('Add') plus the resource ('a web URL') and constrains the valid targets to person, place, or repository. It also cites the sibling it is not (add_attribute) for sources/citations, so an agent can distinguish it 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?

Explicitly gives the when ('person, place, or repository') and the when-not with a named alternative ('For sources/citations, record a web address as an attribute (add_attribute) instead'). Nothing about tool selection is left to inference for the source/citation case.

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

A3.9/5.0
Behavior4/5

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

Annotations only declare readOnlyHint and openWorldHint=false, which the description goes well beyond: it discloses the relative-walking heuristic, that it works for undated people, that the answer is advisory, and that bulk output is filtered by an independent server rule regardless of the result. Those are real behavioral caveats an agent could not infer from 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?

Purpose is front-loaded in the first sentence, followed by mechanism, usage guidance, and caveat in a logical order. Slightly line-broken and a touch verbose, but every sentence contributes a distinct point 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 read-only advisory tool with no output schema, the description covers the mechanism, the advisory caveat, the explain mode, and an independent filtering behavior. It stops short of describing the verdict's shape or any confidence/error semantics, which would help an agent interpret results, but the essentials are present.

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 four parameters, which sets the baseline at 3. The description reinforces `explain` by framing it as reasoning vs. verdict, but says nothing about `average_generation_gap` or `max_age_probably_alive` beyond what the schema already states.

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 specific operation on a specific resource: determine whether a person is probably still alive, with a rationale. It also explains the mechanism (walking relatives) so an agent knows what class of question this answers. It does not explicitly contrast itself with any sibling, though none of the listed siblings overlaps this capability.

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 a concrete use condition ('before publishing or sharing anything') and routes between modes ('use explain when you want to see the reasoning rather than just the verdict'). No explicit when-not or named alternative tool, but the trigger context is clear enough to act on.

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.3/5.0
Behavior5/5

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

With annotations already covering safety (readOnlyHint=false, destructiveHint=false), the description still adds substantial behavioral context beyond them: the file is copied into the tree's managed media directory ('don't point at files you don't want copied'), an identical existing file is reused rather than duplicated, and the write is verified afterwards with 'verified: false' meaning nothing attached. That verification semantics is essential since there is no output schema.

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 mode split follows immediately, so the agent gets the key decision first. The remaining sentences mostly earn their place (side effect, dedup, verification), though the duplicate-upload anecdote and parenthetical asides make it slightly longer than necessary.

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, it covers the essentials: side effects (file copy), dedup/reuse behavior, mode selection, the mutual exclusivity of file_path and media_ref, and how to interpret the verification result. Nothing an agent needs to call this correctly appears to be 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, and the description adds real meaning on top: it explains that file_path causes bytes to be uploaded into the managed media directory with dedup behavior, and that media_ref links an already-existing Media object. It also reinforces the mutual exclusivity of the two parameters, going slightly beyond the schema's own wording.

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 names a specific verb and resource ('Attach an image or document to an object') and explicitly splits the operation into two modes: a new upload via file_path, or linking an existing Media object via media_ref. It is very clear on what it does, but it never distinguishes itself from the sibling tool add_media, which an agent could easily confuse with attach_media.

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 clear in-context guidance for choosing between the two modes ('With file_path... With media_ref...') and adds an operational warning about duplicate uploads ('Uploading the same photograph separately for the husband and the wife creates duplicates'). However, it never names an alternative tool or states when not to use this one, so the routing burden against siblings like add_media/update_media 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.

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

A3.9/5.0
Behavior3/5

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

Annotations already declare the write profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds useful behavior the annotations cannot convey: the citation is resolved-or-created, appended to the citation list with no duplicates, and no other event field is touched. It stops short of saying what the response looks like or how it behaves against a duplicate 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?

Three compact sentences, with the hard constraint ('ALREADY exists') front-loaded and the resolution/dedup behavior following. No filler, though the parenthetical about handles and inline fields is slightly dense.

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 no output schema, the description covers what is written, what is left untouched, and the dedup rule. The only real gap is the unspecified return value and error behavior on a bad event handle.

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 embedded CitationInput docstring already spells out the citation/source/source_title precedence, page, and confidence semantics. The description only summarizes that precedence at a high level, so it adds little beyond the structured 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 and resource ('Attach a citation to an event') and immediately narrows the scope with the capitalized 'ALREADY exists', which separates it from the add_event/add_citation creation siblings. An agent can tell what it writes and to which object type 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 triggering conditions: source an event you didn't create inline, an event added via the Gramps web UI, or an event surfaced by list_unsourced_facts. It names a sibling tool as the discovery path but doesn't explicitly state when to prefer cite_event over cite_object or cite_child_link, so routing for the other cite_* variants 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.

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.

A NAME is cited with object_type='name': "this record gives this spelling" is narrower than evidence about the person. 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.
nameNoWith object_type='name': which of the person's names, e.g. {'surname': 'Bittner', 'type': 'Birth Name'} or {'primary': true}. Must match exactly one.
citationYesCitation to attach.
object_typeYesperson, family, event, place, media, source, citation, or name (one of a person's names: ref is the person, name says which).

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare the mutation profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false, openWorldHint=false), so the safety story is covered. The description adds domain semantics about which claims a citation supports, but says nothing about side effects, whether a new citation object is created, or what happens to an existing citation on re-cite. Useful context, but not rich behavioral disclosure beyond 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 core action and scope, then organized as distinct routing paragraphs. Every sentence maps to a real decision, though the prose is dense and the family/name cases could be tighter.

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?

Covers scope, alternatives, and the tricky name/family/link cases well, and the schema fully documents the citation precedence. It stops short of describing the return value or failure mode (e.g. a name match that matches zero or multiple names), which would matter for a non-idempotent mutation with no output 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 coverage is 100% and CitationInput's precedence rules are fully spelled out in the schema, so the baseline is 3. The description reinforces the object_type='name' case and the family case but adds no new syntax or format detail beyond what the schema already documents.

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 citation to any object that carries one') and immediately scopes it against the sibling cite_event ('cite_event covers facts; this covers the rest'). An agent can distinguish this from cite_event and cite_child_link 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 routing rules: events go to cite_event, parent-child links to cite_child_link, person-level citations only for whole-person evidence, names via object_type='name'. It even states a preference ('prefer citing the specific event where one exists'), which is exactly the when-not guidance an agent needs.

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 a central person. They are included, and each event gets anchor_age, their age at it; age is always the age of the person whose event it is.
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

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 output-side behavior that the annotations don't: per-event citation count and confidence parity with get_timeline, plus an aggregate uncited_count — meaningful because there is no output schema to convey this.

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 is front-loaded in the first sentence, followed by when-to-use and then output characteristics. Three short paragraphs, each earning its place, with no filler — only slightly looser than an ideal single tight block.

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 annotations covering the safety profile and a 100%-covered schema, the main remaining gap was return-value information, which the description supplies (citation count, confidence, uncited_count). The one thing an agent cannot learn is pagination/ordering behavior for a merge across multiple targets, but overall the definition is sufficient 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 all six parameters (limit, anchor, targets, event_types, object_type, include_private) are already documented in the schema. The description's mention of 'people or families' loosely maps to object_type but adds no syntax, default, or interaction 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.

Purpose4/5

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

The first sentence gives a specific verb and resource ('Merge several people or families into one chronological timeline'), and the description explicitly references get_timeline, noting it carries the same per-event citation count and confidence plus an uncited_count across the set. This differentiates it from the single-timeline sibling, though the contrast is framed as output parity rather than a crisp 'use this instead of that' statement.

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?

Two concrete usage scenarios are given: seeing a household move together through censuses, and checking whether a family's events are mutually consistent. These tell the agent when the tool fits well, but there is no explicit exclusion or routing rule against get_timeline, event_span, or verify_tree.

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 already declare readOnlyHint=true and openWorldHint=false, but the description adds substantial behavioral context beyond that: results are per file, each fact is flagged for whether a source was attached, source text is included when present, results are untrusted, and probably-living people are withheld and counted. This is exactly the kind of return-behavior and privacy disclosure that helps an agent use the tool correctly.

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 and then layers return details, source-flagging behavior, usage warning, and privacy handling in a compact block. Every sentence adds useful information without repetition or waste.

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 search/consult tool with no output schema, the description supplies enough return-shape information, trust-level guidance, source-flagging semantics, and privacy behavior. Combined with annotations that cover safety, an agent has what it needs to call and interpret this 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 all four parameters are already documented in the input schema. The description does not add syntax, matching behavior, or format details beyond what the schema provides. Baseline 3 is appropriate when the schema carries 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?

The description states a specific verb and resource: consult/search the legacy GEDCOM reference layer for hints. It clearly frames the tool as returning untrusted, non-authoritative hints rather than definitive records, which distinguishes it from sibling lookup tools. An agent can understand the tool's unique role 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 explicit usage context: use hints to decide what real record to hunt for, then create the fact in the tree citing that record. It also gives a clear prohibition: do not copy a hint in as a sourced fact. It does not name alternative sibling tools, so it falls short of full when/when-not/alternatives guidance.

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.8/5.0
Behavior3/5

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

Annotations already declare this as a non-read-only, non-destructive, non-idempotent write. The description adds that the result is persisted and reappliable, but never warns that repeated calls with the same name are not idempotent (idempotentHint=false), nor describes permissions or duplicate-name behaviour. It adds some context but leaves the main behavioural risk unstated.

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, purpose first, rationale second; there is no filler and the alternative/rationale clause is front-loaded within its sentence. The second paragraph is slightly padding-like for an agent that only needs invocation facts, costing it a point.

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 6-parameter mutation with no output schema, the description never states what is returned (a filter handle/ID? the saved object?) or what happens on a name collision. With annotations and 100% schema coverage the remainder is adequate, but the return-value gap is real.

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 6 parameters, including the plain-language hints for namespace, rules, function and invert, so the schema carries the parameter semantics. The description adds no syntax or format detail beyond what is already documented (e.g. the list_filter_rules reference for rule names 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?

States a specific verb and resource (save/create a reusable custom filter) plus the constraint that it is built from Gramps' own rules. An agent can immediately distinguish it from the sibling reads (list_custom_filters) and destructive operation (delete_filter) 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?

The second paragraph gives an explicit when-to-use cue: pick this for a selection you will run repeatedly (audit scope, branch of the tree) because the filter gains a name instead of being retyped. It stops short of naming alternatives such as list_custom_filters or delete_filter, and gives no when-not guidance.

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.6/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, so the agent knows this is a destructive, non-idempotent write. The description adds genuine value beyond that by scoping the destruction: only the saved filter definition is removed and nothing in the tree is affected. It stops short of stating whether the deletion is permanent or recoverable.

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 clarification immediately following. 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 two-parameter delete tool with full schema coverage, no output schema, and annotations carrying the safety profile, the definition is close to complete. The remaining gap is the absence of any consequence statement (permanence, recoverability, permission requirements) for what is a destructive operation.

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 both 'name' and 'namespace' documented in the schema itself, so the baseline is 3. The description adds no extra meaning about parameter format, accepted namespaces, or identifier conventions 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 ('Delete a saved custom filter'), which is unambiguous and separable from siblings like create_filter and list_custom_filters. It does not explicitly name a sibling to distinguish itself from, so it falls 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 Guidelines2/5

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

The description says nothing about when to use this tool versus alternatives, nor about prerequisites such as needing the filter to exist or having permission to remove it. Usage is only implied by the verb 'Delete' and the required namespace/name pair.

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. The server also removes every reference to it. Refused when it is the only holder of a note or image (pass carry_to to move them), and for a source with citations, which the server would delete with it.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYesHandle or gramps_id of the object to delete.
carry_toNoAnother object of the same type to receive the notes and images that only this one holds. Without it, such a delete is refused.
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 only declare destructive=true; the description goes well beyond that by disclosing cascading behavior ('the server also removes every reference to it') and two specific refusal conditions with the carry_to workaround. Those are exactly the side effects an agent must know before invoking a destructive delete.

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 identifier forms, then a one-word DESTRUCTIVE flag, then the exception cases. Every sentence carries non-redundant information; nothing is 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?

With no output schema, the description still covers the destructive semantics, cascade scope, and failure modes, which is sufficient for a 3-param delete tool. It omits what the tool returns on success and whether the action is recoverable (e.g., undo_transaction), leaving 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 target/object_type/carry_to are already documented in the schema. The description restates carry_to's purpose ('pass carry_to to move them') but adds no format, default, or syntactic 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.

Purpose4/5

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

States a specific verb and resource ('Permanently delete an object from the tree') plus the identifier forms (handle or gramps_id), and the word 'Permanently' implicitly distinguishes it from sibling detach_object/uncite. It does not name a sibling explicitly, 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?

Gives concrete preconditions and the alternative path: refused when the object is the only holder of a note/image, in which case 'pass carry_to to move them', and refused for a source with citations. That is clear when-it-works guidance, though it does not explicitly route to sibling tools like detach_object or merge_objects.

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; a tag may be given by name.
parentYesIts handle or gramps_id.
child_kindYesWhat to detach: event, media, note, tag (removes a tag), citation, child (a person from a family), person (a person_ref), repository, enclosure (a parent of a place), or -- on a person, to repair a link only the person holds (check_family_links) -- parent_family or family.
call_numberNoRepository only: detach just the link with this call number, when a source is held twice in one repository. Omit to detach every link.
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

A3.9/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is covered. The description goes beyond that by disclosing the orphan-check semantics: deletion only happens when delete_if_orphan is set AND nothing else references the object, precisely because dangling handles would otherwise result. It does not cover permissions or what the response looks like.

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 and its scope are front-loaded in the first sentence, with the destructive edge case in the second. The em-dash clause is slightly ornate but every sentence carries load; 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 six-parameter, four-required mutation tool with no output schema, the definition covers the action, the supported relationship kinds and the one genuinely risky flag. It never explains parent_type's valid values or the relationship to check_family_links beyond a passing reference in the schema, 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%, including per-parameter docs for child_kind, call_number and delete_if_orphan. The prose restates the detach-vs-delete distinction but adds no syntax or format detail beyond what the schema already supplies, so the baseline of 3 is right.

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 ('Remove a reference from an object') and immediately enumerates concrete cases: event from person, image from source, tag, note, child from family. It also implicitly separates itself from delete_object by asserting 'the object itself survives,' 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 Guidelines3/5

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

There is real usage guidance embedded ('detaching and deleting are different decisions', delete_if_orphan is off by default), but no sibling is ever named. With uncite, delete_object, update_child_ref and move_child all in scope, the agent must infer which to pick rather than being routed.

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 rationale about avoiding transcription errors but does not disclose return format, error behavior, or precision handling beyond what the schema implies.

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 that are front-loaded with the core action. The final sentence is somewhat wordy but adds useful rationale; no significant waste.

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 computation tool with no output schema, the description does not explain what the result looks like (e.g., an interval string or age format). It covers purpose and use case but leaves a notable gap in return value expectations.

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. The description adds no additional meaning for event handles, as_age, or precision, 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?

States a specific verb and resource: 'Measure the elapsed time between two events.' It clearly distinguishes from event retrieval tools by focusing on the interval calculation, though it does not explicitly name a sibling it is not.

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 context for when to use it: 'The arithmetic behind most plausibility checks: age at marriage, years between a census and a death.' No alternatives or exclusions are named, but the use case is well-implied.

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/5.0
Behavior4/5

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

Adds meaningful context beyond annotations: explains the rationale (irreversibility of bulk writes), reassures on cost ('a few seconds and one file'), and clarifies recoverability ('can be re-imported'). The annotations already cover safety signals. Minor gap: doesn't mention disk space or overwrite behavior, though the schema covers the latter.

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 action, then rationale. 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?

For a backup tool with no output schema, the description explains purpose, timing, cost, and recovery value. It doesn't explain what the export returns (file path?), but that's not critical for an agent invoking it. Complete enough.

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 parameters are thoroughly documented in the schema itself ('gramps' as lossless safety dump, dest_path behavior). The description adds no parameter-specific detail, which is acceptable given full schema coverage. 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 clear verb+resource ('Write a full-tree export to disk'), which distinguishes it from read-only siblings like query_objects or get_object. It doesn't name a sibling alternative, but its purpose is unmistakable.

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 timing guidance ('Take one before any bulk write'), which is a concrete usage condition. It lacks explicit when-not-to-use guidance, but the context is well-defined for a backup tool.

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.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 that it never mutates and explains the consequential risk of over-merging, which is real behavioral context. It stops short of describing what a returned group looks like or how scoring/'likely' is determined.

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 its safety constraint are front-loaded in the first sentence, which is exactly right. The middle narrative about false evidentiary claims is somewhat discursive, but it justifies the tool's caution 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 read-only, no-output-schema discovery tool with fully documented parameters, the essentials are present: it finds candidates, returns grouped results, and defers the merge decision to the caller. Only the shape/ordering of returned groups is unstated, which is minor here.

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 rich enum-like detail on 'kind' values, so the schema does the heavy lifting. The description adds no parameter-level syntax beyond what the schema provides, making 3 the appropriate baseline.

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 ('Find likely-duplicate objects') and immediately scopes it against the merge behavior ('Reports only -- it never merges anything'). An agent can distinguish it from merge_objects 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 Guidelines5/5

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

Explicitly tells the agent when to use it (candidate discovery), what it must NOT treat as duplicates (index entry vs. register page), and which sibling to use for the follow-up action ('Merge with merge_objects'). The when-to-use and hand-off routing are both present.

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 cover the safety profile (readOnlyHint=true, openWorldHint=false), and the description adds genuinely non-obvious behavior: living/private ancestors are returned as redacted stubs by default. It also discloses the nested-tree return shape, which matters since there is no output schema. It stops short of describing error behavior for an unknown 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?

Two sentences, no filler. The core operation is front-loaded and the privacy caveat is placed second, where it belongs.

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 sketches the return shape (nested parents tree with redacted stubs) and the annotations carry the safety profile. It is nearly complete; only failure modes and depth-limit behavior are left 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%, so all three parameters (person, generations, include_private) are already documented with types, defaults, and bounds. The description echoes 'up to N generations' and the include_private effect with no additional 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?

States a specific verb ('Walk') and resource ('ancestors') with scope ('up to N generations') and return shape ('a nested parents tree'). An agent can distinguish it from the sibling get_descendants purely on the description.

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 when to use it (tracing ancestry upward) and hints at the privacy trade-off, but never explicitly names alternatives such as get_person or get_descendants, nor states exclusions. Usage is inferable rather than stated.

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.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 genuine behavioral value by interpreting cited_by_count — zero signals an orphaned citation that should have been removed by uncite — which is semantics the agent could not derive from annotations or schema.

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 action and return fields, then a short second paragraph on the one field that matters. Both sentences earn their place, though the orphan-debris editorializing is slightly informal for a tool contract.

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 must convey the return shape, and it does list the principal fields plus the significance of cited_by_count. It omits error behavior for an unresolvable handle and does not enumerate every returned field, leaving a small gap for a read tool of this complexity.

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% ('Handle or gramps_id of the citation'), so the schema fully documents the single parameter. The description adds nothing about accepted identifier formats or resolution behavior, which is the baseline-3 case when the schema carries the load.

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 ('Read one citation') and enumerates the fields surfaced (page, confidence, date, source), which distinguishes it from the write-side siblings like update_citation and uncite. It does not explicitly distinguish itself from adjacent readers such as get_source or get_object, so it falls 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 Guidelines3/5

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

There is no explicit when-to-use statement, but the second paragraph implies a diagnostic use case: fetch a citation to inspect cited_by_count and decide whether it is orphan debris. The reference to 'uncite should have deleted it' gestures at a workflow without naming when to prefer this tool over query_objects or get_object.

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.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 safety is covered. The description adds genuinely non-structured behavior: living/private descendants are redacted to stubs by default, and the result is a nested tree rather than a flat list.

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 compact sentences, front-loaded with the core action and followed by the one behavioral caveat an agent must know. 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?

With no output schema, the description usefully characterizes the return value as a nested children tree and discloses the redaction default, which are the key facts for this traversal tool. It stops short of covering failure modes (e.g., unknown person) or how the generations cap interacts with sparse data.

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, generations, and include_private fully. The description only echoes the generation cap ('up to N generations') and the default redaction behavior, adding little beyond the schema baseline.

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 return shape (nested children tree), which is more than a restated name. It is inherently distinguishable from the get_ancestors sibling, but it never names or contrasts with any sibling 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 only implied: an agent can infer this is the downward-traversal counterpart to get_ancestors. There is no explicit when-to-use/when-not guidance or routing to alternatives such as get_family or get_relationship.

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 real value beyond that: it names the key returned figures (shared cM, largest segment, common ancestor) and flags `unattributed_count` as the field that identifies open research, which shapes how an agent interprets results. It still omits pagination/return-shape specifics.

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?

Purpose is front-loaded in the opening sentence and the structure (what it returns, then interpretive caveat) is easy to scan. The bolded DNA-evidence paragraph is a bit editorial for a two-parameter read tool, but it is short and each sentence carries a distinct idea.

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 usefully compensates by enumerating the per-match fields and calling out `unattributed_count`. For a simple read-only list tool with fully documented params this is nearly complete; only pagination and error behavior are unspecified.

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 `person` and `include_raw` are documented in the schema itself. The description does not add syntax, handle-format, or default behavior 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.

Purpose4/5

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

The first sentence gives a specific verb and resource ('List the DNA matches recorded against a person'), and the following sentences clarify the per-match payload. It does not differentiate itself from close siblings such as add_dna_match, get_ydna, or parse_dna_segments, so an agent still has to infer the boundaries from names alone.

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: an agent can tell this returns matches for a tested person, but there is no explicit when-to-use guidance or routing to alternatives like get_ydna (Y-DNA) or parse_dna_segments. The bolded note explains how to interpret DNA evidence generally, not when to call this tool instead of a sibling.

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.3/5.0
Behavior5/5

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

Beyond readOnlyHint/openWorldHint it discloses two behaviors the annotations cannot convey: living and private people are withheld by default and only shown when include_private is set, and the call is slow because the server computes results per call. It also frames implausible results as likely data errors, which shapes how the agent should interpret output.

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 purpose in the first sentence, then clarifies scope, interpretation, privacy, and cost in order. Every sentence contributes, though the privacy sentence duplicates the include_private schema description and the length is near the upper bound for a list-style 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?

There is no output schema, and the description does not describe the shape of the returned record-holders (names, values, ordering by rank), which is the main remaining gap. Parameters, safety, privacy defaults and performance are all covered, so an agent has enough to decide and call, just not to anticipate the response.

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's mention of include_private largely restates that. It adds only a light framing of the scope ('across a set of people'), which the schema's person_filter description already covers in more detail. 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 an unusual resource ('the tree's record-holders'), then immediately concretizes it with three examples: oldest at death, youngest parent, most children. The line 'Superlatives across a set of people, not statistics about one person' separates it from per-person getters like get_person or db_stats without requiring the schema to be opened.

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 usage scenario ('a quick plausibility check' for data errors) and a condition on the include_private flag. However it never names an alternative tool or states an explicit when-not-to-use case, so the agent must infer routing from the purpose line alone.

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_jobA
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_idYesThe task_id returned by whatever dispatched the work: undo_transaction, verify_tree, reindex_search or run_report.

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 meaningful async semantics — that the dispatching tools answer before the work completes and that status must be polled to a terminal `finished` flag — which is real behavioral context beyond the annotations. It does not mention timing, retry limits, or error behaviour if the task_id is unknown.

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 outcome question, then the polling protocol. The closing sentence about never checking is slightly motivational rather than instructional, but it reinforces the polling contract and does not bloat the definition materially.

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 carries the burden of naming the fields an agent must read — it does this for `finished` and `succeeded`. What is still missing for a polling tool is terminal-state handling (e.g. failure detail, whether the job record survives until polled, or what happens after several polls).

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 sole parameter's schema text already explains that task_id comes from undo_transaction, verify_tree, reindex_search or run_report. The description restates the same dispatching set, so it adds little 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 ('check whether a background job has finished, and whether it worked') tied to a named object ('task_id'). An agent can distinguish this from list_jobs because the description frames it as polling a single dispatched job for its terminal state, not enumerating jobs.

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 operations that dispatch work (undo, verification, import, reindex) and the exact usage loop: 'Poll this until `finished` is true, then read `succeeded`.' It even states the failure mode of not using it ('leaves you assuming an outcome you have not seen'), so when-to-use and when-not-to-skip are both covered.

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.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 goes beyond that by disclosing return-field semantics (referenced_by_count >1 is normal, shared checksums indicate duplicates), which is valuable given there is no output schema.

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 two compact notes on interpreting results. The em-dash asides and backticked field references are slightly informal but each 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 read-only, one-parameter tool with no output schema, the description helpfully enumerates the returned fields and explains how to interpret the reference count and checksum. This compensates well for the missing output schema, leaving only the get_object vs get_media distinction 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 fully documented as 'Handle or gramps_id of the media object.' The description adds no syntax or format detail beyond what the schema already 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 and resource ('Read one media object') and enumerates the fields it returns (path, mime type, checksum, description, date). It is clearly distinct from the get_person/get_event/get_source siblings, though it does not explicitly contrast with the generic get_object, which could also fetch media.

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 routes the agent toward find_duplicates(kind='media_checksum') for duplicate hunting and explains how to read referenced_by_count, which is useful context. However, it never states plainly when to choose this tool over alternatives like get_object, so usage guidance remains 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.

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.5/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 new behavioral detail: the note text is returned whole rather than truncated, and the result includes the note's type and its attachment. With no output schema, this return-shape disclosure is the right kind of added value.

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. The second sentence is longer than a typical definition but earns its place by justifying why the full text matters, though it leans slightly into narrative.

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-only tool with no output schema, the description covers purpose, return content (full text, type, attachment) and the reason notes exist. Return-value expectations are adequately set, and no auth or edge-case caveats appear necessary.

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 single parameter is documented in-schema as a 'Handle or gramps_id of the note.' The description adds no format, prefix, or resolution guidance 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?

States a specific verb and resource ('Read one note') plus the scope of what comes back ('in full, with its type and what it is attached to'), which is more than a restatement of the name. It does not, however, distinguish itself from the generic sibling get_object, which plausibly also retrieves notes by handle.

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 or when-not-to-use guidance and no alternative is named. The agent is left to infer that get_note is the note-specific equivalent of get_object/get_person.

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 establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavioral context beyond them: it returns the record 'as stored' (raw, unshaped), and that this raw form is preferable prior to an edit. It stops short of describing key-filtering behavior or the absent output 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 tight sentences; the core capability is front-loaded and each following sentence adds a distinct routing or behavioral fact. No filler or restatement of the name.

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 generic getter with full schema coverage and annotations, the description covers purpose, routing, and the nature of the return (raw vs shaped), which is what an agent needs to call it correctly. Minor gap: it says nothing about how the returned record is rendered or its field structure, though no output schema exists to cover that.

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 object_type, ref, and keys are already documented in the schema. The description only hints at the object_type domain (places, media, notes, citations) and adds no syntax or format detail beyond the schema. Baseline 3 is correct 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 (Read) and resource (any object's raw record) and explicitly carves out the subset of objects without shaped getters. It also names the sibling getters (get_person, get_source) it is differentiated from, so an agent can distinguish it 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 ('what you want before editing one') and when-to-prefer-an-alternative ('for people and sources the shaped getters ... are easier to read'). The condition selecting the alternative sibling is spelled out, not inferred.

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), attributes, 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.2/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 new behavioral context beyond that: direct single-record access bypasses the privacy filtering that bulk/list tools apply, which an agent could not infer from the annotations alone.

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, zero filler. The return-field list is front-loaded in the first sentence and the when-to-use/privacy guidance follows, so an agent gets the essential shape immediately.

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, but the description compensates by enumerating the fields returned, and the read-only annotation covers the safety profile. For a single-record fetch this is nearly complete; only incidental details like what happens when the handle is not found 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?

There is only one parameter and schema description coverage is 100%, with the schema itself giving the format and example ('I0001'). The description adds no additional parameter syntax or constraints, and per the high-coverage baseline a 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+resource ('Get full detail for one person') and enumerates the returned facets (name, gender, events with citation counts, attributes, family links, media count). This distinguishes it from siblings such as get_family, get_event, and 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 clear usage contexts: 'inspect someone before adding facts' and 'check whether an event is already cited.' It also carves out a when-this-is-permitted rule (direct lookup allowed for living/private people, only bulk/list tools filter them). It does not, however, name a competing lookup alternative such as get_object or query_objects for the caller to compare against.

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

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 safety is covered. The description adds genuinely useful behavioral context beyond the annotations: that `enclosed_by` forms the jurisdictional chain and that a missing chain signals an orphaned, event-minted place. It stops short of describing error behavior for a bad handle.

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 what is read and what comes back, followed by a short interpretive note. Every sentence carries information; 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 field enumeration is doing real work for the agent, and the enclosed_by/orphan explanation covers the tool's main subtlety. It is not fully complete: error/not-found behavior and the exact response shape remain unspecified.

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 schema already documents `place` as a handle or gramps_id, so the description need not restate it. The description's `enclosed_by` discussion concerns an output field rather than the input parameter, so it adds no input-side semantics. 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 first sentence gives a specific verb ('Read one place') plus the resource and enumerates the returned fields (name, title, type, enclosure, coordinates, URLs). The resource is unambiguous, so an agent can distinguish it from the many other get_* siblings (get_person, get_event, get_source) 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?

Usage is implied by 'Read one place' with a required place handle, but there is no explicit when-to-use/when-not guidance and no mention of the generic alternatives (get_object, query_objects) that overlap with this tool. The second paragraph is domain interpretation, not routing advice.

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

get_record_historyA
Read-only

Who added, edited or deleted one record, and when, newest first.

Each change names its transaction: get_transaction shows what it changed. Before gramps-webapi 3.22 the whole transaction log is read instead: slower, and the result says so.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesHandle or gramps_id. A deleted record by its handle.
fieldNoOnly the changes to this field of the stored record, each with its value before and after: 'parent_family_list', 'primary_name.first_name'.
limitNoMost recent changes to return.
object_typeYesperson, family, event, place, source, citation, repository, media, note, or tag.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only cover readOnly/openWorld, so the description carries the behavioral load and does add real context: results are ordered newest first, and on servers before gramps-webapi 3.22 the whole transaction log is scanned instead (slower, with the result self-reporting this). It still omits whether a missing/deleted record errors versus returning empty history.

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 question the tool answers, then the sibling relationship, then the version caveat. No sentence is filler; the version note earns its place because it sets performance expectations.

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 must convey the return shape, and it does so reasonably (per-change actor, action, timestamp, ordering, transaction identity). Minor gaps remain around empty/error results and pagination behavior for large histories.

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 explains ref (handle or gramps_id), object_type values, field filters and the limit bound. The description adds no parameter-level detail beyond that, making 3 the correct baseline.

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 concrete verb and resource ('get record history') and specifies the payload: who added/edited/deleted, when, newest first. It is clearly distinguishable from the sibling audit tools list_transactions and get_transaction, which it explicitly names.

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 routes the agent: this tool answers 'who/when changed this record', while get_transaction shows 'what changed'. That is a clear division of labor, but there is no explicit 'don't use this when...' or prerequisite statement, so it stops short of the top score.

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.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 genuinely new behavioral detail beyond that: the return shape (relationship in words plus generation distance to common ancestor) and the failure mode (`related` is false when no common ancestor is found within search depth). It stops short of 5 since it says nothing about performance, limits, or behavior on unknown/invalid person identifiers.

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 core action, then the return shape, then the failure-mode caveat. Each sentence carries information; only the parenthetical aside is slightly decorative.

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 fills the gap by explaining what is returned (words + generation distance) and the `related` flag semantics. All four parameters are schema-documented. Minor gaps remain around error behavior for bad handles and the server default depth.

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 baseline is 3. The description adds only marginal meaning — the notion of a depth-limited search and that the default reports the closest relationship (implying all_paths=false) — but contributes 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?

The description gives a specific verb+resource ('work out how two people in the tree are related') that is inherently distinct from directional siblings like get_ancestors and get_descendants. It does not explicitly name those siblings, so an agent must infer the distinction, keeping it 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 Guidelines3/5

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

Usage is implied by the purpose ('how two people are related'), and it signals that a false `related` result is meaningful 'if you expected one,' which is interpretive guidance. However, there is no explicit when-to-use/when-not or named alternative versus get_ancestors/get_descendants.

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.2/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds valuable behavioral context: reports take a full option dict, not a partial one, so this call is the way to change a single setting. It does not cover return shape or auth needs, but the bar is lower with annotations present.

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: the first front-loads the tool's action, the second explains the rationale. Every sentence earns its place with no repetition or 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 low-complexity read tool with full schema coverage and read-only annotations, the description gives enough to select and invoke it correctly. The only minor gap is that it does not describe the return shape (option keys and values), and no output schema exists to compensate.

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 `report_id` is fully documented in the schema. The description adds no parameter-specific syntax or format details beyond what the schema provides, so the baseline score 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 ("Read") and resource ("one report's default options") and clarifies the temporal context ("before running it"). This distinguishes it from sibling `run_report` by purpose, and from `list_reports` by scope.

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 states when to use it ("before running it") and explains the workflow: read defaults, then override a single key. It does not name alternatives or exclusions explicitly, but the context 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

A4.1/5.0
Behavior4/5

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

Annotations only declare readOnlyHint and openWorldHint=false; the description adds meaningful context beyond them — the researcher data is embedded in every export and travels with any GEDCOM/XML shared externally, which is a real privacy/disclosure trait an agent should know. It does not describe the fields returned, but the core behavioral insight is present.

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 filler. Purpose is front-loaded, then the reason it matters. Each sentence earns its place and the total length is well-matched to a trivial 0-param getter.

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 param-free read tool with annotations covering the safety profile, the description supplies purpose, rationale, and a usage trigger. The only shortfall is that with no output schema it doesn't hint at the shape of the returned researcher fields, leaving the agent to discover them.

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?

Zero parameters, so by rule the baseline is 4. Nothing in the description needs to compensate for a schema gap.

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: 'Read the researcher details recorded for this tree.' An agent can tell this is the tree's researcher metadata and not a person/source/note record despite the crowded get_* sibling list. It stops short of enumerating what 'researcher details' contains (name, email, address), which would help disambiguate from a generic record getter.

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 scenario: 'Worth checking before sharing one' (a GEDCOM/Gramps XML export). That is a clear when-to-use context. It names no alternatives or exclusions, but no sibling competes for this resource, so the omission is minor.

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/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 shape of the returned record, which is useful, but says nothing about error handling for invalid handles, whether the lookup is case-sensitive, or performance characteristics. Adequate but not rich beyond 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.

Conciseness5/5

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

Two sentences, zero waste, and the most important content (what is returned) is front-loaded before the usage note. Nothing could be removed without losing 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 enumerated field list is the only disclosure of return contents, and it is present along with a usage cue. Minor gaps remain around behavior for missing/ambiguous handles, but the definition is sufficient 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% and the single 'source' parameter is documented in the schema with the accepted formats (handle or gramps_id, e.g. 'S0001'). 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 (Get) and resource (source), then enumerates exactly what the returned record contains (title, author, publication info, linked repositories, counts, attributes, citation count). This clearly separates it from siblings such as get_citation, get_repository, or update_source without needing to name them.

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 a concrete usage context: inspect a source before citing through it or editing it, which implicitly routes the agent away from add_source/update_source and toward cite_object workflows. It lacks an explicit when-not clause (e.g., 'do not use to fetch citations themselves'), 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.

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 (1-5) of ancestors whose events to fold in. Omit this and offspring for the person's own events only. Given either, the server adds at least one generation each way; each event's person.relationship says whose it is.
offspringNoGenerations (1-5) 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.7/5.0
Behavior4/5

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

With readOnlyHint=true already declaring the safety profile, the description adds genuine context by disclosing the shape of the output (age per entry, citation support counts, strongest confidence, and an `uncited_count` for unsupported events) and the withholder behaviour is documented in the schema's include_private. It stops short of describing ordering, pagination, or truncation semantics for the 200-event default.

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 and uses the remaining two sentences for return-value and audit information rather than filler. The em-dash clause is slightly rhetorical ('doubles as a readable audit') but it does convey a real use case.

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 the description does the job of explaining what comes back (age, citation counts, confidence, uncited_count). Given six parameters at full schema coverage and a read-only annotation, the only meaningful omission is disambiguation from the sibling timeline 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 description coverage is 100%, including the multi-generation folding rules for ancestors/offspring and the privacy default, so the schema carries parameter meaning on its own. The description adds nothing parameter-specific beyond echoing `uncited_count`, 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 ('Build') and resource ('chronological timeline of someone's life events'), and even clarifies what an entry contains. However, it never mentions the sibling `consolidated_timeline` or `event_span`, so an agent can't tell from the description alone which timeline tool is appropriate for a given request.

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: the 'readable audit of where the evidence thins out' framing suggests using it for citation-coverage review, but there is no explicit when-to-use, when-not-to-use, or alternative named. Against a sibling called `consolidated_timeline`, that omission is a real gap.

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.5/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 real behavioral context beyond that: the response is detail-rich (shows the objects that moved) and it functions as a prerequisite check before an undo. It doesn't discuss size limits or error behavior, but for a single-record read that gap 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.

Conciseness5/5

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

Three short sentences, none wasted: what it returns, how it differs from the sibling, and when to call it. The core purpose is front-loaded in the first line.

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 one-parameter read tool with no output schema, the description tells the agent what the payload contains and where it fits in a workflow (before an undo). Nothing needed to call 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 parameter is already documented as 'Id from list_transactions.' The description adds no format, range, or provenance 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 transaction in full') plus the scope of the payload ('including the objects it changed'). It explicitly contrasts itself with the sibling list_transactions, so an agent can choose between them 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 Guidelines5/5

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

Names the alternative ('list_transactions summarises; this shows what actually moved') and gives a concrete usage condition: 'Read it before undoing anything' – implicitly routing the agent toward undo_transaction as the follow-up. When-to-use and when-to-prefer-the-sibling are both covered.

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.7/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). The description adds genuinely useful behavioral context: the has_data flag is false when no Y-DNA is recorded, which the text flags as the normal case — sparing the agent from treating an empty result as an error.

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 purpose, then layers scoping and interpretation. The domain exposition is slightly long for a lookup tool, but each sentence carries meaning and the has_data caveat is placed usefully at the end.

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, and the description compensates by naming the has_data output signal and what a shared terminal clade means. For a read-only two-parameter lookup this is close to complete, with only the include_raw return shape left implicit.

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 are fully documented by the schema itself. 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.

Purpose4/5

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

States a specific verb and resource — reports a person's Y-DNA haplogroup — and adds scope detail (broadest clade to terminal). It is clearly distinct from the DNA-matching siblings (get_dna_matches, parse_dna_segments) by domain, though it does not name any sibling 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?

Provides interpretive context about what Y-DNA does and does not tell you (paternal line only, corroborates a surname rather than proving a named link), which implies when the result is meaningful. However, it never states when to choose this over the other DNA tools or what prerequisites exist — usage 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.

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.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 safe-read profile is covered. The description adds that results are instance-scoped and reusable by name, but says nothing about return format, ordering, or pagination behavior.

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 with zero waste; the core purpose is front-loaded and the reuse value follows immediately.

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-optional-param read tool whose annotations cover the safety profile and with no output schema, this is nearly complete. Only minor gaps remain, such as noting that an empty result simply means no filters are saved.

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 optional 'namespace' parameter is already fully documented in the schema. The description adds no additional parameter semantics, which is the baseline expectation when the schema does the work.

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 ('List') and resource ('custom filters already saved on this instance'), which is clearly distinct from the 'filter rules' sibling. However, it never explicitly contrasts itself with list_filter_rules, create_filter, or delete_filter, so sibling differentiation is left to inference.

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 for why the tool exists: saved filters are reused by name from query_objects and the timelines. This tells the agent when the list is useful, but offers no explicit when-not or exclusion against the filter-related siblings.

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.1/5.0
Behavior4/5

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

Adds real behavior beyond the readOnly/openWorld annotations: the result is scoped to this tree, and the note that Gramps silently accepts typos as new custom types warns the agent that unexpected names indicate a data-entry error rather than a tool failure. It stops short of describing ordering or whether the list is cached.

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 purpose is front-loaded and the typo-detection hint follows as secondary value, each sentence earning 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 carries the return-value burden and does so adequately by naming the returned content (type names plus their stored integers). A 4 rather than 5 because ordering, completeness guarantees, and result format are left unspecified.

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; baseline 4 applies. No parameter guidance is needed or given.

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 (list) and resource (event type names this tree uses) plus the payload shape (names with stored integers). It is clearly distinguishable from the similarly named sibling list_object_types by the 'event' resource qualifier, though it never explicitly contrasts itself with that 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?

Gives a concrete when-to-use: before building a `query_records` filter, and as a self-consistency check on the tree's type vocabulary. No explicit when-not or named alternative is provided, but the 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_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.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 safety is covered. The description adds meaningful context about what kind of content is returned (rule vocabulary inaccessible to the query tools, e.g. 'is a descendant of'), though it says nothing about ordering, volume, or namespace defaults.

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: purpose first, unique value second, action directive third. The quoted rule examples earn their place by making an abstract concept concrete, 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?

For a read-only listing tool with full parameter documentation and no output schema, the description covers what the tool returns and why to call it. It could mention the shape or granularity of the returned rule list, but nothing essential to invoking 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 namespace parameter is fully documented with a default and the list of valid plural namespaces. The phrase 'in a namespace' in the description adds nothing beyond the schema, so the baseline 3 is correct.

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 (filter rules) plus scope (in a namespace), and distinguishes itself from sibling filter tools such as list_custom_filters and create_filter. The examples of rule vocabulary make the resource concrete.

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 says to read this before building a custom filter with create_filter, and clarifies that these rules are the vocabulary query_records and GrampsQL cannot reach. That names both the trigger condition and the alternative query paths.

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

list_jobsA
Read-only

List recent background jobs for this tree, newest first: undo, verify, reindex, report.

Use when you have lost a task_id, or to see whether anything is still running before starting a write session. Research tasks are list_research_tasks.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum jobs to return.

TDQS

A4.5/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 by structured data. The description still adds useful behavior the annotations don't: results are scoped to 'this tree', sorted newest first, and the set of job kinds covered. It stops short of describing pagination or default limit behavior, but that is largely the schema's limit parameter's job.

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 paragraphs: purpose and ordering first, then usage and the sibling routing. Every sentence earns its place and nothing is repeated from 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 read-only, zero-required-parameter listing tool with no output schema, the description covers what is listed, how it is ordered, when to reach for it, and which sibling handles the adjacent case. 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?

There is a single optional parameter with 100% schema description coverage ('Maximum jobs to return'), so the schema already carries parameter meaning. The description adds no format, range, or default guidance beyond it, which is the expected 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 and resource ('List recent background jobs for this tree'), plus the ordering ('newest first') and the enumerated job categories (undo, verify, reindex, report). It is clearly distinguishable from the singular get_job and from list_research_tasks, which it explicitly names as a different resource.

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 two concrete use cases ('lost a task_id', 'see whether anything is still running before starting a write session') and explicitly routes the agent away from a near-neighbor: 'Research tasks are list_research_tasks.' That is when-to-use plus an alternative, with nothing left to inference.

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: Gramps' standard names and its own custom ones.

The write tools take any of these, in any case. A name in neither is refused unless allow_new_type asks for a NEW custom type, which then stays in the tree's vocabulary for good.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior4/5

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

readOnlyHint=true already covers the safety profile, yet the description adds real context: names are accepted case-insensitively by write tools, names outside the vocabulary are refused, and a new custom type requested via allow_new_type permanently persists in the tree. That downstream behavioral detail is valuable and not derivable from 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?

Three short sentences with no filler, and the core statement of what the tool exposes comes first. The second half drifts into downstream write-tool behavior rather than staying tightly on the tool itself, but every sentence carries information.

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?

There is no output schema, and the description never states the return shape (a flat list of names, or names grouped into standard vs custom categories), which is the main thing an agent needs for this lookup tool. With zero parameters and annotations already covering read-only status, the definition is adequate but leaves the return structure to guesswork.

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 baseline is 4; there is no parameter surface for the description to explain or omit.

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 names the resource clearly ('the tree's type vocabularies') and specifies the content (Gramps' standard names plus custom ones), so an agent knows this enumerates valid type names. It does not, however, distinguish itself from the sibling list_event_types, which enumerates a subset of the same concept, leaving some ambiguity about overlap.

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: the description explains that write tools accept any of these names and that unknown names are refused, which hints you call this before writing. But it never states when to call this tool directly versus consulting a schema or the sibling list_event_types, and there are no explicit when/when-not conditions.

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 cover the safety profile (readOnlyHint=true, openWorldHint=false), so the description goes further by disclosing output structure — each entry names the option keys it accepts. It does not describe pagination or ordering, but it adds meaningful behavioral context beyond 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?

The core statement is front-loaded in the first sentence, followed by workflow guidance. The enumeration of report types is illustrative rather than essential, but it is compact and helps the agent recognize the scope of the report engine.

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 must carry the return-value burden; it does so partially by stating that entries expose option keys. Combined with the named follow-up tool, this is sufficient for a zero-parameter list tool, though ordering/shape of the list is not spelled out.

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 to document and the baseline is 4. The description correctly avoids inventing 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 and resource ('List the reports this Gramps instance can generate') and immediately distinguishes the tool from its report-running siblings by naming the sample report types and pointing at get_report_options. An agent can tell this is a discovery/enumeration 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 Guidelines4/5

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

Routes the agent to the follow-up step: 'read the defaults with get_report_options before overriding any.' That is clear workflow context, but it stops short of explicitly stating when this tool is chosen over alternatives such as run_report.

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

list_research_tasksA
Read-only

List the research tasks in Gramps Web's Tasks view: title, status, priority, tags, attributes and description.

Ordered as the view orders them: Open, In Progress, Blocked, Done. Not background jobs (list_jobs). A private task is a redacted stub.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOnly tasks also carrying this tag.
statusNoOnly these states, e.g. ['Open', 'In Progress'].
attributesNoOnly tasks with these attribute values, ignoring case; an empty value matches any value, e.g. {'Request-Custodian': ''}.
include_privateNoShow living people and private records in full. Only when the user asks for them; they are withheld by default.

TDQS

A4.2/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 a non-obvious behavioral detail the annotations cannot carry: 'A private task is a redacted stub,' which tells the agent results can be partially hidden, plus the view-ordering guarantee. It does not discuss result size or pagination.

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 filler. The scope/fields statement comes first, then ordering, then the sibling exclusion and privacy caveat – well front-loaded and every sentence 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?

With no output schema, the description compensates by naming the returned fields, and all four parameters are covered by the schema. The only gap is that nothing is said about result volume/pagination for a tool that lists a whole view, though the filtering params mitigate that.

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% – tag, status, attributes and include_private are each documented in the schema with examples and defaults. The description adds no filtering syntax or semantics of its own; the indirect link between 'private task is a redacted stub' and include_private is only implied. 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 ('List') and resource ('research tasks') and enumerates the fields returned ('title, status, priority, tags, attributes and description'), so an agent knows exactly what comes back. It also distinguishes itself from the similarly-named sibling: 'Not background jobs (list_jobs).'

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 rules out the most likely confusion point by naming list_jobs, and notes the ordering follows the Tasks view (Open, In Progress, Blocked, Done). It gives clear context but no positive 'use this when...' statement or guidance on combining the filters.

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 one useful behavioral fact (tag_object matches by exact name), but says nothing about scope limits, ordering, or volume of tags returned. Adequate but thin against an already-covered annotation set.

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 the tool does and followed by the routing hint. No filler, no restating of the tool name.

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?

There is no output schema, so the description usefully names the fields returned and ties the tool to the tagging workflow. For a no-parameter, read-only listing tool this is 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?

The tool takes zero parameters, so the baseline is 4. The description's enumeration of returned fields (handle, name, color) is return-value information rather than parameter guidance, but with no params to document there is no gap to fill.

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') plus exactly what is returned (handle, name, color). It also implicitly distinguishes itself from the write-side sibling tag_object, so an agent can select 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 Guidelines5/5

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

Explicitly gives the usage context ('Use to see what labels already exist before tagging') and names the dependent tool plus its matching rule (tag_object matches by exact name). This tells the agent both when to call this and why it matters for the next step.

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.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 real context beyond that: it describes the return content (what changed, when, by which user) and, critically, that each entry's transaction_id is the input that undo_transaction consumes, linking the read to the corrective action.

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 core purpose and followed by the practical hook. Every clause earns its place with no redundant restatement of the name or 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?

With no output schema, the description carries the burden of explaining what is returned, and it does ('what changed, when, by which user') plus the key transaction_id field. For a single-parameter read tool with annotations covering safety, nothing needed 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% for the single 'limit' parameter, so the schema already documents its meaning and bounds. The description adds no parameter-level detail (e.g. ordering or default), 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 ('Recent writes to the tree: what changed, when, by which user'), which is far more than a restatement of the name. It clearly conveys the listing of recent mutation history, though it does not explicitly contrast with the singular get_transaction or get_record_history siblings.

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 concrete scenarios for when to reach for it ('what did that bulk pass actually do?' and 'finding the transaction to reverse when it did the wrong thing'). It gives clear context but names no explicit exclusion or alternative list tool, leaving the reader to infer when a different sibling is preferable.

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.3/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), and the description goes beyond them by specifying the return shape: each offending event with its person, type, date, and the reason value ('no-citation' or 'tagged-unsourced'). It does not discuss pagination or volume 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?

Three short sentences, front-loaded with the identifying verb+resource, then when-to-use, then return contents. No sentence is redundant.

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 carries the burden of describing what comes back, and it does so concretely (person, type, date, reason). Combined with annotations and full schema coverage, an agent has everything needed to call it 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 both parameters (person, include_private) are already fully documented in the schema. The description adds nothing about parameter syntax, 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 ('list events that lack a citation or are tagged UNSOURCED') with the audit framing up front. An agent can distinguish it from adjacent read tools like get_facts or verify_tree 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 frames when to run it ('the core quality query for a fully-cited tree -- run it to find facts that still need a source'). It gives clear context but never names a contrasting sibling tool or states when not to use it.

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.
enclosuresNoPlaces only: the survivor otherwise gets both places' parents. 'auto' drops an undated parent that encloses another (a state beside its county) and refuses if two unrelated undated parents remain; or 'keep_keeper', 'keep_drop', 'keep_both'. Dated enclosures are always kept.auto
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 already carry the safety profile (destructive=true, readOnly=false, idempotent=false), and the description adds substantial context beyond it: dry-run is on by default, the whole merge is a single transaction so it is reversible via undo_transaction, and a botched manual merge can silently lose data held in the dropped object's subordinate lists. This is exactly the 'what gets destroyed and how to recover' context the 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.

Conciseness4/5

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

Purpose and the dry-run default are front-loaded, which is the right ordering for a destructive tool. The middle paragraph on citations is long and slightly editorial, but it is the paragraph that supplies the crucial when-not guidance, so only a little is 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 destructive merge with no output schema, the description covers what an agent needs: safety (dry-run default), reversibility (single transaction + undo), blast radius (all references repointed, lists unioned), and the decision criteria for whether a merge is appropriate at all. Remaining details (enclosures enum, accepted object_type strings) are fully documented in the schema.

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 3 is the baseline. The description still adds value by explaining the asymmetry of keep/drop in terms of effects ('every reference to `drop` is re-pointed at `keep`'), which sharpens the schema's terser 'SURVIVES'/'absorbed into it'. The enclosures parameter's auto/refusal behavior is left entirely to the schema, so it does not reach 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 that are the same thing') and immediately distinguishes itself from the sibling threats: find_duplicates only finds, delete_object removes, while this is a server-side merge. It also names the mechanism (references to `drop` re-pointed at `keep`, subordinate lists unioned in one transaction), so an agent knows exactly what the operation does.

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 explicit when-not guidance with a concrete domain example (an index entry and the register page it indexes are two documents and must stay separate) and the converse case (the same census page entered per household member IS one document). It also points to the recovery path (list_transactions + undo_transaction) and flags the dry-run default as the safe entry point.

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

move_childA
DestructiveIdempotent

Move a child to another family with the link's citations and notes, placed in birth order. Detaching and re-adding loses both. The new family is written first: a failure leaves the child in both, never in neither.

ParametersJSON Schema
NameRequiredDescriptionDefault
frelNoNew relationship to the father, e.g. 'Stepchild'. Omit to keep.
mrelNoNew relationship to the mother. Omit to keep.
childYesThe child's handle or gramps_id.
to_familyYesThe family to move them to.
from_familyYesThe family the child is in now.
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.

TDQS

A4.5/5.0
Behavior5/5

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

The annotations already mark this as destructive, non-read-only, and idempotent, but the description adds significant behavior beyond them: citations and notes are preserved, placement respects birth order, and the new family is written first so failure leaves the child in both families rather than neither. That is unusually rich transactional and failure-mode disclosure.

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 three tight sentences with no wasted words. The core action is front-loaded, and the remaining sentences give only the rationale and failure behavior needed to use the tool correctly.

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 move operation with no output schema, the description covers the essential behavioral concerns: preservation of citations/notes, birth-order placement, and atomicity/failure semantics. Combined with the annotations and fully described schema, an agent has enough information to invoke it 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 child, from_family, to_family, frel, mrel, and allow_new_type. The description adds no additional syntax, ordering, or field-level meaning 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: 'Move a child to another family'. It also distinguishes this operation from detaching and re-adding, which would lose citations and notes, so the agent can tell it apart from nearby tools like detach_object or add_child_to_family.

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 clear context for why this tool exists: it preserves citations and notes that a detach/re-add workflow would lose. However, it does not explicitly name alternative tools 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.

ocr_mediaA

Read a document image with the reader that suits it; doc_type and lang choose. print: text the media or its sources already carry, else Tesseract. hand: an English hand returns the image for you to transcribe as the result instructs; German goes to Transkribus only, never a vision read; Norwegian and others to Transkribus, with the image to check. table: FamilySearch's index (get_records_on_image). volume: full-text search first.

Transkribus costs credits: within the monthly budget, or with spend_credits. The transcript is never the evidence; the citation stays on the image.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoThe document's language, as a Tesseract code: 'eng', 'deu', 'nor', 'swe', 'dan', 'lat'; 'eng+deu' for several. Chooses the handwriting route and Tesseract's model.eng
pageNoPage of a PDF, from 1.
mediaYesMedia handle or gramps_id.
storeNoKeep a machine reading on the media object as a Transcript note headed with its engine, model and date, plus Transkribus' PAGE XML. A vision read is yours to store, with add_note.
engineNo'auto' routes by doc_type and lang. Or one reader: 'existing' (text the media or its sources already carry), 'tesseract', 'vision' (the image, for you to read; refused for German handwriting), 'transkribus'.auto
regionNoReturn only [x1, y1, x2, y2] of the page, in percent of width and height, at full detail: to read small or faint writing. [0, 50, 100, 100] is the bottom half.
doc_typeNoWhat the document is. 'print': typeset or typed. 'hand': one handwritten document -- will, deed, letter, register entry. 'table': a census page or other ruled form. 'volume': a page of a register or deed book you mean to search whole.print
spend_creditsNoConsent to Transkribus credits (about 0.5, EUR 0.12, a page) for this call, past the configured monthly page budget. Only when the user agreed.
second_witnessNoWith a vision read, also run Transkribus and compare -- for a document that will carry a proof argument. Costs credits.

TDQS

A4/5.0
Behavior4/5

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

Annotations mark this as non-read-only and non-destructive but say nothing about cost or consent; the description fills that gap by stating Transkribus consumes credits (~0.5, EUR 0.12 per page), is gated by a monthly budget, and requires spend_credits only with user agreement. It also flags a real side effect beyond annotations - a stored reading becomes a Transcript note - plus the provenance caveat that the transcript is never the evidence. No claim conflicts with readOnlyHint=false or destructiveHint=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?

Purpose comes first, followed by routing, cost, and provenance - a sensible front-loaded order with no filler sentences. The telegraphic fragment style ('print: text the media or its sources already carry, else Tesseract') is terse but occasionally requires re-reading, costing a little clarity without wasting 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?

For a nine-parameter tool with no output schema, the description covers the decision-relevant surface: routing rules, credit cost and consent, and what gets written when store is set. It stops short of describing failure behavior or output shape, and the English-handwriting path ('returns the image for you to transcribe as the result instructs') is only thinly explained.

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 parameter basics are already documented; the description's added value is the routing logic linking doc_type and lang to a concrete engine choice, which the schema enums do not spell out (e.g. German handwriting must never use vision). Details like region coordinates and store semantics are left to the schema, which handles them well.

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 clause states a specific verb and resource ('Read a document image') and immediately frames the selection problem ('with the reader that suits it; doc_type and lang choose'). This clearly separates it from the media-management siblings (get_media, attach_media, update_media), though it never names those alternatives directly.

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 routing table: print routes to carried text or Tesseract, hand routes by language (English returns the image, German goes to Transkribus and never vision, Norwegian/others to Transkribus), table points to FamilySearch's index via get_records_on_image, and volume starts with full-text search. Alternatives are named for two of four doc types, so this is strong but not a fully enumerated when/when-not rule set.

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 only declare readOnlyHint and openWorldHint, so the description carries the real behavioral burden and delivers: it discloses the return shape ('each segment plus the total and largest-segment centiMorgans') and, critically, the failure contract ('parsed is false and the reason is given'). It also explains the semantic trap the server's silent zero-segment/success response would otherwise create, which is exactly the kind of insight annotations cannot convey.

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, front-loaded with the action, then the result, then the failure semantics. Every sentence adds distinct value and none is redundant padding.

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 conveys what is returned (segments, total cM, largest segment) and how failures are signaled (parsed=false plus reason). Combined with a fully documented input schema and read-only annotations, an agent has everything needed to call and interpret this 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 coverage is 100% and the schema description already spells out the row format (chromosome, start, stop, centiMorgans, SNPs, comma/tab separation, M/P/U side, tolerated header). The prose adds no format detail beyond that, so the baseline of 3 for a fully documented single parameter 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 pasted shared-segment data into structured segments and totals') and clarifies the intent of checking a match file's contents. It is clearly distinguishable from the neighboring DNA tools like add_dna_match and get_dna_matches, which respectively write and retrieve matches rather than parse raw pasted text.

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 to use it 'to check what a match file actually contains before recording it,' which names both the context and the downstream action (recording via add_dna_match). It stops short of naming the alternative tool or stating when not to use this, but the situational guidance is clear.

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 = ""

  • a URL anywhere: urls.any.path ~ "blm.gov"; a list is searched through its items, never with ~ on the list itself

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"'. A LIST is searched through its items with '.any.' (or '.all.'), and a handle followed with 'get_<type>': 'urls.any.path ~ "blm.gov"', 'attribute_list.any.value ~ "x"', 'note_list.any.get_note.text.string ~ "x"'. '~' on the list itself asks whether the value IS an item, so it is refused. 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'. A query reads the whole collection, so each OR'd condition adds time.
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.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint; the description goes well beyond them, disclosing that filter cost scales with OR'd conditions, that missing fields silently match nothing (with 'event type' as a named trap), boolean 0/1 comparison rules, and that private records/living people return as redacted stubs. This is substantive behavioral context, not restatement.

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

Conciseness4/5

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

Front-loaded with purpose and the key when-to-use sentence, then organized into scannable bullets and a caveat paragraph. It is long and the gql examples partially duplicate the schema, but nearly every line is actionable.

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 nine-parameter query tool with no output schema, the description covers usage routing, redaction behavior, performance characteristics, and query pitfalls, while pagination/limit semantics live in the schema. Nothing essential to 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%, so the schema already documents all nine parameters, including the GrampsQL syntax, '.any.' list semantics, TRAPS, and the include_private caution. The description's gql section largely repeats that material, 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 ('Query any collection with a server-side filter') plus its role ('the workhorse for audits'). It distinguishes itself from siblings by naming get_backlinks for the reverse question and query_records for event 'type', so an agent can route 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 Guidelines5/5

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

Explicitly says when to use it ('Use this instead of fetching a collection and filtering it yourself') and why (whole-collection pulls are slow, the filter runs in the database). It names alternatives (get_backlinks, query_records) and gives concrete audit questions the tool answers, leaving little to inference.

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. A list value is for 'in' only; 'contains' finds one value in a list field. A date's year is dateval[2], 0 when unknown.
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.9/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, it discloses return shape (rows plus total count and a next_after cursor) and, critically, a privacy behavior: private records, living people, and families with a living parent come back as redacted stubs. That 'what gets withheld' detail is the sort of context annotations cannot carry and materially changes how results are interpreted.

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 sibling comparison, then the event-type caveat, then return/redaction behavior — a logical descending-priority order. Bold emphasis marks the two decision-critical facts, and no sentence is padding.

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 9 parameters, no output schema, and a read-only profile, the description covers everything an agent needs: capability scope, the filtering caveat, paging via next_after, default redaction, and the include_private override. Nothing required to call it correctly 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 coverage is 100%, so the baseline is 3; the description still adds value by explaining why event_type exists (event type is otherwise unfilterable) and framing what where/select can reach (arbitrary paths, relationship traversal such as family->father/mother). It stops short of adding format detail beyond the schema for the remaining 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?

States a specific verb and resource ('Query any collection server-side, with columns, filters and sorting') and immediately distinguishes itself from the sibling query_objects by declaring itself more capable. An agent can tell it apart from query_objects and get_object 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?

Explicit when-to-use: 'the tool to reach for on an audit,' with the concrete alternative named (query_objects) and a hard routing rule for event filtering ('It is the only way to filter events by type'). It even explains why the alternative fails (GrampsQL shadows 'type'), which is exactly the kind of exclusion guidance that prevents wrong-tool selection.

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

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

A4.4/5.0
Behavior4/5

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

Annotations declare readOnly=false, idempotent=true, destructive=false, and the description adds real context beyond them: asynchronous/background execution and the fact that its default privacy filtering diverges from Gramps' own default. It does not say where the output file lands, but the async and default-behavior 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?

Three tight sentences, front-loaded with purpose, then the important default-behavior caveat, then the async execution note. Every sentence earns its place 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?

With no output schema, the description carries the burden of explaining return values and does so by describing both the file output and the task_id polling path. The 'usually' hedge leaves mild ambiguity about which outcome to expect, but an agent has enough to act correctly.

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 schema already documents all four params (baseline 3). The description adds meaning by tying options/living_people/incl_private to the tool's exclusion default and explicitly contrasting it with Gramps' default, which clarifies the semantics of those flags beyond 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+resource ('Generate a report and return the file it produced') and names what it returns, which lets an agent distinguish it from list_reports/get_report_options (which enumerate rather than generate). The action 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 Guidelines4/5

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

Gives clear operational context: it usually runs in the background and the task_id should be polled with get_job, and it documents the default privacy filtering. It lacks an explicit 'call list_reports first' instruction and any when-not-to-use statement, so it stops short of full guidance.

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.7/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 output behavior — probably-living and private records come back as redacted id-only stubs unless include_private is set. That is exactly the kind of consequence an agent cannot infer from annotations or 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?

Two tight sentences: purpose and filter scope first, then the bulk-output caveat, then the routing hint. Every sentence carries load and the most important constraint (redaction) is front and center after the purpose.

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 steps in to describe the return shape (redacted stubs vs full records) and the routing alternative. Nothing essential for calling this tool correctly 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 coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema by explaining what include_private actually unlocks (full records vs redacted stubs) and framing name/birth-year as the search axes. It clarifies consequence, not just type.

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 (search) plus resource (people) and the two filter axes: name substring and optional birth-year range. It also contrasts itself with get_person, 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?

Explicitly routes the agent: use get_person when a specific person's detail is needed, implying this tool is for bulk/name-driven lookup. That is a clear selection rule, though it addresses only the nearest sibling and gives no explicit exclusion for the other query tools.

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

set_family_parentA
DestructiveIdempotent

Set, replace or remove the father or mother of an existing family -- the wife a record names -- keeping both sides of every link, children and all.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleYesWhich parent to set.
familyYesFamily handle or gramps_id (e.g. 'F0001').
personNoThe parent's handle or gramps_id. Omit to remove the parent.
replaceNoReplace a different parent the role already has; refused otherwise.

TDQS

A3.6/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, so safety is covered. The description adds genuine behavioral context beyond the annotations by stating it keeps 'both sides of every link, children and all' – disclosing that referential integrity is maintained and children are preserved during the parent edit.

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?

It is a single front-loaded sentence, which is appropriately sized. However, the embedded '-- the wife a record names' clause is opaque and does not clearly earn its place, adding confusion rather than 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?

There is no output schema, and the mutation's safety profile is fully carried by annotations, so the description's burden is modest. It covers the operation modes and the link-integrity behavior; what remains missing (e.g., existence requirements for the family) 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%, so all four parameters (role, family, person, replace) are already documented in the schema. The description adds no syntax, format, or constraint 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?

The description names a specific verb set (set/replace/remove) and a precise resource (the father or mother of an existing family), which cleanly distinguishes it from child-oriented siblings like add_child_to_family, update_child_ref, and move_child. The trailing clause '-- the wife a record names' is confusing and slightly muddies an otherwise crisp statement.

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 three operation modes (set, replace, remove) are implied by the description, but there is no explicit guidance on when to choose this tool over siblings such as add_family or check_family_links, nor any stated prerequisites or exclusions. Usage is inferable but not spelled out.

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

A4/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, so the safety profile is covered. The description adds genuinely new context: the flag suppresses the record from queries, searches, tree walks, timelines, and reports unless include_private is passed. It does not mention reversibility, which undo_transaction sibling implies is relevant.

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 followed by the single most important behavioral fact. No filler and nothing requires rereading.

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, and the description covers the operation, its dual set/clear nature, and the downstream effect of the flag, which is what an agent needs to call it correctly. Minor omissions remain: supported object types are only exemplified, and the description doesn't say whether the change is reversible or logged as a transaction.

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 every parameter (target, private, object_type) is documented in the schema, including the default of private=true. The description's mention of 'set (or clear)' adds only marginal framing beyond the schema's 'True to mark private (default), False to un-mark', 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 ('Set (or clear) the Gramps private flag on an object') and immediately explains the observable consequence of the flag, so an agent can distinguish it from siblings like tag_object or delete_object. The parenthetical '(or clear)' also captures the two-way nature of the operation.

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 what the flag does ('withheld from bulk output... unless a call passes include_private'), which implies when you'd want it, but it never states when to choose this tool over alternatives such as tag_object, update_object_fields, or delete_object, nor any prerequisites.

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'. To REMOVE a tag: detach_object(child_kind='tag', child=<tag name>).
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

A3.7/5.0
Behavior4/5

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

With annotations supplied, the description usefully adds behavior beyond them: the tag entity is auto-created if absent, matching is by exact name, and an existing tag is reused rather than duplicated. It does not state permission requirements or confirm what happens when the same tag is attached twice, which is the one gap; note the mild tension between 'existing tag is reused' and idempotentHint=false, though this concerns tag creation rather than the association itself.

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 its key side effect, followed by brief clarifying context. The example tag names are mildly decorative but cheap; nothing is wasted or buried.

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 additive mutation with full schema coverage and declared annotations, the description covers the core action, its side effect, and match semantics. Missing only edge-case behavior (duplicate attachment, permissions) to be fully self-sufficient.

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 baseline is 3. The description reinforces the find-or-create semantics of `tag` and the labeling concept, but adds nothing about `target`, `object_type`, or the ignored-when-existing behavior of `color` beyond what the schema already says.

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 ('Attach a named Tag to an object') and adds the important find-or-create nuance plus exact-name matching. It doesn't name or distinguish itself from the relevant siblings (detach_object, list_tags), so it lands at clear-but-undifferentiated rather than fully distinguishing.

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 parenthetical description of tags as 'lightweight cross-cutting labels' implies when tagging is appropriate, but there is no explicit when-to-use, when-not, or pointer to alternatives. The removal path (detach_object) appears only in the schema's `tag` description, not in the tool description itself.

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.
nameNoWith object_type='name' (ref is the person): which of the person's names to detach the citation from.
carry_toNoCitation (handle or gramps_id) to receive the notes and images only this citation holds, so it can be deleted without losing them.
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. A citation that holds the only link to a note or image is kept unless carry_to is given.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and readOnlyHint=false, but the description goes further and explains exactly what gets destroyed (the orphaned citation), why that matters (orphan citations accumulate and masquerade as evidence), and the preservation rule that a citation holding the only link to a note or image is kept unless carry_to is given. That is meaningful behavioral context beyond the annotation flags.

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 one-line summary is front-loaded and captures the core operation before the rationale paragraph. The second paragraph is somewhat discursive in explaining orphan accumulation, but it earns its space by motivating the delete_if_orphan default.

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?

Six parameters with full schema coverage and a destructive annotation mean the definition is nearly complete for an agent to call it correctly. It does not state required permissions or the shape of any return, but with no output schema and rich parameter docs 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 every parameter including carry_to, delete_if_orphan, and name is already fully documented in the schema. The description alludes to the orphan-deletion behavior but never names or elaborates on carry_to or name, so it adds no meaning beyond the structured fields. 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 ('Detach a citation from an object') plus the conditional side effect ('deleting it if it is left orphaned'). An agent can distinguish this from delete_object, detach_object, and cite_object purely from the first sentence, 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 explicit when-to-use conditions: 'when a citation was attached to the wrong fact, or when a superseded bucket citation is replaced by the real record.' It does not name the alternative tools (cite_object, detach_object, delete_object) so the routing to a sibling is left to inference, but the situational guidance is clear.

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?

Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds genuinely new behavioral facts: a conflict check runs first, it is free, and it precedes any mutation, while forcing past a conflict destroys later edits. That is exactly the causal detail an agent needs before invoking a destructive 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 short sentences, front-loaded with the action and the precondition, with no filler. The line breaks are slightly awkward but nothing is wasted or repeated.

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 carry the return semantics; it only gestures at them ('tells you what you are dealing with') rather than describing the conflict-check result. Everything else needed to call this destructive three-parameter tool safely is present.

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 force, dry_run, and transaction_id are all documented in the schema itself, including the DISCARDS warning. The description reinforces the conflict model behind force but never names a parameter or adds syntax 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 and resource ('Undo a past transaction') plus the exact precondition it evaluates ('after checking whether it can be undone cleanly'). No sibling in the list performs an undo, so an agent can identify this operation without ambiguity.

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?

Explains the decision context well: conflicts mean later edits exist, undoing anyway discards them, and the free conflict check runs before anything changes so the default is informative. It stops short of naming a sibling to inspect first (e.g. get_transaction/list_transactions) or explicitly saying when not to undo.

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

update_alternate_nameA
DestructiveIdempotent

Correct, retype or remove one alternate name, in place.

Edited in place, the name keeps its citations. The primary name is update_person(name=...); a new name is add_alternate_name.

ParametersJSON Schema
NameRequiredDescriptionDefault
givenNoNew given name(s). Omit to keep.
matchYesWhich alternate name, e.g. {'surname': 'Calloway', 'type': 'Also Known As'}. get_person lists them with their index.
personYesPerson handle or gramps_id.
removeNoRemove the name. Refused while it carries citations or notes; of identical duplicates, one is removed.
surnameNoNew surname. Omit to keep.
nicknameNoNew nickname.
name_typeNoNew type, e.g. 'Married Name' for a name filed as 'Also Known As'.
name_prefixNoNew surname prefix.
name_suffixNoNew suffix.
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.

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 readOnlyHint=false, so the mutation/safety profile is covered. The description adds genuinely new behavior: the edit is in place and the name keeps its citations. It does not restate the removal-refusal rule (that lives in the schema), 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.

Conciseness5/5

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

Three short sentences, zero waste, front-loaded with the action and immediately followed by the alternative routing. Nothing extraneous.

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 fully documented 10-parameter schema, no output schema, and rich annotations, the description supplies the missing pieces: in-place editing semantics, citation preservation, and sibling routing. The removal-refusal prerequisite is only in the schema, 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 schema documents every field, including the NameMatch selector, removal refusal, and allow_new_type behavior. The description adds no parameter-level detail beyond the update_person(name=...) illustration, 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 set (correct/retype/remove) plus the exact resource (one alternate name), and it names the boundary siblings: 'The primary name is update_person(name=...); a new name is add_alternate_name.' An agent can route correctly 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 vs alternatives: this tool for editing/removing an existing alternate name, update_person for the primary name, add_alternate_name for creating one. The selection condition is stated outright, not implied.

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

update_attributeA
DestructiveIdempotent

Set or remove ONE attribute on an object in place, keeping its citations, notes and privacy.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName (type) of the attribute to change, e.g. 'Occupation'.
matchNoCase-insensitive part of the current value, to pick one of several attributes of this name. Matching none, or several that differ, changes nothing and lists them.
valueNoIts new value. Omit when removing it.
removeNoRemove the attribute. Its citations stay in the tree and are named.
targetYesHandle or gramps_id of the object.
object_typeYesType of the object: 'person', 'event', 'family', 'media', 'source', 'citation'.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already flag this as destructive and idempotent, so the safety profile is partly covered. The description adds genuinely new behavioral context: the operation is in-place and preserves citations, notes and privacy, which tells the agent that removal is non-cascading. It does not, however, warn about what the destructiveHint actually destroys.

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 no filler; the cardinality constraint ('ONE') and the preservation guarantee are both packed into the opening clause.

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 no output schema, the description plus a fully documented schema covers the essentials: target selection, matching ambiguity, and non-cascading removal. The only gap is that return/failure behavior (e.g. the 'changes nothing and lists them' outcome on ambiguous match) lives only in the 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%, so all six parameters including the tricky 'match' disambiguation rule are already documented in the schema. The description only reinforces the 'ONE attribute' scoping, which is the correct baseline-3 outcome 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 pair (set/remove) on a specific resource (one attribute) with an explicit in-place constraint, which distinguishes it from add_attribute and the bulk update_* siblings. It stops short of naming those siblings directly, 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 Guidelines3/5

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

Usage is implied rather than stated: 'in place, keeping its citations, notes and privacy' hints this is the edit-existing path rather than delete-and-re-add, but there is no explicit when-to-use or when-not-to-use guidance versus add_attribute or update_object_fields.

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

update_child_refA
DestructiveIdempotent

Change a child's relationship to the father or mother -- a stepson held as a birth child -- in place.

The child keeps the link's citations, notes and its place in the birth order, which detaching and re-adding the child loses.

ParametersJSON Schema
NameRequiredDescriptionDefault
frelNoRelationship to the father: 'Birth', 'Adopted', 'Stepchild', 'Foster', 'Sponsored', 'Unknown', 'None'. Omit to keep.
mrelNoRelationship to the mother, the same values. Omit to keep.
childYesThe child's person handle or gramps_id.
familyYesFamily handle or gramps_id (e.g. 'F0001').
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, so the safety profile is covered. The description adds real behavioral value beyond that: it discloses exactly what is preserved (citations, notes, birth order) and contrasts the outcome with detach-and-re-add, which reframes an apparently destructive operation as a safer in-place edit.

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 with zero filler. The mutation and its in-place nature are front-loaded, and the second sentence justifies why this tool exists rather than merely restating the first.

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 5-parameter mutation tool with no output schema, the description supplies the key behavioral nuance an agent needs (in-place edit preserves metadata). The remaining gaps — return shape and the allow_new_type escape hatch — are adequately handled by the schema, so nothing critical 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 per-parameter descriptions (frel/mrel allowed values, omit-to-keep semantics, handle vs gramps_id, allow_new_type behavior) are thorough on their own. The description only alludes to the father/mother relationship conceptually and adds no syntax, defaults, or format detail beyond the schema, so 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 ('Change') and resource ('a child's relationship to the father or mother') and pins the mode of operation with 'in place'. The stepson-as-birth-child example makes the exact scenario concrete, and it implicitly separates this tool from detach/re-add approaches used by siblings like detach_object or add_child_to_family.

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 states the condition under which you'd use it (you want to change the parent-child relationship without losing link metadata), and it hints at the alternative path ('detaching and re-adding') by naming its cost. It never explicitly says when not to use it or names the sibling tools to prefer instead, 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.

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.8/5.0
Behavior4/5

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

Annotations already declare readOnly=false, destructiveHint=true, idempotentHint=true, so the safety profile is covered and the description is consistent with it. Beyond that, the description discloses a real blast-radius trait: whatever confidence you set applies to EVERY fact attached to the citation, and it explains the per-claim model. It doesn't mention reversibility (undo_transaction exists) or partial-update behavior, so not a full 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?

The primary verb and affected fields are front-loaded, and the IMPORTANT block is the highest-value content. The middle sentence about page-less citations is somewhat abstract and cryptic, costing a little density, but nothing is truly wasteful.

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 annotation coverage and no output schema, the description supplies the domain-specific warning an agent needs (one confidence per citation, shared across attached facts) and the partial-update hint ('omit to leave unchanged'). Missing only peripheral details like error/permission behavior, which sibling tools arguably cover.

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 still adds interpretive meaning beyond the schema by framing 'page' as the locator (a page-less citation is not a locator), clarifying that confidence is a per-instance judgement rather than a source-class property, and explaining when to use 'source' (re-pointing a mis-cited or split container). This is genuine semantic value on top of 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 and resource ('Edit a citation') and enumerates the editable facets (locator, confidence, date, source), so the agent knows exactly what this tool mutates. It does not differentiate itself from the sibling update_citations (batch plural), which is the most obvious confusion risk.

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 strong edge-case rule -- when the same page supports a second distinct claim, create a SECOND citation rather than re-grading this one -- which is actionable guidance. However it never routes the agent between this and the plural update_citations, add_citation, or get_citation siblings, so alternative selection 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.

update_citationsA
DestructiveIdempotent

Re-write many citations' pages or confidences in one call -- a sweep.

Each row is update_citation: its own write and transaction. A row whose live page no longer starts with expect_page_prefix is reported as drifted, not overwritten. Rows report applied, unchanged, drifted, missing or error.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesRows of {citation, page?, confidence?, expect_page_prefix?}.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare destructive/idempotent, but the description adds behavior the annotations cannot convey: per-row independent writes and transactions (no cross-row atomicity), optimistic concurrency via expect_page_prefix, and the full outcome vocabulary (applied, unchanged, drifted, missing, error). This is consistent with destructiveHint=true and idempotentHint=true.

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, zero padding, with the core purpose front-loaded before the transactional and drift details. Every sentence carries distinct information.

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?

There is no output schema, and the description compensates by enumerating the per-row result statuses, which is exactly what an agent needs to interpret a sweep response. Combined with the drift rule and per-row transaction semantics, nothing material is missing for this mutation 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% and the nested CitationEdit definitions already explain page, confidence and expect_page_prefix in detail. The description's mention of 'pages or confidences' and the drift contract largely restates 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 (re-write), resource (citations' pages/confidences) and scope (many, in one call -- a sweep). It also explicitly distinguishes itself from the sibling update_citation by defining each row as that operation, so an agent can pick batch vs single 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 batch framing plus 'Each row is update_citation' clearly signals when this tool is appropriate versus the single-record sibling. It stops short of an explicit when-not/exclusion statement (e.g., prefer update_citation for a single edit), so it is not a full 5.

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 in place: its type, date, place or description.

Only what you pass changes. The event keeps its id, citations, notes, media and every person sharing it, so correct a wrong type or an unsupported place here rather than replacing the event. Citations: cite_event.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoNew date, Gramps style: '1899', '12 JAN 1899', 'ABT 1900', 'BEF 1950'; 'BET 1898 AND 1901' happened once within the range; 'FROM 4 MAY 1864 TO 16 SEP 1864' lasted the whole span; 'FROM 1880' or 'TO 1890' is open at one end. 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.
clear_dateNoRemove the event's date.
event_typeNoNew event type, e.g. 'Census', 'Visit'. Must already be a standard or custom type in the tree (list_object_types) unless allow_new_type is set. Omit to leave unchanged.
clear_placeNoRemove the event's place, e.g. one no source states. An empty place string is refused rather than read as this.
descriptionNoNew free-text description. Omit to leave unchanged.
allow_new_typeNoAccept an event_type the tree does not have yet, creating it as a custom type. Only for a deliberate new type, never a typo.

TDQS

A4/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, so the safety profile is covered. The description adds meaningful behavioral context beyond that: partial-update semantics ('Only what you pass changes') and what is preserved (id, citations, notes, media, sharing persons), which is exactly what an agent needs to avoid a harmful rewrite.

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 tightly written sentences with the core action front-loaded and no filler. The only sentence doing less work is the trailing 'Citations: cite_event' pointer, which is brief and still useful for routing.

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 supplies what an agent needs: the mutation is partial, the resource identity and related data survive, and related citation work is delegated. Combined with the rich 100%-coverage schema and the destructive/idempotent annotations, nothing essential 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 the schema fully documents all eight parameters including the clear_* flags and allow_new_type. The description only names the four editable fields at a high level and adds no syntax 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.

Purpose4/5

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

The description names a specific verb (edit/update) and resource (event) and enumerates the mutable fields (type, date, place, description). It distinguishes the tool from replacement-style siblings by stating it edits in place rather than replacing the event, though it does not name those siblings explicitly.

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 concrete when-to-use trigger: 'correct a wrong type or an unsupported place here rather than replacing the event,' and routes citation work to cite_event. It stops short of explicit when-not-to-use or naming a competing tool, but the guidance is clear.

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

update_event_refB
DestructiveIdempotent

Change a person's reference to a shared event in place: its role, or attributes such as 'As enumerated' or 'Age'.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNoNew role, e.g. 'Witness'. Omit to keep.
eventYesHandle or gramps_id of the event they reference.
personYesHandle or gramps_id of the person.
attributesNoAttribute name to new value; null removes it. The first of a name is set in place, keeping its citations; a name the reference lacks is added.
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare the safety profile (readOnly=false, destructive=true, idempotent=true), so the bar is lower. The description usefully clarifies the operation is scoped to the person's reference rather than the shared event itself ('a person's reference to a shared event'), implying other sharers are unaffected, but it omits error/refusal behavior and the effect of the allow_new_type custom-type creation.

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?

A single compact sentence with the verb and scope front-loaded and no filler. It is well-sized, though the two facets are tucked behind a colon rather than fully exploiting the space available for such a mutation tool.

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 5-parameter mutation tool the description is thin: it relies entirely on a 100%-covered schema and annotations for parameters and safety. There is no output schema and none is referenced, and no mention of return values or failure modes, leaving the agent to infer the result of the operation.

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 role, attributes, allow_new_type and their null semantics in detail. The description only restates role and attributes at a high level, adding no syntax, format, or edge-case meaning 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.

Purpose4/5

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

States a specific verb and resource: changing a person's reference to a shared event, including the two facets it touches (role and attributes). The phrase 'in place' hints at in-place modification rather than creating a new reference, which subtly contrasts with add_event_ref, but the description never names that sibling or otherwise differentiates itself 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 rather than stated: an agent can infer this is the tool to reach for when an event reference already exists and needs modification, versus add_event_ref or cite_event. There is no explicit when-to-use/when-not guidance, no prerequisites, and no named alternatives.

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.
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.

TDQS

A4.2/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 genuine behavioral context beyond that: structural lists are refused on purpose because wholesale replacement silently drops references, and near-miss types are refused with the closest names. It does not address permissions or failure/return behavior.

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 constraint, then the rationale, then the alternatives. Every sentence 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?

For a mutation tool with annotations covering safety and a full-coverage schema, the description supplies the critical missing risk context (list refusal and silent reference loss) and routes list edits to siblings. No output schema exists, but the description doesn't need to explain returns; minor gaps around the generic-vs-specific update tool boundary remain.

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 itself gives the format example for 'fields' and the near-miss behavior for allow_new_type. The description reinforces the scalar-only constraint but adds no parameter-level detail beyond the schema, so 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+resource: 'Set scalar fields on any object', then scopes it as the generic escape hatch for places, notes, repositories and the rest. It explicitly names what it does not handle (structural lists) and which siblings do, so an agent can tell it apart from cite_object, detach_object, tag_object and attach_media.

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 context: it is the generic fallback for scalar edits, and structural list operations must go to their dedicated tools (cite_object, detach_object, tag_object, attach_media). It does not, however, direct the agent toward or away from the specific update_person/update_place/update_event siblings present in the toolset.

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, unless keep_old_as_alternate is False.
genderNofemale, male, or unknown.
personYesPerson handle or gramps_id (e.g. 'I0001').
reasonNoWhy the old form is not kept. Required with keep_old_as_alternate=False.
privateNoGramps private flag.
keep_old_as_alternateNoFalse only to fix a data-entry error -- a name split wrongly between given and surname, a typo no record contains -- where keeping the old form would invent a variant. The name is then corrected in place, keeping its citations, and reason is recorded in a note on the person.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag this as destructive, non-idempotent-disabled (idempotentHint=true), and a write, but the description adds substantial behavior beyond them: replacing a name preserves the old one as an 'Also Known As' because dropping it severs the link to the source record, and the keep_old_as_alternate=False path corrects in place, retains citations, and records a reason in a note. This is exactly the kind of consequence disclosure a mutation tool needs.

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 scope front-loaded, followed by the preservation rationale and then the sibling routing. Every sentence carries information the agent needs; nothing is padding.

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 6-parameter mutation tool with full schema coverage and no output schema, the description supplies what the schema cannot: destructive consequences of name replacement, the rationale, and when to prefer a sibling. Nothing essential for a correct call appears to be 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, and the description adds real meaning on top: the name parameter's preservation semantics and the keep_old_as_alternate flag's intent and side effects (citations kept, reason noted). It does not re-document fields like gender or private, which the schema already covers adequately.

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) applied to a specific resource (a person), and names exactly which attributes are editable: gender, primary name, privacy flag. It also distinguishes itself from the sibling add_alternate_name, so an agent can route correctly without inspecting 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?

Gives a clear routing rule for the main ambiguous case: 'To add a name without replacing the primary one, use add_alternate_name.' It also explains the narrow condition under which keep_old_as_alternate=False is legitimate. It lacks a broader when-to-use/when-not framing for non-name edits, but the critical alternative is explicit.

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', 'Parish', 'Farm', 'Building', etc., or a custom type the tree already has. Omit to leave unchanged.
remove_parentNoClear the enclosure instead of setting one.
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare destructive/idempotent/non-read-only, and the description adds substantive rules on top: the parent must pre-exist, cycles are prevented, multi-dated-enclosure places are refused rather than flattened, and allow_new_type rejects near-misses with closest-name suggestions. This is genuine behavioral disclosure beyond the structured hints.

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+resource in the first sentence, then a dense but purposeful paragraph of guard rails. No filler, though the second sentence is heavy enough to require careful reading.

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 10-parameter mutation tool with no output schema, the description covers the risky structural edits and failure modes an agent needs. It does not describe the success/failure response shape, but annotations carry the safety profile, so the gap 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 adds meaning the schema does not: parent semantics (replaces the current single enclosure, refused if dated enclosures exist) and the allow_new_type refusal behavior. The remaining params are left to the schema, which fully documents them.

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?

Opens with a specific verb+resource ('Edit a place') and enumerates the exact editable facets (type, parent enclosure, name, title, coordinates). It explicitly distinguishes itself from sibling update_object_fields, so an agent can route 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?

Positions itself against update_object_fields ('the tool update_object_fields deliberately refuses to be') and gives a modeling directive ('every place typed, every non-country place parented, street addresses on events'). It stops short of a crisp when-not-to-use rule, but the routing context is clear.

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

update_research_taskA
DestructiveIdempotent

Change a research task's status, priority, privacy or attributes, or add to its description.

Each attribute is replaced, never added beside the old one, so Gramps Web shows the value set. add_attribute would append a second Status that Gramps Web ignores. A private task's description note is private too; making the task public leaves a private note private unless private_note=false. Refuses a source that is not a task.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskYesThe task's handle or gramps_id, e.g. 'S1501'.
statusNoNew status.
privateNoTrue makes the task and its description note private. False makes the task public; a private note stays private unless private_note is false.
priorityNoNew priority.
attributesNoMore source attributes, name to value, e.g. {'Bears-On': 'I0035'}. Status and Priority have parameters of their own. A null value removes the attribute.
note_appendNoA paragraph to add to the task's description note, e.g. '2026-10-05: letter sent'.
private_noteNoSet the description note's private flag yourself. Omitted, the note follows a private task and is never made public.
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only give the generic mutation profile (readOnly=false, destructive=true, idempotent=true). The description goes well beyond that: replacement-not-append semantics for attributes, the interaction between task privacy and note privacy, the private_note=false override, and the refusal of non-task sources. This is exactly the kind of behavior an agent can't infer 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.

Conciseness4/5

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

Front-loaded first sentence names the operation and its fields, with supporting constraints following. Each later sentence carries a distinct rule (replacement, privacy coupling, source refusal), though the privacy-note sentence is wordy and overlaps the schema's private/private_note descriptions.

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 an 8-parameter destructive mutation with no output schema, the description covers the highest-risk ambiguity (replacement vs append, privacy propagation, guarded inputs). It omits return-value or partial-update confirmation details, but the safety-relevant behavior is adequately disclosed.

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 adds real semantic value on top: that attributes replace rather than accumulate and that add_attribute behaves differently, plus the task/note privacy coupling. It largely mirrors rather than expands the individual parameter docs, so it falls short of 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 (update/change) with the exact resource and the fields it touches: status, priority, privacy, attributes, description note. It also distinguishes itself from the sibling 'add_attribute' by explaining that this tool replaces while add_attribute appends, so an agent can route correctly 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?

Explicitly warns against using add_attribute for Status/Priority because 'Gramps Web ignores' the duplicate, which tells the agent when this tool is the right one. It also states the guard condition ('Refuses a source that is not a task'). It does not compare against broader siblings like update_object_fields, but the critical alternative is named.

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

update_sourceA
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

A3.5/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. The description adds the partial-update guarantee, which is real value, but it is largely a restatement of the per-field "Omit to leave unchanged" notes already in the schema, and it never explains the destructiveHint flag or what an invalid handle does.

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 with the action front-loaded and no filler. The second sentence is somewhat redundant with the schema's per-field notes, 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 five-parameter mutation tool with no output schema, the description covers the mutation semantics and the editable surface adequately, and the annotations carry the safety profile. It stops short of describing failure modes or what the caller gets back, but nothing critical 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 every field already carries its own 'New X. Omit to leave unchanged.' note, so the schema does the heavy lifting. The description names four of the editable fields but omits the required `source` handle, adding no meaning 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 (Edit) and resource (an existing source) and enumerates the mutable fields, so an agent can distinguish it from add_source or get_source at a glance. It does not, however, distinguish itself from the generic sibling update_object_fields, which could plausibly edit the same fields.

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 patch semantics ("Only the fields you provide are changed") tell the agent how to invoke the tool, which is useful implied guidance. There is no explicit statement of when to prefer this over alternatives such as update_object_fields, and no preconditions (e.g. the source must already exist) are given.

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. 'Web Home', 'Web Search', or a custom type the tree already has. Omit to keep.
descriptionNoNew link description. Omit to keep.
object_typeYesType of the object: 'person', 'place', or 'repository' only.
allow_new_typeNoAccept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.

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 (destructiveHint=true, idempotentHint=true, readOnlyHint=false). The description adds genuinely new context beyond them: only one entry is touched and 'the other fields on the object are untouched,' clarifying the partial-update semantics of a mutation. It stops short of describing removal consequences or return behavior, but with annotations carrying safety that gap 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.

Conciseness5/5

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

Three short sentences, front-loaded with the core action, then sibling routing, then a scope note. Every sentence earns its place; nothing 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?

For an eight-parameter mutation tool with full schema coverage, no output schema, and annotations covering the safety profile, the description supplies everything an agent needs: what it does, when to choose it over add_url, and that untouched fields are preserved. Parameter-level detail is correctly delegated to the 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%, so the schema already documents all eight parameters including the match, allow_new_type, and omit-to-keep semantics. The description adds no syntax or format detail beyond what the schema provides; its only contribution is the illustrative miscategorized-link case. Baseline 3 is correct 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 (edit/remove), a specific resource (ONE existing URL entry), and the exact scope (on a person, place, or repository). It also explicitly distinguishes itself from the sibling tool add_url, so an agent can tell them apart 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 Guidelines5/5

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

Names the alternative (add_url) and the condition that selects between them: add_url only appends, so this tool is for correcting an entry already present. The 'Find a Grave link filed under the wrong type' example makes the intended use case concrete rather than inferred.

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

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.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 safety is covered. The description adds genuinely new behavioral context: it may run in the background and return a task_id that must be polled with `get_job`. It does not mention result sizes or runtime expectations, keeping it just below 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?

Well front-loaded: purpose, differentiation, usage guidance, and async behavior in order. The illustrative examples earn their place, but the prose is slightly longer than strictly necessary for a read-only audit tool.

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 17-parameter, zero-required read-only tool with full schema coverage and no output schema, the description covers purpose, sibling routing, threshold strategy, and the async return contract. An agent has everything needed to invoke and poll it correctly.

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 17 threshold parameters and their defaults are already fully documented, giving a baseline of 3. The description adds conceptual guidance beyond the schema — that defaults are conventional and bounds should only be tightened for targeted error classes — which meaningfully shapes how the agent sets them.

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 Gramps' plausibility checks over the whole tree) and immediately differentiates from the citation audit by naming `list_unsourced_facts` and contrasting evidence vs possibility. The examples (mother at nine, 120-year marriage, unparseable date) make the scope unmistakable.

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 says when to use this vs the sibling citation sweep, and gives operational guidance on configuration: leave thresholds at server defaults on a first run, tighten a specific bound when chasing a specific error class. Nothing 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. 18 tool updatesv2.3.0
    • Changedadd_event_ref1 field changed
      • addedInput schema / properties / attributes
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Attributes of this person's reference: what is theirs alone, e.g. {'As enumerated': '<their line on the sheet>', 'Age': '34'}. A name is matched against standard names, the tree's, and those on the event's other references."
        +}
    • Changedadd_family3 fields changed
      • addedInput schema / $defs / ChildLink
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "One child of add_family, with its relationship to each parent.",
        +  "properties": {
        +    "frel": {
        +      "default": "Birth",
        +      "description": "Relationship to the father: 'Birth', 'Adopted', 'Stepchild', 'Foster', ...",
        +      "type": "string"
        +    },
        +    "mrel": {
        +      "default": "Birth",
        +      "description": "Relationship to the mother, the same values.",
        +      "type": "string"
        +    },
        +    "person": {
        +      "description": "The child's handle or gramps_id, e.g. 'I0007'.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "person"
        +  ],
        +  "type": "object"
        +}
      • changedInput schema / properties / children / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "$ref": "#/$defs/ChildLink"
        +        }
        +      ]
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / children / description
        Previous value: -"Child handles or gramps_ids."New value: +"Children: handles or gramps_ids, each a birth child of both parents, or {person, frel, mrel} for a stepchild, adopted or foster child."
    • Addedadd_research_task
    • Changedconsolidated_timeline1 field changed
      • changedInput schema / properties / anchor / description
        Previous value: -"Handle or gramps_id of the central person, so ages are reported relative to them."New value: +"Handle or gramps_id of a central person. They are included, and each event gets anchor_age, their age at it; age is always the age of the person whose event it is."
    • Addedget_job
    • Changedget_record_history1 field changed
      • addedInput schema / properties / field
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Only the changes to this field of the stored record, each with its value before and after: 'parent_family_list', 'primary_name.first_name'."
        +}
    • Removedget_task
    • Changedget_timeline2 fields changed
      • changedInput schema / properties / ancestors / description
        Previous value: -"Generations of ancestors whose events to fold in."New value: +"Generations (1-5) of ancestors whose events to fold in. Omit this and offspring for the person's own events only. Given either, the server adds at least one generation each way; each event's person.relationship says whose it is."
      • changedInput schema / properties / offspring / description
        Previous value: -"Generations of descendants whose events to fold in."New value: +"Generations (1-5) of descendants whose events to fold in."
    • Addedlist_jobs
    • Addedlist_research_tasks
    • Removedlist_tasks
    • Addedmove_child
    • Changedocr_media9 fields changed
      • addedInput schema / $defs
        Added value: +{
        +  "DocType": {
        +    "description": "What the document is, which decides how ocr_media reads it.",
        +    "enum": [
        +      "print",
        +      "hand",
        +      "table",
        +      "volume"
        +    ],
        +    "type": "string"
        +  },
        +  "OcrEngine": {
        +    "description": "Which reader ocr_media uses; auto routes by doc_type and lang.",
        +    "enum": [
        +      "auto",
        +      "existing",
        +      "tesseract",
        +      "vision",
        +      "transkribus"
        +    ],
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / doc_type
        Added value: +{
        +  "$ref": "#/$defs/DocType",
        +  "default": "print",
        +  "description": "What the document is. 'print': typeset or typed. 'hand': one handwritten document -- will, deed, letter, register entry. 'table': a census page or other ruled form. 'volume': a page of a register or deed book you mean to search whole."
        +}
      • addedInput schema / properties / engine
        Added value: +{
        +  "$ref": "#/$defs/OcrEngine",
        +  "default": "auto",
        +  "description": "'auto' routes by doc_type and lang. Or one reader: 'existing' (text the media or its sources already carry), 'tesseract', 'vision' (the image, for you to read; refused for German handwriting), 'transkribus'."
        +}
      • changedInput schema / properties / lang / description
        Previous value: -"Tesseract language code ('eng', 'deu', 'swe', 'nor', ...)."New value: +"The document's language, as a Tesseract code: 'eng', 'deu', 'nor', 'swe', 'dan', 'lat'; 'eng+deu' for several. Chooses the handwriting route and Tesseract's model."
      • addedInput schema / properties / page
        Added value: +{
        +  "default": 1,
        +  "description": "Page of a PDF, from 1.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / region
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "number"
        +      },
        +      "maxItems": 4,
        +      "minItems": 4,
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Return only [x1, y1, x2, y2] of the page, in percent of width and height, at full detail: to read small or faint writing. [0, 50, 100, 100] is the bottom half."
        +}
      • addedInput schema / properties / second_witness
        Added value: +{
        +  "default": false,
        +  "description": "With a vision read, also run Transkribus and compare -- for a document that will carry a proof argument. Costs credits.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / spend_credits
        Added value: +{
        +  "default": false,
        +  "description": "Consent to Transkribus credits (about 0.5, EUR 0.12, a page) for this call, past the configured monthly page budget. Only when the user agreed.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / store
        Added value: +{
        +  "default": false,
        +  "description": "Keep a machine reading on the media object as a Transcript note headed with its engine, model and date, plus Transkribus' PAGE XML. A vision read is yours to store, with add_note.",
        +  "type": "boolean"
        +}
    • Changedquery_objects1 field changed
      • changedInput schema / properties / gql / description
        Previous value: -"GrampsQL 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'."New value: +"GrampsQL 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\"'. A LIST is searched through its items with '.any.' (or '.all.'), and a handle followed with 'get_<type>': 'urls.any.path ~ \"blm.gov\"', 'attribute_list.any.value ~ \"x\"', 'note_list.any.get_note.text.string ~ \"x\"'. '~' on the list itself asks whether the value IS an item, so it is refused. 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'. A query reads the whole collection, so each OR'd condition adds time."
    • Addedset_family_parent
    • Addedupdate_attribute
    • Addedupdate_event_ref
    • Addedupdate_research_task
  2. 22 tool updatesv1.2.0
    • Changedadd_alternate_name1 field changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
    • Changedadd_attribute2 fields changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / name / description
        Previous value: -"Attribute type/name, e.g. 'Occupation', 'National ID'."New value: +"Attribute type/name, e.g. 'Occupation', 'Identification Number', or a custom name the tree already has."
    • Changedadd_child_to_family1 field changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
    • Changedadd_event_ref1 field changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
    • Changedadd_event_to_family1 field changed
      • addedInput schema / $defs / EventInput / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
    • Changedadd_event_to_person1 field changed
      • addedInput schema / $defs / EventInput / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
    • Changedadd_family4 fields changed
      • removedInput schema / $defs / EventInput
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "A dated/placed fact about a person or family.",
        -  "properties": {
        -    "citation": {
        -      "anyOf": [
        -        {
        -          "$ref": "#/$defs/CitationInput"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "description": "Citation supporting this event (see require_citation)."
        -    },
        -    "date": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "description": "Date, Gramps style: '1899', '12 JAN 1899', 'ABT 1900', 'BEF 1950'; 'BET 1898 AND 1901' happened once within the range; 'FROM 1864 TO 1865' lasted the whole span; 'FROM 1880' or 'TO 1890' is open at one end."
        -    },
        -    "description": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "description": "Free-text description."
        -    },
        -    "place": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "description": "Place reference. Resolved in order: existing handle/gramps_id, exact title ('Columbus, Ohio, USA'), then exact unique name ('Columbus' — errors if several places share it); only a string matching nothing creates a new place. Prefer the gramps_id or full title of an existing place."
        -    },
        -    "type": {
        -      "description": "Gramps event type, e.g. 'Birth', 'Death', 'Marriage', 'Baptism', 'Burial', 'Residence', 'Occupation', 'Census'.",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "type"
        -  ],
        -  "type": "object"
        -}
      • addedInput schema / $defs / VitalEventInput
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "A birth, death or marriage given with the person or family it belongs to.\n\nThe parameter already names the event, so its type may be left out;\n``add_person`` and ``add_family`` fill it in.",
        +  "properties": {
        +    "allow_new_type": {
        +      "default": false,
        +      "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +      "type": "boolean"
        +    },
        +    "citation": {
        +      "anyOf": [
        +        {
        +          "$ref": "#/$defs/CitationInput"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Citation supporting this event (see require_citation)."
        +    },
        +    "date": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Date, Gramps style: '1899', '12 JAN 1899', 'ABT 1900', 'BEF 1950'; 'BET 1898 AND 1901' happened once within the range; 'FROM 1864 TO 1865' lasted the whole span; 'FROM 1880' or 'TO 1890' is open at one end."
        +    },
        +    "description": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Free-text description."
        +    },
        +    "place": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Place reference. Resolved in order: existing handle/gramps_id, exact title ('Columbus, Ohio, USA'), then exact unique name ('Columbus' — errors if several places share it); only a string matching nothing creates a new place. Prefer the gramps_id or full title of an existing place."
        +    },
        +    "type": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Leave out: the parameter names the event (Birth, Death or Marriage)."
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / marriage / anyOf
        Previous value: -[
        -  {
        -    "$ref": "#/$defs/EventInput"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "$ref": "#/$defs/VitalEventInput"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedadd_note1 field changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
    • Changedadd_person4 fields changed
      • removedInput schema / $defs / EventInput
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "A dated/placed fact about a person or family.",
        -  "properties": {
        -    "citation": {
        -      "anyOf": [
        -        {
        -          "$ref": "#/$defs/CitationInput"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "description": "Citation supporting this event (see require_citation)."
        -    },
        -    "date": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "description": "Date, Gramps style: '1899', '12 JAN 1899', 'ABT 1900', 'BEF 1950'; 'BET 1898 AND 1901' happened once within the range; 'FROM 1864 TO 1865' lasted the whole span; 'FROM 1880' or 'TO 1890' is open at one end."
        -    },
        -    "description": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "description": "Free-text description."
        -    },
        -    "place": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "description": "Place reference. Resolved in order: existing handle/gramps_id, exact title ('Columbus, Ohio, USA'), then exact unique name ('Columbus' — errors if several places share it); only a string matching nothing creates a new place. Prefer the gramps_id or full title of an existing place."
        -    },
        -    "type": {
        -      "description": "Gramps event type, e.g. 'Birth', 'Death', 'Marriage', 'Baptism', 'Burial', 'Residence', 'Occupation', 'Census'.",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "type"
        -  ],
        -  "type": "object"
        -}
      • addedInput schema / $defs / VitalEventInput
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "A birth, death or marriage given with the person or family it belongs to.\n\nThe parameter already names the event, so its type may be left out;\n``add_person`` and ``add_family`` fill it in.",
        +  "properties": {
        +    "allow_new_type": {
        +      "default": false,
        +      "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +      "type": "boolean"
        +    },
        +    "citation": {
        +      "anyOf": [
        +        {
        +          "$ref": "#/$defs/CitationInput"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Citation supporting this event (see require_citation)."
        +    },
        +    "date": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Date, Gramps style: '1899', '12 JAN 1899', 'ABT 1900', 'BEF 1950'; 'BET 1898 AND 1901' happened once within the range; 'FROM 1864 TO 1865' lasted the whole span; 'FROM 1880' or 'TO 1890' is open at one end."
        +    },
        +    "description": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Free-text description."
        +    },
        +    "place": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Place reference. Resolved in order: existing handle/gramps_id, exact title ('Columbus, Ohio, USA'), then exact unique name ('Columbus' — errors if several places share it); only a string matching nothing creates a new place. Prefer the gramps_id or full title of an existing place."
        +    },
        +    "type": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Leave out: the parameter names the event (Birth, Death or Marriage)."
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / birth / anyOf
        Previous value: -[
        -  {
        -    "$ref": "#/$defs/EventInput"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "$ref": "#/$defs/VitalEventInput"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / death / anyOf
        Previous value: -[
        -  {
        -    "$ref": "#/$defs/EventInput"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "$ref": "#/$defs/VitalEventInput"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedadd_place2 fields changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / place_type / description
        Previous value: -"Gramps place type: Town, City, County, State, Country, Parish, Cemetery, and so on."New value: +"Gramps place type: Town, City, County, State, Country, Parish, Farm, Building, and so on, or a custom type the tree already has."
    • Changedadd_repository2 fields changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / repository_type / description
        Previous value: -"Type: 'Library', 'Archive', 'Cemetery', 'Church', 'Website', etc."New value: +"Type: 'Library', 'Archive', 'Cemetery', 'Church', 'Web site', etc."
    • Changedadd_source2 fields changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / media_type / description
        Previous value: -"Medium of the source at that repository, e.g. 'Book', 'Microfilm', 'Electronic'. Only used with repository."New value: +"Medium of the source at that repository, e.g. 'Book', 'Film', 'Electronic'. Only used with repository."
    • Changedadd_url3 fields changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / url_type / default
        Previous value: -"Web Home Page"New value: +"Web Home"
      • changedInput schema / properties / url_type / description
        Previous value: -"URL type, e.g. 'Web Home Page', 'Web Search', 'E-mail'."New value: +"URL type: 'Web Home', 'Web Search', 'E-mail', 'FTP', or a custom type the tree already has."
    • Addedget_record_history
    • Changedlink_repositories1 field changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
    • Changedlink_repository2 fields changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / media_type / description
        Previous value: -"Medium of the source at the repository, e.g. 'Book', 'Microfilm', 'Electronic', 'Unknown'."New value: +"Medium of the source at the repository, e.g. 'Book', 'Film', 'Electronic', 'Unknown'."
    • Changedquery_records1 field changed
      • changedInput schema / properties / where / description
        Previous value: -"Conditions 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."New value: +"Conditions 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. A list value is for 'in' only; 'contains' finds one value in a list field. A date's year is dateval[2], 0 when unknown."
    • Changedupdate_alternate_name1 field changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
    • Changedupdate_child_ref1 field changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
    • Changedupdate_object_fields1 field changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
    • Changedupdate_place2 fields changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / place_type / description
        Previous value: -"New place type: 'Country', 'State', 'County', 'City', 'Town', 'Village', 'Cemetery', etc. Omit to leave unchanged."New value: +"New place type: 'Country', 'State', 'County', 'City', 'Town', 'Village', 'Parish', 'Farm', 'Building', etc., or a custom type the tree already has. Omit to leave unchanged."
    • Changedupdate_url2 fields changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept a type that is neither a Gramps standard type nor one of the tree's custom types, creating it as a new custom type. Only when meant: a near-miss is refused with the closest names.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / url_type / description
        Previous value: -"New URL type, e.g. 'Find A Grave', 'Web Home Page'. Omit to keep."New value: +"New URL type, e.g. 'Web Home', 'Web Search', or a custom type the tree already has. Omit to keep."
  3. 20 tool updatesv1.0.1
    • Changedadd_alternate_name2 fields changed
      • addedInput schema / $defs
        Added value: +{
        +  "CitationInput": {
        +    "additionalProperties": false,
        +    "description": "How to cite a fact. Either reference an existing citation, or create one.\n\nPrecedence:\n1. ``citation`` -> reuse that exact citation.\n2. else ``source`` -> create a new citation on that existing source.\n3. else ``source_title`` -> create a new source AND a citation on it.\n\n``page`` is where in the source the fact appears (\"Vol 3, p. 45; line 12\").\n``confidence`` is your assessment of how strongly the source supports the fact.",
        +    "properties": {
        +      "citation": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Existing citation to reuse: handle or gramps_id (e.g. 'C0001'). Only when it supports this exact claim -- a citation carries one confidence."
        +      },
        +      "confidence": {
        +        "$ref": "#/$defs/Confidence",
        +        "default": "normal",
        +        "description": "Confidence the source supports this fact."
        +      },
        +      "date": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Date the source was recorded/accessed (free text)."
        +      },
        +      "note": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Free-text note attached to the citation."
        +      },
        +      "page": {
        +        "default": "",
        +        "description": "Where in the source the fact appears, e.g. 'p. 45, entry 12'.",
        +        "type": "string"
        +      },
        +      "source": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Existing source to cite: handle or gramps_id (e.g. 'S0001'). A new citation is created on it."
        +      },
        +      "source_author": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Author of the new source."
        +      },
        +      "source_pubinfo": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Publication info of the new source."
        +      },
        +      "source_title": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Title of a NEW source to create, e.g. 'Ohio Birth Certificate #12345'."
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "Confidence": {
        +    "description": "Gramps citation confidence levels (int 0..4 on the wire).",
        +    "enum": [
        +      "very_low",
        +      "low",
        +      "normal",
        +      "high",
        +      "very_high"
        +    ],
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / citation
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/CitationInput"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "The record that gives this form of the name. It goes on the name itself -- 'this record spells it so' -- not on the person. Cite an existing name with cite_object(object_type='name')."
        +}
    • Addedadd_event_ref
    • Changedadd_event_to_family1 field changed
      • changedInput schema / $defs / EventInput / properties / date / description
        Previous value: -"Date, free text in Gramps style: '1899', '12 JAN 1899', 'ABT 1900', 'BET 1898 AND 1901', 'BEF 1950'."New value: +"Date, Gramps style: '1899', '12 JAN 1899', 'ABT 1900', 'BEF 1950'; 'BET 1898 AND 1901' happened once within the range; 'FROM 1864 TO 1865' lasted the whole span; 'FROM 1880' or 'TO 1890' is open at one end."
    • Changedadd_event_to_person1 field changed
      • changedInput schema / $defs / EventInput / properties / date / description
        Previous value: -"Date, free text in Gramps style: '1899', '12 JAN 1899', 'ABT 1900', 'BET 1898 AND 1901', 'BEF 1950'."New value: +"Date, Gramps style: '1899', '12 JAN 1899', 'ABT 1900', 'BEF 1950'; 'BET 1898 AND 1901' happened once within the range; 'FROM 1864 TO 1865' lasted the whole span; 'FROM 1880' or 'TO 1890' is open at one end."
    • Changedadd_family1 field changed
      • changedInput schema / $defs / EventInput / properties / date / description
        Previous value: -"Date, free text in Gramps style: '1899', '12 JAN 1899', 'ABT 1900', 'BET 1898 AND 1901', 'BEF 1950'."New value: +"Date, Gramps style: '1899', '12 JAN 1899', 'ABT 1900', 'BEF 1950'; 'BET 1898 AND 1901' happened once within the range; 'FROM 1864 TO 1865' lasted the whole span; 'FROM 1880' or 'TO 1890' is open at one end."
    • Changedadd_person1 field changed
      • changedInput schema / $defs / EventInput / properties / date / description
        Previous value: -"Date, free text in Gramps style: '1899', '12 JAN 1899', 'ABT 1900', 'BET 1898 AND 1901', 'BEF 1950'."New value: +"Date, Gramps style: '1899', '12 JAN 1899', 'ABT 1900', 'BEF 1950'; 'BET 1898 AND 1901' happened once within the range; 'FROM 1864 TO 1865' lasted the whole span; 'FROM 1880' or 'TO 1890' is open at one end."
    • Changedadd_source1 field changed
      • addedInput schema / properties / media_type
        Added value: +{
        +  "default": "Unknown",
        +  "description": "Medium of the source at that repository, e.g. 'Book', 'Microfilm', 'Electronic'. Only used with repository.",
        +  "type": "string"
        +}
    • Addedcheck_family_links
    • Changedcite_object3 fields changed
      • addedInput schema / $defs / NameMatch
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Which of a person's names. Every field given must match, ignoring case.\n\nget_person lists the names: the primary, and each alternate with its index.",
        +  "properties": {
        +    "given": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Given name(s) as stored."
        +    },
        +    "index": {
        +      "anyOf": [
        +        {
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Position among the alternate names, as get_person lists them. Only needed to tell identical duplicates apart."
        +    },
        +    "primary": {
        +      "anyOf": [
        +        {
        +          "type": "boolean"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "True: the primary name only. False: alternate names only."
        +    },
        +    "surname": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Surname as stored."
        +    },
        +    "type": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "Name type: 'Birth Name', 'Also Known As', 'Married Name', ..."
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/NameMatch"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With object_type='name': which of the person's names, e.g. {'surname': 'Bittner', 'type': 'Birth Name'} or {'primary': true}. Must match exactly one."
        +}
      • changedInput schema / properties / object_type / description
        Previous value: -"person, family, event, place, media, source, or citation."New value: +"person, family, event, place, media, source, citation, or name (one of a person's names: ref is the person, name says which)."
    • Changeddelete_object1 field changed
      • addedInput schema / properties / carry_to
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Another object of the same type to receive the notes and images that only this one holds. Without it, such a delete is refused."
        +}
    • Changeddetach_object3 fields changed
      • addedInput schema / properties / call_number
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Repository only: detach just the link with this call number, when a source is held twice in one repository. Omit to detach every link."
        +}
      • changedInput schema / properties / child / description
        Previous value: -"Handle or gramps_id of the thing to detach."New value: +"Handle or gramps_id of the thing to detach; a tag may be given by name."
      • changedInput schema / properties / child_kind / description
        Previous value: -"What to detach: event, media, note, tag, citation, child (a person from a family), person (a person_ref), or repository."New value: +"What to detach: event, media, note, tag (removes a tag), citation, child (a person from a family), person (a person_ref), repository, enclosure (a parent of a place), or -- on a person, to repair a link only the person holds (check_family_links) -- parent_family or family."
    • Addedlink_repositories
    • Changedmerge_objects1 field changed
      • addedInput schema / properties / enclosures
        Added value: +{
        +  "default": "auto",
        +  "description": "Places only: the survivor otherwise gets both places' parents. 'auto' drops an undated parent that encloses another (a state beside its county) and refuses if two unrelated undated parents remain; or 'keep_keeper', 'keep_drop', 'keep_both'. Dated enclosures are always kept.",
        +  "type": "string"
        +}
    • Changedtag_object1 field changed
      • changedInput schema / properties / tag / description
        Previous value: -"Tag name (found-or-created by exact match), e.g. 'Verified'."New value: +"Tag name (found-or-created by exact match), e.g. 'Verified'. To REMOVE a tag: detach_object(child_kind='tag', child=<tag name>)."
    • Changeduncite4 fields changed
      • addedInput schema / $defs
        Added value: +{
        +  "NameMatch": {
        +    "additionalProperties": false,
        +    "description": "Which of a person's names. Every field given must match, ignoring case.\n\nget_person lists the names: the primary, and each alternate with its index.",
        +    "properties": {
        +      "given": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Given name(s) as stored."
        +      },
        +      "index": {
        +        "anyOf": [
        +          {
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Position among the alternate names, as get_person lists them. Only needed to tell identical duplicates apart."
        +      },
        +      "primary": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "True: the primary name only. False: alternate names only."
        +      },
        +      "surname": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Surname as stored."
        +      },
        +      "type": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Name type: 'Birth Name', 'Also Known As', 'Married Name', ..."
        +      }
        +    },
        +    "type": "object"
        +  }
        +}
      • addedInput schema / properties / carry_to
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Citation (handle or gramps_id) to receive the notes and images only this citation holds, so it can be deleted without losing them."
        +}
      • changedInput schema / properties / delete_if_orphan / description
        Previous value: -"Delete the citation if nothing else references it after detaching. Leave True unless you are keeping it deliberately."New value: +"Delete the citation if nothing else references it after detaching. Leave True unless you are keeping it deliberately. A citation that holds the only link to a note or image is kept unless carry_to is given."
      • addedInput schema / properties / name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/NameMatch"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "With object_type='name' (ref is the person): which of the person's names to detach the citation from."
        +}
    • Addedupdate_alternate_name
    • Addedupdate_child_ref
    • Addedupdate_citations
    • Changedupdate_event5 fields changed
      • addedInput schema / properties / allow_new_type
        Added value: +{
        +  "default": false,
        +  "description": "Accept an event_type the tree does not have yet, creating it as a custom type. Only for a deliberate new type, never a typo.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / clear_date
        Added value: +{
        +  "default": false,
        +  "description": "Remove the event's date.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / clear_place
        Added value: +{
        +  "default": false,
        +  "description": "Remove the event's place, e.g. one no source states. An empty place string is refused rather than read as this.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / date / description
        Previous value: -"New date, free text in Gramps style ('1899', 'ABT 1900'). Omit to leave unchanged."New value: +"New date, Gramps style: '1899', '12 JAN 1899', 'ABT 1900', 'BEF 1950'; 'BET 1898 AND 1901' happened once within the range; 'FROM 4 MAY 1864 TO 16 SEP 1864' lasted the whole span; 'FROM 1880' or 'TO 1890' is open at one end. Omit to leave unchanged."
      • addedInput schema / properties / event_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "New event type, e.g. 'Census', 'Visit'. Must already be a standard or custom type in the tree (list_object_types) unless allow_new_type is set. Omit to leave unchanged."
        +}
    • Changedupdate_person3 fields changed
      • addedInput schema / properties / keep_old_as_alternate
        Added value: +{
        +  "default": true,
        +  "description": "False only to fix a data-entry error -- a name split wrongly between given and surname, a typo no record contains -- where keeping the old form would invent a variant. The name is then corrected in place, keeping its citations, and reason is recorded in a note on the person.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / name / description
        Previous value: -"New PRIMARY name. The current primary name is kept as an alternate rather than discarded."New value: +"New PRIMARY name. The current primary name is kept as an alternate rather than discarded, unless keep_old_as_alternate is False."
      • addedInput schema / properties / reason
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Why the old form is not kept. Required with keep_old_as_alternate=False."
        +}
  4. 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.5/5.0

Scored across 97 tools

Disambiguation3/5

Several tool families overlap heavily: query_objects vs query_records, get_object vs the shaped getters (get_person/get_source/get_citation), and the citation family (add_citation, cite_event, cite_object, cite_child_link) all target related operations. The very detailed descriptions do draw boundaries, but with 97 tools an agent can easily misselect among near-synonyms.

Naming Consistency4/5

The dominant pattern is consistent snake_case verb_noun (get_person, add_family, update_citation, list_jobs, delete_object). A few outliers (uncite, consolidated_timeline, event_span, db_stats) break the pattern, but overall it is predictable.

Tool Count1/5

97 tools is an extreme mismatch for any single server, well into the 50+ range the rubric flags. Even a complex genealogy/evidence domain does not justify this surface, and the count itself creates discovery and selection burden.

Completeness4/5

Coverage is unusually broad: CRUD on people/families/events/sources/citations/repositories/media/places/notes, plus citations, DNA, reports, filters, transactions, jobs, audits and timelines. Minor gaps exist (no explicit update/delete for repositories, notes, or tags), but generic tools like update_object_fields and delete_object cover most of them.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    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.
    17
    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.
    45
    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