Skip to main content
Glama

Lexicon MCP

Lexicon MCP is a local-first multilingual dictionary, thesaurus, translation, lexical-relations, semantic-neighbour, and English rhyme-search server for the Model Context Protocol (MCP). It serves a versioned corpus from disk and performs no network access or data mutation while running.

IMPORTANT

The software and corpus are licensed separately. The Python source is Apache-2.0. Corpus components retain their upstream licenses; seeDATA_LICENSES.md.

Model-visible tools

The server exposes exactly seven tools:

  1. dictionary_lookup

  2. dictionary_synonyms

  3. dictionary_translate

  4. dictionary_relations

  5. dictionary_semantic_neighbors

  6. rhymes

  7. wordplay

Relation results label direct edges as relation_scope="direct", distance=1. Hypernym and hyponym queries can additionally return a bounded, homogeneous two-edge expansion labelled relation_scope="transitive", distance=2; its path contains both directed edges with their exact sense scope and provenance.

dictionary_lookup uses limit for returned senses and has independent total response budgets for examples, pronunciations, and translations. Their defaults are 8, 8, and 20; each is shared round-robin across the returned senses and 0 disables that detail class. Every sense reports truncated_fields, so a fixed budget never silently presents a partial detail list as complete.

dictionary_translate inspects up to max_senses=100 source-native senses by default, independently of its total translation-candidate limit. Translation candidates are distributed round-robin across matching source-sense groups. Grouped synonym and translation responses retain count for the number of groups and also report candidate_count for their nested candidates.

dictionary_synonyms accepts max_senses (the number of source-native lexical senses inspected) and unsensed_limit; dictionary_relations accepts max_depth (one or two relation-graph hops) and transitive_limit. In both tools, limit is the total returned-candidate cap. An allocation of 0 disables the broader class, a positive value requests an explicit bounded allocation, and the default is 5. Allocations cannot exceed limit; automatic allocation is reserved for a future release. The sentinel -1 is reserved for future benchmark-tuned automatic allocation and is not accepted in v1; 0 disables the allocated class. Unused broader allocation is returned to sense-scoped or direct candidates.

For semantic neighbours, omitting target_language searches the global multilingual index; setting it to the source tag produces monolingual results, and another tag requests cross-lingual results. English rhymes(mode="near") is fixed to exactly one ARPAbet-token insertion, deletion, or substitution in v1; there is no automatic or caller-configurable edit distance.

wordplay(text, kind, context=None, limit=20) answers exactly one requested kind per call, kind being anagram, palindrome, spoonerism, or pun. There is no automatic mode and no -1; limit follows the same 1..100 policy as every other tool, and context (1..512 characters) is rejected for every kind except pun.

  • anagram returns English headwords whose normalized letters (NFKC + casefold, ASCII a-z only) are a reordering of the query's letters. Only strictly alphabetic single-token headwords are eligible, so phrase or punctuated anagrams are never claimed, and the query itself is excluded.

  • palindrome reports input_is_palindrome for the query and returns stored corpus palindromes other than the query. Candidates are enumerated deterministically in (normalized_letters, term_id) index order starting at the query's letters and wrapping once; every candidate's normalized letters read identically in reverse. One-code-point inputs yield no candidates.

  • spoonerism requires exactly two whitespace-separated English headwords. It exchanges their initial ARPAbet consonant clusters (the onset is every consonant token before the first vowel; vowel-initial words have an empty onset) using at most eight CMU pronunciation alternatives per word. Swapped outputs are pronunciation-derived phrases labelled lexicality_scope="generated_candidate" unless both swapped pronunciations resolve to corpus headwords (then "lexical_term" and every resolved headword is reported, since one pronunciation can spell several words). Empty-to-empty and identical onsets are never swapped.

  • pun returns exact CMUdict homophones of the query that carry at least one source-native sense distinct from the query term's senses, labelled result_class="candidate" with sound_relation="homophone"; it is never claimed to be a finished joke. Without context the response is labelled context_scope="uncontextualized". Meanings are never inferred from vector similarity.

