diff --git a/src/mcp_synology_container/modules/compose.py b/src/mcp_synology_container/modules/compose.py index 0f67f6d..075ed4a 100644 --- a/src/mcp_synology_container/modules/compose.py +++ b/src/mcp_synology_container/modules/compose.py @@ -16,6 +16,8 @@ if TYPE_CHECKING: from mcp_synology_container.config import AppConfig from mcp_synology_container.dsm_client import DsmClient +from mcp_synology_container.modules.projects import _find_project + logger = logging.getLogger(__name__) # Recognized compose file names (in priority order) @@ -42,10 +44,15 @@ def register_compose(mcp: FastMCP, config: AppConfig, client: DsmClient) -> None """ path = await _find_compose_path(client, config, project_name) if path is None: + project = await _find_project(client, project_name) + searched = ( + project.get("path", f"{config.compose_base_path}/{project_name}") + if project + else f"{config.compose_base_path}/{project_name}" + ) return ( f"No compose file found for project '{project_name}'.\n" - f"Looked in {config.compose_base_path}/{project_name}/ for: " - + ", ".join(_COMPOSE_FILENAMES) + f"Looked in {searched}/ for: " + ", ".join(_COMPOSE_FILENAMES) ) try: @@ -295,22 +302,33 @@ async def _find_compose_path( ) -> str | None: """Find the compose file path for a project. - Tries each recognized filename under {compose_base_path}/{project_name}/. + Resolves the project's real directory via SYNO.Docker.Project list, + then probes each recognised filename under that directory. + Falls back to {compose_base_path}/{project_name} when the project + cannot be found in Container Manager. Args: client: DsmClient instance. - config: AppConfig with compose_base_path. + config: AppConfig with compose_base_path (used as fallback). project_name: Project name. Returns: Full path to the compose file if found, None otherwise. """ - base = f"{config.compose_base_path}/{project_name}" + project = await _find_project(client, project_name) + if project is not None: + base = project.get("path", "").rstrip("/") + else: + base = f"{config.compose_base_path}/{project_name}" + logger.debug( + "Project '%s' not found via API, falling back to base path: %s", + project_name, + base, + ) for filename in _COMPOSE_FILENAMES: path = f"{base}/{filename}" try: - # Try to list the file; if it exists, return the path await client.request( "SYNO.FileStation.Info", "get",