jpskill.com
🛠️ 開発・MCP コミュニティ

noui-record-workflow

ブラウザ上の操作手順を記録し、業務効率化に役立つFastMCPサーバーやClaude Code Skillとして出力することで、ウェブサイトを使った作業を自動化できる便利なSkill。

📜 元の英語説明(参考)

Use this skill when the user wants to record a browser workflow and export it as a FastMCP server, a Claude Code Skill, or both. Triggers on "record a workflow", "export as MCP", "export as skill", "generate a FastMCP server", "generate a Claude Code skill", "noui workflow record", "workflow export", "capture a workflow", "turn a workflow into a tool", "create an MCP server from a website", or "I want to automate this workflow". Covers authenticated (session-cookie via Tabby), static API-key, and unauthenticated sub-paths. Covers both output formats.

🇯🇵 日本人クリエイター向け解説

一言でいうと

ブラウザ上の操作手順を記録し、業務効率化に役立つFastMCPサーバーやClaude Code Skillとして出力することで、ウェブサイトを使った作業を自動化できる便利なSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o noui-record-workflow.zip https://jpskill.com/download/9728.zip && unzip -o noui-record-workflow.zip && rm noui-record-workflow.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/9728.zip -OutFile "$d\noui-record-workflow.zip"; Expand-Archive "$d\noui-record-workflow.zip" -DestinationPath $d -Force; ri "$d\noui-record-workflow.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して noui-record-workflow.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → noui-record-workflow フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

NoUI レコードワークフロー

ブラウザのワークフローを記録し、実行可能な FastMCP サーバー、Claude Code Skill、またはその両方にコンパイルします。セッションクッキーを使用するアプリ (完全な Tabby ログインフロー)、静的な API キーを使用するアプリ (環境変数を設定するだけ)、および公開されている認証不要の API で動作します。

すべてのコマンドは、noui/ ディレクトリから .venv/bin/python cli/main.py を使用して実行します。

前提条件: /noui-setup が完了している必要があります。パス A (セッションクッキー) の場合は、/noui-record-login も完了しており、Tabby ブラウザセッションが実行中である必要があります (tabby session ensure)。


出力形式の選択

エクスポートする前に、ユーザーが実際に何を求めているかを決定します。2 つの直交する軸があります。

  1. 認証モデル — 以下のパス A/B/C (セッションクッキー vs 静的 API キー vs 公開)。
  2. 出力形式--as mcp (常時稼働の FastMCP サーバー)、--as skill (遅延ロードされる Claude Code skill)、または --as both (デフォルト)。

どの出力を選択するかの基準:

出力 最適な用途
--as mcp ツールエージェントが頻繁に呼び出す場合。型付きのツールスキーマが常にコンテキストに必要
--as skill ロングテール / まれなワークフロー。意図が一致するまで Claude のコンテキストウィンドウをクリーンに保つ
--as both 不明な場合。追加の記録作業は不要。2 回目のコンパイルパスを実行するだけ。両方を出荷し、使用状況に応じて決定する

デフォルトは --as both です。このスキルの残りの部分では、MCP 出力 (認証の検証、mcp のライフサイクルなど) に焦点を当てています。これは、より確立されたパスであるためです。スキル側のライフサイクル (skill list / show / install / uninstall) については、エクスポート後に /noui-generate-skill を呼び出します。


実行方法

生成された操作は、デフォルトでTabby の認証されたブラウザ内で実行されます。各操作は次のとおりです。

  1. localhost:9222 の Tabby の CDP エンドポイントへの WebSocket を開きます。
  2. URL が記録されたドメインと一致するタブを検索します (find_page 経由)。
  3. cdp_fetch(ws_url, url, method=..., headers=..., body=...) を呼び出します。これは、Runtime.evaluate 経由で fetch(url, {credentials: 'include'}) を実行します。したがって、実際のブラウザのクッキー、TLS フィンガープリント、およびオリジンが使用されます。

2 つのプリミティブは、生成された noui_runtime/cdp.py モジュールに存在します。

from noui_runtime.cdp import find_page, cdp_fetch

