findagrave-com-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@findagrave-com-mcp Find the graves of my 4th great-grandparents in Laurel Hill Cemetery, Philadelphia"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
|
| 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. |
|
| Find cemeteries by name and/or place, and read one. List a cemetery's burials with |
|
| Place ids ( |
|
| A gravestone, portrait or clipping photo, returned inline (scaled) or written to a file. |
|
| 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.
relativeNameswitches 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 withnode 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 (
getreturns 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 toolsfindagrave_cemeteryFind a Grave cemeteriesARead-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 photoAIdempotent
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 queryARead-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 memorialsARead-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 placesARead-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
Scored across 5 tools
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.
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.
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.
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
Read-only lookup of public memorials, funeral notices and partner funeral homes.
Read-only OpenHeritage search for genealogy and cultural heritage records.
Search and fetch Wikidata entities, execute SPARQL queries, and resolve external identifiers.
Read-only Wikidata tools and identity evidence. Local optional Google KG; bounded public remote.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceEnables 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.-
- AlicenseAqualityDmaintenanceEnables querying WikiTree genealogy data including profiles, ancestors, descendants, relatives, biography, photos, and categories via natural language.21AGPL 3.0
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to search FamilySearch's Family Tree, view person details, explore ancestors and descendants, and search historical records using browser session authentication.7 npm6MIT
- AlicenseNot gradedqualityBmaintenanceEnables querying AniList's anime and manga database via GraphQL API with no authentication required.126 npmMIT