Skip to main content
Glama
findagrave-com-mcp

findagrave-com-mcp

by ball2jh

findagrave-com-mcp

An MCP server for Find a Grave. It searches and reads memorials: birth and death dates and places, burial cemetery, plot, inscription, biography, linked parents/spouses/children/siblings, photos and flowers. It also covers cemeteries and Find a Grave's place hierarchy.

It calls the site's own GraphQL API (POST https://www.findagrave.com/orc/graphql). The API answers anonymously, so no login, cookies or browser are involved. Everything is read-only.

Tools

Tool

Actions

What for

findagrave_memorial

search, get, photos, flowers

Find people. Read a memorial in full: maiden name kept separate, family grouped by role with each relative's memorial id, photos, the matching Ancestry "Find a Grave Index" record, and a ready citation.

findagrave_cemetery

search, get

Find cemeteries by name and/or place, and read one. List a cemetery's burials with findagrave_memorial search + cemeteryId.

findagrave_place

search, get, children

Place ids (county_2452 …) for narrowing searches, and the counties or towns inside a place.

findagrave_download

photo

A gravestone, portrait or clipping photo, returned inline (scaled) or written to a file.

findagrave_graphql

query

A raw read-only GraphQL query for anything the other tools lack. Mutations are refused.

What the search defaults do, and why (each was checked against the website's counts; see docs/endpoints.md):

  • Names match exactly. Find a Grave's own default is a prefix match, so "Hunt" also finds Hunter and Huntley. nameMatch: "prefix" restores it (useful for initials) and "similar" adds spelling variants.

  • Maiden names are included, so a married woman is found under her birth surname.

  • Location text is resolved to one place by name and reported back. The site's typeahead ranks "Newton, Mississippi" as Newton County and "Rijeka, Croatia" as a village in Lika. Text that fits several places is refused with their ids.

  • relativeName switches names to prefix matching and says so. With exact matching the site finds a relative only by the relative's whole stored name, maiden name included.

Related MCP server: wikitree-mcp

Setup

pnpm install

.mcp.json:

{ "mcpServers": { "findagrave": { "command": "node", "args": ["/path/to/findagrave-com-mcp/src/server.ts"] } } }

Requirements: Node 26+ (runs TypeScript directly) and pnpm; no browser. sharp scales photos for inline viewing. FINDAGRAVE_MIN_INTERVAL_MS (default 250) spaces requests, because the site's Cloudflare protection challenges bursts.

Tests

  • pnpm test: unit tests on recorded responses (test/fixtures, re-recorded with node scripts/record-fixtures.ts). No network.

  • pnpm mcp-test: live, over stdio. It calls every action and error path, checks result sizes, and runs a count comparison for every search filter: a real value must narrow the total and a nonsense value must give about zero.

  • pnpm typecheck.

Caveats

  • Find a Grave is contributor-written. Dates, family links and biographies are claims, often unsourced and sometimes copied from online trees. Prefer what a stone in a photo shows, and cite the memorial (get returns the citation the site prints).

  • A search reaches only its first 10,000 results and returns at most 50 rows per call. Narrow by place, years or cemetery.

  • A recently deceased person's memorial can be shown with limited details (limitedDisplay).

Available Tools

5 tools
findagrave_cemeteryFind a Grave cemeteriesA
Read-onlyIdempotent

Find and read Find a Grave cemeteries. Actions:

  • search: cemeteries by name and/or place (needs name, location or locationId); rows give cemeteryId, name, place, memorial and photographed counts, GPS. A place alone lists every cemetery in it (Giles County, Tennessee has about 450). 100 per page at most.

  • get: one cemetery (needs cemeteryId): all its names, place, GPS, address, description and history notes, memorial count (the number a memorial search in it returns), photographed and GPS counts. To list or search the people buried in a cemetery use findagrave_memorial search with cemeteryId.

Inputs: action (required), name, count, start, +4 more.

findagrave_downloadDownload a Find a Grave photoA
Idempotent

Fetch a memorial or cemetery photo (a gravestone, portrait, obituary clipping, …). Action photo: needs photoId (from findagrave_memorial get/photos) or url (an images.findagrave.com URL). Without outPath the image is returned inline for reading, scaled so its longer side is at most maxSide (default 1600 px). With outPath the original file is written to disk unscaled (unless maxSide is given) and only metadata is returned.

Inputs: action (required), url, maxSide, outPath, +1 more.

findagrave_graphqlFind a Grave GraphQL queryA
Read-onlyIdempotent

Run a read-only GraphQL query against Find a Grave's own API (https://www.findagrave.com/orc/graphql) for data the other tools do not return. Mutations are refused. Full schema introspection is disabled, but { __type(name: "Memorial") { fields { name } } } lists a type's fields; docs/endpoints.md lists the useful queries and types (memorialsById, memorialSearch, cemeteries, locationsByTypeahead, browse, flowersForMemorial, getPhotos, virtualCemeterySearch). Prefer the other tools: their results are projected to fit and their filters are checked.

Inputs: action (required), query, variables.

findagrave_memorialFind a Grave memorialsA
Read-onlyIdempotent

Search and read Find a Grave memorials (grave records: dates, burial place, plot, inscription, biography, linked family, photos). Actions:

  • search: memorials matching the given criteria; needs at least one of lastName, firstName, location/locationId, cemeteryId, relativeName, text, bio, birthYear, deathYear, famous. Rows give memorialId, name, maidenName, birth/death dates and places, cemetery, plot, veteran/gravePhoto flags, and for text/relativeName/bio searches the passages that matched. Names match exactly by default (nameMatch); women are also found under their maiden name unless includeMaidenName=false. About 360 chars per row, 50 rows per call at most; only the first 10000 results of a search can be reached, so narrow by place or years.

  • get: one memorial in full (needs memorialId): name with maidenName separate, birth/death with place ids, burial cemetery and GPS, plot, inscription, bio, veteran, family grouped by the relative's role (parents with father/mother, spouses, children, siblings, halfSiblings — each with its own memorialId to read next), the first photos (photos=count), who created/manages it, the matching Ancestry "Find a Grave Index" record (ancestryRecord: collectionId 60525 + recordId, usable with ancestry_record get), and a ready citation. About 2-15K chars.

  • photos: a memorial's photos with captions and contributors (needs memorialId; type filters grave/person/family/other). Read one with findagrave_download.

  • flowers: virtual flowers left on the memorial with their notes, which sometimes name relatives (needs memorialId). Find a Grave is user-contributed: dates, family links and bios are a contributor's claims, often without sources; treat them as leads and check the stones in the photos and the records behind them.

Inputs: action (required), bio, plot, text, +28 more.

findagrave_placeFind a Grave placesA
Read-onlyIdempotent

Find a Grave's place hierarchy (country → state → county → city), whose ids narrow memorial and cemetery searches. Actions:

  • search: places and cemeteries whose name starts like the text (needs name), with locationId, type, full place and cemetery count. Find a Grave ranks these by its own relevance, not by the name, so check the place before using an id.

  • get: one place by locationId.

  • children: the places directly inside a place (needs locationId): counties of a state, towns of a county.

Inputs: action (required), name, count, locationId.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.5/5.0

    Scored across 5 tools

    Disambiguation4/5

    Each tool targets a distinct domain (memorials, cemeteries, places, downloads, GraphQL), but findagrave_place search and findagrave_cemetery search can both return cemeteries by name, creating mild ambiguity about which to use.

    Naming Consistency4/5

    All tools share the findagrave_ prefix, but actions mix verb forms (search, get) with plural nouns (photos, flowers), and findagrave_download and findagrave_graphql break the resource-noun pattern of the other tools.

    Tool Count5/5

    Five top-level tools is well-scoped; each tool covers a logical area, and exposing actions under memorial/cemetery/place keeps the surface clean without bloat.

    Completeness5/5

    The server covers the full read-only workflow for Find a Grave: memorial search/detail/photos/flowers, cemetery and place lookup, photo download, and a GraphQL fallback for any missing data. No obvious dead ends.

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables querying and exploring the GitHub GraphQL API schema and executing optimized GraphQL queries to retrieve precise GitHub data (repositories, issues, PRs, users) with reduced token consumption.
      -
    • A
      license
      A
      quality
      D
      maintenance
      Enables querying WikiTree genealogy data including profiles, ancestors, descendants, relatives, biography, photos, and categories via natural language.
      2
      1
      AGPL 3.0
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to search FamilySearch's Family Tree, view person details, explore ancestors and descendants, and search historical records using browser session authentication.
      7 npm
      6
      MIT