Every wordplay result carries a provenance array: spelling and senses come from Open English WordNet or Wiktionary via Wiktextract entries where present, and phonetic derivations come from the CMU Pronouncing Dictionary. The first wordplay-capable dataset is data-v1.1.0 (lexical schema 3); data-v1.0.0 artifacts do not contain the wordplay indexes and are rejected by this server version.

Dataset installation, verification, repair, and rollback are deliberately CLI-only.

Related MCP server: FilePilot AI

Local development

Requirements: Python 3.13 and uv.

uv sync --extra dev
uv run pytest
uv run ruff check .

Run the MCP server after installing a verified dataset:

$env:LEXICON_DATA_DIR = 'E:\AI\data\lexicon-mcp'
uv run --frozen lexicon-mcp

The server never downloads data. If no verified corpus is active, it exits with a diagnostic containing the exact lexicon-data install command.

Dataset lifecycle

Install only the languages and capabilities you want:

lexicon-data install --version data-v2.0.0 --languages en --capabilities lexical,semantic,wordplay
lexicon-data install --version data-v2.0.0 --languages en,fr,de --capabilities lexical
lexicon-data install --version data-v2.0.0 --all-languages

lexicon-data languages           # coverage, and what this install serves
lexicon-data add-language --version data-v2.0.0 --languages fr
lexicon-data remove-language --version data-v2.0.0 --languages fr
lexicon-data status
lexicon-data verify
lexicon-data activate --activation <id>   # switch back to a retained selection
lexicon-data prune                        # reclaim unreferenced components

The corpus carries 5,508 lexical languages, of which 78 also have semantic vectors, and English additionally has pronunciation and wordplay indexes. Those are selected independently, so "every language, English vectors only" is a valid install. A selection is never silently narrowed: a language the release does not carry fails outright, while one that simply lacks the capability you asked for is reported alongside the install.

Typical footprints:

Selection

Download

Installed

English lexical

0.60 GiB

2.01 GiB

English + semantic + wordplay

1.11 GiB

2.88 GiB

All 5,508 lexical languages

2.67 GiB

8.24 GiB

LEXICON_DATA_DIR selects the installation root. Releases are immutable. Components are stored by content hash, so a component two selections share is held once, add-language fetches only what is genuinely new, and switching back to an earlier selection is a pointer swap rather than a re-download. Every mutation ends in an atomic swap, so an interrupted operation leaves the previous install exactly as it was. Downloads resume into .partial files and are hash-checked before anything is activated.

Verification is scoped to what you installed rather than to the whole release, so a deliberately partial install is not reported as damaged.

Air-gapped and mirrored installation

Runtime operation is fully offline, but installation normally downloads its release. To install without ever putting the target machine on a network, mirror the release somewhere connected and carry it across:

# On a connected machine
lexicon-data fetch --profile full --version data-v1.0.0 --dest E:\transfer\data-v1.0.0

# On the isolated machine, after copying the directory across
lexicon-data install --profile full --version data-v1.0.0 --from E:\transfer\data-v1.0.0

fetch writes the exact published release layout — manifest.json beside one file per part — and verifies every part against its manifest SHA-256 before giving it its final name. It is resumable and idempotent: rerun it after an interruption and it continues, skipping whatever is already valid. It never writes to the dataset root, never activates anything, and the manifest is written last, so an interrupted mirror fails loudly on install rather than looking complete.

install --from performs no network access at all. Every part is resolved on disk; a release that cannot be satisfied locally is an error rather than a silent fall back to the network. Because the transferred assets carry their manifest hashes, the transfer itself is integrity-checked end to end.

--from accepts a mirror directory, a manifest.json path, an HTTP(S) URL, or a template containing {version} and {profile}. repair accepts it too, so a damaged air-gapped install can be repaired from the same media. To install from a self-hosted mirror instead, publish the release with base_url set and point --from at its manifest.json; LEXICON_MANIFEST_URL sets a default template.

--manifest-url remains as a deprecated alias for --from and is removed in 2.0.0.

Asking for something you did not install

A language you did not install is never confused with a word that does not exist. Every tool distinguishes these, and says which:

Reason

Meaning

language_not_installed

the corpus has it; install it and the query works

unknown_language

the corpus never had it

capability_not_installed

