FortiGate MCP Server
Enables programmatic management of FortiGate firewall devices through MCP, supporting firewall policies, network objects, virtual IPs, routing, and interface management with Cursor IDE integration.
README
FortiGate MCP Server
FortiGate MCP Server - A comprehensive Model Context Protocol (MCP) server for managing FortiGate devices. This project provides programmatic access to FortiGate devices and enables integration with MCP-compatible tools like Cursor.
๐ Features
- Device Management: Add, remove, and test connections to FortiGate devices
- Firewall Management: List, create, update, and delete firewall rules
- Network Management: Manage address and service objects
- Routing Management: Manage static routes and interfaces
- HTTP Transport: MCP protocol over HTTP using FastMCP
- Docker Support: Easy installation and deployment
- Cursor Integration: Full integration with Cursor IDE
๐ Requirements
- Python 3.8+
- Access to FortiGate device
- API token or username/password
๐ ๏ธ Installation
1. Clone the Project
git clone <repository-url>
cd fortigate-mcp-server
2. Install Dependencies
# Create virtual environment
python -m venv .venv
source .venv/bin/activate # Linux/Mac
# or
.venv\Scripts\activate # Windows
# Install dependencies
pip install -r requirements.txt
3. Configuration
Edit the config/config.json file:
{
"fortigate": {
"devices": {
"default": {
"host": "192.168.1.1",
"port": 443,
"username": "admin",
"password": "password",
"api_token": "your-api-token",
"vdom": "root",
"verify_ssl": false,
"timeout": 30
}
}
},
"logging": {
"level": "INFO",
"file": "./logs/fortigate_mcp.log"
}
}
๐ Usage
Start HTTP Server
# Start with script
./start_http_server.sh
# Or manually
python -m src.fortigate_mcp.server_http \
--host 0.0.0.0 \
--port 8814 \
--path /fortigate-mcp \
--config config/config.json
Run with Docker
# Build and start
docker-compose up -d
# View logs
docker-compose logs -f fortigate-mcp-server
๐ง Cursor MCP Integration
1. Cursor MCP Configuration
Edit ~/.cursor/mcp_servers.json in Cursor:
Option 1: Command Connection
{
"mcpServers": {
"fortigate-mcp": {
"command": "python",
"args": [
"-m",
"src.fortigate_mcp.server_http",
"--host",
"0.0.0.0",
"--port",
"8814",
"--path",
"/fortigate-mcp",
"--config",
"/path/to/your/config.json"
],
"env": {
"FORTIGATE_MCP_CONFIG": "/path/to/your/config.json"
}
}
}
}
Option 2: URL Connection (Recommended)
{
"mcpServers": {
"FortiGateMCP": {
"url": "http://0.0.0.0:8814/fortigate-mcp/",
"transport": "http"
}
}
}
2. Using in Cursor
To use FortiGate MCP in Cursor:
- Start the server:
cd /media/workspace/fortigate-mcp-server
python -m src.fortigate_mcp.server_http --host 0.0.0.0 --port 8814 --path /fortigate-mcp --config config/config.json
- Restart Cursor
- Ensure MCP server is running
- Use FortiGate commands in Cursor
๐ API Commands
Device Management
list_devices- List registered devicesget_device_status- Get device statustest_device_connection- Test connectionadd_device- Add new deviceremove_device- Remove devicediscover_vdoms- Discover VDOMs
Firewall Management
list_firewall_policies- List firewall rulescreate_firewall_policy- Create new ruleupdate_firewall_policy- Update ruledelete_firewall_policy- Delete rule
Network Management
list_address_objects- List address objectscreate_address_object- Create address objectlist_service_objects- List service objectscreate_service_object- Create service object
Virtual IP Management
list_virtual_ips- List virtual IPscreate_virtual_ip- Create virtual IPupdate_virtual_ip- Update virtual IPget_virtual_ip_detail- Get virtual IP detaildelete_virtual_ip- Delete virtual IP
Routing Management
list_static_routes- List static routescreate_static_route- Create static routeupdate_static_route- Update static routedelete_static_route- Delete static routeget_static_route_detail- Get static route detailget_routing_table- Get routing tablelist_interfaces- List interfacesget_interface_status- Get interface status
System Commands
health- Health checktest_connection- Connection testget_schema_info- Schema information
๐งช Testing
Run Tests
# Run all unit tests (default)
python -m pytest
# Run with coverage
python -m pytest --cov=src --cov-report=html
# Run specific test categories
python -m pytest tests/test_device_manager.py
python -m pytest tests/test_fortigate_api.py
python -m pytest tests/test_tools.py
# Run integration tests (requires server running)
python integration_tests.py
# Run only unit tests (default)
python -m pytest tests/
# Run with verbose output
python -m pytest -v
# Run with detailed error information
python -m pytest --tb=long
Test Categories
- Unit Tests: Test individual components and functions
- Integration Tests: Test HTTP server functionality (requires server running)
- Coverage: Code coverage reporting with HTML output
HTTP Server Test
# Run test script
python test_http_server.py
Manual Testing
# Health check
curl -X POST http://localhost:8814/fortigate-mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "health", "params": {}}'
# List devices
curl -X POST http://localhost:8814/fortigate-mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "list_devices", "params": {}}'
๐ Project Structure
fortigate-mcp-server/
โโโ src/
โ โโโ fortigate_mcp/
โ โโโ __init__.py
โ โโโ server_http.py # HTTP MCP server
โ โโโ config/ # Configuration management
โ โโโ core/ # Core components
โ โโโ tools/ # MCP tools
โ โโโ formatting/ # Response formatting
โโโ config/
โ โโโ config.json # Main configuration
โ โโโ config.example.json # Example configuration
โโโ examples/
โ โโโ cursor_mcp_config.json # Cursor MCP config
โโโ logs/ # Log files
โโโ tests/ # Test files
โโโ docker-compose.yml # Docker compose
โโโ Dockerfile # Docker image
โโโ start_http_server.sh # Startup script
โโโ test_http_server.py # Test script
โโโ README.md # This file
๐ Troubleshooting
Common Issues
-
Connection Error
- Ensure FortiGate device is accessible
- Verify API token or username/password
- Use
verify_ssl: falsefor SSL certificate issues
-
Port Conflict
- Ensure port 8814 is available
- Change port using
--portparameter
-
Configuration Error
- Ensure
config.jsonis properly formatted - Check JSON syntax
- Ensure
-
Cursor MCP Connection Issue
- Ensure server is running
- Verify URL is correct
- Restart Cursor
Logs
Check logs using:
# HTTP server logs
tail -f logs/fortigate_mcp.log
# Docker logs
docker-compose logs -f fortigate-mcp-server
๐ Security
Recommendations
-
Use API Tokens
- Use API tokens instead of username/password
- Store tokens securely
-
SSL Certificate
- Use SSL certificates in production
- Set
verify_ssl: true
-
Network Security
- Run MCP server only on secure networks
- Restrict access with firewall rules
-
Rate Limiting
- Enable rate limiting
- Limit API calls
๐ค Contributing
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
๐ License
This project is licensed under the MIT License. See the LICENSE file for details.
๐ Acknowledgments
- FastMCP - For MCP HTTP transport
- FortiGate API - For FortiGate integration
- Cursor - For MCP support
๐ Support
For issues:
- Use the Issues page
- Check the documentation
- Review the logs
Note: This project has been tested with FortiGate devices. Please perform comprehensive testing before using in production.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
E2B
Using MCP to run code via e2b.