Gramps Evidence
PYPI · GRAMPS-EVIDENCE-MCP · SCANNED OCT 1
Read/write a self-hosted Gramps Web family tree where every fact carries a citation.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security50
- Malware scan not yet available for this package.Unverified
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 1 of 32 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to ianderso/gramps-evidence-mcp). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 0 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability74
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 14063 tokens (~158/item across 89 items; 89 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management3
- Stability observed for 1 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety95
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 4 of 5 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "consolidated_timeline" implies "merge" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Partial
- An AI judge read all 90 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
How do I install the Gramps Evidence MCP server?
Gramps Evidence runs locally as a PyPI package, launched with uvx gramps-evidence-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · gramps-evidence-mcp
claude mcp add ianderso-gramps-evidence-mcp -- uvx gramps-evidence-mcp
{
"mcpServers": {
"ianderso-gramps-evidence-mcp": {
"command": "uvx",
"args": [
"gramps-evidence-mcp"
]
}
}
} {
"servers": {
"ianderso-gramps-evidence-mcp": {
"command": "uvx",
"args": [
"gramps-evidence-mcp"
]
}
}
} codex mcp add ianderso-gramps-evidence-mcp -- uvx gramps-evidence-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"ianderso-gramps-evidence-mcp": {
"type": "local",
"command": [
"uvx",
"gramps-evidence-mcp"
],
"enabled": true
}
}
} openclaw mcp add ianderso-gramps-evidence-mcp --command uvx --arg gramps-evidence-mcp
mcp_servers:
ianderso-gramps-evidence-mcp:
command: "uvx"
args: ["gramps-evidence-mcp"] {
"McpServers": {
"ianderso-gramps-evidence-mcp": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"gramps-evidence-mcp"
]
}
}
} assistant mcp add ianderso-gramps-evidence-mcp -t stdio -c uvx -a gramps-evidence-mcp
{
"mcpServers": {
"ianderso-gramps-evidence-mcp": {
"command": "uvx",
"args": [
"gramps-evidence-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 1 Oct 26 0
- Malware scan: unverified → pass ▲ security
- Schema quality: 12495 → 14063 ▼ functional
- Stability: unverified → 0.03 ▲ functional
- Package version: 1.0.1 → 1.1.0 functional
- 30 Sept 26 66
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 1 Oct 2026 · Analysed pypi/gramps-evidence-mcp@1.1.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | pypi |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | ianderso/gramps-evidence-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/ianderso/gramps-evidence-mcp/.github/workflows/release.yml@refs/tags/v1.1.0 |
| Rekor log index | 3038229548 |
| Predicate type | PyPI publish attestation https://docs.pypi.org/attestations/publish/v1 |
| Subject digest | sha256:c0379597b0bfda291be7a9b33ae86d6e30e2f5f39719a4d926fa243c33c52a2b |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 32 packages
| Packages resolved | 32 |
|---|---|
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
add_alternate_name ~243
Add an alternate (non-primary) name to a person, cited to the record using it. Use for maiden/married names, aliases, anglicized forms, or nicknames-of-record. The person's primary name is left unchanged. Correct or remove one later with update_alternate_name.
| Name | Type | Req | Description |
|---|---|---|---|
| citation | – | – | The record that gives this form of the name. It goes on the name itself -- 'this record spells it so' -- not on the person. Cite an existing name with cite_object(object_type='name'). |
| given | string | – | Given/first name(s) for the alternate name. |
| name_prefix | string | – | Surname prefix, e.g. 'van', 'de'. |
| name_suffix | string | – | Suffix, e.g. 'Jr.', 'III'. |
| name_type | string | – | Kind of alternate name, e.g. 'Also Known As', 'Birth Name', 'Married Name'. |
| nickname | string | – | Nickname. |
| person | string | yes | Person handle or gramps_id (e.g. 'I0001'). |
| surname | string | – | Family name / surname. |
No output schema declared.
No examples provided.
add_attribute ~123
Add a typed key/value attribute to an object. Sources and citations use a SrcAttribute; everything else uses an Attribute. The right class is chosen automatically from object_type.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Attribute type/name, e.g. 'Occupation', 'National ID'. |
| object_type | string | yes | Type of the object: 'person', 'event', 'family', 'media', 'source', 'citation'. |
| target | string | yes | Handle or gramps_id of the object. |
| value | string | yes | Attribute value, e.g. 'Blacksmith'. |
No output schema declared.
No examples provided.
add_child_to_family ~149
Add an existing person as a child of an existing family. Links the child both ways: a ChildRef is added to the family and the family is added to the child's parent-family list. The child must already exist. Duplicate children are skipped.
| Name | Type | Req | Description |
|---|---|---|---|
| child | string | yes | Child person handle or gramps_id. |
| family | string | yes | Family handle or gramps_id (e.g. 'F0001'). |
| frel | string | – | Relationship to the father, e.g. 'Birth', 'Adopted', 'Stepchild'. |
| mrel | string | – | Relationship to the mother, e.g. 'Birth', 'Adopted', 'Stepchild'. |
No output schema declared.
No examples provided.
add_citation ~86
Create a standalone Citation on a Source (or reuse an existing one). Usually you don't call this directly -- pass a CitationInput to add_person / add_event_to_person / add_family instead, which creates the citation and attaches it to the fact in one step. Use this when you want a reusable citation handle to attach to several facts.
| Name | Type | Req | Description |
|---|---|---|---|
| citation | – | yes | Citation details. |
No output schema declared.
No examples provided.
add_dna_match ~240
Record a DNA match as evidence, cited to the test that found it. Stored as Gramps Web stores a match, so its interface and get_dna_matches read it back. Nothing is written unless the segments parse: unreadable data would otherwise record a match sharing no DNA. A match proves the two share DNA, not how they are related. Record any relationship separately, with its own evidence.
| Name | Type | Req | Description |
|---|---|---|---|
| citation | – | yes | The test the match came from: source or source_title naming the company and kit, page for where the match is shown, confidence in the match itself. A new citation is always minted. |
| match | string | yes | Handle or gramps_id of the matching person. Add them first if they are not in the tree. |
| person | string | yes | Handle or gramps_id of the tested person, whose results list the match. |
| segments | string | yes | The shared segments as the testing company exports them: rows of chromosome, start, stop, centiMorgans, SNPs, comma- or tab-separated, with an optional side of M, P or U. A header row is tolerated. |
No output schema declared.
No examples provided.
add_event_ref ~160
Share an existing event with another person, in a role. For one census entry, residence or burial that several people took part in: each references the same event, so its citations and later corrections serve all of them. Refused if the person already has it. A new fact is add_event_to_person.
| Name | Type | Req | Description |
|---|---|---|---|
| event | string | yes | Handle or gramps_id of the EXISTING event, e.g. 'E0007'. |
| person | string | yes | Handle or gramps_id of the person to add the event to. |
| role | string | – | The person's role in it: 'Primary', 'Witness', 'Informant', 'Godparent', 'Family', 'Clergy', or a custom role the tree already has. |
No output schema declared.
No examples provided.
add_event_to_family ~118
Add a dated/placed event (fact) to an existing family. Use for family-level facts: marriage, divorce, residence, census. The event is added with the 'Family' role. Cite it to the record establishing the fact.
| Name | Type | Req | Description |
|---|---|---|---|
| event | – | yes | The event to add (type, date, place, citation). |
| family | string | yes | Family handle or gramps_id (e.g. 'F0001'). |
| require_citation | boolean | – | Require a citation (default). False records it UNSOURCED. |
No output schema declared.
No examples provided.
add_event_to_person ~148
Add a dated/placed event (fact) to an existing person. Use for facts beyond birth/death: residence, occupation, census, baptism, immigration, marriage-adjacent events, etc. The event's citation should point at the record establishing the fact. Adding a 'Birth'/'Death' event will set the person's primary birth/death reference if not already set.
| Name | Type | Req | Description |
|---|---|---|---|
| event | – | yes | The event to add (type, date, place, citation). |
| person | string | yes | Person handle or gramps_id (e.g. 'I0007'). |
| require_citation | boolean | – | Require a citation (default). False records it UNSOURCED. |
No output schema declared.
No examples provided.
add_family ~168
Create a family linking parents and children, with an optional cited marriage. All members must already exist (create them first with add_person). Creating the family automatically links each person's family/parent-family lists, so you don't need to update the individuals separately. Cite the marriage event to a marriage record where possible.
| Name | Type | Req | Description |
|---|---|---|---|
| children | – | – | Child handles or gramps_ids. |
| father | – | – | Father: handle or gramps_id. |
| marriage | – | – | Optional marriage event; type defaults to 'Marriage'. Cite it. |
| mother | – | – | Mother: handle or gramps_id. |
| relationship | string | – | Family relationship type, e.g. 'Married', 'Unmarried', 'Civil Union'. |
| require_citation | boolean | – | Require a citation on the marriage event (default). |
No output schema declared.
No examples provided.
add_media ~184
Upload a document as a standalone Media object, reusing an identical file already in the tree. One image, one Media object -- then attach it wherever it belongs with attach_media(media_ref=...) and cite it once per fact it proves. Uploading the same photograph once per person it depicts is the duplicate pattern that later has to be unpicked by hand.
| Name | Type | Req | Description |
|---|---|---|---|
| dedup_by_checksum | boolean | – | Reuse an existing Media object if the identical file is already in the tree. Leave True. |
| description | string | yes | What the document IS -- archival identity, not the person it mentions ('1900 US census, Cedar Flat, Brannock Co., Ohio, ED 12 sheet 4A'). Files are stored under checksum names. |
| file_path | string | yes | Local path to the image, PDF, audio or video file to upload. |
No output schema declared.
No examples provided.
add_note ~129
Create a research/general note, optionally attached to an object. Use notes for research logs, reasoning about conflicting evidence, or transcriptions. Attach to a person/event/source by giving target + target_type.
| Name | Type | Req | Description |
|---|---|---|---|
| note_type | string | – | Note type, e.g. 'General', 'Research'. |
| target | – | – | Optional object handle/gramps_id to attach the note to. |
| target_type | – | – | Type of the target: 'person', 'family', 'event', 'source', 'citation', 'place', 'repository', 'media'. |
| text | string | yes | The note text. |
No output schema declared.
No examples provided.
add_person ~284
Create a new person, optionally with cited birth and/or death events. Use this to add someone to the tree. Good practice: attach the birth event with a citation to the *specific* record that proves it (a birth or baptism certificate, a census entry), setting the citation's confidence honestly. If you only have a legacy-tree hint with no underlying record, either omit the event or set require_citation=False so it's flagged for follow-up. Returns the new person's handle and gramps_id.
| Name | Type | Req | Description |
|---|---|---|---|
| birth | – | – | Optional birth event. Include a citation unless recording as unsourced. The event type defaults to 'Birth'. |
| death | – | – | Optional death event; type defaults to 'Death'. |
| gender | – | – | female, male, or unknown. |
| given | string | yes | Given/first name(s), e.g. 'John Robert'. |
| name_prefix | string | – | Surname prefix, e.g. 'van', 'de'. |
| name_suffix | string | – | Suffix, e.g. 'Jr.', 'III'. |
| require_citation | boolean | – | If True (default), any birth/death event MUST carry a citation or the call fails. Set False to record the event anyway, stamped with the UNSOURCED attribute so list_unsourced_facts can find it later. |
| surname | string | – | Family name / surname. |
No output schema declared.
No examples provided.
add_place ~227
Create a place deliberately, with a type and a parent. Use this instead of letting a place appear as a side effect of naming one in an event. That route produces an untyped, unparented place whose title is the bare string you typed, which is how duplicate hierarchies start.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | – | Postal or FIPS code. |
| latitude | string | – | Latitude, decimal degrees. |
| longitude | string | – | Longitude, decimal degrees. |
| name | string | yes | The place's own name, e.g. 'Cedar Flat'. |
| parent | string | – | Handle or gramps_id of an existing enclosing place. Must already exist — it is never created for you. |
| place_type | string | – | Gramps place type: Town, City, County, State, Country, Parish, Cemetery, and so on. |
| title | string | – | Full display title, e.g. 'Cedar Flat, Brannock, Ohio, USA'. Defaults to the name. This is what event place matching compares against, so set it properly. |
No output schema declared.
No examples provided.
add_repository ~113
Create a Repository (an institution or place that holds sources). Repositories sit at the top of the evidence model: Repository -> Source -> Citation -> fact. Create these for archives, libraries, cemeteries, or websites you'll cite sources from.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Repository name, e.g. 'National Archives (NARA)'. |
| repository_type | string | – | Type: 'Library', 'Archive', 'Cemetery', 'Church', 'Website', etc. |
| url | – | – | Optional website URL. |
No output schema declared.
No examples provided.
add_source ~190
Create a Source (a body of evidence: a record set, book, certificate, website). In the Gramps evidence model a Source is what you cite *through* a Citation. Create the source once, then create citations against it for each fact it supports. Optionally link it to a Repository (where the source is held).
| Name | Type | Req | Description |
|---|---|---|---|
| abbreviation | – | – | Short abbreviation. |
| author | – | – | Author/creator of the source. |
| call_number | – | – | Call number / reference within the repository. |
| media_type | string | – | Medium of the source at that repository, e.g. 'Book', 'Microfilm', 'Electronic'. Only used with repository. |
| publication_info | – | – | Publication info (publisher, date, series). |
| repository | – | – | Repository handle/gramps_id that holds this source. |
| title | string | yes | Source title, e.g. '1900 U.S. Federal Census'. |
No output schema declared.
No examples provided.
add_url ~151
Add a web URL to a person, place, or repository. Only these three object types carry a URL list. For sources/citations, record a web address as an attribute (add_attribute) instead.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | Optional link description. |
| object_type | string | yes | Type of the object: 'person', 'place', or 'repository' only. |
| target | string | yes | Handle or gramps_id of the object. |
| url | string | yes | The URL, e.g. 'https://www.findagrave.com/memorial/123'. |
| url_type | string | – | URL type, e.g. 'Web Home Page', 'Web Search', 'E-mail'. |
No output schema declared.
No examples provided.
assess_living ~171
Ask the server whether a person is probably still alive, and why. The server walks relatives to decide, so it handles people with no dates of their own — someone undated whose children died a century ago. Use it before publishing or sharing anything, and use `explain` when you want to see the reasoning rather than just the verdict. Note this is advisory. Bulk output is filtered by this server's own rule regardless of what this returns.
| Name | Type | Req | Description |
|---|---|---|---|
| average_generation_gap | – | – | Years per generation used when estimating. |
| explain | boolean | – | Also return the estimated birth and death dates and which relative they were derived from. |
| max_age_probably_alive | – | – | Age beyond which a person is presumed dead. |
| person | string | yes | Handle or gramps_id of the person. |
No output schema declared.
No examples provided.
attach_media ~275
Attach an image or document to an object -- a new upload, or one already in the tree. With file_path, the bytes are uploaded into the tree's managed media directory (so don't point at files you don't want copied); if that exact file is already present it is reused rather than duplicated. With media_ref, an existing Media object is linked. One image should be ONE Media object, linked from each object it belongs to and cited once per fact it proves. Uploading the same photograph separately for the husband and the wife creates duplicates that have to be unpicked later. The write is verified afterwards: `verified: false` means nothing attached, whatever the rest of the result says.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | What the document IS, in archival terms. Only used when uploading a new file. |
| file_path | – | – | Absolute path to a local image, PDF, audio or video file to upload. Use this OR media_ref. |
| media_ref | – | – | Handle or gramps_id of a Media object ALREADY in the tree. Prefer this when the same document supports several people. |
| target | string | yes | Object handle/gramps_id to attach media to. |
| target_type | string | – | Type of the target object: 'person', 'event', 'source', etc. |
No output schema declared.
No examples provided.
check_family_links ~110
Audit the links between people and families, in both directions. Finds a family a person lists twice, a child a family lists twice, a link one side holds and the other lacks, and links to objects that do not exist. Each finding says how to repair it. Reports only.
| Name | Type | Req | Description |
|---|---|---|---|
| include_private | boolean | – | Show living people and private records in full. Only when the user asks for them; they are withheld by default. |
| limit | integer | – | Maximum findings to return. |
No output schema declared.
No examples provided.
cite_child_link ~208
Cite the parent-child link itself, on the family's ChildRef. "This child belongs to these parents" is a DIFFERENT claim from "this child appears in this record", and it needs its own citation object. Reusing the child's existing citation handle makes the link inherit a confidence that was assigned to another claim entirely, so the link displays a confidence its evidence never earned. Note what a ChildRef citation asserts: BOTH sides of the link. A census naming only the mother does not document the father. Where only one parent is evidenced, cite that parent's relationship instead of implying both.
| Name | Type | Req | Description |
|---|---|---|---|
| child | string | yes | The child's person handle or gramps_id. |
| citation | – | yes | Citation for the PARENTAGE claim. Create a new one (source + page + confidence) rather than reusing a citation handle from elsewhere -- see the warning below. |
| family | string | yes | Family handle or gramps_id (e.g. 'F0001'). |
No output schema declared.
No examples provided.
cite_event ~134
Attach a citation to an event that ALREADY exists. Use this to source an event you didn't create with an inline citation -- e.g. one added through the Gramps web UI, or an unsourced event surfaced by list_unsourced_facts. The citation is resolved/created (existing handle/id, or an inline source_title + page + confidence) and appended to the event's citation list (no duplicates). Does not change any other event field.
| Name | Type | Req | Description |
|---|---|---|---|
| citation | – | yes | Citation to attach to the event. |
| event | string | yes | Event handle or gramps_id (e.g. 'E0007'). |
No output schema declared.
No examples provided.
cite_object ~251
Attach a citation to any object that carries one -- not just events. cite_event covers facts; this covers the rest. The important case is the FAMILY, whose citation supports a claim no event makes: that these two people were a couple. Person-level citations are for evidence about the individual as a whole (an identity document) rather than about one dated fact -- prefer citing the specific event where one exists. A NAME is cited with object_type='name': "this record gives this spelling" is narrower than evidence about the person. To cite a parent-child link, use cite_child_link: that is a different claim and needs its own citation.
| Name | Type | Req | Description |
|---|---|---|---|
| citation | – | yes | Citation to attach. |
| name | – | – | With object_type='name': which of the person's names, e.g. {'surname': 'Bittner', 'type': 'Birth Name'} or {'primary': true}. Must match exactly one. |
| object_type | string | yes | person, family, event, place, media, source, citation, or name (one of a person's names: ref is the person, name says which). |
| ref | string | yes | Handle or gramps_id of the object to cite. |
No output schema declared.
No examples provided.
consolidated_timeline ~197
Merge several people or families into one chronological timeline. The way to see a household move together through censuses, or to check whether a family's events are mutually consistent. Carries the same citation count and confidence per event as get_timeline, with an uncited_count across the whole set.
| Name | Type | Req | Description |
|---|---|---|---|
| anchor | string | – | Handle or gramps_id of the central person, so ages are reported relative to them. |
| event_types | string | – | Comma-delimited event type names to include, e.g. 'Birth,Death,Census'. Omit for all. |
| include_private | boolean | – | Show living people and private records in full. Only when the user asks for them; they are withheld by default. |
| limit | integer | – | Maximum events. |
| object_type | string | – | Either 'person' or 'family'. |
| targets | array | yes | Handles or gramps_ids to merge into one timeline. |
No output schema declared.
No examples provided.
consult_reference ~222
Consult the legacy GEDCOM reference layer for HINTS (never authoritative). Searches the configured Ancestry/FamilySearch exports and returns, per file, matching individuals and their claimed facts. Crucially, each fact is flagged whether the legacy tree attached a source, with the source text if present -- so you can distinguish 'they cite an actual death certificate' from 'unsourced guess'. These are UNTRUSTED hints: use them to decide what real record to hunt for, then create the fact in the tree citing that record -- do not copy a hint in as a sourced fact. Probably-living people are withheld and counted.
| Name | Type | Req | Description |
|---|---|---|---|
| approx_birth_year | – | – | Approximate birth year to disambiguate (± a few years). |
| include_private | boolean | – | Show living people and private records in full. Only when the user asks for them; they are withheld by default. |
| name | string | yes | Name (or name substring) to look up. |
| year_tolerance | integer | – | Allowed birth-year difference when matching. |
No output schema declared.
No examples provided.
create_filter ~182
Save a reusable custom filter built from Gramps' own rules. Worth doing for a selection you will run repeatedly — an audit scope, a branch of the tree — because the filter then has a name rather than being retyped each time.
| Name | Type | Req | Description |
|---|---|---|---|
| comment | string | – | Note on the filter's purpose. |
| function | string | – | How rules combine: 'and', 'or', or 'one'. |
| invert | boolean | – | Return everything the rules do NOT match. |
| name | string | yes | Filter name, used to apply it later. |
| namespace | string | yes | Singular, capitalised: Person, Family, Event, Place, Citation, Source, Repository, Media, Note. |
| rules | array | yes | Rules, each {'name': <rule>, 'values': [...], 'regex': false}. Rule names come from list_filter_rules. |
No output schema declared.
No examples provided.
db_stats ~39
Counts of people, families, events, citations, sources, repositories, places, media, and notes in the tree. A quick health/overview check.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
delete_filter ~56
Delete a saved custom filter. Deletes the filter definition only. Nothing in the tree is touched.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the filter to delete. |
| namespace | string | yes | Plural namespace, e.g. 'people'. |
No output schema declared.
No examples provided.
delete_object ~164
Permanently delete an object from the tree by handle or gramps_id. DESTRUCTIVE. The server also removes every reference to it. Refused when it is the only holder of a note or image (pass carry_to to move them), and for a source with citations, which the server would delete with it.
| Name | Type | Req | Description |
|---|---|---|---|
| carry_to | – | – | Another object of the same type to receive the notes and images that only this one holds. Without it, such a delete is refused. |
| object_type | string | yes | Type to delete: 'person', 'family', 'event', 'place', 'source', 'citation', 'repository', 'media', 'note', 'tag'. |
| target | string | yes | Handle or gramps_id of the object to delete. |
No output schema declared.
No examples provided.
detach_object ~275
Remove a reference from an object: an event from a person, an image from a source, a tag, a note, a child from a family. The reference is removed; the object itself survives unless delete_if_orphan is set AND nothing else points at it -- which is checked, because deleting something other facts still reference leaves dangling handles behind.
| Name | Type | Req | Description |
|---|---|---|---|
| call_number | – | – | Repository only: detach just the link with this call number, when a source is held twice in one repository. Omit to detach every link. |
| child | string | yes | Handle or gramps_id of the thing to detach; a tag may be given by name. |
| child_kind | string | yes | What to detach: event, media, note, tag (removes a tag), citation, child (a person from a family), person (a person_ref), repository, enclosure (a parent of a place), or -- on a person, to repair a l… |
| delete_if_orphan | boolean | – | Also delete the detached object if nothing else references it. Off by default -- detaching and deleting are different decisions. |
| parent | string | yes | Its handle or gramps_id. |
| parent_type | string | yes | Type of the object holding the reference. |
No output schema declared.
No examples provided.
event_span ~127
Measure the elapsed time between two events. The arithmetic behind most plausibility checks: age at marriage, years between a census and a death, how long a widow waited. Doing this by hand from two formatted date strings is where transcription errors hide.
| Name | Type | Req | Description |
|---|---|---|---|
| as_age | boolean | – | Phrase the result as an age rather than an interval. |
| event1 | string | yes | Handle or gramps_id of the first event. |
| event2 | string | yes | Handle or gramps_id of the second event. |
| precision | – | – | How many units to include (years, months, days). |
No output schema declared.
No examples provided.
export_backup ~125
Write a full-tree export to disk. Take one before any bulk write. Cheap insurance: a few seconds and one file. A bulk write that goes wrong cannot always be undone transaction by transaction; a dump can be re-imported.
| Name | Type | Req | Description |
|---|---|---|---|
| dest_path | – | – | A new file in an existing directory; an existing file is never replaced. Omit for a timestamped file in the cache directory. |
| export_format | string | – | 'gramps' (Gramps XML, lossless -- use this for a safety dump), 'ged', 'json', or 'csv'. |
No output schema declared.
No examples provided.
find_duplicates ~203
Find likely-duplicate objects. Reports only -- it never merges anything. Duplicates are not merely untidy: a duplicate SOURCE makes a single-sourced fact look corroborated, which is a false evidentiary claim. But the reverse error is just as real -- an index entry and the register page it indexes are TWO documents and must stay separate. This tool finds candidates; deciding which are truly the same document is yours. Merge with merge_objects.
| Name | Type | Req | Description |
|---|---|---|---|
| include_private | boolean | – | Show living people and private records in full. Only when the user asks for them; they are withheld by default. |
| kind | string | yes | media_checksum (same file uploaded twice), source_title (same document entered twice), citation_page (same source+page cited more than once, flagging any graded differently), vital_events (a person w… |
| limit | integer | – | Max groups to return. |
No output schema declared.
No examples provided.
get_ancestors ~94
Walk a person's ancestors up to N generations (a nested parents tree). Living/private ancestors appear as redacted stubs unless include_private is set.
| Name | Type | Req | Description |
|---|---|---|---|
| generations | integer | – | How many generations up. |
| include_private | boolean | – | Show living people and private records in full. Only when the user asks for them; they are withheld by default. |
| person | string | yes | Root person handle or gramps_id. |
No output schema declared.
No examples provided.
get_backlinks ~103
List everything that references this object, grouped by type. The right way to ask "is this source actually cited?", "which facts rest on this citation?", or "is it safe to delete this?" -- an object with zero backlinks is orphaned; one with backlinks will leave dangling references if deleted.
| Name | Type | Req | Description |
|---|---|---|---|
| object_type | string | yes | Type of the object being pointed AT. |
| ref | string | yes | Handle or gramps_id of that object. |
No output schema declared.
No examples provided.
get_citation ~72
Read one citation: page, confidence, date, and its source. `cited_by_count` is the useful part. Zero means nothing references this citation — it is orphan debris, and `uncite` should have deleted it.
| Name | Type | Req | Description |
|---|---|---|---|
| citation | string | yes | Handle or gramps_id of the citation. |
No output schema declared.
No examples provided.
get_descendants ~93
Walk a person's descendants up to N generations (a nested children tree). Living/private descendants appear as redacted stubs unless include_private is set.
| Name | Type | Req | Description |
|---|---|---|---|
| generations | integer | – | How many generations down. |
| include_private | boolean | – | Show living people and private records in full. Only when the user asks for them; they are withheld by default. |
| person | string | yes | Root person handle or gramps_id. |
No output schema declared.
No examples provided.
get_dna_matches ~159
List the DNA matches recorded against a person. Each match reports total shared centiMorgans and the largest single segment — the two figures a relationship estimate actually rests on — plus any common ancestor already identified. **DNA evidence works differently from documentary evidence.** A match proves a biological relationship exists; it does not say which one. Shared cM constrains the possibilities and rarely resolves them, and it says nothing about the paper trail. `unattributed_count` is the useful number: matches with no common ancestor identified are the open research.
| Name | Type | Req | Description |
|---|---|---|---|
| include_raw | boolean | – | Include the unparsed note text the segments came from. |
| person | string | yes | Handle or gramps_id of the tested person. |
No output schema declared.
No examples provided.
get_event ~60
Get an event: type, date, place handle, description, citation count, and attributes. Use to inspect an event before citing or editing it.
| Name | Type | Req | Description |
|---|---|---|---|
| event | string | yes | Event handle or gramps_id, e.g. 'E0001'. |
No output schema declared.
No examples provided.
get_facts ~213
Read the tree's record-holders: oldest at death, youngest parent, most children. Superlatives across a set of people, not statistics about one person. An implausible holder — a father at eight, a death at 130 — is usually a data error, which makes this a quick plausibility check. Living and private people are excluded unless include_private is set. Slow: the server computes it all per call.
| Name | Type | Req | Description |
|---|---|---|---|
| include_private | boolean | – | Show living people and private records in full. Only when the user asks for them; they are withheld by default. |
| person | string | – | Handle or gramps_id a built-in person_filter is anchored on. |
| person_filter | string | – | Narrow the set: 'Ancestors', 'Descendants', 'DescendantFamilies' or 'CommonAncestor' of person, or a saved custom person filter's name. Omit for the whole tree. |
| rank | integer | – | Record-holders to return per statistic. |
No output schema declared.
No examples provided.
get_family ~45
Get a family: relationship type, parent handles, child handles, event count.
| Name | Type | Req | Description |
|---|---|---|---|
| family | string | yes | Family handle or gramps_id, e.g. 'F0001'. |
No output schema declared.
No examples provided.
get_media ~84
Read one media object: path, mime type, checksum, description, date. `referenced_by_count` above one is usually correct — one image cited from every fact it proves. Several media objects sharing a checksum is the duplicate that `find_duplicates(kind='media_checksum')` hunts.
| Name | Type | Req | Description |
|---|---|---|---|
| media | string | yes | Handle or gramps_id of the media object. |
No output schema declared.
No examples provided.
get_note ~76
Read one note in full, with its type and what it is attached to. Notes hold the researcher's own reasoning — why a conflict was resolved one way, what a hard-to-read page actually said — so the text comes back whole rather than truncated.
| Name | Type | Req | Description |
|---|---|---|---|
| note | string | yes | Handle or gramps_id of the note. |
No output schema declared.
No examples provided.
get_object ~125
Read any object's raw record -- including places, media, notes and citations, which have no shaped getter. Returns the record as stored, which is what you want before editing one. For people and sources the shaped getters (get_person, get_source) are easier to read.
| Name | Type | Req | Description |
|---|---|---|---|
| keys | – | – | Comma-separated fields to return. Omit for the whole record. |
| object_type | string | yes | person, family, event, place, source, citation, repository, media, note, or tag. |
| ref | string | yes | Handle or gramps_id. |
No output schema declared.
No examples provided.
get_person ~98
Get full detail for one person: name, gender, events (with citation counts), family links, and media count. Direct lookup is allowed even for living/private individuals (this is your own local tool); only bulk/list tools filter them. Use this to inspect someone before adding facts, or to check whether an event is already cited.
| Name | Type | Req | Description |
|---|---|---|---|
| person | string | yes | Person handle or gramps_id, e.g. 'I0001'. |
No output schema declared.
No examples provided.
get_place ~84
Read one place: name, title, type, enclosure, coordinates and URLs. The `enclosed_by` handles are the jurisdictional chain. A place with none is orphaned in the hierarchy, which is usually a place that got minted from an event's place string rather than created deliberately.
| Name | Type | Req | Description |
|---|---|---|---|
| place | string | yes | Handle or gramps_id of the place. |
No output schema declared.
No examples provided.
get_relationship ~144
Work out how two people in the tree are related. Returns the relationship in words plus the generation distance from each person to their common ancestor. `related` is false when no common ancestor was found within the search depth — which is a finding in itself if you expected one.
| Name | Type | Req | Description |
|---|---|---|---|
| all_paths | boolean | – | Report every relationship path, not just the closest. Use this when two people may be related more than one way. |
| depth | – | – | Generations to search. Server default if omitted. |
| person1 | string | yes | Handle or gramps_id of the first person. |
| person2 | string | yes | Handle or gramps_id of the second person. |
No output schema declared.
No examples provided.
get_report_options ~67
Read one report's default options before running it. Reports take a full option dict, not a partial one, so the way to change a single setting is to read these defaults and override that key.
| Name | Type | Req | Description |
|---|---|---|---|
| report_id | string | yes | Report id, e.g. 'ancestor_report'. |
No output schema declared.
No examples provided.
get_repository ~54
Get a repository: name, type, URLs, address count, and (if available) the number of sources it holds.
| Name | Type | Req | Description |
|---|---|---|---|
| repository | string | yes | Repository handle or gramps_id, e.g. 'R0001'. |
No output schema declared.
No examples provided.
get_researcher ~50
Read the researcher details recorded for this tree. These are embedded in every export, so they travel with any GEDCOM or Gramps XML you hand to someone else. Worth checking before sharing one.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_source ~70
Get a source: title, author, publication info, abbreviation, linked repositories, media/note counts, attributes, and citation count. Use to inspect a source before citing through it or editing it.
| Name | Type | Req | Description |
|---|---|---|---|
| source | string | yes | Source handle or gramps_id, e.g. 'S0001'. |
No output schema declared.
No examples provided.
What is the Gramps Evidence MCP server?
Gramps Evidence is an MCP server listed in the public MCP registry as io.github.ianderso/gramps-evidence-mcp. Read/write a self-hosted Gramps Web family tree where every fact carries a citation. This page covers its PyPI package (gramps-evidence-mcp).
Is the Gramps Evidence MCP server safe to use?
Gramps Evidence scores 66 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 1 October 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Gramps Evidence MCP server expose?
Gramps Evidence exposes 89 tools: add_person, add_event_to_person, add_family, add_source, add_citation, and 84 more. Their descriptions and schemas cost roughly 14,020 tokens of context every time the server is loaded.
Is the Gramps Evidence MCP server still maintained?
Gramps Evidence is still listed as active in the MCP registry. We last reached this channel on 1 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Gramps Evidence MCP server under?
Gramps Evidence declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.