the language is installed, that capability was not selected

not_available_upstream

the corpus has no such data for that language at all

Semantic search over a subset reports which languages it actually searched and whether the result was restricted, because an unrestricted search on a full corpus covers all 78 vector languages and on a subset covers what is installed.

Relation results also mark whether a target's own entry is installed, so a translation into a language you do not have is still returned and still usable -- it simply cannot be expanded further.

Corpus

The full build combines independently attributed snapshots of:

  • Open English WordNet 2025 for English synsets and lexical relations;

  • the English Wiktionary Wiktextract/Kaikki raw dump for multilingual entries, senses, examples, pronunciation, etymology, and translations;

  • ConceptNet 5.7 for multilingual lexical and commonsense relations;

  • ConceptNet Numberbatch 19.08 for multilingual semantic neighbours; and

  • CMUdict for English pronunciation and rhyme search.

Every public result identifies its source, dataset version, language, sense scope, and license. ConceptNet-only results are explicitly unsensed.

Lexical data uses a compact, interned SQLite schema with deferred read-path indexes. English rhyme search and internal prefix completion use a contentless FTS5 index; exact senses, translations, relation direction, and provenance remain in ordinary relational tables. Numberbatch vectors are searched through memory-mapped cosine/i8 USearch HNSW indexes and exact-reranked from float16 vectors without loading or scanning the full matrix.

Data builds and releases

sources.lock.json freezes exact source revisions and hashes. The build pipeline is streaming and checkpointed; it does not build the unused Google n-gram database from the earlier community project. Data artifacts are packaged into independently hashed parts below 1 GiB and published under a separate immutable data-v* release.

The production build accepts only already-downloaded inputs matching the pinned byte hashes, logical row counts, and logical row digests. Recheck them before a release build:

uv run --frozen python scripts/build_source_lock.py verify `
  --lock sources.lock.json `
  --source 'oewn=E:\AI\state\lexicon-mcp-build\sources\oewn-2025.xml.gz' `
  --source 'wiktextract=E:\AI\state\lexicon-mcp-build\sources\wiktextract-en-2026-08-12.jsonl.gz' `
  --source 'conceptnet=E:\AI\state\lexicon-mcp-build\sources\conceptnet-assertions-5.7.0.csv.gz' `
  --source 'numberbatch=E:\AI\state\lexicon-mcp-build\sources\numberbatch-19.08.txt.gz' `
  --source 'cmudict=E:\AI\state\lexicon-mcp-build\sources\cmudict.dict'

Build into staging, not into the live installation root. On the production Windows host, the wrapper below runs the same frozen command and records free-disk, private memory, and working-set telemetry throughout the build:

powershell -NoProfile -ExecutionPolicy Bypass -File scripts\run_full_build.ps1

For the compact English profile, use distinct output/version paths:

