FamilySearch

io.github.ianderso由 GitHub 账号 ianderso 发布v1.4.0更新于 Oct 24, 2026

Genealogical research on FamilySearch: historical places, indexed records, page images, the tree.

已验证STDIO仅桌面文件与存储知识与记忆

概览

AI 生成的概览

本地运行的 FamilySearch 家谱研究 MCP 服务器,可查询历史地名、索引记录、页面图像,并只读访问共享家谱树。

可以做什么
解析历史地名(包括按指定年份的历史形态),并沿管辖链向上或向下遍历(无需令牌)。搜索和读取索引历史记录、收藏集、字段代码与目录条目,并浏览收藏集路径点。定位记录对应的页面图像,列出同一图像上的记录,并检索手写识别全文。解析图像链接、按胶卷与图像编号定位页面,并把页面图像下载为本地文件。读取共享树中的人物、亲属、来源、祖先与后代、回忆、变更日志和匹配候选,并将自己的资料与档案进行比对。
适用场景
适合需要助手查询 FamilySearch 地名、记录、图像和家谱树档案,并把树中的线索追溯到原始文献的家谱研究工作。地名、收藏集和胶卷浏览等匿名工具在全新安装、无需配置时即可使用。
运行要求
通过 stdio 在本地运行,用 uvx 启动,需要 Python 和 uv。记录、图像、目录条目和家谱树工具需要来自你自己注册的 FamilySearch 应用的访问令牌,通过 FS_ACCESS_TOKEN 提供,最好放在由 FS_ENV_FILE 指定的环境变量文件中。可选 FS_CLIENT_ID、FS_ENVIRONMENT(production 或 integration 沙箱)和 FS_TIMEOUT。需要访问 FamilySearch 的网络连接。
安装前请注意
令牌属于凭据,README 建议放在环境变量文件中而非客户端配置里。令牌约一小时过期,遇到 401 时会从文件重新读取。不会向 FamilySearch 写入任何内容,但 download_image 会在本地新建图像或 PDF 文件。记录搜索、全文搜索和目录读取使用未公开的网站服务并带浏览器 User-Agent,FamilySearch 可能更改或关闭。共享树由社区编辑,不能作为证据;全文为机器识别,可能误读。

安装

在 SourceWeft 中

  1. 打开 控制台中的 FamilySearch,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

familysearch-mcp

[CI] [PyPI]

An MCP server for genealogical research on FamilySearch: a historical place gazetteer, indexed record search, the page images behind the records, and reads of the shared family tree.

Nothing here writes to FamilySearch. The shared tree is community-edited and conflations of same-named people are common, so a tree result is a hint: follow it to the underlying record and cite that.

This is an independent project. It is not made, endorsed or supported by FamilySearch.

Credentials

This package ships no client id and never handles a FamilySearch password. Records, images and the tree need an access token from your own registered FamilySearch application; docs/AUTH.md explains why, and how to get one.

The gazetteer, the collection catalogue and the film browser answer without a token, so they work on a fresh install with no setup at all.

Install

bash
uvx familysearch-mcp

That runs the server over stdio, which is how an MCP client starts it. You normally put it in the client's configuration rather than running it yourself.

Claude Desktop

json
{  "mcpServers": {    "familysearch": {      "command": "uvx",      "args": ["familysearch-mcp"],      "env": { "FS_ENV_FILE": "/path/to/familysearch.env" }    }  }}

Point at an env file rather than pasting the token into env. A token that lives in the client's config can only be replaced by editing it and restarting; a token in the file is picked up mid-session. With no token at all, leave env out and the anonymous tools still work.

Claude Code

bash
claude mcp add familysearch -e FS_ENV_FILE=/path/to/familysearch.env -- uvx familysearch-mcp

Configuration

