Skip to main content
Glama

Server Details

Reads handwritten family letters in old scripts and translates them, with notes on what they meant.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
–

TDQS

B3.3/5.0

Scored across 9 tools

Disambiguation3/5

Most tools are distinct (read_letter vs real_letters vs script_guide is clearly delineated, and each explicitly says what it must not be used for). However, get_reading already reports whether a page is still being read, which overlaps with reading_status, and read_letter without a photo returns a one-time upload link that duplicates upload_slot. These two boundary overlaps will likely cause occasional misselection.

Naming Consistency3/5

All names are snake_case and readable, which helps. But conventions are mixed: verb_noun (ask_letter, get_reading, read_letter), possessive (my_letters, my_allowance), and bare noun phrases (reading_status, script_guide, upload_slot), so the pattern isn't predictable from a name alone.

Tool Count4/5

Nine tools is a well-scoped size for a letter-reading service. Two of them (reading_status and upload_slot) are framed as helpers 'for FamilyLore's card' rather than agent-facing operations, which makes the set slightly heavier than needed.

Completeness4/5

The core lifecycle is covered: upload/submit a photo, start a reading, fetch the reading, ask follow-up questions, list account pages, and check allowance, plus example letters and script guides. Minor gaps exist (no delete/remove of a page, no rename, no cross-letter search), but agents can work around them.

Available Tools

9 tools
ask_letterAsk the letterA
Read-only
Inspect

Ask FamilyLore a question about one page in the person's account: what a phrase meant then, who someone was, what the letter says about something. The answer comes with the letter's lines it rests on, or says that the letter doesn't say. Use it with a page id from read_letter, my_letters or get_reading, once the page has been read. Questions the reading already answers (who is named, what the translation says) need no call.

NameRequiredDescriptionDefault
page_idYesThe page's id, from read_letter, my_letters or get_reading
questionYesThe question about the letter, in the person's words

Output Schema

NameRequiredDescription
linesNoThe letter's lines the answer rests on
answerYesFamilyLore's answer, in the language the page is translated into
contextNoWhat it meant then, when FamilyLore adds it
page_idYes
asked_onNoThe day FamilyLore answered, Pacific time (yyyy-mm-dd)
page_urlYesThe page on familylore.ai
questionYes
allowanceNoPages left, as the Account page counts them
letter_saysYesFalse when the letter doesn't say

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly and non-destructive annotations, it discloses that the answer is grounded in the letter's lines or explicitly says the letter doesn't say. That grounding and fallback behavior is valuable context for an agent that cannot infer it from annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded with concrete examples, followed by prerequisites and an exclusion. It is slightly longer than necessary because it repeats some schema-level detail, but every sentence contributes useful context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, prerequisites, question types, grounding behavior, and when not to call. Since an output schema exists, it does not need to explain return values, and nothing an agent needs in order to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both page_id and question clearly. The description reinforces the source of page_id and the nature of the question but adds no new syntax or constraints beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: ask a question about one page/letter in the person's account. It gives concrete examples of question types and distinguishes this from simply reading the letter, so an agent can tell what it does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to use a page id from read_letter, my_letters, or get_reading, and to call only once the page has been read. It also states the exclusion: questions already answered by the reading need no call, which gives clear when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_readingA letter's readingA
Read-onlyIdempotent
Inspect

The reading of a page in the person's FamilyLore account: the transcription in its own script with the words FamilyLore was unsure of marked, the translation, notes on what it meant, how sure the reading is, and the page's link. Use it with the page id read_letter answered, to show the reading once it is done or to see whether it is still being read.

NameRequiredDescriptionDefault
page_idYesThe page's id, from read_letter or FamilyLore

Output Schema