powershell -NoProfile -ExecutionPolicy Bypass -File scripts\run_full_build.ps1 `
  -Profile english `
  -DatasetVersion data-en-v1.0.0 `
  -Output E:\AI\state\lexicon-mcp-build\built\data-en-v1.0.0

The equivalent direct command is:

uv run --frozen python scripts/build_full_corpus.py `
  --oewn E:\AI\state\lexicon-mcp-build\sources\oewn-2025.xml.gz `
  --wiktextract E:\AI\state\lexicon-mcp-build\sources\wiktextract-en-2026-08-12.jsonl.gz `
  --conceptnet E:\AI\state\lexicon-mcp-build\sources\conceptnet-assertions-5.7.0.csv.gz `
  --numberbatch E:\AI\state\lexicon-mcp-build\sources\numberbatch-19.08.txt.gz `
  --cmudict E:\AI\state\lexicon-mcp-build\sources\cmudict.dict `
  --source-lock E:\AI\lexicon-mcp\sources.lock.json `
  --notices-dir E:\AI\lexicon-mcp `
  --output E:\AI\state\lexicon-mcp-build\built\data-v1.0.0 `
  --build-state E:\AI\state\lexicon-mcp-build `
  --dataset-version data-v1.0.0

The direct English build uses the same pinned inputs and adds --profile english, with data-en-v1.0.0 supplied for both --output and --dataset-version.

Package with the exact clean transformation commit, then validate a clean offline install from the same release bundle before uploading it:

uv run --frozen python scripts/package_data.py `
  --dataset E:\AI\state\lexicon-mcp-build\built\data-v1.0.0 `
  --output E:\AI\state\lexicon-mcp-build\release\data-v1.0.0 `
  --dataset-version data-v1.0.0 `
  --repository DilanRG/lexicon-mcp `
  --tag data-v1.0.0 `
  --transformation-commit <40-character-commit>

uv run --frozen lexicon-data --data-dir E:\AI\data\lexicon-mcp install `
  --profile full --version data-v1.0.0 `
  --from E:\AI\state\lexicon-mcp-build\release\data-v1.0.0

Release acceptance is separate from ordinary CI because it reads the full activated corpus with networking denied:

uv run --frozen pytest -m full_corpus -ra
uv run --frozen pytest -m ann -ra
uv run --frozen pytest -m performance -ra

The Windows live-stack gate has a separate, explicit runner. It refuses to touch services unless --execute-live is present, always performs exactly ten cycles, and leaves append-only JSONL evidence plus a final JSON report:

uv run --frozen --project E:\AI\lexicon-mcp python `
  E:\AI\lexicon-mcp\scripts\run_live_acceptance.py `
  --execute-live `
  --base-report E:\AI\state\lexicon-mcp-build\acceptance\corpus-gates.json

Each cycle proves the old MCPO root and children exited, obtains exclusive handles to every active dataset artifact while stopped, starts through the normal E:\AI\scripts entrypoints, checks router/Open WebUI/MCPO health, validates the exact six-operation Lexicon OpenAPI surface, invokes a lightweight Lexicon lookup and Calculator in every cycle, and finishes with active_models=[]. In the first post-restart cycle it also invokes and validates all six Lexicon tools through MCPO: bank lookup selects unique Wiktionary river and financial senses by source and gloss, then passes each exact sense ID into a separate German translation call. The river call must return Ufer and the financial call must return Bank; acceptance does not depend on either term appearing in lookup's bounded embedded-translation page. The lookup itself uses a total translations_limit=3, proves the aggregate budget is respected, verifies every returned translation remains attached to its source sense, and requires per-sense truncated_fields evidence. Synonyms, directed relations, language-filtered finite-cosine semantic neighbours, and query-excluding rhymes are checked against pinned corpus anchors. The full cross-tool flow, request/result hashes, both selected sense IDs, and per-tool assertions are written to both JSONL events and the final report.

Recursive directory notifications plus baseline, per-cycle, and final inventories reject dataset or project-venv rewrites, including short-lived transient files. Full content fingerprints are calculated before and after the run. The runner checks Open WebUI health only: it does not claim that an ordinary chat prompt selected or invoked a tool. That UI-level prompt evidence must be captured separately during live acceptance. A fixture replay is available for safe runner validation, but its report deliberately records live_stack_ok=false, labels all six-tool calls as fixture-replay, and cannot satisfy publication:

uv run --frozen --project E:\AI\lexicon-mcp python `
  E:\AI\lexicon-mcp\scripts\run_live_acceptance.py `
  --dry-run-fixture E:\AI\lexicon-mcp\tests\fixtures\live_acceptance\happy.json

scripts/publish_data_release.py --stage creates or resumes a draft and verifies every remote asset. --publish additionally requires an acceptance report tied to the exact manifest hash and refuses publication unless clean-install, offline, corpus, ANN, performance, live-stack, ten-restart, and final-model-unload gates are all recorded.

Code and data releases are intentionally separate:

  • code: v1.0.0

  • data: data-v1.0.0

The code release pins an exact compatible data release and never resolves latest.

Prior art

This is an independent clean-room implementation. The project idea was informed by Eyalm321/multilingual-dictionary-mcp, which is acknowledged as prior art. No source code or Git history was copied.

Security and privacy

  • Runtime databases are opened read-only and query-only.

  • SQL uses bound parameters; query text is never interpreted as SQL.

  • Tool inputs and result counts are bounded.

  • Runtime operation is fully offline.

  • Dataset administration is never exposed to the model.

