Multi-plugin MCP server providing resource discovery, lazy loading, and integration with Context-Fabric, SEDRA IV Syriac lexicon, Sefaria, and Perseus
Agora MCP provides 7 tools with complete input schemas and descriptions. Naming follows verb_noun conventions (list_, describe_, prepare_, load_, lookup_, get_). Descriptions are substantive (100-400 chars), explaining WHAT each tool does and WHEN to use it. However, output schemas are not documented in the visible code, LLMs cannot predict return structure. Error handling is minimal; no recovery guidance or actionable error messages visible. Parameters lack enums where appropriate (e.g., source_mode accepts free-form strings instead of constrained values). Tool composition is sound: prepare_corpus and load_corpus are distinct, with clear dependencies. Security: no credentials exposed as parameters. Overall: solid foundation with gaps in output documentation and error guidance.
Describe one available Agora corpus, collection, or feature module.
Retrieve a SEDRA IV lexeme by numeric ID. Returns the upstream lexeme record, including Syriac form, root, category, glosses, etymological information, and linked word forms where supplied by SEDRA.
List Agora's directly loadable Context-Fabric corpora and collections. By default feature modules are excluded so every returned item can be passed to prepare_corpus/load_corpus. Use kind='feature-module' to discover optional modules explicitly. Parent corpus descriptions expose modules compatible with the default selected version and all registered modules with their compatible parent versions.
Discover separately loadable corpora inside one collection snapshot. The response contains the immutable `source_revision` used for discovery. Pass it back for later pages and then to prepare_corpus/load_corpus to keep the workflow on the same upstream collection revision. `source_mode` may be `prefer-fresh`, `offline`, or `require-fresh`. Omit it for the default prefer-fresh behavior. `offline` performs no network acquisition and requires the relevant revision/index to be resident. `require-fresh` refuses cached fallback.
Acquire and load a corpus; its final cache path is leased until unload. Long loads report coarse MCP progress notifications and yield the event loop. The returned lease path is protected from eviction until unload_corpus is called. Load failures do not consume a lease; unload_corpus is not required after a failed load.
Output schemas not documented. LLMs cannot predict return structure or plan downstream tool calls. prepare_corpus and load_corpus return complex objects (load_preflight, lease path, etc.) but no schema is visible in code.
source_mode parameter accepts free-form strings ('prefer-fresh', 'offline', 'require-fresh') but is not declared as an enum. LLMs may hallucinate invalid values.
No error handling guidance visible. Tools do not document what errors are retryable, user-fixable, or fatal. No recovery suggestions (e.g., 'Try offline mode if network fails').
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | <=2025-11-25 | v2 |
Look up a Syriac word in SEDRA IV. `query` may be a SEDRA word ID or Syriac Unicode in consonantal, partially vocalized, or fully vocalized form. SEDRA reports the candidate word forms and their grammatical/lexical metadata.
Acquire/cache a corpus version and optional registered feature modules. Long preparation yields the MCP event loop and reports coarse stages when the client requests progress: `resolving`, `acquiring/materializing`, and `ready`. Acquisition/materialization has an independent bounded wall-clock deadline; cancellation waits for Agora-owned Git/materialization work to stop rather than abandoning a mutating worker thread. For collection members, pass the `source_revision` returned by list_collection_members to resolve the member at exactly that upstream commit. `source_mode='offline'` guarantees no acquisition network path and succeeds only when the exact source snapshots/index are resident. `source_mode='require-fresh'` requires a successful remote refresh and is incompatible with an explicit immutable `source_revision`. When modules are selected, the response includes `load_preflight` for the exact derived overlay: warm/cold state, whether a full compile is currently required, direct source bytes, default compile byte/time guardrails, host free-space reserve, ordered module precedence, and the parent's historical load-cost reference when one exists. Module order is `ordered-last-wins`: if two modules expose the same feature filename, the later module wins, so reversing module order can intentionally produce a different overlay. A new cold overlay can require a parent-scale compile even when the module files themselves are small. Treat warm/cold state as a point-in-time preflight observation; load_corpus rechecks it under the exact-object compile lock. Prepared paths are cache-resident but evictable after this call returns; use load_corpus when a corpus must stay protected for active use.
prepare_corpus and load_corpus accept 'ctx' parameter (MCP context) for progress reporting, but this is an implementation detail leaking into the tool interface. Tool parameters should not expose framework objects.
Pagination in list_collection_members uses offset/limit but does not document total count or next_cursor in return. LLMs cannot determine if more results exist without calling again.