From 5a3f65c7f35257e2fc1a7cfb0bf69bec5d93fafc Mon Sep 17 00:00:00 2001 From: Ryan Malloy Date: Wed, 17 Sep 2025 00:29:27 -0600 Subject: [PATCH] Fix FastMCP stdio method for Claude Code integration - Replace deprecated app.run_stdio() with app.run(transport="stdio") - Update both src/mcpmc/mcpmc.py and src/backend/src/mcpmc.py - Resolves AttributeError: 'FastMCP' object has no attribute 'run_stdio' - Compatible with FastMCP 2.12.2+ API changes - MCPMC Expert System now ready for uvx mcpmc execution --- src/backend/src/mcpmc.py | 92 ++++++++++++++++++++++++++++++++++++++++ src/mcpmc/mcpmc.py | 89 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 src/backend/src/mcpmc.py create mode 100644 src/mcpmc/mcpmc.py diff --git a/src/backend/src/mcpmc.py b/src/backend/src/mcpmc.py new file mode 100644 index 0000000..be68068 --- /dev/null +++ b/src/backend/src/mcpmc.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +""" +MCPMC Expert System - MCP Stdio Server Entry Point + +This module provides the stdio server interface for Claude Code integration. +Run with: uvx mcpmc or python -m src.mcpmc +""" + +import asyncio +import logging +import sys +import os +from typing import Dict, Any + +# Add the project root to Python path for imports +sys.path.append(os.path.dirname(os.path.dirname(__file__))) + +from fastmcp import FastMCP +from tools.expert_consultation import ExpertConsultationTools +from knowledge.search_engine import KnowledgeSearchEngine +from tools.elicitation import UserElicitationSystem + +# Configure logging for stdio mode +logging.basicConfig( + level=logging.WARNING, # Reduce noise for stdio mode + format='%(levelname)s: %(message)s', + stream=sys.stderr +) +logger = logging.getLogger(__name__) + + +def create_mcp_server() -> FastMCP: + """Create and configure the MCPMC MCP server""" + + try: + # Show package version in startup banner + from importlib.metadata import version + package_version = version("mcpmc") + except: + package_version = "0.1.0" + + # Print startup banner to stderr + print(f"šŸŽ¬ MCPMC Expert System v{package_version}", file=sys.stderr) + print("šŸ“‹ Initializing 6 expert agents and knowledge base...", file=sys.stderr) + + # Create MCP application + app = FastMCP( + name="MCPMC Expert System", + version=package_version + ) + + try: + # Initialize expert consultation tools + expert_tools = ExpertConsultationTools(app) + + # Initialize knowledge search engine + knowledge_engine = KnowledgeSearchEngine(app) + + # Initialize user elicitation system + elicitation_system = UserElicitationSystem(app) + + print(f"āœ… Expert system ready: {len(expert_tools.registry.get_all_agents())} agents, " + f"{knowledge_engine.knowledge_base.get_statistics()['total_entries']} knowledge entries", + file=sys.stderr) + + return app + + except Exception as e: + logger.error(f"Failed to initialize MCPMC expert system: {e}") + sys.exit(1) + + +def main(): + """Main entry point for the MCP stdio server""" + + try: + # Create the MCP server + app = create_mcp_server() + + # Run in stdio mode for Claude Code integration + app.run(transport="stdio") + + except KeyboardInterrupt: + print("\nšŸ›‘ MCPMC Expert System shutdown", file=sys.stderr) + sys.exit(0) + except Exception as e: + logger.error(f"MCP server error: {e}") + sys.exit(1) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/src/mcpmc/mcpmc.py b/src/mcpmc/mcpmc.py new file mode 100644 index 0000000..7151fac --- /dev/null +++ b/src/mcpmc/mcpmc.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 +""" +MCPMC Expert System - MCP Stdio Server Entry Point + +This module provides the stdio server interface for Claude Code integration. +Run with: uvx mcpmc or python -m src.mcpmc +""" + +import asyncio +import logging +import sys +import os +from typing import Dict, Any + +from fastmcp import FastMCP +from mcpmc.tools.expert_consultation import ExpertConsultationTools +from mcpmc.knowledge.search_engine import KnowledgeSearchEngine +from mcpmc.tools.elicitation import UserElicitationSystem + +# Configure logging for stdio mode +logging.basicConfig( + level=logging.WARNING, # Reduce noise for stdio mode + format='%(levelname)s: %(message)s', + stream=sys.stderr +) +logger = logging.getLogger(__name__) + + +def create_mcp_server() -> FastMCP: + """Create and configure the MCPMC MCP server""" + + try: + # Show package version in startup banner + from importlib.metadata import version + package_version = version("mcpmc") + except: + package_version = "0.1.0" + + # Print startup banner to stderr + print(f"šŸŽ¬ MCPMC Expert System v{package_version}", file=sys.stderr) + print("šŸ“‹ Initializing 6 expert agents and knowledge base...", file=sys.stderr) + + # Create MCP application + app = FastMCP( + name="MCPMC Expert System", + version=package_version + ) + + try: + # Initialize expert consultation tools + expert_tools = ExpertConsultationTools(app) + + # Initialize knowledge search engine + knowledge_engine = KnowledgeSearchEngine(app) + + # Initialize user elicitation system + elicitation_system = UserElicitationSystem(app) + + print(f"āœ… Expert system ready: {len(expert_tools.registry.get_all_agents())} agents, " + f"{knowledge_engine.knowledge_base.get_statistics()['total_entries']} knowledge entries", + file=sys.stderr) + + return app + + except Exception as e: + logger.error(f"Failed to initialize MCPMC expert system: {e}") + sys.exit(1) + + +def main(): + """Main entry point for the MCP stdio server""" + + try: + # Create the MCP server + app = create_mcp_server() + + # Run in stdio mode for Claude Code integration + app.run(transport="stdio") + + except KeyboardInterrupt: + print("\nšŸ›‘ MCPMC Expert System shutdown", file=sys.stderr) + sys.exit(0) + except Exception as e: + logger.error(f"MCP server error: {e}") + sys.exit(1) + + +if __name__ == "__main__": + main() \ No newline at end of file