Repository files navigation

DifyOps

Product: DifyOps / GitHub repo: difyops / CLI & Python package: dify-admin

DifyOps は、Dify を GUI ではなく、CLI・Python・生成AI(MCP) から管理するための運用基盤です。

Claude Code や Cursor から自然言語で Dify のアプリ・ナレッジベース・設定変更を操作でき、plan/apply による desired state 管理、設定差分、スナップショット、監査ログにより、Dify 運用に 再現性・安全性・説明可能性 を持ち込めます。

セルフホスト版 Dify v1.13+ 専用です。クラウド版 Dify(cloud.dify.ai)には対応していません。

CLI demo

CLI + Web UI 連動

CLI + Web UI

なぜ必要か

Dify の運用は、作る段階よりも運用段階で手間が増えます。

  • GUI でしか触れない操作が多い
  • 同じ設定変更を複数アプリに反映しにくい
  • dev / prod の差分比較がしづらい
  • ナレッジベースの同期が手作業になりやすい
  • 変更履歴やロールバックが弱い
  • AI 開発フローに Dify 運用を組み込みづらい

DifyOps は、この 運用の摩擦を減らす ためのツールです。

できること

  • AI から Dify を自然言語で操作(MCP サーバー 38 ツール)
  • CLI 38 コマンド でアプリ作成 / 複製 / 差分確認 / 設定変更
  • ナレッジベースの同期と更新(checksum 検知、chunking 設定)
  • YAML で desired state を定義して plan / apply
  • 変更履歴の監査、スナップショット、復元
  • Config Patchingmodel.name=gpt-4o のように dot-notation で設定変更
  • 環境差分比較 — dev と prod のアプリ・KB を比較

こんな人向け

  • Dify をセルフホストで運用している
  • GUI の手作業を減らしたい
  • Dify 環境を再現可能にしたい
  • 生成 AI から Dify の運用を自動化したい
  • dev / prod の差分や設定変更を管理したい

要件

  • Python 3.10+
  • Dify セルフホスト版(v1.13+)

インストール

# GitHub からインストール
pip install git+https://github.com/CaCC-Lab/difyops.git
# MCP サーバーも使う場合
pip install "dify-admin[mcp] @ git+https://github.com/CaCC-Lab/difyops.git"# ローカル開発の場合
git clone https://github.com/CaCC-Lab/difyops.git
cd difyops
pip install -e ".[dev,mcp]"

MCP サーバー(AI 連携)

Claude Code や Cursor から Dify を自然言語で管理できます。

セットアップ

.mcp.json:

{
"mcpServers": {
"difyops": {
"command": "uv",
"args": ["run", "--directory", "/path/to/difyops", "--extra", "mcp", "dify-admin", "mcp", "serve"],
"env": {
"DIFY_URL": "http://localhost:5001",
"DIFY_EMAIL": "admin@example.com",
"DIFY_PASSWORD": "password"
}
}
}
}

.env ファイルに認証情報を書けば .mcp.json から除外できます:

# .env
DIFY_URL=http://localhost:5001
DIFY_EMAIL=admin@example.com
DIFY_PASSWORD=password

使用例(AI に話しかけるだけ)

「アプリ一覧を見せて」
「FAQ Bot の設定を確認して」
「temperature を 0.7 にして」
「このアプリをコピーして」
「devとprodの違いを見せて」
「さっき何を変更した?」

安全設計

状態変更を伴う MCP ツールには、docstring に DESTRUCTIVE: マーカーを付けています。このマーカーにより、MCP クライアントや AI アシスタント側で実行前確認フローを実装しやすくしています。

また、explain ツールを使うことで、各操作の目的・リスク・取り消し方法を事前確認できます。

Important: MCP 側の確認強制は、最終的には MCP クライアント / AI アシスタントの実装に依存します。サーバー側で一律にブロックする仕組みではありません。

read-only モード:DIFY_ADMIN_MODE=readonly を設定すると、Dify リモートへの状態変更を伴う DESTRUCTIVE ツールがサーバー側でブロックされます。ローカルへのスナップショット保存(apps_snapshot)は read-only モードでも実行可能です。

CLI 側では、より明示的な安全柵を提供しています:

  • --dry-run — 実行前プレビュー
  • --yes — 確認スキップ
  • confirm_destructive — 対話確認

38 MCP ツール

カテゴリツール
アプリ情報apps_list, apps_get, apps_search, apps_config_get, apps_config_get_key, apps_export, apps_templates
アプリ操作apps_create, apps_delete, apps_rename, apps_clone, apps_scaffold, apps_import, apps_config_set, apps_config_patch
アプリ差分apps_diff, dsl_diff
スナップショットapps_snapshot, apps_snapshots, apps_restore
KB 情報kb_list, kb_docs_list, kb_docs_status, kb_sync_dry_run
KB 操作kb_create, kb_upload, kb_docs_delete, kb_docs_reindex, kb_clear, kb_sync
状態管理state_plan, state_apply
環境env_diff, status, doctor
運用audit_list, explain, list_operations

CLI クイックスタート

現在の CLI コマンド名は dify-admin です。

# 環境変数を設定(毎回 --email/--password を省略可能)export DIFY_EMAIL=admin@example.com
export DIFY_PASSWORD=password
# 接続チェック
dify-admin doctor
# アプリ一覧
dify-admin apps list
# 名前でアプリ取得
dify-admin apps get --name "FAQ Bot"# 設定をピンポイント変更
dify-admin apps config patch --name "FAQ Bot" \
--set model.completion_params.temperature=0.7
# アプリをコピー
dify-admin apps clone --name "FAQ Bot" --clone-name "FAQ Bot v2"# 2つのアプリを比較
dify-admin apps diff <app_id_1><app_id_2># テンプレートからアプリ作成
dify-admin apps scaffold chat-rag --name "RAG Bot"# スナップショット取得 → 復元
dify-admin apps snapshot --name "FAQ Bot"
dify-admin apps restore <app_id><snapshot_id> --yes

ナレッジベース管理

# ドキュメント一覧
dify-admin kb docs list --name "社内マニュアル"# ファイルアップロード(chunking 設定付き)
dify-admin kb upload --name "社内マニュアル" ./docs/ \
--pattern "*.md" --chunk-size 500 --chunk-overlap 50
# 同期(checksum で変更なしスキップ)
dify-admin kb sync --name "社内マニュアル" ./docs/ \
--recursive --checksum --dry-run
# 同期実行
dify-admin kb sync --name "社内マニュアル" ./docs/ \
--recursive --checksum --delete-missing --yes

Desired State(Terraform-lite)

plan差分を確認するためのプレビュー(read-only)です。apply実際に変更を適用する操作(DESTRUCTIVE)です。

# state.ymlapps:
- name: "FAQ Bot"mode: chatdescription: "Customer FAQ"
- name: "Analyzer"mode: advanced-chatknowledge_bases:
- name: "Company Docs"description: "Internal documentation"
dify-admin plan state.yml # 差分プレビュー
dify-admin apply state.yml --yes # 適用
dify-admin apply state.yml --delete-missing --yes # 未定義を削除

環境差分比較

dify-admin env-diff \
--source-url http://dev:5001 \
--target-url http://prod:5001

JSON 出力

dify-admin --json apps list | jq '.[].name'
dify-admin --json apps get --name "FAQ Bot"| jq '.model_config.model'

Agent-Friendly CLI

DifyOps CLI は エージェント(Claude / Cursor 等)からの利用を想定し、README と各コマンドの --help で同じ前提を説明します(REQ-009)。

  • Structured help: Usage / Description / Options / Side Effects など、--help を機械的にパースしやすい構造にしています。
  • JSON 出力: --json では成功時のデータのみ stdout に出し、エラー時は stderr の JSON と終了コードで判定できます。
  • Idempotency: 各コマンドの Idempotent ラベル(yes / no / conditional)は --helpIdempotent: 行と整合させています。
  • stdin: 対応コマンドでは --file - または - を指定して標準入力から読み込みます。

Exit codes

CLI の終了コードは dify_admin.exceptions の定義と一致します。

