fastmcp-autodoc: add prompts + resources + templates#21
Merged
Conversation
1fc1f01 to
b69aec2
Compare
This comment has been minimized.
This comment has been minimized.
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #21 +/- ##
==========================================
- Coverage 90.31% 89.89% -0.42%
==========================================
Files 147 148 +1
Lines 12605 13134 +529
==========================================
+ Hits 11384 11807 +423
- Misses 1221 1327 +106 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
6d62fd6 to
267a9e2
Compare
This comment has been minimized.
This comment has been minimized.
tony
added a commit
that referenced
this pull request
Apr 19, 2026
why: Document the user-visible effects of the seven preceding commits so the unreleased changelog reflects the final shape of the PR's surface. what: - Six bullets under Bug fixes covering: typed std-domain accessor + display-name fix, unconditional register-all hook, narrowed ImportError catch, tilde role shortener, bracket-aware Raises split, and scoped empty-rubric suppression
1ac5d44 to
75e15b3
Compare
tony
added a commit
that referenced
this pull request
Apr 19, 2026
why: Document the user-visible effects of the seven preceding fixups so the unreleased changelog reflects the final shape of the PR's surface area. what: - Six bullets under Bug fixes covering: typed std-domain accessor + display-name fix, unconditional register-all hook, narrowed ImportError catch, tilde role shortener, bracket-aware Raises split, and scoped empty-rubric suppression.
tony
added a commit
that referenced
this pull request
Apr 19, 2026
why: PR #21 added {fastmcp-prompt}, {fastmcp-prompt-input}, {fastmcp-resource}, and {fastmcp-resource-template} but had zero end-to-end coverage; the Weave review flagged this as Critical. Lock in the rendered shape so future refactors can't silently regress section IDs, sibling adoption, MIME pills, or {ref} resolution. what: - Add tests/ext/fastmcp/test_directives_integration.py — one module-scoped SharedSphinxResult fixture builds a synthetic doc with all four directives against an injected FastMCP-shaped fake server (no real fastmcp dependency). - Five @pytest.mark.integration tests assert: canonical fastmcp-{kind}-{name} section IDs, MIME pill class on resource cards, prompt argument table contents, parameter table inside the resource-template card section (sibling adoption), and {ref} cross-references resolve with zero "undefined label" warnings.
75e15b3 to
f26270e
Compare
MCP prompts and resources now get the same autodoc surface tools do. Four
directives, rendered through the shared ``build_api_card_entry``
pipeline:
- ``{fastmcp-prompt}`` — name + description card with a ``prompt`` type badge
and any tag pills.
- ``{fastmcp-prompt-input}`` — arguments table (name / type / required /
description), type enriched from the Python signature.
- ``{fastmcp-resource}`` — URI + description + ``resource`` badge + MIME pill +
facts row. For fixed-URI resources.
- ``{fastmcp-resource-template}`` — same shape but with the URI template as the
signature and a parameters table derived from the JSON schema (path and query
parameters).
Collector-wise, a new ``fastmcp_server_module`` config value
(``"pkg.server: mcp"``) points at a live FastMCP instance. The collector reads
``local_provider._components`` directly (the async ``_list_*`` helpers are
trivial filters over that dict, so we avoid standing up an event loop at Sphinx
build time). If the server instance has zero components registered, we attempt
the conventional ``register_all()`` / ``_register_all()`` hook on the same
module — so docs can enumerate the same surface as a running server even when
registration is gated behind ``run_server()``.
The collector strips FastMCP's auto-appended ``"Provide as a JSON string
matching the following schema: {...}"`` from prompt argument descriptions; it's
noise in human docs, useful only to LLM consumers. First-paragraph trimming on
the description field keeps the ``Parameters`` and ``Returns`` sections of
NumPy-style docstrings out of the signature card — they're rendered separately
in the arguments table instead.
The directives emit cards inline (no enclosing section), so the surrounding
``##`` markdown heading stays the source of truth for anchors and ToC ordering.
That's a different choice than the tool directive made (tools create
hidden-title inner sections because there's no outer ``##`` heading above them
on the canonical tools pages), but it matches how prompts and resources are
typically presented — one readable heading per recipe, with the card slotted
beneath.
Info dataclasses intentionally don't retain the underlying function. FastMCP
resources register closure-local functions via ``@mcp.resource`` inside a
``register()`` closure; those are not picklable into Sphinx's environment cache.
We extract ``docstring``, argument types, and everything else eagerly at collect
time and store only strings.
Prompts and resources now match the tool directive's DX:
- FastMCPPromptDirective creates nodes.section() with section_id (prompt.name
with underscores → hyphens), registers it via note_explicit_target, and passes
an api_permalink to the card entry. Callers no longer need outer ## headings —
the hidden title populates the TOC sidebar and {ref} cross-refs resolve
correctly.
- _build_resource_card() gains optional section_id / document params; when set
it wraps the card in a nodes.section() with the same anchor+permalink pattern.
FastMCPResourceDirective and FastMCPResourceTemplateDirective pass
section_id=name.replace("_","-").
- sphinx_autodoc_fastmcp.css: add :root variables and selector rules for
type-prompt (violet), type-resource (emerald), type-resource-template (cyan),
mime (gray), and tag (gray) badges, with light and dark mode variants matching
the existing safety/tool-type pattern. TOC hide rule extended to cover all
four type badges.
collect_tool_section_content previously only ran for sections with _CSS.TOOL_SECTION. Prompt and resource card sections were never adopted, so prose between directives (Use when, Why use this, sample renders, argument tables) floated outside the card container rather than being folded in. Add _CARD_SECTION_CLASSES frozenset covering TOOL_SECTION, PROMPT_SECTION, and RESOURCE_SECTION. The existing transform logic and _tool_content_container helper are generic enough to handle all three — the section structure is identical (api_component entry > content chain).
Mirrors the existing dl.gp-sphinx-api-container hide/show pattern for card shells (tool, prompt, resource). Previously the ¶ link was always visible; now it appears only on header hover or :focus-visible.
why: fastmcp is an intentional optional runtime dependency not declared in project deps; mypy reported import-not-found for fastmcp.prompts.base, fastmcp.resources.base, and fastmcp.resources.template with no way to suppress them. what: - Add [[tool.mypy.overrides]] for ["fastmcp", "fastmcp.*"] with ignore_missing_imports = true in pyproject.toml
why: The # type: ignore[assignment] on the except-branch null assignment was unused — mypy never generated an assignment error there because the imported names were unbound in the except path. what: - Remove # type: ignore[assignment] from _collector.py line 486
… import why: _first_paragraph() duplicated first_paragraph() already in _parsing.py (identical split/strip/replace logic, no new behaviour); _parsing is already imported in this module. what: - Add first_paragraph to the _parsing import line - Delete private _first_paragraph() function - Replace all three call-sites with first_paragraph()
why: CLAUDE.md requires working doctests on all functions; _strip_schema_note and _template_params_from_schema were missing them. Also converts _strip_schema_note to r\""" to satisfy ruff D301 (backslash in docstring). what: - Add Examples section with two assertions to _strip_schema_note; convert docstring to r\""" and adjust \\n -> \n accordingly - Add Examples section with three assertions to _template_params_from_schema covering None, empty dict, and a minimal properties schema
why: Two bugs caused broken API docs in libtmux: 1. Notes sections
containing only `.. todo: :` showed an empty rubric (todo
renders as invisible HTML without todo_include_todos=True).
2. Raises sections using : exc:`ExcType` role syntax produced malformed RST
like ':raises :exc:`exc.Foo`:' instead of a valid field list entry.
what:
- Add _ROLE_RE and _TODO_DIRECTIVE_RE compiled regex constants
- Add _strip_roles() to strip RST inline role markup from exception type names
- Add _filter_invisible_directives() to remove .. todo:: blocks and their
indented body from generic section content
- Fix _fmt_raises() to strip roles from type_ and split comma-separated
exception names into individual :raises ExcType: entries
- Fix _fmt_generic() to apply directive filtering and return [] (not [header,
""]) when filtered content is empty
- Add test fixtures for exc-role raises, comma-separated raises, empty Notes,
and Notes-only-todo cases
…bels
- Register tool/prompt/resource section labels in std domain at parse time
(directive run()) so {ref} resolves them on incremental builds where
doctree-read hooks never fire
- Remove emoji icons from prompt and resource type badges; type text is
self-sufficient (mirrors the existing tool badge pattern)
- Restore resource-template as a distinct badge (sky blue #0369a1) alongside
resource (steel blue #1e40af) and prompt (violet #5b21b6)
- Refactor CSS to use CSS variables for all type badges; dark mode only
overrides variables — selectors are written once
- Ghost outline MIME/tag pills (transparent bg, muted border)
- prompt/resource/resource-template keep light-mode colors in dark mode
…on DOM swap Public hook so third-party widgets that bind to swapped DOM can re-initialise after SPA navigation without a full page reload. Fires after the built-in reinit (copybutton, scroll-spy, theme toggle) has run. Payload: event.detail.url = the new page URL. Event contract documented in packages/sphinx-gp-theme/README.md under a new "JavaScript events" section (table + minimal listener pattern) and in CHANGES under the unreleased Features block.
why: AGENTS.md mandates env.domains.standard_domain over env.get_domain("std").
The same package's _transforms.py already uses the typed accessor, so removing
the three # type: ignore[attr-defined] is mechanical. While here, fold the
round-trip section_id.replace("-", "_") display-name derivation back to the
original resource name, hoist the mid-file "import typing as t" to the top, and
drop function-local re-imports of names already imported at module top.
what:
- Annotate _register_section_label env parameter as BuildEnvironment; use
env.domains.standard_domain (drops three # type: ignore[attr-defined])
- Thread display_name kwarg through _build_resource_card; resource/template
directives now pass res.name / tpl.name verbatim
- Hoist "import typing as t" to top-of-file imports; drop the # noqa: E402
placement
- Remove function-local re-imports of first_paragraph, parse_rst_inline,
make_para, make_table, build_annotation_display_paragraph (already imported at
top)
why: Three small correctness gaps in the Raises/Notes pipeline. (1) Sphinx
convention is that a leading ~ in a role target shows only the
last component (`: exc:`~mod.Foo`` -> `Foo`); _strip_roles preserved the tilde
verbatim, leaking it into rendered :raises: directives. (2) `type_.split(",")`
was naive and would mangle parameterised generics like `Dict[str, X]`. (3) The
earlier "drop empty Notes rubric" change incidentally suppressed Examples /
References / generic stub sections that intentionally render an empty rubric —
broader than the commit intent. The misnamed `_filter_invisible_directives` only
handled `..
todo: :`, so rename to reflect actual scope.
what:
- Add `_shorten_role_target` mirroring
sphinx.domains.python.PyXRefRole.process_link; wire into _strip_roles via a
sub() callback (drops leading ~ and keeps last dotted segment)
- Add `_split_top_level(s, sep)` bracket-depth-aware splitter; use in
`_fmt_raises` so `Dict[str, X]` survives intact
- Rename `_filter_invisible_directives` -> `_filter_todo_directives`
(single-directive scope reflected in name + docstring)
- Add `suppress_empty: bool = False` on `_fmt_generic`; only `Notes` passes
True. Examples / References / generic admonitions regain their rubric for stub
bodies
- Tests: new RaisesSectionFixture cases (tilde role, bracketed generic);
refactor empty-rubric tests into a single GenericSectionEmptyFixture
NamedTuple covering Notes (suppressed) and Examples / References (kept)
why: A FastMCP server may register some components at module-import time (decorators) while leaving others to an explicit register_all() / _register_all(). The previous `if not components` gate skipped the hook whenever any component was already present, silently dropping the deferred ones from autodoc. what: - _resolve_server_instance: drop the empty-components gate; invoke the first matching hook (`register_all` or `_register_all`) whenever the resolved object exposes `local_provider` - Update inline comment to document the unconditional invocation - Add two regression tests: hook fires when components are pre-populated; hook is skipped when no `local_provider` attribute exists
…ail-trim
why: The chain `text[:idx].rstrip().rstrip("\n").strip()` was redundant — the
leading rstrip() already removes trailing newlines, and the final strip() then
re-stripped both ends. The intent is parity with the no-marker branch's
`text.strip()`.
what:
- Replace the redundant chain with `text[:idx].strip()`
- Add a doctest case proving leading whitespace is stripped (parity with the
marker-not-found branch)
why: A bare `except Exception` around the local fastmcp.* imports would silently swallow real bugs (e.g. a SyntaxError in a fastmcp submodule, or runtime errors in user code triggered during import). Sphinx's own optional-dependency pattern (sphinx/util/images.py) catches ImportError specifically. what: - Narrow `except Exception` to `except ImportError` for the fastmcp.prompts / resources / template imports inside collect_prompts_and_resources
why: Document the user-visible effects of the seven preceding fixups so the unreleased changelog reflects the final shape of the PR's surface area. what: - Six bullets under Bug fixes covering: typed std-domain accessor + display-name fix, unconditional register-all hook, narrowed ImportError catch, tilde role shortener, bracket-aware Raises split, and scoped empty-rubric suppression.
why: PR #21 added {fastmcp-prompt}, {fastmcp-prompt-input}, {fastmcp-resource}, and {fastmcp-resource-template} but had zero end-to-end coverage; the Weave review flagged this as Critical. Lock in the rendered shape so future refactors can't silently regress section IDs, sibling adoption, MIME pills, or {ref} resolution. what: - Add tests/ext/fastmcp/test_directives_integration.py — one module-scoped SharedSphinxResult fixture builds a synthetic doc with all four directives against an injected FastMCP-shaped fake server (no real fastmcp dependency). - Five @pytest.mark.integration tests assert: canonical fastmcp-{kind}-{name} section IDs, MIME pill class on resource cards, prompt argument table contents, parameter table inside the resource-template card section (sibling adoption), and {ref} cross-references resolve with zero "undefined label" warnings.
f26270e to
8834a5f
Compare
tony
added a commit
that referenced
this pull request
Apr 19, 2026
why: Cut alpha 9 covering the FastMCP prompts/resources autodoc surface and the companion typehints / theme / layout fixes merged in PR #21. what: - Bump every workspace package (gp-sphinx, sphinx-gp-theme, sphinx-fonts, sphinx-autodoc-typehints-gp, sphinx-autodoc-argparse, sphinx-autodoc-api-style, sphinx-autodoc-docutils, sphinx-autodoc-fastmcp, sphinx-autodoc-pytest-fixtures, sphinx-autodoc-sphinx, sphinx-ux-autodoc-layout, sphinx-ux-badges) and the workspace root from 0.0.1a8 to 0.0.1a9 - Refresh lockstep refs in gp-sphinx dependencies and uv.lock - Update smoke-test version literal in scripts/ci/package_tools.py - Update lockstep assertions in tests/ci/test_package_tools.py Notable changes since 0.0.1a8 (#21): - sphinx-autodoc-fastmcp: autodoc MCP prompts and resources end-to-end via four new directives ({fastmcp-prompt}, {fastmcp-prompt-input}, {fastmcp-resource}, {fastmcp-resource-template}); new fastmcp_server_module config points the collector at a live FastMCP instance; URI-keyed env storage with name-index fallback for friendly directive lookup - sphinx-autodoc-fastmcp: kind-prefixed canonical section IDs (fastmcp-{kind}-{name}) prevent tool/prompt/resource collisions in std.labels; tools keep the bare slug as a back-compat alias - sphinx-autodoc-fastmcp: register-all hook safely re-invocable under FastMCP's default on_duplicate="error" via a temporary context manager; hook failure is fail-closed - sphinx-autodoc-typehints-gp: Raises types strip the leading ~ shortener (matching Sphinx PyXRefRole.process_link); comma split is bracket-depth aware so Dict[str, X] survives intact; empty Notes drops its rubric while Examples / References / generic stub sections keep theirs - sphinx-gp-theme: dispatches gp-sphinx:navigated CustomEvent on document after every SPA-nav DOM swap so third-party widgets can re-initialise without a full page reload - sphinx-ux-autodoc-layout: card-shell permalink hidden by default, revealed on hover or focus-visible
tony
added a commit
to tmux-python/libtmux
that referenced
this pull request
Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the companion typehints / theme / layout fixes shipped in gp-sphinx PR #21 (git-pull/gp-sphinx#21). what: - Bump every gp-sphinx workspace pin (gp-sphinx, sphinx-autodoc-api-style, sphinx-autodoc-pytest-fixtures) from 0.0.1a8 to 0.0.1a9 in pyproject.toml - uv.lock refreshed to match
tony
added a commit
to git-pull/gp-libs
that referenced
this pull request
Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the companion typehints / theme / layout fixes shipped in gp-sphinx PR #21 (git-pull/gp-sphinx#21). what: - Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in pyproject.toml - uv.lock refreshed to match
tony
added a commit
to vcs-python/g
that referenced
this pull request
Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the companion typehints / theme / layout fixes shipped in gp-sphinx PR #21 (git-pull/gp-sphinx#21). what: - Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in pyproject.toml - uv.lock refreshed to match
tony
added a commit
to vcs-python/libvcs
that referenced
this pull request
Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the companion typehints / theme / layout fixes shipped in gp-sphinx PR #21 (git-pull/gp-sphinx#21). what: - Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in pyproject.toml - uv.lock refreshed to match
tony
added a commit
to vcs-python/vcspull
that referenced
this pull request
Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the companion typehints / theme / layout fixes shipped in gp-sphinx PR #21 (git-pull/gp-sphinx#21). what: - Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in pyproject.toml - uv.lock refreshed to match
tony
added a commit
to tmux-python/libtmux-mcp
that referenced
this pull request
Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the companion typehints / theme / layout fixes shipped in gp-sphinx PR #21 (git-pull/gp-sphinx#21). what: - Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in pyproject.toml - uv.lock refreshed to match
tony
added a commit
to tmux-python/tmuxp
that referenced
this pull request
Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the companion typehints / theme / layout fixes shipped in gp-sphinx PR #21 (git-pull/gp-sphinx#21). what: - Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in pyproject.toml - uv.lock refreshed to match
tony
added a commit
to tony/django-docutils
that referenced
this pull request
Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the companion typehints / theme / layout fixes shipped in gp-sphinx PR #21 (git-pull/gp-sphinx#21). what: - Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in pyproject.toml - uv.lock refreshed to match
tony
added a commit
to tony/django-slugify-processor
that referenced
this pull request
Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the companion typehints / theme / layout fixes shipped in gp-sphinx PR #21 (git-pull/gp-sphinx#21). what: - Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in pyproject.toml - uv.lock refreshed to match
tony
added a commit
to cihai/cihai
that referenced
this pull request
Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the companion typehints / theme / layout fixes shipped in gp-sphinx PR #21 (git-pull/gp-sphinx#21). what: - Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in pyproject.toml - uv.lock refreshed to match
tony
added a commit
to cihai/cihai-cli
that referenced
this pull request
Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the companion typehints / theme / layout fixes shipped in gp-sphinx PR #21 (git-pull/gp-sphinx#21). what: - Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in pyproject.toml - uv.lock refreshed to match
tony
added a commit
to cihai/unihan-db
that referenced
this pull request
Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the companion typehints / theme / layout fixes shipped in gp-sphinx PR #21 (git-pull/gp-sphinx#21). what: - Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in pyproject.toml - uv.lock refreshed to match
tony
added a commit
to cihai/unihan-etl
that referenced
this pull request
Apr 19, 2026
why: Pick up the FastMCP prompts/resources autodoc surface and the companion typehints / theme / layout fixes shipped in gp-sphinx PR #21 (git-pull/gp-sphinx#21). what: - Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in pyproject.toml - uv.lock refreshed to match
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Mirror the existing
{fastmcp-tool}autodoc surface for the other threefirst-class FastMCP components: prompts, resources, and resource
templates. Four new directives, one new collector strategy, new type
badges with a MIME pill for resources.
New directives
{fastmcp-prompt} <name>— card with the prompt name as signature + aprompttype badge + description from the Python docstring (first paragraph only).{fastmcp-prompt-input} <name>— arguments table (name / type / required / description). Type is enriched from the Python signature sostr,floatetc. show up.{fastmcp-resource} <name>— card with the URI as signature +resourcetype badge + MIME pill + facts row.{fastmcp-resource-template} <name>— same shape but with a URI template (e.g.tmux://sessions/{session_name}{?socket_name}) + parameters table derived from the JSON schema.Collector
New
fastmcp_server_moduleconfig value points at a liveFastMCPinstance:```python
conf["fastmcp_server_module"] = "libtmux_mcp.server:mcp"
```
The collector reads
local_provider._componentsdirectly. The async_list_*helpers in FastMCP are trivial filters over that dict; iterating the dict avoids standing up an asyncio loop at Sphinx build time.If the configured instance has zero components registered (common when a server module exposes
_register_all()and only invokes it fromrun_server()), the collector callsregister_all()/_register_all()on the same module to populate them.Badge vocabulary
prompt(💬),resource(🗂️),resource-template(🧭)application/json,text/plain)tagson the registered component render as small pillsCSS classes follow the existing
gp-sphinx-fastmcp__*BEM namespace.Noise cleanup
\"Provide as a JSON string matching the following schema: {...}\"hint from prompt argument descriptions. It's aimed at LLMs; for human docs it's noise.Parameters/Returnssections from NumPy-style docstrings.DX choice
The prompt and resource directives emit the card inline (no enclosing
<section>) so the surrounding##markdown heading stays the anchor source of truth. That preserves the existing DX of pages likedocs/tools/prompts.md, where each prompt has a visible## run_and_waitheading followed by a mix of prose (**Use when**,**Why use this**,**Sample render**) and the autodoc block. Writers keep their editorial voice; the signature + args table stay in sync with the live server surface.Test plan
uv run ruff check . && uv run ruff format --check .uv run mypyuv run pytestfastmcp_server_modulewired in; confirmed 4 prompts + 6 resource templates render with badges and clean descriptions. Before/after screenshots in the linked libtmux-mcp PR.What this does NOT do
session_namefrom the real server) — completion providers are tracked separately, see libtmux-mcp's newdocs/topics/completion.mdfor how the spec maps onto what FastMCP provides out of the box.set_resource/unset_resource) — neither the MCP spec nor FastMCP exposes these; the autodoc surface is read-only.