Skip to main content
Glama
dhippley

Azure Topology Graph MCP Server

by dhippley
README.md
# Azure Topology Graph MCP Server

A Model Context Protocol (MCP) server that queries Azure Resource Graph, ARM, and Network Watcher to create topology maps that Cursor can explore.

## Features

- **Resource Inventory**: Query resources across multiple subscriptions using Azure Resource Graph
- **Detailed Configuration**: Pull detailed configuration for specific resources using ARM APIs
- **Network Topology**: Build network topology using Azure Network Watcher
- **Graph Representation**: Represent infrastructure as nodes and edges
- **MCP Tools**: Expose powerful tools for searching, exploring, and analyzing Azure infrastructure

## Available Tools

- `search_resources`: Search Azure resources by name, type, or other properties
- `get_resource`: Get detailed information about a specific Azure resource
- `get_neighbors`: Get resources connected to a specific resource
- `find_path`: Find connection paths between two Azure resources
- `export_topology`: Export the complete topology graph (JSON or summary)
- `refresh_topology`: Refresh the topology cache by re-querying Azure

## Prerequisites

1. **Azure Service Principal**: You need an Azure service principal with appropriate permissions
2. **Azure Permissions**: The service principal needs at least `Reader` access to the subscriptions and resource groups you want to query
3. **Node.js**: Version 16 or later

## Setup

### 1. Clone and Install Dependencies

```bash
git clone <your-repo-url>
cd azure_mcp_graph
npm install
```

### 2. Configure Azure Credentials

Create a `.env` file in the project root:

```ini
AZURE_TENANT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
AZURE_CLIENT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
AZURE_CLIENT_SECRET=your-service-principal-secret
SUBSCRIPTION_IDS=sub-id-1,sub-id-2,sub-id-3
DEFAULT_RG=MyWorkloadRG
DEFAULT_REGION=eastus
NETWORK_WATCHER_NAME=NetworkWatcher_eastus
```

### 3. Build the Server

```bash
npm run build
```

### 4. Configure Cursor MCP

Add the following to your Cursor MCP configuration file (usually `~/.cursor/config.json`):

```jsonc
{
  "mcpServers": {
    "azure-graph": {
      "command": "node",
      "args": ["/path/to/azure_mcp_graph/dist/server.js"],
      "env": {
        "AZURE_TENANT_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "AZURE_CLIENT_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "AZURE_CLIENT_SECRET": "your-service-principal-secret",
        "SUBSCRIPTION_IDS": "sub-id-1,sub-id-2,sub-id-3",
        "DEFAULT_RG": "MyWorkloadRG",
        "DEFAULT_REGION": "eastus",
        "NETWORK_WATCHER_NAME": "NetworkWatcher_eastus"
      }
    }
  }
}
```

## Usage Examples

Once configured, you can use the following commands in Cursor:

### Search for Resources
```
Search for all virtual machines in my infrastructure
```

### Explore Resource Relationships
```
Show me all resources connected to my VM named "web-server-01"
```

### Find Connectivity Paths
```
Find the network path between my application gateway and backend VMs
```

### Export Topology
```
Export a summary of my entire Azure topology
```

## Development

### Run in Development Mode
```bash
npm run dev
```

### Build
```bash
npm run build
```

### Clean Build Output
```bash
npm run clean
```

## Architecture

The server consists of several key components:

- **Azure Clients**: Interfaces with Azure Resource Graph, ARM, and Network Watcher APIs
- **Graph Builder**: Constructs topology graphs from Azure resource data
- **Relationship Analyzer**: Identifies and builds relationships between resources
- **MCP Tools**: Exposes functionality through the Model Context Protocol
- **Caching**: Intelligent caching with configurable TTL for performance

## Troubleshooting

### Authentication Issues
- Ensure your service principal has the correct permissions
- Verify your Azure credentials are correctly configured
- Check that your subscription IDs are valid and accessible

### Performance Issues
- The server caches topology data for 5 minutes by default
- Use `refresh_topology` tool to force a cache refresh
- Consider filtering by resource type for large subscriptions

### Network Issues
- Ensure your environment has access to Azure APIs
- Check firewall and proxy settings if running behind corporate networks

## Contributing

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Test thoroughly
5. Submit a pull request

## License

This project is licensed under the ISC License - see the package.json file for details.

TDQS

B3.4/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: export_topology for full graph export, find_path for pathfinding between resources, get_neighbors for adjacency queries, get_resource for detailed resource info, refresh_topology for cache updates, and search_resources for filtering. No ambiguity exists as they target different operations on Azure topology data.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern with clear, descriptive names (e.g., export_topology, find_path, get_neighbors). The naming is uniform across all six tools, using lowercase with underscores, making them predictable and easy to understand.

Tool Count5/5

With 6 tools, the server is well-scoped for managing Azure topology graphs. Each tool serves a specific, non-redundant function, covering key operations like querying, searching, pathfinding, and cache management without being overly sparse or bloated.

Completeness4/5

The toolset provides strong coverage for querying and analyzing Azure topology, including CRUD-like operations (get, search, refresh) and graph-specific functions (export, find_path, get_neighbors). A minor gap might be the lack of tools for modifying or annotating the topology, but core workflows are well-supported.