Skip to main content
Glama
by hydavinci
README.md•10.5 kB
# C++ UML Class Diagram Generator A powerful Model Context Protocol (MCP) server that recursively analyzes C++ source and header files, extracts class definitions, inheritance relationships, and member information, then generates comprehensive UML class diagrams in PlantUML format. ## Features - šŸ” **Multi-format C++ file support**: .cpp, .hpp, .h, .cc, .cxx files - šŸ—ļø **Class & struct extraction**: Automatically detects class/struct definitions - šŸ”— **Inheritance mapping**: Captures inheritance relationships and generates proper UML arrows - šŸ‘ļø **Member visibility**: Handles public, private, and protected member access levels - šŸ“ **Directory scanning**: Recursively processes entire project folders - šŸ“„ **Content-based processing**: Generate UML from provided file contents directly - šŸ›”ļø **Error handling**: Robust error handling with diagnostic UML output - 🌐 **MCP server support**: Works as both HTTP and stdio MCP server - 🐳 **Docker ready**: Containerized deployment support - ✨ **PlantUML output**: Clean, valid PlantUML format for easy rendering ## Installation ### Quick Start ```bash # Clone the repository git clone https://github.com/hydavinci/uml-diagram.git cd uml-diagram # Install dependencies pip install -r requirements.txt # or using uv uv sync ``` ### Docker Deployment ```bash # Build the container docker build -t uml-diagram-mcp . # Run as HTTP server docker run -p 8081:8081 -e TRANSPORT=http uml-diagram-mcp # Run as stdio server docker run -e TRANSPORT=stdio uml-diagram-mcp ``` ## Usage ### As a Standalone Script ```bash # Navigate to the src directory cd src # Generate UML from a C++ project directory python uml_generate.py /path/to/your/cpp/project # The UML diagram will be written to 'uml_output.puml' in the current directory ``` **Example:** ```bash python uml_generate.py "C:\Projects\MyProject\src" # Output: uml_output.puml ``` ### As a Python Module #### Directory-based Generation ```python from src.uml_generate import generate_cpp_uml_from_path # Generate UML from a directory uml_diagram = generate_cpp_uml_from_path('/path/to/cpp/project') print(uml_diagram) # Save to file with open('my_diagram.puml', 'w') as f: f.write(uml_diagram) ``` #### Content-based Generation ```python from src.uml_generate import generate_cpp_uml_from_content # Dictionary where keys are file names and values are file contents file_contents = { "animal.h": """ class Animal { public: virtual void makeSound() = 0; virtual ~Animal() = default; protected: std::string name_; private: int age_; }; """, "dog.h": """ #include "animal.h" class Dog : public Animal { public: void makeSound() override; void bark(); private: std::string breed_; bool isTrained_; }; """, "cat.h": """ #include "animal.h" class Cat : public Animal { public: void makeSound() override; void purr(); private: bool isIndoor_; }; """ } uml_diagram = generate_cpp_uml_from_content(file_contents) print(uml_diagram) ``` ### As an MCP Server This tool provides a complete Model Context Protocol (MCP) server implementation with two available tools: #### Available MCP Tools 1. **`generate_cpp_uml`** - Directory-based UML generation - **Parameter**: `path` (string) - Path to directory containing C++ files - **Returns**: PlantUML diagram as string - **Example**: Analyze entire C++ project directory 2. **`generate_cpp_uml_from_content`** - Content-based UML generation - **Parameter**: `file_contents` (Dict[str, str]) - Dictionary mapping file names to their contents - **Returns**: PlantUML diagram as string - **Example**: Generate UML from provided source code snippets #### Starting the MCP Server **HTTP Mode** (recommended for web clients): ```bash # Set transport mode and start server export TRANSPORT=http python src/server.py # Server will start on port 8081 by default # Access at: http://localhost:8081 ``` **Stdio Mode** (for command-line clients): ```bash # Default mode - no environment variable needed python src/server.py # Or explicitly set stdio mode export TRANSPORT=stdio python src/server.py ``` #### MCP Client Integration Example ```python import asyncio from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client async def use_uml_generator(): server_params = StdioServerParameters( command="python", args=["src/server.py"], cwd="/path/to/uml-diagram" ) async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: # Initialize the session await session.initialize() # Generate UML from directory result = await session.call_tool( "generate_cpp_uml", {"path": "/path/to/cpp/project"} ) print("Generated UML:") print(result.content[0].text) # Run the example asyncio.run(use_uml_generator()) ``` ## Requirements ### System Requirements - **Python**: 3.10 or higher - **Operating System**: Windows, Linux, macOS - **Memory**: Minimum 512MB RAM (more for large codebases) ### Dependencies #### Core Dependencies (included in pyproject.toml) - `fastmcp>=0.2.0` - For MCP server functionality #### Python Standard Library (no installation needed) - `os` - File system operations - `re` - Regular expression parsing - `typing` - Type hints - `json` - JSON handling (middleware) - `base64` - Encoding (middleware) - `urllib.parse` - URL parsing (middleware) #### Development Dependencies (optional) ```bash # For development and testing pip install pytest black flake8 ``` ### PlantUML Rendering (optional) To view the generated `.puml` files: - **VS Code**: Install PlantUML extension - **Online**: Use [PlantUML Online Server](http://www.plantuml.com/plantuml/uml/) - **Local**: Install PlantUML with Java runtime ## Output Examples ### Generated PlantUML Structure The tool generates clean, well-formatted PlantUML diagrams: ```plantuml @startuml class Animal { + virtual makeSound() = 0 + virtual ~Animal() = default # std::string name_ - int age_ } class Dog { + makeSound() override + bark() - std::string breed_ - bool isTrained_ } class Cat { + makeSound() override + purr() - bool isIndoor_ } Animal <|-- Dog Animal <|-- Cat @enduml ``` ### Symbol Meanings - `+` Public members - `-` Private members - `#` Protected members - `<|--` Inheritance relationship (base <|-- derived) ### File Output - **Script mode**: Creates `uml_output.puml` in current directory - **Module mode**: Returns PlantUML string for programmatic use - **MCP mode**: Returns PlantUML string via MCP protocol ## Project Structure ``` uml-diagram/ ā”œā”€ā”€ src/ │ ā”œā”€ā”€ server.py # MCP server implementation │ ā”œā”€ā”€ uml_generate.py # Core UML generation logic │ └── middleware.py # HTTP request middleware ā”œā”€ā”€ Dockerfile # Container configuration ā”œā”€ā”€ pyproject.toml # Project dependencies and metadata ā”œā”€ā”€ smithery.yaml # Smithery platform configuration ā”œā”€ā”€ README.md # This file └── LICENSE # MIT license ``` ## Supported C++ Features ### Class Detection - āœ… Class definitions - āœ… Struct definitions - āœ… Template classes (generics stripped for PlantUML compatibility) - āœ… Nested classes (basic support) ### Inheritance - āœ… Single inheritance - āœ… Multiple inheritance - āœ… Public inheritance - āœ… Protected inheritance - āœ… Private inheritance ### Member Detection - āœ… Public, private, protected members - āœ… Methods and functions - āœ… Variables and fields - āœ… Virtual and pure virtual methods - āœ… Constructors and destructors - āœ… Static members (basic support) ### Limitations - āš ļø Complex template specializations may not be fully captured - āš ļø Preprocessor macros are not expanded - āš ļø Forward declarations without definitions are skipped - āš ļø Some complex C++ syntax may require manual review ## Configuration ### Environment Variables - `TRANSPORT`: Set to "http" for HTTP mode, "stdio" for stdio mode (default) - `PORT`: HTTP server port (default: 8081) - `SERVER_TOKEN`: Optional authentication token for stdio mode ### Smithery Platform This project includes `smithery.yaml` for deployment on the Smithery platform: - Containerized runtime - HTTP transport mode - Auto-scaling support ## Troubleshooting ### Common Issues **"No C++ classes found" message:** - Verify the path contains .cpp, .hpp, .h, .cc, or .cxx files - Check file encoding (UTF-8 recommended) - Ensure class definitions use standard C++ syntax **Empty or malformed UML output:** - Review C++ syntax for unsupported constructs - Check for balanced braces in class definitions - Verify inheritance syntax follows standard format **MCP server connection issues:** - Ensure correct transport mode (http vs stdio) - Check port availability (8081 by default) - Verify dependencies are installed (`fastmcp`) ### Debug Mode Enable verbose logging by modifying `server.py`: ```python # Add debug logging import logging logging.basicConfig(level=logging.DEBUG) ``` ## Contributing 1. Fork the repository 2. Create a feature branch: `git checkout -b feature-name` 3. Make your changes and add tests 4. Commit: `git commit -am 'Add feature-name'` 5. Push: `git push origin feature-name` 6. Create a Pull Request ### Development Setup ```bash # Clone and setup development environment git clone https://github.com/hydavinci/uml-diagram.git cd uml-diagram # Install in development mode pip install -e . # Run tests (if available) python -m pytest # Format code black src/ ``` ## License This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. ## Changelog ### v0.1.0 - Initial release - Directory-based UML generation - Content-based UML generation - MCP server with HTTP and stdio transport - Docker containerization support - PlantUML output format - Class, inheritance, and member detection --- **Author**: [hydavinci](https://github.com/hydavinci) **Repository**: [https://github.com/hydavinci/uml-diagram](https://github.com/hydavinci/uml-diagram)

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/hydavinci/uml-diagram'

If you have feedback or need assistance with the MCP directory API, please join our Discord server