Cursor の AI エージェントを、MCP サーバーを介して SSH でサーバーに接続する方法を紹介します。しかも、秘密鍵がエージェントの環境に着地することは一切ありません。まず、なぜそうするのかから。Cursor のエージェントはリポジトリの中では快適に動きます。ですがタスクがリポジトリを離れた瞬間、SSH が必要になります。なぜサービスが起動しないか調べる、マイグレーションを流す、実機の上で nginx の設定を直す、といった場面です。そして居心地の悪い点があります。Cursor のエージェントはあなたのマシンでターミナルコマンドを実行するので、鍵が ~/.ssh やアンロック済みの ssh-agent に置いてあると、エージェントに何かを「渡す」必要すらありません。ssh prod はすでに動くのです。あなたは決断したわけでもないのに、既定でフルのサーバーアクセスを与えてしまっています。
もっと良い構えがあります。エージェントは依頼し、あなたが管理する何かが認証を行う、という形です。なぜ鍵を貼り付ける経路は取り消せない一手なのかと、MCP サーバーとは実際に何なのかについては別の記事で書いてきました(どちらも英語)。この記事は、その Cursor 向けの実践版です。20 分、VPS 1 台、鍵がエージェントの手の届く範囲に入ることは一切なし。
必要なもの
- Termalin——デスクトップアプリで、Free プランで十分です。MCP サーバーを内蔵した SSH クライアントで、Cursor が話す相手はこのサーバーです。
- 同じマシン上の Cursor。
- Termalin に保存したホストを 1 つ。最初の実行には、失っても困らないものを選びます。ステージング、お遊び用の VPS、RSS リーダーしか動いていないマシンなどです。
ステップ 1:エージェントアクセスを有効化する
エージェントアクセスは既定でオフです。Termalin で 設定 →「エージェントアクセス (MCP)」 を開いて有効化し、エージェントが到達してよいホストにチェックを入れます。そのリストの外にあるものは、Cursor から見れば存在しません。新しいホストは、アプリであなたが下す決定であって、エージェントが口車で入り込めるものではありません。
裏では 2 つのことが起きます。Termalin は MCP サーバー向けにホストのインベントリを書き出しますが、そこにあるのはエージェント専用の認証エントリだけで、パスワードや鍵はそのファイルに着地しません。そして認証はアプリの鍵カストディアン(あなたの代わりに鍵を預かり、署名する仕組み)が受け持ちます。あなたが一度鍵をアンロックすれば、Termalin がエージェントの代わりに署名します。エージェントが読める鍵ファイルは存在しないので、漏らすものもありません。これは上の ~/.ssh という裏口も閉じます。保護すべきホストが、ディスク上の緩い鍵をもはや一切必要としなくなるからです。
設定にいるあいだに、各ホストのエージェントポリシーを設定します:フルアクセス、コマンドの許可リスト、またはブロックです。大切に思うものには、許可リストが正しい出発点です。
ステップ 2:mcp.json にサーバーを登録する
Cursor は MCP サーバーを JSON ファイルから拾います。そのプロジェクト限定ならプロジェクトルートの .cursor/mcp.json、どこでもサーバーを使えるようにするなら ~/.cursor/mcp.json です。Termalin のようなローカル(stdio)サーバーの場合、エントリはコマンドとその引数です:
{
"mcpServers": {
"termalin": {
"command": "<path>/termalin-mcp",
"args": []
}
}
}
これで連携は完了です。ここではグローバルのファイルが妥当な選択です。サーバーへのアクセスはリポジトリごとの関心事ではないからです。Cursor を再起動(または設定内で MCP の一覧を再読み込み)し、サーバーが実行中と表示されることを確認すると、エージェントにツールが現れます:hosts_list、ssh_exec、永続的なセッション(session_open、session_exec)、SFTP の読み書きです。
覚えておく価値のある Cursor 固有の注意が 1 つあります。Cursor は既定で、ツール呼び出しを実行する前に確認します。最初の数セッションはこれをオンのままにしてください。自動承認は、エージェントが各ツールをどう使うか見届けてから、1 つずつ広げていくべき便利機能です。ホストのリストを広げるときと同じやり方です。
ステップ 3:本物の雑務を任せる
デモ用のコマンドから始めないでください。実際にやるであろうタスクから始めます:
staging-1 のヘルスチェックが、昨日のデプロイ以降ずっとばたついている。原因を突き止めて直して。
エージェントの働きぶりを見ましょう。hosts_list を呼び、staging-1 を見つけ、セッションを開き、糸をたぐり始めます。サービスの状態、直近 100 行のログ、稼働中のものとの設定差分です。修正を提案し、適用し、ヘルスチェックが緑になることを確認します。
これを心地よくしているのは、その何一つ見えないものがない点です。エージェントが開く各セッションは、Termalin にライブのターミナルタブとして現れ、**ウォッチグリッド(英語)**は、開いているすべてのセッションを並べて表示し、エージェントが動かしているタイルをハイライトします。事後のまとめを読んでいるのではありません。コマンドが実行されて着地する様子をそのまま見ていて、いつでも割って入れます。
どこに境界があるか
大切なものに向ける前に知っておく価値のある既定値です:
- 鍵がエージェントの環境に触れることは決してありません。 カストディアンが署名し、エージェントは依頼します。アクセスの取り消しは設定内のトグルであって、サーバー群全体にわたる鍵のローテーションではありません。
- エージェントの到達範囲は、ステップ 1 で設定した許可リストです。そして各ホストのコマンドポリシーが、そこで何を実行できるかの上限を定めます。
- あなたのセッションへの入力は別扱いです。 既定ではエージェントは自分のセッションを開きます。すでに開いているセッションの中で操作することは、それ専用の同意トグルで、こっそり相乗りすることは決してありません。
- 録画はエージェントの活動に印を付けます。 セッション録画は出力のみを記録し(キー入力は決して記録しません)、すべてのエージェントのコマンドは、発信元のデバイスと IP とともに、監査ログでエージェントのものとしてタグ付けされます。午前 2 時でも、「これはそれがやった」と「これは自分がやった」を見分けられます。
デスクトップが近くにない? ホスト型エンドポイントを使う
エージェントがデスクトップのない場所(CI、クラウドのサンドボックス)で動く場合は、アプリの代わりにホスト型の MCP サーバーを使います。対話的に使うなら、https://termal.in/mcp を URL で Cursor に追加し、Termalin のページで一度サインインします(OAuth、貼り付ける鍵はありません)。無人の実行なら、Termalin のウェブキャビネットで API キーを作成し、クライアントをホスト型 MCP エンドポイントに向けます。Cursor の mcp.json は、リモートサーバーも URL で受け付けます:
{
"mcpServers": {
"termalin": {
"url": "https://termal.in/api/v1/mcp",
"headers": { "Authorization": "Bearer tk_live_…" }
}
}
}
(お使いの Cursor のビルドが、リモートサーバーの認証ヘッダーにまだ対応していない場合は、ローカルの stdio サーバーのままにしてください。どのみちそちらのほうが良い既定です。)ホスト型エンドポイントが到達するのは、トンネルエージェントで登録したサーバーだけで、各実行は短期証明書で認証します。カストディアンと同じ考え方で、常駐する資格情報はどこにもありません。キーは特定のサーバーにスコープされ、あなたが選んだスケジュールで失効し、取り消すと即座に無効になります。詳しくは MCP ドキュメントで。
定着させる習慣
最初の 1 週間は、とても速くタイプする新しいチームメイトを迎え入れるように扱ってください。ウォッチグリッドを開いたままにします。完了状態がはっきりした雑務(「ヘルスチェックを通す」「証明書を更新する」)を与え、そこへどうたどり着くかを読みます。退屈なツールでエージェントが自動承認を勝ち取るまでは、Cursor の呼び出しごとの承認をオンのままにし、ホストの許可リストは、面白みのないマシンから 1 台ずつ広げていきます。
肝はこの非対称性です。エージェントは本物の到達範囲を得て、あなたは取り返しのつかない唯一のものを手元に持ち続けます。(代わりに Claude Code を動かしていますか? 同じセットアップ、コマンド 1 つ(英語)。)
Termalin の Free プランはデスクトップアプリのすべてで、新規アカウントはすべて 14 日間の Pro トライアルから始まります。ダウンロードするか、Cursor SSH ページから始めるか、まず MCP ドキュメントをお読みください。