「この作業、毎回やってるからAIに任せたい」と思ったとき、いまは手順書を書く必要がある。Microsoftが2026年7月29日に公開した microsoft/skill-recorder はそこを逆転させ、実際にその作業を1回やって見せる。画面・ウィンドウの切り替え・訪れたURL・(任意で)声の解説を記録し、GitHub Copilotが「意図+順序つきの手順」に再構成して、エージェントが再利用できる形に変換する。

RECORD TO SKILL録画からスキルへ

手順を書かずに1回やって見せると、承認を2回経てスキルになる

  1. Record

    画面・URL・クリップボード・声

  2. Analyze

    Copilotが意図と手順を再構成

  3. propose_plan

    一般化・固定値・native tool を提示

  4. submit_skill

    SKILL.md か Automation を出力

承認ゲートは Analyze 後とプラン提示後の2段。出典: microsoft/skill-recorder README と common/skill.ts(v0.3.1)

30秒でわかる Skill Recorder

  • ・作業を1回録画すると、Copilotが意図+手順に再構成し、SKILL.md(要求時に走るスキル)かAutomation(スケジュール実行)を生成する
  • ・Claude Codeのスキル作成は代替しない。エクスポート先は Scout と Cowork(Microsoft 365 Copilot)だけ(ソース実読で確認)
  • ・録画は端末内。Analyzeを押すとイベント列・画面フレーム・ナレーションがGitHubのクラウドへ渡る
  • ・秘匿情報のマスキングは実装されていない。録る画面は自分で選ぶしかない
  • ・MIT・TypeScript・Electron製。最新は v0.3.1(2026-07-30)、★1,780(2026-08-05)

本記事はリポジトリをクローンし、テストスイートの実行とスキル生成関数の直接実行まで行って書いている。AIエージェント全般の設計を俯瞰したい場合は、まずAIエージェントフレームワーク比較2026|LangGraph・CrewAI・Dify等9種をStar数・実コードで検証を参照してほしい。

Skill Recorderとは——「書くスキル」から「録るスキル」への反転

Agent Skillsは「フォルダに SKILL.md を置く」形式にほぼ収束したが、中身を用意する手間は残ったままだ。READMEの1行目がそのまま設計思想になっている。

Record yourself doing a task once, then turn it into a skill your AI agent can repeat. (出典: microsoft/skill-recorder README)

記録した操作をそのまま再生(UIクリックのリプレイ)するのではない点が重要だ。READMEは生成物について「Both prefer the agent’s native tools (like the gh CLI or web_fetch) over replaying UI clicks」と書き、electron/skillbuilder/instructions.ts にも ## Prefer native tools (read the catalogue below) という見出しがある。「ブラウザでこのボタンを押す」を「gh CLIでPR一覧を取る」に翻訳することを狙っている。

Skill Recorderのセッション画面。左に録画済みセッション一覧、右に再構成された意図と6つの手順が並ぶ
録画から再構成された「意図」と手順(出典: microsoft/skill-recorder README 添付の公式スクリーンショット)

承認ゲートは冒頭の図のとおり2段(Analyze直後の手順の編集と、スキルを書く前のプラン提示)。プランの手順は PlanStepKind で calculation(読む・導出・判断・整形)と action(submit・send・create・delete)に型分けされ、コメントは「the actions are the risky surface」と書く。レビューで取り返しのつかない操作だけを拾える作りだ。

項目 2026-08-02 JST 2026-08-05 再取得
Star / Fork 398 / 48 1,780 / 179
Open Issues 26 29
最新リリース v0.3.1(2026-07-30 16:34 UTC) v0.3.1 のまま(最終push 2026-08-04)
ライセンス・規模 MIT・TypeScript 714,690バイト・作成 2026-07-29・コミット103 —

コントリビューターは主に3名で、まだ若いプロジェクトだ。以下の検証はすべてv0.3.1のソースに対するもの。

エクスポート先はScoutとCowork——Claude Codeは選択肢に無い

