Ctrl K
ComunidadGuías…

butler/tools/mcp_self_service_ops.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""MCP self-service tool helpers (P0-A)."""

from __future__ import annotations

import json
import logging
from pathlib import Path
from typing import Any, Callable

from butler.core.best_effort import safe_best_effort

logger = logging.getLogger(__name__)


def tool_json_loud(run: Callable[[], str]) -> str:
    try:
        return run()
    except Exception as exc:
        return json.dumps({"ok": False, "error": str(exc)[:300]})


def resolve_project_workspace_safe() -> Path | None:
    def _run() -> Path | None:
        from butler.tools.project_todos import _get_workspace

        ws = _get_workspace()
        return ws if isinstance(ws, Path) else None

    result = safe_best_effort(_run, label="mcp_self_service.workspace", default=None)
    return result if isinstance(result, Path) else None


def attach_post_install_verify_safe(payload: dict[str, Any], sid: str, workspace: Path | None) -> None:
    def _run() -> None:
        from butler.mcp.extension_manifest import get_manifest_by_server_id
        from butler.mcp.extension_verify import (
            format_post_install_verify_hint,
            verify_for_server_id,
            write_verify_cache,
        )

        manifest = get_manifest_by_server_id(sid, workspace)
        if manifest is None:
            return
        report = verify_for_server_id(sid, workspace=workspace, run_golden=False)
        if report is None:
            return
        write_verify_cache({manifest.id: report})
        payload["extension_verify"] = format_post_install_verify_hint(report, manifest)

    safe_best_effort(_run, label="mcp_self_service.post_install_verify", default=None)