これがデフォルトである理由

  • 資格情報の抽出なし。 Python MCP プロセスは、クッキーまたはベアラートークンを直接処理しません。
  • 実際のユーザーの動作と一致。 実際のブラウザのフィンガープリントとクッキーにより、Python HTTP クライアントで発生する Akamai / Cloudflare / PerimeterX の誤検出が排除されます。
  • セッションのリフレッシュ下でより安全。 クッキーのローテーションはブラウザによって処理されます。MCP は古いクッキーを決して見ません。

ランタイムの前提条件

  • Tabby は、アプリのライブセッションで実行されている必要があります。
  • ターゲットドメインのページがそのセッションで開かれている必要があります。そうでない場合、最初の呼び出しは tabby session ensure --profile <slug> を示す明確なエラーを発生させます。

エスケープハッチ — --execution-mode http

CDP が機能しない場合は、レガシーの Python 側のパスに切り替えます。

.venv/bin/python cli/main.py workflow export <session_id> --execution-mode http

次の場合に http モードを使用します。

  • API がサーバー間であり、ブラウザのオリジンから到達できない場合。
  • CORS が credentials: 'include' クロスオリジンをブロックする場合 (Access-Control-Allow-Credentials: true がない場合)。
  • ライブ Tabby なしで MCP をホストで実行している場合。

--execution-mode http の下では、ジェネレーターは従来の httpx.AsyncClient() + resolve_auth() テンプレートを出力します。同じフラグは noui autopilot export でも使用できます。


モードの選択

続行する前に、ユーザーに確認するか (またはコンテキストから推測します)。

アプリの認証タイプ パス
セッションクッキーログイン — /noui-record-login から tabby_profile_id を取得 パス A — tabby_credentials
すべてのリクエストに静的な API キー / ベアラートークンを使用。ログインページなし パス B — static_secret_header
パブリック API。資格情報は不要 パス C — unauthenticated

コンパイラーは、HAR から戦略を自動検出します (Authorization ヘッダー + Set-Cookie なし → パス B)。パス A と B の両方で --profile-slug を渡します。パス C では省略します。


重要なルール (決して違反しないこと)

  • ユーザーに記録を依頼する前に、常にバックエンドを起動する
  • 決して workflow export をスキップしない — 記録だけではサーバーまたはスキルは生成されない
  • ユーザーがどちらかを選択する明確な理由がない限り、デフォルトの --as both を優先する。これは、追加のコンパイルパスが 1 回だけであり、後で選択肢を保持する
  • パス A/B の場合: 常に --profile-slug <slug> を渡す — これはランタイムの資格情報識別子。これがないと、認証は認証なしにフォールバックする
  • DB UUID を --profile-slug として決して渡さない — これは管理者専用。人間が読めるスラッグ (例: example-bank8fdadf43-... ではない) を使用する
  • エクスポート後に印刷される server_id常にメモする — これはすべての mcp コマンドに必要
  • ユーザーが Chrome で記録する前に、常に CLI でワークフローセッションを作成する — session_id はエクスポートに必要

ステップ 1 — バックエンドの起動

.venv/bin/python cli/main.py start

http://localhost:8002 でデタッチされた FastAPI サーバーを生成します。以下で確認します。

.venv/bin/python cli/main.py status

起動に失敗した場合: /noui-setup のトラブルシューティング表を参照してください。


ステップ 2 — ワークフロー記録セッションの作成

.venv/bin/python cli/main.py workflow record "<WorkflowName>" "<start-url>"

例:

# パス A — 認証済み
.venv/bin/python cli/main.py workflow record "Create Contact" "https://app.hubspot.com/contacts"

# パス B — 認証なし
.venv/bin/python cli/main.py workflow record "Fetch Posts" "https://jsonplaceholder.typicode.com"

CLI はワークフローセッションを作成し、session_id を出力します。メモしてください — エクスポートに必要です。

バックエンドは、Chrome 拡張機能に表示されるアプリ (プロジェクト) とプロセスも作成します。アプリ名は、URL ホスト名 (例: app.hubspot.com) に基づいています。拡張機能でこれらを手動で作成する必要はありません。


ステップ 3 — Chrome で記録

CLI はすでにバックエンドにアプリとプロセスを作成しました。拡張機能はそれらを自動的に認識するはずです。