READMEは生成物を「an agent」「your AI agent」としか書かない。どのエージェント向けかは common/skill.ts に列挙されていたので、リポジトリ自身のローダーでこの定数を実行して出力させた。

=== ARCHITECTURES ===
scout           enabled=true
cowork          enabled=true
copilot-studio  enabled=false
=== TARGETS ===
skill/scout            enabled=true   Scout skill
automation/scout       enabled=true   Scout automation
skill/cowork           enabled=true   Cowork skill
skill/copilot-studio   enabled=false  Copilot Studio

EXPORT TARGETS書き出せる先

書き出せるのはScout と Cowork だけ

common/skill.ts の TARGETS

  • ScoutScout skill / automation enabledskill/scout・automation/scout
  • CoworkCowork skill enabledMicrosoft 365 Copilot
  • StudioCopilot Studio Coming soonskill/copilot-studio
  • ClaudeClaude Code 定義なし.claude/skills/
出典: microsoft/skill-recorder v0.3.1 の ARCHITECTURES / TARGETS を手元で実行した出力(2026-08-02)

選べる出力先は Scout・Cowork・Copilot Studio(無効) の3系統4枠で、Claude Codeも、Cursorも、ローカルの .claude/skills/ に置く選択肢も無い。ソース内の説明はScoutが「native WorkIQ, browser, files, and built-in skills」、Coworkが「Microsoft 365 Copilot (Cowork): native Teams, Outlook, Calendar, SharePoint…」。Scoutは筆者の知識時点より後の製品のため、この自称以上は断定しない。

生成される SKILL.md は name / description / allowed-tools を持つ同型の形式だが、allowed-tools に入るのは workiq_search_chats のようなScout固有のツール名で、手で移しても機能する保証は無い(移植可否は未検証)。Automationも「rendered to Scout’s import JSON」で、スケジュールはScoutの3種(single / interval / multi)を写している。

Skill Recorderが生成するSKILL.mdを描画して確かめた

リポジトリのテストはNode標準のテストランナーで動くので、Copilotにサインインせずに実行できる。

git clone https://github.com/microsoft/skill-recorder.git
cd skill-recorder && npm ci
# リポジトリ自身のテストを実行(Copilotのサインイン不要)
npm test

手元(macOS)では 58 tests / 58 pass / 0 fail、所要1.2秒だった。npx vitest run だと14ファイルすべてが “No test suite found” で失敗するので、入口は npm test が正しい。install.sh はNode 24を固定・検証するが、テスト自体は Node v22.13.1 でも通った。

renderSkillMarkdown() はCopilotに依存しない純粋関数なので直接呼べる。コロンとカンマと日本語を含む説明文、allowed-tools 2件、{{portal}} という値トークンを含む本文を渡した出力(234バイト)がこれだ。

---
name: submit-expense-records
description: "Use when: submitting expense records, 経費精算: colons, commas"
allowed-tools:
  - Bash(git *)
  - workiq_search_chats
---

Open https://contoso.example/expenses and submit each row.

descriptionは JSON.stringify を通してダブルクォートで囲まれ、コロンや日本語でもYAMLが壊れない。{{id}} トークンは書き出し時に実際の値(ここではURL)へ置換される。SkillPlan は手順とは別に generalization(具体例をどう一般化したか)と values(URL・パス・定数などの固定リテラル)をフィールドとして持つので、録画から作られるのは操作の記録ではなく「変わらない部分と変わる部分に分解された手順」になる。

日本語のスキル名は消える

slugifySkillName() は [^a-z0-9]+ に当たる文字をハイフンに潰し、60文字で切る。日本語は丸ごと消える。

"経費精算を提出する" -> "recorded-skill"
"日報を作成"       -> "recorded-skill"
"Slackに投稿する"  -> "slack"
"請求書PDFを保存"  -> "pdf"
"会議メモを整理"   -> "recorded-skill"

distinct inputs: 5  distinct slugs: 3  => [ 'recorded-skill', 'slack', 'pdf' ]