Code意味
0正常終了
1アプリ/API エラー(DifyAdminError 等)
2CLI の使い方エラー(UsageError
3接続エラー(DifyConnectionError
4タイムアウト(httpx.TimeoutException

Idempotency 分類

分類コマンド例リトライ
yesapps list, apps get, kb list, status, doctor, plan安全
noapps create, apps delete, kb create, kb clear, audit clear注意
conditionalapps rename, apps config set/patch, apps restore, apply, kb sync状態次第

stdin 対応コマンド

コマンド指定方法
apps import--file -
apps config set--file -
plan-(STATE_FILE 引数)
apply-(STATE_FILE 引数)

Python ライブラリ

現在の Python package 名は dify_admin です。

fromdify_adminimportDifyClientwithDifyClient("http://localhost:5001") asclient:
client.login("admin@example.com", "password")
# アプリ操作apps=client.apps_list(fetch_all=True)
client.apps_clone("app-id", name="Copy of App")
client.apps_rename("app-id", "New Name")
# 設定パッチfromdify_admin.patchimportapply_patchesconfig=client.apps_get_config("app-id")
apply_patches(config, set_ops=[("model.name", "gpt-4o")])
client.apps_update_config("app-id", config)
# KB 同期fromdify_admin.syncimportcompute_sync_plan, execute_syncfrompathlibimportPathplan=compute_sync_plan(client, "dataset-id", Path("./docs"), checksum=True)
result=execute_sync(client, "dataset-id", plan)

例外処理

fromdify_adminimportDifyClient, DifyNotFoundErrorwithDifyClient() asclient:
client.login("admin@example.com", "password")
try:
app=client.apps_get("non-existent-id")
exceptDifyNotFoundErrorase:
print(e) # "App not found: non-existent-id"print(e.hint) # "Check that the app ID is correct"print(e.status_code) # 404

制限事項

  • セルフホスト版 Dify 専用です(cloud.dify.ai には非対応)
  • MCP 経由の確認フローは、クライアント実装に依存します
  • 認証情報は DIFY_URL, DIFY_EMAIL, DIFY_PASSWORD 環境変数または .env で渡します(.env.example を参照)
  • advanced-chat / workflow モードのアプリでは apps_config_get / apps_config_set が使えません(Dify API の制約)
  • read-only モードの環境変数名は現在 DIFY_ADMIN_MODE です

Warning:reset-password コマンドは Docker 経由で PostgreSQL に直接アクセスしてパスワードを更新します。Dify の通常 API 操作ではなく DB 直操作です。セルフホスト環境の管理者向け緊急用途に限定してください。

開発

uv venv --python 3.10 .venv &&source .venv/bin/activate
uv pip install -e ".[dev,mcp]"
pytest tests/ -v # 277 テスト
ruff check dify_admin/
ruff format dify_admin/

更新履歴

v0.3.0 (2026-03-27)

  • CLI コマンドメタデータ 38 コマンド化apps restore をコマンドカタログに追加
  • Agent-Friendly CLI — 全コマンドに構造化ヘルプ(Examples / Side Effects / Idempotent ラベル)
  • stdin 対応apps import --file -, apps config set --file -, plan -, apply -
  • Exit Code 体系 — 0(成功)/ 1(アプリエラー)/ 2(usage)/ 3(接続)/ 4(タイムアウト)
  • JSON エラー出力--json モードでエラー時に stderr へ構造化 JSON を出力
  • コマンドメタデータ JSONdify-admin --json / dify-admin apps --json でメタデータ取得
  • --dry-run 拡充apps config set, apps import, apps rename, kb upload に追加

v0.2.0 (2026-03-22)

  • DifyOps ブランド — Product名を DifyOps に統一
  • MCP サーバー 38 ツール — read-only モード、DESTRUCTIVE マーカー、監査ログ
  • Dify v1.13+ 対応 — ファイルアップロード 2 ステップ化、新 API エンドポイント対応
  • Config Patching--set key=value / --unset key による dot-notation 設定変更
  • 環境差分比較env-diff コマンドで dev/prod 比較
  • KB 同期 — checksum ベースの差分同期、--delete-missing オプション

v0.1.0 (2026-03-18)

  • 初回リリース
  • CLI 基本コマンド(apps / kb / audit)
  • MCP サーバー基盤
  • Python ライブラリ(DifyClient
  • plan / apply による desired state 管理

ライセンス

MIT

About

DifyOps: AI-native ops layer for self-hosted Dify

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

DifyOps

Product: DifyOps / GitHub repo: difyops / CLI & Python package: dify-admin

DifyOps は、Dify を GUI ではなく、CLI・Python・生成AI(MCP) から管理するための運用基盤です。

Claude Code や Cursor から自然言語で Dify のアプリ・ナレッジベース・設定変更を操作でき、plan/apply による desired state 管理、設定差分、スナップショット、監査ログにより、Dify 運用に 再現性・安全性・説明可能性 を持ち込めます。

セルフホスト版 Dify v1.13+ 専用です。クラウド版 Dify(cloud.dify.ai)には対応していません。

CLI demo

CLI + Web UI 連動

CLI + Web UI

なぜ必要か

Dify の運用は、作る段階よりも運用段階で手間が増えます。

  • GUI でしか触れない操作が多い
  • 同じ設定変更を複数アプリに反映しにくい
  • dev / prod の差分比較がしづらい
  • ナレッジベースの同期が手作業になりやすい
  • 変更履歴やロールバックが弱い
  • AI 開発フローに Dify 運用を組み込みづらい

DifyOps は、この 運用の摩擦を減らす ためのツールです。

できること

  • AI から Dify を自然言語で操作(MCP サーバー 38 ツール)
  • CLI 38 コマンド でアプリ作成 / 複製 / 差分確認 / 設定変更
  • ナレッジベースの同期と更新(checksum 検知、chunking 設定)
  • YAML で desired state を定義して plan / apply
  • 変更履歴の監査、スナップショット、復元
  • Config Patchingmodel.name=gpt-4o のように dot-notation で設定変更
  • 環境差分比較 — dev と prod のアプリ・KB を比較

こんな人向け

  • Dify をセルフホストで運用している
  • GUI の手作業を減らしたい
  • Dify 環境を再現可能にしたい
  • 生成 AI から Dify の運用を自動化したい
  • dev / prod の差分や設定変更を管理したい

要件

  • Python 3.10+
  • Dify セルフホスト版(v1.13+)

インストール

# GitHub からインストール
pip install git+https://github.com/CaCC-Lab/difyops.git
# MCP サーバーも使う場合
pip install "dify-admin[mcp] @ git+https://github.com/CaCC-Lab/difyops.git"# ローカル開発の場合
git clone https://github.com/CaCC-Lab/difyops.git
cd difyops
pip install -e ".[dev,mcp]"

MCP サーバー(AI 連携)

Claude Code や Cursor から Dify を自然言語で管理できます。

セットアップ

.mcp.json:

{
"mcpServers": {
"difyops": {
"command": "uv",
"args": ["run", "--directory", "/path/to/difyops", "--extra", "mcp", "dify-admin", "mcp", "serve"],
"env": {
"DIFY_URL": "http://localhost:5001",
"DIFY_EMAIL": "admin@example.com",
"DIFY_PASSWORD": "password"
}
}
}
}

.env ファイルに認証情報を書けば .mcp.json から除外できます:

# .env
DIFY_URL=http://localhost:5001
DIFY_EMAIL=admin@example.com
DIFY_PASSWORD=password

使用例(AI に話しかけるだけ)

「アプリ一覧を見せて」
「FAQ Bot の設定を確認して」
「temperature を 0.7 にして」
「このアプリをコピーして」
「devとprodの違いを見せて」
「さっき何を変更した?」

安全設計

状態変更を伴う MCP ツールには、docstring に DESTRUCTIVE: マーカーを付けています。このマーカーにより、MCP クライアントや AI アシスタント側で実行前確認フローを実装しやすくしています。

また、explain ツールを使うことで、各操作の目的・リスク・取り消し方法を事前確認できます。

Important: MCP 側の確認強制は、最終的には MCP クライアント / AI アシスタントの実装に依存します。サーバー側で一律にブロックする仕組みではありません。

read-only モード:DIFY_ADMIN_MODE=readonly を設定すると、Dify リモートへの状態変更を伴う DESTRUCTIVE ツールがサーバー側でブロックされます。ローカルへのスナップショット保存(apps_snapshot)は read-only モードでも実行可能です。

CLI 側では、より明示的な安全柵を提供しています:

  • --dry-run — 実行前プレビュー
  • --yes — 確認スキップ
  • confirm_destructive — 対話確認

38 MCP ツール

カテゴリツール
アプリ情報apps_list, apps_get, apps_search, apps_config_get, apps_config_get_key, apps_export, apps_templates
アプリ操作apps_create, apps_delete, apps_rename, apps_clone, apps_scaffold, apps_import, apps_config_set, apps_config_patch
アプリ差分apps_diff, dsl_diff
スナップショットapps_snapshot, apps_snapshots, apps_restore
KB 情報kb_list, kb_docs_list, kb_docs_status, kb_sync_dry_run
KB 操作kb_create, kb_upload, kb_docs_delete, kb_docs_reindex, kb_clear, kb_sync
状態管理state_plan, state_apply
環境env_diff, status, doctor
運用audit_list, explain, list_operations

CLI クイックスタート

現在の CLI コマンド名は dify-admin です。

# 環境変数を設定(毎回 --email/--password を省略可能)export DIFY_EMAIL=admin@example.com
export DIFY_PASSWORD=password
# 接続チェック
dify-admin doctor
# アプリ一覧
dify-admin apps list
# 名前でアプリ取得
dify-admin apps get --name "FAQ Bot"# 設定をピンポイント変更
dify-admin apps config patch --name "FAQ Bot" \
--set model.completion_params.temperature=0.7
# アプリをコピー
dify-admin apps clone --name "FAQ Bot" --clone-name "FAQ Bot v2"# 2つのアプリを比較
dify-admin apps diff <app_id_1><app_id_2># テンプレートからアプリ作成
dify-admin apps scaffold chat-rag --name "RAG Bot"# スナップショット取得 → 復元
dify-admin apps snapshot --name "FAQ Bot"
dify-admin apps restore <app_id><snapshot_id> --yes

ナレッジベース管理

# ドキュメント一覧
dify-admin kb docs list --name "社内マニュアル"# ファイルアップロード(chunking 設定付き)
dify-admin kb upload --name "社内マニュアル" ./docs/ \
--pattern "*.md" --chunk-size 500 --chunk-overlap 50
# 同期(checksum で変更なしスキップ)
dify-admin kb sync --name "社内マニュアル" ./docs/ \
--recursive --checksum --dry-run
# 同期実行
dify-admin kb sync --name "社内マニュアル" ./docs/ \
--recursive --checksum --delete-missing --yes

Desired State(Terraform-lite)

plan差分を確認するためのプレビュー(read-only)です。apply実際に変更を適用する操作(DESTRUCTIVE)です。

# state.ymlapps:
- name: "FAQ Bot"mode: chatdescription: "Customer FAQ"
- name: "Analyzer"mode: advanced-chatknowledge_bases:
- name: "Company Docs"description: "Internal documentation"
dify-admin plan state.yml # 差分プレビュー
dify-admin apply state.yml --yes # 適用
dify-admin apply state.yml --delete-missing --yes # 未定義を削除

環境差分比較

dify-admin env-diff \
--source-url http://dev:5001 \
--target-url http://prod:5001

JSON 出力

dify-admin --json apps list | jq '.[].name'
dify-admin --json apps get --name "FAQ Bot"| jq '.model_config.model'

Agent-Friendly CLI

DifyOps CLI は エージェント(Claude / Cursor 等)からの利用を想定し、README と各コマンドの --help で同じ前提を説明します(REQ-009)。

  • Structured help: Usage / Description / Options / Side Effects など、--help を機械的にパースしやすい構造にしています。
  • JSON 出力: --json では成功時のデータのみ stdout に出し、エラー時は stderr の JSON と終了コードで判定できます。
  • Idempotency: 各コマンドの Idempotent ラベル(yes / no / conditional)は --helpIdempotent: 行と整合させています。
  • stdin: 対応コマンドでは --file - または - を指定して標準入力から読み込みます。

Exit codes

CLI の終了コードは dify_admin.exceptions の定義と一致します。

Code意味
0正常終了
1アプリ/API エラー(DifyAdminError 等)
2CLI の使い方エラー(UsageError
3接続エラー(DifyConnectionError
4タイムアウト(httpx.TimeoutException

Idempotency 分類

分類コマンド例リトライ
yesapps list, apps get, kb list, status, doctor, plan安全
noapps create, apps delete, kb create, kb clear, audit clear注意
conditionalapps rename, apps config set/patch, apps restore, apply, kb sync状態次第

stdin 対応コマンド

コマンド指定方法
apps import--file -
apps config set--file -
plan-(STATE_FILE 引数)
apply-(STATE_FILE 引数)

Python ライブラリ

現在の Python package 名は dify_admin です。

fromdify_adminimportDifyClientwithDifyClient("http://localhost:5001") asclient:
client.login("admin@example.com", "password")
# アプリ操作apps=client.apps_list(fetch_all=True)
client.apps_clone("app-id", name="Copy of App")
client.apps_rename("app-id", "New Name")
# 設定パッチfromdify_admin.patchimportapply_patchesconfig=client.apps_get_config("app-id")
apply_patches(config, set_ops=[("model.name", "gpt-4o")])
client.apps_update_config("app-id", config)
# KB 同期fromdify_admin.syncimportcompute_sync_plan, execute_syncfrompathlibimportPathplan=compute_sync_plan(client, "dataset-id", Path("./docs"), checksum=True)
result=execute_sync(client, "dataset-id", plan)

例外処理

fromdify_adminimportDifyClient, DifyNotFoundErrorwithDifyClient() asclient:
client.login("admin@example.com", "password")
try:
app=client.apps_get("non-existent-id")
exceptDifyNotFoundErrorase:
print(e) # "App not found: non-existent-id"print(e.hint) # "Check that the app ID is correct"print(e.status_code) # 404

制限事項

  • セルフホスト版 Dify 専用です(cloud.dify.ai には非対応)
  • MCP 経由の確認フローは、クライアント実装に依存します
  • 認証情報は DIFY_URL, DIFY_EMAIL, DIFY_PASSWORD 環境変数または .env で渡します(.env.example を参照)
  • advanced-chat / workflow モードのアプリでは apps_config_get / apps_config_set が使えません(Dify API の制約)
  • read-only モードの環境変数名は現在 DIFY_ADMIN_MODE です

Warning:reset-password コマンドは Docker 経由で PostgreSQL に直接アクセスしてパスワードを更新します。Dify の通常 API 操作ではなく DB 直操作です。セルフホスト環境の管理者向け緊急用途に限定してください。

開発

uv venv --python 3.10 .venv &&source .venv/bin/activate
uv pip install -e ".[dev,mcp]"
pytest tests/ -v # 277 テスト
ruff check dify_admin/
ruff format dify_admin/

更新履歴

v0.3.0 (2026-03-27)

  • CLI コマンドメタデータ 38 コマンド化apps restore をコマンドカタログに追加
  • Agent-Friendly CLI — 全コマンドに構造化ヘルプ(Examples / Side Effects / Idempotent ラベル)
  • stdin 対応apps import --file -, apps config set --file -, plan -, apply -
  • Exit Code 体系 — 0(成功)/ 1(アプリエラー)/ 2(usage)/ 3(接続)/ 4(タイムアウト)
  • JSON エラー出力--json モードでエラー時に stderr へ構造化 JSON を出力
  • コマンドメタデータ JSONdify-admin --json / dify-admin apps --json でメタデータ取得
  • --dry-run 拡充apps config set, apps import, apps rename, kb upload に追加

v0.2.0 (2026-03-22)

  • DifyOps ブランド — Product名を DifyOps に統一
  • MCP サーバー 38 ツール — read-only モード、DESTRUCTIVE マーカー、監査ログ
  • Dify v1.13+ 対応 — ファイルアップロード 2 ステップ化、新 API エンドポイント対応
  • Config Patching--set key=value / --unset key による dot-notation 設定変更
  • 環境差分比較env-diff コマンドで dev/prod 比較
  • KB 同期 — checksum ベースの差分同期、--delete-missing オプション

v0.1.0 (2026-03-18)

  • 初回リリース
  • CLI 基本コマンド(apps / kb / audit)
  • MCP サーバー基盤
  • Python ライブラリ(DifyClient
  • plan / apply による desired state 管理

ライセンス

MIT

About

DifyOps: AI-native ops layer for self-hosted Dify

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

DifyOps

Product: DifyOps / GitHub repo: difyops / CLI & Python package: dify-admin

DifyOps は、Dify を GUI ではなく、CLI・Python・生成AI(MCP) から管理するための運用基盤です。

Claude Code や Cursor から自然言語で Dify のアプリ・ナレッジベース・設定変更を操作でき、plan/apply による desired state 管理、設定差分、スナップショット、監査ログにより、Dify 運用に 再現性・安全性・説明可能性 を持ち込めます。

セルフホスト版 Dify v1.13+ 専用です。クラウド版 Dify(cloud.dify.ai)には対応していません。

CLI demo

CLI + Web UI 連動

CLI + Web UI

なぜ必要か

Dify の運用は、作る段階よりも運用段階で手間が増えます。

  • GUI でしか触れない操作が多い
  • 同じ設定変更を複数アプリに反映しにくい
  • dev / prod の差分比較がしづらい
  • ナレッジベースの同期が手作業になりやすい
  • 変更履歴やロールバックが弱い
  • AI 開発フローに Dify 運用を組み込みづらい

DifyOps は、この 運用の摩擦を減らす ためのツールです。

できること

  • AI から Dify を自然言語で操作(MCP サーバー 38 ツール)
  • CLI 38 コマンド でアプリ作成 / 複製 / 差分確認 / 設定変更
  • ナレッジベースの同期と更新(checksum 検知、chunking 設定)
  • YAML で desired state を定義して plan / apply
  • 変更履歴の監査、スナップショット、復元
  • Config Patchingmodel.name=gpt-4o のように dot-notation で設定変更
  • 環境差分比較 — dev と prod のアプリ・KB を比較

こんな人向け

  • Dify をセルフホストで運用している
  • GUI の手作業を減らしたい
  • Dify 環境を再現可能にしたい
  • 生成 AI から Dify の運用を自動化したい
  • dev / prod の差分や設定変更を管理したい

要件

  • Python 3.10+
  • Dify セルフホスト版(v1.13+)

インストール

# GitHub からインストール
pip install git+https://github.com/CaCC-Lab/difyops.git
# MCP サーバーも使う場合
pip install "dify-admin[mcp] @ git+https://github.com/CaCC-Lab/difyops.git"# ローカル開発の場合
git clone https://github.com/CaCC-Lab/difyops.git
cd difyops
pip install -e ".[dev,mcp]"

MCP サーバー(AI 連携)

Claude Code や Cursor から Dify を自然言語で管理できます。

セットアップ

.mcp.json:

{
"mcpServers": {
"difyops": {
"command": "uv",
"args": ["run", "--directory", "/path/to/difyops", "--extra", "mcp", "dify-admin", "mcp", "serve"],
"env": {
"DIFY_URL": "http://localhost:5001",
"DIFY_EMAIL": "admin@example.com",
"DIFY_PASSWORD": "password"
}
}
}
}

.env ファイルに認証情報を書けば .mcp.json から除外できます:

# .env
DIFY_URL=http://localhost:5001
DIFY_EMAIL=admin@example.com
DIFY_PASSWORD=password

使用例(AI に話しかけるだけ)

「アプリ一覧を見せて」
「FAQ Bot の設定を確認して」
「temperature を 0.7 にして」
「このアプリをコピーして」
「devとprodの違いを見せて」
「さっき何を変更した?」

安全設計

状態変更を伴う MCP ツールには、docstring に DESTRUCTIVE: マーカーを付けています。このマーカーにより、MCP クライアントや AI アシスタント側で実行前確認フローを実装しやすくしています。

また、explain ツールを使うことで、各操作の目的・リスク・取り消し方法を事前確認できます。

Important: MCP 側の確認強制は、最終的には MCP クライアント / AI アシスタントの実装に依存します。サーバー側で一律にブロックする仕組みではありません。

read-only モード:DIFY_ADMIN_MODE=readonly を設定すると、Dify リモートへの状態変更を伴う DESTRUCTIVE ツールがサーバー側でブロックされます。ローカルへのスナップショット保存(apps_snapshot)は read-only モードでも実行可能です。

CLI 側では、より明示的な安全柵を提供しています:

  • --dry-run — 実行前プレビュー
  • --yes — 確認スキップ
  • confirm_destructive — 対話確認

38 MCP ツール

カテゴリツール
アプリ情報apps_list, apps_get, apps_search, apps_config_get, apps_config_get_key, apps_export, apps_templates
アプリ操作apps_create, apps_delete, apps_rename, apps_clone, apps_scaffold, apps_import, apps_config_set, apps_config_patch
アプリ差分apps_diff, dsl_diff
スナップショットapps_snapshot, apps_snapshots, apps_restore
KB 情報kb_list, kb_docs_list, kb_docs_status, kb_sync_dry_run
KB 操作kb_create, kb_upload, kb_docs_delete, kb_docs_reindex, kb_clear, kb_sync
状態管理state_plan, state_apply
環境env_diff, status, doctor
運用audit_list, explain, list_operations

CLI クイックスタート

現在の CLI コマンド名は dify-admin です。

# 環境変数を設定(毎回 --email/--password を省略可能)export DIFY_EMAIL=admin@example.com
export DIFY_PASSWORD=password
# 接続チェック
dify-admin doctor
# アプリ一覧
dify-admin apps list
# 名前でアプリ取得
dify-admin apps get --name "FAQ Bot"# 設定をピンポイント変更
dify-admin apps config patch --name "FAQ Bot" \
--set model.completion_params.temperature=0.7
# アプリをコピー
dify-admin apps clone --name "FAQ Bot" --clone-name "FAQ Bot v2"# 2つのアプリを比較
dify-admin apps diff <app_id_1><app_id_2># テンプレートからアプリ作成
dify-admin apps scaffold chat-rag --name "RAG Bot"# スナップショット取得 → 復元
dify-admin apps snapshot --name "FAQ Bot"
dify-admin apps restore <app_id><snapshot_id> --yes

ナレッジベース管理

# ドキュメント一覧
dify-admin kb docs list --name "社内マニュアル"# ファイルアップロード(chunking 設定付き)
dify-admin kb upload --name "社内マニュアル" ./docs/ \
--pattern "*.md" --chunk-size 500 --chunk-overlap 50
# 同期(checksum で変更なしスキップ)
dify-admin kb sync --name "社内マニュアル" ./docs/ \
--recursive --checksum --dry-run
# 同期実行
dify-admin kb sync --name "社内マニュアル" ./docs/ \
--recursive --checksum --delete-missing --yes

Desired State(Terraform-lite)

plan差分を確認するためのプレビュー(read-only)です。apply実際に変更を適用する操作(DESTRUCTIVE)です。

# state.ymlapps:
- name: "FAQ Bot"mode: chatdescription: "Customer FAQ"
- name: "Analyzer"mode: advanced-chatknowledge_bases:
- name: "Company Docs"description: "Internal documentation"
dify-admin plan state.yml # 差分プレビュー
dify-admin apply state.yml --yes # 適用
dify-admin apply state.yml --delete-missing --yes # 未定義を削除

環境差分比較

dify-admin env-diff \
--source-url http://dev:5001 \
--target-url http://prod:5001

JSON 出力

dify-admin --json apps list | jq '.[].name'
dify-admin --json apps get --name "FAQ Bot"| jq '.model_config.model'

Agent-Friendly CLI

DifyOps CLI は エージェント(Claude / Cursor 等)からの利用を想定し、README と各コマンドの --help で同じ前提を説明します(REQ-009)。

  • Structured help: Usage / Description / Options / Side Effects など、--help を機械的にパースしやすい構造にしています。
  • JSON 出力: --json では成功時のデータのみ stdout に出し、エラー時は stderr の JSON と終了コードで判定できます。
  • Idempotency: 各コマンドの Idempotent ラベル(yes / no / conditional)は --helpIdempotent: 行と整合させています。
  • stdin: 対応コマンドでは --file - または - を指定して標準入力から読み込みます。

Exit codes

CLI の終了コードは dify_admin.exceptions の定義と一致します。

Code意味
0正常終了
1アプリ/API エラー(DifyAdminError 等)
2CLI の使い方エラー(UsageError
3接続エラー(DifyConnectionError
4タイムアウト(httpx.TimeoutException

Idempotency 分類

分類コマンド例リトライ
yesapps list, apps get, kb list, status, doctor, plan安全
noapps create, apps delete, kb create, kb clear, audit clear注意
conditionalapps rename, apps config set/patch, apps restore, apply, kb sync状態次第

stdin 対応コマンド

コマンド指定方法
apps import--file -
apps config set--file -
plan-(STATE_FILE 引数)
apply-(STATE_FILE 引数)

Python ライブラリ

現在の Python package 名は dify_admin です。

fromdify_adminimportDifyClientwithDifyClient("http://localhost:5001") asclient:
client.login("admin@example.com", "password")
# アプリ操作apps=client.apps_list(fetch_all=True)
client.apps_clone("app-id", name="Copy of App")
client.apps_rename("app-id", "New Name")
# 設定パッチfromdify_admin.patchimportapply_patchesconfig=client.apps_get_config("app-id")
apply_patches(config, set_ops=[("model.name", "gpt-4o")])
client.apps_update_config("app-id", config)
# KB 同期fromdify_admin.syncimportcompute_sync_plan, execute_syncfrompathlibimportPathplan=compute_sync_plan(client, "dataset-id", Path("./docs"), checksum=True)
result=execute_sync(client, "dataset-id", plan)

例外処理

fromdify_adminimportDifyClient, DifyNotFoundErrorwithDifyClient() asclient:
client.login("admin@example.com", "password")
try:
app=client.apps_get("non-existent-id")
exceptDifyNotFoundErrorase:
print(e) # "App not found: non-existent-id"print(e.hint) # "Check that the app ID is correct"print(e.status_code) # 404

制限事項

  • セルフホスト版 Dify 専用です(cloud.dify.ai には非対応)
  • MCP 経由の確認フローは、クライアント実装に依存します
  • 認証情報は DIFY_URL, DIFY_EMAIL, DIFY_PASSWORD 環境変数または .env で渡します(.env.example を参照)
  • advanced-chat / workflow モードのアプリでは apps_config_get / apps_config_set が使えません(Dify API の制約)
  • read-only モードの環境変数名は現在 DIFY_ADMIN_MODE です

Warning:reset-password コマンドは Docker 経由で PostgreSQL に直接アクセスしてパスワードを更新します。Dify の通常 API 操作ではなく DB 直操作です。セルフホスト環境の管理者向け緊急用途に限定してください。

開発

uv venv --python 3.10 .venv &&source .venv/bin/activate
uv pip install -e ".[dev,mcp]"
pytest tests/ -v # 277 テスト
ruff check dify_admin/
ruff format dify_admin/

更新履歴

v0.3.0 (2026-03-27)

  • CLI コマンドメタデータ 38 コマンド化apps restore をコマンドカタログに追加
  • Agent-Friendly CLI — 全コマンドに構造化ヘルプ(Examples / Side Effects / Idempotent ラベル)
  • stdin 対応apps import --file -, apps config set --file -, plan -, apply -
  • Exit Code 体系 — 0(成功)/ 1(アプリエラー)/ 2(usage)/ 3(接続)/ 4(タイムアウト)
  • JSON エラー出力--json モードでエラー時に stderr へ構造化 JSON を出力
  • コマンドメタデータ JSONdify-admin --json / dify-admin apps --json でメタデータ取得
  • --dry-run 拡充apps config set, apps import, apps rename, kb upload に追加

v0.2.0 (2026-03-22)

  • DifyOps ブランド — Product名を DifyOps に統一
  • MCP サーバー 38 ツール — read-only モード、DESTRUCTIVE マーカー、監査ログ
  • Dify v1.13+ 対応 — ファイルアップロード 2 ステップ化、新 API エンドポイント対応
  • Config Patching--set key=value / --unset key による dot-notation 設定変更
  • 環境差分比較env-diff コマンドで dev/prod 比較
  • KB 同期 — checksum ベースの差分同期、--delete-missing オプション

v0.1.0 (2026-03-18)

  • 初回リリース
  • CLI 基本コマンド(apps / kb / audit)
  • MCP サーバー基盤
  • Python ライブラリ(DifyClient
  • plan / apply による desired state 管理

ライセンス

MIT

About

DifyOps: AI-native ops layer for self-hosted Dify

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

DifyOps

Product: DifyOps / GitHub repo: difyops / CLI & Python package: dify-admin

DifyOps は、Dify を GUI ではなく、CLI・Python・生成AI(MCP) から管理するための運用基盤です。

Claude Code や Cursor から自然言語で Dify のアプリ・ナレッジベース・設定変更を操作でき、plan/apply による desired state 管理、設定差分、スナップショット、監査ログにより、Dify 運用に 再現性・安全性・説明可能性 を持ち込めます。

セルフホスト版 Dify v1.13+ 専用です。クラウド版 Dify(cloud.dify.ai)には対応していません。

CLI demo

CLI + Web UI 連動

CLI + Web UI

なぜ必要か

Dify の運用は、作る段階よりも運用段階で手間が増えます。

  • GUI でしか触れない操作が多い
  • 同じ設定変更を複数アプリに反映しにくい
  • dev / prod の差分比較がしづらい
  • ナレッジベースの同期が手作業になりやすい
  • 変更履歴やロールバックが弱い
  • AI 開発フローに Dify 運用を組み込みづらい

DifyOps は、この 運用の摩擦を減らす ためのツールです。

できること

  • AI から Dify を自然言語で操作(MCP サーバー 38 ツール)
  • CLI 38 コマンド でアプリ作成 / 複製 / 差分確認 / 設定変更
  • ナレッジベースの同期と更新(checksum 検知、chunking 設定)
  • YAML で desired state を定義して plan / apply
  • 変更履歴の監査、スナップショット、復元
  • Config Patchingmodel.name=gpt-4o のように dot-notation で設定変更
  • 環境差分比較 — dev と prod のアプリ・KB を比較

こんな人向け

  • Dify をセルフホストで運用している
  • GUI の手作業を減らしたい
  • Dify 環境を再現可能にしたい
  • 生成 AI から Dify の運用を自動化したい
  • dev / prod の差分や設定変更を管理したい

要件

  • Python 3.10+
  • Dify セルフホスト版(v1.13+)

インストール

# GitHub からインストール
pip install git+https://github.com/CaCC-Lab/difyops.git
# MCP サーバーも使う場合
pip install "dify-admin[mcp] @ git+https://github.com/CaCC-Lab/difyops.git"# ローカル開発の場合
git clone https://github.com/CaCC-Lab/difyops.git
cd difyops
pip install -e ".[dev,mcp]"

MCP サーバー(AI 連携)

Claude Code や Cursor から Dify を自然言語で管理できます。

セットアップ

.mcp.json:

{
"mcpServers": {
"difyops": {
"command": "uv",
"args": ["run", "--directory", "/path/to/difyops", "--extra", "mcp", "dify-admin", "mcp", "serve"],
"env": {
"DIFY_URL": "http://localhost:5001",
"DIFY_EMAIL": "admin@example.com",
"DIFY_PASSWORD": "password"
}
}
}
}

.env ファイルに認証情報を書けば .mcp.json から除外できます:

# .env
DIFY_URL=http://localhost:5001
DIFY_EMAIL=admin@example.com
DIFY_PASSWORD=password

使用例(AI に話しかけるだけ)

「アプリ一覧を見せて」
「FAQ Bot の設定を確認して」
「temperature を 0.7 にして」
「このアプリをコピーして」
「devとprodの違いを見せて」
「さっき何を変更した?」

安全設計

状態変更を伴う MCP ツールには、docstring に DESTRUCTIVE: マーカーを付けています。このマーカーにより、MCP クライアントや AI アシスタント側で実行前確認フローを実装しやすくしています。

また、explain ツールを使うことで、各操作の目的・リスク・取り消し方法を事前確認できます。

Important: MCP 側の確認強制は、最終的には MCP クライアント / AI アシスタントの実装に依存します。サーバー側で一律にブロックする仕組みではありません。

read-only モード:DIFY_ADMIN_MODE=readonly を設定すると、Dify リモートへの状態変更を伴う DESTRUCTIVE ツールがサーバー側でブロックされます。ローカルへのスナップショット保存(apps_snapshot)は read-only モードでも実行可能です。

CLI 側では、より明示的な安全柵を提供しています:

  • --dry-run — 実行前プレビュー
  • --yes — 確認スキップ
  • confirm_destructive — 対話確認

38 MCP ツール

カテゴリツール
アプリ情報apps_list, apps_get, apps_search, apps_config_get, apps_config_get_key, apps_export, apps_templates
アプリ操作apps_create, apps_delete, apps_rename, apps_clone, apps_scaffold, apps_import, apps_config_set, apps_config_patch
アプリ差分apps_diff, dsl_diff
スナップショットapps_snapshot, apps_snapshots, apps_restore
KB 情報kb_list, kb_docs_list, kb_docs_status, kb_sync_dry_run
KB 操作kb_create, kb_upload, kb_docs_delete, kb_docs_reindex, kb_clear, kb_sync
状態管理state_plan, state_apply
環境env_diff, status, doctor
運用audit_list, explain, list_operations

CLI クイックスタート

現在の CLI コマンド名は dify-admin です。

# 環境変数を設定(毎回 --email/--password を省略可能)export DIFY_EMAIL=admin@example.com
export DIFY_PASSWORD=password
# 接続チェック
dify-admin doctor
# アプリ一覧
dify-admin apps list
# 名前でアプリ取得
dify-admin apps get --name "FAQ Bot"# 設定をピンポイント変更
dify-admin apps config patch --name "FAQ Bot" \
--set model.completion_params.temperature=0.7
# アプリをコピー
dify-admin apps clone --name "FAQ Bot" --clone-name "FAQ Bot v2"# 2つのアプリを比較
dify-admin apps diff <app_id_1><app_id_2># テンプレートからアプリ作成
dify-admin apps scaffold chat-rag --name "RAG Bot"# スナップショット取得 → 復元
dify-admin apps snapshot --name "FAQ Bot"
dify-admin apps restore <app_id><snapshot_id> --yes

ナレッジベース管理

# ドキュメント一覧
dify-admin kb docs list --name "社内マニュアル"# ファイルアップロード(chunking 設定付き)
dify-admin kb upload --name "社内マニュアル" ./docs/ \
--pattern "*.md" --chunk-size 500 --chunk-overlap 50
# 同期(checksum で変更なしスキップ)
dify-admin kb sync --name "社内マニュアル" ./docs/ \
--recursive --checksum --dry-run
# 同期実行
dify-admin kb sync --name "社内マニュアル" ./docs/ \
--recursive --checksum --delete-missing --yes

Desired State(Terraform-lite)

plan差分を確認するためのプレビュー(read-only)です。apply実際に変更を適用する操作(DESTRUCTIVE)です。

# state.ymlapps:
- name: "FAQ Bot"mode: chatdescription: "Customer FAQ"
- name: "Analyzer"mode: advanced-chatknowledge_bases:
- name: "Company Docs"description: "Internal documentation"
dify-admin plan state.yml # 差分プレビュー
dify-admin apply state.yml --yes # 適用
dify-admin apply state.yml --delete-missing --yes # 未定義を削除

環境差分比較

dify-admin env-diff \
--source-url http://dev:5001 \
--target-url http://prod:5001

JSON 出力

dify-admin --json apps list | jq '.[].name'
dify-admin --json apps get --name "FAQ Bot"| jq '.model_config.model'

Agent-Friendly CLI

DifyOps CLI は エージェント(Claude / Cursor 等)からの利用を想定し、README と各コマンドの --help で同じ前提を説明します(REQ-009)。

  • Structured help: Usage / Description / Options / Side Effects など、--help を機械的にパースしやすい構造にしています。
  • JSON 出力: --json では成功時のデータのみ stdout に出し、エラー時は stderr の JSON と終了コードで判定できます。
  • Idempotency: 各コマンドの Idempotent ラベル(yes / no / conditional)は --helpIdempotent: 行と整合させています。
  • stdin: 対応コマンドでは --file - または - を指定して標準入力から読み込みます。

Exit codes

CLI の終了コードは dify_admin.exceptions の定義と一致します。

Code意味
0正常終了
1アプリ/API エラー(DifyAdminError 等)
2CLI の使い方エラー(UsageError
3接続エラー(DifyConnectionError
4タイムアウト(httpx.TimeoutException

Idempotency 分類

分類コマンド例リトライ
yesapps list, apps get, kb list, status, doctor, plan安全
noapps create, apps delete, kb create, kb clear, audit clear注意
conditionalapps rename, apps config set/patch, apps restore, apply, kb sync状態次第

stdin 対応コマンド

コマンド指定方法
apps import--file -
apps config set--file -
plan-(STATE_FILE 引数)
apply-(STATE_FILE 引数)

Python ライブラリ

現在の Python package 名は dify_admin です。

fromdify_adminimportDifyClientwithDifyClient("http://localhost:5001") asclient:
client.login("admin@example.com", "password")
# アプリ操作apps=client.apps_list(fetch_all=True)
client.apps_clone("app-id", name="Copy of App")
client.apps_rename("app-id", "New Name")
# 設定パッチfromdify_admin.patchimportapply_patchesconfig=client.apps_get_config("app-id")
apply_patches(config, set_ops=[("model.name", "gpt-4o")])
client.apps_update_config("app-id", config)
# KB 同期fromdify_admin.syncimportcompute_sync_plan, execute_syncfrompathlibimportPathplan=compute_sync_plan(client, "dataset-id", Path("./docs"), checksum=True)
result=execute_sync(client, "dataset-id", plan)

例外処理

fromdify_adminimportDifyClient, DifyNotFoundErrorwithDifyClient() asclient:
client.login("admin@example.com", "password")
try:
app=client.apps_get("non-existent-id")
exceptDifyNotFoundErrorase:
print(e) # "App not found: non-existent-id"print(e.hint) # "Check that the app ID is correct"print(e.status_code) # 404

制限事項

  • セルフホスト版 Dify 専用です(cloud.dify.ai には非対応)
  • MCP 経由の確認フローは、クライアント実装に依存します
  • 認証情報は DIFY_URL, DIFY_EMAIL, DIFY_PASSWORD 環境変数または .env で渡します(.env.example を参照)
  • advanced-chat / workflow モードのアプリでは apps_config_get / apps_config_set が使えません(Dify API の制約)
  • read-only モードの環境変数名は現在 DIFY_ADMIN_MODE です

Warning:reset-password コマンドは Docker 経由で PostgreSQL に直接アクセスしてパスワードを更新します。Dify の通常 API 操作ではなく DB 直操作です。セルフホスト環境の管理者向け緊急用途に限定してください。

開発

uv venv --python 3.10 .venv &&source .venv/bin/activate
uv pip install -e ".[dev,mcp]"
pytest tests/ -v # 277 テスト
ruff check dify_admin/
ruff format dify_admin/

更新履歴

v0.3.0 (2026-03-27)

  • CLI コマンドメタデータ 38 コマンド化apps restore をコマンドカタログに追加
  • Agent-Friendly CLI — 全コマンドに構造化ヘルプ(Examples / Side Effects / Idempotent ラベル)
  • stdin 対応apps import --file -, apps config set --file -, plan -, apply -
  • Exit Code 体系 — 0(成功)/ 1(アプリエラー)/ 2(usage)/ 3(接続)/ 4(タイムアウト)
  • JSON エラー出力--json モードでエラー時に stderr へ構造化 JSON を出力
  • コマンドメタデータ JSONdify-admin --json / dify-admin apps --json でメタデータ取得
  • --dry-run 拡充apps config set, apps import, apps rename, kb upload に追加

v0.2.0 (2026-03-22)

  • DifyOps ブランド — Product名を DifyOps に統一
  • MCP サーバー 38 ツール — read-only モード、DESTRUCTIVE マーカー、監査ログ
  • Dify v1.13+ 対応 — ファイルアップロード 2 ステップ化、新 API エンドポイント対応
  • Config Patching--set key=value / --unset key による dot-notation 設定変更
  • 環境差分比較env-diff コマンドで dev/prod 比較
  • KB 同期 — checksum ベースの差分同期、--delete-missing オプション

v0.1.0 (2026-03-18)

  • 初回リリース
  • CLI 基本コマンド(apps / kb / audit)
  • MCP サーバー基盤
  • Python ライブラリ(DifyClient
  • plan / apply による desired state 管理

ライセンス

MIT

About

DifyOps: AI-native ops layer for self-hosted Dify

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

DifyOps

Product: DifyOps / GitHub repo: difyops / CLI & Python package: dify-admin

DifyOps は、Dify を GUI ではなく、CLI・Python・生成AI(MCP) から管理するための運用基盤です。

Claude Code や Cursor から自然言語で Dify のアプリ・ナレッジベース・設定変更を操作でき、plan/apply による desired state 管理、設定差分、スナップショット、監査ログにより、Dify 運用に 再現性・安全性・説明可能性 を持ち込めます。

セルフホスト版 Dify v1.13+ 専用です。クラウド版 Dify(cloud.dify.ai)には対応していません。

CLI demo

CLI + Web UI 連動

CLI + Web UI

なぜ必要か

Dify の運用は、作る段階よりも運用段階で手間が増えます。

  • GUI でしか触れない操作が多い
  • 同じ設定変更を複数アプリに反映しにくい
  • dev / prod の差分比較がしづらい
  • ナレッジベースの同期が手作業になりやすい
  • 変更履歴やロールバックが弱い
  • AI 開発フローに Dify 運用を組み込みづらい

DifyOps は、この 運用の摩擦を減らす ためのツールです。

できること

  • AI から Dify を自然言語で操作(MCP サーバー 38 ツール)
  • CLI 38 コマンド でアプリ作成 / 複製 / 差分確認 / 設定変更
  • ナレッジベースの同期と更新(checksum 検知、chunking 設定)
  • YAML で desired state を定義して plan / apply
  • 変更履歴の監査、スナップショット、復元
  • Config Patchingmodel.name=gpt-4o のように dot-notation で設定変更
  • 環境差分比較 — dev と prod のアプリ・KB を比較

こんな人向け

  • Dify をセルフホストで運用している
  • GUI の手作業を減らしたい
  • Dify 環境を再現可能にしたい
  • 生成 AI から Dify の運用を自動化したい
  • dev / prod の差分や設定変更を管理したい

要件

  • Python 3.10+
  • Dify セルフホスト版(v1.13+)

インストール

# GitHub からインストール
pip install git+https://github.com/CaCC-Lab/difyops.git
# MCP サーバーも使う場合
pip install "dify-admin[mcp] @ git+https://github.com/CaCC-Lab/difyops.git"# ローカル開発の場合
git clone https://github.com/CaCC-Lab/difyops.git
cd difyops
pip install -e ".[dev,mcp]"

MCP サーバー(AI 連携)

Claude Code や Cursor から Dify を自然言語で管理できます。

セットアップ

.mcp.json:

{
"mcpServers": {
"difyops": {
"command": "uv",
"args": ["run", "--directory", "/path/to/difyops", "--extra", "mcp", "dify-admin", "mcp", "serve"],
"env": {
"DIFY_URL": "http://localhost:5001",
"DIFY_EMAIL": "admin@example.com",
"DIFY_PASSWORD": "password"
}
}
}
}

.env ファイルに認証情報を書けば .mcp.json から除外できます:

# .env
DIFY_URL=http://localhost:5001
DIFY_EMAIL=admin@example.com
DIFY_PASSWORD=password

使用例(AI に話しかけるだけ)

「アプリ一覧を見せて」
「FAQ Bot の設定を確認して」
「temperature を 0.7 にして」
「このアプリをコピーして」
「devとprodの違いを見せて」
「さっき何を変更した?」

安全設計

状態変更を伴う MCP ツールには、docstring に DESTRUCTIVE: マーカーを付けています。このマーカーにより、MCP クライアントや AI アシスタント側で実行前確認フローを実装しやすくしています。

また、explain ツールを使うことで、各操作の目的・リスク・取り消し方法を事前確認できます。

Important: MCP 側の確認強制は、最終的には MCP クライアント / AI アシスタントの実装に依存します。サーバー側で一律にブロックする仕組みではありません。

read-only モード:DIFY_ADMIN_MODE=readonly を設定すると、Dify リモートへの状態変更を伴う DESTRUCTIVE ツールがサーバー側でブロックされます。ローカルへのスナップショット保存(apps_snapshot)は read-only モードでも実行可能です。

CLI 側では、より明示的な安全柵を提供しています:

  • --dry-run — 実行前プレビュー
  • --yes — 確認スキップ
  • confirm_destructive — 対話確認

38 MCP ツール

カテゴリツール
アプリ情報apps_list, apps_get, apps_search, apps_config_get, apps_config_get_key, apps_export, apps_templates
アプリ操作apps_create, apps_delete, apps_rename, apps_clone, apps_scaffold, apps_import, apps_config_set, apps_config_patch
アプリ差分apps_diff, dsl_diff
スナップショットapps_snapshot, apps_snapshots, apps_restore
KB 情報kb_list, kb_docs_list, kb_docs_status, kb_sync_dry_run
KB 操作kb_create, kb_upload, kb_docs_delete, kb_docs_reindex, kb_clear, kb_sync
状態管理state_plan, state_apply
環境env_diff, status, doctor
運用audit_list, explain, list_operations

CLI クイックスタート

現在の CLI コマンド名は dify-admin です。

# 環境変数を設定(毎回 --email/--password を省略可能)export DIFY_EMAIL=admin@example.com
export DIFY_PASSWORD=password
# 接続チェック
dify-admin doctor
# アプリ一覧
dify-admin apps list
# 名前でアプリ取得
dify-admin apps get --name "FAQ Bot"# 設定をピンポイント変更
dify-admin apps config patch --name "FAQ Bot" \
--set model.completion_params.temperature=0.7
# アプリをコピー
dify-admin apps clone --name "FAQ Bot" --clone-name "FAQ Bot v2"# 2つのアプリを比較
dify-admin apps diff <app_id_1><app_id_2># テンプレートからアプリ作成
dify-admin apps scaffold chat-rag --name "RAG Bot"# スナップショット取得 → 復元
dify-admin apps snapshot --name "FAQ Bot"
dify-admin apps restore <app_id><snapshot_id> --yes

ナレッジベース管理

# ドキュメント一覧
dify-admin kb docs list --name "社内マニュアル"# ファイルアップロード(chunking 設定付き)
dify-admin kb upload --name "社内マニュアル" ./docs/ \
--pattern "*.md" --chunk-size 500 --chunk-overlap 50
# 同期(checksum で変更なしスキップ)
dify-admin kb sync --name "社内マニュアル" ./docs/ \
--recursive --checksum --dry-run
# 同期実行
dify-admin kb sync --name "社内マニュアル" ./docs/ \
--recursive --checksum --delete-missing --yes

Desired State(Terraform-lite)

plan差分を確認するためのプレビュー(read-only)です。apply実際に変更を適用する操作(DESTRUCTIVE)です。

# state.ymlapps:
- name: "FAQ Bot"mode: chatdescription: "Customer FAQ"
- name: "Analyzer"mode: advanced-chatknowledge_bases:
- name: "Company Docs"description: "Internal documentation"
dify-admin plan state.yml # 差分プレビュー
dify-admin apply state.yml --yes # 適用
dify-admin apply state.yml --delete-missing --yes # 未定義を削除

環境差分比較

dify-admin env-diff \
--source-url http://dev:5001 \
--target-url http://prod:5001

JSON 出力

dify-admin --json apps list | jq '.[].name'
dify-admin --json apps get --name "FAQ Bot"| jq '.model_config.model'

Agent-Friendly CLI

DifyOps CLI は エージェント(Claude / Cursor 等)からの利用を想定し、README と各コマンドの --help で同じ前提を説明します(REQ-009)。

  • Structured help: Usage / Description / Options / Side Effects など、--help を機械的にパースしやすい構造にしています。
  • JSON 出力: --json では成功時のデータのみ stdout に出し、エラー時は stderr の JSON と終了コードで判定できます。
  • Idempotency: 各コマンドの Idempotent ラベル(yes / no / conditional)は --helpIdempotent: 行と整合させています。
  • stdin: 対応コマンドでは --file - または - を指定して標準入力から読み込みます。

Exit codes

CLI の終了コードは dify_admin.exceptions の定義と一致します。

Code意味
0正常終了
1アプリ/API エラー(DifyAdminError 等)
2CLI の使い方エラー(UsageError
3接続エラー(DifyConnectionError
4タイムアウト(httpx.TimeoutException

Idempotency 分類

分類コマンド例リトライ
yesapps list, apps get, kb list, status, doctor, plan安全
noapps create, apps delete, kb create, kb clear, audit clear注意
conditionalapps rename, apps config set/patch, apps restore, apply, kb sync状態次第

stdin 対応コマンド

コマンド指定方法
apps import--file -
apps config set--file -
plan-(STATE_FILE 引数)
apply-(STATE_FILE 引数)

Python ライブラリ

現在の Python package 名は dify_admin です。

fromdify_adminimportDifyClientwithDifyClient("http://localhost:5001") asclient:
client.login("admin@example.com", "password")
# アプリ操作apps=client.apps_list(fetch_all=True)
client.apps_clone("app-id", name="Copy of App")
client.apps_rename("app-id", "New Name")
# 設定パッチfromdify_admin.patchimportapply_patchesconfig=client.apps_get_config("app-id")
apply_patches(config, set_ops=[("model.name", "gpt-4o")])
client.apps_update_config("app-id", config)
# KB 同期fromdify_admin.syncimportcompute_sync_plan, execute_syncfrompathlibimportPathplan=compute_sync_plan(client, "dataset-id", Path("./docs"), checksum=True)
result=execute_sync(client, "dataset-id", plan)

例外処理

fromdify_adminimportDifyClient, DifyNotFoundErrorwithDifyClient() asclient:
client.login("admin@example.com", "password")
try:
app=client.apps_get("non-existent-id")
exceptDifyNotFoundErrorase:
print(e) # "App not found: non-existent-id"print(e.hint) # "Check that the app ID is correct"print(e.status_code) # 404

制限事項

  • セルフホスト版 Dify 専用です(cloud.dify.ai には非対応)
  • MCP 経由の確認フローは、クライアント実装に依存します
  • 認証情報は DIFY_URL, DIFY_EMAIL, DIFY_PASSWORD 環境変数または .env で渡します(.env.example を参照)
  • advanced-chat / workflow モードのアプリでは apps_config_get / apps_config_set が使えません(Dify API の制約)
  • read-only モードの環境変数名は現在 DIFY_ADMIN_MODE です

Warning:reset-password コマンドは Docker 経由で PostgreSQL に直接アクセスしてパスワードを更新します。Dify の通常 API 操作ではなく DB 直操作です。セルフホスト環境の管理者向け緊急用途に限定してください。

開発

uv venv --python 3.10 .venv &&source .venv/bin/activate
uv pip install -e ".[dev,mcp]"
pytest tests/ -v # 277 テスト
ruff check dify_admin/
ruff format dify_admin/

更新履歴

v0.3.0 (2026-03-27)

  • CLI コマンドメタデータ 38 コマンド化apps restore をコマンドカタログに追加
  • Agent-Friendly CLI — 全コマンドに構造化ヘルプ(Examples / Side Effects / Idempotent ラベル)
  • stdin 対応apps import --file -, apps config set --file -, plan -, apply -
  • Exit Code 体系 — 0(成功)/ 1(アプリエラー)/ 2(usage)/ 3(接続)/ 4(タイムアウト)
  • JSON エラー出力--json モードでエラー時に stderr へ構造化 JSON を出力
  • コマンドメタデータ JSONdify-admin --json / dify-admin apps --json でメタデータ取得
  • --dry-run 拡充apps config set, apps import, apps rename, kb upload に追加

v0.2.0 (2026-03-22)

  • DifyOps ブランド — Product名を DifyOps に統一
  • MCP サーバー 38 ツール — read-only モード、DESTRUCTIVE マーカー、監査ログ
  • Dify v1.13+ 対応 — ファイルアップロード 2 ステップ化、新 API エンドポイント対応
  • Config Patching--set key=value / --unset key による dot-notation 設定変更
  • 環境差分比較env-diff コマンドで dev/prod 比較
  • KB 同期 — checksum ベースの差分同期、--delete-missing オプション

v0.1.0 (2026-03-18)

  • 初回リリース
  • CLI 基本コマンド(apps / kb / audit)
  • MCP サーバー基盤
  • Python ライブラリ(DifyClient
  • plan / apply による desired state 管理

ライセンス

MIT

About

DifyOps: AI-native ops layer for self-hosted Dify

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

DifyOps

Product: DifyOps / GitHub repo: difyops / CLI & Python package: dify-admin

DifyOps は、Dify を GUI ではなく、CLI・Python・生成AI(MCP) から管理するための運用基盤です。

Claude Code や Cursor から自然言語で Dify のアプリ・ナレッジベース・設定変更を操作でき、plan/apply による desired state 管理、設定差分、スナップショット、監査ログにより、Dify 運用に 再現性・安全性・説明可能性 を持ち込めます。

セルフホスト版 Dify v1.13+ 専用です。クラウド版 Dify(cloud.dify.ai)には対応していません。

CLI demo

CLI + Web UI 連動

CLI + Web UI

なぜ必要か

Dify の運用は、作る段階よりも運用段階で手間が増えます。

  • GUI でしか触れない操作が多い
  • 同じ設定変更を複数アプリに反映しにくい
  • dev / prod の差分比較がしづらい
  • ナレッジベースの同期が手作業になりやすい
  • 変更履歴やロールバックが弱い
  • AI 開発フローに Dify 運用を組み込みづらい

DifyOps は、この 運用の摩擦を減らす ためのツールです。

できること

  • AI から Dify を自然言語で操作(MCP サーバー 38 ツール)
  • CLI 38 コマンド でアプリ作成 / 複製 / 差分確認 / 設定変更
  • ナレッジベースの同期と更新(checksum 検知、chunking 設定)
  • YAML で desired state を定義して plan / apply
  • 変更履歴の監査、スナップショット、復元
  • Config Patchingmodel.name=gpt-4o のように dot-notation で設定変更
  • 環境差分比較 — dev と prod のアプリ・KB を比較

こんな人向け

  • Dify をセルフホストで運用している
  • GUI の手作業を減らしたい
  • Dify 環境を再現可能にしたい
  • 生成 AI から Dify の運用を自動化したい
  • dev / prod の差分や設定変更を管理したい

要件

  • Python 3.10+
  • Dify セルフホスト版(v1.13+)

インストール

# GitHub からインストール
pip install git+https://github.com/CaCC-Lab/difyops.git
# MCP サーバーも使う場合
pip install "dify-admin[mcp] @ git+https://github.com/CaCC-Lab/difyops.git"# ローカル開発の場合
git clone https://github.com/CaCC-Lab/difyops.git
cd difyops
pip install -e ".[dev,mcp]"

MCP サーバー(AI 連携)

Claude Code や Cursor から Dify を自然言語で管理できます。

セットアップ

.mcp.json:

{
"mcpServers": {
"difyops": {
"command": "uv",
"args": ["run", "--directory", "/path/to/difyops", "--extra", "mcp", "dify-admin", "mcp", "serve"],
"env": {
"DIFY_URL": "http://localhost:5001",
"DIFY_EMAIL": "admin@example.com",
"DIFY_PASSWORD": "password"
}
}
}
}

.env ファイルに認証情報を書けば .mcp.json から除外できます:

# .env
DIFY_URL=http://localhost:5001
DIFY_EMAIL=admin@example.com
DIFY_PASSWORD=password

使用例(AI に話しかけるだけ)

「アプリ一覧を見せて」
「FAQ Bot の設定を確認して」
「temperature を 0.7 にして」
「このアプリをコピーして」
「devとprodの違いを見せて」
「さっき何を変更した?」

安全設計

状態変更を伴う MCP ツールには、docstring に DESTRUCTIVE: マーカーを付けています。このマーカーにより、MCP クライアントや AI アシスタント側で実行前確認フローを実装しやすくしています。

また、explain ツールを使うことで、各操作の目的・リスク・取り消し方法を事前確認できます。

Important: MCP 側の確認強制は、最終的には MCP クライアント / AI アシスタントの実装に依存します。サーバー側で一律にブロックする仕組みではありません。

read-only モード:DIFY_ADMIN_MODE=readonly を設定すると、Dify リモートへの状態変更を伴う DESTRUCTIVE ツールがサーバー側でブロックされます。ローカルへのスナップショット保存(apps_snapshot)は read-only モードでも実行可能です。

CLI 側では、より明示的な安全柵を提供しています:

  • --dry-run — 実行前プレビュー
  • --yes — 確認スキップ
  • confirm_destructive — 対話確認

38 MCP ツール

カテゴリツール
アプリ情報apps_list, apps_get, apps_search, apps_config_get, apps_config_get_key, apps_export, apps_templates
アプリ操作apps_create, apps_delete, apps_rename, apps_clone, apps_scaffold, apps_import, apps_config_set, apps_config_patch
アプリ差分apps_diff, dsl_diff
スナップショットapps_snapshot, apps_snapshots, apps_restore
KB 情報kb_list, kb_docs_list, kb_docs_status, kb_sync_dry_run
KB 操作kb_create, kb_upload, kb_docs_delete, kb_docs_reindex, kb_clear, kb_sync
状態管理state_plan, state_apply
環境env_diff, status, doctor
運用audit_list, explain, list_operations

CLI クイックスタート

現在の CLI コマンド名は dify-admin です。

# 環境変数を設定(毎回 --email/--password を省略可能)export DIFY_EMAIL=admin@example.com
export DIFY_PASSWORD=password
# 接続チェック
dify-admin doctor
# アプリ一覧
dify-admin apps list
# 名前でアプリ取得
dify-admin apps get --name "FAQ Bot"# 設定をピンポイント変更
dify-admin apps config patch --name "FAQ Bot" \
--set model.completion_params.temperature=0.7
# アプリをコピー
dify-admin apps clone --name "FAQ Bot" --clone-name "FAQ Bot v2"# 2つのアプリを比較
dify-admin apps diff <app_id_1><app_id_2># テンプレートからアプリ作成
dify-admin apps scaffold chat-rag --name "RAG Bot"# スナップショット取得 → 復元
dify-admin apps snapshot --name "FAQ Bot"
dify-admin apps restore <app_id><snapshot_id> --yes

ナレッジベース管理

# ドキュメント一覧
dify-admin kb docs list --name "社内マニュアル"# ファイルアップロード(chunking 設定付き)
dify-admin kb upload --name "社内マニュアル" ./docs/ \
--pattern "*.md" --chunk-size 500 --chunk-overlap 50
# 同期(checksum で変更なしスキップ)
dify-admin kb sync --name "社内マニュアル" ./docs/ \
--recursive --checksum --dry-run
# 同期実行
dify-admin kb sync --name "社内マニュアル" ./docs/ \
--recursive --checksum --delete-missing --yes

Desired State(Terraform-lite)

plan差分を確認するためのプレビュー(read-only)です。apply実際に変更を適用する操作(DESTRUCTIVE)です。

# state.ymlapps:
- name: "FAQ Bot"mode: chatdescription: "Customer FAQ"
- name: "Analyzer"mode: advanced-chatknowledge_bases:
- name: "Company Docs"description: "Internal documentation"
dify-admin plan state.yml # 差分プレビュー
dify-admin apply state.yml --yes # 適用
dify-admin apply state.yml --delete-missing --yes # 未定義を削除

環境差分比較

dify-admin env-diff \
--source-url http://dev:5001 \
--target-url http://prod:5001

JSON 出力

dify-admin --json apps list | jq '.[].name'
dify-admin --json apps get --name "FAQ Bot"| jq '.model_config.model'

Agent-Friendly CLI

DifyOps CLI は エージェント(Claude / Cursor 等)からの利用を想定し、README と各コマンドの --help で同じ前提を説明します(REQ-009)。

  • Structured help: Usage / Description / Options / Side Effects など、--help を機械的にパースしやすい構造にしています。
  • JSON 出力: --json では成功時のデータのみ stdout に出し、エラー時は stderr の JSON と終了コードで判定できます。
  • Idempotency: 各コマンドの Idempotent ラベル(yes / no / conditional)は --helpIdempotent: 行と整合させています。
  • stdin: 対応コマンドでは --file - または - を指定して標準入力から読み込みます。

Exit codes

CLI の終了コードは dify_admin.exceptions の定義と一致します。

Code意味
0正常終了
1アプリ/API エラー(DifyAdminError 等)
2CLI の使い方エラー(UsageError
3接続エラー(DifyConnectionError
4タイムアウト(httpx.TimeoutException

Idempotency 分類

分類コマンド例リトライ
yesapps list, apps get, kb list, status, doctor, plan安全
noapps create, apps delete, kb create, kb clear, audit clear注意
conditionalapps rename, apps config set/patch, apps restore, apply, kb sync状態次第

stdin 対応コマンド

コマンド指定方法
apps import--file -
apps config set--file -
plan-(STATE_FILE 引数)
apply-(STATE_FILE 引数)

Python ライブラリ

現在の Python package 名は dify_admin です。

fromdify_adminimportDifyClientwithDifyClient("http://localhost:5001") asclient:
client.login("admin@example.com", "password")
# アプリ操作apps=client.apps_list(fetch_all=True)
client.apps_clone("app-id", name="Copy of App")
client.apps_rename("app-id", "New Name")
# 設定パッチfromdify_admin.patchimportapply_patchesconfig=client.apps_get_config("app-id")
apply_patches(config, set_ops=[("model.name", "gpt-4o")])
client.apps_update_config("app-id", config)
# KB 同期fromdify_admin.syncimportcompute_sync_plan, execute_syncfrompathlibimportPathplan=compute_sync_plan(client, "dataset-id", Path("./docs"), checksum=True)
result=execute_sync(client, "dataset-id", plan)

例外処理

fromdify_adminimportDifyClient, DifyNotFoundErrorwithDifyClient() asclient:
client.login("admin@example.com", "password")
try:
app=client.apps_get("non-existent-id")
exceptDifyNotFoundErrorase:
print(e) # "App not found: non-existent-id"print(e.hint) # "Check that the app ID is correct"print(e.status_code) # 404

制限事項

  • セルフホスト版 Dify 専用です(cloud.dify.ai には非対応)
  • MCP 経由の確認フローは、クライアント実装に依存します
  • 認証情報は DIFY_URL, DIFY_EMAIL, DIFY_PASSWORD 環境変数または .env で渡します(.env.example を参照)
  • advanced-chat / workflow モードのアプリでは apps_config_get / apps_config_set が使えません(Dify API の制約)
  • read-only モードの環境変数名は現在 DIFY_ADMIN_MODE です

Warning:reset-password コマンドは Docker 経由で PostgreSQL に直接アクセスしてパスワードを更新します。Dify の通常 API 操作ではなく DB 直操作です。セルフホスト環境の管理者向け緊急用途に限定してください。

開発

uv venv --python 3.10 .venv &&source .venv/bin/activate
uv pip install -e ".[dev,mcp]"
pytest tests/ -v # 277 テスト
ruff check dify_admin/
ruff format dify_admin/

更新履歴

v0.3.0 (2026-03-27)

  • CLI コマンドメタデータ 38 コマンド化apps restore をコマンドカタログに追加
  • Agent-Friendly CLI — 全コマンドに構造化ヘルプ(Examples / Side Effects / Idempotent ラベル)
  • stdin 対応apps import --file -, apps config set --file -, plan -, apply -
  • Exit Code 体系 — 0(成功)/ 1(アプリエラー)/ 2(usage)/ 3(接続)/ 4(タイムアウト)
  • JSON エラー出力--json モードでエラー時に stderr へ構造化 JSON を出力
  • コマンドメタデータ JSONdify-admin --json / dify-admin apps --json でメタデータ取得
  • --dry-run 拡充apps config set, apps import, apps rename, kb upload に追加

v0.2.0 (2026-03-22)

  • DifyOps ブランド — Product名を DifyOps に統一
  • MCP サーバー 38 ツール — read-only モード、DESTRUCTIVE マーカー、監査ログ
  • Dify v1.13+ 対応 — ファイルアップロード 2 ステップ化、新 API エンドポイント対応
  • Config Patching--set key=value / --unset key による dot-notation 設定変更
  • 環境差分比較env-diff コマンドで dev/prod 比較
  • KB 同期 — checksum ベースの差分同期、--delete-missing オプション

v0.1.0 (2026-03-18)

  • 初回リリース
  • CLI 基本コマンド(apps / kb / audit)
  • MCP サーバー基盤
  • Python ライブラリ(DifyClient
  • plan / apply による desired state 管理

ライセンス

MIT

About

DifyOps: AI-native ops layer for self-hosted Dify

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

DifyOps

Product: DifyOps / GitHub repo: difyops / CLI & Python package: dify-admin

DifyOps は、Dify を GUI ではなく、CLI・Python・生成AI(MCP) から管理するための運用基盤です。

Claude Code や Cursor から自然言語で Dify のアプリ・ナレッジベース・設定変更を操作でき、plan/apply による desired state 管理、設定差分、スナップショット、監査ログにより、Dify 運用に 再現性・安全性・説明可能性 を持ち込めます。

セルフホスト版 Dify v1.13+ 専用です。クラウド版 Dify(cloud.dify.ai)には対応していません。

CLI demo

CLI + Web UI 連動

CLI + Web UI

なぜ必要か

Dify の運用は、作る段階よりも運用段階で手間が増えます。

  • GUI でしか触れない操作が多い
  • 同じ設定変更を複数アプリに反映しにくい
  • dev / prod の差分比較がしづらい
  • ナレッジベースの同期が手作業になりやすい
  • 変更履歴やロールバックが弱い
  • AI 開発フローに Dify 運用を組み込みづらい

DifyOps は、この 運用の摩擦を減らす ためのツールです。

できること

  • AI から Dify を自然言語で操作(MCP サーバー 38 ツール)
  • CLI 38 コマンド でアプリ作成 / 複製 / 差分確認 / 設定変更
  • ナレッジベースの同期と更新(checksum 検知、chunking 設定)
  • YAML で desired state を定義して plan / apply
  • 変更履歴の監査、スナップショット、復元
  • Config Patchingmodel.name=gpt-4o のように dot-notation で設定変更
  • 環境差分比較 — dev と prod のアプリ・KB を比較

こんな人向け

  • Dify をセルフホストで運用している
  • GUI の手作業を減らしたい
  • Dify 環境を再現可能にしたい
  • 生成 AI から Dify の運用を自動化したい
  • dev / prod の差分や設定変更を管理したい

要件

  • Python 3.10+
  • Dify セルフホスト版(v1.13+)

インストール

# GitHub からインストール
pip install git+https://github.com/CaCC-Lab/difyops.git
# MCP サーバーも使う場合
pip install "dify-admin[mcp] @ git+https://github.com/CaCC-Lab/difyops.git"# ローカル開発の場合
git clone https://github.com/CaCC-Lab/difyops.git
cd difyops
pip install -e ".[dev,mcp]"

MCP サーバー(AI 連携)

Claude Code や Cursor から Dify を自然言語で管理できます。

セットアップ

.mcp.json:

{
"mcpServers": {
"difyops": {
"command": "uv",
"args": ["run", "--directory", "/path/to/difyops", "--extra", "mcp", "dify-admin", "mcp", "serve"],
"env": {
"DIFY_URL": "http://localhost:5001",
"DIFY_EMAIL": "admin@example.com",
"DIFY_PASSWORD": "password"
}
}
}
}

.env ファイルに認証情報を書けば .mcp.json から除外できます:

# .env
DIFY_URL=http://localhost:5001
DIFY_EMAIL=admin@example.com
DIFY_PASSWORD=password

使用例(AI に話しかけるだけ)

「アプリ一覧を見せて」
「FAQ Bot の設定を確認して」
「temperature を 0.7 にして」
「このアプリをコピーして」
「devとprodの違いを見せて」
「さっき何を変更した?」

安全設計

状態変更を伴う MCP ツールには、docstring に DESTRUCTIVE: マーカーを付けています。このマーカーにより、MCP クライアントや AI アシスタント側で実行前確認フローを実装しやすくしています。

また、explain ツールを使うことで、各操作の目的・リスク・取り消し方法を事前確認できます。

Important: MCP 側の確認強制は、最終的には MCP クライアント / AI アシスタントの実装に依存します。サーバー側で一律にブロックする仕組みではありません。

read-only モード:DIFY_ADMIN_MODE=readonly を設定すると、Dify リモートへの状態変更を伴う DESTRUCTIVE ツールがサーバー側でブロックされます。ローカルへのスナップショット保存(apps_snapshot)は read-only モードでも実行可能です。

CLI 側では、より明示的な安全柵を提供しています:

  • --dry-run — 実行前プレビュー
  • --yes — 確認スキップ
  • confirm_destructive — 対話確認

38 MCP ツール

カテゴリツール
アプリ情報apps_list, apps_get, apps_search, apps_config_get, apps_config_get_key, apps_export, apps_templates
アプリ操作apps_create, apps_delete, apps_rename, apps_clone, apps_scaffold, apps_import, apps_config_set, apps_config_patch
アプリ差分apps_diff, dsl_diff
スナップショットapps_snapshot, apps_snapshots, apps_restore
KB 情報kb_list, kb_docs_list, kb_docs_status, kb_sync_dry_run
KB 操作kb_create, kb_upload, kb_docs_delete, kb_docs_reindex, kb_clear, kb_sync
状態管理state_plan, state_apply
環境env_diff, status, doctor
運用audit_list, explain, list_operations

CLI クイックスタート

現在の CLI コマンド名は dify-admin です。

# 環境変数を設定(毎回 --email/--password を省略可能)export DIFY_EMAIL=admin@example.com
export DIFY_PASSWORD=password
# 接続チェック
dify-admin doctor
# アプリ一覧
dify-admin apps list
# 名前でアプリ取得
dify-admin apps get --name "FAQ Bot"# 設定をピンポイント変更
dify-admin apps config patch --name "FAQ Bot" \
--set model.completion_params.temperature=0.7
# アプリをコピー
dify-admin apps clone --name "FAQ Bot" --clone-name "FAQ Bot v2"# 2つのアプリを比較
dify-admin apps diff <app_id_1><app_id_2># テンプレートからアプリ作成
dify-admin apps scaffold chat-rag --name "RAG Bot"# スナップショット取得 → 復元
dify-admin apps snapshot --name "FAQ Bot"
dify-admin apps restore <app_id><snapshot_id> --yes

ナレッジベース管理

# ドキュメント一覧
dify-admin kb docs list --name "社内マニュアル"# ファイルアップロード(chunking 設定付き)
dify-admin kb upload --name "社内マニュアル" ./docs/ \
--pattern "*.md" --chunk-size 500 --chunk-overlap 50
# 同期(checksum で変更なしスキップ)
dify-admin kb sync --name "社内マニュアル" ./docs/ \
--recursive --checksum --dry-run
# 同期実行
dify-admin kb sync --name "社内マニュアル" ./docs/ \
--recursive --checksum --delete-missing --yes

Desired State(Terraform-lite)

plan差分を確認するためのプレビュー(read-only)です。apply実際に変更を適用する操作(DESTRUCTIVE)です。

# state.ymlapps:
- name: "FAQ Bot"mode: chatdescription: "Customer FAQ"
- name: "Analyzer"mode: advanced-chatknowledge_bases:
- name: "Company Docs"description: "Internal documentation"
dify-admin plan state.yml # 差分プレビュー
dify-admin apply state.yml --yes # 適用
dify-admin apply state.yml --delete-missing --yes # 未定義を削除

環境差分比較

dify-admin env-diff \
--source-url http://dev:5001 \
--target-url http://prod:5001

JSON 出力

dify-admin --json apps list | jq '.[].name'
dify-admin --json apps get --name "FAQ Bot"| jq '.model_config.model'

Agent-Friendly CLI

DifyOps CLI は エージェント(Claude / Cursor 等)からの利用を想定し、README と各コマンドの --help で同じ前提を説明します(REQ-009)。

  • Structured help: Usage / Description / Options / Side Effects など、--help を機械的にパースしやすい構造にしています。
  • JSON 出力: --json では成功時のデータのみ stdout に出し、エラー時は stderr の JSON と終了コードで判定できます。
  • Idempotency: 各コマンドの Idempotent ラベル(yes / no / conditional)は --helpIdempotent: 行と整合させています。
  • stdin: 対応コマンドでは --file - または - を指定して標準入力から読み込みます。

Exit codes

CLI の終了コードは dify_admin.exceptions の定義と一致します。

Code意味
0正常終了
1アプリ/API エラー(DifyAdminError 等)
2CLI の使い方エラー(UsageError
3接続エラー(DifyConnectionError
4タイムアウト(httpx.TimeoutException

Idempotency 分類

分類コマンド例リトライ
yesapps list, apps get, kb list, status, doctor, plan安全
noapps create, apps delete, kb create, kb clear, audit clear注意
conditionalapps rename, apps config set/patch, apps restore, apply, kb sync状態次第

stdin 対応コマンド

コマンド指定方法
apps import--file -
apps config set--file -
plan-(STATE_FILE 引数)
apply-(STATE_FILE 引数)

Python ライブラリ

現在の Python package 名は dify_admin です。

fromdify_adminimportDifyClientwithDifyClient("http://localhost:5001") asclient:
client.login("admin@example.com", "password")
# アプリ操作apps=client.apps_list(fetch_all=True)
client.apps_clone("app-id", name="Copy of App")
client.apps_rename("app-id", "New Name")
# 設定パッチfromdify_admin.patchimportapply_patchesconfig=client.apps_get_config("app-id")
apply_patches(config, set_ops=[("model.name", "gpt-4o")])
client.apps_update_config("app-id", config)
# KB 同期fromdify_admin.syncimportcompute_sync_plan, execute_syncfrompathlibimportPathplan=compute_sync_plan(client, "dataset-id", Path("./docs"), checksum=True)
result=execute_sync(client, "dataset-id", plan)

例外処理

fromdify_adminimportDifyClient, DifyNotFoundErrorwithDifyClient() asclient:
client.login("admin@example.com", "password")
try:
app=client.apps_get("non-existent-id")
exceptDifyNotFoundErrorase:
print(e) # "App not found: non-existent-id"print(e.hint) # "Check that the app ID is correct"print(e.status_code) # 404

制限事項

  • セルフホスト版 Dify 専用です(cloud.dify.ai には非対応)
  • MCP 経由の確認フローは、クライアント実装に依存します
  • 認証情報は DIFY_URL, DIFY_EMAIL, DIFY_PASSWORD 環境変数または .env で渡します(.env.example を参照)
  • advanced-chat / workflow モードのアプリでは apps_config_get / apps_config_set が使えません(Dify API の制約)
  • read-only モードの環境変数名は現在 DIFY_ADMIN_MODE です

Warning:reset-password コマンドは Docker 経由で PostgreSQL に直接アクセスしてパスワードを更新します。Dify の通常 API 操作ではなく DB 直操作です。セルフホスト環境の管理者向け緊急用途に限定してください。

開発

uv venv --python 3.10 .venv &&source .venv/bin/activate
uv pip install -e ".[dev,mcp]"
pytest tests/ -v # 277 テスト
ruff check dify_admin/
ruff format dify_admin/

更新履歴

v0.3.0 (2026-03-27)

  • CLI コマンドメタデータ 38 コマンド化apps restore をコマンドカタログに追加
  • Agent-Friendly CLI — 全コマンドに構造化ヘルプ(Examples / Side Effects / Idempotent ラベル)
  • stdin 対応apps import --file -, apps config set --file -, plan -, apply -
  • Exit Code 体系 — 0(成功)/ 1(アプリエラー)/ 2(usage)/ 3(接続)/ 4(タイムアウト)
  • JSON エラー出力--json モードでエラー時に stderr へ構造化 JSON を出力
  • コマンドメタデータ JSONdify-admin --json / dify-admin apps --json でメタデータ取得
  • --dry-run 拡充apps config set, apps import, apps rename, kb upload に追加

v0.2.0 (2026-03-22)

  • DifyOps ブランド — Product名を DifyOps に統一
  • MCP サーバー 38 ツール — read-only モード、DESTRUCTIVE マーカー、監査ログ
  • Dify v1.13+ 対応 — ファイルアップロード 2 ステップ化、新 API エンドポイント対応
  • Config Patching--set key=value / --unset key による dot-notation 設定変更
  • 環境差分比較env-diff コマンドで dev/prod 比較
  • KB 同期 — checksum ベースの差分同期、--delete-missing オプション

v0.1.0 (2026-03-18)

  • 初回リリース
  • CLI 基本コマンド(apps / kb / audit)
  • MCP サーバー基盤
  • Python ライブラリ(DifyClient
  • plan / apply による desired state 管理

ライセンス

MIT

About

DifyOps: AI-native ops layer for self-hosted Dify

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

DifyOps

Product: DifyOps / GitHub repo: difyops / CLI & Python package: dify-admin

DifyOps は、Dify を GUI ではなく、CLI・Python・生成AI(MCP) から管理するための運用基盤です。

Claude Code や Cursor から自然言語で Dify のアプリ・ナレッジベース・設定変更を操作でき、plan/apply による desired state 管理、設定差分、スナップショット、監査ログにより、Dify 運用に 再現性・安全性・説明可能性 を持ち込めます。

セルフホスト版 Dify v1.13+ 専用です。クラウド版 Dify(cloud.dify.ai)には対応していません。

CLI demo

CLI + Web UI 連動

CLI + Web UI

なぜ必要か

Dify の運用は、作る段階よりも運用段階で手間が増えます。

  • GUI でしか触れない操作が多い
  • 同じ設定変更を複数アプリに反映しにくい
  • dev / prod の差分比較がしづらい
  • ナレッジベースの同期が手作業になりやすい
  • 変更履歴やロールバックが弱い
  • AI 開発フローに Dify 運用を組み込みづらい

DifyOps は、この 運用の摩擦を減らす ためのツールです。

できること

  • AI から Dify を自然言語で操作(MCP サーバー 38 ツール)
  • CLI 38 コマンド でアプリ作成 / 複製 / 差分確認 / 設定変更
  • ナレッジベースの同期と更新(checksum 検知、chunking 設定)
  • YAML で desired state を定義して plan / apply
  • 変更履歴の監査、スナップショット、復元
  • Config Patchingmodel.name=gpt-4o のように dot-notation で設定変更
  • 環境差分比較 — dev と prod のアプリ・KB を比較

こんな人向け

  • Dify をセルフホストで運用している
  • GUI の手作業を減らしたい
  • Dify 環境を再現可能にしたい
  • 生成 AI から Dify の運用を自動化したい
  • dev / prod の差分や設定変更を管理したい

要件

  • Python 3.10+
  • Dify セルフホスト版(v1.13+)

インストール

# GitHub からインストール
pip install git+https://github.com/CaCC-Lab/difyops.git
# MCP サーバーも使う場合
pip install "dify-admin[mcp] @ git+https://github.com/CaCC-Lab/difyops.git"# ローカル開発の場合
git clone https://github.com/CaCC-Lab/difyops.git
cd difyops
pip install -e ".[dev,mcp]"

MCP サーバー(AI 連携)

Claude Code や Cursor から Dify を自然言語で管理できます。

セットアップ

.mcp.json:

{
"mcpServers": {
"difyops": {
"command": "uv",
"args": ["run", "--directory", "/path/to/difyops", "--extra", "mcp", "dify-admin", "mcp", "serve"],
"env": {
"DIFY_URL": "http://localhost:5001",
"DIFY_EMAIL": "admin@example.com",
"DIFY_PASSWORD": "password"
}
}
}
}

.env ファイルに認証情報を書けば .mcp.json から除外できます:

# .env
DIFY_URL=http://localhost:5001
DIFY_EMAIL=admin@example.com
DIFY_PASSWORD=password

使用例(AI に話しかけるだけ)

「アプリ一覧を見せて」
「FAQ Bot の設定を確認して」
「temperature を 0.7 にして」
「このアプリをコピーして」
「devとprodの違いを見せて」
「さっき何を変更した?」

安全設計

状態変更を伴う MCP ツールには、docstring に DESTRUCTIVE: マーカーを付けています。このマーカーにより、MCP クライアントや AI アシスタント側で実行前確認フローを実装しやすくしています。

また、explain ツールを使うことで、各操作の目的・リスク・取り消し方法を事前確認できます。

Important: MCP 側の確認強制は、最終的には MCP クライアント / AI アシスタントの実装に依存します。サーバー側で一律にブロックする仕組みではありません。

read-only モード:DIFY_ADMIN_MODE=readonly を設定すると、Dify リモートへの状態変更を伴う DESTRUCTIVE ツールがサーバー側でブロックされます。ローカルへのスナップショット保存(apps_snapshot)は read-only モードでも実行可能です。

CLI 側では、より明示的な安全柵を提供しています:

  • --dry-run — 実行前プレビュー
  • --yes — 確認スキップ
  • confirm_destructive — 対話確認

38 MCP ツール

カテゴリツール
アプリ情報apps_list, apps_get, apps_search, apps_config_get, apps_config_get_key, apps_export, apps_templates
アプリ操作apps_create, apps_delete, apps_rename, apps_clone, apps_scaffold, apps_import, apps_config_set, apps_config_patch
アプリ差分apps_diff, dsl_diff
スナップショットapps_snapshot, apps_snapshots, apps_restore
KB 情報kb_list, kb_docs_list, kb_docs_status, kb_sync_dry_run
KB 操作kb_create, kb_upload, kb_docs_delete, kb_docs_reindex, kb_clear, kb_sync
状態管理state_plan, state_apply
環境env_diff, status, doctor
運用audit_list, explain, list_operations

CLI クイックスタート

現在の CLI コマンド名は dify-admin です。

# 環境変数を設定(毎回 --email/--password を省略可能)export DIFY_EMAIL=admin@example.com
export DIFY_PASSWORD=password
# 接続チェック
dify-admin doctor
# アプリ一覧
dify-admin apps list
# 名前でアプリ取得
dify-admin apps get --name "FAQ Bot"# 設定をピンポイント変更
dify-admin apps config patch --name "FAQ Bot" \
--set model.completion_params.temperature=0.7
# アプリをコピー
dify-admin apps clone --name "FAQ Bot" --clone-name "FAQ Bot v2"# 2つのアプリを比較
dify-admin apps diff <app_id_1><app_id_2># テンプレートからアプリ作成
dify-admin apps scaffold chat-rag --name "RAG Bot"# スナップショット取得 → 復元
dify-admin apps snapshot --name "FAQ Bot"
dify-admin apps restore <app_id><snapshot_id> --yes

ナレッジベース管理

# ドキュメント一覧
dify-admin kb docs list --name "社内マニュアル"# ファイルアップロード(chunking 設定付き)
dify-admin kb upload --name "社内マニュアル" ./docs/ \
--pattern "*.md" --chunk-size 500 --chunk-overlap 50
# 同期(checksum で変更なしスキップ)
dify-admin kb sync --name "社内マニュアル" ./docs/ \
--recursive --checksum --dry-run
# 同期実行
dify-admin kb sync --name "社内マニュアル" ./docs/ \
--recursive --checksum --delete-missing --yes

Desired State(Terraform-lite)

plan差分を確認するためのプレビュー(read-only)です。apply実際に変更を適用する操作(DESTRUCTIVE)です。

# state.ymlapps:
- name: "FAQ Bot"mode: chatdescription: "Customer FAQ"
- name: "Analyzer"mode: advanced-chatknowledge_bases:
- name: "Company Docs"description: "Internal documentation"
dify-admin plan state.yml # 差分プレビュー
dify-admin apply state.yml --yes # 適用
dify-admin apply state.yml --delete-missing --yes # 未定義を削除

環境差分比較

dify-admin env-diff \
--source-url http://dev:5001 \
--target-url http://prod:5001

JSON 出力

dify-admin --json apps list | jq '.[].name'
dify-admin --json apps get --name "FAQ Bot"| jq '.model_config.model'

Agent-Friendly CLI

DifyOps CLI は エージェント(Claude / Cursor 等)からの利用を想定し、README と各コマンドの --help で同じ前提を説明します(REQ-009)。

  • Structured help: Usage / Description / Options / Side Effects など、--help を機械的にパースしやすい構造にしています。
  • JSON 出力: --json では成功時のデータのみ stdout に出し、エラー時は stderr の JSON と終了コードで判定できます。
  • Idempotency: 各コマンドの Idempotent ラベル(yes / no / conditional)は --helpIdempotent: 行と整合させています。
  • stdin: 対応コマンドでは --file - または - を指定して標準入力から読み込みます。

Exit codes

CLI の終了コードは dify_admin.exceptions の定義と一致します。

Code意味
0正常終了
1アプリ/API エラー(DifyAdminError 等)
2CLI の使い方エラー(UsageError
3接続エラー(DifyConnectionError
4タイムアウト(httpx.TimeoutException

Idempotency 分類

分類コマンド例リトライ
yesapps list, apps get, kb list, status, doctor, plan安全
noapps create, apps delete, kb create, kb clear, audit clear注意
conditionalapps rename, apps config set/patch, apps restore, apply, kb sync状態次第

stdin 対応コマンド

コマンド指定方法
apps import--file -
apps config set--file -
plan-(STATE_FILE 引数)
apply-(STATE_FILE 引数)

Python ライブラリ

現在の Python package 名は dify_admin です。

fromdify_adminimportDifyClientwithDifyClient("http://localhost:5001") asclient:
client.login("admin@example.com", "password")
# アプリ操作apps=client.apps_list(fetch_all=True)
client.apps_clone("app-id", name="Copy of App")
client.apps_rename("app-id", "New Name")
# 設定パッチfromdify_admin.patchimportapply_patchesconfig=client.apps_get_config("app-id")
apply_patches(config, set_ops=[("model.name", "gpt-4o")])
client.apps_update_config("app-id", config)
# KB 同期fromdify_admin.syncimportcompute_sync_plan, execute_syncfrompathlibimportPathplan=compute_sync_plan(client, "dataset-id", Path("./docs"), checksum=True)
result=execute_sync(client, "dataset-id", plan)

例外処理

fromdify_adminimportDifyClient, DifyNotFoundErrorwithDifyClient() asclient:
client.login("admin@example.com", "password")
try:
app=client.apps_get("non-existent-id")
exceptDifyNotFoundErrorase:
print(e) # "App not found: non-existent-id"print(e.hint) # "Check that the app ID is correct"print(e.status_code) # 404

制限事項

  • セルフホスト版 Dify 専用です(cloud.dify.ai には非対応)
  • MCP 経由の確認フローは、クライアント実装に依存します
  • 認証情報は DIFY_URL, DIFY_EMAIL, DIFY_PASSWORD 環境変数または .env で渡します(.env.example を参照)
  • advanced-chat / workflow モードのアプリでは apps_config_get / apps_config_set が使えません(Dify API の制約)
  • read-only モードの環境変数名は現在 DIFY_ADMIN_MODE です

Warning:reset-password コマンドは Docker 経由で PostgreSQL に直接アクセスしてパスワードを更新します。Dify の通常 API 操作ではなく DB 直操作です。セルフホスト環境の管理者向け緊急用途に限定してください。

開発

uv venv --python 3.10 .venv &&source .venv/bin/activate
uv pip install -e ".[dev,mcp]"
pytest tests/ -v # 277 テスト
ruff check dify_admin/
ruff format dify_admin/

更新履歴

v0.3.0 (2026-03-27)

  • CLI コマンドメタデータ 38 コマンド化apps restore をコマンドカタログに追加
  • Agent-Friendly CLI — 全コマンドに構造化ヘルプ(Examples / Side Effects / Idempotent ラベル)
  • stdin 対応apps import --file -, apps config set --file -, plan -, apply -
  • Exit Code 体系 — 0(成功)/ 1(アプリエラー)/ 2(usage)/ 3(接続)/ 4(タイムアウト)
  • JSON エラー出力--json モードでエラー時に stderr へ構造化 JSON を出力
  • コマンドメタデータ JSONdify-admin --json / dify-admin apps --json でメタデータ取得
  • --dry-run 拡充apps config set, apps import, apps rename, kb upload に追加

v0.2.0 (2026-03-22)

  • DifyOps ブランド — Product名を DifyOps に統一
  • MCP サーバー 38 ツール — read-only モード、DESTRUCTIVE マーカー、監査ログ
  • Dify v1.13+ 対応 — ファイルアップロード 2 ステップ化、新 API エンドポイント対応
  • Config Patching--set key=value / --unset key による dot-notation 設定変更
  • 環境差分比較env-diff コマンドで dev/prod 比較
  • KB 同期 — checksum ベースの差分同期、--delete-missing オプション

v0.1.0 (2026-03-18)

  • 初回リリース
  • CLI 基本コマンド(apps / kb / audit)
  • MCP サーバー基盤
  • Python ライブラリ(DifyClient
  • plan / apply による desired state 管理

ライセンス

MIT

About

DifyOps: AI-native ops layer for self-hosted Dify

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages