Skip to main content
Glama
juststank

FortiGate MCP Server

by juststank

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" } } } }
{ "mcpServers": { "FortiGateMCP": { "url": "http://0.0.0.0:8814/fortigate-mcp/", "transport": "http" } } }

2. Using in Cursor

To use FortiGate MCP in Cursor:

  1. 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
  1. Restart Cursor

  2. Ensure MCP server is running

  3. Use FortiGate commands in Cursor

πŸ“š API Commands

Device Management

  • list_devices - List registered devices

  • get_device_status - Get device status

  • test_device_connection - Test connection

  • add_device - Add new device

  • remove_device - Remove device

  • discover_vdoms - Discover VDOMs

Firewall Management

  • list_firewall_policies - List firewall rules

  • create_firewall_policy - Create new rule

  • update_firewall_policy - Update rule

  • delete_firewall_policy - Delete rule

Network Management

  • list_address_objects - List address objects

  • create_address_object - Create address object

  • list_service_objects - List service objects

  • create_service_object - Create service object

Virtual IP Management

  • list_virtual_ips - List virtual IPs

  • create_virtual_ip - Create virtual IP

  • update_virtual_ip - Update virtual IP

  • get_virtual_ip_detail - Get virtual IP detail

  • delete_virtual_ip - Delete virtual IP

Routing Management

  • list_static_routes - List static routes

  • create_static_route - Create static route

  • update_static_route - Update static route

  • delete_static_route - Delete static route

  • get_static_route_detail - Get static route detail

  • get_routing_table - Get routing table

  • list_interfaces - List interfaces

  • get_interface_status - Get interface status

System Commands

  • health - Health check

  • test_connection - Connection test

  • get_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

  1. Connection Error

    • Ensure FortiGate device is accessible

    • Verify API token or username/password

    • Use verify_ssl: false for SSL certificate issues

  2. Port Conflict

    • Ensure port 8814 is available

    • Change port using --port parameter

  3. Configuration Error

    • Ensure config.json is properly formatted

    • Check JSON syntax

  4. 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

  1. Use API Tokens

    • Use API tokens instead of username/password

    • Store tokens securely

  2. SSL Certificate

    • Use SSL certificates in production

    • Set verify_ssl: true

  3. Network Security

    • Run MCP server only on secure networks

    • Restrict access with firewall rules

  4. Rate Limiting

    • Enable rate limiting

    • Limit API calls

🀝 Contributing

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/amazing-feature)

  3. Commit your changes (git commit -m 'Add amazing feature')

  4. Push to the branch (git push origin feature/amazing-feature)

  5. Open a Pull Request

πŸ“„ License

This project is licensed under the MIT License. See the LICENSE file for details.

πŸ™ Acknowledgments

πŸ“ž 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.

-
security - not tested
A
license - permissive license
-
quality - not tested

Latest Blog Posts

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/juststank/ftg_mcp'

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