5つの業務名が3つに潰れ、3件は同じ recorded-skill になった。ただしビルダー側の指示は ^[a-z0-9-]+$ のkebab-caseを要求しており、通常は英語名が提案される。この関数はモデルが指示に従わなかったときのガードレールでバグではないが、生成後はスキル名だけ目視するのが安全だ。

skill-recorderは外部にデータを送信するか

READMEの「What gets captured」によれば、録画・保存・フレーム抽出・文字起こしは端末内で行われ、送信は Analyzeを押したときに起きる。記録項目は common/config.ts に単一の定義があり、冒頭に「there is no user-facing capture level」とある。記録項目を選ぶUIは無い。

記録される信号 内容 必要な権限
App switches 前面アプリの切り替え(アプリ名・bundle・pid) 不要
Clipboard copies コピーした内容の形式・長さ・ハッシュ・短いプレビュー 不要
Window titles ウィンドウとドキュメントのタイトル OS権限が一度必要
Browser URLs アクティブなブラウザタブのURL(macOS) OS権限が一度必要
Screen video + keyframes 低フレームレートの画面録画と抽出キーフレーム 画面収録の権限

ナレーションは任意で、Whisperの99言語に対応し端末内で文字起こしされる(初回のみ約252MBのモデルを取得)。録画開始の警告は開示内容をレビューするまで毎回出て、プロセスをまたいで残らない(recording-privacy.test.ts の2件が手元でも合格)。

その上で、READMEの自己申告をソースで数え直した。

git clone https://github.com/microsoft/skill-recorder.git
cd skill-recorder && git checkout v0.3.1
# 送信系APIの呼び出しを数える
grep -rnE "fetch\(|axios|XMLHttpRequest|https?\.request\(|net\.connect\(|new WebSocket" \
  --include="*.ts" --include="*.tsx" electron/ common/ src/
# 実行時依存を一覧する(分析SDKの混入確認)
node -e 'console.log(Object.keys(require("./package.json").dependencies).join("\n"))'

ヒットは0件。net.Socket / dgram / tls.connect / http2 も0件で、テレメトリ関連の語で出てくるのは electron/logger.ts の「Replaced/extended when telemetry lands.」1件だけだった。実行時依存は @github/copilot-sdk・@huggingface/transformers・archiver・koffi・react・react-dom・sharp・zod の8個で、分析SDKは無い。

grepで0件=送信が無い、ではない

  • ・アプリ本体は通信を同梱のCopilot CLIに委譲している。electron/copilot-cli-path.ts が子プロセスとして起動し、stdioで会話する
  • ・実体は node_modules/@github/copilot-darwin-arm64/copilot、152MBのMach-O 64-bit実行ファイル(arm64)。GitHubへの送信はこの内側で起き、ソースを読んでも中身は分からない
  • ・本記事が確認できたのは「アプリ本体が独自に外へ出ていない」ことまで。パケットキャプチャはしていない
経路 何が出るか いつ 本記事での確認度
同梱Copilot CLI(152MB・stdio起動) イベント時系列・画面フレーム・ナレーション Analyzeを押したとき バイナリのため内容は確認不能
@huggingface/transformers モデルの取得のみ 初回の文字起こし 既定ホストは実測で https://huggingface.co/
install.sh + npm 取得のみ インストール時 Node 24を nodejs.org/dist/latest-v24.x から

describerはCopilotに get_timeline / get_events / list_frames / get_frames / get_narration / submit_analysis の6ツールを渡してモデルに引かせる。get_frames は readFileSync(file).toString("base64") で抽出済みの画面フレームを実データのまま渡す。指示文は「イベントが沈黙・曖昧な箇所だけフレームを見ろ」と書くが、これは方針で、ツールはセッション全区間にアクセスできる。

社内の機密データを扱うときの注意点

BEFORE YOU RECORD業務で使う前に