Available Tools

7 tools
dictionary_lookupA

Look up distinct dictionary senses for a word.

Returns stable sense IDs, parts of speech, glosses, examples, IPA, etymology, translations, and source provenance. Use an ISO/BCP-47 language tag such as en, de, es, ja, or zh-Hant. limit is the number of senses. Each detail limit is an independent total response budget, fairly shared across returned senses; 0 disables that detail class. Every sense lists any detail fields truncated by these fixed budgets.

ParametersJSON Schema
NameRequiredDescriptionDefault
wordYesUnicode query text; normalized with NFKC and casefold for lookup.
limitNoMaximum total result budget for this tool.
languageNoISO/BCP-47 language tag.en
examples_limitNoFixed total response budget for this detail class; 0 disables it.
part_of_speechNo
translations_limitNoFixed total response budget for this detail class; 0 disables it.
pronunciations_limitNoFixed total response budget for this detail class; 0 disables it.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden. It discloses stable sense IDs, source provenance, and detailed budget behavior: independent detail limits, fair sharing across senses, 0 disabling a detail class, and truncated fields being listed on each sense. This provides substantial behavioral transparency beyond a simple lookup message.

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, front-loads the core purpose, and uses every sentence productively. It covers return contents, language tag usage, limit semantics, and truncation behavior without fluff.

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?

Given no annotations, seven parameters, and an output schema, the description covers the core invocation needs: required word, language, limit, and detail budget behavior. The main remaining gap is the undocumented part_of_speech parameter and the lack of explicit sibling differentiation, but an agent can still invoke the tool correctly for standard lookups.

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 description coverage is 86%, so most parameters are already documented. The description adds valuable semantics by clarifying that limit is the number of senses and that detail limits are independent total budgets fairly shared across senses. It does not clarify the part_of_speech parameter's filtering semantics, so it stops short of a 5.

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 verb and resource: 'Look up distinct dictionary senses for a word.' It enumerates returned content such as glosses, examples, IPA, etymology, and translations, which clearly distinguishes it from siblings like dictionary_synonyms or dictionary_translate even without naming them.

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?

The intended use is implied by 'Look up distinct dictionary senses' and the return list, but the description never explicitly says when to choose this tool versus dictionary_synonyms, dictionary_translate, dictionary_relations, or other siblings. There is no when-not-to-use guidance or alternative routing.

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

dictionary_relationsA

Find one directed lexical or commonsense relation.

Supported relations include antonym, hypernym, hyponym, meronym, holonym, derivation, etymology, use, capability, location, and related. Each result states its direction and provenance. Direct results have relation_scope="direct" and distance=1. Hypernym and hyponym queries may also return distance-2 results explicitly labelled relation_scope="transitive", with both sourced edges in path. max_depth is the relation graph hop limit (v1 supports one or two), while transitive_limit allocates part of the total candidate limit. Set max_depth=1 or transitive_limit=0 for direct results only. Allocations must not exceed limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
wordYesUnicode query text; normalized with NFKC and casefold for lookup.
limitNoMaximum total result budget for this tool.
languageNoISO/BCP-47 language tag.en
relationYes
sense_idNo
max_depthNo
target_languageNo
transitive_limitNoMaximum candidates from this result class within limit.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full behavioral burden and does so thoroughly. It discloses relation_scope values, distance semantics, transitive behavior with sourced edges, provenance reporting, and the relationship between max_depth, transitive_limit, and limit. This gives the agent an accurate model of how the tool behaves.

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 dense but every sentence earns its place. It front-loads the core purpose, then explains direct vs transitive behavior, then defines the two non-obvious parameters. The structure is logical and avoids 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?

Given the tool's complexity—8 parameters, 11 relation enum values, and an output schema—the description provides enough detail to invoke it correctly. It covers the non-obvious relation scoping, distance behavior, and allocation rules, while return-value details are presumably handled by the output schema.

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 only 50%, so the description must compensate for undocumented parameters. It adds real meaning by explaining max_depth as a graph hop limit, transitive_limit as a candidate-class allocation, and the allocation constraint with limit. It does not add detail for sense_id, but the description's treatment of the trickiest parameters is strong.

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: 'Find one directed lexical or commonsense relation.' It enumerates the full supported relation set and clarifies that results include direction and provenance, making the tool's purpose concrete. This distinguishes it from sibling lookup tools like dictionary_lookup or dictionary_semantic_neighbors.

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?

