Gramps Web MCP
This is a Gramps Web MCP server that lets AI agents read, search, and safely edit a genealogy family tree.
Read and inspect records: search, list/filter/sort objects, get full records, bookmarks, recent edit history.
Create, update, and delete people, families, events, places, sources, citations, notes, media, repositories, and tags.
Batch-create linked records in one transaction with
create_records, all-or-nothing.Explore relationships: ancestors/descendants, how two people are related, and timelines.
Manage names, dates, attributes, addresses, URLs, event roles, family links, citations, notes, media, tags, and repositories/places.
Read and upload media, including image regions/crops, previews, EXIF stripping, and attachment to records.
Edit safely with
linkMode, transaction undo, dry-run/forced undo, and confirmation-gated delete/undo.Get reference help for date/name/type/filter formats, and optionally run in read-only mode over stdio, HTTP, or SSE.
gramps-web-mcp
Update to 2.3.1 or later. Before 2.3.1 the update_* tools could drop
stored data that the call did not mention
(#5). If you edited a
tree with an earlier version,
check it for dropped data.
Companion MCP server for the Gramps Web open-source genealogy platform. It lets AI agents read and edit your family tree through the Model Context Protocol. It is not a genealogy UI: run it alongside an existing Gramps Web instance, where your users, trees, media and permissions stay.
The buttons add the server to VS Code or Cursor, which start it from the Docker image, so Docker must be installed. For Claude Desktop, install the MCPB extension; other clients are listed under Install.
Features
Up to 35 MCP tools — read, create, update, merge, and delete people, families, events, places, sources, citations, notes, media, repositories, and tags
Search and kinship — full-text search, listings filtered by Gramps QL or Gramps filter rules, ancestors, descendants, relationships, and timelines
Careful edits — add or remove one link with
linkModeand keep the rest; save a whole register entry in one transaction withcreate_records; dates in every Gramps form and calendarDuplicates —
find_duplicatespairs people entered twice, across spellings and name forms, and the create tools refuse a person the tree already hasUndo and confirmation —
undo_changereverts one transaction of the edit history; it,delete_objectandmerge_objectsask the user, not the model, before they change the tree, in clients that support MCP elicitationScans and photos — opt-in previews that vision-capable agents can read, with EXIF/GPS metadata stripped, and uploads from a folder you choose
8 MCP resources and guided prompts — type vocabularies, tree metadata, filter rules, and workflows for research, imports, citing facts, and tree audits
Read-only mode — publish only read tools and block direct mutation calls
Any MCP client — stdio, Streamable HTTP, and legacy SSE, from a Claude Desktop extension, a Docker image, or a single-file release binary
The tool catalog describes every tool, resource and prompt. Upgrading from 1.x? Follow the 2.0 migration guide.
Related MCP server: ASPNET Core Debugging MCP Server
What to ask
Ask in your own words; the agent chooses the tools. The names stand for people
in your tree, and a Gramps ID such as I0012 works as well.
You ask | You get |
"Tell me about Maria García." | Her names, events with dates and places, parents, spouses and children, citations and notes |
"Who were Kenji Tanaka's great-grandparents?" | Each ancestor with a kinship label such as Father's mother, and birth and death dates and places |
"How is Ivan Petrov related to Maria García?" | The relationship in words, such as second cousin once removed, and the common ancestors by name |
"Transcribe the baptism scan O0012." | The scan for the agent to read, and the transcription in its reply |
"Add Thomas Weber, born 3 May 1881 in Hamburg, son of Karl and Anna Weber." | The new records with their Gramps IDs, people already in the tree reused, and what the text left open |
"Enter entry 12 of the 1884 marriage register: the couple, their fathers and the witnesses." | The citation, the marriage, the new people and families saved in one transaction, which one |
"What changed today? Undo the last edit." | The edit history, then the earlier versions back, or a refusal naming the later edits the undo would overwrite |
Reading scans needs media access. The tool catalog lists more requests and the tools each one uses.
Install
You need a running Gramps Web instance and an account on it. Choose the setup by client:
Client | Setup |
Claude Desktop | The MCPB extension, installed from one file; no Docker |
VS Code, Cursor | The install buttons above; the client starts the Docker image |
Claude Code, Codex, Gemini CLI, Antigravity CLI, Open WebUI and others | Connecting MCP clients: over HTTP to a shared server, or started by the client from the Docker image or the release binary |
Several clients or machines | One server in Docker, Docker Compose or on Unraid, reached over HTTP |
Claude Desktop
Download the
.mcpbbundle for your platform from the latest release, such asgramps-web-mcp-claude-desktop-osx-arm64-v*.mcpbfor Apple Silicon.Double-click it, or drag it into the Claude Desktop window.
Enter your Gramps Web URL, username, password/token, and tree UUID.
Leave Read-only mode enabled for your first session; disable it only when you want Claude to create or edit records.
Complete installation and start a new chat.
Claude Desktop connects to servers added by URL from Anthropic's cloud, not from your computer, so it cannot reach a server on your home network; use the extension there. Installation lists the bundle for each platform.
Docker
For one server that several clients share:
docker run -p 8080:8080 \
-e GRAMPS_API_URL=https://your-gramps.example.com \
-e GRAMPS_USERNAME=your-user \
-e GRAMPS_PASSWORD=your-password \
-e GRAMPS_TREE_ID=your-tree-uuid \
-e MCP_API_KEY=your-secret-api-key \
ghcr.io/scormave/gramps-web-mcp:latestClients then connect to http://<host>:8080/mcp with the API key, as shown
in Over HTTP. Add
-e GRAMPS_READ_ONLY=true for read-only mode.
Installation covers refresh tokens,
health checks, image verification, Docker Compose with Gramps Web, Unraid and
upgrades.
Configuration
Every setting is an environment variable. The main ones:
Variable | Description | Default |
| Base URL of your Gramps Web instance (no trailing slash) | — |
| The Gramps Web account the server works as | — |
| Used instead of the user name and password when Gramps Web has password login turned off | — |
| Tree UUID on that server | — |
|
|
|
| Lets agents read scans and photos, and enables uploads |
|
| Folders that | unset (off) |
|
|
|
| Key that HTTP clients must send; set it whenever other machines can reach the port | — |
Configuration describes every setting, including write pacing for SQLite, confirmation dialogs, media limits, transports, browser origins and logging.
Documentation
Document | Description |
Claude Desktop, Docker, Docker Compose, Unraid, health checks, and upgrades | |
Claude Code, VS Code, Cursor, Codex, Gemini and Antigravity CLI, and Open WebUI, over HTTP or stdio | |
Every environment variable | |
Every tool, resource and prompt, and more example requests | |
Suggested prompt for MCP clients | |
Tool replacements and setup changes for 1.x users | |
Desktop extension packaging | |
System design overview | |
Running from source, tests, and adding tools | |
All documentation files |
Contributing
Contributions are welcome. ./run-local-server.sh runs the server from source
against the public demo.grampsweb.org tree at
http://127.0.0.1:8080/mcp, and dotnet test runs the tests. See
CONTRIBUTING.md and the
developer guide.
Security
To report a vulnerability, see SECURITY.md.
Privacy Policy
The Claude Desktop extension is a local MCP server. It sends data only to the Gramps Web instance you configure and does not collect analytics or conversation data. See PRIVACY.md for full details.
License
Copyright (c) Scormave
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0-or-later). Because this is network server software, hosting a modified version requires making the corresponding source available to users interacting with it over a network.
Bundled third-party components, such as ImageSharp, the MCP C# SDK, and the .NET
runtime, keep their own Apache 2.0 or MIT licenses; see
THIRD-PARTY-NOTICES.txt. The MCP Bundles and the
Docker image ship that file next to LICENSE.
Available Tools
35 toolscreate_citationCreate CitationA
Create a citation: one specific spot in an existing source, such as a page, act or entry number, with its date, confidence, notes and media. Returns the new handle, Gramps ID and page, with next steps. The source must already exist (search, or create_source). A transcript of the entry goes in a note (create_note, type Transcript) passed in noteHandles; the scan goes in mediaHandles, or later through create_media attachTo, which can mark the entry's region on the page. The citation supports nothing until it is attached: add it to each person, family, event or place it names (citationHandles, linkMode add, on their update tool). Does not check for duplicates; change an existing citation with update_citation. For several new records that link to each other, such as the people, events, source and citation of one register entry, use create_records instead: one transaction, all created or none. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it. Formats of every argument: get_reference(topic: "input-guide").
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date of the cited entry, optional. Date text: 1856-07-20, 1920-05, 1920, 1 Jul 1919, about/before/after 1920, 1800-1850, between … and …; append the calendar for other calendars, e.g. 1856-07-20 (Julian). Unreadable dates are rejected. | |
| page | No | Where in the source: page, act or entry number (optional). Text value. JSON strings are accepted; JSON numbers are also accepted and sent as text. | |
| isPrivate | No | Mark the citation private (default false). | |
| attributes | No | Attributes: JSON array of objects {type,value,...}, or strings "Type: Value" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide. Each attribute takes only type, value and private. | |
| confidence | No | How reliable the cited record is: Very Low, Low, Normal (default), High or Very High. | Normal |
| tagHandles | No | Tags. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| noteHandles | No | Notes, e.g. a transcript of the entry (create_note with type Transcript). Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| mediaHandles | No | Media such as the scan of the page. Media handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {"ref":"…","region":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. | |
| sourceHandle | Yes | The source being cited (required). Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly=false, destructive=false, idempotent=false): it discloses that no duplicate check occurs, that writes require an account allowed to edit the tree, that writes run one at a time, and that locked/rate-limited writes return a retry delay. It also states the return payload (handle, Gramps ID, page) despite having 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and prerequisites, then prerequisites/alternatives in descending order of importance, with zero filler sentences. It is dense and long — arguably two or three clauses could be tightened — but nearly every clause carries operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the full lifecycle an agent needs for a 9-parameter mutation tool with no output schema: prerequisite lookup, how to attach related notes/media, the required follow-up attach step, duplicate behavior, permissions, rate limiting, and failure semantics. Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 genuine meaning by explaining that a transcript belongs in noteHandles as a Transcript-type note and the scan in mediaHandles, including the deferred create_media attachTo path. It doesn't restate the region, date or attribute grammar in detail, deferring to the schema and input-guide, which is reasonable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a citation') and immediately defines the concept: one specific spot in an existing source, with date, confidence, notes and media. It explicitly distinguishes itself from update_citation, create_records, and create_source, so an agent can route correctly without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use, prerequisites ('The source must already exist'), post-conditions ('The citation supports nothing until it is attached'), and named alternatives for adjacent cases (update_citation for changes, create_records for multi-record transactions). It even routes to get_reference for argument formats.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_eventCreate EventA
Create a standalone event (Birth, Marriage, Residence, Census, …) with its date, place, description, citations, notes and media. Returns the new handle, Gramps ID and type, with next steps. The event is linked to nobody yet: attach it with update_person or update_family (eventRefs, linkMode add), which keeps their other events; several people can share one event, each with their own role. The role is stored on their eventRefs (HANDLE::Role, default Primary on a person and Family on a family), not on the event, and a Birth or Death becomes a person's birth or death only in the Primary role. The place must exist: find it with search or create it with create_place. A dated range such as 1890-1900 means the event happened once, some time within it; for something that lasted, such as a Residence or Occupation, write from 1890 to 1900. A register that gives both birth and baptism makes two events, Birth and Baptism. Citations, notes, media, tags and attributes passed here belong to the event and show for everyone who shares it; one participant's own details, such as their Age, go on that person's eventRefs entry (its attribute_list). Change an existing event with update_event. An unknown type or unreadable date is rejected before anything is saved. For several new records that link to each other, such as the people, events, source and citation of one register entry, use create_records instead: one transaction, all created or none. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it. Formats of every argument: get_reference(topic: "input-guide").
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | When it happened, optional. Date text: 1856-07-20, 1920-05, 1920, 1 Jul 1919, about/before/after 1920, 1800-1850, between … and …; append the calendar for other calendars, e.g. 1856-07-20 (Julian). Unreadable dates are rejected. | |
| eventType | Yes | Event type, e.g. Birth, Baptism, Death, Burial, Marriage, Residence, Occupation. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: "types"). | |
| isPrivate | No | Mark the event private (default false). | |
| attributes | No | Attributes: JSON array of objects {type,value,...}, or strings "Type: Value" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide. | |
| tagHandles | No | Tags. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| description | No | Short description, optional. | |
| noteHandles | No | Notes. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| placeHandle | No | Where it happened, optional; the place must exist (create_place). Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| mediaHandles | No | Media. Media handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {"ref":"…","region":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. | |
| citationHandles | No | Citations supporting the event. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-idempotent, non-destructive write, and the description goes well beyond them by disclosing the return payload (handle, Gramps ID, type), validation-before-save on bad type/date, sequential writes, edit-permission requirements, and rate-limit retry behavior. However, a large share of the text is domain modelling advice about eventRefs roles and date ranges rather than behavior of this call, so the behavioral disclosure, while above the annotated baseline, is diluted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the paragraph is long and mixes creation mechanics with genealogy modelling rules about Primary roles, birth/death pairing, and shared citations. Useful content, yet the agent must wade through domain lore to reach the operational facts about return values and rate limits.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With ten parameters, no output schema, and one required field, the description covers the return shape, failure modes, and attachment workflow adequately. The only gap is that the formats of every argument are deferred to get_reference(topic: "input-guide") rather than summarized inline.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 exceeds it by explaining that a range like 1890-1900 means a single occurrence within that span versus 'from 1890 to 1900' for a duration, and that placeHandle requires an existing place. It also clarifies that citation/note/media/tag payloads belong to the shared event while participant-specific data belongs on eventRefs, which the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource — 'Create a standalone event' — and immediately enumerates the payload it carries (date, place, description, citations, notes, media). The word 'standalone' plus the later 'The event is linked to nobody yet' cleanly separates it from create_records and update_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing is given throughout: attach via update_person or update_family with eventRefs/linkMode add, find the place with search or create_place, modify with update_event, and use create_records for several interlinked new records. It even states the precondition exception (data that must be created atomically) that selects the alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_familyCreate FamilyA
Create a family: a couple (father and mother, each optional) with their relationship type, children and family events such as Marriage. People and events must already exist (create_person, create_event). Gramps Web links the father, mother and children back to the family in the same save, and if one of them does not exist it refuses the family and nothing is saved. relationshipType stays Unknown unless a source records the marriage: then pass Married and link the Marriage event in eventRefs, where a family event takes the Family role, which is what makes Gramps and Gramps Web show the family among the event's participants. Each child in childRefs carries its own relation to the father and to the mother, Birth unless the source says Adopted, Stepchild or another; children keep the order given, so list them by birth. Citations, notes, media, tags and attributes passed here belong to the family itself, not to its members or events. Returns the new handle, Gramps ID and stored relationship type; when children or events were left out, it also lists the update_family calls that add them with linkMode add. Does not check for duplicates: look at the parents' families first, and change an existing family with update_family. Children are added here through childRefs, not through the child's parentFamilyHandles. For several new records that link to each other, such as the people, events, source and citation of one register entry, use create_records instead: one transaction, all created or none. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it. Formats of every argument: get_reference(topic: "input-guide").
| Name | Required | Description | Default |
|---|---|---|---|
| childRefs | No | Children, each with its relation to the father and mother (Birth by default; Adopted, Stepchild, …). Child references (handles, not Gramps IDs): JSON array of {ref, frel, mrel}, strings "HANDLE::RelType" (sets both frel and mrel; default: Birth), comma/pipe/newline-separated, or a single handle. A relation must be a standard Gramps one (Birth, Adopted, Stepchild, Sponsored, Foster, Unknown, None) or a custom one the tree already uses. JSON objects accept snake_case (frel, mrel, tag_list) or camelCase (fatherRel, tagList, etc.). | |
| eventRefs | No | Existing family events such as Marriage or Divorce. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings "HANDLE::Role" (default role: Primary on a person, Family on a family), comma/pipe/newline-separated, or a single handle. A role must be a standard Gramps role or a custom one the tree already uses; anything else is rejected with suggestions. JSON objects accept snake_case or camelCase list fields (note_list / noteList). | |
| isPrivate | No | Mark the family private (default false). | |
| attributes | No | Attributes: JSON array of objects {type,value,...}, or strings "Type: Value" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide. | |
| tagHandles | No | Tags. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| noteHandles | No | Notes. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| fatherHandle | No | The father, optional. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| mediaHandles | No | Media. Media handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {"ref":"…","region":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. | |
| motherHandle | No | The mother, optional. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| citationHandles | No | Citations. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| relationshipType | No | Relationship type: Married, Unmarried, Civil Union or Unknown (default, as in Gramps). Pass Married when a source records the marriage. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: "types"). | Unknown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses the atomicity rule (a missing member makes Gramps Web refuse the family and save nothing), the no-duplicate-check behaviour, write serialization, the edit-permission requirement, and rate-limit/lock failures with the wait before retrying. It also describes the return value and the follow-up update_family calls with linkMode add when refs were omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core creation model and every sentence carries information, but it is delivered as one dense block with long compound sentences, which makes it harder to scan than a short set of grouped points. No filler sentences are present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, all-optional mutation tool with no output schema, it covers prerequisites, atomicity, permissions, concurrency, duplicate policy, relationship-type conventions, return shape, and a pointer to get_reference for argument formats. An agent has what it needs to call it correctly and to recover from a refusal.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds real semantics the schema does not: relationshipType stays Unknown unless a source records the marriage, the Family role in eventRefs is what makes the family appear among the event's participants, childRefs order is preserved so children should be listed by birth, and citations/notes/tags belong to the family and not its members. The plain handle-list parameters are left to the schema, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource plus the shape of the record: "Create a family: a couple (father and mother, each optional) with their relationship type, children and family events." It also distinguishes itself from siblings by naming create_records and update_family and the conditions that select them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing rules: look at the parents' families first because duplicates are not checked, use update_family to change an existing family, use create_records for several new interlinked records, and add children via childRefs rather than parentFamilyHandles. Each alternative comes with the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_mediaCreate MediaAIdempotent
Upload a photo, document scan or PDF from the server's upload folder as a new media record, and show it on people, families, events, places, sources or citations with attachTo, whole or as a region such as one record on a page scan. Only files inside GRAMPS_MEDIA_UPLOAD_DIRS can be uploaded, and a relative filePath is looked up in each of them in turn; the type (JPEG, PNG, GIF, WebP, TIFF, BMP or PDF) is judged by content. citationHandles cite where the file itself came from, while attachTo shows it on the records it documents, such as a citation with the region of its entry. If the tree already stores an identical file (same MD5 checksum), nothing is uploaded: that record is returned with action existing, its fields stay as they are and only attachTo is applied, so repeating a call is safe. Returns the handle and Gramps ID; an unreadable date or unknown attachTo record is rejected before anything is uploaded. It is the only tool that uploads a file: create_records takes no media, and a transcription of a document belongs in a note (create_note), not here. Change the record later, or swap its file, with update_media; check what a region shows with read_media. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it. Formats of every argument: get_reference(topic: "input-guide").
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date of the photo or document. Date text: 1856-07-20, 1920-05, 1920, 1 Jul 1919, about/before/after 1920, 1800-1850, between … and …; append the calendar for other calendars, e.g. 1856-07-20 (Julian). Unreadable dates are rejected. | |
| attachTo | No | Records to show the media on, each getting a link after its existing media: Gramps IDs (I0001, F0001, E0001, P0001, S0001, C0001) or handles of people, families, events, places, sources or citations. JSON array, one value, or a comma-separated string. To show only part of the image, such as one record on a page scan, give an object {"ref":"I0001","region":[left, top, right, bottom]} in place of the ID. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. A record already showing the media keeps its link and takes the region; list a record twice to show two regions. Check a region with read_media first. | |
| filePath | Yes | The file to upload: an absolute path inside an upload folder, ~/…, or a name relative to the folder, e.g. scan.jpg. | |
| isPrivate | No | Mark the media private (default false). | |
| attributes | No | Attributes. Attributes: JSON array of objects {type,value,...}, or strings "Type: Value" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide. | |
| tagHandles | No | Tags. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| description | No | Description (caption). Default: the file name without its extension. | |
| noteHandles | No | Notes. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| citationHandles | No | Citations for the media itself. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, idempotent=true, destructive=false) the description discloses the upload directory restriction and lookup order, content-based format detection, MD5 dedup semantics (returns the existing record with action existing and applies only attachTo), pre-upload validation of dates and attachTo, serialized writes, edit permission requirement, and rate-limit retry delay. That is substantially more than the structured fields provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph, front-loaded with what the tool does and the upload constraint, with each sentence carrying real content. It is long, but the length is justified by the number of non-obvious behaviors; minor tightening would help readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter write tool with no output schema, the description covers return values (handle, Gramps ID, action existing), idempotency, failure modes, permissions, and cross-tool routing. Nothing an agent needs to call it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes further by explaining the relative-filePath lookup across upload dirs, the distinction between citationHandles (provenance of the file) and attachTo (where it is shown), and the duplicate-record region override behavior. Region semantics are also restated, though much of that already lives in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ("Upload a photo, document scan or PDF ... as a new media record") and names the attach targets (people, families, events, places, sources, citations). An agent can distinguish it immediately from create_records and create_note, which it explicitly rules out.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states this is the only tool that uploads a file, that create_records takes no media and a transcription belongs in create_note, and routes follow-up work to update_media and read_media. When-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_noteCreate NoteA
Create a free-text note (research notes, transcriptions, comments) of a given type. Returns the new handle, Gramps ID and type, with next steps. The note is attached to nothing yet: add its handle to the noteHandles of each person, family, event, place, source or citation it belongs to (their update tool, linkMode add). For the transcript of a cited record use type Transcript and attach the note to that citation. Change an existing note with update_note. An unknown type is rejected before anything is saved. For several new records that link to each other, such as the people, events, source and citation of one register entry, use create_records instead: one transaction, all created or none. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The note text (required). | |
| format | No | Text format: Plain (default) or Html. | Plain |
| noteType | No | Note type, default General; e.g. Research, Transcript, Person Note, Event Note, Citation. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: "types"). | General |
| isPrivate | No | Mark the note private (default false). | |
| tagHandles | No | Tags. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses that the note is created unattached, that an unknown type is rejected before anything is saved, that writes are serialized one at a time, that a Gramps Web account with edit permission on the tree is required, and that locked/rate-limited writes return a retry delay. It also states the return payload (handle, Gramps ID, type) despite 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and return value are front-loaded, then linking workflow, then alternatives and write constraints. Every sentence carries information, though the multi-clause final sentence about locking and rate limits is dense and could be split.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description names what is returned and how to use the returned handle. Combined with the attachment workflow, type validation, and concurrency/permission constraints, an agent has everything needed to call it correctly and follow up.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real semantics on top: the noteType value to use for cited-record transcripts, the validation behavior for unknown types, and the fact that the note is not auto-linked to anything. It does not elaborate on format, isPrivate or tagHandles beyond the schema, keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a free-text note') plus the content kinds it covers (research notes, transcriptions, comments) and the type parameter. It is clearly separable from update_note (change) and create_records (multi-record transactions), both of which are named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes: use update_note to change an existing note, use create_records when several new records link to each other in one transaction, and use type Transcript for the transcript of a cited record. It also states the non-obvious follow-up (attach the returned handle to noteHandles on the owning object via its update tool with linkMode add).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_personCreate PersonA
Create one person: names, gender, links to existing events with the person's role in each, families, citations, notes, media and tags, plus attributes, addresses, URLs and associations. Returns the new handle, Gramps ID and name, with next steps. Checks the tree for the same person first: someone with the same given name and surname (spelling variants, old letters, Cyrillic and Latin letters, and male, female and daughter's forms such as Novák, Nováková and Новак count as one), not the other gender, without another patronymic, and born within two years, or a child of the same parents when there are no two years to compare, stops the call with action "refused" and the possible duplicates; namesakes born up to five years apart, or without a year, are listed after the person is created. Add to an existing person with update_person; create a different person anyway with notDuplicateOf. primaryName is the main name, usually the birth name, e.g. {"given": "Ivan", "patronymic": "Petrovich", "surname": "Sidorov"}; a married name or another spelling goes in alternateNames. Events are separate records: create the Birth, Death and other events with create_event first and pass them in eventRefs, or attach them later with update_person (linkMode add). The first Birth and the first Death in the Primary role, the default, become the person's birth and death in Gramps; in another role, such as Witness, the event is only linked. familyHandles and parentFamilyHandles link the person to a family but not the family to the person: name the person in the family's fatherHandle, motherHandle or childRefs instead (create_family or update_family), which links both ways. For several new records that link to each other, such as the people, events, source and citation of one register entry, use create_records instead: one transaction, all created or none. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it. Formats of every argument: get_reference(topic: "input-guide").
| Name | Required | Description | Default |
|---|---|---|---|
| urls | No | URLs: JSON array of {type,path,desc}, or strings "Web Home: https://…" with optional " — note" after URL, or lines/| separated. A type must be a standard Gramps URL type (E-mail, Web Home, Web Search, FTP, Unknown) or a custom one the tree already uses. Grammar: gramps://input-guide. | |
| gender | No | Gender: Female, Male, or Unknown (default Unknown). | Unknown |
| addresses | No | Addresses: JSON array of Gramps address objects; or text blocks with lines like street:, city:, … (blank line or --- between addresses); or one plain line = street only. Grammar: gramps://input-guide. | |
| eventRefs | No | Existing events this person takes part in, each with a role (Primary by default; Witness, Godparent, …). Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings "HANDLE::Role" (default role: Primary on a person, Family on a family), comma/pipe/newline-separated, or a single handle. A role must be a standard Gramps role or a custom one the tree already uses; anything else is rejected with suggestions. JSON objects accept snake_case or camelCase list fields (note_list / noteList). | |
| isPrivate | No | Mark the person private (default false). | |
| attributes | No | Attributes: JSON array of objects {type,value,...}, or strings "Type: Value" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide. | |
| tagHandles | No | Tags. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| noteHandles | No | Notes. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| primaryName | Yes | Name: a plain string ("Married Name:: Jane|Smith", "Given Middle Surname") or a JSON object (not a quoted JSON string). Object fields: given (or first_name), surname (primary surname value), prefix (particle before the surname: von, de, van, del…), connector (joins compound surnames: - or y), origin_type (Gramps OriginType of that surname: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Unknown), patronymic and matronymic (each stored as a surname entry of its own with that origin), title (Dr./Prof./Sir), suffix (Jr./Sr./III/PhD), call (preferred call name), nick, famnick, type (name type: Birth Name/Married Name/Also Known As/…), name (the whole name as one string, instead of given and surname), and native Gramps fields such as surname_list for several surnames ([{surname, prefix, connector, origintype, primary}], see gramps://input-guide). Name types and origins must be standard Gramps ones or custom ones the tree already uses. camelCase forms (firstName, surnameList, originType) work too; any other field is an error, not ignored. A plain string only splits into given name and surname: use object fields for a patronymic, prefix, title and the like. | |
| mediaHandles | No | Media. Media handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {"ref":"…","region":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. | |
| familyHandles | No | Families where this person is a parent or spouse. Does not make the person the family's father or mother: use fatherHandle or motherHandle on the family for that. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| alternateNames | No | Alternate names: array of strings ("Married Name:: Jane|Smith") or name objects. Object fields, as in primaryName: given (or first_name), surname, prefix (von/de/van), connector, origin_type (Gramps OriginType: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Unknown), patronymic and matronymic (each a surname entry of its own), title, suffix (Jr./Sr./III), call, nick, famnick, type (name type), name (the whole name as one string), and native surname_list for several surnames. Name types and origins must be standard Gramps ones or custom ones the tree already uses. camelCase forms work too; any other field is an error, not ignored. Multiple names in one string: separate with newlines (not |). | |
| notDuplicateOf | No | People of the tree who are someone else, from the possible duplicates of a refused call: Gramps IDs or handles, e.g. ["I0012"]. The duplicate check passes over them. | |
| citationHandles | No | Citations. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| personAssociations | No | Person associations (handles, not Gramps IDs): JSON array of {ref, rel, ...}, or strings "PERSON_HANDLE:: Godfather" (double colon after handle). JSON objects accept rel or relationship, and snake_case or camelCase list fields (note_list / noteList). Grammar: gramps://input-guide. | |
| parentFamilyHandles | No | Families where this person is a child. Does not add the person to the family's children: use childRefs on the family for that. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (write, non-idempotent, non-destructive), the description discloses the duplicate-detection algorithm in detail — name-form folding across scripts and genders, two-year birth window, parent-child fallback, the "refused" action with candidate duplicates, and post-create namesake listing. It also discloses serialized writes, the edit-permission requirement, and rate-limit/lock backoff behavior. Slightly short of 5 only because the return payload is only summarized as "handle, Gramps ID and name, with next steps" without shape detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and duplicate-check summary are front-loaded, but the body is one very long undivided paragraph mixing duplicate policy, name semantics, event linkage, family linkage, batch alternative, write constraints and a format pointer. With 16 parameters some length is justified, yet the lack of sentence-level structure or bullet-like grouping makes it harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter create tool with no output schema, the description covers return values (handle, Gramps ID, name, next steps), the duplicate refusal path and its recovery, cross-tool prerequisites for events and families, and points to get_reference for argument grammars. Nothing an agent needs in order to call it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real meaning the schema does not: primaryName as usually the birth name with married names going to alternateNames, the rule that the first Primary-role Birth and Death become the person's vital events while other roles (Witness) are mere links, and the warning that familyHandles/parentFamilyHandles are one-directional. The worked name example further anchors the composite name object.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ("Create one person") and enumerates the aspects it accepts, then explicitly distinguishes itself from update_person, create_records, create_event and create_family. An agent can tell exactly what this tool does and what it does not do 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: add to an existing person with update_person, override the duplicate refusal with notDuplicateOf, create events first with create_event and pass eventRefs, and use create_records for several interlinked new records in one transaction. It also states the when-not case (a refused call stops creation) and the alternative for family linkage (create_family/update_family with fatherHandle/motherHandle/childRefs).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_placeCreate PlaceA
Create a new place, such as a village, parish or county, with its names, type, coordinates and the larger places that contain it. Search first: no duplicate check is made, and an existing place is changed with update_place. Build hierarchies top-down: enclosedBy takes existing places only, each with optional dates for when the place belonged there, so create the county before its villages. name, nameLang and nameDate make the primary name and alternateNames the historical or other-language ones; an undated primary name hides dated alternate names. Events point here afterwards through placeHandle on create_event or update_event. Returns the new handle and Gramps ID with the stored name, type, coordinates and enclosing places, and next steps; an unknown type or unreadable date is rejected before anything is saved. For several new records that link to each other, such as the people, events, source and citation of one register entry, use create_records instead: one transaction, all created or none. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it. Formats of every argument: get_reference(topic: "input-guide").
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees, north positive (52.2297). Text value. JSON strings are accepted; JSON numbers are also accepted and sent as text. | |
| lon | No | Longitude in decimal degrees, east positive (21.0122). Text value. JSON strings are accepted; JSON numbers are also accepted and sent as text. | |
| code | No | Place code or postal code (optional). | |
| name | Yes | Primary name (required). | |
| nameDate | No | When the primary name applies (default: always). Gramps shows the first name, primary first, whose date is empty or matches the event date, so an undated primary name hides dated alternate names: date the primary name too ("from 1937-02-10"). Dashes are spans; open "1991-" / "from 1991" are From. Unreadable dates are rejected. | |
| nameLang | No | Language code of the primary name, e.g. pl or de (optional). | |
| isPrivate | No | Mark the place private (default false). | |
| placeType | No | Place type, e.g. Country, Province, County, City, Town, Village, Hamlet, Parish. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: "types"). | |
| enclosedBy | No | Places that contain this one. Parent place refs via enclosedBy (not enclosedByHandles): handle or Gramps ID, array of them, JSON array of {ref, date?}, or shorthand "HANDLE::1920-1950" (date optional). Place dashes are spans (from…to); open "1991-" / "from 1991" are From. English months OK: "HANDLE::from 1 Oct 1929 to 27 Sep 1937". Examples: [{ref:"…", date:"1708-1927"}], "HANDLE::1991-", date "1703-1914-08-31". Unrecognized dates fail validation. Smaller region → larger region order. See get_reference(topic: "input-guide", section: "dates"). | |
| tagHandles | No | Tags. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| noteHandles | No | Notes. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| mediaHandles | No | Media. Media handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {"ref":"…","region":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. | |
| alternateNames | No | Other names: historical, other languages. Alternate place names: array of strings ("Old Name" or "Old Name::de"), simple objects {value, lang?, date?}, or JSON array. Dated example: [{value:"New York", date:"1914-08-31-1924-01-26"}] or date "from 5 Jul 1944". Place dashes are spans (from…to); open "1991-" / "from 1991" are From. Unrecognized dates fail validation (see get_reference(topic: "input-guide", section: "dates")). | |
| citationHandles | No | Citations. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic mutation profile; the description adds the specific behaviours an agent cannot infer: no duplicate check, unknown type or unreadable date rejected before anything is saved, writes serialized one at a time, edit permission required, and locked/rate-limited writes returning a wait delay. It also describes the returned handle/Gramps ID and the follow-on placeHandle linkage to create_event/update_event.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded: purpose first, then usage, then behavioral constraints, then a routing pointer to get_reference for argument formats. It is long, but proportionate to a 14-parameter mutation tool; a few clauses (naming precedence, date-span rules) echo the schema and could have been left to it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter write tool with no output schema, the description covers purpose, prerequisites (account with edit rights), failure modes (validation rejection, lock/rate limit with retry delay), return payload, and next steps. Nothing an agent needs in order to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still earns above baseline by stating cross-parameter relationships (name/nameLang/nameDate form the primary name, alternateNames is for historical or other-language names, an undated primary name hides dated alternates) and the ordering constraint on enclosedBy. Most individual format detail, however, is already in the schema, so the added value is relational rather than comprehensive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create a new place") and enumerates the substance being created: names, type, coordinates, enclosing places. It distinguishes itself from update_place and create_records by name, so the agent can separate the three create/update paths 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use rules: search first because no duplicate check exists, use update_place to modify, use create_records for several mutually-linking records in one transaction. It also gives sequencing guidance (build hierarchies top-down, create the county before its villages), which is real operational advice rather than filler.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_recordsCreate RecordsA
Create many linked records in one call: repositories, places, sources, notes, citations, events, people and families. Gramps Web saves them in one transaction, so either all are created or none, and undo_change on that transaction (get_recent_changes) removes them all again. Give a record that others link to a key and write "#key" wherever a handle is taken: a citation's sourceHandle "#src", an event's citationHandles ["#cit"], a person's eventRefs ["#birth"], a family's fatherHandle "#ivan" and childRefs ["#petr"]. Existing records are linked by handle, or by Gramps ID where the create tool accepts one. Each record takes the arguments of its create tool (create_person, create_event, …), except that people join families only through families: a new family's father, mother and children get the link back. Links from existing records to new ones, such as a new child of an existing family, are made afterwards with update_* and linkMode "add". Media and tags are not created here: create them first with create_media and create_tag. Each new person is checked for duplicates in the tree as in create_person: a possible duplicate stops the whole call with action "refused", and notDuplicateOf on that person lets it through; other record types are not checked, so search first. Up to 50 records per call; every record is checked before anything is saved, and an error names the record, e.g. people[1]. Returns each record's handle and Gramps ID. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it. Formats of every argument: get_reference(topic: "input-guide").
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | New notes; fields as in create_note. Other records link them through noteHandles. | |
| events | No | New events; fields as in create_event. People and families link them through eventRefs. | |
| people | No | New people; fields as in create_person, without familyHandles and parentFamilyHandles: name a person in a family's fatherHandle, motherHandle or childRefs instead. | |
| places | No | New places; fields as in create_place. enclosedBy may name a place of this call by "#key". | |
| sources | No | New sources; fields as in create_source. | |
| families | No | New families; fields as in create_family. They are saved after the people, which get the link back. | |
| citations | No | New citations; fields as in create_citation. Other records link them through citationHandles. | |
| repositories | No | New repositories; fields as in create_repository. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses transaction atomicity ('either all are created or none'), undo via undo_change/get_recent_changes, the duplicate-refusal behavior with the notDuplicateOf escape hatch, the 50-record cap, pre-save validation with path-style error names ('people[1]'), per-record sequential writes, and account/rate-limit requirements. This is unusually rich behavioral context; the only minor gap is that return-value shape is hinted ('each record's handle and Gramps ID') but not fully detailed, which is acceptable given the volume of other disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is front-loaded with the core verb and transaction semantics, and nearly every sentence carries needed information. It is a dense single paragraph, however, and the linking convention is explained at length; breaking it into shorter logical blocks would improve scannability without losing content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter batch tool with no output schema, the description covers atomicity, limits, error semantics, duplicate handling, linking rules, prerequisites for media/tags, and authentication/rate-limit behavior. Nothing an agent needs to invoke it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes further by explaining the cross-record linking model holistically with concrete examples (a citation's sourceHandle "#src", a family's fatherHandle "#ivan"), and by clarifying that people join families only through families rather than familyHandles. That adds meaning beyond the per-field schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource set: 'Create many linked records in one call: repositories, places, sources, notes, citations, events, people and families.' It clearly distinguishes the batch tool from the sibling create_* tools and from update_* by framing this as the single-call multi-record creator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when not to use it ('Media and tags are not created here: create them first with create_media and create_tag') and when to use alternatives ('Links from existing records to new ones ... are made afterwards with update_* and linkMode "add"'). It also tells the agent to search first for non-person records because only people are duplicate-checked.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_repositoryCreate RepositoryA
Create a repository: an archive, library, church, website or other holder of sources. Returns the new handle, Gramps ID and name, with next steps. Does not check for duplicates: look through list_objects(objectType: "repositories") first so one holder is not entered twice; change an existing repository with update_repository. Link sources to it afterwards through repositoryHandles on create_source or update_source, which also carry the call number. noteHandles and tagHandles only link existing notes and tags (create_note, create_tag); nothing else is created or changed. An unknown type is rejected before anything is saved. For several new records that link to each other, such as the people, events, source and citation of one register entry, use create_records instead: one transaction, all created or none. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Website, e.g. https://archive.example.org, stored as the repository's web home link (optional). | |
| name | Yes | Name, e.g. "State Archive in Warsaw" (required). | |
| address | No | Postal address as one line, e.g. "12 High Street, London", stored as the street of the repository's address (optional). | |
| repoType | No | Repository type, e.g. Archive, Library, Church, Web site (optional; Gramps stores Library when omitted). Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: "types"). | |
| isPrivate | No | Mark the repository private (default: false); Gramps Web hides private records from users not allowed to see them. | |
| tagHandles | No | Existing tags to link (optional); create them first with create_tag. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| noteHandles | No | Existing notes to link (optional); create them first with create_note. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations (which only declare non-readonly, non-destructive, non-idempotent, closed-world): it discloses the absence of duplicate checking, that an unknown type is rejected before any write, that noteHandles/tagHandles link only existing objects and create nothing, serialized writes, required edit permission, and lock/rate-limit failure behavior including a retry delay.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and return values are front-loaded, with constraints and alternatives following in a logical order. It is a dense single block covering a lot of ground, and a few clauses (e.g., restating that nothing else is created or changed) could be trimmed, but almost every sentence carries actionable content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 the return shape (handle, Gramps ID, name) plus next steps. For a 7-parameter mutation tool it also covers permissions, error/rejection behavior, rate limiting, and non-atomicity relative to create_records, leaving no material gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already carries parameter meaning, but the description adds cross-tool semantics the schema cannot: where the call number lives (repositoryHandles on create_source/update_source) and that notes and tags must already exist. It also points at get_reference(topic: "types") for valid repoType values, adding a discovery path beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource plus a definition of the domain object ('an archive, library, church, website or other holder of sources'), which disambiguates it from create_source, create_note, and create_records. It also states what is returned, so the agent knows the outcome shape without opening anything else.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: check list_objects(objectType: "repositories") first to avoid duplicates, use update_repository for existing records, use create_records for multi-record batches, and link sources afterwards via repositoryHandles on create_source/update_source. Both when-to-use and when-not-to-use are named with concrete alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_sourceCreate SourceA
Create a source: a book, register, archive unit or website that facts come from, with title, author, publication info and the repositories that hold it. Search for the source first: no duplicate check is made, and an existing source is changed with update_source. repositoryHandles takes existing repositories only (create_repository), each with the source's call number there. The arguments split a reference: title names the document, such as a parish register for one year; author is who made it; pubinfo is for a published work; abbrev is a short title for lists; the archive's shelf mark, such as fond, inventory and file, is the call number on repositoryHandles, with the media type (Book, Manuscript, Film, Electronic …) the archive holds it in; the page, frame or entry goes on the citation. Notes and media here describe the whole source; the scan of one entry belongs on its citation. A source alone proves nothing: cite a page or act of it with create_citation, then attach that citation to people and events. Returns the new handle, Gramps ID and title, with next steps. For several new records that link to each other, such as the people, events, source and citation of one register entry, use create_records instead: one transaction, all created or none. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it. Formats of every argument: get_reference(topic: "input-guide").
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title (required). | |
| abbrev | No | Short title for lists (optional). | |
| author | No | Author or issuing body (optional). | |
| pubinfo | No | Publication info: publisher, place, year (optional). | |
| isPrivate | No | Mark the source private (default false). | |
| attributes | No | Attributes: JSON array of objects {type,value,...}, or strings "Type: Value" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide. Each attribute takes only type, value and private. | |
| tagHandles | No | Tags. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| noteHandles | No | Notes. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| mediaHandles | No | Media. Media handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {"ref":"…","region":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. | |
| repositoryHandles | No | Repositories that hold the source, each with an optional call number and media type; the repositories must exist (create_repository). Repository refs (handles, not Gramps IDs): JSON array of GrampsRepositoryRef objects, or strings "Ref : CallNumber : MediaType". JSON objects accept Gramps snake_case (call_number, media_type) or camelCase (callNumber, mediaType). Parts after Ref are optional: "Ref : CallNumber" and "Ref :: MediaType" are valid. MediaType must be a standard Gramps source media type (Book, Manuscript, Film, Photo, …) or a custom one the tree already uses. Multiple refs: JSON array or one multiline / |-separated string. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower. Credit is due for disclosing that no duplicate check runs, that writes are serialized one at a time, that a locked or rate-limited write returns the delay to wait, and what the response contains (handle, Gramps ID, title, next steps).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded and every paragraph carries distinct content. It is dense and long, though: the repositoryHandles and media-type material overlaps the schema's own text, and the closing pointer to get_reference(topic: "input-guide") partly duplicates the gramps://input-guide reference already inside the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation with no output schema, the description covers what an agent needs: what the record represents, how the free-text arguments map onto a reference, which handles must pre-exist, the return value, and the failure modes. Nothing essential to invoking it correctly is left out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real conceptual mapping beyond the field docs: title names the document, author is who made it, pubinfo is for published works, abbrev is the list title, and the archive shelf mark (fond/inventory/file) becomes the call number carried on repositoryHandles. It also disambiguates scope, noting that notes and media here describe the whole source while the scan of one entry belongs on the citation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource and then defines the resource itself ("a book, register, archive unit or website that facts come from"), which an agent cannot get from the name alone. It also names the sibling that handles the modify case (update_source) and the batch case (create_records), so the tool is distinguishable 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and when-not: search first because no duplicate check is made, use update_source to change an existing source, use create_repository for repositories, use create_records when several interlinked records must be created atomically, and follow with create_citation. Prerequisites (edit-permitted Gramps Web account) are also stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_tagCreate TagA
Create a tag: a colored label such as "To check" or "Line of John Smith" for grouping records. Returns the new handle, Gramps ID and name, with next steps. Does not check for duplicate names: look through list_objects(objectType: "tags") first. Keep names distinct: filter rules such as HasTag (list_objects rules) find a tag by its name, and update_tag rejects a name another tag uses. The tag labels nothing yet: add its handle to the tagHandles of each record (their create or update tool, linkMode add on update). Rename or recolor it later with update_tag. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Tag name shown on records (required). | |
| color | No | Color as six hex digits RRGGBB, with or without #, e.g. FF5733; stored as #ff5733. Default 000000 (black). | 000000 |
| priority | No | Sort priority among tags in Gramps (default 0). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnly/destructive/idempotent flags; the description adds substantial non-obvious behavior: no duplicate-name check, update_tag rejects colliding names, a new tag labels nothing until its handle is added to record tagHandles, writes are serialized, and edit permission plus locked/rate-limited failure with a retry delay is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and return values, then constraints. Dense but nearly every sentence carries actionable information; the length is justified by the multi-step follow-up guidance, though it is on the longer side.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent create tool with no output schema, the description covers return values, duplicate behavior, linking workflow, renaming path, concurrency, auth, and rate-limit handling – everything an agent needs to call and follow up correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter (name, color, priority) is fully documented in the schema, so the description adds little beyond 'colored label'. Baseline 3 applies since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a tag') and immediately defines what a tag is with concrete examples, plus what the call returns (handle, Gramps ID, name). An agent can distinguish this from update_tag or list_objects 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: check list_objects(objectType: "tags") first for duplicates, use update_tag to rename/recolor, and use the record's create/update tool with linkMode add to actually attach the tag. It also states the precondition that nested filter rules find tags by name, so names must be distinct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_objectDelete ObjectADestructiveIdempotent
Delete one record; undo_change with the deletion's transaction from get_recent_changes restores it. Call it only after the user confirmed this exact record. If other records still point to it, nothing is deleted and the reply lists those backlinks by type; unlink them first with the owners' update tools, or pass force=true after a separate confirmation. Clients that support it also show the user a confirmation dialog before deleting; action: declined or cancelled means the user said no and nothing was deleted. On success returns the type, action: deleted and the handle; a missing record returns a not-found message.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | true deletes even when other records still point to it, leaving those links dangling (default false). | |
| handle | Yes | The record to delete. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| objectType | Yes | Record type: person, family, event, place, source, citation, note, media, repository or tag. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint annotation by disclosing the referential-integrity guard, the exact block-and-list-backlinks-by-type failure mode, the client-side confirmation dialog, the declined/cancelled signals, and the success and not-found responses. An agent knows the failure paths before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The effect and undo path are front-loaded, then preconditions, then failure modes, then return values. Dense but nearly every clause carries distinct, actionable information; only the return-value sentence borders on over-detail for a tool with no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 the return payload (type, action: deleted, handle) and the not-found case, and covers the destructive-mutation risk profile fully. Nothing an agent needs to call this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already defines handle, objectType, and force. The description still adds genuine meaning for force by requiring a separate confirmation before using it, tying the parameter to an approval workflow rather than just its mechanic.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Delete one record" gives a specific verb, resource, and scope, distinguishing it from the update_* siblings that modify rather than remove records. It immediately links to the restore path (undo_change via get_recent_changes), which pins down its exact effect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit preconditions are stated: only after the user confirms this exact record, and only after unlinking backlinks with the owners' update tools or passing force=true following a separate confirmation. It also tells the agent how to interpret declined/cancelled outcomes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_duplicatesFind DuplicatesARead-only
Find people entered twice in the tree: pairs with the same given name (the first word of one's among the other's, so Мария pairs with Анна Мария) and surname in any spelling (Cyrillic or Latin letters, so Мария, Марья and Maria, or Kowalski written in Cyrillic; ё and pre-reform letters, Latin accents, Polish w, sz and cz) and in the male, female or daughter's form (Kowalski and Kowalska, Novák and Nováková, Hájek and Hájková, Kazlauskas, Kazlauskienė and Kazlauskaitė, Ozols and Ozola, Papadopoulos and Papadopoulou, Kovács and Kovácsné), not of the other gender, without different patronymics, born and dead at most five years apart, and neither dead before the other was born. People with a patronymic but no surname pair by given name and patronymic when their birth years or parents can be compared. Spouses, and a person and their parent, grandparent or earlier ancestor, are never paired. Pairs born at most two years apart, or children of the same parents without two years to compare, are possible duplicates; the others are similar pairs. Each call reads every person of the tree, up to 20000, so a tree of a few thousand people takes 10 to 20 seconds. Returns how many people were compared and the pairs, possible duplicates first and then by how close the births are, numbered across pages; each person with Gramps ID, handle, birth, death and parents. Nothing changes: compare a pair with get_object, and merge it with merge_objects only after the user confirmed they are one person. create_person and create_records run the same check on the people they create; to find one name, use search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many pairs to show, 1–100 (default 20); other values are clamped. | |
| offset | No | How many pairs to skip, to show the next ones (default 0). | |
| surname | No | Only pairs where one of the people has this surname, in any spelling or form: Kowalski also finds Kowalska and Kowalski in Cyrillic letters, and Novák also finds Nováková. | |
| personHandle | No | Only pairs with this person. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint/destructiveHint=false, it states 'Nothing changes', quantifies cost (reads every person up to 20000, 10-20s on a few-thousand-person tree), and explains the result ordering (possible duplicates first, then by birth proximity) and pagination. That is exactly the operational context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and cost are front-loaded and the closing routing sentences earn their place, but the middle is one sprawling sentence padded with redundant exemplification (six-plus gendered surname pairs, multiple transliteration edge cases). Fewer examples would convey the same rule.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only scan tool with no output schema, the description covers what is compared, how results are ordered and paged, the performance ceiling, and the required follow-up workflow (verify, then merge). An agent has everything needed to call it and act on the output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so limit, offset, surname and personHandle are already fully documented, and the description adds little beyond 'numbered across pages'. The surname filter's spelling-tolerance is explained in the schema itself, so the description's long surname exposition is mostly duplicated rather than additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Find people entered twice in the tree') and immediately defines the matching semantics: given name containment, surname spelling variants, gendered surname forms, birth/death date windows, and exclusion of spouses and ancestors. It is unmistakably distinct from search, list_objects, and the create_* siblings that reuse the same check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing: use search to find a single name, compare a pair with get_object, and merge with merge_objects only after the user confirms. It also discloses that create_person and create_records run the same duplicate check, which tells the agent when this tool is redundant.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bookmarksGet BookmarksARead-only
List the records bookmarked in this tree, grouped by type (people, families, events, places, sources, citations, repositories, media, notes), each as a one-line summary with its handle. Bookmarks belong to the tree and are shared by all its users; they are set in Gramps Web or Gramps desktop, not through this server, and a tree may have none. All bookmarks come in one response, without paging: types in the order above, records in the tree's bookmark order, and a record that can no longer be read as its bare handle. Use it to start from the records the tree's users marked; to find records by name use search, to browse one type use list_objects, for recent edits use get_recent_changes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld=false/destructive=false, and the description adds substantial context beyond them: bookmarks are tree-scoped and shared across users, are written only via Gramps Web/desktop and never through this server, may be empty, and are returned unpaged in a fixed type order with unreadable records surfaced as bare handles. That covers mutation expectations, emptiness, and result shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core purpose, then behavior, then routing. Dense and mostly waste-free, though the type enumeration and ordering clause make it longer than strictly necessary for an agent that will see the actual response.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 compensates by specifying the return shape: grouped by type, one-line summaries with handles, fixed type ordering, tree bookmark order, and bare-handle fallback for unreadable records. For a zero-parameter read tool this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 nothing for the description to disambiguate. The description correctly does not invent any parameter discussion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (bookmarked records in this tree) and enumerates the grouping types. It also explicitly names the sibling alternatives (search, list_objects, get_recent_changes), 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit positive trigger ('Use it to start from the records the tree's users marked') and three explicit routing rules away from it: name lookup -> search, single-type browse -> list_objects, recent edits -> get_recent_changes. 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.
get_objectGet ObjectARead-only
Read one record in full: its fields, its links to other records, and the records that point to it (backlinks, read-only here). Use it once you know the Gramps ID or handle; to find a record by text use search, to browse a type use list_objects, and for a person's relatives or dated events get_person_tree and get_timeline are shorter. A Gramps ID names its type by prefix, so objectType is needed only with a handle, and an objectType that disagrees with the prefix is rejected rather than guessed. extended (people and families only) puts each event's date and place on its line, names the others in an event where the person is not Primary, such as a child's birth, and adds note text, tag names, citations and media in the same call. Returns plain text for one record, without paging: a header with its type, label, handle and Gramps ID, then its fields, its links one per line with label, handle and, for events, the role, and "Referenced by" sections for the backlinks. A missing record returns a not-found message with a hint.
| Name | Required | Description | Default |
|---|---|---|---|
| extended | No | People and families only: also resolve the linked records (event dates and places, note text, tag names, citations, media) in the same call; default false is faster. Rejected for other types. | |
| identifier | Yes | Gramps ID (e.g. I0001) or handle. ID prefixes give the type: I person, F family, E event, P place, S source, C citation, N note, O media, R repository, T tag. | |
| objectType | No | Record type: person, family, event, place, source, citation, note, media, repository or tag. Omit for a Gramps ID; required for a handle. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read (readOnlyHint true, destructiveHint false, closed world), yet the description still adds real behavior: backlinks are read-only here, an ID/type mismatch is rejected rather than guessed, extended is additive and limited to people and families, results come back as plain text with no paging, and a missing record yields a not-found message with a hint. That is well past what the annotations carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the routing to siblings before the finer details, and every sentence carries information — no filler. It is a dense single paragraph, though, and the return-format sentence is long enough that an agent must read carefully rather than skim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter read tool with no output schema, the description covers the remaining burden fully: input validation rules, the extended flag's scope, the shape of the plain-text return including 'Referenced by' sections, and the not-found path. Nothing an agent needs 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine interpretation: objectType is needed only with a handle because a Gramps ID prefix encodes the type, and a disagreeing objectType is rejected. It also explains what 'extended' actually yields for a person whose role in an event is not Primary, which the schema only gestures at.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Read one record in full' — and enumerates what full means: fields, links, and backlinks. It also draws a clear boundary against search, list_objects, get_person_tree and get_timeline by name, so an agent can pick 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit entry condition ('once you know the Gramps ID or handle') and names the alternatives with the conditions that select them: text lookup goes to search, type browsing to list_objects, relatives/dated events to get_person_tree and get_timeline because they are 'shorter'. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_person_treeGet Person TreeARead-only
List a person's ancestors or descendants up to 10 generations deep: one row per relative with the generation, an optional kinship label (Father's mother, Granddaughter), name, Gramps ID, birth and death with places, and handle. Ancestors follow every parent family, adoptive ones included; descendants follow the children of every family where the person is a parent, so relatives not linked that way are missing, and someone reached by two lines is listed once. generations counts steps from the person (1 = parents or children); each extra one costs another round of reads, so start with the default 3. For how two given people are related use get_relations; for dated events around one person use get_timeline; for one full record use get_object. A missing person returns a not-found message.
| Name | Required | Description | Default |
|---|---|---|---|
| person | Yes | The person to start from. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| direction | Yes | ancestors (parents, grandparents, …) or descendants (children, grandchildren, …). | |
| generations | No | How many generations to walk, 1–10 (default 3); other values are clamped. | |
| kinshipLabels | No | When true (default), add kinship text such as Father's mother or Granddaughter. When false, show only generation numbers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, non-destructive, closed-world), and the description goes well beyond them: it explains which lines are traversed, that ancestors include adoptive parent families, that relatives unlinked that way are omitted, that a person reached twice is listed once, and that each extra generation costs another round of reads. The documented not-found message is a useful error-behavior disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense and front-loaded with purpose, traversal semantics, and alternatives in that order. The first sentence is a long compound run-on, which slightly hurts readability, but no clause is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the full burden and does so: it enumerates the row fields (generation, kinship label, name, Gramps ID, birth/death with places, handle), documents traversal edge cases, cost per generation, and the missing-person response. Nothing an agent needs to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real interpretation: 'generations counts steps from the person (1 = parents or children)' clarifies what the number means, and it explains the cost implication of raising it. kinshipLabels is also described in semantic terms beyond the schema's mechanical default note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List a person's ancestors or descendants'), including the depth cap and the row-level output shape. It explicitly separates itself from get_relations, get_timeline, and get_object, so an agent can pick 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names three sibling tools with the exact condition that selects each ('for how two given people are related', 'for dated events around one person', 'for one full record'). It also recommends starting with the default 3 generations, giving concrete usage advice rather than just coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_changesGet Recent ChangesARead-only
Show the tree's recent edit history, newest first: each transaction's number, commit time (UTC), description, user, an undo marker, and each changed object's class, change kind (added/updated/deleted) and handle, with the first 10 objects of each transaction and how many more it changed. A link added or removed between objects appears as Reference from one handle to the other. limit counts transactions, not objects, and stops at the latest 100, so older history is out of reach here; list_objects with sort -change lists records by last edit instead. Use it to see what was changed last and by whom, to check that your own writes landed, or to find the number undo_change takes to revert a transaction; for the dated events of one person use get_timeline, and read a changed record with get_object.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many transactions to show, 1–100 (default 20); other values are clamped. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive, and the description adds substantial behavior beyond that: newest-first ordering, per-transaction truncation at 10 objects with a remainder count, how added/removed links are rendered as Reference, and the hard 100-transaction ceiling that puts older history out of reach.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what it returns, then scope limits, then routing to siblings — a logical order with little waste. It is a dense single block with long clauses, so it is slightly harder to scan than it could be, but nearly every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 return-shape burden and does so thoroughly: per-transaction fields, per-object fields, truncation behavior, and reference encoding. An agent has everything needed to call it and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already documents the 1–100 range, default 20, and clamping. The description still adds meaning the schema lacks: limit counts transactions, not objects, which is the key semantic an agent could get wrong.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Show the tree's recent edit history, newest first') and immediately enumerates the fields returned. It is clearly distinguishable from siblings like get_timeline (dated events for one person) and list_objects (sorted record lists).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit use cases ('check that your own writes landed', 'find the number undo_change takes') and names alternatives with the conditions that select them: list_objects with sort -change for older history, get_timeline for per-person dated events, get_object to read a changed record.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_referenceGet ReferenceARead-only
Read the server's reference for writing valid arguments; it holds no family records. Call it before a create_*, update_* or list_objects call when a date, name, link update, type or filter rule is unclear; to read the tree itself use search, list_objects or get_object. topic picks the text: input-guide (argument formats), types (valid types, with the tree's custom ones), metadata (server and tree info), name-settings (name formats, surname groups) or filter-rules (rules for list_objects, saved filters). section returns one part of a topic, e.g. topic types with section event_types; an unknown topic or section is rejected with the valid values. Returns input-guide as fixed JSON and the other topics as plain text read live from the tree. Clients that read MCP resources get the same texts at gramps://input-guide and its siblings.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Which reference: input-guide, types, metadata, name-settings or filter-rules. | |
| section | No | One part only (optional; omit for the whole topic). input-guide: dates, name_schema, link_updates, structured_fields, or one of structured_fields.names, .attributes, .urls, .addresses, .person_associations, .repository_refs. types: a category such as event_types or place_types. name-settings: formats or groups. filter-rules: a type such as people or events (its rules and values; omit for an overview). metadata has no sections. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint/openWorldHint, so the bar is low, yet the description adds real value: it documents error behavior ('an unknown topic or section is rejected with the valid values'), return formats (input-guide as fixed JSON, other topics as plain text read live from the tree), and the MCP-resource mirror (gramps://input-guide). None of that is recoverable 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and the routing rule before the topic enumeration and return-format notes. It is dense and slightly run-on, but essentially every clause carries either usage routing or parameter semantics, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 stating return formats per topic and the resource equivalent. Combined with the full parameter coverage and explicit alternatives, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 cross-parameter meaning beyond the schema: how topic and section interact ('section returns one part of a topic, e.g. topic types with section event_types') and the note that 'metadata has no sections'. This helps an agent compose valid combinations rather than repeating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read the server's reference for writing valid arguments') and immediately scopes it ('it holds no family records'), distinguishing it from the tree-reading siblings. An agent can tell this is a documentation/reference lookup, not a data fetch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit timing ('Call it before a create_*, update_* or list_objects call when a date, name, link update, type or filter rule is unclear') and names the correct alternatives for the opposite need ('to read the tree itself use search, list_objects or get_object'). When-to-use, when-not-to-use, and alternatives are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_relationsGet RelationsARead-only
Explain how two people are related, read as 'person 2 is the X of person 1' (e.g. 'third cousin twice removed', 'husband'); the order matters, and swapping handle1 and handle2 gives the inverse term, such as 'wife' instead of 'husband'. Returns both people with Gramps IDs, the closest relationship with the generations from each person to the common ancestor, then every relationship found, closest first, with its common ancestors (up to 10 by name, any more by handle), all in one response without paging. Searches blood relatives up to 15 generations plus spouses, a fixed depth. Unrelated people get a 'Not related' message, the same person twice is reported as such, and a missing person returns a not-found message. Find both people first with search. To list a whole line of ancestors or descendants use get_person_tree.
| Name | Required | Description | Default |
|---|---|---|---|
| handle1 | Yes | Person 1, the one the relationship is told from. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| handle2 | Yes | Person 2, the one whose relationship to person 1 is named. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare a safe read; the description goes well beyond by disclosing the 15-generation search depth, the 10-common-ancestor naming cap with handle fallback, no paging, and ordered results. It also enumerates edge-case behaviors (unrelated, same person twice, missing person) so the agent can interpret non-happy-path responses.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the direction rule, the most error-prone part, and every sentence carries information. It is a dense single block that would scan better as short clauses, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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: both people with Gramps IDs, the closest relationship with generation counts, then all relationships closest-first with common ancestors. Nothing an agent needs to call or interpret it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both handles are already documented, but the description adds real meaning beyond it: the order-dependence and the fact that swapping handle1/handle2 yields the inverse term ('wife' instead of 'husband'). That is genuinely useful semantics not spelled out as clearly in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('explain how two people are related') and immediately pins down the directional semantics with a concrete example ('third cousin twice removed', 'husband'). It is clearly distinguishable from lineage siblings like get_person_tree, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a prerequisite ('Find both people first with search') and an explicit alternative with its selecting condition ('To list a whole line of ancestors or descendants use get_person_tree'). An agent knows both when to reach for this tool and when not to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_timelineGet TimelineARead-only
List the events around one person, family or place in date order, grouped by decade with undated ones last: date, event type, place, and whose event it is, with Gramps IDs. Use it to check a life's sequence or gaps; for the full record use get_object, for ancestors or descendants use get_person_tree, for how two people are related use get_relations. events filters the subject's own events and relativeEvents those of the relatives chosen in relatives (person timelines only, rejected otherwise); dates narrows both. Without dates, a person timeline lists relatives' events from their whole lives, also before the person's birth and after their death; pass dates to narrow it. Place timelines are computed from direct event backlinks; child places are not included.
| Name | Required | Description | Default |
|---|---|---|---|
| dates | No | Only events in these dates, written like any date: a year (1850), month (1850-03), day, or range (1850-1860, between 1850-03 and 1851). from and to include the date, before and after leave it out: from 1850, before 1900-05-01. Other calendars are converted: 1856-07-20 (Julian). The Gramps Web form 1850/1/1-1860/12/31 also works. Approximate dates (about, estimated) are rejected. | |
| events | No | Only these event categories (omit for all): vital, family, religious, vocational, academic, travel, legal, residence, other, custom. | |
| relatives | No | Person timelines only: whose events to add: father, mother, brother, sister, wife, husband, son, daughter. | |
| identifier | Yes | The person, family or place. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| objectType | Yes | Whose timeline: person, family or place. | |
| relativeEvents | No | Person timelines only: event categories to show for those relatives, same values as events. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/destructive annotations by disclosing cross-parameter interactions and edge cases: events/relativeEvents apply only to person timelines and are 'rejected otherwise', dates narrows both, and without dates relatives' whole-life events appear including before birth and after death. It also notes place timelines derive from direct event backlinks and exclude child places.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and return shape, then layers in routing and parameter behavior. It is dense and slightly long as a single paragraph, but every sentence carries distinct, useful information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter read tool with no output schema, the description covers what the tool returns (fields and ordering), how each parameter interacts, and the key default/edge cases. Nothing an agent needs 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.
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 real cross-parameter semantics the schema cannot express: how events vs relativeEvents partition subject-vs-relative events, the rejection condition for non-person timelines, and the surprising default when dates is omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list events around a person/family/place in date order) and even specifies the grouping (by decade, undated last) and returned fields (date, event type, place, whose event, with Gramps IDs). It explicitly distinguishes itself from get_object, get_person_tree, and get_relations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('check a life's sequence or gaps') and names three alternatives with the condition that selects each ('for the full record use get_object', 'for ancestors or descendants use get_person_tree', 'for how two people are related use get_relations'). 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.
list_objectsList ObjectsARead-only
List the records of one type a page at a time, optionally filtered and sorted: one line per record (Gramps ID, summary, handle) with the page and total count. Use it to browse a type, fetch one Gramps ID, list a source's citations (sourceHandle), filter by field values (gql) or select by relationships with Gramps filter rules (rules), such as a person's ancestors or people with no family links. To find records by text use search; to read one record in full use get_object. rules run first and gql must then also match; grampsId cannot be combined with rules. Filtering runs on the Gramps Web server: invalid gql returns its error, invalid rules are explained, and an ID, tag or saved filter the tree lacks matches nothing instead of failing.
| Name | Required | Description | Default |
|---|---|---|---|
| gql | No | Filter in Gramps Query Language, run on the server: field = value with a single = (not ==), also !=, <, <=, >, >=, ~ (contains), !~, and, or and parentheses; text goes in double quotes. Types are numbers, not names, e.g. event type.value = 12 Birth, 13 Death, 1 Marriage, 15 Baptism, 19 Burial. Examples: gender = 1 (male), primary_name.first_name = "Anna", media_list.length >= 1 (optional). | |
| page | No | Page number, from 1 (default 1). | |
| sort | No | Field to sort by, e.g. gramps_id; a leading - sorts descending, e.g. -change for latest edits first (optional). | |
| rules | No | Gramps filter rules, run on the server before gql (a record must match both): {"function": "and" (default), "or" or "one", "invert": true to keep the records that do not match, "rules": [{"name": rule, "values": [one per label of the rule, in order]}]}, or just the array of rules. Values are Gramps IDs (I0001), text, numbers or true/false. An item of rules can be a nested filter of the same form; with "namespace" (Event, Family, Person, Place, Source or Repository) it matches the records each listed one links to, e.g. people by their events. Examples: people with no family links {"rules": [{"name": "Disconnected"}]}; people not related to I0001 {"invert": true, "rules": [{"name": "IsRelatedWith", "values": ["I0001"]}]}; a saved filter {"name": "MatchesFilter", "values": ["its name"]}. Rules of each type and their values: get_reference(topic: "filter-rules", section: type). Not for tags (optional). | |
| grampsId | No | Only the record with this Gramps ID, e.g. I0001 (not a handle; optional). | |
| pagesize | No | Records per page, 1–100 (default 20). | |
| objectType | Yes | Which records to list: people, families, events, places, sources, citations, repositories, notes, media or tags. | |
| sourceHandle | No | With objectType citations only: list just the citations of this source; combined with gql by and (optional). Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds substantial behavioral context beyond annotations: server-side filtering behavior, that invalid gql returns its error, invalid rules are explained, and missing IDs/tags/saved filters match nothing rather than failing, plus the interaction order 'rules run first and gql must then also match.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and output format, then proceeds to use cases, alternatives, and caveats. It is dense but every sentence carries actionable information for an 8-parameter tool; minor length is justified by the behavioral constraints it discloses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 the return format ('one line per record ... with the page and total count'). It covers filtering mechanics, error handling, parameter interactions, and use-case routing, leaving no critical gaps for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter thoroughly, giving a baseline of 3. The description adds value by explaining cross-parameter interactions not present in the schema, such as 'rules run first and gql must then also match' and 'grampsId cannot be combined with rules.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List the records of one type a page at a time, optionally filtered and sorted,' and immediately gives the output shape (Gramps ID, summary, handle, page, total count). It distinguishes itself from siblings by naming search for text lookup and get_object for full-record reads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It enumerates concrete use cases (browse a type, fetch one Gramps ID, list a source's citations, filter with gql, select by relationships with rules) and explicitly routes agents to alternatives: 'To find records by text use search; to read one record in full use get_object.' It also states a key exclusion: 'grampsId cannot be combined with rules.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_objectsMerge ObjectsADestructiveIdempotent
Merge a duplicate into the record to keep when both describe the same person, family, event, place, source, citation, note, media object or repository: Gramps Web moves the duplicate's details and every link to it onto the kept record and deletes the duplicate, all in one transaction. Call it only after the user confirmed that the two records are the same; read both with get_object first, and find candidates with search or list_objects. The kept record keeps its own fields: a person's primary name, gender, birth and death, an event's type, date, place and description, a source's title, a citation's page, date and source, a note's text, a media object's file. The duplicate's name becomes an alternate name of the kept person or place, and its events, children, parents, notes, citations, media, attributes and tags are added. Merging two people also merges a family the duplicate had with the same partner (mergeFamilies); merging two families merges their different fathers into one person and their different mothers into one person. Gramps refuses to merge spouses or a parent with their child, and tags cannot be merged. Clients that support it show the user a confirmation dialog first; action declined or cancelled means nothing changed. Returns action merged with the kept and deleted records and the transaction number: undo_change with it restores the duplicate.
| Name | Required | Description | Default |
|---|---|---|---|
| keepHandle | Yes | The record that stays and keeps its own fields. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| objectType | Yes | Type of both records: person, family, event, place, source, citation, note, media or repository. | |
| fatherHandle | No | Families only: the father who stays when the two families name different fathers, who then become one person. The father of either family; default is the kept family's father, or the duplicate's when the kept family has none. | |
| motherHandle | No | Families only: the mother who stays when the two families name different mothers, who then become one person. The mother of either family; default is the kept family's mother, or the duplicate's when the kept family has none. | |
| mergeFamilies | No | People only: true (default) also merges a family the duplicate had with the same partner as one of the kept person's families; false keeps both families. Ignored for other types. | |
| duplicateHandle | Yes | The duplicate: its details and links move to the kept record, then it is deleted. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint and idempotentHint annotations, the description explains exactly what is moved, what is kept, what is deleted, and that the operation occurs in one transaction. It further discloses family-merge nuances, refusal cases, confirmation-dialog behavior, and how undo_change can restore the deleted duplicate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded, starting with the core action and scope before moving into prerequisites, behavioral details, and return values. Despite its length, every sentence carries operational information relevant to a destructive merge tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, multi-type merge operation with no output schema, the description covers purpose, prerequisites, edge cases, return shape, and undo behavior. An agent has enough information to decide when to call it and what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 useful semantic context: keepHandle and duplicateHandle are tied to which record keeps its fields versus which is moved and deleted, and mergeFamilies/fatherHandle/motherHandle behavior is elaborated. It stops short of adding new parameter-specific syntax or constraints beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: merge a duplicate into the record to keep, with an explicit list of supported Gramps object types. It clearly distinguishes this operation from update/delete siblings by describing the one-transaction move-and-delete behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: only after user confirmation that the records are the same, after reading both with get_object, and after finding candidates with search or list_objects. It also names conditions where merging is refused, such as spouses or parent-child pairs, and notes that tags cannot be merged.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_mediaRead MediaARead-only
Download a media file's bytes so you can see it. Default mode thumbnail renders a JPEG preview (PNG when transparent) from an image original as MCP image content, 1568 pixels on the long edge unless size is given; EXIF and other metadata are stripped. Prefer it for reading photos and document scans; region shows one part of an image, as a media link with that region does. Use mode file only when the original is needed: returns image, audio, or embedded blob resource content according to MIME type. Requires GRAMPS_MEDIA_RESOURCES_ENABLED=true and respects size and private-record safeguards. For the media record itself (path, description, links) use get_object; to change it use update_media.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Download mode: thumbnail | file. Default thumbnail. Use file only when a preview is insufficient. | thumbnail |
| size | No | Thumbnail long edge in pixels, 1 to 4096; default 1568, which keeps handwriting and small print legible. Use 512 or less for a quick look at photos. Images are never upscaled. Only valid for mode thumbnail; omit for mode file. | |
| handle | Yes | The media object to show. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| region | No | Show only this part of the image, at up to size pixels on its long edge: [left, top, right, bottom] in percent of the image width and height, 0 to 100, from the top-left corner, as stored on a media link. Use it to check a region before saving it in mediaHandles or attachTo, or to read one record on a page scan. Only valid for mode thumbnail. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read (readOnlyHint=true, destructiveHint=false), and the description adds real context beyond them: the GRAMPS_MEDIA_RESOURCES_ENABLED=true prerequisite, EXIF/metadata stripping, no upscaling, and respect for size and private-record safeguards. It also discloses the differing return shapes per mode (MCP image content vs media link vs blob resource by MIME).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and default mode, and every clause carries information (mode selection, output type, prerequisites, siblings). It is dense with semicolons and a few clauses restate schema details, which slightly blurs the structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only media fetch with no output schema, the description covers the key unknowns: what content type is returned per mode and MIME, the environment flag required, metadata stripping, and where to go for the record itself or for modification. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already carries most semantics, but the description adds decision-level rationale: region is for verifying a crop before saving it, and the default 1568 size is chosen to keep handwriting and small print legible. Some of this overlaps the schema text (e.g., 1568px long edge, 512 for a quick look), so the added value is moderate rather than decisive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete verb+resource ('Download a media file's bytes') and immediately states the default behavior (JPEG thumbnail preview, PNG when transparent, 1568px long edge). It explicitly distinguishes itself from get_object (media record metadata) and update_media (changing it), so an agent can route correctly without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: prefer thumbnail for reading photos and document scans, use region to check a part of an image before persisting it in mediaHandles or attachTo, and use mode file only when the original is needed. It also names the alternatives for adjacent needs (get_object, update_media) and the search/list_objects route to find a handle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearchARead-only
Find records by words in them: one query across people, families, events, places, sources, citations, repositories, notes, media and tags. Start here when you have a name, place, title or other text but no Gramps ID; to browse or filter one type by its fields (all people, citations of one source, sorted by change) use list_objects, and to read a hit in full pass its Gramps ID or handle to get_object. Add * to a word to match any ending (Smith* also finds Smithson). There is no type filter: hits of all types come ranked by relevance, and page and pagesize (up to 100) step through them. Returns one line per hit (type, Gramps ID, summary, handle) with the page and total count; a page past the end says so with the total. Very long queries can fail on the server (HTTP 500): retry with one shorter term.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, from 1 (default 1). | |
| query | Yes | Words to find; * matches any ending. Examples: Smith*, John, Dublin*, a register title. | |
| pagesize | No | Hits per page, 1–100 (default 20). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive/closed-world, and the description still adds substantial behavior: results are ranked by relevance across all types with no type filter, pagination semantics including the past-the-end response, the exact return shape (type, Gramps ID, summary, handle plus page and total), and a concrete failure mode (HTTP 500 on long queries) with a retry strategy.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and routing before mechanics, and every sentence carries information — wildcard syntax, result shape, pagination edge case, error recovery. It is dense and slightly long for a search tool, but there is no filler to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 describing the return line format, the page/total count, and the empty-page behavior. Combined with the error-recovery note, an agent has everything needed to call this correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes further by explaining that page/pagesize step through ranked hits and that pagesize caps at 100, and by framing query as free text with wildcard endings. Much of the wildcard and range detail duplicates the schema's own parameter descriptions, so the added meaning is real but modest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find records by words in them') and immediately scopes it as one query across ten named object types. It explicitly distinguishes itself from list_objects (browse/filter one type) and get_object (read a hit in full), so an agent can route 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit entry condition ('Start here when you have a name, place, title or other text but no Gramps ID') and names both alternatives with the conditions that select them: list_objects for browsing/filtering by fields, get_object for reading a hit by ID or handle. When-not guidance is implicit in 'there is no type filter'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_changeUndo ChangeADestructive
Undo one transaction listed by get_recent_changes: records it added are deleted, records it updated get their earlier version back, and records it deleted are restored with the same handles and Gramps IDs. The undo is one new all-or-nothing transaction, which get_recent_changes lists and undo_change can revert in turn. Call it only after the user confirmed that transaction; dryRun lists the effects and conflicts without changing anything. A conflict stops the undo with nothing changed: a record changed again later, a record to be deleted that other records now link to, or an earlier version linking a record that no longer exists. Undo the later transactions first, newest first, or pass force=true after a separate confirmation. Clients that support it also show the user a confirmation dialog before undoing; action declined or cancelled means the user said no. Returns action undone, checked, refused or pending, the records affected and the undo's own transaction number.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | true undoes despite conflicts, overwriting later changes to these records and possibly leaving links dangling; only after a separate confirmation (default false). | |
| dryRun | No | true only lists what the undo would change and its conflicts, writing nothing (default false). | |
| transactionId | Yes | The transaction to undo: the number shown as [transaction: N] by get_recent_changes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Well beyond the destructiveHint/openWorldHint annotations, it discloses that the undo is a single all-or-nothing transaction that is itself reversible, enumerates the three conflict classes that abort with nothing changed, and explains the client-side confirmation dialog and what a declined action means. It even lists the returned action states (undone, checked, refused, pending).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Effects are front-loaded and the progression (what it does → confirmation requirement → conflicts → ordering/force → return values) is logical. It runs long at roughly six sentences and the trailing sentence on return states plus the client-dialog aside are somewhat stacked, but each carries distinct operational information rather than repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 return values; for a destructive, non-idempotent mutation it covers reversibility, atomicity, conflict failure modes, escape hatches (dryRun, force), and required user confirmation. An agent has everything needed to invoke it safely without trial and error.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds real value by explaining what conflict conditions force overrides and why a separate confirmation is required, plus that dryRun reports conflicts without writing. It does not add format or syntax detail for transactionId beyond the schema's pointer to get_recent_changes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Undo one transaction listed by get_recent_changes') and then spells out the exact effects: added records deleted, updated records reverted, deleted records restored. An agent can distinguish this from every sibling, including get_recent_changes, which it explicitly references as the source of the transaction ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions ('Call it only after the user confirmed that transaction') and an ordering rule for conflicts ('Undo the later transactions first, newest first, or pass force=true after a separate confirmation'). It also names the alternative for inspection (dryRun) and the sibling that supplies the input, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_citationUpdate CitationADestructiveIdempotent
Change an existing citation's source, page, date, confidence, attributes or links to notes, media and tags. Which people, events and other records it supports is stored on them: attach or detach it with their update tool (citationHandles), not here. A change shows on every record that cites it: to cite another page or entry for one record, create a new citation with create_citation; to remove one, delete_object. sourceHandle moves the citation to another source, an empty string clears date, and attributes replace the whole list whatever linkMode says. Pass only what changes; omitted arguments stay as they are. Link lists (…Handles, …Refs) follow linkMode: replace (default) sets the whole list, add appends, remove drops the given handles; in replace mode [] REMOVES every link of that kind, though the linked records themselves stay in the tree. Returns the handle and Gramps ID; a missing citation returns a not-found message. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it. Formats of every argument: get_reference(topic: "input-guide").
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | New date. Omit to keep the current date; pass an empty string to remove it. Date text: 1856-07-20, 1920-05, 1920, 1 Jul 1919, about/before/after 1920, 1800-1850, between … and …; append the calendar for other calendars, e.g. 1856-07-20 (Julian). Unreadable dates are rejected. | |
| page | No | New page, act or entry number. Omit to leave unchanged. Text value. JSON strings are accepted; JSON numbers are also accepted and sent as text. | |
| handle | Yes | The citation to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| linkMode | No | How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata. | replace |
| isPrivate | No | true makes the record private, false public. Omit to leave unchanged. | |
| attributes | No | Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings "Type: Value" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide. Each attribute takes only type, value and private. | |
| confidence | No | New confidence: Very Low, Low, Normal, High or Very High. Omit to leave unchanged. | |
| tagHandles | No | Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| noteHandles | No | Notes. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| mediaHandles | No | Media. Omit to keep; applied per linkMode. Media handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {"ref":"…","region":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. A plain handle keeps the region its link has. In add mode a media already shown keeps its link and takes the region given; to show two regions of one image, list it twice, each with its region. | |
| sourceHandle | No | Another source to cite instead. Omit to leave unchanged. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructive/idempotent annotations: it warns that replace mode with [] deletes every link of that kind while the linked records survive, that attributes always replace wholesale regardless of linkMode, that edits propagate to every citing record, and that writes serialize and need edit rights with a retry delay on lock/rate-limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and dense with real content, but it repeats several facts already carried in the schema (empty string clears date, sourceHandle semantics, linkMode rules) and packs four distinct topics into a single paragraph. Trimming the duplicated clauses would make it easier to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter destructive mutation with no output schema, it covers everything an agent needs: return value (handle and Gramps ID), not-found behavior, auth/rate-limit failure mode, partial-update defaults, and where to find argument formats.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, yet the description adds cross-parameter meaning the per-property docs cannot: omitted arguments are preserved, empty string clears date, sourceHandle relocates the citation, and linkMode governs all …Handles lists. It largely restates schema-level detail (region, handle formats) rather than extending it, keeping it below a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus the exact field set it can change (source, page, date, confidence, attributes, note/media/tag links). It also distinguishes citation-level editing from the record-side citationHandles path, so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternatives and the conditions that select them: use a record's update tool for attaching/detaching support links, create_citation to cite another page for one record, delete_object to remove. It also states the out-of-scope case inline ('not here').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_eventUpdate EventADestructiveIdempotent
Change an existing event's type, date, place, description, attributes or links to citations, notes, media and tags; everyone who shares the event sees the change. Who takes part is not set here: add or remove the event in a person's or family's eventRefs with update_person or update_family, which also hold each participant's role. For a new event use create_event; to remove one, delete_object. An empty string clears date, and attributes replace the whole list whatever linkMode says. Pass only what changes; omitted arguments stay as they are. Link lists (…Handles, …Refs) follow linkMode: replace (default) sets the whole list, add appends, remove drops the given handles; in replace mode [] REMOVES every link of that kind, though the linked records themselves stay in the tree. Returns the handle and Gramps ID; a missing event returns a not-found message, and an unknown type or unreadable date is rejected before anything is saved. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it. Formats of every argument: get_reference(topic: "input-guide").
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | New date. Omit to keep the current date; pass an empty string to remove it. Date text: 1856-07-20, 1920-05, 1920, 1 Jul 1919, about/before/after 1920, 1800-1850, between … and …; append the calendar for other calendars, e.g. 1856-07-20 (Julian). Unreadable dates are rejected. | |
| handle | Yes | The event to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| linkMode | No | How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata. | replace |
| eventType | No | New event type. Omit to leave unchanged. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: "types"). | |
| isPrivate | No | true makes the record private, false public. Omit to leave unchanged. | |
| attributes | No | Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings "Type: Value" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide. | |
| tagHandles | No | Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| description | No | New description. Omit to leave unchanged. | |
| noteHandles | No | Notes. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| placeHandle | No | New place. Omit to leave unchanged. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| mediaHandles | No | Media. Omit to keep; applied per linkMode. Media handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {"ref":"…","region":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. A plain handle keeps the region its link has. In add mode a media already shown keeps its link and takes the region given; to show two regions of one image, list it twice, each with its region. | |
| citationHandles | No | Citations. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations confirm destructiveHint=true, idempotentHint=true, and openWorldHint=false, and the description adds substantial context beyond them: shared visibility of changes, empty-string clearing, attributes replacing the whole list, [] removing all links in replace mode while linked records remain in the tree, not-found and validation error behavior, one-write-at-a-time serialization, edit-permission requirement, and rate-limit retry guidance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and scope, then layers routing, linkMode semantics, error behavior, and auth/rate-limit notes. It is dense but every sentence carries useful information; the input-guide pointer at the end is a minor extra.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, alternatives, mutation semantics, error outcomes, permissions, concurrency, and rate limiting for a 12-parameter destructive update. With no output schema, it still states the return value (handle and Gramps ID) and error cases, so an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter in detail. The description still adds cross-cutting meaning not repeated per-parameter: omitted arguments stay as-is, empty string clears date, attributes replace regardless of linkMode, and replace-mode [] removes every link of that kind while keeping linked records.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Change) and resource (existing event) and enumerates exactly which fields can change: type, date, place, description, attributes, links to citations/notes/media/tags. It also explicitly distinguishes scope from sibling operations by naming create_event and delete_object.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes participation changes to update_person/update_family eventRefs, creation to create_event, and deletion to delete_object. It also states the replace/add/remove linkMode semantics and notes that attributes ignore linkMode, which is guidance an agent would otherwise have to guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_familyUpdate FamilyADestructiveIdempotent
Change an existing family's father, mother, relationship type, children, family events, attributes or links to citations, notes, media and tags. For a new family use create_family; to remove one, delete_object. To add one child, pass it in childRefs with linkMode add; in replace mode childRefs must hold every child the family keeps. attributes replace the whole list whatever linkMode says, and sort reorders children, events, citations or media by date without changing which are linked. Pass only what changes; omitted arguments stay as they are. Link lists (…Handles, …Refs) follow linkMode: replace (default) sets the whole list, add appends, remove drops the given handles; in replace mode [] REMOVES every link of that kind, though the linked records themselves stay in the tree. Gramps Web keeps the people's side in step in the same save: a new father, mother or child gets the family on their record, and one replaced or removed loses it; a father, mother or new child that does not exist makes it refuse the change, and nothing is saved. Returns a short header with the type, action updated, handle and Gramps ID, not the changed family: read it back with get_object. A missing family returns a not-found message. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it. Formats of every argument: get_reference(topic: "input-guide").
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Lists to put in date order after the other changes: JSON array ["Events","Citations"] or one string such as "Events | Citations"; names are case-insensitive. Links are only moved, keeping their roles and other metadata; alone it sorts the stored lists. Omit to keep the order (linkMode add appends at the end). Lists: Events, Children, Citations, Media. Events: by event date; undated Birth, Baptism and Christening go first and other undated events last, ending with Death, then Burial and Cremation. On the same date: "before" dates, then Residence and Occupation, Birth, Baptism, other events, Death, Burial, then "after" dates. Children: by birth date, else baptism or christening date. Citations and Media: by their own date. Undated children, citations and media go last; equal dates keep their order. | |
| handle | Yes | The family to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| linkMode | No | How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata. | replace |
| childRefs | No | Children with their relations to the parents. In replace mode the list must hold every child the family keeps. Omit to keep; applied per linkMode. Child references (handles, not Gramps IDs): JSON array of {ref, frel, mrel}, strings "HANDLE::RelType" (sets both frel and mrel; default: Birth), comma/pipe/newline-separated, or a single handle. A relation must be a standard Gramps one (Birth, Adopted, Stepchild, Sponsored, Foster, Unknown, None) or a custom one the tree already uses. JSON objects accept snake_case (frel, mrel, tag_list) or camelCase (fatherRel, tagList, etc.). | |
| eventRefs | No | Family events (Marriage, Divorce, …). Omit to keep; applied per linkMode. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings "HANDLE::Role" (default role: Primary on a person, Family on a family), comma/pipe/newline-separated, or a single handle. A role must be a standard Gramps role or a custom one the tree already uses; anything else is rejected with suggestions. JSON objects accept snake_case or camelCase list fields (note_list / noteList). | |
| isPrivate | No | true makes the record private, false public. Omit to leave unchanged. | |
| attributes | No | Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings "Type: Value" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide. | |
| tagHandles | No | Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| noteHandles | No | Notes. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| fatherHandle | No | New father. Omit to leave unchanged. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| mediaHandles | No | Media. Omit to keep; applied per linkMode. Media handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {"ref":"…","region":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. A plain handle keeps the region its link has. In add mode a media already shown keeps its link and takes the region given; to show two regions of one image, list it twice, each with its region. | |
| motherHandle | No | New mother. Omit to leave unchanged. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| citationHandles | No | Citations. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| relationshipType | No | Relationship type (Married, Unmarried, Civil Union, Unknown). Omit to leave unchanged. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: "types"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds substantial behavior beyond them: Gramps Web updates the people's reciprocal records in the same save, a nonexistent father/mother/child aborts the entire change with nothing saved, writes are serialized and require tree-edit permission, and locked or rate-limited writes report a retry delay. It also discloses that the return value is only a short header rather than the changed object, directing the caller to get_object.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded: purpose first, then alternatives, then linkMode rules, then side effects and return behavior. Nearly every sentence carries non-obvious operational information, though a few points (linkMode semantics, attributes replacing regardless of linkMode) are restated from the schema descriptions and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description states exactly what comes back (type, action, handle, Gramps ID) and how to retrieve the changed family, and it covers missing-handle and rate-limit failure modes. For a destructive, 14-parameter mutation tool, nothing an agent needs in order to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema carries the per-parameter detail and the baseline is 3. The description still adds cross-parameter semantics the schema cannot easily express: linkMode governs all handle/ref lists uniformly, [] in replace mode removes every link of that kind without deleting the linked records, attributes always replace regardless of linkMode, and sort reorders without changing membership.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb and resource ('Change an existing family's') and enumerates the mutable facets: father, mother, relationship type, children, events, attributes and link lists. It immediately distinguishes itself from create_family and delete_object, so an agent can route without consulting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use and when-not-to-use guidance by naming create_family and delete_object as alternatives, and it explains the linkMode choice (replace default, add appends, remove drops) plus the special rule that attributes always replace. The 'pass only what changes; omitted arguments stay as they are' sentence resolves the main ambiguity for a 14-parameter update tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_mediaUpdate MediaADestructiveIdempotent
Change an existing media record's description, date, attributes or links to notes, tags and citations, or replace its file with filePath from the server's upload folder (GRAMPS_MEDIA_UPLOAD_DIRS). attachTo shows the media on people, families, events, places, sources or citations, whole or as a region; to take it off a record, use that record's update tool with mediaHandles and linkMode remove. For a new media record use create_media; to remove one, delete_object. Pass only what changes; omitted arguments stay as they are. Link lists (…Handles, …Refs) follow linkMode: replace (default) sets the whole list, add appends, remove drops the given handles; in replace mode [] REMOVES every link of that kind, though the linked records themselves stay in the tree. Returns the handle and Gramps ID; a missing media object returns a not-found message, and an unreadable date or file is rejected before anything is saved. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it. Formats of every argument: get_reference(topic: "input-guide").
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | New date. Omit to keep the current date; pass an empty string to remove it. Date text: 1856-07-20, 1920-05, 1920, 1 Jul 1919, about/before/after 1920, 1800-1850, between … and …; append the calendar for other calendars, e.g. 1856-07-20 (Julian). Unreadable dates are rejected. | |
| handle | Yes | The media object to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| attachTo | No | Records to show the media on, each getting a link after its existing media: Gramps IDs (I0001, F0001, E0001, P0001, S0001, C0001) or handles of people, families, events, places, sources or citations. JSON array, one value, or a comma-separated string. To show only part of the image, such as one record on a page scan, give an object {"ref":"I0001","region":[left, top, right, bottom]} in place of the ID. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. A record already showing the media keeps its link and takes the region; list a record twice to show two regions. Check a region with read_media first. Not affected by linkMode. | |
| filePath | No | Replace the stored file with this one: an absolute path inside an upload folder, ~/…, or a name relative to the folder. Accepts JPEG, PNG, GIF, WebP, TIFF, BMP or PDF, judged by content; a file another media record already holds is rejected. Omit to keep the file. | |
| linkMode | No | How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata. | replace |
| isPrivate | No | true makes the record private, false public. Omit to leave unchanged. | |
| attributes | No | Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings "Type: Value" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide. | |
| tagHandles | No | Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| description | No | New description (caption). Omit to leave unchanged. | |
| noteHandles | No | Notes. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| citationHandles | No | Citations. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (destructive, idempotent), but the description adds substantial behavioral context the annotations cannot convey: serialized writes, Gramps Web edit authorization, locked/rate-limited failures with retry delay, not-found messaging, pre-save rejection of bad dates/files, and the critical []-removes-all-links semantics in replace mode.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then alternatives, then behavioral rules, with dense semicolon-separated clauses and no filler sentences. It is long, but for an 11-parameter mutation tool nearly every clause carries load; only minor overlap with the already-verbose schema descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema it still states the return value (handle and Gramps ID), error paths, auth requirements, concurrency and retry behavior, and links to the input-format reference. For an 11-param destructive tool, nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 body adds cross-parameter semantics the schema states only locally: linkMode governs all link lists but not attributes/names/URLs, attachTo is exempt from linkMode, and empty lists clear only in replace mode. That interaction detail is genuine added meaning over per-field schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Change an existing media record") and enumerates the changeable facets: description, date, attributes, links, file replacement. It explicitly names the sibling alternatives create_media and delete_object, so the agent can route without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and when-not-to-use: create_media for a new record, delete_object to remove one, and the specific alternative ("that record's update tool with mediaHandles and linkMode remove") to detach from a parent record. It also states which knobs affect which lists ("Does not affect attributes...").
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_noteUpdate NoteADestructive
Change an existing note: its text, type, format, tags or private flag. text replaces the whole body. For a long note, replaceText with withText changes one fragment and appendText adds to the end: both work on the body as stored now and keep the rest of it, styling and links included. Pass only what changes; omitted arguments stay as they are. Link lists (…Handles, …Refs) follow linkMode: replace (default) sets the whole list, add appends, remove drops the given handles; in replace mode [] REMOVES every link of that kind, though the linked records themselves stay in the tree. Returns the handle and Gramps ID; a missing note returns a not-found message. Which records the note is attached to is stored on them (their noteHandles), not here. For a new note use create_note; to remove one, delete_object. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | New text, replacing the whole body; changed text loses the styling and links of the old one, the same text keeps them. Omit to leave unchanged. | |
| format | No | Plain or Html. Omit to leave unchanged. | |
| handle | Yes | The note to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| linkMode | No | How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata. | replace |
| noteType | No | New note type. Omit to leave unchanged. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: "types"). | |
| withText | No | The text to put in place of replaceText; an empty string deletes the fragment. | |
| isPrivate | No | true makes the record private, false public. Omit to leave unchanged. | |
| appendText | No | Text to add at the end of the body, on a new line: a line break is put in between unless the body already ends with one, so start with a line break to leave an empty line. The rest of the body, styling and links included, is kept. Cannot be combined with text. | |
| tagHandles | No | Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| replaceText | No | A fragment of the body to replace with withText, copied exactly as stored, spaces, line breaks and letter case included. It must occur once: include enough of the surrounding text to make it unique. The rest of the body, styling and links included, is kept. Applied before appendText; cannot be combined with text. |
TDQS
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 substantial behavior beyond them: writes run one at a time, auth requirement for editing, lock/rate-limit failure mode with retry delay, return value (handle + Gramps ID) and not-found behavior, and the critical '[] in replace mode REMOVES every link of that kind while linked records stay in the tree'. It also clarifies that attachment records live on the referencing object, not the note.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then systems of behavior, then sibling routing, then operational caveats. It is long (8+ sentences) and dense, but nearly every sentence carries non-redundant information for a 10-parameter mutation tool; minor trimming of linkMode restatement is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 compensates by stating the return value and the not-found case. Combined with auth, concurrency, rate-limit and link-mode semantics, an agent has everything needed to invoke this destructive update correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 cross-parameter semantics the schema documents only piecemeal: replaceText is applied before appendText, the three body-editing params are mutually exclusive, omitted args are left unchanged, and empty link lists only clear in replace mode. This ties the 10 parameters together rather than restating them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Change an existing note') and enumerates the changeable fields (text, type, format, tags, private flag). It also explicitly names the sibling boundaries: 'For a new note use create_note; to remove one, delete_object.' An agent can distinguish this from create_note/update_* siblings 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use routing: use create_note for a new note, delete_object for removal, replaceText/appendText instead of text for long notes, and only pass changed arguments. It also states the operational precondition (Gramps Web account allowed to edit the tree) and the retry behavior on locked/rate-limited writes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_personUpdate PersonADestructiveIdempotent
Change an existing person's names, gender, attributes, addresses, URLs, associations or links to events, families, citations, notes, media and tags. For a new person use create_person; to remove one, delete_object. Links live on one side: an event joins this person here through eventRefs (linkMode add) with the person's role, not on the event; to make the person a child, add them to the family's childRefs with update_family. alternateNames, attributes, addresses and urls replace their whole lists whatever linkMode says; sort reorders events, families, citations or media by date without changing which are linked. Pass only what changes; omitted arguments stay as they are. Link lists (…Handles, …Refs) follow linkMode: replace (default) sets the whole list, add appends, remove drops the given handles; in replace mode [] REMOVES every link of that kind, though the linked records themselves stay in the tree. Returns the handle and Gramps ID; a missing person returns a not-found message. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it. Formats of every argument: get_reference(topic: "input-guide").
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Lists to put in date order after the other changes: JSON array ["Events","Citations"] or one string such as "Events | Citations"; names are case-insensitive. Links are only moved, keeping their roles and other metadata; alone it sorts the stored lists. Omit to keep the order (linkMode add appends at the end). Lists: Events, Families, Citations, Media. Events: by event date; undated Birth, Baptism and Christening go first and other undated events last, ending with Death, then Burial and Cremation. On the same date: "before" dates, then Residence and Occupation, Birth, Baptism, other events, Death, Burial, then "after" dates. Families (this person's marriages and other unions): by the Marriage date, else another marriage event (Engagement, Marriage Banns, …), else the earliest birth of a child. Citations and Media: by their own date; Gramps shows the first media as the person's picture, so sorting Media can change it. Undated families, citations and media go last; equal dates keep their order. | |
| urls | No | URLs. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. URLs: JSON array of {type,path,desc}, or strings "Web Home: https://…" with optional " — note" after URL, or lines/| separated. A type must be a standard Gramps URL type (E-mail, Web Home, Web Search, FTP, Unknown) or a custom one the tree already uses. Grammar: gramps://input-guide. | |
| gender | No | Gender: Female, Male, or Unknown. Omit to leave unchanged. | |
| handle | Yes | The person to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| linkMode | No | How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata. | replace |
| addresses | No | Addresses. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Addresses: JSON array of Gramps address objects; or text blocks with lines like street:, city:, … (blank line or --- between addresses); or one plain line = street only. Grammar: gramps://input-guide. | |
| eventRefs | No | Events this person takes part in, with roles. In replace mode the list must hold every event the person keeps. Omit to keep; applied per linkMode. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings "HANDLE::Role" (default role: Primary on a person, Family on a family), comma/pipe/newline-separated, or a single handle. A role must be a standard Gramps role or a custom one the tree already uses; anything else is rejected with suggestions. JSON objects accept snake_case or camelCase list fields (note_list / noteList). | |
| isPrivate | No | true makes the record private, false public. Omit to leave unchanged. | |
| attributes | No | Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings "Type: Value" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide. | |
| tagHandles | No | Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| noteHandles | No | Notes. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| primaryName | No | New primary name; replaces the whole current one. Omit to leave unchanged. Name: a plain string ("Married Name:: Jane|Smith", "Given Middle Surname") or a JSON object (not a quoted JSON string). Object fields: given (or first_name), surname (primary surname value), prefix (particle before the surname: von, de, van, del…), connector (joins compound surnames: - or y), origin_type (Gramps OriginType of that surname: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Unknown), patronymic and matronymic (each stored as a surname entry of its own with that origin), title (Dr./Prof./Sir), suffix (Jr./Sr./III/PhD), call (preferred call name), nick, famnick, type (name type: Birth Name/Married Name/Also Known As/…), name (the whole name as one string, instead of given and surname), and native Gramps fields such as surname_list for several surnames ([{surname, prefix, connector, origintype, primary}], see gramps://input-guide). Name types and origins must be standard Gramps ones or custom ones the tree already uses. camelCase forms (firstName, surnameList, originType) work too; any other field is an error, not ignored. A plain string only splits into given name and surname: use object fields for a patronymic, prefix, title and the like. | |
| mediaHandles | No | Media. Omit to keep; applied per linkMode. Media handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {"ref":"…","region":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. A plain handle keeps the region its link has. In add mode a media already shown keeps its link and takes the region given; to show two regions of one image, list it twice, each with its region. | |
| familyHandles | No | Families where this person is a parent or spouse. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| alternateNames | No | Alternate names. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Alternate names: array of strings ("Married Name:: Jane|Smith") or name objects. Object fields, as in primaryName: given (or first_name), surname, prefix (von/de/van), connector, origin_type (Gramps OriginType: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Unknown), patronymic and matronymic (each a surname entry of its own), title, suffix (Jr./Sr./III), call, nick, famnick, type (name type), name (the whole name as one string), and native surname_list for several surnames. Name types and origins must be standard Gramps ones or custom ones the tree already uses. camelCase forms work too; any other field is an error, not ignored. Multiple names in one string: separate with newlines (not |). | |
| citationHandles | No | Citations. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| personAssociations | No | Associations with other people (godfather, friend, …). Omit to keep; applied per linkMode. Person associations (handles, not Gramps IDs): JSON array of {ref, rel, ...}, or strings "PERSON_HANDLE:: Godfather" (double colon after handle). JSON objects accept rel or relationship, and snake_case or camelCase list fields (note_list / noteList). Grammar: gramps://input-guide. | |
| parentFamilyHandles | No | Families where this person is a child. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, idempotentHint=true, readOnlyHint=false), it discloses the critical destructive edge case — '[] REMOVES every link of that kind, though the linked records themselves stay in the tree' — plus that writes are serialized, require a Gramps Web account with tree-edit rights, and that locked or rate-limited writes fail with a retry delay. It also states the return value (handle and Gramps ID) and the not-found outcome.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
For an 18-parameter tool the text is dense but front-loaded: purpose and alternatives come first, then the linkMode/replacement rules, then permissions, then the pointer to get_reference for argument formats. It loses a point for some restatement of what the schema already documents in detail and for the compressed, run-on middle section that takes effort to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 18 parameters, no output schema, and mutation semantics, this description covers what an agent needs: what gets changed, how link lists are applied, the destructive empty-list case, ordering behavior via sort, authorization and rate-limit failure modes, and where to find argument grammars. Return values are stated even though no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the per-parameter baseline is 3. The description earns extra credit by adding cross-parameter semantics the schema cannot express per-field: which lists ignore linkMode (alternateNames, attributes, addresses, urls always replace wholesale), that sort reorders without changing membership, and the replace/add/remove contract that governs every …Handles/…Refs list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb plus the full resource and enumerates the changeable facets (names, gender, attributes, addresses, URLs, associations, links to events/families/citations/notes/media/tags). It also explicitly separates this tool from create_person and delete_object, so the agent can distinguish it from siblings without reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternatives and the condition that selects them ('For a new person use create_person; to remove one, delete_object'), and adds a routing rule for a related operation ('to make the person a child, add them to the family's childRefs with update_family'). 'Pass only what changes; omitted arguments stay as they are' gives an explicit usage discipline rather than leaving it to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_placeUpdate PlaceADestructiveIdempotent
Change an existing place's names, type, coordinates, code, enclosing places or links to notes, media, citations and tags. The change shows on every event at this place: if only one event names the wrong place, give that event another placeHandle with update_event instead. For a new place use create_place; to remove one, delete_object. name, nameLang and nameDate each change one part of the primary name, alternateNames replaces all the other names, and an empty string clears lat, lon or nameDate. Pass only what changes; omitted arguments stay as they are. Link lists (…Handles, …Refs) follow linkMode: replace (default) sets the whole list, add appends, remove drops the given handles; in replace mode [] REMOVES every link of that kind, though the linked records themselves stay in the tree. Returns the handle and Gramps ID with the stored name, type, coordinates and enclosing places; a missing place returns a not-found message, and an unknown type or unreadable date is rejected before anything is saved. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it. Formats of every argument: get_reference(topic: "input-guide").
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees, north positive (52.2297). Text value. JSON strings are accepted; JSON numbers are also accepted and sent as text. Omit to keep the current value; pass an empty string to remove it. | |
| lon | No | Longitude in decimal degrees, east positive (21.0122). Text value. JSON strings are accepted; JSON numbers are also accepted and sent as text. Omit to keep the current value; pass an empty string to remove it. | |
| code | No | New place code. Omit to leave unchanged. | |
| name | No | New primary name. Omit to leave unchanged. | |
| handle | Yes | The place to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| linkMode | No | How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata. | replace |
| nameDate | No | When the primary name applies. Omit to keep the current date; pass an empty string to remove it. Gramps shows the first name, primary first, whose date is empty or matches the event date, so an undated primary name hides dated alternate names: date the primary name too ("from 1937-02-10"). Dashes are spans; open "1991-" / "from 1991" are From. Unreadable dates are rejected. | |
| nameLang | No | Language code of the primary name. Omit to leave unchanged. | |
| isPrivate | No | true makes the record private, false public. Omit to leave unchanged. | |
| placeType | No | New place type. Omit to leave unchanged. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: "types"). | |
| enclosedBy | No | Places that contain this one. Omit to keep; applied per linkMode. Parent place refs via enclosedBy (not enclosedByHandles): handle or Gramps ID, array of them, JSON array of {ref, date?}, or shorthand "HANDLE::1920-1950" (date optional). Place dashes are spans (from…to); open "1991-" / "from 1991" are From. English months OK: "HANDLE::from 1 Oct 1929 to 27 Sep 1937". Examples: [{ref:"…", date:"1708-1927"}], "HANDLE::1991-", date "1703-1914-08-31". Unrecognized dates fail validation. Smaller region → larger region order. See get_reference(topic: "input-guide", section: "dates"). | |
| tagHandles | No | Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| noteHandles | No | Notes. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| mediaHandles | No | Media. Omit to keep; applied per linkMode. Media handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {"ref":"…","region":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. A plain handle keeps the region its link has. In add mode a media already shown keeps its link and takes the region given; to show two regions of one image, list it twice, each with its region. | |
| alternateNames | No | Alternate names. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Alternate place names: array of strings ("Old Name" or "Old Name::de"), simple objects {value, lang?, date?}, or JSON array. Dated example: [{value:"New York", date:"1914-08-31-1924-01-26"}] or date "from 5 Jul 1944". Place dashes are spans (from…to); open "1991-" / "from 1991" are From. Unrecognized dates fail validation (see get_reference(topic: "input-guide", section: "dates")). | |
| citationHandles | No | Citations. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare write/destructive/idempotent, and the description goes well beyond them: in replace mode an empty list REMOVES every link of that kind while linked records remain; missing place returns a not-found message; unknown type or unreadable date is rejected before anything is saved; writes are serialized, require an edit-capable Gramps Web account, and rate-limited writes return the delay to wait. This is unusually rich operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb and scope, then alternatives, then semantics, then errors — a sensible order. It is dense and long, but for a 16-parameter mutation tool almost every sentence carries load; only the detailed linkMode/clearing rules push it near over-length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-param write tool with no output schema, the description covers what is returned (handle, Gramps ID, stored name/type/coordinates/enclosing places), failure modes, permission and rate-limit behavior, and points to get_reference for argument formats. Nothing an agent needs 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.
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 real meaning: how name/nameLang/nameDate jointly edit the primary name, that alternateNames replaces the other names entirely, that empty strings clear lat/lon/nameDate, and that omitted arguments are preserved. The linkMode semantics governing all link lists further clarify parameter behavior beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change an existing place's names, type, coordinates, code, enclosing places or links') and enumerates exactly which fields are mutable. It explicitly distinguishes itself from create_place, delete_object and update_event, so 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-not guidance: use update_event if only one event names the wrong place, create_place for a new place, delete_object to remove one. It also advises separate calls to add and remove versus replace to edit link metadata, covering alternative invocation strategies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_repositoryUpdate RepositoryADestructiveIdempotent
Change an existing repository's name, type, address, website or links to notes and tags. For a new repository use create_repository; to remove one, delete_object. Which sources it holds, with their call numbers, is stored on the sources: change that with update_source (repositoryHandles), not here. address becomes the street line of a single address and url a single Web Home link; each replaces every stored value, and an empty string removes them. A change shows on every source that lists the repository. Pass only what changes; omitted arguments stay as they are. Link lists (…Handles, …Refs) follow linkMode: replace (default) sets the whole list, add appends, remove drops the given handles; in replace mode [] REMOVES every link of that kind, though the linked records themselves stay in the tree. Returns the handle and Gramps ID; a missing repository returns a not-found message, and an unknown type is rejected before anything is saved. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | New website; replaces every stored link, and an empty string removes them. Omit to leave unchanged. | |
| name | No | New name. Omit to leave unchanged. | |
| handle | Yes | The repository to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| address | No | New postal address as one line; replaces every stored address, and an empty string removes them. Omit to leave unchanged. | |
| linkMode | No | How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata. | replace |
| repoType | No | New type, e.g. Archive, Library, Church. Omit to leave unchanged. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: "types"). | |
| isPrivate | No | true makes the record private, false public. Omit to leave unchanged. | |
| tagHandles | No | Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| noteHandles | No | Notes. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses that changes propagate to every source listing the repository, that empty strings/empty lists remove stored values, that replace mode can destroy link metadata, that writes are serialized and require edit permission, and that locked/rate-limited writes return retry delays. It also describes the return value and error cases. It is fully 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is dense but front-loaded: purpose first, then alternatives, scope boundaries, update semantics, linkMode behavior, returns, and auth/rate-limit behavior. Every sentence carries operational information for a nine-parameter destructive mutation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive update tool with no output schema, the description is complete: it covers return values, not-found handling, type validation, propagation effects, partial-update behavior, linkMode semantics, authentication requirements, and retry behavior under locking/rate limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 prose adds integrated meaning: it explains that address becomes a single street line and url a single Web Home link, that both replace all stored values, and that linkMode governs every supplied link list including [] semantics. This is largely reinforcing the schema, but the cross-parameter interaction is usefully clarified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: changing an existing repository's name, type, address, website, or links to notes and tags. It explicitly distinguishes itself from create_repository, delete_object, and update_source, so an agent can select it without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use this tool versus create_repository for new repositories, delete_object for removal, and update_source for source-to-repository links. It also gives important usage rules: pass only changed fields, omitted arguments stay unchanged, and link lists follow linkMode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_sourceUpdate SourceADestructiveIdempotent
Change an existing source's title, author, publication info, abbreviation, attributes or links to repositories, notes, media and tags. For a new source use create_source; to remove one, delete_object; a page or act inside the source is a citation, changed with update_citation. repositoryHandles carry each repository's call number, so edit a call number with linkMode replace; attributes replace the whole list whatever linkMode says. Pass only what changes; omitted arguments stay as they are. Link lists (…Handles, …Refs) follow linkMode: replace (default) sets the whole list, add appends, remove drops the given handles; in replace mode [] REMOVES every link of that kind, though the linked records themselves stay in the tree. Returns the handle and Gramps ID; a missing source returns a not-found message. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it. Formats of every argument: get_reference(topic: "input-guide").
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | New title. Omit to leave unchanged. | |
| abbrev | No | New abbreviation. Omit to leave unchanged. | |
| author | No | New author. Omit to leave unchanged. | |
| handle | Yes | The source to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects. | |
| pubinfo | No | New publication info. Omit to leave unchanged. | |
| linkMode | No | How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata. | replace |
| isPrivate | No | true makes the record private, false public. Omit to leave unchanged. | |
| attributes | No | Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings "Type: Value" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide. Each attribute takes only type, value and private. | |
| tagHandles | No | Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| noteHandles | No | Notes. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {"ref":"…"}. | |
| mediaHandles | No | Media. Omit to keep; applied per linkMode. Media handles, not Gramps IDs: JSON array ["h1","h2"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {"ref":"…","region":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. A plain handle keeps the region its link has. In add mode a media already shown keeps its link and takes the region given; to show two regions of one image, list it twice, each with its region. | |
| repositoryHandles | No | Repositories that hold the source. Omit to keep; applied per linkMode. Repository refs (handles, not Gramps IDs): JSON array of GrampsRepositoryRef objects, or strings "Ref : CallNumber : MediaType". JSON objects accept Gramps snake_case (call_number, media_type) or camelCase (callNumber, mediaType). Parts after Ref are optional: "Ref : CallNumber" and "Ref :: MediaType" are valid. MediaType must be a standard Gramps source media type (Book, Manuscript, Film, Photo, …) or a custom one the tree already uses. Multiple refs: JSON array or one multiline / |-separated string. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive/idempotent/write, but the description adds substantial context beyond them: write serialization ('one at a time'), the account permission requirement, lock/rate-limit failure with a retry delay, the not-found response, and the destructive edge case that [] in replace mode removes every link of that kind. That is well past what the structured fields convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and alternatives, dense but mostly earning its length for a 12-parameter mutation tool. Some material (linkMode mechanics) duplicates the schema text, and the final grammar pointer is a mild tail, so it is not perfectly tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation tool with no output schema, it covers return values (handle and Gramps ID), error cases (not found, locked/rate-limited), and authorization requirements. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the per-field baseline is 3, but the description adds cross-parameter semantics the schema only states per-field: repositoryHandles carry the call number so call numbers are edited via linkMode replace, and attributes replace the whole list regardless of linkMode. These interaction rules are genuinely additive, though the linkMode explanation largely restates the schema's own detailed description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (change/update) plus resource (existing source) and enumerates the editable facets (title, author, pubinfo, abbreviation, attributes, links, notes, media, tags). It actively distinguishes itself from create_source, delete_object, and update_citation, so an agent can tell the boundary 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to alternatives: create_source for a new one, delete_object to remove, update_citation for a page/act inside the source. It also states the partial-update contract ('Pass only what changes; omitted arguments stay as they are') and that forms live in get_reference, 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.
update_tagUpdate TagADestructiveIdempotent
Rename a tag or change its color or priority; every record carrying the tag shows the change. For a new tag use create_tag; to remove one, delete_object. Which records carry a tag is stored on the records: change that through their tagHandles (their update tool, linkMode add or remove), not here. Pass only what changes; omitted arguments stay as they are. A name another tag already uses is rejected, because Gramps filters find tags by name. Returns the stored name, color and priority; a missing tag returns a not-found message. Writes run one at a time and need a Gramps Web account allowed to edit the tree; a locked or rate-limited write fails with the delay to wait before retrying it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name. Omit to leave unchanged. | |
| color | No | New color as six hex digits RRGGBB, with or without #, e.g. FF5733; stored as #ff5733. Omit to leave unchanged. | |
| handle | Yes | The tag to change: its handle or exact name. Tags have no Gramps ID; find them with list_objects(objectType: "tags"). | |
| priority | No | New sort priority among tags in Gramps. Omit to leave unchanged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it discloses that the change propagates to every carrying record, that duplicate names are rejected because Gramps filters by name, that omitted arguments persist (matching idempotentHint=true), that it returns name/color/priority, that writes are serialized, that an edit-capable Gramps Web account is required, and that locked/rate-limited writes return a retry delay. No contradiction with destructiveHint=true or 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: purpose, then alternatives, then scope boundary, then behavior. Dense but nearly every clause is load-bearing; the final sentence stacks auth, serialization and retry semantics into one long clause, which is the only mild readability cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description explicitly covers the return value (stored name, color, priority) and the failure message for a missing tag, plus auth and retry behavior. Nothing needed to call or interpret this mutation tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each field is documented, so the baseline is 3; the description adds genuine semantics beyond that by stating omitted arguments are left unchanged and by explaining the uniqueness constraint on 'name' (why a duplicate is rejected).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+effect ('Rename a tag or change its color or priority; every record carrying the tag shows the change'). It also names the sibling tools that would be confused with it (create_tag, delete_object), so the 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use routing: 'For a new tag use create_tag; to remove one, delete_object.' It further excludes a plausible-but-wrong path by stating that record-to-tag membership is edited via tagHandles on the record's own update tool, not here. Partial-update guidance ('Pass only what changes') is also given.
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.
5 tool updates
v2.9.1- Changed
create_person3 fields changed- changed
Input schema / properties / alternateNames / descriptionPrevious value: -"Alternate names: array of strings (\"Married Name:: Jane|Smith\"), simple objects, or full Gramps name objects. Object fields: given/first, surname/last, prefix/surname_prefix (von/de/van), connector/surname_connector, origin_type/surname_origin (Gramps OriginType: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Unknown), patronymic (→ separate Patronymic surname entry), matronymic (→ separate Matronymic surname entry), title, suffix (Jr./Sr./III), call, nick, famnick, type (name type). Name types and origins must be standard Gramps ones or custom ones the tree already uses. For multi-surname names use native surname_list format. Multiple names in one string: separate with newlines (not |)."New value: +"Alternate names: array of strings (\"Married Name:: Jane|Smith\") or name objects. Object fields, as in primaryName: given (or first_name), surname, prefix (von/de/van), connector, origin_type (Gramps OriginType: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Unknown), patronymic and matronymic (each a surname entry of its own), title, suffix (Jr./Sr./III), call, nick, famnick, type (name type), name (the whole name as one string), and native surname_list for several surnames. Name types and origins must be standard Gramps ones or custom ones the tree already uses. camelCase forms work too; any other field is an error, not ignored. Multiple names in one string: separate with newlines (not |)." - added
Input schema / properties / notDuplicateOfAdded value: +{ + "default": null, + "description": "People of the tree who are someone else, from the possible duplicates of a refused call: Gramps IDs or handles, e.g. [\"I0012\"]. The duplicate check passes over them." +} - changed
Input schema / properties / primaryName / descriptionPrevious value: -"Name: full Gramps name JSON (see gramps://input-guide), a plain string (\"Married Name:: Jane|Smith\"), or a simple object. Prefer a JSON object (not a quoted JSON string) when using structured name parts. Object fields: given/first (given name), surname/last (primary surname value), prefix/surname_prefix (particle before surname: von, de, van, del…), connector/surname_connector (joins compound surnames: - or y), origin_type/surname_origin (Gramps OriginType for the primary surname: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Unknown), patronymic (shortcut: stored as a separate Patronymic surname entry), matronymic (shortcut: stored as a separate Matronymic surname entry), title (Dr./Prof./Sir), suffix (Jr./Sr./III/PhD), call (preferred call name), nick/nickname, famnick/family_nick, type (name type: Birth Name/Married Name/Also Known As/…). Name types and origins must be standard Gramps ones or custom ones the tree already uses. Plain full-name strings (name/text/full or \"Given Middle Surname\") only split into given + surname; they cannot create structured name parts such as patronymic, matronymic, prefix, connector, origin_type, title, suffix, call, nick, or famnick. Use object fields or native surname_list instead. For complex multi-surname cases use native Gramps surname_list format. Also accepts: name/text/full as a full-name string with optional type field."New value: +"Name: a plain string (\"Married Name:: Jane|Smith\", \"Given Middle Surname\") or a JSON object (not a quoted JSON string). Object fields: given (or first_name), surname (primary surname value), prefix (particle before the surname: von, de, van, del…), connector (joins compound surnames: - or y), origin_type (Gramps OriginType of that surname: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Unknown), patronymic and matronymic (each stored as a surname entry of its own with that origin), title (Dr./Prof./Sir), suffix (Jr./Sr./III/PhD), call (preferred call name), nick, famnick, type (name type: Birth Name/Married Name/Also Known As/…), name (the whole name as one string, instead of given and surname), and native Gramps fields such as surname_list for several surnames ([{surname, prefix, connector, origintype, primary}], see gramps://input-guide). Name types and origins must be standard Gramps ones or custom ones the tree already uses. camelCase forms (firstName, surnameList, originType) work too; any other field is an error, not ignored. A plain string only splits into given name and surname: use object fields for a patronymic, prefix, title and the like."
- Changed
create_records1 field changed- added
Input schema / properties / people / items / properties / notDuplicateOfAdded value: +{ + "description": "People of the tree who are someone else, from the possible duplicates of a refused call: Gramps IDs or handles, e.g. [\"I0012\"]. The duplicate check passes over them." +}
- Added
find_duplicates - Added
merge_objects - Changed
update_person2 fields changed- changed
Input schema / properties / alternateNames / descriptionPrevious value: -"Alternate names. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Alternate names: array of strings (\"Married Name:: Jane|Smith\"), simple objects, or full Gramps name objects. Object fields: given/first, surname/last, prefix/surname_prefix (von/de/van), connector/surname_connector, origin_type/surname_origin (Gramps OriginType: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Unknown), patronymic (→ separate Patronymic surname entry), matronymic (→ separate Matronymic surname entry), title, suffix (Jr./Sr./III), call, nick, famnick, type (name type). Name types and origins must be standard Gramps ones or custom ones the tree already uses. For multi-surname names use native surname_list format. Multiple names in one string: separate with newlines (not |)."New value: +"Alternate names. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Alternate names: array of strings (\"Married Name:: Jane|Smith\") or name objects. Object fields, as in primaryName: given (or first_name), surname, prefix (von/de/van), connector, origin_type (Gramps OriginType: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Unknown), patronymic and matronymic (each a surname entry of its own), title, suffix (Jr./Sr./III), call, nick, famnick, type (name type), name (the whole name as one string), and native surname_list for several surnames. Name types and origins must be standard Gramps ones or custom ones the tree already uses. camelCase forms work too; any other field is an error, not ignored. Multiple names in one string: separate with newlines (not |)." - changed
Input schema / properties / primaryName / descriptionPrevious value: -"New primary name; replaces the whole current one. Omit to leave unchanged. Name: full Gramps name JSON (see gramps://input-guide), a plain string (\"Married Name:: Jane|Smith\"), or a simple object. Prefer a JSON object (not a quoted JSON string) when using structured name parts. Object fields: given/first (given name), surname/last (primary surname value), prefix/surname_prefix (particle before surname: von, de, van, del…), connector/surname_connector (joins compound surnames: - or y), origin_type/surname_origin (Gramps OriginType for the primary surname: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Unknown), patronymic (shortcut: stored as a separate Patronymic surname entry), matronymic (shortcut: stored as a separate Matronymic surname entry), title (Dr./Prof./Sir), suffix (Jr./Sr./III/PhD), call (preferred call name), nick/nickname, famnick/family_nick, type (name type: Birth Name/Married Name/Also Known As/…). Name types and origins must be standard Gramps ones or custom ones the tree already uses. Plain full-name strings (name/text/full or \"Given Middle Surname\") only split into given + surname; they cannot create structured name parts such as patronymic, matronymic, prefix, connector, origin_type, title, suffix, call, nick, or famnick. Use object fields or native surname_list instead. For complex multi-surname cases use native Gramps surname_list format. Also accepts: name/text/full as a full-name string with optional type field."New value: +"New primary name; replaces the whole current one. Omit to leave unchanged. Name: a plain string (\"Married Name:: Jane|Smith\", \"Given Middle Surname\") or a JSON object (not a quoted JSON string). Object fields: given (or first_name), surname (primary surname value), prefix (particle before the surname: von, de, van, del…), connector (joins compound surnames: - or y), origin_type (Gramps OriginType of that surname: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Unknown), patronymic and matronymic (each stored as a surname entry of its own with that origin), title (Dr./Prof./Sir), suffix (Jr./Sr./III/PhD), call (preferred call name), nick, famnick, type (name type: Birth Name/Married Name/Also Known As/…), name (the whole name as one string, instead of given and surname), and native Gramps fields such as surname_list for several surnames ([{surname, prefix, connector, origintype, primary}], see gramps://input-guide). Name types and origins must be standard Gramps ones or custom ones the tree already uses. camelCase forms (firstName, surnameList, originType) work too; any other field is an error, not ignored. A plain string only splits into given name and surname: use object fields for a patronymic, prefix, title and the like."
5 tool updates
v2.8.1- Changed
create_family3 fields changed- changed
Input schema / properties / eventRefs / descriptionPrevious value: -"Existing family events such as Marriage or Divorce. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. A role must be a standard Gramps role or a custom one the tree already uses; anything else is rejected with suggestions. JSON objects accept snake_case or camelCase list fields (note_list / noteList)."New value: +"Existing family events such as Marriage or Divorce. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary on a person, Family on a family), comma/pipe/newline-separated, or a single handle. A role must be a standard Gramps role or a custom one the tree already uses; anything else is rejected with suggestions. JSON objects accept snake_case or camelCase list fields (note_list / noteList)." - changed
Input schema / properties / relationshipType / defaultPrevious value: -"Married"New value: +"Unknown" - changed
Input schema / properties / relationshipType / descriptionPrevious value: -"Relationship type: Married (default), Unmarried, Civil Union or Unknown. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: \"types\")."New value: +"Relationship type: Married, Unmarried, Civil Union or Unknown (default, as in Gramps). Pass Married when a source records the marriage. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: \"types\")."
- Changed
create_person2 fields changed- changed
Input schema / properties / eventRefs / descriptionPrevious value: -"Existing events this person takes part in, each with a role (Primary by default; Witness, Godparent, …). Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. A role must be a standard Gramps role or a custom one the tree already uses; anything else is rejected with suggestions. JSON objects accept snake_case or camelCase list fields (note_list / noteList)."New value: +"Existing events this person takes part in, each with a role (Primary by default; Witness, Godparent, …). Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary on a person, Family on a family), comma/pipe/newline-separated, or a single handle. A role must be a standard Gramps role or a custom one the tree already uses; anything else is rejected with suggestions. JSON objects accept snake_case or camelCase list fields (note_list / noteList)." - changed
Input schema / properties / familyHandles / descriptionPrevious value: -"Families where this person is a parent or spouse. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."New value: +"Families where this person is a parent or spouse. Does not make the person the family's father or mother: use fatherHandle or motherHandle on the family for that. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."
- Changed
create_records2 fields changed- changed
Input schema / properties / families / items / properties / eventRefs / descriptionPrevious value: -"Family events such as Marriage: handles or #keys, optionally \"#key::Family\" or {ref, role}."New value: +"Family events such as Marriage: handles or #keys, each optionally with a role as \"#key::Role\" or {ref, role} (default Family)." - changed
Input schema / properties / families / items / properties / relationshipType / descriptionPrevious value: -"Married (default), Unmarried, Civil Union or Unknown."New value: +"Married, Unmarried, Civil Union or Unknown (default, as in Gramps). Pass Married when a source records the marriage."
- Changed
update_family1 field changed- changed
Input schema / properties / eventRefs / descriptionPrevious value: -"Family events (Marriage, Divorce, …). Omit to keep; applied per linkMode. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. A role must be a standard Gramps role or a custom one the tree already uses; anything else is rejected with suggestions. JSON objects accept snake_case or camelCase list fields (note_list / noteList)."New value: +"Family events (Marriage, Divorce, …). Omit to keep; applied per linkMode. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary on a person, Family on a family), comma/pipe/newline-separated, or a single handle. A role must be a standard Gramps role or a custom one the tree already uses; anything else is rejected with suggestions. JSON objects accept snake_case or camelCase list fields (note_list / noteList)."
- Changed
update_person1 field changed- changed
Input schema / properties / eventRefs / descriptionPrevious value: -"Events this person takes part in, with roles. In replace mode the list must hold every event the person keeps. Omit to keep; applied per linkMode. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. A role must be a standard Gramps role or a custom one the tree already uses; anything else is rejected with suggestions. JSON objects accept snake_case or camelCase list fields (note_list / noteList)."New value: +"Events this person takes part in, with roles. In replace mode the list must hold every event the person keeps. Omit to keep; applied per linkMode. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary on a person, Family on a family), comma/pipe/newline-separated, or a single handle. A role must be a standard Gramps role or a custom one the tree already uses; anything else is rejected with suggestions. JSON objects accept snake_case or camelCase list fields (note_list / noteList)."
2 tool updates
v2.8.0- Added
create_records - Changed
list_objects1 field changed- changed
Input schema / properties / gql / descriptionPrevious value: -"Filter in Gramps Query Language, run on the server, e.g. gender == 1 or media_list.length >= 1 (optional)."New value: +"Filter in Gramps Query Language, run on the server: field = value with a single = (not ==), also !=, <, <=, >, >=, ~ (contains), !~, and, or and parentheses; text goes in double quotes. Types are numbers, not names, e.g. event type.value = 12 Birth, 13 Death, 1 Marriage, 15 Baptism, 19 Burial. Examples: gender = 1 (male), primary_name.first_name = \"Anna\", media_list.length >= 1 (optional)."
1 tool update
v2.7.0- Added
undo_change
4 tool updates
v2.6.0- Changed
create_tag1 field changed- changed
Input schema / properties / color / descriptionPrevious value: -"Color as six hex digits RRGGBB without #, e.g. FF5733; stored as given. Default 000000 (black)."New value: +"Color as six hex digits RRGGBB, with or without #, e.g. FF5733; stored as #ff5733. Default 000000 (black)."
- Changed
get_reference2 fields changed- changed
Input schema / properties / section / descriptionPrevious value: -"One part only (optional; omit for the whole topic). input-guide: dates, name_schema, link_updates, structured_fields, or one of structured_fields.names, .attributes, .urls, .addresses, .person_associations, .repository_refs. types: a category such as event_types or place_types. name-settings: formats or groups. metadata has no sections."New value: +"One part only (optional; omit for the whole topic). input-guide: dates, name_schema, link_updates, structured_fields, or one of structured_fields.names, .attributes, .urls, .addresses, .person_associations, .repository_refs. types: a category such as event_types or place_types. name-settings: formats or groups. filter-rules: a type such as people or events (its rules and values; omit for an overview). metadata has no sections." - changed
Input schema / properties / topic / descriptionPrevious value: -"Which reference: input-guide, types, metadata or name-settings."New value: +"Which reference: input-guide, types, metadata, name-settings or filter-rules."
- Changed
list_objects1 field changed- added
Input schema / properties / rulesAdded value: +{ + "default": null, + "description": "Gramps filter rules, run on the server before gql (a record must match both): {\"function\": \"and\" (default), \"or\" or \"one\", \"invert\": true to keep the records that do not match, \"rules\": [{\"name\": rule, \"values\": [one per label of the rule, in order]}]}, or just the array of rules. Values are Gramps IDs (I0001), text, numbers or true/false. An item of rules can be a nested filter of the same form; with \"namespace\" (Event, Family, Person, Place, Source or Repository) it matches the records each listed one links to, e.g. people by their events. Examples: people with no family links {\"rules\": [{\"name\": \"Disconnected\"}]}; people not related to I0001 {\"invert\": true, \"rules\": [{\"name\": \"IsRelatedWith\", \"values\": [\"I0001\"]}]}; a saved filter {\"name\": \"MatchesFilter\", \"values\": [\"its name\"]}. Rules of each type and their values: get_reference(topic: \"filter-rules\", section: type). Not for tags (optional)." +}
- Added
update_tag
1 tool update
- Added
create_media
15 tool updates
v2.5.1- Changed
create_citation1 field changed- changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media such as the scan of the page. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."New value: +"Media such as the scan of the page. Media handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {\"ref\":\"…\",\"region\":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers."
- Changed
create_event1 field changed- changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."New value: +"Media. Media handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {\"ref\":\"…\",\"region\":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers."
- Changed
create_family1 field changed- changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."New value: +"Media. Media handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {\"ref\":\"…\",\"region\":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers."
- Changed
create_person1 field changed- changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."New value: +"Media. Media handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {\"ref\":\"…\",\"region\":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers."
- Changed
create_place1 field changed- changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."New value: +"Media. Media handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {\"ref\":\"…\",\"region\":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers."
- Changed
create_source1 field changed- changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."New value: +"Media. Media handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {\"ref\":\"…\",\"region\":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers."
- Changed
read_media1 field changed- added
Input schema / properties / regionAdded value: +{ + "default": null, + "description": "Show only this part of the image, at up to size pixels on its long edge: [left, top, right, bottom] in percent of the image width and height, 0 to 100, from the top-left corner, as stored on a media link. Use it to check a region before saving it in mediaHandles or attachTo, or to read one record on a page scan. Only valid for mode thumbnail.", + "items": { + "type": "number" + }, + "type": [ + "array", + "null" + ] +}
- Changed
update_citation1 field changed- changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."New value: +"Media. Omit to keep; applied per linkMode. Media handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {\"ref\":\"…\",\"region\":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. A plain handle keeps the region its link has. In add mode a media already shown keeps its link and takes the region given; to show two regions of one image, list it twice, each with its region."
- Changed
update_event1 field changed- changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."New value: +"Media. Omit to keep; applied per linkMode. Media handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {\"ref\":\"…\",\"region\":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. A plain handle keeps the region its link has. In add mode a media already shown keeps its link and takes the region given; to show two regions of one image, list it twice, each with its region."
- Changed
update_family3 fields changed- changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."New value: +"Media. Omit to keep; applied per linkMode. Media handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {\"ref\":\"…\",\"region\":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. A plain handle keeps the region its link has. In add mode a media already shown keeps its link and takes the region given; to show two regions of one image, list it twice, each with its region." - added
Input schema / properties / sortAdded value: +{ + "default": null, + "description": "Lists to put in date order after the other changes: JSON array [\"Events\",\"Citations\"] or one string such as \"Events | Citations\"; names are case-insensitive. Links are only moved, keeping their roles and other metadata; alone it sorts the stored lists. Omit to keep the order (linkMode add appends at the end). Lists: Events, Children, Citations, Media. Events: by event date; undated Birth, Baptism and Christening go first and other undated events last, ending with Death, then Burial and Cremation. On the same date: \"before\" dates, then Residence and Occupation, Birth, Baptism, other events, Death, Burial, then \"after\" dates. Children: by birth date, else baptism or christening date. Citations and Media: by their own date. Undated children, citations and media go last; equal dates keep their order." +} - removed
Input schema / properties / sortEventsRemoved value: -{ - "default": false, - "description": "true sorts all event links by event date after the other changes, keeping each link's role and metadata; alone it sorts the stored list. Undated Birth, Baptism and Christening go first and other undated events last, ending with Death, then Burial and Cremation. On the same date: \"before\" dates, then Residence and Occupation, Birth, Baptism, other events, Death, Burial, then \"after\" dates. Default false keeps the order (linkMode add appends at the end).", - "type": "boolean" -}
- Changed
update_media2 fields changed- added
Input schema / properties / attachToAdded value: +{ + "default": null, + "description": "Records to show the media on, each getting a link after its existing media: Gramps IDs (I0001, F0001, E0001, P0001, S0001, C0001) or handles of people, families, events, places, sources or citations. JSON array, one value, or a comma-separated string. To show only part of the image, such as one record on a page scan, give an object {\"ref\":\"I0001\",\"region\":[left, top, right, bottom]} in place of the ID. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. A record already showing the media keeps its link and takes the region; list a record twice to show two regions. Check a region with read_media first. Not affected by linkMode." +} - added
Input schema / properties / filePathAdded value: +{ + "default": null, + "description": "Replace the stored file with this one: an absolute path inside an upload folder, ~/…, or a name relative to the folder. Accepts JPEG, PNG, GIF, WebP, TIFF, BMP or PDF, judged by content; a file another media record already holds is rejected. Omit to keep the file.", + "type": [ + "string", + "null" + ] +}
- Changed
update_note3 fields changed- added
Input schema / properties / appendTextAdded value: +{ + "default": null, + "description": "Text to add at the end of the body, on a new line: a line break is put in between unless the body already ends with one, so start with a line break to leave an empty line. The rest of the body, styling and links included, is kept. Cannot be combined with text.", + "type": [ + "string", + "null" + ] +} - added
Input schema / properties / replaceTextAdded value: +{ + "default": null, + "description": "A fragment of the body to replace with withText, copied exactly as stored, spaces, line breaks and letter case included. It must occur once: include enough of the surrounding text to make it unique. The rest of the body, styling and links included, is kept. Applied before appendText; cannot be combined with text.", + "type": [ + "string", + "null" + ] +} - added
Input schema / properties / withTextAdded value: +{ + "default": null, + "description": "The text to put in place of replaceText; an empty string deletes the fragment.", + "type": [ + "string", + "null" + ] +}
- Changed
update_person3 fields changed- changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."New value: +"Media. Omit to keep; applied per linkMode. Media handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {\"ref\":\"…\",\"region\":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. A plain handle keeps the region its link has. In add mode a media already shown keeps its link and takes the region given; to show two regions of one image, list it twice, each with its region." - added
Input schema / properties / sortAdded value: +{ + "default": null, + "description": "Lists to put in date order after the other changes: JSON array [\"Events\",\"Citations\"] or one string such as \"Events | Citations\"; names are case-insensitive. Links are only moved, keeping their roles and other metadata; alone it sorts the stored lists. Omit to keep the order (linkMode add appends at the end). Lists: Events, Families, Citations, Media. Events: by event date; undated Birth, Baptism and Christening go first and other undated events last, ending with Death, then Burial and Cremation. On the same date: \"before\" dates, then Residence and Occupation, Birth, Baptism, other events, Death, Burial, then \"after\" dates. Families (this person's marriages and other unions): by the Marriage date, else another marriage event (Engagement, Marriage Banns, …), else the earliest birth of a child. Citations and Media: by their own date; Gramps shows the first media as the person's picture, so sorting Media can change it. Undated families, citations and media go last; equal dates keep their order." +} - removed
Input schema / properties / sortEventsRemoved value: -{ - "default": false, - "description": "true sorts all event links by event date after the other changes, keeping each link's role and metadata; alone it sorts the stored list. Undated Birth, Baptism and Christening go first and other undated events last, ending with Death, then Burial and Cremation. On the same date: \"before\" dates, then Residence and Occupation, Birth, Baptism, other events, Death, Burial, then \"after\" dates. Default false keeps the order (linkMode add appends at the end).", - "type": "boolean" -}
- Changed
update_place1 field changed- changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."New value: +"Media. Omit to keep; applied per linkMode. Media handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {\"ref\":\"…\",\"region\":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. A plain handle keeps the region its link has. In add mode a media already shown keeps its link and takes the region given; to show two regions of one image, list it twice, each with its region."
- Changed
update_source1 field changed- changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."New value: +"Media. Omit to keep; applied per linkMode. Media handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string. To show only part of an image, such as one record on a page scan, give an object {\"ref\":\"…\",\"region\":[left, top, right, bottom]} in place of the handle. A region is [left, top, right, bottom]: its edges in percent of the image width and height, 0 to 100, measured from the top-left corner; [10, 20, 60, 45] runs from 10% to 60% across and from 20% to 45% down. [0, 0, 100, 100] shows the whole image again; read_media with the same region shows what it covers. A plain handle keeps the region its link has. In add mode a media already shown keeps its link and takes the region given; to show two regions of one image, list it twice, each with its region."
11 tool updates
v2.3.2- Changed
create_citation1 field changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide. Each attribute takes only type, value and private."New value: +"Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide. Each attribute takes only type, value and private."
- Changed
create_event1 field changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide."
- Changed
create_family3 fields changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide." - changed
Input schema / properties / childRefs / descriptionPrevious value: -"Children, each with its relation to the father and mother (Birth by default; Adopted, Stepchild, …). Child references (handles, not Gramps IDs): JSON array of {ref, frel, mrel}, strings \"HANDLE::RelType\" (sets both frel and mrel; default: Birth), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case (frel, mrel, tag_list) or camelCase (fatherRel, tagList, etc.)."New value: +"Children, each with its relation to the father and mother (Birth by default; Adopted, Stepchild, …). Child references (handles, not Gramps IDs): JSON array of {ref, frel, mrel}, strings \"HANDLE::RelType\" (sets both frel and mrel; default: Birth), comma/pipe/newline-separated, or a single handle. A relation must be a standard Gramps one (Birth, Adopted, Stepchild, Sponsored, Foster, Unknown, None) or a custom one the tree already uses. JSON objects accept snake_case (frel, mrel, tag_list) or camelCase (fatherRel, tagList, etc.)." - changed
Input schema / properties / eventRefs / descriptionPrevious value: -"Existing family events such as Marriage or Divorce. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case or camelCase list fields (note_list / noteList)."New value: +"Existing family events such as Marriage or Divorce. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. A role must be a standard Gramps role or a custom one the tree already uses; anything else is rejected with suggestions. JSON objects accept snake_case or camelCase list fields (note_list / noteList)."
- Changed
create_person5 fields changed- changed
Input schema / properties / alternateNames / descriptionPrevious value: -"Alternate names: array of strings (\"Married Name:: Jane|Smith\"), simple objects, or full Gramps name objects. Object fields: given/first, surname/last, prefix/surname_prefix (von/de/van), connector/surname_connector, origin_type/surname_origin (Gramps OriginType: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Custom, Unknown), patronymic (→ separate Patronymic surname entry), matronymic (→ separate Matronymic surname entry), title, suffix (Jr./Sr./III), call, nick, famnick, type (name type). For multi-surname names use native surname_list format. Multiple names in one string: separate with newlines (not |)."New value: +"Alternate names: array of strings (\"Married Name:: Jane|Smith\"), simple objects, or full Gramps name objects. Object fields: given/first, surname/last, prefix/surname_prefix (von/de/van), connector/surname_connector, origin_type/surname_origin (Gramps OriginType: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Unknown), patronymic (→ separate Patronymic surname entry), matronymic (→ separate Matronymic surname entry), title, suffix (Jr./Sr./III), call, nick, famnick, type (name type). Name types and origins must be standard Gramps ones or custom ones the tree already uses. For multi-surname names use native surname_list format. Multiple names in one string: separate with newlines (not |)." - changed
Input schema / properties / attributes / descriptionPrevious value: -"Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide." - changed
Input schema / properties / eventRefs / descriptionPrevious value: -"Existing events this person takes part in, each with a role (Primary by default; Witness, Godparent, …). Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case or camelCase list fields (note_list / noteList)."New value: +"Existing events this person takes part in, each with a role (Primary by default; Witness, Godparent, …). Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. A role must be a standard Gramps role or a custom one the tree already uses; anything else is rejected with suggestions. JSON objects accept snake_case or camelCase list fields (note_list / noteList)." - changed
Input schema / properties / primaryName / descriptionPrevious value: -"Name: full Gramps name JSON (see gramps://input-guide), a plain string (\"Married Name:: Jane|Smith\"), or a simple object. Prefer a JSON object (not a quoted JSON string) when using structured name parts. Object fields: given/first (given name), surname/last (primary surname value), prefix/surname_prefix (particle before surname: von, de, van, del…), connector/surname_connector (joins compound surnames: - or y), origin_type/surname_origin (Gramps OriginType for the primary surname: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Custom, Unknown), patronymic (shortcut: stored as a separate Patronymic surname entry), matronymic (shortcut: stored as a separate Matronymic surname entry), title (Dr./Prof./Sir), suffix (Jr./Sr./III/PhD), call (preferred call name), nick/nickname, famnick/family_nick, type (name type: Birth Name/Married Name/Also Known As/…). Plain full-name strings (name/text/full or \"Given Middle Surname\") only split into given + surname; they cannot create structured name parts such as patronymic, matronymic, prefix, connector, origin_type, title, suffix, call, nick, or famnick. Use object fields or native surname_list instead. For complex multi-surname cases use native Gramps surname_list format. Also accepts: name/text/full as a full-name string with optional type field."New value: +"Name: full Gramps name JSON (see gramps://input-guide), a plain string (\"Married Name:: Jane|Smith\"), or a simple object. Prefer a JSON object (not a quoted JSON string) when using structured name parts. Object fields: given/first (given name), surname/last (primary surname value), prefix/surname_prefix (particle before surname: von, de, van, del…), connector/surname_connector (joins compound surnames: - or y), origin_type/surname_origin (Gramps OriginType for the primary surname: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Unknown), patronymic (shortcut: stored as a separate Patronymic surname entry), matronymic (shortcut: stored as a separate Matronymic surname entry), title (Dr./Prof./Sir), suffix (Jr./Sr./III/PhD), call (preferred call name), nick/nickname, famnick/family_nick, type (name type: Birth Name/Married Name/Also Known As/…). Name types and origins must be standard Gramps ones or custom ones the tree already uses. Plain full-name strings (name/text/full or \"Given Middle Surname\") only split into given + surname; they cannot create structured name parts such as patronymic, matronymic, prefix, connector, origin_type, title, suffix, call, nick, or famnick. Use object fields or native surname_list instead. For complex multi-surname cases use native Gramps surname_list format. Also accepts: name/text/full as a full-name string with optional type field." - changed
Input schema / properties / urls / descriptionPrevious value: -"URLs: JSON array of {type,path,desc}, or strings \"Web Home: https://…\" with optional \" — note\" after URL, or lines/| separated. Grammar: gramps://input-guide."New value: +"URLs: JSON array of {type,path,desc}, or strings \"Web Home: https://…\" with optional \" — note\" after URL, or lines/| separated. A type must be a standard Gramps URL type (E-mail, Web Home, Web Search, FTP, Unknown) or a custom one the tree already uses. Grammar: gramps://input-guide."
- Changed
create_source2 fields changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide. Each attribute takes only type, value and private."New value: +"Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide. Each attribute takes only type, value and private." - changed
Input schema / properties / repositoryHandles / descriptionPrevious value: -"Repositories that hold the source, each with an optional call number and media type; the repositories must exist (create_repository). Repository refs (handles, not Gramps IDs): JSON array of GrampsRepositoryRef objects, or strings \"Ref : CallNumber : MediaType\". JSON objects accept Gramps snake_case (call_number, media_type) or camelCase (callNumber, mediaType). Parts after Ref are optional: \"Ref : CallNumber\" and \"Ref :: MediaType\" are valid. Multiple refs: JSON array or one multiline / |-separated string."New value: +"Repositories that hold the source, each with an optional call number and media type; the repositories must exist (create_repository). Repository refs (handles, not Gramps IDs): JSON array of GrampsRepositoryRef objects, or strings \"Ref : CallNumber : MediaType\". JSON objects accept Gramps snake_case (call_number, media_type) or camelCase (callNumber, mediaType). Parts after Ref are optional: \"Ref : CallNumber\" and \"Ref :: MediaType\" are valid. MediaType must be a standard Gramps source media type (Book, Manuscript, Film, Photo, …) or a custom one the tree already uses. Multiple refs: JSON array or one multiline / |-separated string."
- Changed
update_citation1 field changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide. Each attribute takes only type, value and private."New value: +"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide. Each attribute takes only type, value and private."
- Changed
update_event1 field changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide."
- Changed
update_family4 fields changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide." - changed
Input schema / properties / childRefs / descriptionPrevious value: -"Children with their relations to the parents. In replace mode the list must hold every child the family keeps. Omit to keep; applied per linkMode. Child references (handles, not Gramps IDs): JSON array of {ref, frel, mrel}, strings \"HANDLE::RelType\" (sets both frel and mrel; default: Birth), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case (frel, mrel, tag_list) or camelCase (fatherRel, tagList, etc.)."New value: +"Children with their relations to the parents. In replace mode the list must hold every child the family keeps. Omit to keep; applied per linkMode. Child references (handles, not Gramps IDs): JSON array of {ref, frel, mrel}, strings \"HANDLE::RelType\" (sets both frel and mrel; default: Birth), comma/pipe/newline-separated, or a single handle. A relation must be a standard Gramps one (Birth, Adopted, Stepchild, Sponsored, Foster, Unknown, None) or a custom one the tree already uses. JSON objects accept snake_case (frel, mrel, tag_list) or camelCase (fatherRel, tagList, etc.)." - changed
Input schema / properties / eventRefs / descriptionPrevious value: -"Family events (Marriage, Divorce, …). Omit to keep; applied per linkMode. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case or camelCase list fields (note_list / noteList)."New value: +"Family events (Marriage, Divorce, …). Omit to keep; applied per linkMode. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. A role must be a standard Gramps role or a custom one the tree already uses; anything else is rejected with suggestions. JSON objects accept snake_case or camelCase list fields (note_list / noteList)." - added
Input schema / properties / sortEventsAdded value: +{ + "default": false, + "description": "true sorts all event links by event date after the other changes, keeping each link's role and metadata; alone it sorts the stored list. Undated Birth, Baptism and Christening go first and other undated events last, ending with Death, then Burial and Cremation. On the same date: \"before\" dates, then Residence and Occupation, Birth, Baptism, other events, Death, Burial, then \"after\" dates. Default false keeps the order (linkMode add appends at the end).", + "type": "boolean" +}
- Changed
update_media1 field changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide."
- Changed
update_person6 fields changed- changed
Input schema / properties / alternateNames / descriptionPrevious value: -"Alternate names. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Alternate names: array of strings (\"Married Name:: Jane|Smith\"), simple objects, or full Gramps name objects. Object fields: given/first, surname/last, prefix/surname_prefix (von/de/van), connector/surname_connector, origin_type/surname_origin (Gramps OriginType: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Custom, Unknown), patronymic (→ separate Patronymic surname entry), matronymic (→ separate Matronymic surname entry), title, suffix (Jr./Sr./III), call, nick, famnick, type (name type). For multi-surname names use native surname_list format. Multiple names in one string: separate with newlines (not |)."New value: +"Alternate names. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Alternate names: array of strings (\"Married Name:: Jane|Smith\"), simple objects, or full Gramps name objects. Object fields: given/first, surname/last, prefix/surname_prefix (von/de/van), connector/surname_connector, origin_type/surname_origin (Gramps OriginType: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Unknown), patronymic (→ separate Patronymic surname entry), matronymic (→ separate Matronymic surname entry), title, suffix (Jr./Sr./III), call, nick, famnick, type (name type). Name types and origins must be standard Gramps ones or custom ones the tree already uses. For multi-surname names use native surname_list format. Multiple names in one string: separate with newlines (not |)." - changed
Input schema / properties / attributes / descriptionPrevious value: -"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide." - changed
Input schema / properties / eventRefs / descriptionPrevious value: -"Events this person takes part in, with roles. In replace mode the list must hold every event the person keeps. Omit to keep; applied per linkMode. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case or camelCase list fields (note_list / noteList)."New value: +"Events this person takes part in, with roles. In replace mode the list must hold every event the person keeps. Omit to keep; applied per linkMode. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. A role must be a standard Gramps role or a custom one the tree already uses; anything else is rejected with suggestions. JSON objects accept snake_case or camelCase list fields (note_list / noteList)." - changed
Input schema / properties / primaryName / descriptionPrevious value: -"New primary name; replaces the whole current one. Omit to leave unchanged. Name: full Gramps name JSON (see gramps://input-guide), a plain string (\"Married Name:: Jane|Smith\"), or a simple object. Prefer a JSON object (not a quoted JSON string) when using structured name parts. Object fields: given/first (given name), surname/last (primary surname value), prefix/surname_prefix (particle before surname: von, de, van, del…), connector/surname_connector (joins compound surnames: - or y), origin_type/surname_origin (Gramps OriginType for the primary surname: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Custom, Unknown), patronymic (shortcut: stored as a separate Patronymic surname entry), matronymic (shortcut: stored as a separate Matronymic surname entry), title (Dr./Prof./Sir), suffix (Jr./Sr./III/PhD), call (preferred call name), nick/nickname, famnick/family_nick, type (name type: Birth Name/Married Name/Also Known As/…). Plain full-name strings (name/text/full or \"Given Middle Surname\") only split into given + surname; they cannot create structured name parts such as patronymic, matronymic, prefix, connector, origin_type, title, suffix, call, nick, or famnick. Use object fields or native surname_list instead. For complex multi-surname cases use native Gramps surname_list format. Also accepts: name/text/full as a full-name string with optional type field."New value: +"New primary name; replaces the whole current one. Omit to leave unchanged. Name: full Gramps name JSON (see gramps://input-guide), a plain string (\"Married Name:: Jane|Smith\"), or a simple object. Prefer a JSON object (not a quoted JSON string) when using structured name parts. Object fields: given/first (given name), surname/last (primary surname value), prefix/surname_prefix (particle before surname: von, de, van, del…), connector/surname_connector (joins compound surnames: - or y), origin_type/surname_origin (Gramps OriginType for the primary surname: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Unknown), patronymic (shortcut: stored as a separate Patronymic surname entry), matronymic (shortcut: stored as a separate Matronymic surname entry), title (Dr./Prof./Sir), suffix (Jr./Sr./III/PhD), call (preferred call name), nick/nickname, famnick/family_nick, type (name type: Birth Name/Married Name/Also Known As/…). Name types and origins must be standard Gramps ones or custom ones the tree already uses. Plain full-name strings (name/text/full or \"Given Middle Surname\") only split into given + surname; they cannot create structured name parts such as patronymic, matronymic, prefix, connector, origin_type, title, suffix, call, nick, or famnick. Use object fields or native surname_list instead. For complex multi-surname cases use native Gramps surname_list format. Also accepts: name/text/full as a full-name string with optional type field." - added
Input schema / properties / sortEventsAdded value: +{ + "default": false, + "description": "true sorts all event links by event date after the other changes, keeping each link's role and metadata; alone it sorts the stored list. Undated Birth, Baptism and Christening go first and other undated events last, ending with Death, then Burial and Cremation. On the same date: \"before\" dates, then Residence and Occupation, Birth, Baptism, other events, Death, Burial, then \"after\" dates. Default false keeps the order (linkMode add appends at the end).", + "type": "boolean" +} - changed
Input schema / properties / urls / descriptionPrevious value: -"URLs. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. URLs: JSON array of {type,path,desc}, or strings \"Web Home: https://…\" with optional \" — note\" after URL, or lines/| separated. Grammar: gramps://input-guide."New value: +"URLs. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. URLs: JSON array of {type,path,desc}, or strings \"Web Home: https://…\" with optional \" — note\" after URL, or lines/| separated. A type must be a standard Gramps URL type (E-mail, Web Home, Web Search, FTP, Unknown) or a custom one the tree already uses. Grammar: gramps://input-guide."
- Changed
update_source2 fields changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide. Each attribute takes only type, value and private."New value: +"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. A type must be a standard Gramps attribute type or a custom one the tree already uses; anything else is rejected with suggestions. Full grammar: gramps://input-guide. Each attribute takes only type, value and private." - changed
Input schema / properties / repositoryHandles / descriptionPrevious value: -"Repositories that hold the source. Omit to keep; applied per linkMode. Repository refs (handles, not Gramps IDs): JSON array of GrampsRepositoryRef objects, or strings \"Ref : CallNumber : MediaType\". JSON objects accept Gramps snake_case (call_number, media_type) or camelCase (callNumber, mediaType). Parts after Ref are optional: \"Ref : CallNumber\" and \"Ref :: MediaType\" are valid. Multiple refs: JSON array or one multiline / |-separated string."New value: +"Repositories that hold the source. Omit to keep; applied per linkMode. Repository refs (handles, not Gramps IDs): JSON array of GrampsRepositoryRef objects, or strings \"Ref : CallNumber : MediaType\". JSON objects accept Gramps snake_case (call_number, media_type) or camelCase (callNumber, mediaType). Parts after Ref are optional: \"Ref : CallNumber\" and \"Ref :: MediaType\" are valid. MediaType must be a standard Gramps source media type (Book, Manuscript, Film, Photo, …) or a custom one the tree already uses. Multiple refs: JSON array or one multiline / |-separated string."
1 tool update
- Added
read_media
11 tool updates
v2.3.1- Changed
create_citation3 fields changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide. Each attribute takes only type, value and private." - changed
Input schema / properties / noteHandles / descriptionPrevious value: -"Notes, e.g. a transcription. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."New value: +"Notes, e.g. a transcript of the entry (create_note with type Transcript). Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - removed
Input schema / properties / textRemoved value: -{ - "default": null, - "description": "Citation text or transcript (optional).", - "type": [ - "string", - "null" - ] -}
- Changed
create_source1 field changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide. Each attribute takes only type, value and private."
- Changed
update_citation3 fields changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide. Each attribute takes only type, value and private." - changed
Input schema / properties / linkMode / descriptionPrevious value: -"How to apply all supplied link lists: replace (default) replaces each full list; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata."New value: +"How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata." - removed
Input schema / properties / textRemoved value: -{ - "default": null, - "description": "New citation text or transcript. Omit to leave unchanged.", - "type": [ - "string", - "null" - ] -}
- Changed
update_event1 field changed- changed
Input schema / properties / linkMode / descriptionPrevious value: -"How to apply all supplied link lists: replace (default) replaces each full list; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata."New value: +"How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata."
- Changed
update_family1 field changed- changed
Input schema / properties / linkMode / descriptionPrevious value: -"How to apply all supplied link lists: replace (default) replaces each full list; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata."New value: +"How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata."
- Changed
update_media1 field changed- changed
Input schema / properties / linkMode / descriptionPrevious value: -"How to apply all supplied link lists: replace (default) replaces each full list; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata."New value: +"How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata."
- Changed
update_note2 fields changed- changed
Input schema / properties / linkMode / descriptionPrevious value: -"How to apply all supplied link lists: replace (default) replaces each full list; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata."New value: +"How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata." - changed
Input schema / properties / text / descriptionPrevious value: -"New text, replacing the whole body. Omit to leave unchanged."New value: +"New text, replacing the whole body; changed text loses the styling and links of the old one, the same text keeps them. Omit to leave unchanged."
- Changed
update_person1 field changed- changed
Input schema / properties / linkMode / descriptionPrevious value: -"How to apply all supplied link lists: replace (default) replaces each full list; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata."New value: +"How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata."
- Changed
update_place1 field changed- changed
Input schema / properties / linkMode / descriptionPrevious value: -"How to apply all supplied link lists: replace (default) replaces each full list; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata."New value: +"How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata."
- Changed
update_repository1 field changed- changed
Input schema / properties / linkMode / descriptionPrevious value: -"How to apply all supplied link lists: replace (default) replaces each full list; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata."New value: +"How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata."
- Changed
update_source2 fields changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide. Each attribute takes only type, value and private." - changed
Input schema / properties / linkMode / descriptionPrevious value: -"How to apply all supplied link lists: replace (default) replaces each full list; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata."New value: +"How to apply all supplied link lists: replace (default) replaces each full list, and a link it keeps keeps its stored privacy, citations, notes and crop unless the call sends new values; add appends missing handles and preserves existing link metadata; remove removes all links matching supplied handles (reference metadata is ignored). Omitted lists stay unchanged; empty lists clear only in replace mode. Does not affect attributes, names, addresses or URLs. Use separate calls to add and remove, or replace to edit existing link metadata."
29 tool updates
v2.3.0- Removed
add_event_to_person - Changed
create_citation9 fields changed- changed
Input schema / properties / confidence / descriptionPrevious value: -"Confidence: Very Low, Low, Normal, High, or Very High (default: Normal)"New value: +"How reliable the cited record is: Very Low, Low, Normal (default), High or Very High." - changed
Input schema / properties / date / descriptionPrevious value: -"Access or reference date text. Date format: use ISO dates (1990-03-15), year-only (1920), or modifiers (before 1920, about 1950). Add the calendar at the end for Old Style and other calendars: 1856-07-20 (Julian). See gramps://input-guide resource or call get_reference(topic: \"input-guide\", section: \"dates\") for full syntax."New value: +"Date of the cited entry, optional. Date text: 1856-07-20, 1920-05, 1920, 1 Jul 1919, about/before/after 1920, 1800-1850, between … and …; append the calendar for other calendars, e.g. 1856-07-20 (Julian). Unreadable dates are rejected." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Mark record private (default: false)"New value: +"Mark the citation private (default false)." - changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media handles (optional). Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Media such as the scan of the page. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / noteHandles / descriptionPrevious value: -"Note handles (optional). Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Notes, e.g. a transcription. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / page / descriptionPrevious value: -"Page reference within source (optional). Text value. JSON strings are accepted; JSON numbers are also accepted and sent as text."New value: +"Where in the source: page, act or entry number (optional). Text value. JSON strings are accepted; JSON numbers are also accepted and sent as text." - changed
Input schema / properties / sourceHandle / descriptionPrevious value: -"Source handle (required). Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"The source being cited (required). Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Tag handles (optional). Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Tags. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / text / descriptionPrevious value: -"Citation text / transcript (optional)"New value: +"Citation text or transcript (optional)."
- Changed
create_event9 fields changed- changed
Input schema / properties / citationHandles / descriptionPrevious value: -"Citation handles (optional). Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Citations supporting the event. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / date / descriptionPrevious value: -"Optional event date text. Date format: use ISO dates (1990-03-15), year-only (1920), or modifiers (before 1920, about 1950). Add the calendar at the end for Old Style and other calendars: 1856-07-20 (Julian). See gramps://input-guide resource or call get_reference(topic: \"input-guide\", section: \"dates\") for full syntax."New value: +"When it happened, optional. Date text: 1856-07-20, 1920-05, 1920, 1 Jul 1919, about/before/after 1920, 1800-1850, between … and …; append the calendar for other calendars, e.g. 1856-07-20 (Julian). Unreadable dates are rejected." - changed
Input schema / properties / description / descriptionPrevious value: -"Event description (optional)"New value: +"Short description, optional." - changed
Input schema / properties / eventType / descriptionPrevious value: -"Event type key from the tree. Type values are validated by the server; see gramps://types resource or call get_reference(topic: \"types\") for available values."New value: +"Event type, e.g. Birth, Baptism, Death, Burial, Marriage, Residence, Occupation. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: \"types\")." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Mark record private (default: false)"New value: +"Mark the event private (default false)." - changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media handles (optional). Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Media. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / noteHandles / descriptionPrevious value: -"Note handles (optional). Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Notes. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / placeHandle / descriptionPrevious value: -"Place handle for this event. Optional. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"Where it happened, optional; the place must exist (create_place). Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Tag handles (optional). Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Tags. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."
- Changed
create_family10 fields changed- changed
Input schema / properties / childRefs / descriptionPrevious value: -"Child links for this family. Child references: JSON array of {ref, frel, mrel}, strings \"HANDLE::RelType\" (sets both frel and mrel; default: Birth), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case (frel, mrel, tag_list) or camelCase (fatherRel, tagList, etc.)."New value: +"Children, each with its relation to the father and mother (Birth by default; Adopted, Stepchild, …). Child references (handles, not Gramps IDs): JSON array of {ref, frel, mrel}, strings \"HANDLE::RelType\" (sets both frel and mrel; default: Birth), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case (frel, mrel, tag_list) or camelCase (fatherRel, tagList, etc.)." - changed
Input schema / properties / citationHandles / descriptionPrevious value: -"Citation handles. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Citations. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / eventRefs / descriptionPrevious value: -"Events to link to this family. Event references: JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case or camelCase list fields (note_list / noteList)."New value: +"Existing family events such as Marriage or Divorce. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case or camelCase list fields (note_list / noteList)." - changed
Input schema / properties / fatherHandle / descriptionPrevious value: -"Father person handle. Optional. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"The father, optional. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Mark record private (default: false)"New value: +"Mark the family private (default false)." - changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media handles. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Media. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / motherHandle / descriptionPrevious value: -"Mother person handle. Optional. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"The mother, optional. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / noteHandles / descriptionPrevious value: -"Note handles. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Notes. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / relationshipType / descriptionPrevious value: -"Relationship type: Married, Unmarried, Civil Union, Unknown (default: Married)"New value: +"Relationship type: Married (default), Unmarried, Civil Union or Unknown. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: \"types\")." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Tag handles. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Tags. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."
- Changed
create_note5 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"Text format: Plain or Html (default: Plain)"New value: +"Text format: Plain (default) or Html." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Mark as private (optional)"New value: +"Mark the note private (default false)." - changed
Input schema / properties / noteType / descriptionPrevious value: -"Note type key. Type values are validated by the server; see gramps://types resource or call get_reference(topic: \"types\") for available values. Default General."New value: +"Note type, default General; e.g. Research, Transcript, Person Note, Event Note, Citation. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: \"types\")." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Tag handles (optional). Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Tags. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / text / descriptionPrevious value: -"Note body text (required)."New value: +"The note text (required)."
- Changed
create_person9 fields changed- changed
Input schema / properties / citationHandles / descriptionPrevious value: -"Citation handles. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Citations. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / eventRefs / descriptionPrevious value: -"Event links to attach to this person. Event references: JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case or camelCase list fields (note_list / noteList)."New value: +"Existing events this person takes part in, each with a role (Primary by default; Witness, Godparent, …). Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case or camelCase list fields (note_list / noteList)." - changed
Input schema / properties / familyHandles / descriptionPrevious value: -"Family handles (where this person is parent/spouse). Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Families where this person is a parent or spouse. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Mark record as private (default: false)"New value: +"Mark the person private (default false)." - changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media object handles. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Media. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / noteHandles / descriptionPrevious value: -"Note handles. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Notes. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / parentFamilyHandles / descriptionPrevious value: -"Parent family handles (where this person is child). Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Families where this person is a child. Does not add the person to the family's children: use childRefs on the family for that. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / personAssociations / descriptionPrevious value: -"Person associations: JSON array of {ref, rel, ...}, or strings \"PERSON_HANDLE:: Godfather\" (double colon after handle). JSON objects accept rel or relationship, and snake_case or camelCase list fields (note_list / noteList). Grammar: gramps://input-guide."New value: +"Person associations (handles, not Gramps IDs): JSON array of {ref, rel, ...}, or strings \"PERSON_HANDLE:: Godfather\" (double colon after handle). JSON objects accept rel or relationship, and snake_case or camelCase list fields (note_list / noteList). Grammar: gramps://input-guide." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Tag handles. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Tags. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."
- Changed
create_place16 fields changed- changed
Input schema / properties / alternateNames / descriptionPrevious value: -"Alternate place names. Alternate place names: array of strings (\"Old Name\" or \"Old Name::de\"), simple objects {value, lang?, date?}, or JSON array. Dated example: [{value:\"New York\", date:\"1914-08-31-1924-01-26\"}] or date \"from 5 Jul 1944\". Place dashes are spans (from…to); open \"1991-\" / \"from 1991\" are From. Unrecognized dates fail validation (see get_reference(topic: \"input-guide\", section: \"dates\"))."New value: +"Other names: historical, other languages. Alternate place names: array of strings (\"Old Name\" or \"Old Name::de\"), simple objects {value, lang?, date?}, or JSON array. Dated example: [{value:\"New York\", date:\"1914-08-31-1924-01-26\"}] or date \"from 5 Jul 1944\". Place dashes are spans (from…to); open \"1991-\" / \"from 1991\" are From. Unrecognized dates fail validation (see get_reference(topic: \"input-guide\", section: \"dates\"))." - changed
Input schema / properties / citationHandles / descriptionPrevious value: -"Citation handles. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Citations. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / code / descriptionPrevious value: -"Place code / postal reference (optional)"New value: +"Place code or postal code (optional)." - changed
Input schema / properties / enclosedBy / descriptionPrevious value: -"Parent place refs (enclosure hierarchy). Parent place refs via enclosedBy (not enclosedByHandles): handle string, array of handles, JSON array of {ref, date?}, or shorthand \"HANDLE::1920-1950\" (date optional). Place dashes are spans (from…to); open \"1991-\" / \"from 1991\" are From. English months OK: \"HANDLE::from 1 Oct 1929 to 27 Sep 1937\". Examples: [{ref:\"…\", date:\"1708-1927\"}], \"HANDLE::1991-\", date \"1703-1914-08-31\". Unrecognized dates fail validation. Smaller region → larger region order. See get_reference(topic: \"input-guide\", section: \"dates\")."New value: +"Places that contain this one. Parent place refs via enclosedBy (not enclosedByHandles): handle or Gramps ID, array of them, JSON array of {ref, date?}, or shorthand \"HANDLE::1920-1950\" (date optional). Place dashes are spans (from…to); open \"1991-\" / \"from 1991\" are From. English months OK: \"HANDLE::from 1 Oct 1929 to 27 Sep 1937\". Examples: [{ref:\"…\", date:\"1708-1927\"}], \"HANDLE::1991-\", date \"1703-1914-08-31\". Unrecognized dates fail validation. Smaller region → larger region order. See get_reference(topic: \"input-guide\", section: \"dates\")." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Mark record private (default: false)"New value: +"Mark the place private (default false)." - changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude coordinate"New value: +"Latitude in decimal degrees, north positive (52.2297). Text value. JSON strings are accepted; JSON numbers are also accepted and sent as text." - removed
Input schema / properties / lat / typeRemoved value: -[ - "string", - "null" -] - changed
Input schema / properties / lon / descriptionPrevious value: -"Longitude coordinate"New value: +"Longitude in decimal degrees, east positive (21.0122). Text value. JSON strings are accepted; JSON numbers are also accepted and sent as text." - removed
Input schema / properties / lon / typeRemoved value: -[ - "string", - "null" -] - changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media handles. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Media. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / name / descriptionPrevious value: -"Primary display name (required)."New value: +"Primary name (required)." - added
Input schema / properties / nameDateAdded value: +{ + "default": null, + "description": "When the primary name applies (default: always). Gramps shows the first name, primary first, whose date is empty or matches the event date, so an undated primary name hides dated alternate names: date the primary name too (\"from 1937-02-10\"). Dashes are spans; open \"1991-\" / \"from 1991\" are From. Unreadable dates are rejected.", + "type": [ + "string", + "null" + ] +} - changed
Input schema / properties / nameLang / descriptionPrevious value: -"Language code for primary name (default: omitted)"New value: +"Language code of the primary name, e.g. pl or de (optional)." - changed
Input schema / properties / noteHandles / descriptionPrevious value: -"Note handles. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Notes. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / placeType / descriptionPrevious value: -"Place type key. Type values are validated by the server; see gramps://types resource or call get_reference(topic: \"types\") for available values."New value: +"Place type, e.g. Country, Province, County, City, Town, Village, Hamlet, Parish. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: \"types\")." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Tag handles. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Tags. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."
- Changed
create_repository7 fields changed- changed
Input schema / properties / address / descriptionPrevious value: -"Street address (optional)"New value: +"Postal address as one line, e.g. \"12 High Street, London\", stored as the street of the repository's address (optional)." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Mark record private (default: false)"New value: +"Mark the repository private (default: false); Gramps Web hides private records from users not allowed to see them." - changed
Input schema / properties / name / descriptionPrevious value: -"Name (required)."New value: +"Name, e.g. \"State Archive in Warsaw\" (required)." - changed
Input schema / properties / noteHandles / descriptionPrevious value: -"Note handles (optional). Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Existing notes to link (optional); create them first with create_note. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / repoType / descriptionPrevious value: -"Repository type key. Type values are validated by the server; see gramps://types resource or call get_reference(topic: \"types\") for available values."New value: +"Repository type, e.g. Archive, Library, Church, Web site (optional; Gramps stores Library when omitted). Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: \"types\")." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Tag handles (optional). Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Existing tags to link (optional); create them first with create_tag. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / url / descriptionPrevious value: -"Website URL (optional)"New value: +"Website, e.g. https://archive.example.org, stored as the repository's web home link (optional)."
- Changed
create_source8 fields changed- changed
Input schema / properties / abbrev / descriptionPrevious value: -"Abbreviation (optional)"New value: +"Short title for lists (optional)." - changed
Input schema / properties / author / descriptionPrevious value: -"Author name (optional)"New value: +"Author or issuing body (optional)." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Mark record private (default: false)"New value: +"Mark the source private (default false)." - changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Media handles (optional). Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Media. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / noteHandles / descriptionPrevious value: -"Note handles (optional). Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Notes. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / pubinfo / descriptionPrevious value: -"Publication info (optional)"New value: +"Publication info: publisher, place, year (optional)." - changed
Input schema / properties / repositoryHandles / descriptionPrevious value: -"Repository refs. Repository refs: JSON array of GrampsRepositoryRef objects, or strings \"Ref : CallNumber : MediaType\". JSON objects accept Gramps snake_case (call_number, media_type) or camelCase (callNumber, mediaType). Parts after Ref are optional: \"Ref : CallNumber\" and \"Ref :: MediaType\" are valid. Multiple refs: JSON array or one multiline / |-separated string."New value: +"Repositories that hold the source, each with an optional call number and media type; the repositories must exist (create_repository). Repository refs (handles, not Gramps IDs): JSON array of GrampsRepositoryRef objects, or strings \"Ref : CallNumber : MediaType\". JSON objects accept Gramps snake_case (call_number, media_type) or camelCase (callNumber, mediaType). Parts after Ref are optional: \"Ref : CallNumber\" and \"Ref :: MediaType\" are valid. Multiple refs: JSON array or one multiline / |-separated string." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Tag handles (optional). Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Tags. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."
- Changed
create_tag3 fields changed- changed
Input schema / properties / color / descriptionPrevious value: -"Color as six hex digits RRGGBB without #. Default 000000 (black)."New value: +"Color as six hex digits RRGGBB without #, e.g. FF5733; stored as given. Default 000000 (black)." - changed
Input schema / properties / name / descriptionPrevious value: -"Display name (required)."New value: +"Tag name shown on records (required)." - changed
Input schema / properties / priority / descriptionPrevious value: -"Sort priority; lower often sorts first (default 0)."New value: +"Sort priority among tags in Gramps (default 0)."
- Changed
delete_object3 fields changed- changed
Input schema / properties / force / descriptionPrevious value: -"If true, delete despite backlinks. This may leave dangling references. Default false."New value: +"true deletes even when other records still point to it, leaving those links dangling (default false)." - changed
Input schema / properties / handle / descriptionPrevious value: -"Object handle or Gramps ID (for example I0001). Handles are opaque API strings; Gramps IDs are resolved automatically."New value: +"The record to delete. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / objectType / descriptionPrevious value: -"Object type: person | family | event | place | source | citation | note | media | repository | tag."New value: +"Record type: person, family, event, place, source, citation, note, media, repository or tag."
- Changed
get_object3 fields changed- changed
Input schema / properties / extended / descriptionPrevious value: -"For person and family only: resolve linked objects inline. Default: false."New value: +"People and families only: also resolve the linked records (event dates and places, note text, tag names, citations, media) in the same call; default false is faster. Rejected for other types." - changed
Input schema / properties / identifier / descriptionPrevious value: -"Object handle or Gramps ID (e.g. I0001). Gramps ID prefixes: I person, F family, E event, P place, S source, C citation, N note, O media, R repository, T tag."New value: +"Gramps ID (e.g. I0001) or handle. ID prefixes give the type: I person, F family, E event, P place, S source, C citation, N note, O media, R repository, T tag." - changed
Input schema / properties / objectType / descriptionPrevious value: -"Optional for a Gramps ID, whose prefix determines the type. Required for an opaque handle: person | family | event | place | source | citation | note | media | repository | tag."New value: +"Record type: person, family, event, place, source, citation, note, media, repository or tag. Omit for a Gramps ID; required for a handle."
- Changed
get_person_tree3 fields changed- changed
Input schema / properties / direction / descriptionPrevious value: -"Tree direction: ancestors | descendants."New value: +"ancestors (parents, grandparents, …) or descendants (children, grandchildren, …)." - changed
Input schema / properties / generations / descriptionPrevious value: -"Number of generations to include (default: 3, max: 10)"New value: +"How many generations to walk, 1–10 (default 3); other values are clamped." - changed
Input schema / properties / person / descriptionPrevious value: -"Root person handle or Gramps ID. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"The person to start from. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects."
- Changed
get_recent_changes1 field changed- changed
Input schema / properties / limit / descriptionPrevious value: -"How many history rows (clamped 1–100). Default 20."New value: +"How many transactions to show, 1–100 (default 20); other values are clamped."
- Changed
get_reference2 fields changed- changed
Input schema / properties / section / descriptionPrevious value: -"Optional section. input-guide: dates | name_schema | link_updates | structured_fields | structured_fields.names | structured_fields.attributes | structured_fields.urls | structured_fields.addresses | structured_fields.person_associations | structured_fields.repository_refs. types: a category key such as event_types. name-settings: formats | groups. Not supported for metadata."New value: +"One part only (optional; omit for the whole topic). input-guide: dates, name_schema, link_updates, structured_fields, or one of structured_fields.names, .attributes, .urls, .addresses, .person_associations, .repository_refs. types: a category such as event_types or place_types. name-settings: formats or groups. metadata has no sections." - changed
Input schema / properties / topic / descriptionPrevious value: -"Reference topic: input-guide | types | metadata | name-settings."New value: +"Which reference: input-guide, types, metadata or name-settings."
- Changed
get_relations2 fields changed- changed
Input schema / properties / handle1 / descriptionPrevious value: -"First person handle. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"Person 1, the one the relationship is told from. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / handle2 / descriptionPrevious value: -"Second person handle. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"Person 2, the one whose relationship to person 1 is named. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects."
- Changed
get_timeline5 fields changed- changed
Input schema / properties / events / descriptionPrevious value: -"Event categories: vital, family, religious, vocational, academic, travel, legal, residence, other, custom."New value: +"Only these event categories (omit for all): vital, family, religious, vocational, academic, travel, legal, residence, other, custom." - changed
Input schema / properties / identifier / descriptionPrevious value: -"Person, family, or place handle or Gramps ID."New value: +"The person, family or place. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / objectType / descriptionPrevious value: -"Timeline owner type: person | family | place."New value: +"Whose timeline: person, family or place." - changed
Input schema / properties / relativeEvents / descriptionPrevious value: -"For person only: event categories for the listed relatives."New value: +"Person timelines only: event categories to show for those relatives, same values as events." - changed
Input schema / properties / relatives / descriptionPrevious value: -"For person only: include events of father, mother, brother, sister, wife, husband, son, or daughter."New value: +"Person timelines only: whose events to add: father, mother, brother, sister, wife, husband, son, daughter."
- Changed
list_objects7 fields changed- changed
Input schema / properties / gql / descriptionPrevious value: -"Optional. Gramps QL expression executed server-side for filtering."New value: +"Filter in Gramps Query Language, run on the server, e.g. gender == 1 or media_list.length >= 1 (optional)." - changed
Input schema / properties / grampsId / descriptionPrevious value: -"Optional. Filter by numeric/string Gramps ID (I0001-style), NOT the opaque handle."New value: +"Only the record with this Gramps ID, e.g. I0001 (not a handle; optional)." - changed
Input schema / properties / objectType / descriptionPrevious value: -"Object collection: people | families | events | places | sources | citations | repositories | notes | media | tags (exact spelling, case-insensitive)."New value: +"Which records to list: people, families, events, places, sources, citations, repositories, notes, media or tags." - changed
Input schema / properties / page / descriptionPrevious value: -"1-based page. Default 1."New value: +"Page number, from 1 (default 1)." - changed
Input schema / properties / pagesize / descriptionPrevious value: -"Page size. Default 20, max 100."New value: +"Records per page, 1–100 (default 20)." - changed
Input schema / properties / sort / descriptionPrevious value: -"Optional. Sort field; leading - means descending."New value: +"Field to sort by, e.g. gramps_id; a leading - sorts descending, e.g. -change for latest edits first (optional)." - changed
Input schema / properties / sourceHandle / descriptionPrevious value: -"Optional. When objectType is citations, limit to citations of this source handle. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"With objectType citations only: list just the citations of this source; combined with gql by and (optional). Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects."
- Removed
quick_add_person - Changed
search3 fields changed- changed
Input schema / properties / page / descriptionPrevious value: -"1-based page index. Default 1."New value: +"Page number, from 1 (default 1)." - changed
Input schema / properties / pagesize / descriptionPrevious value: -"Page size. Default 20, maximum 100."New value: +"Hits per page, 1–100 (default 20)." - changed
Input schema / properties / query / descriptionPrevious value: -"Query string; * is wildcard. Examples: Smith*, John, Dublin*"New value: +"Words to find; * matches any ending. Examples: Smith*, John, Dublin*, a register title."
- Changed
update_citation11 fields changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Replace attributes. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide." - changed
Input schema / properties / confidence / descriptionPrevious value: -"Confidence: Very Low, Low, Normal, High, Very High. Omit to leave unchanged."New value: +"New confidence: Very Low, Low, Normal, High or Very High. Omit to leave unchanged." - changed
Input schema / properties / date / descriptionPrevious value: -"Date text. Omit to keep the current date; pass an empty string to remove it. Date format: use ISO dates (1990-03-15), year-only (1920), or modifiers (before 1920, about 1950). Add the calendar at the end for Old Style and other calendars: 1856-07-20 (Julian). See gramps://input-guide resource or call get_reference(topic: \"input-guide\", section: \"dates\") for full syntax."New value: +"New date. Omit to keep the current date; pass an empty string to remove it. Date text: 1856-07-20, 1920-05, 1920, 1 Jul 1919, about/before/after 1920, 1800-1850, between … and …; append the calendar for other calendars, e.g. 1856-07-20 (Julian). Unreadable dates are rejected." - changed
Input schema / properties / handle / descriptionPrevious value: -"Citation handle. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"The citation to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Private flag. Omit to leave unchanged."New value: +"true makes the record private, false public. Omit to leave unchanged." - changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Linked media. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Media. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / noteHandles / descriptionPrevious value: -"Linked notes. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Notes. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / page / descriptionPrevious value: -"Page within source. Text value. JSON strings are accepted; JSON numbers are also accepted and sent as text. Omit to leave unchanged."New value: +"New page, act or entry number. Omit to leave unchanged. Text value. JSON strings are accepted; JSON numbers are also accepted and sent as text." - changed
Input schema / properties / sourceHandle / descriptionPrevious value: -"Source handle. Omit to leave unchanged. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"Another source to cite instead. Omit to leave unchanged. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Linked tags. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / text / descriptionPrevious value: -"Transcript or citation text. Omit to leave unchanged."New value: +"New citation text or transcript. Omit to leave unchanged."
- Changed
update_event11 fields changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Replace attributes. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide." - changed
Input schema / properties / citationHandles / descriptionPrevious value: -"Linked citations. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Citations. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / date / descriptionPrevious value: -"Event date text. Omit to keep the current date; pass an empty string to remove it. Date format: use ISO dates (1990-03-15), year-only (1920), or modifiers (before 1920, about 1950). Add the calendar at the end for Old Style and other calendars: 1856-07-20 (Julian). See gramps://input-guide resource or call get_reference(topic: \"input-guide\", section: \"dates\") for full syntax."New value: +"New date. Omit to keep the current date; pass an empty string to remove it. Date text: 1856-07-20, 1920-05, 1920, 1 Jul 1919, about/before/after 1920, 1800-1850, between … and …; append the calendar for other calendars, e.g. 1856-07-20 (Julian). Unreadable dates are rejected." - changed
Input schema / properties / description / descriptionPrevious value: -"Description text. Omit to leave unchanged."New value: +"New description. Omit to leave unchanged." - changed
Input schema / properties / eventType / descriptionPrevious value: -"Event type. Omit to leave unchanged. Type values are validated by the server; see gramps://types resource or call get_reference(topic: \"types\") for available values."New value: +"New event type. Omit to leave unchanged. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: \"types\")." - changed
Input schema / properties / handle / descriptionPrevious value: -"Event handle. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"The event to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Private flag. Omit to leave unchanged."New value: +"true makes the record private, false public. Omit to leave unchanged." - changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Linked media. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Media. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / noteHandles / descriptionPrevious value: -"Linked notes. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Notes. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / placeHandle / descriptionPrevious value: -"Place handle. Omit to leave unchanged. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"New place. Omit to leave unchanged. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Linked tags. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."
- Changed
update_family12 fields changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Replace attributes. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide." - changed
Input schema / properties / childRefs / descriptionPrevious value: -"Linked all children. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Child references: JSON array of {ref, frel, mrel}, strings \"HANDLE::RelType\" (sets both frel and mrel; default: Birth), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case (frel, mrel, tag_list) or camelCase (fatherRel, tagList, etc.)."New value: +"Children with their relations to the parents. In replace mode the list must hold every child the family keeps. Omit to keep; applied per linkMode. Child references (handles, not Gramps IDs): JSON array of {ref, frel, mrel}, strings \"HANDLE::RelType\" (sets both frel and mrel; default: Birth), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case (frel, mrel, tag_list) or camelCase (fatherRel, tagList, etc.)." - changed
Input schema / properties / citationHandles / descriptionPrevious value: -"Linked citation links. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Citations. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / eventRefs / descriptionPrevious value: -"Linked family–event links. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Event references: JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case or camelCase list fields (note_list / noteList)."New value: +"Family events (Marriage, Divorce, …). Omit to keep; applied per linkMode. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case or camelCase list fields (note_list / noteList)." - changed
Input schema / properties / fatherHandle / descriptionPrevious value: -"Father person handle. Omit to leave unchanged. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"New father. Omit to leave unchanged. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / handle / descriptionPrevious value: -"Family handle. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"The family to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Private flag. Omit to leave unchanged."New value: +"true makes the record private, false public. Omit to leave unchanged." - changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Linked media links. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Media. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / motherHandle / descriptionPrevious value: -"Mother person handle. Omit to leave unchanged. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"New mother. Omit to leave unchanged. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / noteHandles / descriptionPrevious value: -"Linked note links. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Notes. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / relationshipType / descriptionPrevious value: -"Relationship type string. Omit to leave unchanged. Type values are validated by the server; see gramps://types resource or call get_reference(topic: \"types\") for available values."New value: +"Relationship type (Married, Unmarried, Civil Union, Unknown). Omit to leave unchanged. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: \"types\")." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Linked tag links. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."
- Changed
update_media8 fields changed- changed
Input schema / properties / attributes / descriptionPrevious value: -"Replace attributes. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide." - changed
Input schema / properties / citationHandles / descriptionPrevious value: -"Linked citations. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Citations. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / date / descriptionPrevious value: -"Date text. Omit to keep the current date; pass an empty string to remove it. Date format: use ISO dates (1990-03-15), year-only (1920), or modifiers (before 1920, about 1950). Add the calendar at the end for Old Style and other calendars: 1856-07-20 (Julian). See gramps://input-guide resource or call get_reference(topic: \"input-guide\", section: \"dates\") for full syntax."New value: +"New date. Omit to keep the current date; pass an empty string to remove it. Date text: 1856-07-20, 1920-05, 1920, 1 Jul 1919, about/before/after 1920, 1800-1850, between … and …; append the calendar for other calendars, e.g. 1856-07-20 (Julian). Unreadable dates are rejected." - changed
Input schema / properties / description / descriptionPrevious value: -"Description. Omit to leave unchanged."New value: +"New description (caption). Omit to leave unchanged." - changed
Input schema / properties / handle / descriptionPrevious value: -"Media handle. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"The media object to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Private flag. Omit to leave unchanged."New value: +"true makes the record private, false public. Omit to leave unchanged." - changed
Input schema / properties / noteHandles / descriptionPrevious value: -"Linked notes. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Notes. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Linked tags. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."
- Changed
update_note5 fields changed- changed
Input schema / properties / handle / descriptionPrevious value: -"Note handle. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"The note to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Private flag. Omit to leave unchanged."New value: +"true makes the record private, false public. Omit to leave unchanged." - changed
Input schema / properties / noteType / descriptionPrevious value: -"Note type. Omit to leave unchanged. Type values are validated by the server; see gramps://types resource or call get_reference(topic: \"types\") for available values."New value: +"New note type. Omit to leave unchanged. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: \"types\")." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Linked tags. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / text / descriptionPrevious value: -"Body text. Omit to leave unchanged."New value: +"New text, replacing the whole body. Omit to leave unchanged."
- Changed
update_person15 fields changed- changed
Input schema / properties / addresses / descriptionPrevious value: -"Replace addresses. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Addresses: JSON array of Gramps address objects; or text blocks with lines like street:, city:, … (blank line or --- between addresses); or one plain line = street only. Grammar: gramps://input-guide."New value: +"Addresses. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Addresses: JSON array of Gramps address objects; or text blocks with lines like street:, city:, … (blank line or --- between addresses); or one plain line = street only. Grammar: gramps://input-guide." - changed
Input schema / properties / alternateNames / descriptionPrevious value: -"Replace all alternate names. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Alternate names: array of strings (\"Married Name:: Jane|Smith\"), simple objects, or full Gramps name objects. Object fields: given/first, surname/last, prefix/surname_prefix (von/de/van), connector/surname_connector, origin_type/surname_origin (Gramps OriginType: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Custom, Unknown), patronymic (→ separate Patronymic surname entry), matronymic (→ separate Matronymic surname entry), title, suffix (Jr./Sr./III), call, nick, famnick, type (name type). For multi-surname names use native surname_list format. Multiple names in one string: separate with newlines (not |)."New value: +"Alternate names. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Alternate names: array of strings (\"Married Name:: Jane|Smith\"), simple objects, or full Gramps name objects. Object fields: given/first, surname/last, prefix/surname_prefix (von/de/van), connector/surname_connector, origin_type/surname_origin (Gramps OriginType: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Custom, Unknown), patronymic (→ separate Patronymic surname entry), matronymic (→ separate Matronymic surname entry), title, suffix (Jr./Sr./III), call, nick, famnick, type (name type). For multi-surname names use native surname_list format. Multiple names in one string: separate with newlines (not |)." - changed
Input schema / properties / attributes / descriptionPrevious value: -"Replace attributes. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide." - changed
Input schema / properties / citationHandles / descriptionPrevious value: -"Linked citation links. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Citations. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / eventRefs / descriptionPrevious value: -"Linked all person–event links. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Event references: JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case or camelCase list fields (note_list / noteList)."New value: +"Events this person takes part in, with roles. In replace mode the list must hold every event the person keeps. Omit to keep; applied per linkMode. Event references (handles, not Gramps IDs): JSON array of {ref, role}, strings \"HANDLE::Role\" (default role: Primary), comma/pipe/newline-separated, or a single handle. JSON objects accept snake_case or camelCase list fields (note_list / noteList)." - changed
Input schema / properties / familyHandles / descriptionPrevious value: -"Linked families where this person is parent/spouse. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Families where this person is a parent or spouse. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / handle / descriptionPrevious value: -"Person handle. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"The person to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Private flag. Omit to leave unchanged."New value: +"true makes the record private, false public. Omit to leave unchanged." - changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Linked media links. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Media. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / noteHandles / descriptionPrevious value: -"Linked note links. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Notes. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / parentFamilyHandles / descriptionPrevious value: -"Linked parent (child-of) families. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Families where this person is a child. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / personAssociations / descriptionPrevious value: -"Linked person associations. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Person associations: JSON array of {ref, rel, ...}, or strings \"PERSON_HANDLE:: Godfather\" (double colon after handle). JSON objects accept rel or relationship, and snake_case or camelCase list fields (note_list / noteList). Grammar: gramps://input-guide."New value: +"Associations with other people (godfather, friend, …). Omit to keep; applied per linkMode. Person associations (handles, not Gramps IDs): JSON array of {ref, rel, ...}, or strings \"PERSON_HANDLE:: Godfather\" (double colon after handle). JSON objects accept rel or relationship, and snake_case or camelCase list fields (note_list / noteList). Grammar: gramps://input-guide." - changed
Input schema / properties / primaryName / descriptionPrevious value: -"Replace primary name. Omit to leave unchanged. Name: full Gramps name JSON (see gramps://input-guide), a plain string (\"Married Name:: Jane|Smith\"), or a simple object. Prefer a JSON object (not a quoted JSON string) when using structured name parts. Object fields: given/first (given name), surname/last (primary surname value), prefix/surname_prefix (particle before surname: von, de, van, del…), connector/surname_connector (joins compound surnames: - or y), origin_type/surname_origin (Gramps OriginType for the primary surname: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Custom, Unknown), patronymic (shortcut: stored as a separate Patronymic surname entry), matronymic (shortcut: stored as a separate Matronymic surname entry), title (Dr./Prof./Sir), suffix (Jr./Sr./III/PhD), call (preferred call name), nick/nickname, famnick/family_nick, type (name type: Birth Name/Married Name/Also Known As/…). Plain full-name strings (name/text/full or \"Given Middle Surname\") only split into given + surname; they cannot create structured name parts such as patronymic, matronymic, prefix, connector, origin_type, title, suffix, call, nick, or famnick. Use object fields or native surname_list instead. For complex multi-surname cases use native Gramps surname_list format. Also accepts: name/text/full as a full-name string with optional type field."New value: +"New primary name; replaces the whole current one. Omit to leave unchanged. Name: full Gramps name JSON (see gramps://input-guide), a plain string (\"Married Name:: Jane|Smith\"), or a simple object. Prefer a JSON object (not a quoted JSON string) when using structured name parts. Object fields: given/first (given name), surname/last (primary surname value), prefix/surname_prefix (particle before surname: von, de, van, del…), connector/surname_connector (joins compound surnames: - or y), origin_type/surname_origin (Gramps OriginType for the primary surname: Inherited, Given, Taken, Patronymic, Matronymic, Feudal, Pseudonym, Patrilineal, Matrilineal, Occupation, Location, Custom, Unknown), patronymic (shortcut: stored as a separate Patronymic surname entry), matronymic (shortcut: stored as a separate Matronymic surname entry), title (Dr./Prof./Sir), suffix (Jr./Sr./III/PhD), call (preferred call name), nick/nickname, famnick/family_nick, type (name type: Birth Name/Married Name/Also Known As/…). Plain full-name strings (name/text/full or \"Given Middle Surname\") only split into given + surname; they cannot create structured name parts such as patronymic, matronymic, prefix, connector, origin_type, title, suffix, call, nick, or famnick. Use object fields or native surname_list instead. For complex multi-surname cases use native Gramps surname_list format. Also accepts: name/text/full as a full-name string with optional type field." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Linked tag links. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / urls / descriptionPrevious value: -"Replace URLs. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. URLs: JSON array of {type,path,desc}, or strings \"Web Home: https://…\" with optional \" — note\" after URL, or lines/| separated. Grammar: gramps://input-guide."New value: +"URLs. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. URLs: JSON array of {type,path,desc}, or strings \"Web Home: https://…\" with optional \" — note\" after URL, or lines/| separated. Grammar: gramps://input-guide."
- Changed
update_place17 fields changed- changed
Input schema / properties / alternateNames / descriptionPrevious value: -"Replace alternate place names. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Alternate place names: array of strings (\"Old Name\" or \"Old Name::de\"), simple objects {value, lang?, date?}, or JSON array. Dated example: [{value:\"New York\", date:\"1914-08-31-1924-01-26\"}] or date \"from 5 Jul 1944\". Place dashes are spans (from…to); open \"1991-\" / \"from 1991\" are From. Unrecognized dates fail validation (see get_reference(topic: \"input-guide\", section: \"dates\"))."New value: +"Alternate names. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Alternate place names: array of strings (\"Old Name\" or \"Old Name::de\"), simple objects {value, lang?, date?}, or JSON array. Dated example: [{value:\"New York\", date:\"1914-08-31-1924-01-26\"}] or date \"from 5 Jul 1944\". Place dashes are spans (from…to); open \"1991-\" / \"from 1991\" are From. Unrecognized dates fail validation (see get_reference(topic: \"input-guide\", section: \"dates\"))." - changed
Input schema / properties / citationHandles / descriptionPrevious value: -"Linked citations. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Citations. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / code / descriptionPrevious value: -"Place code. Omit to leave unchanged."New value: +"New place code. Omit to leave unchanged." - changed
Input schema / properties / enclosedBy / descriptionPrevious value: -"Linked parent place chain. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Parent place refs via enclosedBy (not enclosedByHandles): handle string, array of handles, JSON array of {ref, date?}, or shorthand \"HANDLE::1920-1950\" (date optional). Place dashes are spans (from…to); open \"1991-\" / \"from 1991\" are From. English months OK: \"HANDLE::from 1 Oct 1929 to 27 Sep 1937\". Examples: [{ref:\"…\", date:\"1708-1927\"}], \"HANDLE::1991-\", date \"1703-1914-08-31\". Unrecognized dates fail validation. Smaller region → larger region order. See get_reference(topic: \"input-guide\", section: \"dates\")."New value: +"Places that contain this one. Omit to keep; applied per linkMode. Parent place refs via enclosedBy (not enclosedByHandles): handle or Gramps ID, array of them, JSON array of {ref, date?}, or shorthand \"HANDLE::1920-1950\" (date optional). Place dashes are spans (from…to); open \"1991-\" / \"from 1991\" are From. English months OK: \"HANDLE::from 1 Oct 1929 to 27 Sep 1937\". Examples: [{ref:\"…\", date:\"1708-1927\"}], \"HANDLE::1991-\", date \"1703-1914-08-31\". Unrecognized dates fail validation. Smaller region → larger region order. See get_reference(topic: \"input-guide\", section: \"dates\")." - changed
Input schema / properties / handle / descriptionPrevious value: -"Place handle. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"The place to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Private flag. Omit to leave unchanged."New value: +"true makes the record private, false public. Omit to leave unchanged." - changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude string. Omit to leave unchanged."New value: +"Latitude in decimal degrees, north positive (52.2297). Text value. JSON strings are accepted; JSON numbers are also accepted and sent as text. Omit to keep the current value; pass an empty string to remove it." - removed
Input schema / properties / lat / typeRemoved value: -[ - "string", - "null" -] - changed
Input schema / properties / lon / descriptionPrevious value: -"Longitude string. Omit to leave unchanged."New value: +"Longitude in decimal degrees, east positive (21.0122). Text value. JSON strings are accepted; JSON numbers are also accepted and sent as text. Omit to keep the current value; pass an empty string to remove it." - removed
Input schema / properties / lon / typeRemoved value: -[ - "string", - "null" -] - changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Linked media. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Media. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / name / descriptionPrevious value: -"Name text. Omit to leave unchanged."New value: +"New primary name. Omit to leave unchanged." - added
Input schema / properties / nameDateAdded value: +{ + "default": null, + "description": "When the primary name applies. Omit to keep the current date; pass an empty string to remove it. Gramps shows the first name, primary first, whose date is empty or matches the event date, so an undated primary name hides dated alternate names: date the primary name too (\"from 1937-02-10\"). Dashes are spans; open \"1991-\" / \"from 1991\" are From. Unreadable dates are rejected.", + "type": [ + "string", + "null" + ] +} - changed
Input schema / properties / nameLang / descriptionPrevious value: -"Language code for primary name. Omit to leave unchanged."New value: +"Language code of the primary name. Omit to leave unchanged." - changed
Input schema / properties / noteHandles / descriptionPrevious value: -"Linked notes. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Notes. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / placeType / descriptionPrevious value: -"Place type. Omit to leave unchanged. Type values are validated by the server; see gramps://types resource or call get_reference(topic: \"types\") for available values."New value: +"New place type. Omit to leave unchanged. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: \"types\")." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Linked tags. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}."
- Changed
update_repository8 fields changed- changed
Input schema / properties / address / descriptionPrevious value: -"Street line (replaces address list when set). Omit to leave unchanged."New value: +"New postal address as one line; replaces every stored address, and an empty string removes them. Omit to leave unchanged." - changed
Input schema / properties / handle / descriptionPrevious value: -"Repository handle. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"The repository to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Private flag. Omit to leave unchanged."New value: +"true makes the record private, false public. Omit to leave unchanged." - changed
Input schema / properties / name / descriptionPrevious value: -"Name. Omit to leave unchanged."New value: +"New name. Omit to leave unchanged." - changed
Input schema / properties / noteHandles / descriptionPrevious value: -"Linked notes. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Notes. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / repoType / descriptionPrevious value: -"Type. Omit to leave unchanged. Type values are validated by the server; see gramps://types resource or call get_reference(topic: \"types\") for available values."New value: +"New type, e.g. Archive, Library, Church. Omit to leave unchanged. Must be a standard Gramps type or a custom one the tree already uses; anything else is rejected with suggestions. List: get_reference(topic: \"types\")." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Linked tags. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / url / descriptionPrevious value: -"Website URL (replaces url list when set). Omit to leave unchanged."New value: +"New website; replaces every stored link, and an empty string removes them. Omit to leave unchanged."
- Changed
update_source11 fields changed- changed
Input schema / properties / abbrev / descriptionPrevious value: -"Abbreviation. Omit to leave unchanged."New value: +"New abbreviation. Omit to leave unchanged." - changed
Input schema / properties / attributes / descriptionPrevious value: -"Replace attributes. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide."New value: +"Attributes. Omit to keep; a value replaces the whole list and [] clears it, whatever linkMode says. Attributes: JSON array of objects {type,value,...}, or strings \"Type: Value\" (first colon), or one string with lines or | between entries. Full grammar: gramps://input-guide." - changed
Input schema / properties / author / descriptionPrevious value: -"Author. Omit to leave unchanged."New value: +"New author. Omit to leave unchanged." - changed
Input schema / properties / handle / descriptionPrevious value: -"Source handle. Handle or Gramps ID (e.g. I0001). Handles are opaque strings from the API. Gramps IDs (like I0001, F0023) are auto-resolved to handles. Find handles with search() or list_objects()."New value: +"The source to change. Handle or Gramps ID (e.g. I0001), resolved automatically; find it with search or list_objects." - changed
Input schema / properties / isPrivate / descriptionPrevious value: -"Private flag. Omit to leave unchanged."New value: +"true makes the record private, false public. Omit to leave unchanged." - changed
Input schema / properties / mediaHandles / descriptionPrevious value: -"Linked media. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Media. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / noteHandles / descriptionPrevious value: -"Linked notes. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Notes. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / pubinfo / descriptionPrevious value: -"Publication info. Omit to leave unchanged."New value: +"New publication info. Omit to leave unchanged." - changed
Input schema / properties / repositoryHandles / descriptionPrevious value: -"Repository refs. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Repository refs: JSON array of GrampsRepositoryRef objects, or strings \"Ref : CallNumber : MediaType\". JSON objects accept Gramps snake_case (call_number, media_type) or camelCase (callNumber, mediaType). Parts after Ref are optional: \"Ref : CallNumber\" and \"Ref :: MediaType\" are valid. Multiple refs: JSON array or one multiline / |-separated string."New value: +"Repositories that hold the source. Omit to keep; applied per linkMode. Repository refs (handles, not Gramps IDs): JSON array of GrampsRepositoryRef objects, or strings \"Ref : CallNumber : MediaType\". JSON objects accept Gramps snake_case (call_number, media_type) or camelCase (callNumber, mediaType). Parts after Ref are optional: \"Ref : CallNumber\" and \"Ref :: MediaType\" are valid. Multiple refs: JSON array or one multiline / |-separated string." - changed
Input schema / properties / tagHandles / descriptionPrevious value: -"Linked tags. Omit to leave unchanged. For link lists, linkMode controls replace/add/remove; [] clears in replace mode and does nothing in add/remove. Other lists always use replacement. Handles: JSON array [\"h1\",\"h2\"], a single handle as a plain string, comma/semicolon/newline-separated list, or a JSON-array string. Array entries may be strings or objects {\"ref\":\"…\"} / {\"handle\":\"…\"}."New value: +"Tags. Omit to keep; applied per linkMode. Handles, not Gramps IDs: JSON array [\"h1\",\"h2\"], one handle, or a comma/semicolon/newline-separated string; entries may also be objects {\"ref\":\"…\"}." - changed
Input schema / properties / title / descriptionPrevious value: -"Title. Omit to leave unchanged."New value: +"New title. Omit to leave unchanged."
30 tool updates
v2.2.0- First observed
add_event_to_person - First observed
create_citation - First observed
create_event - First observed
create_family - First observed
create_note - First observed
create_person - First observed
create_place - First observed
create_repository - First observed
create_source - First observed
create_tag - First observed
delete_object - First observed
get_bookmarks - First observed
get_object - First observed
get_person_tree - First observed
get_recent_changes - First observed
get_reference - First observed
get_relations - First observed
get_timeline - First observed
list_objects - First observed
quick_add_person - First observed
search - First observed
update_citation - First observed
update_event - First observed
update_family - First observed
update_media - First observed
update_note - First observed
update_person - First observed
update_place - First observed
update_repository - First observed
update_source
TDQS
Scored across 35 tools
Each tool has a clearly distinct resource and action: per-type create/update tools, generic read/list/search/delete tools, and specialized tools such as get_person_tree, get_relations, get_timeline, find_duplicates, merge_objects, undo_change, and read_media. The few potentially overlapping areas, especially create_records versus individual create_* tools and search versus list_objects, are explicitly differentiated in the descriptions.
The set overwhelmingly follows a snake_case verb_noun pattern such as create_person, update_family, get_object, list_objects, and delete_object. The only notable deviation is the single-verb tool search, which is still readable and conventional.
Thirty-five tools is heavy for a single MCP server and exceeds the typical well-scoped range, even though the genealogy domain is broad and has many record types. Per-type create/update tools plus generic utilities make each tool defensible individually, but the overall set is still too large for easy agent use.
The surface covers full lifecycle operations across people, families, events, places, sources, citations, repositories, notes, media, and tags, with generic get/list/search/delete covering all types. It also includes batch creation, duplicate detection, merging, undo, recent changes, bookmarks, relationship/tree/timeline views, and media reading, leaving no obvious dead ends.
Maintenance
Related MCP Connectors
MCP server for Gramps genealogy via the Gramps Web API: CRUD, search, merge, timelines, DNA.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables 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.51AGPL 3.0
- AlicenseAqualityBmaintenanceMCP server that lets AI agents (Claude, Cursor) debug your .NET / ASP.NET Core app2715MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI assistants to search, retrieve, and create genealogical records in a Gramps Web instance.14 npm4MIT
- AlicenseNot gradedqualityDmaintenanceEnables MCP clients to read and edit a Gramps family tree hosted on Gramps Web, with guarded write operations that tag new records as unconfirmed for review.MIT