マスキングは無い。漏れる導線は運用で塞ぐ

  1. 1.秘匿情報のマスキングは実装なし

    クリップボードの120文字上限はダミー資格情報6種を1文字も切らなかった

  2. 2.Analyze で画面フレームが外へ

    get_frames が画像を base64 でモデルに渡す。枚数の上限はコードに無い

  3. 3.デバッグzipは映像・音声ごと

    セッションを丸ごと ~/Downloads に固める。issue 添付の動線

出典: microsoft/skill-recorder v0.3.1 のソース実読と手元の実行(2026-08-05)

redact / mask / sanitize / scrub / secret / password / api key / credential をランタイム全体で検索しても、秘匿情報処理は0件だった。唯一の緩和は electron/collectors/clipboard.ts のプレビュー上限(700msごとにポーリングし、120文字まで記録)で、作者自身が「privacy milestone tightens this」とコメントしている。同じ処理にダミーの資格情報を食わせて測った。

PREVIEW_MAX = 120 文字

AWS access key ID 風: 長さ 20字 -> 切り詰め=なし
GitHub PAT 風        : 長さ 40字 -> 切り詰め=なし
OpenAI APIキー 風    : 長さ 51字 -> 切り詰め=なし
DB接続文字列 風      : 長さ 68字 -> 切り詰め=なし   postgres://svc_user:[email protected]:5432/customers
社内URL+クエリ 風   : 長さ 69字 -> 切り詰め=なし   https://intra.example.co.jp/hr/salary?employee=12345&token=...
顧客名簿1行 風       : 長さ 46字 -> 切り詰め=なし

6種すべてが120文字未満で、1文字も切り詰められなかった。この上限は長文用で、秘匿情報のフィルタではない。なおセッション開始時点のクリップボードはベースラインに使うだけで送出されない。

録画セッションは userData/sessions/、生成スキルは ~/.copilot/skills/ に置かれる。mkdir に mode の指定は無く、umask 022 の手元ではディレクトリ755・ファイル644だった。親の ~/Library/Application Support が drwx------ なので既定のmacOSでは保護されているが、守っているのはOSの配置で、バックアップや同期フォルダに出ると効かない。

一番気をつけたいのは「セッションの詳細をダウンロード」だ。electron/debug-bundle.ts は「the entire session directory (events, frames, screen video, voice audio, analysis, …) is included verbatim」と書き、~/Downloads/skill-recorder-debug-<セッションID>.zip を作って hand the file to the user to attach する。社内画面のセッションでこれをissueに添付すれば事故になる。値トークンも実リテラルで残り、エクスポート先は任意のフォルダを選べるので、リポジトリ配下に出してコミットする事故も起きうる。

自分の環境に残っているものは次で棚卸しできる。

# 録画セッションの保存先(アプリ名は環境により Skill Recorder / skill-recorder)
ls -ld ~/Library/Application\ Support/*[Ss]kill*[Rr]ecorder*/
du -sh ~/Library/Application\ Support/*[Ss]kill*[Rr]ecorder*/sessions/ 2>/dev/null

# 作りっぱなしのデバッグzip(録画・音声が丸ごと入っている)
ls -lh ~/Downloads/skill-recorder-debug-*.zip 2>/dev/null

# 生成されたスキル/Automationに社内URLや資格情報が残っていないか
ls -la ~/.copilot/skills/ ~/.copilot/automations/ 2>/dev/null
grep -rniE "https?://|password|passwd|token|api[_-]?key|secret|bearer" ~/.copilot/skills/ 2>/dev/null
観点 実測で分かっていること(v0.3.1) 運用でやること
外部送信 本体のHTTPクライアント・分析SDKは0件。送信は152MBバイナリに委譲 「ローカル完結」と説明しない
許可リスト Copilot CLI(GitHub)と huggingface.co プロキシ/FWに登録
記録範囲・マスキング 項目を選ぶUIもマスキングも無い 録画専用の環境・ブラウザプロファイルを用意し、機密タブを閉じ、録画中はコピーを避ける
保存先の権限 755 / 644(umask依存)。macOSでは親が700 バックアップ・同期フォルダ・共有ホームに載せない
デバッグzip 映像・音声込みで丸ごと issue添付の前に中身を展開して確認
生成物 固定値は実リテラルで残る 共有・コミット前にSKILL.mdを目視、.gitignore を先に整備