NameRequiredDescription
stepNoWhile reading: transcribing the handwriting, translating it, or checking the notes once it is translated
sureNo
notesNoWhat it meant: FamilyLore's notes, every one
titleNo
statusYesnot_started, reading (about a minute and a half), read, failed or cancelled
page_idYesThe page's id on FamilyLore
read_onNoThe date FamilyLore read it
languageNoThe letter's language
page_urlYesThe page on familylore.ai
elapsed_sNoWhile transcribing: seconds since the reading started
confidenceNoHow sure the reading is, 0 to 1
expected_sNoWhile transcribing: how long readings in this language usually take, in seconds
sure_stepsNoHow sure, in steps of 5
translationNo
unsure_wordsNoHow many words the reading was unsure of
language_codeNoIts code, for a card to name it in the host's language
right_to_leftNo
transcriptionNoAs written, in the letter's own script
unsure_word_indexesNoThe words the reading was unsure of, as positions in the transcription's words split on white space
translation_languageNo
translation_language_codeNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, non-destructive, and closed-world behavior. The description adds useful context about the reading contents and the fact that it can be called while a reading is still in progress, though it does not discuss errors or permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded and the description is short enough to scan. The first sentence is somewhat run-on because it lists several return fields, but it remains useful and does not contain obvious filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with annotations and an output schema, the description covers purpose, usage, expected content, and in-progress behavior. The main missing piece is explicit guidance on when to use reading_status instead.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter and schema coverage is 100%, so the schema already fully documents page_id. The description adds that the id comes from read_letter, but this is largely consistent with the schema and does not add much beyond it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that this tool retrieves a page's reading, including transcription, translation, notes, confidence, and link. It distinguishes itself from read_letter by using the page id that read_letter returns, but it does not explicitly differentiate itself from the sibling reading_status tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear use case: call it with the page id returned by read_letter to show the reading once done or to see whether it is still being read. It does not state when not to use it or explicitly route progress-only checks to reading_status.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

my_allowanceMy allowanceA
Read-onlyIdempotent
Inspect

