Private/Get-MetroMcpServerConfig.ps1
|
function Get-MetroMcpServerConfig { <# .SYNOPSIS Retrieves MCP server configuration for the specified agent. .DESCRIPTION Reads the agent definition and returns the MCP server entry that matches the provided label, falling back to the single configured server when no label is supplied. .PARAMETER AgentId The agent identifier. .PARAMETER ServerLabel Optional label to select a specific MCP server. If omitted and exactly one server exists, that server is returned. An error is thrown when multiple servers exist and no label is supplied. .OUTPUTS Hashtable containing at least `server_label` and, when available, `server_url`. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [Alias('AssistantId')] [string]$AgentId, [Parameter(Mandatory = $false)] [string]$ServerLabel ) $resource = Get-MetroAIResource -AgentId $AgentId -ErrorAction Stop $servers = @{} if ($resource.tool_resources) { $mcpResources = $resource.tool_resources.mcp if ($mcpResources) { # Handle structure where mcp.servers is a dictionary keyed by server_label $serversProperty = $mcpResources.servers if ($serversProperty) { if ($serversProperty -is [System.Collections.IDictionary]) { foreach ($label in $serversProperty.Keys) { $value = $serversProperty[$label] $servers[$label] = @{ server_label = $label server_url = if ($value -is [string]) { $value } elseif ($value.server_url) { $value.server_url } else { $null } require_approval = if ($value.require_approval) { $value.require_approval } else { $null } } } } elseif ($serversProperty -is [System.Collections.IEnumerable]) { foreach ($entry in $serversProperty) { if ($entry) { $label = $entry.server_label if ($label) { $servers[$label] = @{ server_label = $label server_url = $entry.server_url require_approval = $entry.require_approval } } } } } } elseif ($mcpResources -is [System.Collections.IEnumerable] -and $mcpResources -isnot [string]) { foreach ($entry in $mcpResources) { if ($entry) { $label = $entry.server_label if ($label) { $servers[$label] = @{ server_label = $label server_url = $entry.server_url require_approval = $entry.require_approval } } } } } elseif ($mcpResources.server_label) { $servers[$mcpResources.server_label] = @{ server_label = $mcpResources.server_label server_url = $mcpResources.server_url require_approval = $mcpResources.require_approval } } } } if ($resource.tools) { foreach ($tool in $resource.tools) { if ($tool.type -eq 'mcp' -and $tool.server_label) { $label = $tool.server_label if (-not $servers.ContainsKey($label)) { $servers[$label] = @{ server_label = $label } } if ($tool.server_url) { $servers[$label].server_url = $tool.server_url } } } } $resolvedLabel = $ServerLabel if (-not $resolvedLabel) { if ($servers.Count -eq 1) { $resolvedLabel = ($servers.Keys | Select-Object -First 1) } elseif ($servers.Count -gt 1) { throw "Multiple MCP servers are configured for agent '$AgentId'. Specify -McpServerLabel or provide -McpToolOverrides." } } if ($resolvedLabel) { if ($servers.ContainsKey($resolvedLabel)) { return $servers[$resolvedLabel] } else { # Return minimal definition so the label can still be referenced return @{ server_label = $resolvedLabel } } } return $null } |