(原文はここで切り詰められています)

📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

NoUI Record Workflow

Record a browser workflow and compile it into a runnable FastMCP server, a Claude Code Skill, or both. Works for session-cookie apps (full Tabby login flow), static API-key apps (just set an env var), and public unauthenticated APIs.

All commands run from the noui/ directory using .venv/bin/python cli/main.py.

Prerequisite: /noui-setup must be complete. For Path A (session-cookie), /noui-record-login must also be complete and a live Tabby browser session must be running (tabby session ensure).


Output Format Selection

Before exporting, decide what the user actually wants. Two orthogonal axes:

  1. Auth model — Path A/B/C below (session-cookie vs static API key vs public).
  2. Output format--as mcp (always-on FastMCP server), --as skill (lazy-loaded Claude Code skill), or --as both (default).

When to pick which output:

Output Best for
--as mcp Tools agents invoke constantly; need typed tool schemas always in context
--as skill Long-tail / infrequent workflows; keeps Claude's context window clean until the intent matches
--as both Unsure. No extra recording work; just a second compile pass. Ship both and let usage decide.

The default is --as both. The rest of this skill focuses on the MCP output (auth verification, mcp lifecycle, etc.) because that is the longer-established path. For skill-side lifecycle (skill list / show / install / uninstall) invoke /noui-generate-skill after export.


How Execution Works

Generated operations run inside Tabby's authenticated browser by default. Each operation:

  1. Opens a WebSocket to Tabby's CDP endpoint at localhost:9222.
  2. Finds the tab whose URL matches the recorded domain (via find_page).
  3. Calls cdp_fetch(ws_url, url, method=..., headers=..., body=...), which runs fetch(url, {credentials: 'include'}) via Runtime.evaluate — so the real browser's cookies, TLS fingerprint, and origin are used.

The two primitives live in the generated noui_runtime/cdp.py module:

from noui_runtime.cdp import find_page, cdp_fetch

Why this is the default

  • No credential extraction. The Python MCP process never handles cookies or bearer tokens directly.
  • Matches what a real user does. Real browser fingerprint and cookies eliminate the Akamai / Cloudflare / PerimeterX false positives that fire on Python HTTP clients.
  • Safer under session refresh. Cookie rotation is handled by the browser; the MCP never sees a stale cookie.

Runtime prerequisites

  • Tabby must be running with a live session for the app.
  • A page on the target domain must be open in that session. If not, the first call raises a clear error naming tabby session ensure --profile <slug>.

Escape hatch — --execution-mode http

Switch to the legacy Python-side path when CDP cannot work:

.venv/bin/python cli/main.py workflow export <session_id> --execution-mode http

Use http mode when:

  • The API is server-to-server and not reachable from the browser origin.
  • CORS blocks credentials: 'include' cross-origin (no Access-Control-Allow-Credentials: true).
  • You are running the MCP on a host without a live Tabby.

Under --execution-mode http the generator emits the classic httpx.AsyncClient() + resolve_auth() template. The same flag is available on noui autopilot export.


Mode Selection

Ask the user (or infer from context) before proceeding:

App auth type Path
Session-cookie login — have tabby_profile_id from /noui-record-login Path A — tabby_credentials
Static API key / Bearer token in every request, no login page Path B — static_secret_header
Public API, no credentials needed Path C — unauthenticated

The compiler auto-detects the strategy from the HAR (Authorization header + no Set-Cookie → Path B). Pass --profile-slug for both Path A and B; omit it for Path C.


Critical Rules (Never Violate)

  • ALWAYS start the backend before asking the user to record
  • NEVER skip workflow export — recording alone produces no server or skill
  • Prefer the default --as both unless the user has a clear reason to pick one; it's a single extra compile pass and preserves the choice for later
  • For Path A/B: ALWAYS pass --profile-slug <slug> — this is the runtime credential identifier; without it auth falls back to unauthenticated
  • NEVER pass the DB UUID as --profile-slug — that is admin-only; use the human-readable slug (e.g. example-bank, not 8fdadf43-...)
  • ALWAYS note the server_id printed after export — it is required for all mcp commands
  • ALWAYS create the workflow session with the CLI before the user records in Chrome — the session_id is needed for export

