install_skill_from_url
Download, validate, install, and optionally activate a markdown-based skill from a URL to extend the MCP server's capabilities.
Instructions
Download, validate, install, and optionally activate a skill from a URL.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| activate | No |
Implementation Reference
- The MCP tool handler for 'install_skill_from_url'. It downloads skill markdown from a URL via httpx, then delegates to skill_store.install_skill_from_markdown for validation, installation, and optional activation.
@mcp.tool() async def install_skill_from_url(url: str, activate: bool = True) -> dict: """Download, validate, install, and optionally activate a skill from a URL.""" async with httpx.AsyncClient(follow_redirects=True, timeout=15.0) as client: response = await client.get(url) response.raise_for_status() return skill_store.install_skill_from_markdown( response.text, source=url, source_type="url", activate=activate, ) - Input schema for the tool: 'url: str' (required) and 'activate: bool = True' (optional, defaults to True).
@mcp.tool() async def install_skill_from_url(url: str, activate: bool = True) -> dict: """Download, validate, install, and optionally activate a skill from a URL.""" async with httpx.AsyncClient(follow_redirects=True, timeout=15.0) as client: response = await client.get(url) response.raise_for_status() return skill_store.install_skill_from_markdown( response.text, source=url, source_type="url", activate=activate, ) - src/friday_mcp_server/tools/skills.py:10-11 (registration)Registration of the 'install_skill_from_url' tool via the @mcp.tool() decorator inside the register() function. The register() function is called from tools/__init__.py's register_all_tools.
def register(mcp, *, skill_store) -> None: @mcp.tool() - Core helper SkillStore.install_skill_from_markdown() called by the handler. Parses, validates, backs up existing skill if present, writes the skill file, and updates the registry.
def install_skill_from_markdown( self, markdown: str, *, source: str, source_type: str, activate: bool = True, ) -> dict[str, Any]: document = self._parse_skill(markdown) self._ensure_compatible(document.min_server_version) registry = self._load_registry() target_path = self.installed_dir / f"{document.skill_id}.md" backup_path = None if target_path.exists(): timestamp = self._timestamp_slug() backup_path = self.backups_dir / f"{document.skill_id}-{timestamp}.md" shutil.copy2(target_path, backup_path) target_path.write_text(self._serialize_skill(document), encoding="utf-8") record = { "id": document.skill_id, "name": document.name, "version": document.version, "description": document.description, "capabilities": document.capabilities, "min_server_version": document.min_server_version, "active": activate, "source": source, "source_type": source_type, "installed_at": self._timestamp(), "checksum": self._checksum(target_path.read_text(encoding="utf-8")), "path": str(target_path), "backup_path": str(backup_path) if backup_path else None, } registry[document.skill_id] = record self._save_registry(registry) return record - src/friday_mcp_server/tools/__init__.py:6-12 (registration)Tool registration orchestrator that calls skills.register(mcp, skill_store=skill_store) to register all skill tools including install_skill_from_url.
def register_all_tools(mcp, *, config, skill_store) -> None: system.register(mcp, config=config) utils.register(mcp) web.register(mcp, config=config) workspace.register(mcp, config=config) skills.register(mcp, skill_store=skill_store)