portainer-mcp/run_server.py
2025-07-18 07:33:27 -06:00

115 lines
4.2 KiB
Python

#!/usr/bin/env python3
"""
Portainer Core MCP Server - Entry Point Script.
This script serves as the main entry point for the Portainer Core MCP Server,
providing authentication and user management functionality for Portainer Business Edition.
It handles environment setup, configuration validation, and server startup.
Usage:
python run_server.py
Environment Variables:
PORTAINER_URL: The base URL of your Portainer instance (required)
PORTAINER_API_KEY: API key for authentication (option 1)
PORTAINER_USERNAME: Username for authentication (option 2)
PORTAINER_PASSWORD: Password for authentication (option 2)
Example:
export PORTAINER_URL=https://portainer.example.com
export PORTAINER_API_KEY=your-api-key-here
python run_server.py
Architecture:
- Environment setup and validation
- Configuration loading from environment variables
- Async server initialization and startup
- Graceful error handling and shutdown
"""
import os
import sys
import asyncio
from portainer_core.server import main
def setup_environment():
"""
Set up environment variables with fallback values for demo/testing.
This function ensures the required environment variables are set for the server
to start properly. It provides fallback values for demo purposes when specific
configuration is not provided.
Environment Variables Handled:
PORTAINER_URL: Sets default demo URL if not provided
PORTAINER_API_KEY: Sets placeholder if no authentication is configured
PORTAINER_USERNAME/PORTAINER_PASSWORD: Alternative authentication method
Raises:
None: This function doesn't raise exceptions but prints warnings for
missing configuration.
Side Effects:
- Modifies os.environ with default values
- Prints configuration messages to stdout
- Ensures minimum viable configuration for server startup
Note:
In production environments, always provide proper authentication
credentials rather than relying on demo/placeholder values.
"""
# Configure Portainer URL with fallback to demo instance
if not os.environ.get('PORTAINER_URL'):
os.environ['PORTAINER_URL'] = 'https://demo.portainer.io'
print("🔧 Using demo Portainer URL: https://demo.portainer.io")
# Configure authentication - requires either API key or username/password
has_api_key = os.environ.get('PORTAINER_API_KEY')
has_credentials = (os.environ.get('PORTAINER_USERNAME') and
os.environ.get('PORTAINER_PASSWORD'))
if not has_api_key and not has_credentials:
print("⚠️ No authentication configured. Set PORTAINER_API_KEY or PORTAINER_USERNAME/PORTAINER_PASSWORD")
print(" For demo purposes, using placeholder API key")
os.environ['PORTAINER_API_KEY'] = 'demo-api-key'
if __name__ == "__main__":
"""
Main execution block for the Portainer Core MCP Server.
This block handles the complete server lifecycle:
1. Environment setup and configuration validation
2. Async server initialization
3. Graceful error handling and shutdown
4. User-friendly status messages
Exit Codes:
0: Successful shutdown (user interrupt)
1: Server failure or configuration error
Flow:
1. Print startup messages and configuration requirements
2. Setup environment variables with fallbacks
3. Start async server using asyncio.run()
4. Handle interrupts and exceptions gracefully
"""
print("🚀 Starting Portainer Core MCP Server...")
print(" Configuration will be loaded from environment variables")
print(" Set PORTAINER_URL and PORTAINER_API_KEY (or username/password) before running")
print("")
# Initialize environment with fallback values for demo/testing
setup_environment()
try:
# Start the async MCP server - this blocks until shutdown
asyncio.run(main())
except KeyboardInterrupt:
# Handle graceful shutdown on Ctrl+C
print("\n👋 Server stopped by user")
sys.exit(0)
except Exception as e:
# Handle any startup or runtime errors
print(f"\n❌ Server failed: {e}")
sys.exit(1)