Step 1 — Start the Backend

.venv/bin/python cli/main.py start

Spawns a detached FastAPI server at http://localhost:8002. Verify with:

.venv/bin/python cli/main.py status

If startup fails: See the troubleshooting table in /noui-setup.


Step 2 — Create a Workflow Recording Session

.venv/bin/python cli/main.py workflow record "<WorkflowName>" "<start-url>"

Examples:

# Path A — authenticated
.venv/bin/python cli/main.py workflow record "Create Contact" "https://app.hubspot.com/contacts"

# Path B — unauthenticated
.venv/bin/python cli/main.py workflow record "Fetch Posts" "https://jsonplaceholder.typicode.com"

The CLI creates a workflow session and prints the session_id. Note it — you need it for export.

The backend also creates an App (project) and Process that will appear in the Chrome extension. The App name is based on the URL hostname (e.g., app.hubspot.com). You do NOT need to create these manually in the extension.


Step 3 — Record in Chrome

The CLI already created an App and Process in the backend. The extension should see them automatically.

Tell the user to perform these steps in the NoUI Workflow Recorder extension:

  1. Click the extension icon in the Chrome toolbar
  2. The App created by workflow record should appear in the extension's App list — select it
    • If you don't see it, click the refresh/reload button in the extension, or close and reopen the popup
    • The App name matches the URL hostname from the workflow record command
  3. Select the Process under that App (there should be one matching your workflow name)
  4. Click Start Capture to begin recording
  5. Navigate to the start URL and perform the complete workflow you want to automate
  6. Click Stop when done

Important: Do NOT create a new App/Project in the extension. The CLI already created one. Creating a new one will disconnect the capture from the workflow session, and export will fail.

After stopping, get the capture session ID from the CLI:

.venv/bin/python cli/main.py workflow captures

Lists all capture sessions with their IDs, statuses, and project IDs. Note the id of the most recent stopped session whose project matches the workflow's project — that is your capture_session_id.

Tip: If workflow captures shows many sessions, run workflow list to find your workflow session and match by project_id.

If no capture sessions appear linked to your workflow's project, the capture was likely recorded under a different App in the extension. Re-record, making sure to select the correct App (the one created by workflow record).

For Path A (authenticated apps): navigate to the authenticated starting point manually before starting capture — credentials are managed separately via Tabby.


Step 4 — Export as FastMCP Server

Pass both the session_id (from Step 2) and the capture_session_id (from Step 3):

Path A — Session-cookie (tabby_credentials)

.venv/bin/python cli/main.py workflow export --as mcp <session_id> \
  --capture-session <capture_session_id> \
  --profile-slug <app-slug> \
  --profile-db-id <tabby_profile_db_uuid> \
  --verify

Path B — Static API key (static_secret_header)

.venv/bin/python cli/main.py workflow export --as mcp <session_id> \
  --capture-session <capture_session_id> \
  --profile-slug <app-slug> \
  --verify

The compiler detects the Bearer token in the HAR and automatically generates the static_secret_header strategy. --verify will report NEEDS_SECRET <APP_SLUG>_API_KEY — set that env var in noui/.env then re-run to confirm PASS.

Path C — Unauthenticated

.venv/bin/python cli/main.py workflow export --as mcp <session_id> --capture-session <capture_session_id>

The CLI compiles the captured HAR and click events into a FastMCP server and writes it to:

workbench/mcp_servers/<app_slug>/<server_id>/
├── server.py            # FastMCP entrypoint
├── tools.json           # Tool inventory (source of truth for tool shapes)
├── manifest.json        # Server manifest (schema v2: strategy, profile_slug, auth_plan_file)
├── API.md               # Human-readable API reference (auto-generated)
├── auth_plan.json       # Auth strategy + fallback recipes (Path A/B only; never stores secrets)
├── noui_runtime/
│   └── auth.py          # Runtime auth adapter (2-step Tabby flow or static env var)
└── operations/
    └── <tool_name>.py   # One file per generated tool

On success:

MCP server generated:
  Server ID  : <server_id>
  Tools      : <n>
  Output     : workbench/mcp_servers/<app_slug>/<server_id>/

Note the server_id — pass it to /noui-generate-mcp to start and connect the server.

