Connects Claude or other MCP hosts to Juniper's Routing Director platform for programmatic network management. Exposes device monitoring, configuration template deployment, VPN service management, and network topology visualization through Routing Director's API. Supports both basic auth and token-based authentication, runs over HTTP or stdio transport. You get tools for managing alarms, retrieving syslog messages, tracking KPIs, and handling customer configurations. Useful if you're already running Routing Director and want to integrate network operations into LLM workflows instead of switching between interfaces. Python based, requires an existing Routing Director instance and valid credentials to get started.
An MCP (Model Context Protocol) server that integrates with Juniper's Routing Director platform, providing intelligent access to network routing, assurance, optimization, and intelligence capabilities.
git clone https://github.com/Juniper/routing-director-mcp-server.git
cd routing-director-mcp-server
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
pip install -r requirements.txt
TBD
Create a config.json file with the following structure:
Basic Authentication:
{
"http_url": "https://your-routing-director-host/",
"org_id": "your-organization-id",
"auth": {
"type": "basic",
"username": "your-username@example.com",
"password": "your-password"
}
}
Token Authentication:
{
"http_url": "https://your-routing-director-host/",
"org_id": "your-organization-id",
"auth": {
"type": "token",
"token": "your-api-token"
}
}
Note: This authentication is between the MCP server and the Routing Director instance. The MCP server will handle authentication with Routing Director on behalf of clients connecting to it.
basic or tokencomponents field can be used to provide a list of components to filter the spec.Components can be one of the following:
ems - For alarms related info (searching, ack and unack of alarms reported on Routing Director)juniper-resiliency-interface - For device syslog info (retrieving syslog messages collected on Routing Director)device-kpi - For fetching exception events related to Juniper Resiliency Interface (JRI) collected on Routing Director(forwarding, routing and os)python RoutingDirectorMCP.py --config config.json
python RoutingDirectorMCP.py --help
Available options:
-H, --host: Server host (default: 127.0.0.1)-p, --port: Server port (default: 30030)-t, --transport: Transport type: streamable-http or stdio (default: streamable-http)-c, --config: Path to configuration file (required)-v, --verbose: Enable verbose loggingpython RoutingDirectorMCP.py \
--config config.json \
--host localhost \
--port 8000 \
--transport streamable-http \
--verbose
The server supports token-based authentication through a token manager. If a tokens file exists, authentication is automatically enabled for HTTP transports.
For stdio transport, authentication is bypassed as it's typically used in secure local environments.
You can use file-based token authentication for communication between an MCP client and MCP
server. To generate a token, execute the following command in your local system:
python utils/mcp/token_cli.py generate --client-id sv@juniper.net --description "Token for SV"
Where,
client-id - is an ID that you use for generating the authentication token.
The following is a sample of the generated output:
Generated new token:
ID: my-client
Token: apa_CA98sH_VwEBd79aHA6O9NxbhXQN_RqaK
Description: Production API
Save the generated token in a .tokens file. By default, the token is saved in the root directory of the GitHub MCP repository.
Enable detailed logging for debugging:
LOG_LEVEL=DEBUG python RoutingDirectorMCP.py --config config.json --verbose
Users can use any MCP Host (like Claude, Copilot, Chatgpt, etc.) to connect to the MCP server. When configuring the MCP Host, use the same transport type, host, and port as specified when starting the MCP server.
Configure Claude
To configure Claude:
~/Library/Application Support/Claude/claude_desktop_config.json
• On a Windows machine, open command prompt and enter: %APPDATA%\Claude\claude_desktop_config.json {
"mcpServers": {
"RoutingDirector": {
"command": "/Users/username/path-to-virtual-environment/.mcp_venv/bin/python",
"args": [
"/Users/username/path-to-mcp-python-script/RoutingDirectorMCP.py",
"-c",
"/Users/username/path-to-config-json/config.json",
"-t",
"stdio"
]
}
}
}
Claude is connected to the MCP server if the MCP server tools are listed under + > Connectors.
Configure Copilot : To configure Copilot:
~/Library/Application\ Support/Code/User/mcp.json
Where, user is your username on the macOS machine.C:/Users/YourUserName/AppData/Roaming/Code/User/mcp.json
Where, user is your username on the Windows machine.{
"mcpServers": {
"RoutingDirector": {
"command": "/Users/username/path-to-virtual-environment/.mcp_venv/bin/python",
"args": [
"/Users/username/path-to-mcp-python-script/RoutingDirectorMCP.py",
"-c", "/Users/username/path-to-config-json/config.json",
"-t", "stdio"
]
}
}
}
To ensure that the MCP server has started correctly, view the MCP server logs. The logs are
generated based on the type of communication with the AI agent:
• Starting MCP server 'Juniper Routing Directory' with transport 'stdio' if stdio is used.
• INFO Starting MCP server 'Juniper Routing Directory' with transport 'http' on http://127.0.0.1:30030/mcp if
streamable-http is used.
For more details on configuring the MCP Servers in the MCP Host Apps , please refer VScode Copilot: https://code.visualstudio.com/docs/copilot/customization/mcp-servers Claude: https://code.claude.com/docs/en/mcp
Solution: Ensure you provide the --config flag with a valid path to your configuration file.
Solution: Verify that your config.json includes all required keys: http_url, org_id, and auth.
Solution:
Solution:
--host and --port matching your client configurationSolution: For HTTP transports requiring authentication, ensure token files are properly initialized. For development/testing, this is typically acceptable.
Current version: v2.9.0
Juniper's Routing Director 2.9.0 User Guide: https://www.juniper.net/documentation/us/en/software/juniper-routing-director2.9.0/user-guide/index.html
Support for running junos operational and configurational commands on the MCP server using the execute_junos_command(for operational commands) and junos_config_set, junos_config_diff and junos_config_commit (for configuration commands) tools. This allows users to push configuration changes to Junos devices directly from the MCP server. For more details please refer the documentation: https://www.juniper.net/documentation/us/en/software/juniper-routing-director2.9.0/user-guide/topics/topic-map/mcp-server-use.html
Bug fixes
The MCP server's command blacklist only covers operational mode commands. Destructive configuration commands — such as delete, rollback factory, load factory-default, and their NETCONF equivalents — are not blocked and can be executed if triggered by a user prompt or LLM-generated action, potentially causing loss of critical device configuration. Workaround: We recommend that you avoid prompts that may trigger destructive configuration changes. Additionally, enable the MCP approval workflow to require manual confirmation before any configuration-changing commands are executed on devices.
When the http_url in the MCP configuration file (config.json) ends with a trailing slash (/) and when the Routing Director's MCP server functionality (junos_config_commit tool call) for pushing commits onto the Junos device is called, the MCP server incorrectly constructs the API URL with a double slash (//). This results in a 400 Bad Request error and fails to execute the tool call. Workaround: Ensure the http_url in the MCP server’s config.json does not include a trailing slash. Use http_url": "https://" instead of http_url": "https:///".
In Routing Director's Model Context Protocol (MCP) integration, inconsistent argument naming for MAC address parameters across multiple tools (For example, mac, router_mac, device_mac) causes the AI model to hallucinate incorrect argument names. Workaround: If you are encountering this issue, you can retry the query or explicitly specify the correct argument name in the prompt to guide the MCP co-pilot toward the right parameter. You can refer to the MCP tool documentation for the exact expected parameter name, which can help avoid hallucination errors.
This MCP server integrates with Juniper Networks' Routing Director platform, providing enterprise-grade network intelligence and optimization capabilities.