Skill Recorderのインストールと類似ツールとの比較

Skill Recorderはビルド済みバイナリを配らない。READMEいわく「published as a source release」で、1コマンドが固定されたNode.jsランタイムを取得し、リリースのコミットを自分のマシンでビルドし、再起動できるアプリとして登録する。

# 実際のコマンドはリリースページに掲載された40文字のコミットハッシュを入れる
commit="<40-character-release-commit>"
curl -fsSL "https://raw.githubusercontent.com/microsoft/skill-recorder/$commit/install.sh" \
  | SKILL_RECORDER_COMMIT="$commit" bash

スクリプトとビルドされるソースが同じコミットに固定され、install.sh はNode 24系でなければ止まる。実行前にスクリプトを読む手順・更新・アンインストールは INSTALL.md にある。要件は「a GitHub account with Copilot access」で、macOSが主対象、Windows 11(x64/ARM64)もサポート。固定fixtureの評価スイート(npm run eval)も同梱されている(サインインが要るため未実行)。

ツール 主な役割 スキルの入力元 エクスポート先
microsoft/skill-recorder 録画→スキル生成 画面操作・URL・クリップボード・音声ナレーション Scout / Cowork(Copilot Studioは無効)
Agent Skill Creator スキルの自動生成と配布 テキストの指示 複数プラットフォームへ配布
Agent Skill Harbor スキル資産の一元管理 既存のスキル Gitで管理・配布
SkillHub レジストリ 既存のスキル npm風にインストール
mattpocock/skills 完成品のスキル集 人間が書いたもの そのまま利用
Microsoft Waza スキルの品質評価 既存のスキル 評価結果

入力元に「画面操作の録画」を置いているのはSkill Recorderだけで、賭けているのは「言語化できていない作業ほど自動化されずに残っている」という仮説だ。同じMicrosoftのWazaが「測る」側、Skill Recorderが「作る」側に分かれている。

・向いている:Microsoft 365 / Scout環境で働いていて、Excelとブラウザとチャットを行き来するような書き起こしづらいGUI作業を、2段の承認でレビューしながら自動化したい
・待ったほうがいい:Claude CodeやCursorで使いたい(エクスポート先に無い)、Copilotのサブスクリプションが無い(Analyzeが動かない)、機密性の高い画面を扱う、安定性を求める(v0.3.1・Open Issues 26件の段階)

アイデアとしては筋が良く、適用範囲は現時点でかなり狭い、というのが実装を読んだ上での評価だ。copilot-studio が enabled: false で置かれていることからも、対象を増やす前提の設計にはなっている。

参照ソース

・microsoft/skill-recorder — GitHub(README・INSTALL.md・common/skill.ts・common/config.ts・common/automation.ts・electron/skillbuilder/instructions.ts・evals/README.md を v0.3.1 時点で参照。star・リリース・言語構成はGitHub APIで取得し、2026-08-05に再取得)
・セキュリティ節で追加参照した v0.3.1 のソース:electron/logger.ts・electron/copilot-cli-path.ts・electron/collectors/clipboard.ts・electron/describer/tools.ts・electron/describer/instructions.ts・electron/debug-bundle.ts・electron/ipc.ts・electron/recorder/session-store.ts・electron/narration/whisper.ts・electron/skillbuilder/builder.ts・electron/automationbuilder/builder.ts・package.json(送信APIの検索・依存一覧・保存先・権限は手元のmacOSで実行して確認)
・@huggingface/transformers — env.js(remoteHost の既定値 https://huggingface.co/ と remotePathTemplate を、インストール済みパッケージ v4 系で確認)
・microsoft/skill-recorder Releases(v0.1.0〜v0.3.1の公開日時)
・microsoft/skill-recorder LICENSE(MIT)