「この作業、毎回やってるからAIに任せたい」と思ったとき、いまは手順書を書く必要がある。Microsoftが2026年7月29日に公開した microsoft/skill-recorder はそこを逆転させ、実際にその作業を1回やって見せる。画面・ウィンドウの切り替え・訪れたURL・(任意で)声の解説を記録し、GitHub Copilotが「意図+順序つきの手順」に再構成して、エージェントが再利用できる形に変換する。
RECORD TO SKILL録画からスキルへ
手順を書かずに1回やって見せると、承認を2回経てスキルになる
-
Record
画面・URL・クリップボード・声
-
Analyze
Copilotが意図と手順を再構成
-
propose_plan
一般化・固定値・native tool を提示
-
submit_skill
SKILL.md か Automation を出力
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一覧を取る」に翻訳することを狙っている。
承認ゲートは冒頭の図のとおり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/
選べる出力先は 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.秘匿情報のマスキングは実装なし
クリップボードの120文字上限はダミー資格情報6種を1文字も切らなかった
-
2.Analyze で画面フレームが外へ
get_frames が画像を base64 でモデルに渡す。枚数の上限はコードに無い
-
3.デバッグzipは映像・音声ごと
セッションを丸ごと ~/Downloads に固める。issue 添付の動線
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)