The description gives clear within-tool usage context, especially around max_depth and transitive_limit: 'Set max_depth=1 or transitive_limit=0 for direct results only.' It does not explicitly name sibling tools or say when not to use this tool, but the supported relation list and direct/transitive distinction imply appropriate usage well enough.

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

dictionary_semantic_neighborsA

Find distributional semantic neighbours with an optional language filter.

This uses the installed memory-mapped Numberbatch ANN index. It returns an empty unavailable response when semantic artifacts are not installed. Omit target_language for global multilingual results, set it equal to source_language for monolingual results, or use another tag for cross-lingual results. Similarity is finite cosine similarity in the range -1 through 1.

ParametersJSON Schema
NameRequiredDescriptionDefault
wordYesUnicode query text; normalized with NFKC and casefold for lookup.
limitNoMaximum total result budget for this tool.
min_similarityNo
source_languageNoISO/BCP-47 language tag.en
target_languageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

With no annotations provided, the description carries the full behavioral disclosure burden and does so well. It reveals that the tool depends on an installed memory-mapped Numberbatch ANN index, returns an empty unavailable response when artifacts are missing, and returns finite cosine similarity in the range -1 through 1. These are genuinely useful operational details beyond minimal expectations.

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 well-structured: a purpose-led opening, a dependency note, parameter behavior, and output semantics. Each sentence earns its place without redundancy, and critical information is front-loaded.

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 that an output schema exists and the annotation set is empty, the description covers the key operational caveat (unavailable artifacts), the language-filter behavior, and the similarity semantics. The agent has enough context to invoke the tool correctly and interpret its behavior.

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 description adds meaningful parameter semantics beyond the schema, especially for target_language and min_similarity, by explaining global, monolingual, and cross-lingual modes and the similarity range. Some parameters like limit and source_language still rely mostly on schema descriptions, but the schema already covers their defaults and constraints reasonably well.

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 opens with a clear verb and resource: 'Find distributional semantic neighbours with an optional language filter.' This precisely identifies the tool's function and its distinguishing use of a Numberbatch ANN index. It does not explicitly contrast itself with siblings like dictionary_synonyms or dictionary_relations, so it falls just short of full differentiation.

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?

The description gives concrete usage guidance for the language filter: omit target_language for global multilingual results, set it equal to source_language for monolingual results, or use a different tag for cross-lingual results. This is clear and actionable, though it does not explicitly state when to choose this tool over sibling tools.

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

dictionary_synonymsA

Find synonyms grouped by sense and part of speech.

Pass a sense_id from dictionary_lookup when context matters. Candidates without a source sense are returned only as explicitly unsensed groups. max_senses controls how many lexical senses are inspected; unsensed_limit allocates part of the total candidate limit to all unsensed results. Set 0 for strictly sense-scoped candidates. Allocations must not exceed limit. count is the number of sense groups; candidate_count is the total number of nested synonym candidates governed by limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
wordYesUnicode query text; normalized with NFKC and casefold for lookup.
limitNoMaximum total result budget for this tool.
languageNoISO/BCP-47 language tag.en
sense_idNo
max_sensesNoMaximum source-native lexical senses to inspect.
part_of_speechNo
unsensed_limitNoMaximum candidates from this result class within limit.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so thoroughly. It explains how max_senses and unsensed_limit interact, that unsensed candidates are grouped separately, that allocations must not exceed limit, and what count and candidate_count represent.

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 purpose is front-loaded and every subsequent sentence contributes a distinct piece of behavior or result semantics. No filler or redundancy.

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 a 7-parameter tool with no annotations, the description covers the important parameter interactions and output counts, and the output schema can supply the remaining return-value details. Nothing essential for a correct call is missing.

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

Parameters5/5

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

