PowerShell コンソールを MCP サーバーにする

## はじめに
LLM が PowerShell のコンソールにコマンドを入力して、いろんな処理を自動でやってくれたら便利ですよね。これを実現する PowerShell モジュールを開発したのでご紹介します。

<iframe width="560" height="315" src="https://www.youtube.com/embed/pm4kl9-JDtE?si=d01Cx1oUs1xDBuvq" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

### 開発の動機
私は [UiPath Orchestrator](https://qiita.com/ytsuda/items/a411b1d951086312f3fc) をコマンドレットで操作する PowerShell モジュール [UiPathOrch](https://www.powershellgallery.com/packages/UiPathOrch) を開発しています。私はこれを、自然言語でも操作できるようにしたいと考えました。

そこで MCP サーバーを実装してみたところ、とても強力なものになりました。そこで、UiPathOrch の一機能とせず、別の PowerShell モジュール [PowerShell.MCP](https://www.powershellgallery.com/packages/PowerShell.MCP) としてリリースしました。

このモジュールをインポートした PowerShell コンソールには、LLM が任意のコマンドを入力して実行できるようになります。この実行結果は PowerShell コンソールに表示され、かつ LLM にも送られます。

ほかのモジュールをインストールしたら、LLM はその中に含まれるコマンドレットの使い方を Get-Help で学習できます。また LLM は、git のように広く使われている CLI コマンドの使い方もよく知っています。そのため、LLM はこれらのさまざまなコマンドをパイプやスクリプトで組み合わせて、高度な処理を簡単に行えるようになります。

LLM が構築したコマンドテキストは、PowerShell コンソールに入力・提示するだけとして、実行はしないこともできます（実行の要否は、LLM が自動で判断します）。そこで、ユーザーはこのモジュールを通して、さまざまなコマンドレットや CLI ツールの使い方を LLM に教えてもらうこともできます。LLM が提示もしくは実行したコマンドの履歴は、ユーザーは PowerShell コンソールで ↑ キーを押して呼び出し、パラメータを編集してから Enter を押して実行することもできます。

この記事では、この強力な MCP サーバーのインストール手順をご紹介します。これを使って UiPath Orchestrator を自然言語で操作する方法は、後日別の記事でご紹介したいと思います。

:::note info
[PowerShell Gallery](https://www.powershellgallery.com) には 14,000 以上のモジュールが公開されており、Azure/AWS 管理、REST API 連携、セキュリティ管理、Active Directory 管理など、企業レベルの作業を簡単に自動化できます。
:::

:::note info
[PowerShell.MCP](https://www.powershellgallery.com/packages/PowerShell.MCP) は、任意の PowerShell モジュールを自然言語で操作できるようにする MCP サーバーです。[プロンプトの例](https://qiita.com/ytsuda/private/6c6fbb1e091cb684f9a6#%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AE%E4%BE%8B) をここに示しました。
:::

## 基本的な用語

### LLM（大規模言語モデル）とは
* 膨大なテキストデータから言語パターンを学習し、人間のような自然な文章やコードを生成するモデル。

### MCP（Model Context Protocol）とは
* LLM が、外部のツールやサービスに作業を依頼するための通信プロトコル。
* ホテル予約や株式取引など、実際の業務を完全に自動化することが期待されています。

### PowerShell とは
* .NET 上で動作する、クロスプラットフォームシェル兼スクリプト言語。
* コマンドレット：.NET クラスとして実装された特殊なコマンド（例：`Get-Process`、`Where-Object`）。  
* パイプ（`|`）：コマンドレットや関数、スクリプト、外部コマンド間で .NET オブジェクトを受け渡す仕組み。
* パイプライン：パイプでつなげた一連のコマンド（例：`Get-Process | Where-Object { … } | Sort-Object`）。複雑な処理を簡潔に記述できます。

## MCP サーバー（PowerShell）の設定手順
### 1. **PowerShell 7 をインストール（初回のみ）**
まず、PowerShell 7 をインストールしてください。
- Windows 10 は、[MSI パッケージをダウンロード](https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.5#installing-the-msi-package) して実行します。
- Windows 11 は、[WinGet で PowerShell 7 をインストール](https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.5#install-powershell-using-winget-recommended) します。（MSI でもインストールできます。）

:::note warn
Windows には、既定で PowerShell 5 がインストールされていますが、本モジュールの利用には PowerShell 7 が必要です。
:::

### 2. **PowerShell 7 を起動**
[Win+R] pwsh [Enter] で起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3377536/6e67bd64-a13d-4e9c-ac05-bfce10ddb61e.png)

:::note info
- PowerShell 7 のコマンド名は pwsh.exe です。
- PowerShell 5 のコマンド名は powershell.exe です。
:::

### 3.  **PowerShell.MCP のインストール**（初回のみ）
あなたの PC に PowerShell.MCP モジュールをダウンロードします。
```console:powershell
PS> Install-Module PowerShell.MCP
```
インストールして良いか確認を求めてくるので、Y を入力してください。

:::note info
PowerShell.MCP を最新バージョンに更新するには、次のようにします。
```console:powershell
PS> Update-Module PowerShell.MCP
```
このあと、MCP クライアントの設定ファイルも忘れずに修正してください。
:::

### 4. **PowerShell.MCP のインポート**
インストールしたモジュールは、PowerShell コンソールにインポートすると使えるようになります。PowerShell.MCP の実行には PSReadLine モジュールも必要なので、ここで一緒にインポートしましょう。
```console:powershell
PS> Import-Module PowerShell.MCP, PSReadLine
```
PowerShell.MCP モジュールをインポートすると、すぐに MCP サーバーが起動します。

:::note info
MCP サーバーを停止するには、PowerShell コンソールを閉じてください。あるいは、次のようにしても停止できます。
```console:powershell
PS> Remove-Module PowerShell.MCP
```
:::

:::note info
PowerShell コンソール起動時にモジュールを自動でインポートするには、プロファイルスクリプトに次の行を追加します。
```text:Microsoft.PowerShell_profile.ps1
Import-Module PowerShell.MCP, PSReadLine
```
:::
:::note info
プロファイルスクリプトをメモ帳で開くには、次のようにします。
```console:powershell
PS> notepad $profile
```
:::

## MCP クライアント（Claude for Desktop） の設定手順
MCP クライアントとして、Claude for Desktop を使う場合の手順です。
### 1. **Claude for Desktop のインストール**（初回のみ）
Claude を初めてお使いになる場合には、[サインアップ](https://claude.ai/referral/3PaszxkpUQ) が必要です。無料で利用できます。[Claude for Desktop](https://claude.ai/download) をダウンロードして、インストールしてください。

### 2. **Claude for Desktop の設定ファイルを編集**（初回のみ）
Claude for Desktop を起動したら、左上のメニューから [ファイル] -> [設定...] を選択します。左側の [開発者] を選択し、[構成を編集] をクリックしてください。設定ファイルを含むフォルダーが開くので、claude_desktop_config.json を探してテキストエディタで開いてください。次のように記載します。

```text:claude_desktop_config.json
{
  "mcpServers": {
    "PowerShell": { "command": "<ModuleBase>\\bin\\PowerShell.MCP.Proxy.exe" }
  }
}
```
:::note warn
パスに含まれる `\` は、`\\` としてエスケープする必要があることに注意してください。
:::

`"command":` には、PowerShell.MCP のインストールディレクトリに配置されている PowerShell.MCP.Proxy.exe のパスを入力します。このパスは、PowerShell コンソールで次のようにして確認できます。

```console:powershell
PS> (Get-Module PowerShell.MCP).ModuleBase
```
:::note info
PowerShell の自動補完入力機能は、とても強力です。Tab もしくは Ctrl+Space を押すと、コマンドレットの名前、パラメータ名、パラメータ値などを自動で入力できます。
:::

:::note info
PowerShell コンソールに何かを入力すると、それに続く予測入力テキストが薄い字で表示されることがあります。これは、カーソルの右キーで確定できます。
:::

### セットアップ完了！
以上で、セットアップは完了です。Claude for Desktop を終了し、再起動してください。

:::note warn
Claude for Desktop を終了するには、左上のメニューから [ファイル] -> [終了] を選択します。ウィンドウ右上の X ボタンでは終了しないので注意してください。
:::

## MCP クライアント（VS Code GitHub Copilot）の設定手順
MCP クライアントとして、VS Code の [GitHub Copilot](https://docs.github.com/copilot/using-github-copilot/getting-code-suggestions-in-your-ide-with-github-copilot) を使う場合の手順です。
1. VS Code 左下にある歯車から設定を開く。
2. 上部の検索ボックスで mcp を検索。
3. `Chat > Mcp: Enabled` にチェックを付ける。
4. settings.json を編集し、`"mcp":` 配下の `"servers":` に次の行を追加して `▷Start` をクリック。
```text:settings.json
    "mcp": {
        "servers": {
            "PowerShell": { "command": "<ModuleBase>\\bin\\PowerShell.MCP.Proxy.exe" }
        }
    }
```
`<ModuleBase>` は、[この手順](#2-claude-for-desktop-%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%B7%A8%E9%9B%86%E5%88%9D%E5%9B%9E%E3%81%AE%E3%81%BF) で確認してください。
5\.  ウィンドウ右上にある Chat アイコンから、Chat を開く。
6. プロンプト入力ボックスの下にある選択肢で `Agent` を選択。

### セットアップ完了！
以上で、セットアップは完了です。プロンプトを試してください。

:::note info
MCP クライアントとして、[Cline](https://github.com/cline/cline/blob/main/locales/ja/README.md) を使うこともできます。
:::

## プロンプトの例
Claude for Desktop（もしくは VS Code）にいろいろなプロンプトを入力して、PowerShell コンソールを操作できることを確認しましょう。

* PowerShell で、現在の日時を教えてください
* 現在実行中のプロセスを表示してください
* 100Mb 以上のメモリを消費しているプロセスを、CPU 使用率で降順に表示してください
* インポート済みのモジュールを確認し、それらのモジュールに含まれているコマンドレットの使い方を Get-Help で確認してください
* イベントログで直近1週間に発生したエラーを確認して、htmlファイルでレポートを作成し、ブラウザで開いてください
* この PC にインストールされているプログラムの一覧を CSV (BOMつきUTF8) で作成し、Excel で開いてください
* この PC のセキュリティの状態を確認してレポートしてください
* c:\tmp フォルダにあるファイルのハッシュを計算して、中身が同一のファイルがないか確認してください
* c:\Project フォルダの配下にあるプログラムのソースファイルの行数を数えて表に整理してください
* PowerShell で、アスキーアートを書いてください
* PowerShell.MCP の使い心地を教えてください。使ってみて、どのように感じましたか？

::: note info
このほか、[PowerShell.MCP](https://www.powershellgallery.com/packages/PowerShell.MCP) のページで多くのプロンプトを紹介しています。
:::

::: note warn
PowerShell.MCP は、任意のコマンドを実行できます。そのため、次のようなシステムを壊す可能性がある危険なプロンプトは与えないでください。
* C:\ ドライブのすべてのファイルを削除してください
* レジストリを変更してください
:::

::: note warn
PowerShell.MCP は、別の PC のクライアントからは接続できないようになっています。しかし念のため、使い終わったら必ず PowerShell コンソールを終了しておきましょう。
:::

## PowerShell.MCP の制限事項
* PowerShell 7 はクロスプラットフォームでありLinux 環境でも動きますが、PowerShell.MCP モジュールは Windows 環境でのみ動作します。
* PowerShell.MCP が起動して実行中のパイプラインは、Ctrl+C を押しても実行をキャンセルできません。時間がかかる処理を実行させるときは注意してください。
* ユーザーが PowerShell コンソールで実行したコマンドの実行結果は、LLM に送信されません。
* PowerShell.MCP を使うと、LLM がすごい勢いで自動で動いていきます。フリープランをお使いの場合には、すぐに利用制限に達することがあるのでご注意ください。

:::note info
Microsoft は PowerShell と LLM を統合するツールとして [AI Shell](https://learn.microsoft.com/powershell/utility-modules/aishell/overview) を公開していますが、LLM が自動でコマンドを即時実行することはできず、[ユーザーが Enter キーを押して実行](https://learn.microsoft.com/powershell/utility-modules/aishell/get-started/aishell-powershell#inserting-code) する必要があります。これは、PowerShell の [入力ループ](https://ja.wikipedia.org/wiki/REPL) がホスト側で同期的に動作しており、外部から Enter キーを送信できないためと考えられます。また、コマンドの出力を LLM に返すには、専用の [コマンドレット](https://learn.microsoft.com/powershell/utility-modules/aishell/get-started/aishell-powershell#invoking-ai-shell) にパイプしなければなりません。
一方で、PowerShell.MCP は実装を工夫することで上記の制約を解除し、LLM からの指示を自動で即時実行でき、その出力も自動で PS コンソールと LLM の両方に返すことができます。
:::

## まとめ
PowerShell.MCP モジュールにより、LLM と PowerShell の強力な連携が実現します。これまで手動で行っていた複雑なソフトウェア開発やシステム管理、クラウドサービスの操作などが、自然言語の指示で自動化できるようになります。

特に、PowerShell の豊富なモジュールに含まれるさまざまなコマンドレットをパイプで連結することで、複雑な操作を簡単に行えるのは大きなメリットです。ぜひご活用ください。