Gramps Web MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GRAMPS_API_URL | Yes | Base URL of your Gramps Web instance (no trailing slash) | |
| GRAMPS_TREE_ID | Yes | Tree UUID on that server | |
| GRAMPS_PASSWORD | Yes | API password or token | |
| GRAMPS_USERNAME | Yes | API 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
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_recent_changesA | Show the tree's recent edit history, newest first: commit time (UTC), description, user, an undo marker, and each changed object's class, change kind (added/updated/deleted) and handle, up to 10 objects per transaction. A link added or removed between objects appears as Reference from one handle to the other. Use it to see what was changed last and by whom, or to check that your own writes landed; for the dated events of one person use get_timeline, and read a changed record with get_object. |
| 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, look up one Gramps ID, list the citations of a source, or filter by fields with Gramps Query Language; to find records by text use search, and to read one record in full use get_object. |
| 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 closest relationship with generations to the common ancestor, then every relationship found with its common ancestors by name. Searches blood relatives up to 15 generations plus spouses; unrelated people get a clear message. Find both people first with search. To list a whole line of ancestors or descendants use get_person_tree. |
| 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. Returns one line per hit (type, Gramps ID, summary, handle) with the page and total count; pass a Gramps ID or handle to get_object for the full record. To browse or filter one type by its fields (all people, citations of one source, sorted by change) use list_objects. Very long queries can fail on the server; use a shorter term then. |
| 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 the person's parent families; descendants follow the children of families where the person is a parent, so relatives not linked that way are missing. 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. |
| delete_objectA | Permanently delete one record; it cannot be undone through this server. 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. On success returns the type, action: deleted and the handle; a missing record returns a not-found message. |
| get_referenceA | Read the server's reference text before writing when a format or type is unclear. Topics: input-guide (how to write dates, names, link updates and structured fields such as attributes and addresses), types (the valid event, role, place, note and other types, including custom ones the tree uses), metadata (server and tree info), and name-settings (name display formats and surname groups). section narrows the reply to one part; an unknown topic or section is rejected with the valid ones. The same texts are MCP resources (gramps://input-guide and so on) for clients that read resources. |
| create_event | 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 place must exist: find it with search or create it with create_place. Change an existing event with update_event. An unknown type or unreadable date is rejected before anything is saved. Formats of every argument: get_reference(topic: "input-guide"). |
| update_person | Change an existing person: names, gender, links to events, families, citations, notes, media and tags, attributes, addresses, URLs, associations or the private flag. 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. Returns the handle and Gramps ID; a missing person returns a not-found message. Links live on one side: to link an event to this person, update the person (linkMode add), not the event. Formats of every argument: get_reference(topic: "input-guide"). |
| update_family | Change an existing family: father, mother, relationship type, children, family events, citations, notes, media, tags, attributes or the private flag. 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. Returns the handle and Gramps ID; a missing family returns a not-found message. To add one child, pass it in childRefs with linkMode add. Formats of every argument: get_reference(topic: "input-guide"). |
| create_citation | Create a citation: one specific spot in an existing source (page, act or entry number) with its date, confidence, notes and media such as the scan. Returns the new handle, Gramps ID and page, with next steps. The source must already exist (search, or create_source). 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. Formats of every argument: get_reference(topic: "input-guide"). |
| update_repositoryA | Change an existing repository: name, type, address, website, notes, tags or the private flag. 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. Returns the handle and Gramps ID; a missing repository returns a not-found message, and an unknown type is rejected before anything is saved. Which sources it holds is stored on the sources (their repositoryHandles), not here. |
| update_event | Change an existing event: type, date, place, description, citations, notes, media, tags, attributes or the private flag. 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. 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. Who takes part is stored on the people and families (their eventRefs), not on the event. Formats of every argument: get_reference(topic: "input-guide"). |
| update_media | Change an existing media record: description, date, attributes, notes, tags, citations or the private flag. The file itself cannot be uploaded or replaced here; media objects are created in Gramps Web. 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. Returns the handle and Gramps ID; a missing media object returns a not-found message, and an unreadable date is rejected before anything is saved. To show the media on a person, event or citation, add it to their mediaHandles (linkMode add). Formats of every argument: get_reference(topic: "input-guide"). |
| update_citation | Change an existing citation: its source, page, confidence, date, notes, media, tags, attributes or the private flag. 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. Returns the handle and Gramps ID; a missing citation returns a not-found message. Which people and events it supports is stored on them (their citationHandles), not here. Formats of every argument: get_reference(topic: "input-guide"). |
| update_source | Change an existing source: title, author, publication info, abbreviation, repositories, notes, media, tags, attributes or the private flag. 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. Returns the handle and Gramps ID; a missing source returns a not-found message. Formats of every argument: get_reference(topic: "input-guide"). |
| get_timelineA | List the dated events around one person, family or place in date order: 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. Filter by event category and dates. 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. |
| 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. The tag labels nothing yet: add its handle to the tagHandles of each record (their create or update tool, linkMode add on update). Tags cannot be renamed here. |
| create_place | Create a place (village, town, parish, county, country, …) with its name, type, coordinates, enclosing places, historical or other-language names, and links to notes, media, citations and tags. Returns the new handle and Gramps ID with the stored name, type, coordinates and enclosing places, and next steps. Does not check for duplicates: search for the place first, and change an existing one with update_place. Enclosing places must already exist: create the larger region first and pass it in enclosedBy, with dates when the place changed hands. Formats of every argument: get_reference(topic: "input-guide"). |
| create_person | Create one person with full control: names, gender, links to existing events (with roles), families, citations, notes, media and tags, plus attributes, addresses, URLs and associations. Returns the new handle, Gramps ID and name, with next steps. Does not check for duplicates: search for the person first, and change an existing person with update_person. 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). To make the person a child of a family, add them to the family's childRefs (create_family or update_family). Formats of every argument: get_reference(topic: "input-guide"). |
| 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). Change an existing note with update_note. An unknown type is rejected before anything is saved. |
| create_source | 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 (with call numbers). Returns the new handle, Gramps ID and title, with next steps. Does not check for duplicates: search for the source first. A source alone proves nothing: cite a page or act of it with create_citation, then attach that citation to people and events. Change an existing source with update_source. Formats of every argument: get_reference(topic: "input-guide"). |
| update_place | Change an existing place: name with its language and date, type, coordinates, enclosing places, alternate names, code, and links to notes, media, citations and tags. 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. Returns the handle and Gramps ID with the stored name, type, coordinates and enclosing places; a missing place returns a not-found message. Formats of every argument: get_reference(topic: "input-guide"). |
| get_objectA | Read one record: 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. A missing record returns a not-found message with a hint. For a person's relatives or dated events, get_person_tree and get_timeline are shorter. |
| update_noteA | Change an existing note: its text, type, format, tags or private flag; new text replaces the whole body. 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. 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. |
| 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. 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_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. |
| create_family | Create a family: a couple (father and mother, each optional) with their relationship type, children and family events such as Marriage. Returns the new handle, Gramps ID and a label, with next steps. People and events must already exist (create_person, create_event). 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. 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. 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| find-connections | Find the genealogical relationship between two people |
| cite-fact | Attach a source citation to an existing person, family, event, place, or media record |
| add-family | Create a family connecting two people with optional marriage event |
| add-person | Add a new person with optional birth/death events |
| change-link | Add or remove one link between existing Gramps records |
| research-person | Research a person, expanding to timelines or trees only when relevant |
| import-from-text | Parse genealogical information from text and add to the database |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| metadata | Connection and tree metadata (API version, tree id/name, owner, default person, etc.). |
| name-settings | Name display format definitions and surname grouping rules configured in this tree. |
| input-guide | Complete write-input reference: date formats, structured fields, link updates, and full Name schema. |
| types | Read-only type vocabularies (built-in + custom) for validating type/role/origin strings. |
TDQS
Scored across 29 tools
Most tools target a distinct resource+action, and the descriptions actively disambiguate overlapping pairs (search vs list_objects, get_object vs list_objects vs search, get_relations vs get_person_tree vs get_timeline, read_media vs get_object). The nine per-type update_* tools are near-identical in prose and could blur together, but their target types keep them separable.
Names follow a predictable verb_noun convention (create_person, update_event, list_objects, delete_object, get_object) across the whole set. The only deviation is read_media, which breaks the get_* pattern for reading an object, though it is deliberate and explained.
At 29 tools this is heavy, and much of the bulk comes from nine create_* plus nine update_* tools that repeat nearly the same boilerplate per record type. The genealogy domain genuinely spans many record types, but a generic update/delete pattern would likely have sufficed, so the surface is borderline padded.
Coverage is strong: full create/update for every record type plus a generic delete_object with backlink handling, and read tools for search, listing, relations, trees, timelines and history. The notable gaps are the inability to create or upload media and to rename/delete tags through the server, which are documented limitations rather than oversights.