VariableMeaning
FS_ACCESS_TOKENBearer token from your application's OAuth flow.
FS_ENV_FILEThe env file to read these settings from, and to re-read a refreshed token from. Default: the nearest .env from the working directory upward.
FS_CLIENT_IDYour registered application's client id, reported by auth_status.
FS_ENVIRONMENTproduction (default) or integration for the FamilySearch sandbox.
FS_TIMEOUTHTTP timeout in seconds. Default 60.

.env.example lists them with comments.

Tools

Twenty-eight tools. All of them read; download_image also writes the page it fetches to a local file.

Places

FamilySearch's Places API answers anonymously.

ToolNeeds a tokenPurpose
search_placesnoResolve a place name to its full jurisdictional form and coordinates.
search_places_at_datenoResolve a place as it was in a given year. A record naming a county that no longer exists is normal; filing it under the modern one is an invisible error.
get_placenoRead one place: jurisdictional chain, type, coordinates, and the dates that jurisdiction existed.
get_place_jurisdictionsnoWalk the containment chain upward — what turns "Kaskaskia" into "Kaskaskia, Randolph, Illinois, United States".
get_place_childrennoThe places directly inside a jurisdiction — the downward walk.

Records and collections

ToolNeeds a tokenPurpose
search_recordsyesSearch historical records by name, life events, parents, spouse, record type or collection. Every criterion filters, and the result says which FamilySearch applied exactly, relaxed or ignored. Returns one hit per record, with the others named on it.
get_recordyesRead one indexed record in full: every person on it and the labelled fields behind each.
get_record_imageyesFind the document image a record came from, or the film number when no image was published.
get_records_on_imageyesEvery record indexed from one image. A census page carries forty people.
fulltext_searchyesSearch the handwriting-recognised text of page images, mostly deeds, wills, probate and court files, for a name or phrase anywhere on the page. A machine reading: open the image and cite that.
search_collectionsnoFind a record collection by the words of its title, with its coverage, and how big and how old the cached catalogue is.
get_collectionnoRead one collection: what it covers and how much of it there is.
get_collection_fieldsnoDecode a collection's indexed field codes (PR_FTHR_NAME → "Father's Name").
browse_waypointsnoBrowse a collection's places, volumes and images, to reach pages the index never covered.
get_catalog_entryyesRead a FamilySearch Catalog entry: title, authors, places, notes, and each film or DGS with its description, image count and whether you can view it. contains narrows an entry of thousands to the volume or case you want; film_number finds the entry, and the volume, from a bare DGS or microfilm number.

Page images

ToolNeeds a tokenPurpose
get_image_linksfor the pageResolve an image ark to fetchable URLs: full page, deep zoom, thumbnails, neighbouring pages, and with a token the film and image number a citation needs. Without a token only the navigation comes back.
get_film_imagefor the pageReach a page by film and image number when a citation gives those instead of an ark. Checking the page exists needs no token.
download_imageyesDownload a page image to a new local file so it can be read.

Shared tree — a lead, never a source

Every tool here reads a community-edited profile, and says so in its own description.

ToolNeeds a tokenPurpose
get_personyesRead a shared-tree person: names, sex, facts.
get_person_relativesyesParents, spouses, children and siblings in one call.
get_person_sourcesyesWhat the tree attaches as sources, and which facts each supports. The fastest route out of the tree.
get_ancestryyesPedigree walk back, up to 8 generations, numbered by Ahnentafel.
get_descendancyyesPedigree walk forward, up to 4 generations.
get_person_memoriesyesAttached photographs, documents and stories.
get_person_changesyesThe change log: who edited this profile, when, and why.
get_matchesyesFamilySearch's own duplicate and record-match candidates.
compare_personyesCompare your own record of a deceased person with their profile: what agrees, what the profile lacks, what differs, and one proposed change per packet for you to make by hand.

Setup

ToolNeeds a tokenPurpose
auth_statusnoReport what is configured, what is missing, and whether FamilySearch still accepts the token.