The description adds meaning beyond the schema, especially for sense_id and part_of_speech that lack schema descriptions, and for unsensed_limit and max_senses with richer allocation semantics than the schema's short descriptions.

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 first sentence uses a precise verb and resource: 'Find synonyms grouped by sense and part of speech.' This clearly separates dictionary_synonyms from siblings like dictionary_relations, dictionary_translate, and rhymes, and the grouping detail adds specificity beyond the name.

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?

The description gives actionable context: pass a sense_id from dictionary_lookup when context matters, and unsensed results are only returned as explicit groups, with unsensed_limit=0 for strictly sense-scoped candidates. It does not explicitly compare against all sibling tools, but the context for how to invoke this tool is clear.

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

dictionary_translateA

Translate a word while preserving its source-sense association.

Use dictionary_lookup first for ambiguous words, then pass its sense_id. Results are grouped by source sense and never silently cross senses. max_senses bounds the source-native senses inspected independently of limit. limit is the total translation-candidate budget, fairly shared across matching sense groups. count reports groups and candidate_count reports nested translations.

ParametersJSON Schema
NameRequiredDescriptionDefault
wordYesUnicode query text; normalized with NFKC and casefold for lookup.
limitNoMaximum total result budget for this tool.
sense_idNo
max_sensesNoMaximum source-native lexical senses to inspect.
part_of_speechNo
source_languageYesISO/BCP-47 language tag.
target_languageYesISO/BCP-47 language tag.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure, and it does so well. It reveals that results are grouped by source sense, that senses are never silently crossed, that max_senses and limit operate independently, and that count and candidate_count report distinct nested result counts.

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: purpose first, usage guidance second, then parameter semantics. Every sentence adds information that is not obvious from the schema, with no filler or repetition.

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 a 7-parameter tool with no annotations and an output schema, the description covers the non-obvious behavior thoroughly: sense preservation, result grouping, budget semantics, and count meanings. The only omitted items, such as exact output shape, are already handled by the output schema, so nothing critical is missing.

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 71%, so the description does not need to re-explain every parameter. It adds meaningful semantics for the most confusing parameters: max_senses bounds inspected senses independently, limit is the shared translation-candidate budget, and sense_id comes from a prior dictionary_lookup call. This goes beyond the bare schema.

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 opens with a specific verb and resource: 'Translate a word while preserving its source-sense association.' This clearly differentiates it from sibling lookup, synonym, relation, and rhyme tools, and it names dictionary_lookup as the complementary tool for ambiguous words.

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 instructs the agent to 'Use dictionary_lookup first for ambiguous words, then pass its sense_id,' giving a concrete when-to-use alternative. It also explains how limit and max_senses should be set relative to one another, which guides parameter choices.

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

rhymesA

Find exact or near English rhymes.

Results are English CMUdict-backed headwords. near means exactly one ARPAbet-token insertion, deletion, or substitution. This fixed behavior has no automatic or configurable edit distance. The query itself is excluded from results.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoexact
textYesUnicode query text; normalized with NFKC and casefold for lookup.
limitNoMaximum total result budget for this tool.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden, and it delivers meaningful behavior: near means exactly one ARPAbet-token insertion, deletion, or substitution; there is no configurable edit distance; the query is excluded from results. This makes the tool's matching behavior predictable without overclaiming.

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?

Every sentence earns its place: the core purpose, data source, near-mode definition, fixity of edit-distance behavior, and query exclusion are all stated in five short sentences. There is no filler or redundancy.

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 is self-contained for a read-only lookup tool: it explains source, matching semantics, fixity of behavior, and exclusion of the query. The input schema already documents normalization and limit constraints, and an output schema exists, so return-value details are not required here.

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 schema covers text and limit but leaves mode undocumented. The description compensates by defining near precisely and clarifying exact versus near behavior. It also adds CMUdict context that helps interpret text as an English lookup term rather than a free-form phrase.

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 opens with a specific verb and resource: "Find exact or near English rhymes." It goes beyond a generic statement by specifying CMUdict-backed headwords, which clearly distinguishes rhymes from dictionary lookup, synonyms, and semantic-neighbor tools.

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?

The usage intent is implied clearly by the tool name and opening sentence, and the near-mode edit-distance definition gives useful decision context. However, it never explicitly states when to prefer this over sibling tools like dictionary_semantic_neighbors or wordplay, nor does it provide when-not-to-use guidance.

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

