getMCPNetworkMigrationCodemod creates a codemod for migrating per-server MCP network configuration to top-level network configuration
()
| 13 | |
| 14 | // getMCPNetworkMigrationCodemod creates a codemod for migrating per-server MCP network configuration to top-level network configuration |
| 15 | func getMCPNetworkMigrationCodemod() Codemod { |
| 16 | return Codemod{ |
| 17 | ID: "mcp-network-to-top-level-migration", |
| 18 | Name: "Migrate MCP network config to top-level", |
| 19 | Description: "Moves per-server MCP 'network.allowed' configuration to top-level workflow 'network.allowed'. Per-server network configuration is deprecated.", |
| 20 | IntroducedIn: "0.6.0", |
| 21 | Apply: func(content string, frontmatter map[string]any) (string, bool, error) { |
| 22 | // Check if mcp-servers section exists |
| 23 | mcpServersValue, hasMCPServers := frontmatter["mcp-servers"] |
| 24 | if !hasMCPServers { |
| 25 | return content, false, nil |
| 26 | } |
| 27 | |
| 28 | mcpServersMap, ok := mcpServersValue.(map[string]any) |
| 29 | if !ok { |
| 30 | return content, false, nil |
| 31 | } |
| 32 | |
| 33 | // Collect all network.allowed domains from MCP servers |
| 34 | var allAllowedDomains []string |
| 35 | serversWithNetwork := make(map[string]struct { |
| 36 | }) |
| 37 | |
| 38 | for serverName, serverValue := range mcpServersMap { |
| 39 | serverConfig, ok := serverValue.(map[string]any) |
| 40 | if !ok { |
| 41 | continue |
| 42 | } |
| 43 | |
| 44 | // Check if this server has a network configuration |
| 45 | networkValue, hasNetwork := serverConfig["network"] |
| 46 | if !hasNetwork { |
| 47 | continue |
| 48 | } |
| 49 | |
| 50 | networkMap, ok := networkValue.(map[string]any) |
| 51 | if !ok { |
| 52 | continue |
| 53 | } |
| 54 | |
| 55 | // Extract allowed domains |
| 56 | allowedValue, hasAllowed := networkMap["allowed"] |
| 57 | if !hasAllowed { |
| 58 | continue |
| 59 | } |
| 60 | |
| 61 | // Convert allowed to []string |
| 62 | switch allowed := allowedValue.(type) { |
| 63 | case []any: |
| 64 | for _, domain := range allowed { |
| 65 | if domainStr, ok := domain.(string); ok { |
| 66 | allAllowedDomains = append(allAllowedDomains, domainStr) |
| 67 | } |
| 68 | } |
| 69 | // Only mark server as having network if it has domains |
| 70 | if len(allowed) > 0 { |
| 71 | serversWithNetwork[serverName] = struct { |
| 72 | }{} |