From 7c32d69f2db631055151331ed59e3721fe960a2f Mon Sep 17 00:00:00 2001 From: Adolfo Delorenzo Date: Fri, 18 Jul 2025 08:15:46 -0600 Subject: [PATCH] Fix BaseService constructor inheritance and MCP server initialization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix service constructors to properly call BaseService with required name parameter - Fix AuthService, UserService, and SettingsService constructor signatures - Add missing ServerCapabilities to MCP server initialization - Create main_sync() wrapper function for script entry point compatibility - Update pyproject.toml to use synchronous entry point for uvx/pip execution Resolves BaseService.__init__() missing required positional argument error All execution methods now work correctly: npx, uvx, pip, python -m 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- pyproject.toml | 2 +- src/portainer_core/server.py | 24 +++++++++++++++++++++++- src/portainer_core/services/auth.py | 4 ++-- src/portainer_core/services/settings.py | 4 ++-- src/portainer_core/services/users.py | 4 ++-- 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1f5ae47..95a62d5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,7 +55,7 @@ Repository = "https://github.com/portainer/portainer-mcp-core" Issues = "https://github.com/portainer/portainer-mcp-core/issues" [project.scripts] -portainer-core-mcp = "portainer_core.server:main" +portainer-core-mcp = "portainer_core.server:main_sync" [tool.setuptools.packages.find] where = ["src"] diff --git a/src/portainer_core/server.py b/src/portainer_core/server.py index 23677a9..a3ee1c2 100644 --- a/src/portainer_core/server.py +++ b/src/portainer_core/server.py @@ -17,6 +17,9 @@ from mcp.types import ( TextContent, ImageContent, EmbeddedResource, + ServerCapabilities, + ResourcesCapability, + ToolsCapability, ) from .config import get_global_config, get_global_server_config @@ -1148,6 +1151,15 @@ class PortainerCoreMCPServer: InitializationOptions( server_name=server_config.server_name, server_version=server_config.version, + capabilities=ServerCapabilities( + resources=ResourcesCapability( + subscribe=True, + list_changed=True, + ), + tools=ToolsCapability( + list_changed=True, + ), + ), ) ) except Exception as e: @@ -1260,5 +1272,15 @@ async def main() -> None: raise +def main_sync() -> None: + """ + Synchronous entry point for the server. + + This function is used by the script entry point in pyproject.toml. + It wraps the async main() function with asyncio.run(). + """ + asyncio.run(main()) + + if __name__ == "__main__": - asyncio.run(main()) \ No newline at end of file + main_sync() \ No newline at end of file diff --git a/src/portainer_core/services/auth.py b/src/portainer_core/services/auth.py index 425b260..c37ae8a 100644 --- a/src/portainer_core/services/auth.py +++ b/src/portainer_core/services/auth.py @@ -23,8 +23,8 @@ from ..utils.logging import get_logger class AuthService(BaseService): """Service for authentication operations.""" - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + def __init__(self): + super().__init__("auth") self.logger = get_logger(__name__) self._cached_token = None self._token_expires_at = None diff --git a/src/portainer_core/services/settings.py b/src/portainer_core/services/settings.py index 39c5959..936dbf4 100644 --- a/src/portainer_core/services/settings.py +++ b/src/portainer_core/services/settings.py @@ -19,8 +19,8 @@ from ..utils.logging import get_logger class SettingsService(BaseService): """Service for settings management operations.""" - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + def __init__(self): + super().__init__("settings") self.logger = get_logger(__name__) async def get_settings(self) -> SettingsResponse: diff --git a/src/portainer_core/services/users.py b/src/portainer_core/services/users.py index 3012447..eed6184 100644 --- a/src/portainer_core/services/users.py +++ b/src/portainer_core/services/users.py @@ -25,8 +25,8 @@ from ..utils.logging import get_logger class UserService(BaseService): """Service for user management operations.""" - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + def __init__(self): + super().__init__("users") self.logger = get_logger(__name__) async def list_users(self) -> List[UserResponse]: