Unified Model Context Protocol server for the SciTeX scientific computing ecosystem, aggregating tools from 40+ peer packages covering introspection, notifications, browser automation, code capture, documentation search, and data analysis utilities.
SciTeX Umbrella MCP Server demonstrates solid definition quality with strong coverage of tool names, descriptions, and parameter schemas. All 27 tools are explicitly registered with clear verb-prefixed names (introspect_*, notification_*, browser_*, docs_*, skills_*, usage_*). Descriptions are comprehensive (averaging ~150-250 chars), exceeding the 10-1024 baseline and providing WHEN-to-use context. Input schemas are consistently present with typed parameters and descriptions. However, output schemas are not documented, the source shows parameter inputs but no explicit return type definitions. Error handling is weak across all tools; no guidance on recovery strategies or categorization of error types. Parameter validation constraints (enums, min/max) are mostly absent despite many parameters accepting a fixed set of values (e.g., notification.level: 'info|warning|error|critical', docs.format: 'None|json|html'). The server correctly avoids exposing secrets as parameters.
Render any URL to a print-style PDF via headless Chromium — full-page, JS-rendered, with configurable paper size + margins + background graphics. Drop-in replacement for Chrome's "Print -> Save as PDF" dialog, `wkhtmltopdf`, `weasyprint`, and `playwright.page.pdf()` boilerplate. Use when the user asks to "save this page as PDF", "archive this article", "generate a PDF from the dashboard", "download the rendered HTML report", or is capturing a JS-heavy page that static scrapers miss. `wait_seconds` gives JS time to finish rendering.
Take a JPEG screenshot of a chosen target — a specific monitor (`monitor_id=N`), every monitor at once (`all=True`), a live browser tab (`url=...`), or an X11 application window (`app='emacs'`). Drop-in replacement for `scrot`, `gnome-screenshot`, `maim`, `mss.mss().shot()`, and ad-hoc `playwright.screenshot()`. Use when the user asks to "take a screenshot", "capture my screen", "grab a picture of the browser", "screenshot that app window", "prove visually this is fixed", or is attaching UI evidence to a bug report / review. `return_base64=True` inlines instead of saving.
Trigger `sphinx-build` on one or every installed SciTeX package, producing HTML/JSON under each package's `_docs/_build/`. Use when the user asks to "rebuild docs", "regenerate Sphinx HTML", or after editing docstrings / `.rst` source.
Fetch a SciTeX package's bundled Sphinx docs — manifest (default), parsed JSON body, or a path to the built HTML. Use when the user asks "show scitex-writer docs", "open the manual for X", "get the Sphinx output for Y".
Output schemas not documented. Tools show input parameter schemas but no explicit return type definitions in visible source. LLMs cannot plan downstream tool calls or extract the correct fields without knowing return structure.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 69 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Enumerate every installed SciTeX package that ships bundled Sphinx docs — each entry includes version, manifest path, and docs URL. Use when the user asks "what SciTeX packages are installed?", "which ones have docs?", or before calling `docs_get` / `docs_search`.
Full-text search across every installed SciTeX package's docs / Python API / CLI reference / MCP tool registry — one Google-like query, cross-scope ranked results. Use whenever the user asks to "search the ecosystem for X", "find anything about figures / stats / writing", "which module does Y?". Use `scope='api'|'cli'|'mcp'|'docs'` to narrow; `+required` / `-excluded` operators supported.
Recursively walk a package / module tree and return the full API as indented text. Use whenever the user asks "show me the whole API of scitex.stats", "map the package layout", "what does this expose?".
Build a call graph rooted at a function — which other functions it calls, recursively to `max_depth`, with a wall-clock timeout. Use when the user asks "what does this call?", "show the call graph for X", "trace how function Y reaches Z".
Return a class's inheritance tree — full MRO + known subclasses. Use when the user asks "what does X inherit from?", "show subclass tree of Y", "why does isinstance(Z) match?".
Resolve the transitive dependency graph of a module. Use when the user asks "what depends on X?", "show me the transitive deps", "is this module pulling in pandas?".
List attribute names of a module / class / instance with visibility + kind filter — `dir()` on steroids. Use whenever the user asks "what's in scitex.plt?", "list methods of this class", "show public API of module X".
Return the docstring of any dotted-path object — raw, parsed into sections, or one-line summary. Use whenever the user asks "what does this function do?", "show docstring for X", "summarize this API".
Grep the repo's `tests/` and `examples/` for actual call sites of an object — real usage, not just docstring examples. Use when the user asks "how do I use this function?", "show me real examples of X".
Return a module's `__all__` list — the officially-exposed public API names. Use when the user asks "what's exported from scitex.stats?", "list the public API".
AST-parse a module's source and list every import it uses — optionally grouped as stdlib / third-party / local. Use when the user asks "what does X import?", "categorize this module's dependencies".
Return a function/class signature (parameters, types, defaults) by dotted import path — IPython `?` for any installed Python object. Use whenever the user asks "what's the signature of X?", "how do I call scitex.io.save?", "what args does this take?".
Return the source code of a Python object by dotted import path — IPython `??`. Use whenever the user asks "show me the source of X", "what does scitex.io.save actually do?", "read that function".
Resolve every type hint on a function/class — including forward refs, generics, Union / Optional / Literal / Annotated extras. Use when the user asks "what type is this param?", "show type hints for X", "does this accept None?".
Enumerate every registered notification backend with reachability status — deps installed, env vars set, credentials valid. Use when the user asks "which notifiers are set up?", "why isn't my Twilio alert working?", "is email configured?".
Place an actual Twilio phone call to the user that reads `message` via TTS — bypasses DND/Focus when iOS Emergency Bypass / Repeated Calls is configured (`repeat=2`). Use whenever the user asks to "call my phone", "wake me up when this fails", "escalate to a phone call on critical errors", "page me if the server dies".
Dump the active notification config — fallback order, per-level backend mapping, per-backend timeouts, credentials (secrets redacted). Use when the user asks "show my notification config", "what's my fallback order?", "which backends fire for critical?".
Send an alert through any of 9 backends — audio (TTS), desktop popup, emacs minibuffer, matplotlib banner, playwright browser toast, email (SMTP), webhook (HTTP POST), Telegram, Twilio phone/SMS — with automatic fallback. Use whenever the user asks to "notify me", "alert me when this finishes", "beep when done", "email me the result", "ping me on Telegram".
Send an SMS to the user via Twilio — text-only alternative to `notification_call`. Use whenever the user asks to "text me", "SMS me the build result", "send a text when done".
Read the markdown content of a specific SciTeX skill page (main `SKILL.md` or a named reference leaf). Use when the user asks "show me the scitex-stats skill", "get the figrecipe plot-types reference", "read the skill for X".
Enumerate every `SKILL.md` + sub-skill reference page the installed SciTeX ecosystem ships. Use when the user asks "what SciTeX skills do I have?", "list skill pages for scitex-stats", or is orienting before `skills_get`.
List every topic `usage_show` can serve (`plt`, `stats`, `session`, `io`, `scholar`, `audio`, `writer`, ...). Use when the user asks "what examples are available?", "which modules have usage snippets?".
Return a runnable code example for a SciTeX topic (`plt`, `stats`, `session`, `io`, `scholar`, ...) — short, copy-pasteable snippets showing idiomatic usage. Use when the user asks "how do I use scitex.plt?", "show me a t-test example", "give me a session boilerplate".
Enum constraints missing for parameters with fixed value sets. Examples: notification_send.level should declare enum ['info','warning','error','critical']; docs_get.format should declare enum [None,'json','html']; introspect_docstring.format should declare enum ['raw','parsed','summary']; introspect_dir.filter and .kind lack explicit enum lists. This forces LLMs to guess valid values rather than selecting from a machine-readable constraint.
Error handling and recovery guidance absent. No tool description mentions what to do on failure, whether errors are retryable, or what the LLM should try next. Critical for tools like notification_send (which has 9 backends and automatic fallback) and browser_save_as_pdf (which depends on headless Chromium availability). See pattern:recovery-guide.
Missing numeric constraints (min/max) for bounded parameters. Examples: introspect_call_graph.timeout_seconds and max_depth, introspect_api.max_depth, introspect_examples.max_results, introspect_class_hierarchy.max_depth, capture_screenshot.quality, browser_save_as_pdf.wait_seconds. Without explicit bounds, LLMs may pass unreasonable values (negative timeouts, quality >100, massive recursion depths).
Ambiguous or missing parameter descriptions for key fields. Examples: introspect_dir.filter description says 'Visibility filter: public, private, dunder, etc.' but does not specify exact allowed values; introspect_dir.kind says 'Kind filter (method, property, class, function, etc.)' without listing all valid kinds; browser_save_as_pdf.margin description lacks clarification on units (mm vs in vs other).
Missing chaining IDs in response context. Several tools (docs_search, docs_get, skills_get, usage_show) likely return content references but do not document whether subsequent tool calls (e.g., docs_build after docs_get) have the necessary IDs for composition. This forces agents to reason about manual ID extraction.
Pagination not explicitly supported for list tools. Tools like introspect_api (recursive walk), introspect_examples (grep), introspect_imports, docs_search, and skills_list may return large result sets but descriptions do not mention limit/offset/cursor handling or document result cardinality limits. Without pagination, large responses risk context window exhaustion.
Irreversible operations (docs_build, browser_save_as_pdf, capture_screenshot, notification_call, notification_sms) lack confirmation/dry-run patterns. Agents could accidentally rebuild entire documentation, send unwanted SMS/calls, or capture sensitive screens without explicit confirmation. No mention of dry_run, require_confirmation, or preview steps.