diff --git a/docs/docs.json b/docs/docs.json index cfc5f54e8..fe8935a37 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -563,12 +563,12 @@ "group": "transforms", "pages": [ "python-sdk/fastmcp-server-transforms-__init__", - "python-sdk/fastmcp-server-transforms-visibility", "python-sdk/fastmcp-server-transforms-namespace", "python-sdk/fastmcp-server-transforms-prompts_as_tools", "python-sdk/fastmcp-server-transforms-resources_as_tools", "python-sdk/fastmcp-server-transforms-tool_transform", - "python-sdk/fastmcp-server-transforms-version_filter" + "python-sdk/fastmcp-server-transforms-version_filter", + "python-sdk/fastmcp-server-transforms-visibility" ] } ] @@ -640,6 +640,7 @@ ] }, "python-sdk/fastmcp-utilities-pagination", + "python-sdk/fastmcp-utilities-skills", "python-sdk/fastmcp-utilities-tests", "python-sdk/fastmcp-utilities-timeout", "python-sdk/fastmcp-utilities-types", diff --git a/docs/python-sdk/fastmcp-server-providers-base.mdx b/docs/python-sdk/fastmcp-server-providers-base.mdx index ee80c310f..6db55a107 100644 --- a/docs/python-sdk/fastmcp-server-providers-base.mdx +++ b/docs/python-sdk/fastmcp-server-providers-base.mdx @@ -121,7 +121,7 @@ get_tool(self, name: str, version: VersionSpec | None = None) -> Tool | None Get tool by transformed name with all transforms applied. Note: This method does NOT filter disabled components. The Server -(FastMCP) performs visibility filtering after all transforms complete, +(FastMCP) performs enabled filtering after all transforms complete, allowing session-level transforms to override provider-level disables. **Args:** @@ -152,7 +152,7 @@ get_resource(self, uri: str, version: VersionSpec | None = None) -> Resource | N Get resource by transformed URI with all transforms applied. Note: This method does NOT filter disabled components. The Server -(FastMCP) performs visibility filtering after all transforms complete. +(FastMCP) performs enabled filtering after all transforms complete. **Args:** - `uri`: The transformed resource URI to look up. @@ -182,7 +182,7 @@ get_resource_template(self, uri: str, version: VersionSpec | None = None) -> Res Get resource template by transformed URI with all transforms applied. Note: This method does NOT filter disabled components. The Server -(FastMCP) performs visibility filtering after all transforms complete. +(FastMCP) performs enabled filtering after all transforms complete. **Args:** - `uri`: The transformed template URI to look up. @@ -212,7 +212,7 @@ get_prompt(self, name: str, version: VersionSpec | None = None) -> Prompt | None Get prompt by transformed name with all transforms applied. Note: This method does NOT filter disabled components. The Server -(FastMCP) performs visibility filtering after all transforms complete. +(FastMCP) performs enabled filtering after all transforms complete. **Args:** - `name`: The transformed prompt name to look up. @@ -261,7 +261,7 @@ enable(self) -> Self Enable components matching all specified criteria. -Adds an enabled transform that marks matching components as enabled. +Adds a visibility transform that marks matching components as enabled. Later transforms override earlier ones, so enable after disable makes the component enabled. diff --git a/docs/python-sdk/fastmcp-server-transforms-visibility.mdx b/docs/python-sdk/fastmcp-server-transforms-visibility.mdx index 383eb0cc4..4fcf9dbe8 100644 --- a/docs/python-sdk/fastmcp-server-transforms-visibility.mdx +++ b/docs/python-sdk/fastmcp-server-transforms-visibility.mdx @@ -15,7 +15,7 @@ Final filtering happens at the Provider level. ## Functions -### `is_enabled` +### `is_enabled` ```python is_enabled(component: FastMCPComponent) -> bool @@ -37,7 +37,7 @@ Returns False if visibility mark is False. - True if component should be enabled/visible to clients. -### `get_visibility_rules` +### `get_visibility_rules` ```python get_visibility_rules(context: Context) -> list[dict[str, Any]] @@ -47,7 +47,7 @@ get_visibility_rules(context: Context) -> list[dict[str, Any]] Load visibility rule dicts from session state. -### `save_visibility_rules` +### `save_visibility_rules` ```python save_visibility_rules(context: Context, rules: list[dict[str, Any]]) -> None @@ -64,7 +64,7 @@ If None, sends notifications for all types (safe default). If provided, only sends notifications for specified types. -### `create_visibility_transforms` +### `create_visibility_transforms` ```python create_visibility_transforms(rules: list[dict[str, Any]]) -> list[Visibility] @@ -74,7 +74,7 @@ create_visibility_transforms(rules: list[dict[str, Any]]) -> list[Visibility] Convert rule dicts to Visibility transforms. -### `get_session_transforms` +### `get_session_transforms` ```python get_session_transforms(context: Context) -> list[Visibility] @@ -84,7 +84,7 @@ get_session_transforms(context: Context) -> list[Visibility] Get session-specific Visibility transforms from state store. -### `enable_components` +### `enable_components` ```python enable_components(context: Context) -> None @@ -110,7 +110,7 @@ ResourceListChangedNotification, and PromptListChangedNotification. - `match_all`: If True, matches all components regardless of other criteria. -### `disable_components` +### `disable_components` ```python disable_components(context: Context) -> None @@ -136,7 +136,7 @@ ResourceListChangedNotification, and PromptListChangedNotification. - `match_all`: If True, matches all components regardless of other criteria. -### `reset_visibility` +### `reset_visibility` ```python reset_visibility(context: Context) -> None @@ -154,7 +154,7 @@ ResourceListChangedNotification, and PromptListChangedNotification. - `context`: The context for this session. -### `apply_session_transforms` +### `apply_session_transforms` ```python apply_session_transforms(components: Sequence[ComponentT]) -> Sequence[ComponentT] @@ -188,7 +188,7 @@ Final filtering happens at the Provider level after all transforms run. **Methods:** -#### `list_tools` +#### `list_tools` ```python list_tools(self, tools: Sequence[Tool]) -> Sequence[Tool] @@ -197,7 +197,7 @@ list_tools(self, tools: Sequence[Tool]) -> Sequence[Tool] Mark tools by visibility state. -#### `get_tool` +#### `get_tool` ```python get_tool(self, name: str, call_next: GetToolNext) -> Tool | None @@ -206,7 +206,7 @@ get_tool(self, name: str, call_next: GetToolNext) -> Tool | None Mark tool if found. -#### `list_resources` +#### `list_resources` ```python list_resources(self, resources: Sequence[Resource]) -> Sequence[Resource] @@ -215,7 +215,7 @@ list_resources(self, resources: Sequence[Resource]) -> Sequence[Resource] Mark resources by visibility state. -#### `get_resource` +#### `get_resource` ```python get_resource(self, uri: str, call_next: GetResourceNext) -> Resource | None @@ -224,7 +224,7 @@ get_resource(self, uri: str, call_next: GetResourceNext) -> Resource | None Mark resource if found. -#### `list_resource_templates` +#### `list_resource_templates` ```python list_resource_templates(self, templates: Sequence[ResourceTemplate]) -> Sequence[ResourceTemplate] @@ -233,7 +233,7 @@ list_resource_templates(self, templates: Sequence[ResourceTemplate]) -> Sequence Mark resource templates by visibility state. -#### `get_resource_template` +#### `get_resource_template` ```python get_resource_template(self, uri: str, call_next: GetResourceTemplateNext) -> ResourceTemplate | None @@ -242,7 +242,7 @@ get_resource_template(self, uri: str, call_next: GetResourceTemplateNext) -> Res Mark resource template if found. -#### `list_prompts` +#### `list_prompts` ```python list_prompts(self, prompts: Sequence[Prompt]) -> Sequence[Prompt] @@ -251,10 +251,11 @@ list_prompts(self, prompts: Sequence[Prompt]) -> Sequence[Prompt] Mark prompts by visibility state. -#### `get_prompt` +#### `get_prompt` ```python get_prompt(self, name: str, call_next: GetPromptNext) -> Prompt | None ``` Mark prompt if found. + diff --git a/docs/python-sdk/fastmcp-utilities-skills.mdx b/docs/python-sdk/fastmcp-utilities-skills.mdx new file mode 100644 index 000000000..32aed81ca --- /dev/null +++ b/docs/python-sdk/fastmcp-utilities-skills.mdx @@ -0,0 +1,114 @@ +--- +title: skills +sidebarTitle: skills +--- + +# `fastmcp.utilities.skills` + + +Client utilities for discovering and downloading skills from MCP servers. + +## Functions + +### `list_skills` + +```python +list_skills(client: Client) -> list[SkillSummary] +``` + + +List all available skills from an MCP server. + +Discovers skills by finding resources with URIs matching the +`skill://{name}/SKILL.md` pattern. + +**Args:** +- `client`: Connected FastMCP client + +**Returns:** +- List of SkillSummary objects with name, description, and URI + + +### `get_skill_manifest` + +```python +get_skill_manifest(client: Client, skill_name: str) -> SkillManifest +``` + + +Get the manifest for a specific skill. + +**Args:** +- `client`: Connected FastMCP client +- `skill_name`: Name of the skill + +**Returns:** +- SkillManifest with file listing + +**Raises:** +- `ValueError`: If manifest cannot be read or parsed + + +### `download_skill` + +```python +download_skill(client: Client, skill_name: str, target_dir: str | Path) -> Path +``` + + +Download a skill and all its files to a local directory. + +Creates a subdirectory named after the skill containing all files. + +**Args:** +- `client`: Connected FastMCP client +- `skill_name`: Name of the skill to download +- `target_dir`: Directory where skill folder will be created +- `overwrite`: If True, overwrite existing skill directory. If False +(default), raise FileExistsError if directory exists. + +**Returns:** +- Path to the downloaded skill directory + +**Raises:** +- `ValueError`: If skill cannot be found or downloaded +- `FileExistsError`: If skill directory exists and overwrite=False + + +### `sync_skills` + +```python +sync_skills(client: Client, target_dir: str | Path) -> list[Path] +``` + + +Download all available skills from a server. + +**Args:** +- `client`: Connected FastMCP client +- `target_dir`: Directory where skill folders will be created +- `overwrite`: If True, overwrite existing files + +**Returns:** +- List of paths to downloaded skill directories + + +## Classes + +### `SkillSummary` + + +Summary information about a skill available on a server. + + +### `SkillFile` + + +Information about a file within a skill. + + +### `SkillManifest` + + +Full manifest of a skill including all files. +