wordplayA

Find corpus-backed wordplay candidates of one requested kind.

kind selects exactly one relation: anagram (eligible English headwords with the same normalized letters), palindrome (stored corpus palindromes; the query's own status is reported as input_is_palindrome), spoonerism (exactly two whitespace-separated English headwords whose initial consonant clusters are exchanged), or pun (exact CMUdict homophones whose source-native senses differ, returned as labelled candidates, never jokes). context is only accepted for pun; without it pun results are labelled context_scope="uncontextualized". Every result carries provenance.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYes
textYesUnicode query text; normalized with NFKC and casefold for lookup.
limitNoMaximum total result budget for this tool.
contextNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so thoroughly: it explains corpus backing, exact matching criteria, the context-only-for-pun rule, the contextualized/uncontextualized labeling, the 'never jokes' boundary, and provenance on every result. This is far beyond minimal disclosure.

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 dense but every sentence adds necessary information, and the main purpose is front-loaded. The structured enumeration of kinds keeps complex detail readable without wasted words.

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 a tool with 4 parameters, 2 required, and a rich output schema, the description provides all needed invocation context: required parameters, supported kinds, per-kind constraints, context handling, and provenance behavior. Nothing essential is missing for correct use.

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

Parameters5/5

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

The description gives each enum value a precise operational meaning (anagram normalization, palindrome storage status, spoonerism structure, CMUdict homophone puns) and explains the context parameter's special behavior. This substantially compensates for the schema's incomplete parameter descriptions.

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 first sentence names a specific verb and resource: 'Find corpus-backed wordplay candidates of one requested kind.' The description then enumerates four distinct relation types, which clearly differentiates this tool from dictionary/rhyme siblings.

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?

The description makes it clear when this tool is appropriate by tying each wordplay relation to a specific kind value. It does not explicitly name alternatives or state when not to use the tool, but the context is unambiguous enough for an agent to choose correctly.

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. Dates show when Glama detected each change.

  1. 7 tool updatesv2.0.0
    • First observeddictionary_lookup
    • First observeddictionary_relations
    • First observeddictionary_semantic_neighbors
    • First observeddictionary_synonyms
    • First observeddictionary_translate
    • First observedrhymes
    • First observedwordplay

TDQS

A4.6/5.0
Disambiguation5/5

Each tool targets a clearly distinct lexical function: definitions, synonyms, translation, relations, semantic neighbors, rhymes, and wordplay. Even the potentially overlapping tools (synonyms vs. semantic neighbors) are distinguished by methodology and output structure.

Naming Consistency4/5

Five tools consistently use the dictionary_ prefix, while rhymes and wordplay break the pattern. The naming style is otherwise uniform lowercase snake_case and mostly readable, but the two standalone names are a minor convention deviation.

Tool Count5/5

Seven tools is well-scoped for a lexical lookup server, covering core dictionary functions plus specialized language-adjacent features without bloat. Each tool has a distinct role and the set feels intentionally curated.

Completeness5/5

The surface covers the primary lexical workflows: lookup, synonyms, translation, relations, semantic similarity, rhymes, and wordplay. It also includes provenance, sense IDs, and language controls so agents can chain lookups effectively with no obvious dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Local-first RAG indexing and semantic search MCP server. Enables document retrieval and context-aware queries using local embedding models.
    3
    16
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Local-first MCP server for safely searching, reading, summarizing, tagging, deduplicating, and organizing local files with scoped access, read-only defaults, and dry-run plans.
    16
    MIT
  • A
    license
    C
    quality
    A
    maintenance
    A full-featured secure MCP server for local file system operations, with built-in image processing, OCR and media tools. Fully compliant with the official Model Context Protocol specification, offering standardized request/response schemas, large-file streaming I/O, multi-transport remote deployment, and comprehensive text search & replace functionality for LLM agent integration.
    22
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Offline-first MCP server for web search and content fetching. It requires no external API keys and uses local models for intent classification, optional cross-lingual search, semantic re-ranking, and direct-answer extraction.
    ISC

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/DilanRG/lexicon-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server