Optional Step 5 — Generalize: If the generated tools have unreadable raw API parameter names (f_sid, bl, reqid, soc_app), run /noui-generalize. Claude will read the tools, ask you questions about what you recorded, and rewrite the operations with natural-language parameters (origin, destination, departure_date) so they're usable by Claude Code.


Decision Flow

Start
  │
  ├─ App auth type?
  │     ├─ Session-cookie login → Path A (need tabby_profile_id from /record-login)
  │     ├─ Static API key/Bearer → Path B (just need the slug; set env var after export)
  │     └─ No auth → Path C
  │
  ├─ Backend running?
  │     ├─ No  → Step 1: start
  │     └─ Yes → continue
  │
  Step 2: workflow record "<Name>" "<url>" → note session_id
  │
  Step 3: Chrome (select the App created by CLI → Start Capture → perform workflow → Stop)
    └─ get capture_session_id: workflow captures (match by project_id)
  │
  Step 4:
    Path A: workflow export --as mcp <session_id> --capture-session <cap_id> --profile-slug <slug> --profile-db-id <uuid> --verify
    Path B: workflow export --as mcp <session_id> --capture-session <cap_id> --profile-slug <slug> --verify
              └─ NEEDS_SECRET? → add <APP>_API_KEY to noui/.env → re-run --verify → PASS
    Path C: workflow export --as mcp <session_id> --capture-session <cap_id>
    └─ note server_id
  │
  Done → pass server_id to /mcp

CLI Command Reference

Command Purpose
.venv/bin/python cli/main.py start Start the NoUI backend
.venv/bin/python cli/main.py status Check backend reachability and session counts
.venv/bin/python cli/main.py workflow record "<Name>" "<url>" Create a workflow recording session
.venv/bin/python cli/main.py workflow list List existing workflow sessions
.venv/bin/python cli/main.py workflow captures List capture sessions recorded via the extension (use this to get capture_session_id)
.venv/bin/python cli/main.py workflow export --as mcp <session_id> --capture-session <cap_id> Compile session → FastMCP server (unauthenticated)
.venv/bin/python cli/main.py workflow export --as mcp <session_id> --capture-session <cap_id> --profile-slug <slug> Compile session → FastMCP server (authenticated, auto-detects strategy)
.venv/bin/python cli/main.py workflow export --as mcp <session_id> --capture-session <cap_id> --profile-slug <slug> --profile-db-id <uuid> As above, also records DB UUID for admin operations
.venv/bin/python cli/main.py workflow export --as mcp ... --verify Run AuthVerifier immediately after export; reports PASS / NEEDS_SECRET

Troubleshooting

Symptom Fix
Backend not running .venv/bin/python cli/main.py start
session_id not found Run workflow list to confirm the session was created
Export fails: "No HAR file found for this session" Extension did not capture HAR — confirm Capture was active during the workflow
Export fails: "Workflow session not found" The session_id doesn't match any workflow session — run workflow list
Generated server has 0 tools Workflow had no capturable HTTP calls — re-record navigating through the full flow
Export reports NEEDS_SECRET <VAR> Set <VAR>=<value> in noui/.env, then re-run --verify or mcp verify <server_id>
Path A/B: auth errors at runtime Run mcp diagnose-auth <server_id> — shows strategy, missing env vars, and repair steps
Path A: Tabby returns empty credentials Profile not HEALTHY — run login validate and tabby session ensure
workbench/mcp_servers/ empty after export Check .noui-backend.log in the repo root for compiler errors
Tools have unreadable raw API param names (f_sid, bl, reqid) Run /noui-generalize
API.md missing from the generated folder Run .venv/bin/python cli/main.py mcp docs <server_id> to generate it
API.md is stale after editing tools.json Run .venv/bin/python cli/main.py mcp docs <server_id> to refresh
Capture session not linked to workflow (different project_id) User created a new App in the extension instead of selecting the one created by workflow record. Re-record using the correct App.
Extension doesn't show the App created by CLI Click refresh in the extension popup, or close and reopen it. The backend creates the App immediately on workflow record.
workflow captures returns empty after recording The extension may not have been connected to localhost:8002. Check that the extension shows "Connected" status and the backend is running.