How it behaves

  • The tree is not evidence. The tree tools read profiles anyone can edit. Use them to find records. get_person_sources is the most useful of them because it leads out of the tree towards a document.
  • A comparison proposes; it never changes. compare_person takes your own names, events, relatives and sources for one person, reads the profile, and reports what agrees, what the profile lacks and what differs. Each proposed change comes as a packet: the source, the facts to tag it to, a draft reason with gaps for you to fill, and where on the website to make it. You make the change yourself, one at a time, after reading the record. It refuses anyone who may be living, and it never proposes combining profiles, removing anything, replacing a relationship or changing living status. See docs/COMPARE.md.
  • A persona is not the record. A search returns one person's summary of what a record said; get_record returns the indexed fields behind it, and get_record_image the document itself. Read down that chain before citing.
  • Jurisdictions move. search_places_at_date resolves a place as it was in a given year. Filing an 1820 record under the county that covers the ground today is a common and hard-to-spot error.
  • Record search uses the website's search service. The API's own record search answers from a partial index that is almost all immigration records. search_records asks the service the FamilySearch website uses instead, with your token and a browser User-Agent, which that service requires. It is undocumented and FamilySearch can change or close it; docs/API-NOTES.md has the comparison.
  • Full-text search is a machine reading. fulltext_search asks the website's full-text service, on the same footing as record search: your token, a browser User-Agent, and an undocumented route. Its text is handwriting recognition, so names and numbers are often misread; each hit gives the passages that matched and the page's image ark, and the page is what to read and cite. Only some collections and volumes have been machine-read, so no result proves nothing. Every word must match unless you write OR, because the service otherwise matches any one of them.
  • The Catalog describes holdings, not records. get_catalog_entry reads the entry the website's catalog page reads, on the same footing as record search. For each film it reports the DGS number, which get_film_image and fulltext_search take, and asks the image store whether your account may view it and how many images it holds. A DGS is not the microfilm number; a film may be restricted or never digitised; and a description is a cataloguer's summary, so read the images and cite them.
  • Search criteria filter, loosely unless exact. FamilySearch treats a search term as a ranking hint unless told otherwise, so adding a death year to a name search only reorders it. This server asks for every criterion to match; loose=True goes back to ranking. Even required, a criterion leaves out only a record that contradicts it: a record giving no birth year still matches "born 1850", and a year matches five either side. exact=True makes each one present and matching, and holds a place to the county or state named. Every result's filters says how each criterion was applied, so a nil result can be read as the negative it is, or is not.
  • Tokens expire, and a refreshed one is picked up. A token lasts about an hour. On a 401 the server re-reads FS_ACCESS_TOKEN from the env file and retries once, so refreshing the file is enough. auth_status reports token_accepted: false when it is not.
  • Throttling is retried once. A 429 asking for a wait of up to 15 seconds is waited out and retried. A longer wait, or a second 429, comes back as rate_limited with the server's Retry-After.
  • Unknown parameters are refused. A misspelt or invented argument is an error that lists the parameters the tool does take. It is not silently dropped, which would make a filtered search quietly return unfiltered results.
  • download_image is careful with what it is given. It fetches only HTTPS URLs on FamilySearch hosts, because the request carries your token. It creates only image and PDF files, and never overwrites one.
  • Some routes are not publicly documented. FamilySearch's Historical Records API is behind a login wall, so those routes and response shapes were confirmed by live probing instead. A comment beside the code says when, and docs/API-NOTES.md records what was found. tests/live_check.py asks again.

Development

bash
git clone https://github.com/ianderso/familysearch-mcpcd familysearch-mcpuv sync --extra devuv run pytest                  # mocked with respx; no token, no networkuv run ruff check .uv run ruff format --check .

uv run python -m tests.live_check re-asks FamilySearch the questions only the live API can answer, with the token from your env file. See CONTRIBUTING.md for what a change is expected to carry.

License

MIT.

来源:README.md,提交 7c7bc0a

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

5
  1. v1.4.0最新Oct 11, 2026
  2. v1.3.0Oct 6, 2026
  3. v1.2.0Oct 6, 2026
  4. v1.1.0Oct 6, 2026
  5. v1.0.0Sep 30, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分