3行でいうと
- 足せるものは大きく6つあります。MCPサーバー、拡張(extensions)、スキル、サブエージェント、カスタムコマンド、ヘッドレス実行の仕組みです。拡張は、MCPサーバー、スキル、サブエージェント、コマンドなどを1つの箱にまとめて配る形だと、公式は説明しています。
- 置き場所は、ほとんどが「自分の全プロジェクト用の
~/.qwen/以下」と「そのプロジェクト用の.qwen/以下」の2段です。同じ名前がぶつかったときの優先順位は、機能ごとに公式が書いていて、機能ごとに違います。 - 人がいない実行では、
qwen -pに承認の方針と上限(ターン数、実行時間、ツール呼び出し数)を渡します。公式は、--yoloはサンドボックスを有効にしない、と明記しています。 - 公式ドキュメントの中に、ページどうしで書き方が食い違う点がいくつかありました(
qwen mcp addの既定の範囲、カスタムコマンドの書式など)。本文で「どちらが書かれていたか」を並べます。
この記事は公式ドキュメントを2026年10月24日に読んでまとめたもので、実際に使って確かめた記録ではありません。運営者はQwenを入れていますが、使い心地はこの記事には書いていません。コマンド、設定のキー、ファイルの例は、公式のページに書かれていたものを写したもので、動作確認はしていません。公式ページは要約の形で取得したため、長い引用はせず言い換えています。取得した要約が途中で切れていたページ(フックのページ、カスタムコマンドのページの末尾、設定ページの一部)は、読めていない部分を本文で「読めていない」と書きました。バージョンや日付は、各ページに表示されていた「Last updated」の日付(2026年10月22日から24日)のものです。
先に結論
- MCPは1行で足せます。 公式の例は
qwen mcp add --transport http my-server http://localhost:3000/mcpです。足したあとは、qwenを起動して/mcpで状態を見ます。 - 範囲は2段です。 既定は自分の全プロジェクト向け(
~/.qwen/settings.json)で、プロジェクトだけに足すなら.qwen/settings.jsonです。ただし、既定がどちらかは、公式の2つのページで書き方が食い違っていました(後述)。 - 拡張は「箱」です。
qwen-extension.jsonというファイルを置いたフォルダが1つの拡張で、MCPサーバー、コマンド、スキル、サブエージェント、文脈ファイル(QWEN.md)を入れられます。インストールはqwen extensions install <場所>です。 - スキルは
SKILL.md、サブエージェントはYAML付きのMarkdown、カスタムコマンドはMarkdown(TOMLは非推奨と書かれています)。 置き場所はそれぞれ.qwen/skills/、.qwen/agents/、.qwen/commands/と、~/.qwen/側の対応する場所です。 - ヘッドレスは
qwen -p。 出力はtext、json、stream-jsonから選べ、決まった形のJSONが欲しいときは--json-schemaを使います。上限を超えると、終了コード53(ターン数)や55(予算)で終わります。
前提:用語をそろえる
- MCP(Model Context Protocol): AIの道具を外部のサービスとつなぐための共通ルールです。公式のMCPのページは、ファイルやリポジトリの操作、データベースへの問い合わせ、社内サービスとの連携、作業の自動化を使い道として挙げています。
- MCPサーバー: MCPで道具やデータを差し出す側のプログラムです。手元で起動するもの(stdio)と、URLで呼ぶもの(http、sse)があります。
- 拡張(extension): 公式の導入のページは、プロンプト、MCPサーバー、サブエージェント、スキル、カスタムコマンドを「パッケージ」にして共有し、簡単に入れられるようにしたもの、と説明しています。
- スキル、サブエージェント、カスタムコマンド: 順に、モデルが必要なときに読む指示の束、専用の指示と道具を持つ分身のAI、自分用の
/コマンドです。それぞれの節で説明します。 - ヘッドレス: 画面や人の操作なしで動かすことです。Qwen Codeでは
-p(--prompt)を付けます。 - 承認モード: ファイルの編集やコマンドの実行の前に、人に許可を求めるかどうかの方針です。公式は
plan、default、auto-edit、auto、yoloの5つを挙げています。
全体の地図:何をどこに置くか
公式のページに書かれていた置き場所と書式を、機能ごとに並べます。
| 機能 | 置き場所(公式の記載) | 書式 | 呼び出し方 | 公式のどこに書かれているか |
|---|---|---|---|---|
| MCPサーバー | ~/.qwen/settings.json(user、既定)または .qwen/settings.json(project)の mcpServers |
JSON | モデルが道具として使う。/mcp で管理 |
MCPのページ |
| 拡張 | <home>/.qwen/extensions/<名前>/qwen-extension.json |
JSON(マニフェスト)と各種フォルダ | qwen extensions ... と /extensions |
拡張の導入のページ、開発者向けの拡張のページ |
| スキル | ~/.qwen/skills/、.qwen/skills/(ほかに ~/.agents/skills/、.agents/skills/) |
<名前>/SKILL.md |
モデルが判断して使う。/<スキル名> でも呼べる |
Skillsのページ |
| サブエージェント | .qwen/agents/(最優先)、~/.qwen/agents/(その次) |
YAMLの見出し付きMarkdown | 自動の委任、名前を指定、/agents で管理 |
SubAgentsのページ |
| カスタムコマンド | ~/.qwen/commands/(優先度は低)、.qwen/commands/(高い) |
Markdown(TOMLは非推奨) | /<ファイル名>、フォルダは : でつなぐ |
Commandsのページ |
| ヘッドレス実行 | コマンドライン | フラグと環境変数 | qwen -p "..." |
Headless Modeのページ |
設定ファイルの優先順位は、設定のページに、弱い順に「既定値、システムの既定ファイル、ユーザー、プロジェクト、システム、環境変数、コマンドライン引数」と書かれています。システムの設定ファイルはLinuxなら /etc/qwen-code/settings.json で、ユーザーとプロジェクトの設定より強い、とあります。会社のパソコンでは、この層で制限がかかっていることがあります。
MCP:足し方、範囲、つなぎ方
最小の足し方
公式のクイックスタートは、次の順です。
qwen mcp add --transport http my-server http://localhost:3000/mcp
qwen
/mcp
すでにQwen Codeを起動していた場合は、同じプロジェクトで起動し直してから、モデルにそのサーバーの道具を使うよう頼みます。設定ファイルを直接編集してもよく、どちらも同じ mcpServers の項目になる、と公式は書いています。
つなぎ方(トランスポート)は3種類
| 種類 | 向いているもの | JSONのキー | 公式の位置づけ |
|---|---|---|---|
| http | リモートのサービス | httpUrl(必要なら headers) |
推奨 |
| sse | SSEだけに対応した古いサーバー | url(必要なら headers) |
古い方式、非推奨 |
| stdio | 手元のプログラム(スクリプト、CLI、Docker) | command、args(必要なら cwd、env) |
― |
HTTPとSSEの両方に対応しているサーバーなら、HTTPを選ぶよう書かれています。開発者向けのページによると、どの方式になるかは、書いたキーで決まります(httpUrl ならストリーミングHTTP、url ならSSE、command ならstdio)。複数を書いたときにどうなるかは、読んだ範囲では書かれていませんでした。
設定ファイルの書き方(公式の例)
stdioのサーバーです。
{
"mcpServers": {
"pythonTools": {
"command": "python",
"args": ["-m", "my_mcp_server", "--port", "8080"],
"cwd": "./mcp-servers/python",
"env": {
"DATABASE_URL": "$DB_CONNECTION_STRING",
"API_KEY": "${EXTERNAL_API_KEY}"
},
"timeout": 15000
}
}
}
同じものをコマンドで足す形も、公式に載っています。
qwen mcp add pythonTools -e DATABASE_URL=$DB_CONNECTION_STRING -e API_KEY=$EXTERNAL_API_KEY \
--timeout 15000 python -m my_mcp_server --port 8080
HTTPのサーバーにトークンを渡す例です。
{
"mcpServers": {
"httpServerWithAuth": {
"httpUrl": "http://localhost:3000/mcp",
"headers": {
"Authorization": "Bearer your-api-token"
},
"timeout": 5000
}
}
}
env の値には $VAR_NAME と ${VAR_NAME} が使えます。環境変数に鍵を置き、設定ファイルには名前だけを書く形です。開発者向けのページには、env が親プロセスの環境を引き継ぐかどうかは書かれていませんでした。
qwen mcp add のオプション
公式の表にあるものを写します。形は qwen mcp add [options] <name> <commandOrUrl> [args...] です。
| オプション | 意味 | 既定(公式の記載) |
|---|---|---|
-s, --scope |
user か project | MCPのページは user |
-t, --transport |
stdio、sse、http | stdio |
-e, --env |
環境変数(KEY=value) |
― |
-H, --header |
SSE・HTTPのヘッダー | ― |
--timeout |
ミリ秒 | ― |
--trust |
信頼できる作業場所で確認を省く | false |
--include-tools、--exclude-tools |
使う道具、隠す道具(カンマ区切り) | すべて、なし |
--oauth-client-id ほか --oauth-* |
OAuthの設定 | ― |
削除は qwen mcp remove <name> です。--oauth-* はsseとhttp専用で、stdioと組み合わせると拒否される、と書かれています。
食い違いを1つ:qwen mcp add の既定の範囲
MCPのページ(ユーザー向け)は、範囲の既定を user(~/.qwen/settings.json)と書いています。一方、開発者向けの「MCP Servers」のページは、同じオプション表で既定を project と書いています。どちらも2026年10月22日の更新表示です。どちらが現在の動作かは、僕らは確かめられていません。足したあとに、どちらのファイルに書かれたかを自分の目で確かめるのが安全です(これは僕らの見立てです)。
範囲と優先順位
- 範囲は user(全プロジェクト)と project(そのプロジェクト)の2つです。システムの層と優先順位は、設定のページを見るよう書かれています。
- 拡張が持つMCPサーバーと、
settings.jsonのサーバーが同じ名前なら、settings.jsonが勝つ、と拡張のページに書かれています。 - MCPのページには、設定の出どころが違うときは、項目の中身が混ざるのではなく、同じ名前のサーバーの定義が丸ごと入れ替わると書かれています。
認証
- ヘッダーのトークン。 上の
headers(または--header)です。 - OAuth。
urlだけを書いたSSEのサーバーに対し、401を検出して認証先を探し、ブラウザでログインする流れがある、と開発者向けのページに書かれています。コールバックの既定はhttp://localhost:7777/oauth/callbackです。SSHやクラウド上のターミナルなどでは、この既定が使えないので、公開されたアドレスを--oauth-redirect-uriに渡し、その/oauth/callbackをhttp://127.0.0.1:7777/oauth/callbackへ中継します。TLSを終わらせるのはQwen Codeではなく中継側です。ヘッドレスの環境では、OAuthは動かない、とあります。 - トークンの保存。 既定では
~/.qwen/mcp-oauth-tokens.jsonに暗号化なしで保存され、権限は0600です。QWEN_CODE_FORCE_ENCRYPTED_FILE_STORAGE=trueで、キーチェーン、または~/.qwen/mcp-oauth-tokens-v2.json(AES-256-GCM)に切り替わります。公式は、共有のパソコンではこの設定をすすめています。
道具を絞る
- サーバーごとに
includeTools(許可リスト)とexcludeTools(隠す道具)が使えます。両方に載っていればexcludeToolsが優先です。 - 全体の設定では、
mcp.allowedとmcp.excludedに、サーバー名のリストを書きます。*と?が使え、両方に当たればmcp.excludedが勝ちます。
{
"mcp": {
"allowed": ["my-trusted-server", "*-internal"],
"excluded": ["experimental-server"]
}
}
プロンプトとリソース
サーバーが公開するプロンプトは / で始まるコマンドとして現れ、リソースは @サーバー名:URI の形でプロンプトに差し込めます。信頼していないフォルダでは、リソースの読み込みは無効だと書かれています。
タイムアウト
timeout(道具の呼び出しの待ち時間)の既定は600,000ミリ秒(10分)です。discoveryTimeoutMs(接続の確認の待ち時間)の既定は、stdioが30秒、リモートが5秒です。- 対話の画面ではすぐ起動して「N/M MCP servers ready」と出ますが、
-pのような非対話の実行では、最初のプロンプトの前に接続の確認を待ちます。
安全に関わる点(公式の記載)
trust: trueは、そのサーバーの道具の確認を省きます。ただし、信頼した作業場所の中だけです。公式は、自分で管理していて注釈(annotations)を確かめたサーバーだけに使うよう書いています。注釈はサーバーが付けるヒントで、許可や認可の境界ではない、とも書かれています。- 接続が切れたとき、道具の呼び出しをやり直すのは、サーバーが
trust: true、作業場所が信頼済み、かつ道具が「何度やっても同じ」(idempotentHint: trueなど)と宣言しているときだけです。それ以外はやり直さず、結果が不明かもしれないと利用者に伝えます。 - 開発者向けのページは、
envに鍵を入れるときの注意、広い権限の個人用トークンがリポジトリ間で情報を漏らしうること、MCPサーバーは別プロセスでリソースを使うこと、サンドボックスを使うならサーバーもその中に必要なこと、を挙げています。
拡張(extensions):入れる、作る、配る
入れ方
公式の導入のページに、入れ方が並んでいます。
| 入れ元 | コマンドの例(公式) | 備考(公式の記載) |
|---|---|---|
| Gitのリポジトリ | qwen extensions install https://github.com/github/github-mcp-server |
認証つきなどの一部の入れ元にはGit 2.37以上が必要 |
| GitHubの短縮形 | qwen extensions install <owner>/<repo> |
Gemini CLIの拡張も同じ形で入れられ、TOMLのコマンドはMarkdownに変換される |
| Claudeのマーケットプレイス | qwen extensions install <マーケットプレイス名>(URLも可。末尾に :<プラグイン名> を足すと1つだけ選べる) |
Claudeのプラグインは自動で変換される |
| ローカルのフォルダ、アーカイブ | qwen extensions install /path/to/your/extension |
コピーが作られるので、変更の反映には qwen extensions update が要る |
| npm | qwen extensions install @scope/my-extension |
スコープ付きのパッケージだけ。パッケージのルートに何のファイルが要るかは、読んだ範囲では確かめられていません |
| アーカイブのURL | qwen extensions install https://example.com/your/extension.zip |
zipまたはtar.gz |
https://github.com/github/github-mcp-server を入れたあとに、鍵の入力を尋ねられるか、どの設定に書かれるかは、読んだ範囲では確かめられていません。拡張の settings(sensitive: true の値を入れるときに尋ねる仕組み)の説明は、下の「拡張の中身」にあります。
入れる範囲は、既定がユーザー(全体)で、--scope project を付けると今のワークスペースだけです。止める、再開する、更新するは、次のとおりです。
qwen extensions disable extension-name
qwen extensions disable extension-name --scope=workspace
qwen extensions enable extension-name
qwen extensions update extension-name
qwen extensions update --all
qwen extensions uninstall extension-name
Qwen Codeの中では、/extensions(または /extensions manage)で、探す(Discover)、入れた拡張(Installed)、入れ元(Sources)の3つのタブを持つ画面が開きます。CLIの変更は、起動中のセッションには再起動後に反映される、と書かれています。実行中のセッションでの /extensions install は、再起動なしで反映されます。
食い違いを1つ:一覧と「list」
導入のページは、qwen extensions list を載せていません(一覧は /extensions manage のInstalledタブと、マーケットプレイスの sources list だけ)。開発者向けのページは「/extensions list で一覧が出る」と書いています。どちらが現在のものか、僕らは確かめられていません。
拡張の中身:qwen-extension.json
公式の導入のページの例です(channels と workflows のキーは省いて載せています)。
{
"name": "my-extension",
"version": "1.0.0",
"mcpServers": {
"my-server": {
"command": "node my-server.js"
}
},
"contextFileName": "QWEN.md",
"commands": "commands",
"skills": "skills",
"agents": "agents",
"settings": [
{
"name": "API Key",
"description": "Your API key for the service",
"envVar": "MY_API_KEY",
"sensitive": true
}
]
}
nameは小文字、数字、ダッシュで、フォルダ名と合わせます。mcpServersはtrust以外のすべてのオプションが使えます。拡張の中のMCPサーバーでは、trustは設定できません。contextFileNameを書かなければ、フォルダにQWEN.mdがあれば読み込まれます。settingsは、入れるときに利用者へ尋ねる値です。sensitive: trueの値は、安全に保存され、画面にそのまま出ません。値はqwen extensions settings set <拡張名> <設定名>で変えられます。保存先は、ユーザーなら~/.qwen/.env、ワークスペースなら.qwen/.envで、ワークスペースが優先されます。- 変数として
${extensionPath}、${workspacePath}、${/}が使えます。 - 拡張のコマンドは、名前がぶつかったとき、自分で書いたコマンドが勝ちます。拡張側は
/gcp.deployのように拡張名が付きます。拡張のコマンドの優先度は最も低い、と書かれています。 - 拡張のスキルは
<拡張名>:<スキル名>で登録されます。 - 開発者向けのページの例には、
excludeTools(例:"run_shell_command(rm -rf)"のようなコマンド単位の制限もできる)が載っています。
作る:公式のチュートリアルの流れ
開発者向けの「Getting Started with Qwen Code Extensions」は、次の順です。
qwen extensions new my-first-extension mcp-serverで、ひな形を作る(example.ts、qwen-extension.json、package.json、tsconfig.json)。ひな形には、ほかにcontext、custom-commands、exclude-toolsがあります。npm installのあとnpm run buildでdist/example.jsを作る。qwen extensions link .で、開発フォルダへのリンクを作る。変更のたびにupdateしなくて済みます。- Qwen Codeを再起動して、ひな形の道具(
fetch_posts)を試す。 commands/fs/grep-code.tomlを足して、/fs:grep-code "some pattern"を試す。QWEN.mdを置き、contextFileNameに書く。
公式のチュートリアルは、カスタムコマンドにTOMLを使っています。後述のとおり、コマンドのページはMarkdownを推奨してTOMLを非推奨と書いているので、ここも食い違いです。
配る
「Extension Releasing」のページは、2つの方法を挙げています。
- Gitのリポジトリ。 公開のリポジトリを置き、利用者は
qwen extensions install <org>/<repo>で入れます。--ref=<ブランチ・タグ・コミット>で追う先を決められ、既定のブランチの先頭が常に最新として扱われます。 - GitHub Releases。 利用者は1つのアーカイブを取るだけで済みます。公式は、最新としてマークしたリリースを探す、と書いています。
qwen-extension.jsonはアーカイブのルートに置きます。プレリリースやsemverでの選択には対応していない、と書かれています。
読んだ範囲では、このページにnpmでの配り方は書かれていませんでした(入れ方のほうにはnpmがあります)。また、同じページのGitHub Actionsの例は、ビルドで作るファイル名とアップロードするファイル名が合っていません(linux.x64 を作って linux.arm64 を上げる形)。そのまま写さず、自分のものに合わせて直す必要があります。
Agent Plugins v1とMod(短く)
公式の「Agent Plugins」のページによると、plugin.json と mcp.json と SKILL.md を持つ形式のパッケージを、変換せずに読み込めます。使えるのは、スキルと、stdioおよびストリーミングHTTPのMCPサーバーだけで、コマンド、サブエージェント、フック、旧式のSSEのMCPは有効になりません。ほかに「Experimental Mod commands」という別のページがあり、公式は、既定ではオフの実験で、Claude CodeのMod APIの一部だけを動かすと書いています。この記事ではこの2つの細部は扱いません。
スキル:モデルが「必要になったら読む」指示の束
置き場所と書式
- 置き場所は、個人用が
~/.qwen/skills/と~/.agents/skills/(同じ名前なら前者)、プロジェクト用が.qwen/skills/と.agents/skills/(同じ名前なら前者)です。ほかに、設定skills.directoriesで足したフォルダ、拡張のskills/、同梱のスキルがあります。 - 名前がぶつかったときの優先は、プロジェクト、個人(
skills.directoriesを含む)、拡張、同梱の順です。
公式の SKILL.md の形です。
---
name: your-skill-name
description: Brief description of what this Skill does and when to use it
priority: 10
---
Provide clear, step-by-step guidance for Qwen Code.
公式の例は、見出しの後ろに、手順(Instructions)と例(Examples)の節を置く形です。
name と description は必須です。説明には、何をするかと、いつ使うかの両方を書く、と公式は書いています。そのほかのキーには、paths(該当ファイルに触れるまでモデルの一覧に出さない)、user-invocable: false(/ の候補から隠す)、disable-model-invocation: true(モデルから隠す)、hooks(フック)があります。
作り方、確かめ方
- 手で作るなら、
~/.qwen/skills/my-skill-nameか.qwen/skills/my-skill-nameにSKILL.mdを置きます。補助のファイル(reference.md、scripts/、templates/)を横に置けます。 /learnで、URL、ローカルのパス、文章から、プロジェクト用のスキルを作る方法があります。.qwen/skills/learned-skill-<名前>/SKILL.mdに書かれ、使う前に中身を確認するよう書かれています。/skillsで、一覧、検索、オン・オフを行う画面が開きます。書いたあとに動かないときは、qwen --debugで読み込みのエラーを見ます。- 自動で作られる「auto-skill」は、30日使われないと古い扱い、90日で
.qwen/archived-skills/へ移動する(削除はしない)と書かれています。/curatorで管理します。
安全に関わる点(公式の記載)
- スキルの
hooksは、コードを実行するので、モデルのふるまいに関係なく効きます。ツール呼び出しは、フックが終了コード2で終わるか、permissionDecision: "deny"を出すと止まります。 - プロジェクトのスキルのフックは、信頼したフォルダでだけ動きます。一方、
skills.directoriesに指したフォルダのスキルは「個人用」として読み込まれるので、フォルダの信頼による制限がかからない、と書かれています。指すのは、自分で管理しているフォルダだけにするよう、公式が書いています。 - 他のエージェント向けに書かれた
allowed-toolsは無視され、Qwen Codeが読むのはallowedToolsだと書かれています。
サブエージェント:役割を絞った分身
置き場所と書式
- プロジェクト用の
.qwen/agents/(最優先)と、ユーザー用の~/.qwen/agents/(その次)に、YAMLの見出し付きのMarkdownファイルを置きます。拡張が持つサブエージェントは「Extension Agents」に出て、直接は編集できません。 - 見出しの主なキーは
name、description、model(inherit、fast、モデルID、認証方式:モデルID)、approvalMode(default、plan、auto-edit、yolo、bubble)、tools(許可リスト)、disallowedTools(禁止リスト。mcp__サーバー名__道具名やmcp__サーバー名も書ける)です。 - Claude Codeと互換のキーとして、
permissionMode、maxTurns、color、mcpServers、hooksも読めます。effort、skills、initialPrompt、memory、isolationは「今後のプルリクエストで」と書かれていて、まだ使えません。 - 作るには、
/agents create(案内に沿って作る)か、/agents manage(見る、管理する)を使います。
tools を書かないと、親のすべての道具(MCPの道具を含む)を引き継ぎます。絞るなら、tools で許可するか、disallowedTools で禁止します。公式の例は、読み取り専用の code-reviewer と、書き込みも実行もできる testing-expert の2つが対になっています。見出し(フロントマター)は次のとおりです。本文(指示文)は長いので写さず、公式の「Development Workflow Agents」の節で読んでください。
---
name: code-reviewer
description: Reviews code for best practices, security issues, performance, and maintainability
tools:
- read_file
- read_many_files
---
---
name: testing-expert
description: Writes comprehensive unit tests, integration tests, and handles test automation with best practices
tools:
- read_file
- write_file
- read_many_files
- run_shell_command
---
tools を並べる書き方(YAMLの箇条書き)は、取得した要約から組み立てた形で、公式の字面そのものではないかもしれません。本文の中身は、公式の要約によると、code-reviewer は品質・安全性・保守性の観点で、重大な問題、重要な改善、軽い提案、良い点に分けて返す役、testing-expert は単体テスト・結合テストを正常系と異常系の両方で書く役です。違いは tools の1行で、後者は write_file と run_shell_command を持つので、ファイルを書き換え、コマンドを動かせます。
呼ばれ方
- 自動:メインのAIが、依頼の内容と
descriptionを見て任せます。説明に「use PROACTIVELY」のような言葉を入れると促せる、と書かれています。 - 明示:依頼の中で名前を指定します。
- 名前を付けて呼んだ最上位のサブエージェントは、既定でバックグラウンドで動き、完了の通知で報告します。結果をその場で受け取りたいときは
run_in_background: falseです。
安全に関わる点(公式の記載)
- 承認モードは親から引き継がれます。親がplanなら、サブエージェントもplanのままです。親がdefault(信頼したフォルダ)なら、
approvalModeを書かない場合、サブエージェントはauto-editになる、と書かれています。親が緩いモードのとき、サブエージェントのファイルに厳しいapprovalModeを書いても、緩いほうが勝つ、とも書かれています。 - 信頼していないフォルダでは、auto-editとyoloは使えません。
fastモデルや認証方式:モデルIDが別の提供元を指すと、そのサブエージェントの要求はその提供元へ送られます。- サブエージェントの設定ファイルには、鍵や認証情報を書かないよう、公式が書いています。
カスタムコマンド:自分用の / コマンド
置き場所、名前、書式
- 置き場所は、全体用が
~/.qwen/commands/(優先度は低い)、プロジェクト用が<プロジェクト>/.qwen/commands/(高い)で、名前がぶつかるとプロジェクト用が使われます。 ~/.qwen/commands/test.mdは/test、<プロジェクト>/.qwen/commands/git/commit.mdは/git:commitになります。フォルダの区切りはコロンになります。- 書式は、YAMLの見出し(任意)付きのMarkdownが推奨です。TOMLは「非推奨」で、将来の版で消す予定、TOMLを見つけると移行の案内が出る、とコマンドのページに書かれています。
---
description: Optional description (displayed in /help)
---
Your prompt content here.
Use {{args}} for parameter injection.
引数、ファイル、シェルの差し込み
{{args}}は、入力した引数に置き換わり、シェル向けのエスケープが自動で付きます。書かなければ、引数はプロンプトの末尾に空行2つを挟んで足されます。@{ファイルのパス}は、ファイルの内容を差し込みます。画像とPDFは変換されて渡され、ディレクトリは.gitignoreに従って再帰的に読みます。!{コマンド}は、シェルの出力を差し込みます。実行前に確認の画面が出る、と書かれています。- 処理の順は、
@{...}、!{...}、{{args}}です。公式の例は、!{git diff --staged}の出力を差し込んで、コミットメッセージを作らせる形です。見出しのdescriptionは「Generate Commit message based on staged changes.」と書かれていました(この例にファイルの場所は指定されておらず、場所の対応は上のgit/commit.md→/git:commitの例で示されています)。
以下は、その形を僕らが組み立て直した見本です(公式の本文そのものではありません)。
<!-- .qwen/commands/git/commit.md → /git:commit -->
---
description: Generate Commit message based on staged changes.
---
Write a concise commit message for the following staged changes.
```diff
!{git diff --staged}
```
実行前にシェルの確認の画面が出るので、中身を見てから許可します。
- 読んだ範囲では、$ARGUMENTS という書き方は、コマンドのページには書かれていませんでした。
このページは、全体が約11万2千字あり、僕らが読めたのは先頭10万字です。残りの約1万2千字(別のセッションへのメッセージを扱う節の途中から後)は読めていません。
ヘッドレス実行:人がいない場所でQwen Codeを動かす
基本の形
qwen -p "What is the capital of France?"
cat README.md | qwen --prompt "Summarize this documentation"
qwen --continue -p "Run the tests again and summarize failures"
result=$(git diff --cached | qwen -p "Write a concise commit message for these changes" --output-format json)
セッションは ~/.qwen/projects/<名前を整えた作業ディレクトリ>/chats にJSONLで保存され(設定 general.chatRecording が既定でオン)、--continue で直近、--resume <sessionId> で指定の会話を続けられます。chatRecording をオフにすると、--continue と --resume も使えなくなります。
出力の形
| 形式 | 中身(公式の記載) |
|---|---|
text(既定) |
人が読む最終回答だけ |
json |
メッセージのJSON配列。終了時にまとめて出る。最後の result に成功か失敗かと結果が入る |
stream-json |
1行ずつのJSON。出来事のたびに出る。--include-partial-messages で途中経過も出る |
道具の結果の文字は、65,536バイトで切られる、と書かれています。入力は --input-format stream-json もありますが、公式は「工事中」で、SDKとの連携用と書いています。
主なフラグ
| フラグ | 意味 |
|---|---|
--prompt、-p |
ヘッドレスで実行 |
--output-format、-o |
text、json、stream-json |
--approval-mode |
plan、default、auto-edit、auto、yolo |
--yolo、-y |
すべての操作を自動で承認 |
--max-session-turns |
ターン数の上限。超えると終了コード53 |
--max-wall-time |
実行時間の上限(90、30s、5m、1h など) |
--max-tool-calls |
最上位のツール呼び出しの回数の上限 |
--safe-mode |
多くのカスタマイズを無効にして問題を切り分ける |
--append-system-prompt |
組み込みのプロンプトに指示を足す |
終了コードは、53(ターン数の超過)、55(予算の超過)、130(SIGINT)が書かれています。それ以外の終了コードは、ページには書かれていませんでした。実行時間(--max-wall-time)とツール呼び出し数(--max-tool-calls)の上限は、単発の qwen -p と --input-format stream-json のときに効き、qwen serve やACPのセッションには効かない、と書かれています。
決まった形のJSONで受け取る
公式の「Structured Output」のページの例です。
qwen --prompt "Summarize the changes in HEAD with risk_level" \
--json-schema '{
"type": "object",
"properties": {
"summary": { "type": "string" },
"risk_level": { "type": "string", "enum": ["low", "medium", "high"] }
},
"required": ["summary", "risk_level"],
"additionalProperties": false
}'
@./schemas/summary.json のようにファイルを指す書き方もあります。既定の text では、検証済みの結果が1行のJSONで標準出力に出ます。json と stream-json では、最後の result の structured_result に入ります。モデルが道具を呼ばずに文章で答えると終了コード1、ターン数の上限なら53、中断なら130です。スキーマは4MiBまでで、ルートに $ref は置けません。スキーマは毎ターンモデルに送られ、検証のやり直しも1ターンに数えられます。
承認と鍵:自動化で決めておくこと
- ヘッドレスの既定は
default(確認を求める)だと、承認モードのページに書かれています。ただし、承認が出せない場面で承認が要る操作がどう扱われるかは、読んだ範囲では書かれていませんでした。 --yoloは、シェル、書き込み、編集を自動で承認します。公式は、サンドボックスを有効にしないので、ツールはホストの権限で動く、と書き、サンドボックスがないときは標準エラー出力に警告が出ます。autoモードは、LLMの分類器が、シェル、ネットワーク、ワークスペース外の編集を判定します。公式は、シェルが必要でも安全の柵がほしい自動実行や定期実行向けと書いています。3回続けて止められると、手動承認に戻ります。- 認証:Qwen OAuthの無料枠は2026年4月15日に終了した、と認証のページに書かれています(01で「Qwen OAuthで入るなら」と書いた箇所は、この点を踏まえて読んでください)。CI、SSH、コンテナでは、環境変数か
settings.jsonで鍵を渡します。公式の例では、BAILIAN_CODING_PLAN_API_KEY、BAILIAN_TOKEN_PLAN_API_KEY、QWENCLOUD_API_KEY、OPENAI_API_KEYなどの名前が出てきます。プロバイダー固有の鍵は、settings.jsonの項目がenvKeyとして宣言して初めて効く、とあります。 - 鍵の優先順位は、コマンドライン、システムの環境変数、
.env、settings.jsonのenvの順です。公式は、鍵をバージョン管理に入れず、プロジェクト専用の秘密は.qwen/.envに置いて、gitから外すよう書いています。 - ヘッドレスのページには、429や529を無期限に繰り返す設定が
QWEN_CODE_UNATTENDED_RETRY=1だと書かれています。CI=trueだけでは有効にならない、と書かれています。待ちの上限は5分で、30秒ごとに標準エラー出力へ生存の表示が出ます。
公式のCIの例は、次の形です。
- name: Automated code review
env:
QWEN_CODE_UNATTENDED_RETRY: '1'
run: |
qwen -p "Review all files in src/ for security issues" \
--output-format json \
--yolo > review.json
この例は --yolo と無期限の再試行が組み合わさっています。上限(--max-session-turns、--max-wall-time)を付けない例なので、そのまま写すと、止まらない実行になりうる点に注意してください(これは僕らの見立てです)。
道は3つ:CLI、GitHub Actions、SDK
- GitHub Actions。 公式の統合のページは
qwen-code-actionを案内しています。APIキーをQWEN_API_KEYというリポジトリのシークレットに入れ、.gitignoreに.qwen/とgha-creds-*.jsonを足し、qwenの中で/setup-githubを実行するか、examples/workflowsの例を写します。ページに、権限(permissions:)の具体例とワークフローのYAMLは載っていませんでした。 - TypeScript SDK。 公式は「最小限の実験的なSDK」と書いています。
npm install @qwen-code/sdkで入れ、Node.js 22以上が要り、permissionMode(既定はdefault)、allowedTools、mcpServers、canUseTool(60秒で自動拒否)などを渡せます。PythonとJavaのSDKは「alpha」と表示されています。 qwen serve。 READMEは「experimental」と書いています。この記事では細部を読んでいません。
信頼とサンドボックス:足したものを「どこまで動かすか」
- Trusted Folders。 既定ではオフで、
security.folderTrust.enabledをtrueにすると、初めてのフォルダで「信頼する」「親フォルダを信頼する」「信頼しない」の確認が出ます。信頼しないと、プロジェクトの.qwen/settings.jsonと.envが読まれず、拡張の入れ方・更新・削除ができず、ツールの自動承認も使えません。結果は~/.qwen/trustedFolders.jsonに保存されます。このページには、MCPサーバー、フック、カスタムコマンド、スキル、ヘッドレスについての記載はなく、信頼がそれぞれにどう効くかは、この記事では書けません(個別のページに「信頼したフォルダの中だけ」という記載はあります)。 - サンドボックス。 公式は2系統を書いています。Linuxの新しい「ツール実行のサンドボックス」(
tools.executionSandbox)と、CLI全体を包む方式(Docker、Podman、macOSのSeatbelt)です。新しいほうは、MCPとLSP、実行可能なフックと拡張などを無効にするか拒否する、と書かれています。MCPを使う運用と組み合わせるときは、この点を先に確かめる必要があります。Docker、Podman、Seatbeltの方式でMCPがどうなるかは、ページに書かれていませんでした。 - 公式は、サンドボックスは危険を減らすが、なくしはしない、と書いています。
最初の10分でやること
ここは、公式に書かれている手順を並べたものです。順番と組み合わせは僕らの整理です。
- まず空のプロジェクトで試す。
qwen mcp add --transport http my-server <URL>で1つだけ足し、qwenを起動して/mcpで、サーバー、道具、状態を見ます。 - どのファイルに書かれたか見る。
~/.qwen/settings.jsonと.qwen/settings.jsonのどちらにmcpServersが増えたかを開いて確かめます(既定の範囲の食い違いがあるため)。 - 道具を絞る。
includeToolsかexcludeToolsを入れ、trustは付けません。 - 自分用のコマンドを1つ作る。
~/.qwen/commands/にhello.mdを置き、見出しのdescriptionと本文を書いて、/helloを試します。 - スキルを1つ作る。
.qwen/skills/my-skill/SKILL.mdに、名前と説明を書き、/skillsで見えるか確かめます。 - サブエージェントを読み取り専用で作る。
/agents createで、toolsをread_fileとread_many_filesだけにします。 /mcpに出ないときの見直し。 公式のMCPのページのトラブルシューティングは、次の3点です。qwen mcp listで Disconnected と出るなら、URLかコマンドを確かめてtimeoutを延ばす。stdioが起動しないなら、commandを絶対パスで書き、cwdとenvを確かめる。環境変数が展開されないなら、その変数が「Qwen Codeを起動した環境」に存在するかを確かめる(シェルとGUIアプリで環境が違うことがあります)。ほかに、Qwen Codeを起動したまま足したなら同じプロジェクトで起動し直す、includeTools/excludeToolsやmcp.allowed/mcp.excludedで道具やサーバーが隠れていないか見る、という点が本文の別の節に書かれています。接続の確認だけを待つ時間はdiscoveryTimeoutMsで、道具の呼び出しのtimeoutとは別です。MCPのページにはqwen --debugの記載は見つかりませんでした(スキルの読み込みエラーを見るときの--debugは、スキルのページに書かれています)。非対話の起動の待ちを昔の動きに戻すQWEN_CODE_LEGACY_MCP_BLOCKING=1も、同じページにあります。- ヘッドレスは上限つきで。
qwen -p "..." --output-format json --max-session-turns 5 --max-wall-time 5mのように、承認の方針と上限を付けてから、スクリプトに組み込みます。
僕らの見立て
ここからは僕らの見立てです。公式の記載から組み立てたもので、公式の推奨そのものではありません。
- 足すのは1つずつにして、足すたびに
/mcp、/skills、/agents manageで見える範囲を確かめます。MCP、拡張、スキルは、どれも手元のプログラムか、モデルへの指示文なので、出どころが分からないものは入れない、が基本になります。 - 拡張は、他人が作ったものを入れる手段にもなります。公式の導入のページには、拡張がコードを実行しうるという一般的な警告は、読んだ範囲では見つかりませんでした。入れる前に、
qwen-extension.jsonと、MCPのcommandを自分で読むのが安全です。 - ヘッドレスの自動化は、「承認の方針」「上限」「鍵の置き場所」の3つを先に決めます。公式のCIの例をそのまま使うより、上限を足した形から始めるほうが扱いやすいはずです。
気をつけること
- この記事は、実際に使って確かめた記録ではありません。運営者はQwenを入れていますが、使い心地はこの記事には書いていません。公式ドキュメントを読んだ範囲です。
- 公式ドキュメントの中に、食い違いがありました。
qwen mcp addの既定の範囲(MCPのページは user、開発者向けのページは project)、拡張の一覧(/extensions listの有無)、カスタムコマンドの書式(コマンドのページはMarkdown推奨・TOML非推奨、拡張のチュートリアルはTOML)、承認モードのページ内の既定の説明(クイックリファレンスと本文で違う)です。承認モードのページは、--approval-modeと--yoloのフラグを書いておらず、ヘッドレスのページには書かれています。 - 読めていないもの:フックのページの設定と安全の節(フックのページは約10万7千字のうち先頭10万字まで)、コマンドのページの末尾、設定ページの
permissions、mcp、skills、hooksなどの節、権限ルール(Bash(...)など)の書き方、qwen mcp listの仕様、サブエージェントの例の本文(見出しだけ載せました)、Mod、Agent Boardなど他の機能のページ、Python・JavaのSDK。権限ルールとフックの設定は入口の穴になりやすいので、別のガイドで公式を読み直して扱う予定です(今回の記事では書きません)。 - バージョンや「実験的」の表示は、2026年10月22日から24日の表示です。Qwen Codeは更新が速く、名前や既定の挙動が変わることがあります。
- 組織の管理者が置くシステムの設定がある場合、ここに書いた設定が上書きされることがあります。
- この記事は、セキュリティや法律の助言ではありません。
出典
- Connect Qwen Code to tools via MCP(Qwen Codeドキュメント、2026年10月22日更新表示、確認日2026-10-24)
- MCP Servers(Qwen Codeドキュメント、開発者向け、2026年10月22日更新表示、確認日2026-10-24)
- Extension: Introduction(Qwen Codeドキュメント、2026年10月22日更新表示、確認日2026-10-24)
- Qwen Code Extensions(Qwen Codeドキュメント、開発者向け、2026年10月22日更新表示、確認日2026-10-24)
- Getting Started with Qwen Code Extensions(Qwen Codeドキュメント、2026年10月22日更新表示、確認日2026-10-24)
- Extension Releasing(Qwen Codeドキュメント、2026年10月22日更新表示、確認日2026-10-24)
- Agent Plugins(Qwen Codeドキュメント、2026年10月22日更新表示、確認日2026-10-24)
- Experimental Mod commands(Qwen Codeドキュメント、2026年10月24日更新表示、確認日2026-10-24)
- Agent Skills(Qwen Codeドキュメント、2026年10月23日更新表示、確認日2026-10-24)
- Subagents(Qwen Codeドキュメント、確認日2026-10-24)
- Commands(Qwen Codeドキュメント、確認日2026-10-24)
- Headless Mode(Qwen Codeドキュメント、2026年10月22日更新表示、確認日2026-10-24)
- Structured Output(Qwen Codeドキュメント、2026年10月22日更新表示、確認日2026-10-24)
- Approval Mode(Qwen Codeドキュメント、2026年10月22日更新表示、確認日2026-10-24)
- Hooks(Qwen Codeドキュメント、確認日2026-10-24、末尾は未読)
- Authentication(Qwen Codeドキュメント、2026年10月22日更新表示、確認日2026-10-24)
- Settings(Qwen Codeドキュメント、確認日2026-10-24、一部未読)
- Trusted Folders(Qwen Codeドキュメント、確認日2026-10-24)
- Sandboxing(Qwen Codeドキュメント、2026年10月22日更新表示、確認日2026-10-24)
- GitHub Actions(Qwen Codeドキュメント、確認日2026-10-24)
- TypeScript SDK(Qwen Codeドキュメント、確認日2026-10-24)
- Qwen Code ドキュメントのトップ(ナビゲーション、確認日2026-10-24)
- qwen-code README(QwenLM、GitHub、確認日2026-10-24)