3行でいうと
- MCPは、
.cursor/mcp.json(プロジェクト)か~/.cursor/mcp.json(全体)に書くか、Customizeの「Add to Cursor」で入れます。認証は、ヘッダー、環境変数の展開、固定のOAuth設定の3通りが公式に書かれています。Cloud Agentsは別の扱いで、SSEは使えません。 - SkillsはフォルダとSKILL.md、Subagentsは
.cursor/agents/のMarkdownです。どちらも「AIに読ませる文章」で、強制力はありません。止めたいことはHooksで書きます。 - Hooksは
hooks.jsonにversion: 1とイベントごとのコマンドを書きます。終了コード2で拒否、それ以外の失敗は既定で通す(fail-open)ので、安全が目的ならfailClosed: trueを足します。 - 承認と権限は、Run Modes、
permissions.json、チームの許可リスト、Hooksが別々の層で効きます。Hooksと承認の前後関係や、Subagentsが承認を引き継ぐかは、読んだ範囲では書かれていませんでした。
この記事は公式ドキュメントを2026年10月24日に読んでまとめたもので、実際に使って確かめた記録ではありません。運営者はCursorを入れていますが、使い心地はこの記事には書いていません。設定の書き方、コマンド、メニュー名は公式に書かれたとおりに写しており、動作確認はしていません。公式の文章は要約の形で取得したため、長いコード例を一字一句そのまま取れなかったものがあります。その場合は、公式が示したキーと値を僕らがJSONなどの形に直したもの、と明記しています。引用は短く、ほとんどを言い換えています。
先に結論
- つなぐのはMCP。 最短は、Customizeの「MCPs」から「Add to Cursor」を押す方法です。自分で書くなら、ローカルのサーバーは
commandとargs、リモートのサーバーはurlと、必要ならheadersかauthを書きます。設定を書き換えたあとは、Cursorの再起動が要る、とヘルプに書かれています。 - 手順書はSkills、分担はSubagents。 Skillsは
SKILL.mdにnameとdescriptionを書くだけで始められます。Subagentsは、.cursor/agents/にMarkdownを置きます。Subagentsは、親の会話を見ない、きれいな状態から始まります。 - 止めたいならHooks。
beforeShellExecution、beforeMCPExecution、preToolUseなどで、実行前に判定できます。ただし、初期設定は「失敗したら通す」です。 - 承認との関係は層になっている。 MCPのdocsは、初期設定ではツールを使う前に承認を求める、と書いています。ただしヘルプによると、Cursor 3.6以降の既定のRun ModeはAuto-reviewで、許可リストのMCPツールは即実行、それ以外は分類器が判定します(人の承認の画面が出ないことがあります)。承認を減らす仕組み(許可リスト)も、制限する仕組み(Hooks、チームの管理)もあり、公式は許可リストを「セキュリティの保証ではない」と書いています。
- 読めていないところ。 Hooksと承認チェックの前後関係、Subagentsの承認の引き継ぎ、Skillsのスクリプト実行の承認は、読んだ範囲で書かれていませんでした。書かれていないものを、この記事は書いていません。
前提:用語をそろえる
- mcp.json:MCPサーバーの設定ファイルです。最上位のキーは
mcpServersです。 - stdio / Streamable HTTP / SSE:MCPのつなぎ方です。stdioは手元でプログラムを起動し、後ろ2つはURLに話しかけます。
- Skill:
SKILL.mdを中心にしたフォルダで、エージェントが関連すると判断したときに読み込む手順書です。 - Subagent:親のエージェントが仕事を任せる、自分の文脈の窓を持った助手です。
- Hook:エージェントの流れの決まった時点で、あなたのスクリプトを呼ぶ仕組みです。標準入力にJSONを受け取り、標準出力にJSONを返します。
- fail-open / failClosed:Hookが失敗したとき、処理を通す動きと、止める設定です。
- Run Modes / 許可リスト:承認を減らす仕組みです。前のガイド(02)に詳しく書きました。
たとえるなら、MCPは外の工具屋さんとの電話線、Skillsは棚の手順書、Subagentsは任せる助手、Hooksはドアの警備員です(僕らのたとえで、公式の表現ではありません)。
MCPを追加する:3つの入り口
公式が書いている入り口は次のとおりです。
| 入り口 | やること | 公式のどこに書かれているか |
|---|---|---|
| Customizeから | サイドバーのCustomizeで「MCPs」を開き、探して「Add to Cursor」を押し、認証の画面があれば進む | MCPのヘルプ |
| 設定ファイルを書く | .cursor/mcp.json か ~/.cursor/mcp.json に書く |
MCPのdocs、ヘルプ |
| インストール用リンク | cursor://anysphere.cursor-deeplink/mcp/install?name=...&config=... を開く |
MCP Install Linksのdocs |
そのほか、Cursor Marketplaceの公式のPlugin、コミュニティのcursor.directory、チーム管理者が配るチームのマーケットプレイス、拡張機能向けのAPI(vscode.cursor.mcp.registerServer())も書かれています。
設定ファイルの置き場所と、同じ名前が重なったとき
プロジェクトの .cursor/mcp.json は、チームで共有する道具向けで、gitに入れる想定です。~/.cursor/mcp.json は自分の全プロジェクト向けです。ヘルプは、2つのファイルは合わされ、同じサーバー名があればプロジェクト側が優先される、と書いています。一方、MCPのdocsの本体のページには、重なったときの優先順位が書かれていませんでした。CLIのMCPページには「プロジェクト、全体、入れ子」の順という記載があります。ページによって書き方がそろっていないので、同じ名前を2か所に置くのは避けるのが無難です(これは僕らの見立てです)。
ローカルのサーバー(stdio)
ヘルプにある例に近い形です(動作確認はしていません。API_KEY の値の文字列は読み切れていないので、僕らが置いた仮のものです)。
{
"mcpServers": {
"server-name": {
"command": "npx",
"args": ["-y", "mcp-server"],
"env": {
"API_KEY": "your-key-here"
}
}
}
}
MCPのdocsは、stdioの項目を表にしています。type(必須で "stdio"。ただし公式の例は type を省いています)、command(必須。システムのパスにあるか、フルパスで書く。例は npx、node、python、docker)、args、env、envFile(.env や ${workspaceFolder}/.env のように書く)です。envFile はstdio専用で、リモートのサーバーでは使えません。リモートでは、シェルやシステムの環境変数を、後述の ${env:NAME} で参照します。
ヘルプは、シェルの設定ファイルで定義した環境変数にサーバーが依存する場合は、Cursorからそれが見えるようにして、設定を直したらCursorを再起動するよう書いています。
リモートのサーバー(URL)
公式のdocsの例は、次の形です。
{
"mcpServers": {
"server-name": {
"url": "http://localhost:3000/mcp",
"headers": {
"API_KEY": "value"
}
}
}
}
変数の展開:秘密を直書きしない
MCPのdocsによると、command、args、env、url、headers の中で、次の書き方が展開されます。
| 書き方 | 意味(変数名は公式。説明は僕らの言い換え) |
|---|---|
${env:NAME} |
環境変数 |
${userHome} |
ホームフォルダ |
${workspaceFolder} |
.cursor/mcp.json を含むフォルダ |
${workspaceFolderBasename} |
そのフォルダの名前 |
${pathSeparator} と ${/} |
パスの区切り文字 |
公式の例は、headers に "Authorization": "Bearer ${env:MY_SERVICE_TOKEN}" と書く形です。公式は、資格情報は直書きではなく環境変数で渡すよう勧めています。ヘルプのページには、鍵の扱いについての注意は読んだ範囲で見つかりませんでした(プロジェクトの .cursor/mcp.json は、gitにコミットしてチームで共有する、とは書かれています)。注意書きはMCPのdocsの側にあり、秘密は環境変数で渡して直書きしないこと、APIキーの権限は最小にすること、と書かれています。共有するファイルに鍵を直書きしない、が基本です。
認証:3つのやり方
| やり方 | 向いている場面 | 書き方・手順 | 公式のどこに書かれているか |
|---|---|---|---|
| ヘッダーで固定の鍵を渡す | APIキーやトークンで足りるサーバー | headers に Authorization などを書く。値は ${env:...} で渡す |
MCPのdocs、ヘルプ |
| 動的なクライアント登録のOAuth | サーバーが対応していて、通常の「ログイン」で足りる | Add to Cursorなどで入れ、ブラウザや案内に従って認証 | MCPのdocs |
| 固定のクライアントIDを使うOAuth(static OAuth) | 提供元がクライアントIDを固定で発行する、リダイレクトURLの登録が必須、動的登録に非対応 | auth に CLIENT_ID(必須)、CLIENT_SECRET(任意)、scopes(任意) |
MCPのdocs |
固定のOAuth設定
公式の例は次のとおりです(動作確認はしていません)。
{
"mcpServers": {
"oauth-server": {
"url": "https://api.example.com/mcp",
"auth": {
"CLIENT_ID": "your-oauth-client-id",
"CLIENT_SECRET": "your-client-secret",
"scopes": ["read", "write"]
}
}
}
}
公式の補足を拾います。
- 公式が例に挙げた「固定が要る」提供元は、FigmaとLinearです。
- リダイレクトURLは、Webとクラウドのエージェント用が
https://www.cursor.com/agents/mcp/oauth/callback、デスクトップアプリ用がhttp://localhost:8787/callbackです。両方から認証する人がいるなら、両方を登録します。どのサーバーかは、OAuthのstateで見分けられると書かれています。 - 動的登録のとき、デスクトップアプリは2つのURLを両方登録します。デスクトップのURLだけにしたいなら、固定の
CLIENT_IDを指定します。 scopesを省くと、Cursorは/.well-known/oauth-authorization-serverからscopes_supportedを探します。更新用のトークン(refresh token)にoffline_accessのようなスコープが要るサーバーでは、auth.scopesに足す、とあります。authの値にも${env:MCP_CLIENT_ID}のような展開が使えます。- 認証の方式は、PKCE付きの認可コードフローで、保護リソースのメタデータ(RFC 9728)とリソース指示子(RFC 8707)を使う、と書かれています。動的登録では、秘密のない公開クライアントとして登録します。期限が切れたトークンは更新用トークンで更新され、無ければ再ログインです。
Cloud Agentsでの認証は別物
MCPのdocsは、Cloud Agentsのサインインはローカルとは別で、ローカルでサインアウトしてもCloud Agentsは出ない、と書いています。Cloud AgentsのCapabilitiesのページには、次のことが書かれています。
- MCPは、cursor.com/agents のMCPのドロップダウンで自分のサーバーを足すか、管理者がDashboardの「Plugins & MCPs」で配ります。リポジトリの中の
mcp.jsonについては、そのページには書かれていませんでした。 - つなぎ方は、HTTPとstdioが使えます。SSEと
mcp-remoteは使えません(公式は警告の印をつけています)。 - HTTPは、サーバー設定がVMの中に入らず、エージェントは更新用トークンやヘッダーを見られず、呼び出しはバックエンド経由になるので、推奨と書かれています。stdioはVMの中で動くため、エージェントが設定や環境変数に触れられる、と書かれています。
- OAuthは利用者ごとの認可で、チームで共有するサーバーでも同じです。MCPの設定は保存時に暗号化され、
env、headers、CLIENT_SECRETは保存後に隠され、誰にも読み戻せません。変えるときの手順は、読んだ範囲では書かれていませんでした。
MCPを足したあとの確認と運用
- ログ。 出力パネル(
Cmd/Ctrl+Shift+U)で「MCP Logs」を選びます。初期化、ツールの呼び出し、エラーが出ます。docsは、ショートカットの表記が2つのキーがつながって見える形で書かれているので、画面で確かめてください。 - ツールごとのオン・オフ。 チャット欄の上のツール一覧で、ツール名を押すと切り替えられます(ヘルプ)。
- サーバーの無効化。 Customizeの「MCPs」のトグルです。無効にしたサーバーは読み込まれず、チャットにも出ません。
- やり直し。 一度消して、入れ直します。npmで入れたサーバーを更新するときは、Customizeから消し、
npm cache clean --forceを実行して、入れ直す、と公式にあります。 - 失敗の影響。 1つのサーバーが失敗しても、ほかのサーバーには影響しないよう分けられる、と書かれています。
- MCP Apps。 ツールが対話的な画面を返せる拡張に対応しています。表示できない場合も、普通のMCPの応答は返ります。プロトコルとして、Tools、Prompts、Resources、Roots、Elicitationも対応と書かれています。
- ツールの数の上限。 読んだ範囲では、どちらのページにも書かれていませんでした。変更履歴の2.4には、MCPの定義とツールが
.cursorのJSONファイルになり、エージェントが「必要なときだけ」読み込むので、トークンの使用を減らせる、と書かれています。 - 機微なデータを扱うとき。 MCPのdocsの注意は4つです。信頼できる開発者とリポジトリのサーバーだけを入れる、サーバーが触るデータとAPIを確かめる、APIキーは最小の権限に絞る、重要な連携ではサーバーのソースを見直す。FAQには、機微なサーバーは
stdioでローカルで動かす、とあります。
CLIから
CLIのMCPのページに、次のコマンドがあります。
agent mcp list
agent mcp list-tools playwright
agent mcp login <名前>
agent mcp enable <名前>
agent mcp disable <名前>
agent --approve-mcps "query my database for recent errors"
エディタと同じMCPの設定を使います。agent mcp enable はそのサーバーを手元の承認済みリストに足し、--approve-mcps はその実行のあいだ、すべてのMCPサーバーの承認を飛ばします。後者は、承認の確認を全面的にやめることになるので、信頼できるサーバーだけの環境で使うことを僕らは勧めたいです(見立てです)。
Skillsを作る
最小の形
Skillは、SKILL.md を含むフォルダです。公式の例の冒頭は次のとおりです(文面を短くして写しています)。
---
name: my-skill
description: Short description of what this skill does and when to use it.
---
# My Skill
Detailed instructions for the agent.
## When to Use
- Use this skill when...
## Instructions
- Step-by-step guidance for the agent
置き場所は次のとおりです。
| 範囲 | 置き場所(公式の記載) |
|---|---|
| プロジェクト | .agents/skills/、.cursor/skills/ |
| ユーザー | ~/.agents/skills/、~/.cursor/skills/ |
| 互換用 | .claude/skills/、.codex/skills/、~/.claude/skills/、~/.codex/skills/ |
フォルダの名前が、そのSkillの名前になります。サブフォルダでまとめることもでき、リポジトリの中のどこかにある .cursor/skills/ や .agents/skills/ も拾われ、入れ子のプロジェクトにあるものは、そのフォルダの範囲に限られます。Cursorは起動時にSkillを見つけ、どれを使うかはエージェントが文脈で判断します。
フロントマターの項目
| 項目 | 必須 | 公式の説明の要点 |
|---|---|---|
name |
必須 | 小文字、数字、ハイフンだけ。親のフォルダ名と一致させる |
description |
必須 | 何をするか、いつ使うか。関連するかどうかの判断に使われる |
paths |
任意 | 対象のファイルをglobで絞る。カンマ区切りの文字列か配列。古い globs も代わりに読まれる |
disable-model-invocation |
任意 | true なら、/skill-name で呼んだときだけ使われる |
icon、color |
任意 | Custom Mode用の表示。color は default、green、cyan、blue、purple、magenta、orange、yellow、red、brand のどれか |
metadata |
任意 | 自由なキーと値 |
license や compatibility は、このページには書かれていませんでした。paths の具体的な例の文字列は、読んだ範囲では確認できていません。
呼び方
- 自動:エージェントが関連すると判断したとき。
- 手動:Agentのチャットで
/を入れ、名前を探す。そのメッセージだけに付く。 - セッション全体:Custom Modeとして使う(Macは Option+Enter、Windowsは Alt+Enter)。
- 一覧:Customizeの「Skills」。
スクリプトを同梱する
scripts/(実行できるコード)、references/(必要なときに読む資料)、assets/(雛形や画像)を置けます。SKILL.md からは、スキルのルートからの相対パスで参照します。SKILL.md に、同梱のスクリプトを実行させる手順を書く形です(例の文字列は読み切れていません)。言語は問わず、スクリプトは自己完結で、親切なエラーメッセージを出し、端の場合も扱うよう書かれています。スクリプトの実行に承認や隔離がどう関わるかは、このページには書かれていませんでした。 前のガイド(04)でも同じ点を書きました。
作る近道と、取り込み
- 組み込みのSkillに、
/create-skill、/create-rule、/create-hook、/create-subagent、/migrate-to-skills、/review、/loopなど19個があります。/create-skillが何をするかの説明は、読んだ範囲では確認できていません。/create-hookと/create-subagentが何をするかは、Skillsのdocsには一覧に名前があるだけで、Customizeのdocsにも説明はありませんでした。 /migrate-to-skills(Cursor 2.4)は、条件に合う「動的なRules」と、スラッシュコマンドをSkillに変えます。alwaysApply: trueやglobsを持つRules、ユーザーのRulesは移行されません。出力は.cursor/skills/に置かれ、見直せます。- GitHubのリポジトリからは、Customizeの「From GitHub Repository」で取り込めます。リポジトリに
.cursor-plugin/marketplace.jsonが要る、と書かれています。
Cloud Agentsとの関係
同期されるのは ~/.cursor/skills/ だけです。設定の「Settings → Agents」で「Sync Skills for Cloud Agents」をオンにします。同期されたSkillは自分専用で、チームには共有されません。自分で起動したCloud Agentには読み込まれますが、Automationsの実行には読み込まれないので、Automationsで使うならリポジトリの .cursor/skills/ に入れます。自己ホストのワーカーも、同期されないものは使えず、リポジトリのSkillか、ワーカーのイメージに焼き込みます。チーム管理者は、Team Settingsの「Security & Identity」で同期を止められます。
Subagentsを作る
最小の形
カスタムのSubagentは、YAMLのフロントマター付きのMarkdownです。公式の例(security-auditor)の冒頭は次のとおりです。
---
name: security-auditor
description: Security specialist. Use when implementing auth, payments, or handling sensitive data.
model: inherit
readonly: true
---
You are a security expert auditing code for vulnerabilities.
When invoked:
1. Identify security-sensitive code paths
置き場所は、プロジェクトが .cursor/agents/、ユーザーが ~/.cursor/agents/ で、互換用に .claude/agents/ と .codex/agents/ も読まれます。プロジェクトのものが、同名のユーザーのものより優先され、同じ名前が複数の場所にあれば .cursor/ が .claude/ と .codex/ に勝つ、と書かれています。
| 項目 | 必須 | 既定 | 公式の説明の要点 |
|---|---|---|---|
name |
任意 | ファイル名から決まる | 小文字とハイフン |
description |
任意 | なし | 任せるかどうかの判断に使われる |
model |
任意 | inherit |
親と同じか、モデルIDで固定 |
readonly |
任意 | false |
true なら、ファイルの編集と、状態を変えるシェルコマンドをしない |
is_background |
任意 | false |
true なら、親を止めずに動く |
model には、角括弧でオプションを付けられます。公式の例は、composer-2.5[fast=false]、claude-opus-5[effort=high]、claude-opus-5[context=300k] などです。使えるオプションはモデルによって違い、管理者がそのモデルを禁止している場合、プランに含まれない場合、旧プランでMax Modeが無い場合は、互換のあるモデルに切り替わる、と書かれています。
呼び方と動き方
- 自動:エージェントが、タスク、
description、使えるツールを見て任せます。説明に「use proactively」のような文を入れると、任せやすくなる、と書かれています。 - 明示:プロンプトに
/verifierのように書くか、自然な文で名前を挙げます。 - 前面と背面:前面は終わるまで待ち、背面はすぐ返って並行して働きます。背面の出力は
~/.cursor/subagents/に書かれ、親が読めます。 - きれいな文脈から始まる。 Subagentは、それまでの会話を見ません。親が、必要な情報をプロンプトに入れる必要があります。
- 再開。 実行ごとにエージェントのIDが返り、渡し直すと文脈ごと再開できます。
- 入れ子。 Cursor 2.5から可能ですが、1段までです。入れ子にはTaskツールが要り、Hooksやツールの方針で止められる、と書かれています。
- MCPツール。 ローカルのSubagentは、親のツール(MCPを含む)を引き継ぎます。クラウドのSubagentは、cursor.com/agents で設定したチームのMCPサーバーを使います。
並列にするときの落とし穴
初期設定では、Subagentは親と同じチェックアウトを共有し、同時の編集が互いを上書きしうる、と公式が書いています。分けたいときは、分けるよう頼みます(公式の例は「それぞれ別の環境で動かして」という頼み方です)。すると、各自が自分のブランチを持ち、同じマシンの隔離されたGitのワークツリーか、リポジトリを複製したクラウドVMで動きます。変更は、親がマージするまで各ブランチに残ります。
費用
それぞれが独立してトークンを使うので、5つ並べると約5倍、と公式にあります。速くなるわけではなく、利点は文脈の隔離だと書かれています。名前を指定した他社モデルは、親がAutoやComposerでも、他社モデルの使用として数えられます。TeamsとEnterpriseでは、対象の他社モデルにCursor Token Rateもかかります。料金は前のガイド03に書きました。
公式が書いている作り方の目安
- 責任が1つに絞られたものを書く。最初は2〜3個。
descriptionが任せる判断の中心なので、具体的に。「汎用のタスクに使う」のような曖昧な説明は避ける。- プロンプトは短く。
.cursor/agents/はバージョン管理に入れる。 - 僕らの補足です。文脈の隔離が要らない単発の作業には、Skillのほうが向くと思います(見立て)。
Subagentsと承認:書かれていないこと
Subagentsのdocsは、承認の流れを説明していません。readonly が書き込みを制限すること、Hooksやツールの方針が起動を止められることが書かれているだけです。Run Modesのdocsにも、Subagentsが親のモードや許可リストを引き継ぐのかは書かれていませんでした。変更履歴の2.5には、Subagentの許可の依頼の流れを改善した、とあります。細かいことは、読んだ範囲では分かりません。
Hooksを作る
最小の形
手順は、公式のクイックスタートにあります。
<プロジェクト>/.cursor/hooks.json(プロジェクト)か~/.cursor/hooks.json(ユーザー)を作る。"version": 1を書き、イベント名に{ "command": ... }の配列を対応させる。- スクリプトを書いて、
chmod +xで実行できるようにする。 - 保存すれば再読み込みされる。それでも読み込まれなければ、Cursorを再起動する。
公式の最初の例は、ユーザー用の hooks.json で、afterFileEdit に ./hooks/format.sh を1つ置くものです。次は、その中身(キーと値)を、僕らがJSONの形に直したものです。
{
"version": 1,
"hooks": {
"afterFileEdit": [
{ "command": "./hooks/format.sh" }
]
}
}
公式の format.sh は、標準入力を読んで捨て、終了コード0で終わる形です。コメントに「読んで、何かして、0で終わる」と書かれています。
設定の項目
| 項目 | 内容(公式の記載) |
|---|---|
version |
必須。正の整数で、1 を使う |
hooks |
イベント名ごとのフック定義の配列 |
command |
必須。シェルの文字列、絶対パス、相対パス |
type |
"command"(既定)か "prompt" |
timeout |
秒。省略するとプラットフォームの既定。数値は書かれていない |
matcher |
正規表現。空文字か "*" は全部に一致 |
loop_limit |
stop と subagentStop 用。Cursorのフックの既定は5、null で無制限 |
failClosed |
既定は false。true だと、クラッシュ、タイムアウト、ゼロ以外の終了、空の出力で処理が止まる |
絞り込みと時間切れの公式の例は、beforeShellExecution に ./scripts/approve-network.sh を置き、timeout を30、matcher を curl|wget|nc にするものです。
{
"version": 1,
"hooks": {
"beforeShellExecution": [
{
"command": "./scripts/approve-network.sh",
"timeout": 30,
"matcher": "curl|wget|nc"
}
]
}
}
"type": "prompt" では、command の代わりに prompt を書き、LLMが { ok, reason? } を返します。速いモデルが既定で、model で変えられ、$ARGUMENTS が入力のJSONに置き換わります。公式の例は「このコマンドは安全か。読み取りだけ許可」と問う内容で、timeout は10です。Cloud Agentsでは使えません。
どこに置くか、どれが勝つか
| 層 | 場所 | 相対パスの基準 |
|---|---|---|
| Enterprise(MDM) | macOS /Library/Application Support/Cursor/hooks.json、Linux・WSL /etc/cursor/hooks.json、Windows C:\ProgramData\Cursor\hooks.json |
管理用の設定のフォルダ |
| Team(クラウド配布、Enterprise) | ダッシュボードで設定 | 管理されたフックのフォルダ |
| Project | <プロジェクト>/.cursor/hooks.json |
プロジェクトのルート(.cursor/hooks/... と書く) |
| User | ~/.cursor/hooks.json |
~/.cursor/(./hooks/... と書く) |
| Plugin | プラグインの中 | プラグインのインストール先(CURSOR_PLUGIN_ROOT) |
優先は、Enterprise、Team、Project、Userの順で、Pluginはそのあとです。一致したフックは、どの層のものも全部動きます。 権限の返事は、deny が ask に勝ち、ask が allow に勝ちます。user_message と agent_message はつなげられ、followup_message のようなほかの項目は、最後の返事が勝ちます。同じ層、同じイベントの複数の項目の実行順は、読んだ範囲では書かれていませんでした。
主なイベントと、入出力
イベントは、エージェント用(sessionStart、sessionEnd、preToolUse、postToolUse、postToolUseFailure、subagentStart、subagentStop、beforeShellExecution、afterShellExecution、beforeMCPExecution、afterMCPExecution、beforeReadFile、afterFileEdit、beforeSubmitPrompt、preCompact、stop、afterAgentResponse、afterAgentThought)、Tab用(beforeTabFileRead、afterTabFileEdit)、アプリの起動時用(workspaceOpen)に分かれます。Tab用のフックは、Tabの補完だけで動き、Agentでは動きません。workspaceOpen は、公式がデスクトップアプリとCLIで動くと書いているフックです。そのほかのフックをagent CLIで動かせるかは、Hooksのページだけでは確認できていません。変更履歴の2.4には、CLIにチームとMDMのフックを足した、CLIでClaude Codeのフックと互換にした、という記載があります。
| イベント | 入力の主な項目(公式の記載) | 出力できるもの |
|---|---|---|
beforeShellExecution |
command、cwd、sandbox |
permission(allow、deny、ask)、user_message、agent_message |
beforeMCPExecution |
tool_name、tool_input(JSON文字列)、mcp_server_name、urlかcommand |
同上 |
preToolUse |
tool_name、tool_input、tool_use_id、cwd |
permission、メッセージ、updated_input(入力の書き換え) |
postToolUse |
上に加えて tool_output、duration |
updated_mcp_tool_output(MCPだけ)、additional_context |
postToolUseFailure |
failure_type(error、timeout、permission_denied)、is_interrupt |
additional_context |
beforeReadFile |
file_path、content、attachments |
permission(allowかdeny)、user_message |
beforeSubmitPrompt |
prompt、attachments |
continue、user_message |
afterFileEdit |
file_path、edits |
書かれていない |
sessionStart |
session_id、is_background_agent、composer_mode |
env(以降のフックの環境変数)、additional_context |
stop |
status、loop_count |
followup_message(空でなければ、次の発言として自動で送られる) |
subagentStart |
サブエージェントの種類など | permission、user_message。ask は deny として扱われる |
subagentStop |
subagent_type、status、summary、modified_files など |
followup_message(status が completed のときだけ使われる) |
preCompact |
trigger、context_usage_percent など |
user_message。観察用で、圧縮は止められない |
すべてのフックの入力には、conversation_id、generation_id、model(旧式のモデル名と説明されている)、model_id、hook_event_name、cursor_version、workspace_roots、user_email、transcript_path などが入ります。
matcher が何と照らし合わされるかは、イベントごとに違います。preToolUse などはツールの種類(Shell、Read、Write、Grep、Delete、Task、MCP:<ツール名>)、beforeShellExecution などはコマンド全文、subagentStart などはサブエージェントの種類です。beforeMCPExecution は、その表に載っていませんでした。公式は、MCPでは、スクリプトの中で mcp_server_name と tool_name で見分けるよう書いています。
終了コードと、「通してしまう」初期設定
| 終了コード | 意味(公式の記載) |
|---|---|
0 |
成功。標準出力のJSONが使われる。権限のフックでは、不正なJSONや形の違う出力は、処理を止める |
2 |
処理を止める(permission: "deny" と同じ) |
| それ以外 | フックの失敗として扱い、処理は進む(fail-open)。failClosed: true のときは止まる |
つまり、スクリプトが落ちた、時間切れになった、というだけでは、止めたかった操作が通ります。公式は、安全が重要なフックには failClosed: true を使うよう書いており、beforeMCPExecution では特に勧めています。さらに、beforeMCPExecution では、command ではなく mcp_server_name と tool_name で判定し、サーバー名が空だったり想定外だったりしたら拒否する形を勧めています。起動の文字列は、環境ごとに違うからです。
動かせるもの
環境変数として、CURSOR_PROJECT_DIR(ワークスペースのルート)、CURSOR_VERSION、CURSOR_USER_EMAIL(ログイン時)、CURSOR_TRANSCRIPT_PATH(会話の記録が有効なとき)、CURSOR_CODE_REMOTE(リモートのワークスペースで "true")、CURSOR_PLUGIN_ROOT(プラグインのフックだけ)、Claude互換の CLAUDE_PROJECT_DIR が使えます。sessionStart の出力の env に入れた値は、そのセッションの以降のフックに渡ります。
Windowsでは、デスクトップアプリが入力のJSONをPowerShell経由で渡す、と書かれています。
自分で組んだ例:危険なコマンドを止める
次の例は、公式の例ではなく、僕らが、上に書いた入出力のルールだけから組んだ形です。jq がある前提で、動かしていません。beforeShellExecution が受け取るJSONの command を調べ、ある単語を含んだら、permission を deny にして返します。
#!/bin/bash
# 標準入力のJSONから、実行しようとするコマンドを取り出す
cmd=$(jq -r '.command // empty')
if echo "$cmd" | grep -qE 'rm -rf|git push --force'; then
echo '{"permission":"deny","user_message":"このコマンドは止めました","agent_message":"破壊的なコマンドは禁止されています"}'
exit 0
fi
echo '{"permission":"allow"}'
exit 0
設定側は、beforeShellExecution にこのスクリプトを置き、failClosed: true を足します。公式の説明に沿えば、jq が無くてスクリプトが失敗したときも、処理は止まります。逆に failClosed を付けないと、失敗したときに素通しになります。こうした単語の一致は、迂回が簡単なので、これだけで安全にはなりません(僕らの見立てです)。
落とし穴が2つあります。1つ目、failClosed: true では空の出力が止める側に倒れるので、通すときも何かのJSONを返す必要があります。2つ目、この例は対象外のコマンドに allow を返しますが、allow がユーザーの承認の画面まで飛ばすのかは、公式は読んだ範囲で書いていません。迷うなら、allow の代わりに ask を返す形も選べます(permission の値に ask があることは公式に書かれています)。
修正を繰り返す stop の使い方
stop が空でない followup_message を返すと、それが次の発言として自動で送られ、「終わるまで直す」流れが作れます。loop_count は0から数え、loop_limit の既定は5です。null にすると上限が無くなるので、費用が膨らみうる点に注意が要ります(僕らの見立てです)。
Cloud Agentsでの違い
- 動くのはコマンド型のフックだけで、
.cursor/hooks.jsonの内容と、Enterpriseではチームとエンタープライズのフックが読まれます。 sessionStart、sessionEnd、beforeMCPExecution、afterMCPExecution、beforeTabFileRead、afterTabFileEdit、workspaceOpenは使えません。type: "prompt"も使えません。- ユーザー用の
~/.cursor/hooks.jsonは読まれません。 - HTTPのMCPツールは
preToolUseとpostToolUseにMCP:<ツール名>として現れますが、updated_inputは無視され、ツールの出力は隠されます。 - 最初の読み取りだけのターンのあいだは、フックは動きません。
- 自己ホストのワーカーは、プロジェクトのフックを動かし、Enterpriseならチームとエンタープライズのフックも動かします。
配り方
プロジェクトのフックは、コミットすれば、信頼されたワークスペースでチームに届きます。MDMは、組織が上の場所にファイルを置く方式で、Cursorは配りません。クラウド配布(Enterprise)は、ダッシュボードで設定し、約30分ごとに同期されます。ダッシュボードのフックは、failClosed と matcher が使えず、1つのフックが1つのスクリプトか1つのプロンプトです。「Block until hooks are ready」を入れると、フックの準備ができるまで最初の発言を待ちます。
動かないとき
公式の案内は、CustomizeのHooksのタブと、出力パネルのHooksのチャンネルで、設定、実行、エラーを見ることです。設定は保存で再読み込みされ、それでもだめなら再起動です。相対パスが、フックの置き場所(プロジェクトかユーザーか)に合っているかも確かめます。
うまくいかないときの早見表
各所に散っている公式の記載を、僕らが1つの表にまとめたものです。
| 症状 | まず確かめること | 公式のどこに書かれているか |
|---|---|---|
| MCPが出ない、設定が効かない | Cursorを再起動する。出力パネルの「MCP Logs」でエラーを見る。シェルの環境変数に依存するなら、Cursorから見えるようにする | MCPのヘルプ、MCPのdocs |
| npmのMCPを更新したい | Customizeから消し、npm cache clean --force を実行して、入れ直す |
MCPのdocs |
| Cloud AgentsでMCPがつながらない | SSEと mcp-remote は使えない。HTTPかstdioにする。サインインはローカルと別 |
Cloud Agents Capabilities、MCPのdocs |
Skillが / に出ない |
name が親のフォルダ名と一致し、小文字・数字・ハイフンだけか。置き場所が表の7種のどれかか |
Skillsのdocs |
| フックが動かない | chmod +x、相対パスの基準(プロジェクトか ~/.cursor/ か)、CustomizeのHooksのタブと出力パネルのHooks、保存しても読まれなければ再起動 |
Hooksのdocs |
| 止めたいのに通ってしまう | 失敗はfail-openが既定。failClosed: true を足す |
Hooksのdocs |
承認と権限の関係:層で考える
前のガイド(02)で、Run Modes、許可リスト、サンドボックスを書きました。拡張を作るときに関わる層を、公式の記載から並べます。
| 層 | MCPで効くこと | 公式のどこに書かれているか |
|---|---|---|
| 初期設定 | MCPのツールは、使う前に承認を求められる。ツール名の矢印で引数を見られる | MCPのdocs |
| Run Modes(Auto-review) | 許可リストのMCPツールは即実行。それ以外は分類器を通る。Cursor 3.6以降の既定 | MCPのヘルプ、Run Modes |
permissions.json |
mcpAllowlist に サーバー名:ツール名 を書くと、承認なしで動く |
permissions.json Reference |
| CLIの権限 | permissions.allow と deny に Mcp(サーバー:ツール) を書く。denyが勝つ |
CLIのPermissions |
| Hooks | beforeMCPExecution などで判定できる |
Hooks |
| チームの管理 | MCPの許可リストとローカルサーバーのネットワーク制御は、MCPのdocsではEnterpriseの管理者の機能として書かれている。permissions.json より上にダッシュボードの設定がある |
MCPのdocs、permissions.json Reference |
| Cloud Agents | Run Modesは適用されず、承認を求めない | Run Modes |
permissions.json の公式の例は次のとおりです。
{
"mcpAllowlist": [
"github:*",
"linear:list_issues"
]
}
書き方の公式の説明は、サーバー:ツール、大文字小文字は区別せず、* が使え、コロンの無い項目は無視される、というものです。*:* は「すべて」で、CLIでも Mcp(*:*) は「注意して使う」と書かれています。置き場所は、~/.cursor/permissions.json(全体)と <ワークスペース>/.cursor/permissions.json(リポジトリ。コミットが勧められている)で、配列は連結されます。優先は、チームのダッシュボード、permissions.json、IDEの設定の許可リストの順です。キーがあるのに連結後の配列が空なら、許可リストは空になり、IDEの許可リストには戻りません。公式は、許可リストと autoRun の指示は「ベストエフォートの利便性」で、セキュリティの保証ではない、と書いています。
Hooksと承認の前後関係。 Run Modesのdocsは、Hooksが承認の判定の前に動くのか後に動くのか、承認をすり抜けられるのか、を書いていません。Hooksのdocsは、同じイベントに対する権限の返事のあいだでは deny が ask と allow に勝つと書いていますが、承認の画面との関係は書いていません。前のClaude Codeのガイド(06)に書いたように、Claude Code側は明確に書かれていましたが、Cursorについては、読んだ範囲で確かな答えがありません。自分の環境で、小さなフックと小さな許可リストで挙動を確かめてから信頼する、というのが現実的です(僕らの見立てです)。
Hooksを使う前の信頼。 プロジェクトのフックは「信頼されたワークスペースだけで動く」と書かれています。ところが、前のガイド(02)に書いたとおり、Workspace Trustの機能は既定で無効と書かれています。無効のとき、この「信頼」がどう扱われるのかは、読んだ範囲では書かれていませんでした。他人のリポジトリを開くときは、.cursor/hooks.json と .cursor/mcp.json の中身を先に読む、という習慣が安全です(僕らの見立てです)。
プラグインにまとめる
MCP、Skills、Subagents、Hooks、Rules、Commandsは、Pluginとしてまとめて配れます。公式のdocsにある構成は、plugin.json、skills/、mcp.json を持つフォルダです。Cursor独自の形式は .cursor-plugin/plugin.json で、Rulesやエージェント、コマンド、Hooksも含められます。プラグインの mcp.json では、${CURSOR_PLUGIN_ROOT} でプラグインのルートを指せます(${PLUGIN_ROOT} は展開されません)。試すときは ~/.cursor/plugins/local/my-plugin に置き、再起動か「Developer: Reload Window」を実行し、Customizeで確かめます。
公式のマーケットプレイスについては、ヘルプのMarketplace securityに、掲載前の手動の審査、更新ごとの審査、ソース公開の必須、自動更新はしないこと、危険が分かれば素早く取り下げることが書かれています。同時に、プラグインはサードパーティのソフトで、入れるのは自分の判断と責任、とも書いています。ソースを読み、含まれるMCPサーバーが許可リストに合うか確かめるよう勧めています。ブロックされたMCPサーバーを含むプラグインは、入るけれども、そのサーバーは呼び出せません。MCPのサーバー、Skills、Hooksそれぞれの別の審査の手順は、そのページには書かれていませんでした。Enterpriseでは、ローカルのプラグインの取り込みは既定で無効で、管理者が許可します。
最初の10分でやること
公式に書かれている範囲で、小さく始める順番です。
- MCPを1つだけ入れる。 読み取りだけの、出どころの確かなサーバーを選びます。Customizeの「MCPs」から「Add to Cursor」を押すか、
.cursor/mcp.jsonに書いて、Cursorを再起動します。 - 承認の画面を一度見る。 エージェントにそのMCPを使わせ、ツール名の矢印で、渡される引数を確かめます。出力パネルの「MCP Logs」も開いておきます。既定のAuto-reviewでは画面が出ないことがあります。見たいときは、Run Modeを、空の許可リストのAllowlistにします(前のガイド02に書きました)。
- 許可リストはまだ足さない。 動きを理解してから、
permissions.jsonのmcpAllowlistに、必要なツールだけを書きます。 - 最小のフックを置く。
~/.cursor/hooks.jsonに、公式のクイックスタートと同じ、何もしないafterFileEditのフックを置き、chmod +xして、CustomizeのHooksのタブに出るかを見ます。 - Skillを1つ書く。
.cursor/skills/my-skill/SKILL.mdに、name、description、数行の指示を書き、チャットで/から呼べるか見ます。 - Subagentを1つ書く。
.cursor/agents/verifier.mdのような、readonly: trueの確認役を1つだけ作り、/verifierで呼びます。
以降は、僕らの整理です。最初に作る拡張は、失敗しても困らない、読み取り中心のものにします。止める系のフックは、スクリプトを単体で試してから入れ、failClosed の有無で挙動がどう変わるかを、危険の無い操作で確かめます。
僕らの見立て:どれを選ぶか
ここからは僕らの見立てで、公式の推奨そのものではありません。
| やりたいこと | まず考えるもの | 理由(見立て) |
|---|---|---|
| 毎回守ってほしい決まり | Rules(前のガイド01) | 常に読まれる |
| たまに使う手順 | Skills | 必要なときだけ読まれ、文脈を節約できる |
| 外のサービスのデータや操作 | MCP | 道具として呼べる |
| 長い調査、独立した確認 | Subagents | 文脈が分かれる。ただし費用が増える |
| 破ってはいけない線 | Hooks(failClosed)と許可リスト |
文章のお願いは強制ではない |
| 同じ構成を人に配る | Plugin | まとめて入る。ただし中身を読む責任がある |
気をつけること
- この記事は、実際に使って確かめた記録ではありません。運営者はCursorを入れていますが、使い心地はこの記事には書いていません。公式ドキュメントを読んで、キー、コマンド、メニュー名を写しただけです。長いコード例のうち、Hooksの各例とSubagentの例は、公式の要約から、キーと値を僕らがJSONなどの形に直したものです。実際の公式の例と、空白や並びが違うことがあります。
- 取得したのは、ページの要約です。Hooksのページは約12万4千字あり、前半と後半を分けて取りましたが、どちらも要約で、細かい例のコードは読み切れていません。
kube_guard.pyやtrack-stop.tsなどの例のスクリプトは、コードが示されていないため書いていません。 - 日々更新される機能です。Cursor 3.6、3.5、2.4(2026年1月22日公開)、2.5(2026年2月17日公開)などの版の記載は、公式のページと変更履歴にあったものです。名前や挙動は変わります。
- 読んだ範囲では、MCP、Skills、Subagents、Hooksのどのページにも、ベータや実験的という表示はありませんでした。
- MCPの設定ファイルが重なったときの優先順位は、ページによって書き方が違います。前のガイド(04)はこの点に触れていなかったので、今回補いました。
- Windowsでは、管理者が「MCP Network Controls」を有効にし、コマンド型のサーバーに該当する設定があると、サンドボックスがWindows非対応のため、サーバーが起動しません。管理者が「No sandbox」の項目を足す必要がある、とヘルプにあります。
- MCPのインストール用リンクは、リンクを開くとCursorがインストールを促す形です。そのページには、リンクを信頼してよいかについての注意は書かれていませんでした。別のページ(Deeplinks)は、プロンプトなどのリンクを共有する前に、鍵などの機密情報が入っていないか見直すよう書いています。知らない人から来たリンクは、開く前に中身を見るのが無難です(見立てです)。
- 変更履歴の2.4に、SkillsとRulesのファイルの編集は、サンドボックスの中で承認が要らなくなった、と書かれています。承認が要らないことの影響をどう考えるかは、公式に書かれていません。
- 会社のパソコンでは、管理者の設定(チームのダッシュボード、MDM)が、この記事に書いた個人の設定より優先されることがあります。
- この記事は、セキュリティや法律の助言ではありません。
出典
- Model Context Protocol(MCP)(Cursor Docs、Cursor、2026-10-24確認)
- MCP Install Links(Cursor Docs、Cursor、2026-10-24確認)
- MCP integrations(Cursor Help、Cursor、2026-10-24確認)
- MCP(Cursor CLI、Cursor Docs、Cursor、2026-10-24確認)
- Agent Skills(Cursor Docs、Cursor、2026-10-24確認)
- Subagents(Cursor Docs、Cursor、2026-10-24確認)
- Hooks(Cursor Docs、Cursor、2026-10-24確認)
- Plugins(Cursor Docs、Cursor、2026-10-24確認)
- Customize Cursor(Cursor Docs、Cursor、2026-10-24確認)
- Cloud Agents Capabilities(Cursor Docs、Cursor、2026-10-24確認)
- permissions.json Reference(Cursor Docs、Cursor、2026-10-24確認)
- CLI Permissions(Cursor Docs、Cursor、2026-10-24確認)
- Run Modes(Cursor Docs、Cursor、2026-10-24確認)
- Deeplinks(Cursor Docs、Cursor、2026-10-24確認)
- Marketplace security(Cursor Help、Cursor、2026-10-24確認)
- Subagents, Skills, and Image Generation(Cursor Changelog、2026-01-22、2026-10-24確認)
- Plugins, Sandbox Access Controls, and Async Subagents(Cursor Changelog、2026-02-17、2026-10-24確認)