n8n MCP Server
by GLAMCODECRUX
README.md
# n8n MCP Server
n8n の REST API とローカルの Ollama を、MCP (Model Context Protocol) ツールとして
公開する Python サーバーです。VS Code などの MCP クライアントから
ワークフローの作成・実行・監視を自然言語で指示できます。
## 特徴
- 自然言語で n8n のワークフロー作成、削除、復元、有効化、公開、実行、一覧取得、詳細取得
- 実行履歴の一覧取得と詳細取得
- 登録済み Credentials の一覧取得
- Ollama 経由でのローカル / クラウドモデルへの問い合わせ
- n8n と Ollama の稼働状態をまとめて確認するヘルスチェック
- すべての操作は非同期 (httpx.AsyncClient) で実装
- Self-hosted n8n / Cloud n8n 両対応 `N8N_URL` / `N8N_API_KEY` の差し替えで切替えすることが可能
## 必要環境
- macOS または Linux
- Python 3.14.7 以上
- 起動済みの n8n (デフォルト `http://127.0.0.1:5678`)
- 起動済みの Ollama (デフォルト `http://127.0.0.1:11434`)
## 構築手順
### 1. リポジトリを取得
```
git clone <このリポジトリのURL> ~/.n8n-mcp-server
cd ~/.n8n-mcp-server
```
`start.sh` と `stop.sh` はホームディレクトリの `~/.n8n-mcp-server` 配下を
前提にしているため、必ずこのパスに配置してください。
### 2. 仮想環境を作成して有効化
```
python -m venv venv
source venv/bin/activate
```
### 3. 依存パッケージをインストール
```
pip install -r requirements.txt
```
`requirements.txt` には以下が含まれます。
- `mcp[cli]>=1.0.0` — MCP サーバーフレームワーク
- `httpx>=0.27.0` — 非同期 HTTP クライアント
### 4. n8n の API キーを発行
1. n8n の Web UI (`http://127.0.0.1:5678`) を開く
2. 左メニューの `Settings` → `API` を開く
3. `Create an API key` をクリックしてキーを生成
4. 生成されたキーを後述の環境変数 `N8N_API_KEY` に設定
### 5. 環境変数を設定
> n8n REST API へのリクエストには `X-N8N-API-KEY` ヘッダが自動で付与されます。
シェルの rc ファイル (`~/.zshrc` など) に追記します。
```
export N8N_HOST=127.0.0.1
export N8N_PORT=5678
export N8N_URL="http://${N8N_HOST}:${N8N_PORT}"
export N8N_USER_FOLDER="${HOME}/.n8n"
export MCP_SERVER_DIR="${HOME}/.n8n-mcp-server"
export N8N_BASIC_AUTH_ACTIVE=false
export N8N_USER_MANAGEMENT_DISABLED=true
```
`OLLAMA_MODEL` はクラウドモデル `minimax-m3:cloud` なども指定可能です。
反映するには `source ~/.zshrc` を実行してください。
## 起動と停止
### 起動
```
./start.sh
```
実行内容:
1. ホームの `~/.n8n-mcp-server` に移動
2. `venv` を有効化
3. `python server.py` をバックグラウンド (`nohup`) で起動
4. ログを `logs/mcp.log` に出力
5. プロセス ID を `tmp/mcp.pid` に保存
起動後、エラーがあった場合のログは `tail -f logs/mcp.log` で確認できます。
### 停止
```
./stop.sh
```
`tmp/mcp.pid` のプロセスに `kill` を送って停止し、PID ファイルを削除します。
## Mac で VS Code からの接続
macOS の場合は `setup_mcp_mac.py` を実行することで、ウィンドウからの設定が可能です。
### カレントディレクトリに移動
```
cd ~/.n8n-mcp-server/scripts
```
### セットアップを実行
```
./setup_mcp_mac.py
```
## Linux で VS Code からの接続
Linux 環境の場合は `setup_mcp_linux.py` を実行することで、ウィンドウからの設定が可能です。
### カレントディレクトリに移動
```
cd ~/.n8n-mcp-server/scripts
```
### セットアップを実行
```
./setup_mcp_linux.py
```
## 提供されるツール
すべて `server.py` の `@mcp.tool()` デコレータで定義されています。
ツール名と引数は MCP クライアント (VS Code Copilot Chat など) に表示されます。
### システム状態確認
- **check_n8n_status**
n8n のヘルスチェック(`GET /healthz`)、登録済みワークフロー数(`GET /api/v1/workflows`)、
Ollama のモデル一覧(`GET /api/tags`)、API キーの設定有無をまとめて JSON で返します。
レスポンス形式: `{"ok", "n8n_url", "n8n_health", "workflow_count", "ollama_host", "ollama_models", "api_key_configured"}`。
引数なし。
- **ask_ollama(prompt, model="")**
Ollama 経由でモデルに問い合わせます。
`model` を空文字列にすると環境変数 `OLLAMA_MODEL`、それも未設定なら `minimax-m3:cloud` を使用します。
エンドポイントは `POST {OLLAMA_HOST}/api/generate`、リクエストは `{"model", "prompt", "stream": false}`。
`ollama list` で利用可能なモデル名を確認できます。
### n8n ワークフロー操作
- **list_n8n_workflows()**
すべてのワークフローの一覧を JSON 文字列で返します。
- **get_n8n_workflow(workflow_id)**
指定 ID のワークフロー詳細 (ノードや接続を含む) を取得します。
- **create_n8n_workflow(name, nodes_json, connections_json="{}")**
新規ワークフローを作成します。
`nodes_json` はノード配列の JSON 文字列、
`connections_json` は接続オブジェクトの JSON 文字列(既定 `"{}"`)です。
リクエストには `settings: {"executionOrder": "v1"}` が自動付与されます。
`nodes_json` / `connections_json` が JSON として不正な場合は `{"ok": false, "error": "invalid_json"}` を返します。
成功時は作成されたワークフローの JSON を返します。
- **delete_n8n_workflow(workflow_id)**
指定 ID のワークフローを削除します。
- **activate_n8n_workflow(workflow_id, active=True)**
`PATCH /api/v1/workflows/{id}` に `{"active": active}` を送ります。
公開済みバージョンが必要です。
- **deactivate_n8n_workflow(workflow_id)**
ワークフローを無効化します (`active=false`)。公開済みバージョンは不要です。
- **publish_n8n_workflow(workflow_id)**
1. `GET /api/v1/workflows/{id}` で現在の `versionId` を取得
2. `versionId` を `activeVersionId` に設定し、`PATCH /api/v1/workflows/{id}` に `{"activeVersionId": versionId, "active": true}` を送る
`versionId` が無い場合は `{"ok": false, "error": "versionId_not_found"}` を返します。
API 制限により失敗することがあるため、UI での公開を推奨します。
### 実行 (Execution)
- **execute_workflow_now(workflow_id)**
`POST /api/v1/workflows/{id}/run` で実行します。タイムアウトは 60 秒です。
- **get_n8n_executions(workflow_id="", limit=20)**
`GET /api/v1/executions?limit=...&workflowId=...` で実行履歴を取得します。
`workflow_id` を空にすると `workflowId` パラメータを送らず全件対象になります。
- **get_n8n_execution(execution_id, include_data=True)**
`GET /api/v1/executions/{id}?includeData=true|false` で特定の実行履歴の詳細を取得します。
`include_data=False` の場合は `includeData` パラメータを送りません。
### Credentials
- **list_n8n_credentials()**
`GET /api/v1/credentials` の生レスポンス(JSON 文字列)を返します。
各エントリには `id` / `name` / `type` などが含まれます。
## 使用例
### 稼働状態を一括確認する
Copilot Chat で次のように呼び出します。
```
check_n8n_status を使って n8n と Ollama の状態を確認して
```
### ワークフローの一覧と詳細を見る
```
list_n8n_workflows を実行して、ID が 123 のものを get_n8n_workflow で詳細を見せて
```
### ワークフローを新規作成する
`nodes_json` には n8n のノード定義配列を JSON 文字列で渡します。
例として、毎日 9 時に HTTP リクエストを送るだけの最小ワークフロー:
```
create_n8n_workflow を次の内容で実行して:
name: "Daily Ping"
nodes_json: '[{
"parameters": {
"url": "https://example.com",
"method": "GET"
},
"id": "abc123",
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 1,
"position": [240, 300]
}, {
"parameters": {
"rule": {"hour": 9}
},
"id": "def456",
"name": "Schedule",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1,
"position": [460, 300]
}]'
connections_json: '{}'
```
成功すると作成されたワークフローの JSON が返るので、その ID を使って
実行や有効化を行います。
```
execute_workflow_now を ID 123 で実行
activate_n8n_workflow を ID 123 で active=true に
```
### 実行履歴を調査する
```
get_n8n_executions を workflow_id=123, limit=5 で取得して
失敗しているものがあれば get_n8n_execution で詳細を見せて
```
### Ollama に問い合わせる
```
ask_ollama を使って「Python の非同期処理とは?」を教えて
```
モデル名を明示する場合は次のとおりです。
```
ask_ollama(prompt="俳句を一つ作って", model="minimax-m3:cloud")
```
## 環境変数まとめ
- `N8N_URL` — n8n のベース URL。省略時は `http://127.0.0.1:5678`
- `N8N_API_KEY` — n8n の API キー。**未設定だと `server.py` は起動時に exit 1 で停止** します
- `OLLAMA_HOST` — Ollama のベース URL。空文字だと起動時に exit 1。省略時は `http://127.0.0.1:11434`
- `OLLAMA_MODEL` — `ask_ollama` で既定で使うモデル名。省略時は `minimax-m3:cloud`
### 起動時の環境変数検証
`server.py` は `__main__` ブロック先頭で `_validate_env()` を呼び、以下の環境変数のうち
**空文字のものをエラー**にします。両方欠落の場合は両方がカンマ区切りで表示されます。
```
[FATAL] 必須環境変数が未設定です: N8N_API_KEY, OLLAMA_HOST
シェル(rc ファイル) または MCP 設定 (settings.json / mcp.json) を確認してください。
```
## トラブルシューティング
- **`model 'xxx' not found` と返る**
`ollama list` を実行し、表示されたモデル名を `model` 引数に渡してください。
未インストールなら `ollama pull <モデル名>` で取得します。
- **n8n API が 401 / 403 を返す**
環境変数 `N8N_API_KEY` が正しいか、`n8n restart` 後にキーが無効化されていないか確認します。
- **接続エラーが返る(`{"ok": false, "error": "ConnectError", ...}`)**
`ask_ollama` などで `httpx.ConnectError` が発生した場合、`server.py` の `_err()` が
例外クラス名(`ConnectError` 等)を `error` フィールドに入れて返します。
`N8N_URL` と `OLLAMA_HOST` のホスト名・ポートで各サービスが起動しているか確認します。
`curl http://127.0.0.1:5678/healthz` や
`curl http://127.0.0.1:11434/api/tags` で疎通確認ができます。
- **起動はしたが VS Code でツールが出てこない**
`settings.json` の `mcp.servers` または `mcp.json` の `servers` 設定を見直して、VS Code を再読み込みします。
サーバーが標準出力に JSON-RPC を流しているか `tail -f logs/mcp.log` で確認してください。
- **`[FATAL] 必須環境変数が未設定です` で起動に失敗する**
必須環境変数 (`N8N_API_KEY`, `OLLAMA_HOST`) のいずれかが空のまま起動しています。
検証ロジックとエラーメッセージのフォーマットは「起動時の環境変数検証」を確認の上で修正してください。
- **VS Code からの接続 / 手動で構成したい**
スクリプト実行しても VS Code でツールが見つからない場合、
`settings.json` または `mcp.json` のいずれかに以下を手動で追加します。
> VS Code 1.101+ では `mcp.json` の `servers` キーを使用します。
> それ未満のバージョンでは `settings.json` の `mcp.servers` キーを使用します。
`settings.json` 用(VS Code 1.100 以前):
```
{
"mcp.servers": {
"n8n-mcp-server": {
"command": "python",
"args": ["~/.n8n-mcp-server/server.py"],
"env": {
"N8N_URL": "http://127.0.0.1:5678",
"N8N_API_KEY": "APIキー",
"OLLAMA_HOST": "http://127.0.0.1:11434",
"OLLAMA_MODEL": "minimax-m3:cloud"
}
}
}
}
```
`mcp.json` 用(VS Code 1.101+):トップレベルを `servers` に変更します。
```
{
"servers": {
"n8n-mcp-server": {
"command": "python",
"args": ["~/.n8n-mcp-server/server.py"],
"env": {
"N8N_URL": "http://127.0.0.1:5678",
"N8N_API_KEY": "APIキー",
"OLLAMA_HOST": "http://127.0.0.1:11434",
"OLLAMA_MODEL": "minimax-m3:cloud"
}
}
}
}
```
VS Code を再起動すると、Copilot Chat からツールとして呼び出せるようになります。
- **ファイルが実行できなかった**
起動するファイルに実行権限の付与をしてください。
```
chmod +x <ファイル名>
```
## ファイル構成
- `server.py` — MCP サーバーの本体。各ツールの実装
- `tests/` — pytest ユニットテスト (httpx.MockTransport で外部 HTTP を差し替え)
- `pytest.ini` — pytest 設定 (`asyncio_mode = auto`, `testpaths = tests`)
- `.gitignore` — `__pycache__/`, `.pytest_cache/`, `venv/`, `.DS_Store` 等を除外
- `requirements.txt` — 依存パッケージ一覧
- `start.sh` — バックグラウンド起動スクリプト
- `stop.sh` — 停止スクリプト
- `logs/` — 実行ログの出力先
- `tmp/mcp.pid` — 起動中のプロセス ID
- `venv/` — Python 仮想環境
## テスト
全 13 ツールの正常系・異常系と、起動時の環境変数検証をカバーした 24 件の
テストが用意されています。
```
pip install pytest pytest-asyncio
pytest tests/ -v
```
### MCP Tool Annotations
すべてのツールに OpenAI Directory 互換の以下のヒントを宣言しています。
| Hint | 意味 |
|---|---|
| `readOnlyHint` | ツールが状態を変更せずに「見るだけ」なのかを示す |
| `destructiveHint` | 元に戻せない変更の可能性を事前告知する |
| `idempotentHint` | 同じ引数で複数回呼んだ時の副作用の有無を示す |
| `openWorldHint` | インターネット経由の外部サービスとの通信の有無を示す |
### エラーハンドリング
すべてのツールは `try/except` でラップされ、構造化エラー
(`{"ok": false, "error": ..., "message": ...}`) を返します。
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues