Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
GRAMPS_API_URLYesBase URL of your Gramps Web instance (no trailing slash)
GRAMPS_TREE_IDYesTree UUID on that server
GRAMPS_PASSWORDYesAPI password or token
GRAMPS_USERNAMEYesAPI user name

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}
prompts
{
  "listChanged": true
}
resources
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
create_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").

update_citationA

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

find_duplicatesA

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.

create_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").

update_eventA

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

create_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").

update_familyA

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

read_mediaA

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.

create_mediaA

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

update_mediaA

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

merge_objectsA

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.

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

update_noteA

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.

get_objectA

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.

delete_objectA

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.

get_person_treeA

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.

get_relationsA

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.

create_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").

update_personA

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

create_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").

update_placeA

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

create_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").

get_referenceA

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.

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

update_repositoryA

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.

searchA

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.

list_objectsA

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.

create_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").

update_sourceA

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

get_recent_changesA

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.

get_bookmarksA

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.

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

update_tagA

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.

get_timelineA

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.

undo_changeA

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.

Prompts

Interactive templates invoked by user choice

NameDescription
add-personAdd a new person with optional birth/death events
research-personResearch a person, expanding to timelines or trees only when relevant
add-familyCreate a family connecting two people with optional marriage event
find-connectionsFind the genealogical relationship between two people
import-from-textParse genealogical information from text and add to the database
change-linkAdd or remove one link between existing Gramps records
cite-factAttach a source citation to an existing person, family, event, place, or media record
audit-treeCheck the tree or one person's branch for impossible dates, duplicates, unsourced facts, unlinked records and missing data, without changing anything

Resources

Contextual data attached and managed by the client

NameDescription
input-guideComplete write-input reference: date formats, structured fields, link updates, and full Name schema.
typesRead-only type vocabularies (built-in + custom) for validating type/role/origin strings.
metadataConnection and tree metadata (API version, tree id/name, owner, default person, etc.).
name-settingsName display format definitions and surname grouping rules configured in this tree.
filter-rulesHow Gramps filter rules select records in list_objects, with the number of rules and the saved filters of each type.

TDQS

A4.4/5.0

Scored across 35 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness5/5

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

ActivityActive
ResponsivenessResponsive