How many pages the person's FamilyLore account has left to read: today for a free account, this month otherwise, and when more come. Reading a page in the chat uses the same allowance as on the site.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
allowanceNoNone when the account's pages aren't counted

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish this as a read-only, idempotent, non-destructive, closed-world query, so the bar is low. The description still adds genuine context beyond them: the allowance window differs by account tier (daily for free, monthly otherwise) and it mentions when replenishment occurs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence that front-loads what is returned. It is somewhat run-on, with the tier-based window and the chat/site equivalence packed into one clause chain, but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shape need not be explained. The description covers units, the reset window by tier, and the cross-surface equivalence; only the authentication requirement ('the person's account' implies but never states a logged-in user) is left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description's only useful clarification is that the allowance is scoped to 'the person's' account, implicitly the caller's.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (the person's remaining page allowance) and its units (pages left to read), which is more than a restatement of the title. It does not, however, explicitly distinguish itself from nearby siblings like get_reading or reading_status, which an agent could easily confuse with a quota check.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the note that 'reading a page in the chat uses the same allowance as on the site' hints this is a pre-read budget check, but there is no explicit when-to-call, no exclusions, and no named alternative among the reading siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

my_lettersMy lettersA
Read-onlyIdempotent
Inspect

The pages in the person's FamilyLore account, newest first: each letter's title, language, the date it was added, whether it has been read, and its page id. Use it when the person asks about letters they have read on FamilyLore; pass a page id to get_reading for that letter's reading.

NameRequiredDescriptionDefault
limitNoHow many pages to list, newest first

Output Schema

NameRequiredDescription
moreNoWhether the account may have more pages than are listed here
lettersNoNewest first
library_urlNoEvery page in the account, on familylore.ai

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a read-only, idempotent, non-destructive, closed-world operation, so the description only needs supplemental context. It adds useful behavior by stating the list is newest first and includes read status, language, title, date, and page id, but does not discuss pagination beyond the limit parameter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it first states what the list contains, then gives the usage condition and the follow-up tool. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations and an output schema present, the description is largely complete for a simple list tool. The only meaningful gap is that it does not explicitly clarify how this differs from `real_letters`.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one optional parameter, and schema coverage is 100%, so the schema already fully documents `limit` including its default, range, and newest-first meaning. The description adds no additional parameter semantics beyond referencing page ids in the output.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource as the person's FamilyLore pages/letters and lists the fields returned, with a newest-first ordering. It does not fully distinguish this tool from the sibling `real_letters`, but it does route page-specific follow-up to `get_reading`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear usage cue: use when the person asks about letters they have read on FamilyLore. It also explains the next step, passing a returned page id to `get_reading`, though it does not explicitly compare against `real_letters`.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reading_statusReading progressC
Read-onlyIdempotent
Inspect

Where a page's reading is, for FamilyLore's card while the page is read.

NameRequiredDescriptionDefault
page_idYesThe page's id

Output Schema

NameRequiredDescription
stepNoWhile reading: transcribing the handwriting, translating it, or checking the notes once it is translated
sureNo
notesNoWhat it meant: FamilyLore's notes, every one
titleNo
statusYesnot_started, reading (about a minute and a half), read, failed or cancelled
page_idYesThe page's id on FamilyLore
read_onNoThe date FamilyLore read it
languageNoThe letter's language
page_urlYesThe page on familylore.ai
elapsed_sNoWhile transcribing: seconds since the reading started
confidenceNoHow sure the reading is, 0 to 1
expected_sNoWhile transcribing: how long readings in this language usually take, in seconds
sure_stepsNoHow sure, in steps of 5
translationNo
unsure_wordsNoHow many words the reading was unsure of
language_codeNoIts code, for a card to name it in the host's language
model_contextNoOnce read: the reading as text, for the card to give the assistant (ui/update-model-context)
right_to_leftNo
transcriptionNoAs written, in the letter's own script
unsure_word_indexesNoThe words the reading was unsure of, as positions in the transcription's words split on white space
translation_languageNo
translation_language_codeNo

TDQS

C2.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so safety is covered. The description adds nothing beyond that: it doesn't say whether status is per-user, whether it changes over time, or what triggers it, despite being a progress-tracking read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is short, but the single sentence is awkwardly constructed and front-loads an oblique clause. Brevity here comes from under-specification rather than efficiency; no waste is removed because there is almost no content to begin with.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained, but the description still fails to say what status values mean or how this differs from get_reading. For a tool with many similarly named siblings, that omission leaves the agent without enough to choose correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single required page_id already documented, so the description has little room to add meaning. It does at least imply page_id is the page whose status is fetched, matching the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The phrase 'Where a page's reading is' gestures at a status lookup but never names a clear verb or resource; 'for FamilyLore's card while the page is read' reads as an internal implementation note rather than a description of the tool's job. An agent cannot confidently tell what reading_status returns versus the sibling get_reading.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use or when-not-to-use guidance is given, and the obvious alternative (get_reading, plus read_letter/real_letters/my_letters) is never mentioned. The clause about a UI card hints at a narrow use case but doesn't translate into an actionable selection rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_letterRead a letterAInspect

Read a photo of an old handwritten letter, postcard or document with FamilyLore: the transcription in its own script, a translation and notes on what it meant then. Use it when the person attaches a photo of a handwritten page and asks what it says. It reads pre-1918 Russian and Ukrainian cursive, German Kurrent and Sütterlin, Yiddish, and old English cursive. It needs the person's FamilyLore account and uses one page of the account's allowance. It starts the reading and answers at once with the page id; a reading takes about a minute and a half. If the photo can't be attached here, call it without one: it answers with a one-time link where the person sends the photo to FamilyLore, and the page id to pass to get_reading once they have.

NameRequiredDescriptionDefault
yearNoThe year it was written, if the person knows it roughly (1912 for 'about 1912')
photoNoThe photo of the page the person attached
page_idNoA page already on FamilyLore that hasn't been read, from FamilyLore's own photo upload
languageNoThe letter's language, if the person says it or it is plain: ru_uk = Russian or Ukrainian, de_kurrent = German (Kurrent or Sütterlin), yi = Yiddish, en = English (old cursive). Leave it out and FamilyLore tells.
target_languageNoThe language to translate it into: en (English), de (German), ru (Russian), pl (Polish), it (Italian), fr (French), uk (Ukrainian). English if left out.

Output Schema

NameRequiredDescription
statusYesreading: started (about a minute and a half); read: the page already has its reading; waiting_for_photo: the person sends the photo at upload_link, then FamilyLore reads it
page_idYesThe page's id on FamilyLore
page_urlYesThe page on familylore.ai, with the person's other pages
allowanceNoPages left, as the Account page counts them
upload_linkNowaiting_for_photo: where the person sends the photo, once
link_expires_atNoWhen upload_link stops working (UTC)
converted_from_heicNoThe photo was an iPhone HEIC, read as a JPEG

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations it discloses prerequisites (the person's FamilyLore account), cost (one page of the account's allowance), and timing semantics (returns immediately with a page id, reading completes in about a minute and a half). The no-photo branch with a one-time upload link is behavioral context an agent could not infer from readOnlyHint=false and openWorldHint=true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action, trigger and cost constraints are front-loaded, and each later sentence carries operational detail. It runs long, and the list of supported scripts could be trimmed, but no sentence is pure filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an asynchronous, allowance-consuming, account-gated tool with a fallback upload path, the description covers the account requirement, cost, latency, and the two-step page-id flow into get_reading. An output schema exists, so return-value explanation is correctly left out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents year, photo, page_id, language and target_language with enums and defaults. The description reinforces the photo-optional path and the page id handoff but adds no new meaning for individual parameters such as target_language or the year hint.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ('Read a photo of an old handwritten letter, postcard or document') and enumerates what comes back: transcription in the original script, a translation, and notes on period meaning. It is clearly distinguishable from siblings such as get_reading and reading_status, which it names as the follow-up step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the trigger plainly ('Use it when the person attaches a photo of a handwritten page and asks what it says') and supplies an explicit fallback path when no photo can be attached, including the handoff to get_reading. It stops short of contrasting itself with ask_letter or reading_status, so the sibling routing is only partly covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

real_lettersReal letters, 1758–1943A
Read-onlyIdempotent
Inspect

FamilyLore's shelf of 16 real handwritten letters from 1758 to 1943, each with FamilyLore's reading: the transcription in the original script, an English translation, and notes on what the letter meant at the time. Use this when someone wants to see a real historical letter: one written in a given script (such as Kurrent, Sütterlin or old Russian cursive), in a given language, from a period or near a year, or the full reading of one of these letters. Without a letter id it lists the matching letters; with one it returns that letter's reading. Do not use it to read a letter or photo the person has: these are fixed example letters only.

NameRequiredDescriptionDefault
yearNoLetters nearest this year first
letterNoA letter's id from this tool's list, such as de-1858-kilian, for that letter's whole reading
periodNoI · The age of the quill (1750–1800); II · Emancipations and emigrations (1830–1866); III · The long 19th century ends (1875–1914); IV · Field post (1914–1945)
scriptNoThe handwriting: German Kurrent, Sütterlin, Russian, Ukrainian, Polish, English, Latin, Swedish, French, Hebrew
languageNoThe letter's language: German, English, Latin, Russian, Polish, Ukrainian, Swedish, French, Hebrew

Output Schema

NameRequiredDescription
lettersYesThe matching letters; with a letter id, that one letter
periodsYesThe shelf's periods, for the next question
readingNoWith a letter id: its whole reading
scriptsYesThe shelf's scripts, for the next question
languagesYesThe shelf's languages, for the next question
last_yearYesThe year of the shelf's latest letter
shelf_urlYes
first_yearYesThe year of the shelf's earliest letter
shelf_sizeYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnly/idempotent/closed-world annotations already covering the safety profile, the description adds real value: it discloses the corpus is a fixed set of 16 letters and that behavior switches between list mode and detail mode based on the letter id. It does not say what happens when filters match nothing (empty list vs error), which is the main remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what the shelf is, then when to use it, then the list/detail mode switch, then the exclusion. Roughly four sentences, all load-bearing, no repetition of annotation or schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given rich annotations, 100% schema coverage, and an output schema, the description supplies everything else an agent needs: corpus identity and size, content payload, the two invocation modes, and the negative case. Nothing material is missing for correct selection or invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns an extra point by explaining the mode-selection semantics — 'Without a letter id it lists the matching letters; with one it returns that letter's reading' — which the schema's per-parameter defaults do not convey on their own.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource and scope: 'FamilyLore's shelf of 16 real handwritten letters from 1758 to 1943,' and spells out exactly what each entry contains (original-script transcription, English translation, contextual notes). An agent can immediately tell this apart from tools that read a user's own uploaded letter.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives both the when ('someone wants to see a real historical letter' by script, language, period, year, or full reading) and the when-not ('Do not use it to read a letter or photo the person has'). The alternative sibling tools (read_letter, ask_letter) are not named, so routing is implied rather than pointed to directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

script_guideScript guide: old handwriting, letter by letterA
Read-onlyIdempotent
Inspect

FamilyLore's guide to the 137 letters of five old handwriting styles: Russian cursive, German Kurrent, Sütterlin, Hebrew cursive, American cursive. For one letter: how it was written (its forms, with images), what to look for, the letters it is mistaken for and how to tell them apart, and printed copybook plates where FamilyLore has them. Use this when someone asks how a letter was written in one of these hands, what an old letter shape is, or why two letters look alike; give the letter as written ("ѣ", "G"), by its name ("yat") or as transliterated, and the hand if known. With only a hand it returns that hand's alphabet. Do not use it to read a letter or photo the person has: it explains the alphabets only.

NameRequiredDescriptionDefault
handNoThe handwriting: Russian cursive, German Kurrent, Sütterlin, Hebrew cursive, American cursive
letterNoThe letter: as written (ѣ, G, ך), by name (yat, alef), or as transliterated

Output Schema

NameRequiredDescription
handNoThe hand that letter, or the alphabet, is in
handsYesThe five hands, for the next question
letterNoThe letter asked for, when the question fits one
alphabetYesWith a hand and no letter: its letters, in order
guide_urlYes
candidatesYesWhen the question fits more than one letter: each of them
unknown_letterNoThe letter asked for, when nothing in the guide fits it (in the hand asked, or in any)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so the safety profile is covered. The description adds genuine value beyond that: what a result contains (forms with images, what to look for, confusable letters, copybook plates 'where FamilyLore has them') and the degradation behavior when only a hand is supplied (returns that hand's alphabet).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the resource and scope, and the sentence-per-idea structure (what it returns, when to use, how to supply the letter, fallback, exclusion) is efficient. It is dense and list-heavy, but almost every clause carries usable routing or input information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return format needn't be spelled out, and despite both parameters being optional the description explains the hand-only fallback and the letter forms accepted. Nothing an agent needs in order to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already states the letter may be given as written (ѣ, G, ך), by name (yat, alef), or transliterated, and lists the five hands. The description largely restates this, adding only mild context (letter optional, hand 'if known'), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Starts with a concrete verb+resource ('guide to the 137 letters of five old handwriting styles') and enumerates the specific hands covered. An agent can tell this apart from read_letter/ask_letter immediately: this explains alphabets, it does not read documents.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit trigger conditions are given ('when someone asks how a letter was written... what an old letter shape is, or why two letters look alike') plus an explicit exclusion ('Do not use it to read a letter or photo the person has'), which effectively routes the agent to the reading siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_slotSend a photoCInspect

A one-time link where the person sends FamilyLore the photo of a page, for FamilyLore's card.

NameRequiredDescriptionDefault
yearNoThe year it was written, if known
languageNoThe letter's language, if known
target_languageNoThe language to translate it into: en (English), de (German), ru (Russian), pl (Polish), it (Italian), fr (French), uk (Ukrainian). English if left out.

Output Schema

NameRequiredDescription
linkYesWhere the person sends the photo: once, before expires_at
page_idYesThe page the photo becomes; get_reading shows its reading
expires_atYesWhen the link stops working (UTC)

TDQS

C2.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already state readOnly=false, idempotent=false, destructive=false, and openWorld=false. The description adds a useful behavioral detail by calling it a 'one-time link,' which reinforces single-use behavior, but it does not clarify creation vs. upload, permissions, or lifecycle.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence with no wasted wording. Its structure is a fragment rather than an action statement, but it is appropriately sized and front-loads the one-time-link concept.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although an output schema and annotations exist, the description does not make the tool's core action explicit. For an agent deciding whether to call upload_slot versus other tools, the missing purpose/usage detail leaves a significant gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and all three optional parameters have clear descriptions in the schema. The description adds no parameter-level meaning, so the schema carries the burden and baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description conveys the domain: a one-time link for sending FamilyLore a photo of a page. However, it is a noun phrase rather than a clear action verb, so an agent cannot tell whether the tool creates the link, returns the link, or performs the upload. It is not mere tautology, but the purpose remains vague.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance, no exclusions, and no comparison to sibling tools. The phrase 'for FamilyLore's card' hints at a use case, but the agent is left to infer the triggering conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 2 tool updates
    • Changedread_letter2 fields changed
      • changedInput schema / properties / target_language / anyOf
        Previous value: -[
        -  {
        -    "enum": [
        -      "en",
        -      "de",
        -      "ru"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "en",
        +      "de",
        +      "ru",
        +      "pl",
        +      "it",
        +      "fr",
        +      "uk"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / target_language / description
        Previous value: -"The language to translate it into: en (English), de (German), ru (Russian). English if left out."New value: +"The language to translate it into: en (English), de (German), ru (Russian), pl (Polish), it (Italian), fr (French), uk (Ukrainian). English if left out."
    • Changedupload_slot2 fields changed
      • changedInput schema / properties / target_language / anyOf
        Previous value: -[
        -  {
        -    "enum": [
        -      "en",
        -      "de",
        -      "ru"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "en",
        +      "de",
        +      "ru",
        +      "pl",
        +      "it",
        +      "fr",
        +      "uk"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / target_language / description
        Previous value: -"The language to translate it into: en (English), de (German), ru (Russian). English if left out."New value: +"The language to translate it into: en (English), de (German), ru (Russian), pl (Polish), it (Italian), fr (French), uk (Ukrainian). English if left out."
  2. 2 tool updates
    • Changedread_letter2 fields changed
      • changedInput schema / properties / language / anyOf
        Previous value: -[
        -  {
        -    "enum": [
        -      "ru_uk",
        -      "de_kurrent",
        -      "yi"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "ru_uk",
        +      "de_kurrent",
        +      "yi",
        +      "en"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / language / description
        Previous value: -"The letter's language, if the person says it or it is plain: ru_uk = Russian or Ukrainian, de_kurrent = German (Kurrent or Sütterlin), yi = Yiddish. Leave it out and FamilyLore tells."New value: +"The letter's language, if the person says it or it is plain: ru_uk = Russian or Ukrainian, de_kurrent = German (Kurrent or Sütterlin), yi = Yiddish, en = English (old cursive). Leave it out and FamilyLore tells."
    • Changedupload_slot1 field changed
      • changedInput schema / properties / language / anyOf
        Previous value: -[
        -  {
        -    "enum": [
        -      "ru_uk",
        -      "de_kurrent",
        -      "yi"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "ru_uk",
        +      "de_kurrent",
        +      "yi",
        +      "en"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  3. 9 tool updates
    • First observedask_letter
    • First observedget_reading
    • First observedmy_allowance
    • First observedmy_letters
    • First observedread_letter
    • First observedreading_status
    • First observedreal_letters
    • First observedscript_guide
    • First observedupload_slot

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides a measured reading pipeline for AI readers of historical handwritten and typed records, with tools for inspection, evidence extraction, comparison, and Brier-scored calibration.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to conduct Swedish genealogy research using the Swedish National Archives' public APIs, from identifying parishes and locating digitised church books to fetching and reading scanned pages with source citations.
    7
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Lets an AI assistant do everything you would do on Ancestry.com by hand: search records, read and edit trees (people, facts, sources, citations, notes, tags, media), review hints, attach records, look at DNA matches, and read or send messages.
    5
    13
    1
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources