@@ -20,6 +20,54 @@ $ErrorActionPreference = "Stop"
20
20
21
21
$toolInstallDirectory = $InstallDirectory ? $InstallDirectory : (Get-CommonInstallDirectory )
22
22
23
+ $mcpMode = $Run
24
+
25
+ # Log to console or MCP client json-rpc
26
+ function log ([object ]$message , [switch ]$warn , [switch ]$err ) {
27
+ [string ]$messageString = $message
28
+
29
+ # Assume we are in an MCP client context when `-Run` is specified
30
+ # otherwise print to console normally
31
+ if (! $mcpMode ) {
32
+ if ($err ) {
33
+ Write-Error $messageString - ErrorAction Continue
34
+ }
35
+ elseif ($warn ) {
36
+ Write-Warning $messageString
37
+ }
38
+ else {
39
+ Write-Host $messageString
40
+ }
41
+ return ;
42
+ }
43
+
44
+ $level = switch ($message ) {
45
+ { $_ -is [System.Management.Automation.ErrorRecord ] } { ' error' }
46
+ { $_ -is [System.Management.Automation.WarningRecord ] } { ' warning' }
47
+ default { ' notice' }
48
+ }
49
+
50
+ # If message stringifies as a valid error message we want to print it
51
+ # otherwise print stack for calls to external binaries
52
+ if ($messageString -eq ' System.Management.Automation.RemoteException' ) {
53
+ $messageString = $message.ScriptStackTrace
54
+ }
55
+
56
+ # Log json-rpc messages so the MCP client doesn't print
57
+ # '[warning] Failed to parse message:'
58
+ $messageObject = @ {
59
+ jsonrpc = " 2.0"
60
+ method = " notifications/message"
61
+ params = @ {
62
+ level = $level
63
+ logger = " installer"
64
+ data = $messageString
65
+ }
66
+ }
67
+
68
+ Write-Host ($messageObject | ConvertTo-Json - Depth 100 - Compress)
69
+ }
70
+
23
71
if ($UpdateVsCodeConfig ) {
24
72
$vscodeConfigPath = Join-Path $PSScriptRoot " .." " .." " .." " .vscode" " mcp.json"
25
73
if (Test-Path $vscodeConfigPath ) {
@@ -45,7 +93,7 @@ if ($UpdateVsCodeConfig) {
45
93
}
46
94
}
47
95
$vscodeConfig.servers = $orderedServers
48
- Write-Host " Updating vscode mcp config at $vscodeConfigPath "
96
+ log " Updating vscode mcp config at $vscodeConfigPath "
49
97
$vscodeConfig | ConvertTo-Json - Depth 10 | Set-Content - Path $vscodeConfigPath - Force
50
98
}
51
99
@@ -54,12 +102,36 @@ if ($UpdateVsCodeConfig) {
54
102
$tmp = $env: TEMP ? $env: TEMP : [System.IO.Path ]::GetTempPath()
55
103
$guid = [System.Guid ]::NewGuid()
56
104
$tempInstallDirectory = Join-Path $tmp " azsdk-install-$ ( $guid ) "
57
- $tempExe = Install-Standalone - Tool `
58
- - Version $Version `
59
- - FileName $FileName `
60
- - Package $Package `
61
- - Directory $tempInstallDirectory `
62
- - Repository $Repository
105
+
106
+ if ($mcpMode ) {
107
+ try {
108
+ # Swallow all output and re-log so we can wrap any
109
+ # output from the inner function as json-rpc
110
+ $tempExe = Install-Standalone - Tool `
111
+ - Version $Version `
112
+ - FileName $FileName `
113
+ - Package $Package `
114
+ - Directory $tempInstallDirectory `
115
+ - Repository $Repository `
116
+ * > & 1
117
+ | Tee-Object - Variable _
118
+ | ForEach-Object { log $_ ; $_ }
119
+ | Select-Object - Last 1
120
+ }
121
+ catch {
122
+ log - err $_
123
+ exit 1
124
+ }
125
+ }
126
+ else {
127
+ $tempExe = Install-Standalone - Tool `
128
+ - Version $Version `
129
+ - FileName $FileName `
130
+ - Package $Package `
131
+ - Directory $tempInstallDirectory `
132
+ - Repository $Repository `
133
+
134
+ }
63
135
64
136
if (-not (Test-Path $toolInstallDirectory )) {
65
137
New-Item - ItemType Directory - Path $toolInstallDirectory - Force | Out-Null
@@ -68,12 +140,13 @@ $exeName = Split-Path $tempExe -Leaf
68
140
$exeDestination = Join-Path $toolInstallDirectory $exeName
69
141
Copy-Item - Path $tempExe - Destination $exeDestination - Force
70
142
71
- Write-Host " Package $package is installed at $exeDestination "
143
+ log " Package $package is installed at $exeDestination "
72
144
if (! $UpdatePathInProfile ) {
73
- Write-Warning " To add the tool to PATH for new shell sessions, re-run with -UpdatePathInProfile to modify the shell profile file."
74
- } else {
145
+ log - warn " To add the tool to PATH for new shell sessions, re-run with -UpdatePathInProfile to modify the shell profile file."
146
+ }
147
+ else {
75
148
Add-InstallDirectoryToPathInProfile - InstallDirectory $toolInstallDirectory
76
- Write-Warning " '$exeName ' will be available in PATH for new shell sessions."
149
+ log - warn " '$exeName ' will be available in PATH for new shell sessions."
77
150
}
78
151
79
152
if ($Run ) {
0 commit comments