Claude・Codexのスキル(SKILL.md)をCopilotで使うには:Agent BuilderとCoworkはZIPの組み方が逆。公開スキル19個を検査

当ページのリンクには広告が含まれています。

Microsoft 365 CopilotのCopilot Chatでも、スキルを作ったりアップロードしたりできるようになります。Microsoftの告知(MC1493223)では、全世界への展開は11月中旬に終わる予定です。Cowork、PowerPoint、Excel、Agent Builderのスキルも同じSKILL.md形式なので、ClaudeやCodex用に書いたスキルを職場のCopilotでも使えそうに見えます。

中身の書き直しはほとんど要りません。つまずくのは入れ物のほうです。Agent BuilderとCoworkにZIPでアップロードする場合、資料上の組み方はclaude.aiと逆で、最上位にフォルダーではなくSKILL.mdを置きます。また、Anthropicが公開しているスキル19個を各製品の公開制約に当てはめると、3製品の条件にすべて合ったのは11個でした。残る8個は、フォント・XMLスキーマ・圧縮ファイル・PDFといったファイル形式か、5段の入れ子、2万字を超える指示のどれかに引っかかります。

この検査は、2026年11月7日に確認したMicrosoftの公開資料に当てはめた静的なものです。Microsoft 365のテナントで実際にアップロードしてはいません。資料に書かれていることと、手元で実行したことを分けて書きます。

手直しが最も少ないのは、OneDriveにフォルダーごと置く方法

Cowork、PowerPoint、Excelは、OneDrive上のスキル用フォルダーに「スキル名のフォルダー+SKILL.md」を置く方式です。Claude Codeの~/.claude/skills/と同じ形なので、フォルダーを複製すれば済み、ZIPの組み方も気にしなくて済みます。

  • Copilot Chatは、チャットで作成するか、アップロードします。展開は11月中旬に完了する予定です。告知にはファイル形式と上限の記載がなく、情報バリアを使うテナントでは自作スキルを共有できません。
  • Coworkは、OneDriveの/Documents/Cowork/skills/スキル名/SKILL.mdに置くか、.md・.zip・.skillをアップロードします。50個まで、SKILL.mdは1MBまで、付属ファイルは20個・合計10MBまでで、モバイル版では使えません。
  • PowerPointは、Copilotの設定から「スキルの管理」→「カスタムスキル」を開き、名前と同じフォルダーに置きます。PNG・PDF・入れ子のZIPは非対応で、アップロードしたスキルは自分専用です。
  • Excelは、OneDriveのスキル用フォルダーに置きます。フォルダー名とnameが一致しないと認識されず、追加や名前の変更の後は「Refresh」を押します。
  • Agent Builderは、最上位にSKILL.mdを置いたZIPをアップロードします。1エージェント8個、ZIPは50MB、全体で350ファイル、入れ子は3段まで、指示は2万字未満です。スクリプトは通信も追加パッケージの導入もできません。

これらの条件は、Coworkの使い方の資料、PowerPointのサポート記事、Excelのサポート記事、Agent Builderのスキルの資料から取りました。Coworkの付属ファイルは、別のアップロード手順では「アーカイブは100ファイル・展開後50MBまで」とも書かれていて、20個との関係は資料から読み取れません。検査には厳しいほうの20個を使っています。

ZIPで渡すなら、claude.ai用とAgent Builder・Cowork用で組み方を変える

claude.aiのヘルプは、ZIPの最上位にスキルのフォルダーを置くよう求めています。my-skill.zipを開くと、my-skill/SKILL.mdが入っている形です。ところがAgent Builderの追加手順の図はZIPの直下にSKILL.mdがあり、Coworkのアップロード手順も「最上位にSKILL.mdがある.zipか.skill」と書いています。

手元で確かめると、Anthropicのskill-creatorに含まれるpackage_skill.pyで作った.skillファイルも、中身はinternal-comms/SKILL.mdとフォルダーが先頭でした。claude.aiには正しい形ですが、Coworkの資料の条件とは合いません。Coworkが実際にこの形を受け付けるかは、テナントがないため確かめられていません。なお、Claude APIはどちらの形でも受け付けます。

macOSのターミナルなら、次のように作り分けられます。.DS_Storeと__pycache__は、Agent Builderの対応形式にないため除外しています。

# Claude(claude.ai)用:フォルダーごと圧縮する
zip -r my-skill-claude.zip my-skill -x '*.DS_Store' '*__pycache__*'

# Agent Builder・Coworkのアップロード用:フォルダーの中身を圧縮する
cd my-skill
zip -r ../my-skill-m365.zip . -x '*.DS_Store' '*__pycache__*'
cd ..

# 確かめる:SKILL.mdの前にフォルダー名が付くかを見る
unzip -Z1 my-skill-claude.zip
unzip -Z1 my-skill-m365.zip

手元のmacOS 26.4.1で実行すると、claude.ai用はmy-skill/SKILL.md、Agent Builder・Cowork用はSKILL.mdと表示されました。SKILL.mdの前にフォルダー名が付いているかどうかが、見分けるポイントです。Windowsでは試していませんが、エクスプローラーで作る場合、Agent Builder・Cowork用ならフォルダーを開き、中のファイルをすべて選んでから圧縮します。フォルダーを丸ごと圧縮すると、claude.ai用の形になります。

公開スキル19個では、Office文書系とフォント入りのスキルが引っかかった

AnthropicがGitHubで公開しているスキル19個(2026年10月28日のコミット)に、上の制約を機械的に当てはめました。

  • Agent Builderの条件に合ったのは12個。canvas-designは.ttfのフォントが54個、docx・pptx・xlsxは.xsdのスキーマと5段の入れ子、web-artifacts-builderは.tar.gzで引っかかりました。skill-creatorはSKILL.mdが32,987字、claude-apiは105,119字ありました。
  • Coworkの付属ファイル20個を超えたのは5個。canvas-designが82個、claude-apiが95個、docx・pptx・xlsxが52〜60個です。
  • PowerPointで非対応のPDFを含むのは、theme-factoryだけでした。

pptxのSKILL.mdは、前付けを含めると20,647字、本文だけなら19,821字です。どちらで数えるかは資料に書かれていません。ただしpptxはファイル形式と入れ子でも引っかかるので、結論は変わりません。

引っかかったものに、Word・PowerPoint・Excelのファイルを作るスキルが多いのは目を引きます。もっとも、CoworkにはWord・Excel・PowerPoint・PDFの組み込みスキルがあります。私なら、この種のスキルは持ち込まずに組み込みに任せます。持ち込む価値があるのは、社内の報告書の型や確認手順のように、自分たちの仕事のやり方を書いたスキルです。

スクリプトは「通信しない・追加で入れない」に書き直す

ファイル形式より見落としやすいのがスクリプトです。Agent Builderのスクリプトは、ネットワークに接続できず、実行中にパッケージを入れることもできません。使えるのは実行環境に最初から入っているものだけで、Microsoftはその有無を確かめずに頼らないよう書いています。

公開スキルでは7個のSKILL.mdやスクリプトに、pip installやnpm installなどの記述がありました。docxとxlsxは「通常は導入済み。読み込めなければ入れる」という書き方で、Claudeの実行環境を前提にしています。当サイトの記事作成に使っている自作スキルも、WordPressや画像生成APIと通信するため、Agent Builderでは動きません。外部と通信する仕事はClaude Codeに残し、Copilotへは手順と判断基準だけを持ち込むのが現実的です。CoworkとPowerPointのスクリプトが通信できるかは、読んだ資料には書かれていませんでした。

逆向きにも注意。Coworkの例どおりの名前は、Claude側の規則に合わない

Coworkで作ったスキルをClaude Codeやclaude.aiへ持っていくときにも、落とし穴があります。Coworkの手順にある例は、フォルダー名がweekly-reportなのに、SKILL.mdのnameは「Weekly Report」です。

Agent Skillsの仕様では、nameは英小文字・数字・ハイフンだけで書き、親フォルダー名と一致させます。Claude APIの規則も同じです。実際にこの例をAnthropicのpackage_skill.pyにかけると、「kebab-caseではない」という検証エラーで止まりました。claude.aiのヘルプは「人が読みやすい名前(64字以内)」とだけ書いていて、画面で受け付けるかは試していません。PowerPointとExcelもフォルダー名とnameの一致を求めているので、最初からname: weekly-reportのように書いておけば、どの製品でも同じフォルダーを使い回せます。

説明文(description)の長さも、製品によって書き方が違います。仕様の上限は1,024字、claude.aiのヘルプは200字以内です。Coworkは「上限を超えると読み込まれない」と書きながら、値を示していません。Anthropic自身の公開スキルは19個すべてが200字を超え、claude-apiは1,068字でした。いつ使うスキルなのかを先頭に書き、1,024字を確実に下回る長さにしておくのが安全です。

持ち込む前に回す検査スクリプト

上の検査に使ったスクリプトを、標準ライブラリだけで動く形にしたものです。Python 3.9以上で動き、スキルのフォルダーを引数に渡します。2026年11月7日時点の公開資料の条件に当てはめるだけで、製品が受け付けることを保証するものではありません。通信やパッケージ導入は文字列の一致で探しているので、「要確認」と出たらスクリプトの中身を読んで判断してください。

import re
import sys
from pathlib import Path

AB_TYPES = set('.json .xml .yaml .yml .ini .config .utf8 .docx .doc .docm .pdf .txt .rtf .md .ppt .pptx .ppsm '
               '.xlsx .xls .xlsm .csv .tsv .html .htm .png .jpg .jpeg .gif .bmp .log '
               '.py .js .mjs .cjs .ts .mts .sh .bash'.split())
PPT_NG = {'.png', '.pdf', '.zip'}
SCRIPTS = {'.py', '.js', '.mjs', '.cjs', '.ts', '.mts', '.sh', '.bash'}
NET = re.compile(r'requests\.|urllib\.request|http\.client|httpx|aiohttp|fetch\(|axios|curl |wget ')
INSTALL = re.compile(r'pip install|npm install|npx |apt-get|brew install')


def front(text):
    head = text.split('\n---', 1)[0].removeprefix('---\n') if text.startswith('---\n') else ''
    fields, key = {}, None
    for line in head.splitlines():
        m = re.match(r'^([A-Za-z0-9_-]+):\s*(.*)$', line)
        if m:
            key, value = m.group(1), m.group(2).strip()
            fields[key] = '' if value in ('>', '|', '>-', '|-') else value.strip('"\'')
        elif key and line.startswith((' ', '\t')):
            fields[key] = (fields[key] + ' ' + line.strip()).strip()
    return fields


def check(folder):
    folder = Path(folder).resolve()
    files = [p for p in folder.rglob('*')
             if p.is_file() and '__pycache__' not in p.parts and p.name != '.DS_Store']
    rel = [p.relative_to(folder) for p in files]
    md = folder / 'SKILL.md'
    text = md.read_text(encoding='utf-8') if md.exists() else ''
    f = front(text)
    name, desc = f.get('name', ''), f.get('description', '')
    exts = {r.suffix.lower() or '(拡張子なし)' for r in rel}
    depth = max((len(r.parts) - 1 for r in rel), default=0)
    size = sum(p.stat().st_size for p in files)
    code = [p for p in files if p.suffix.lower() in SCRIPTS]
    issues = []
    if not md.exists():
        issues.append('SKILL.mdがない')
    if not re.fullmatch(r'[a-z0-9]+(-[a-z0-9]+)*', name) or len(name) > 64:
        issues.append(f'name「{name}」が英小文字・数字・ハイフンの64字以内でない')
    if name != folder.name:
        issues.append(f'nameとフォルダー名「{folder.name}」が違う')
    if not desc or len(desc) > 1024:
        issues.append(f'descriptionが空か1024字超({len(desc)}字)')
    if len(text) >= 20000:
        issues.append(f'Agent Builder: SKILL.mdが{len(text)}字(20,000字未満が条件)')
    if exts - AB_TYPES:
        issues.append(f'Agent Builder: 対応外の形式 {sorted(exts - AB_TYPES)}')
    if depth > 3:
        issues.append(f'Agent Builder: フォルダーの入れ子が{depth}段(上限3)')
    if len(files) > 350:
        issues.append(f'Agent Builder: {len(files)}ファイル(上限350)')
    if len(files) - 1 > 20 or size > 10 * 1024 * 1024:
        issues.append(f'Cowork: 付属{len(files) - 1}ファイル・計{size / 1024 / 1024:.1f}MB(上限20個・10MB)')
    if exts & PPT_NG:
        issues.append(f'PowerPoint: 対応外の形式 {sorted(exts & PPT_NG)}')
    for p in code:
        body = p.read_text(encoding='utf-8', errors='ignore')
        if NET.search(body):
            issues.append(f'要確認: {p.relative_to(folder)} が通信する可能性(Agent Builderの実行環境は通信不可)')
    for p in [md, *code]:
        if p.exists() and INSTALL.search(p.read_text(encoding='utf-8', errors='ignore')):
            issues.append(f'要確認: {p.relative_to(folder)} にパッケージ導入の記述(Agent Builderは実行時の導入不可)')
    return issues


for path in sys.argv[1:]:
    found = check(path)
    print(f'■ {Path(path).resolve().name}: ' + ('公開制約に該当なし' if not found else f'{len(found)}件'))
    for item in found:
        print('  - ' + item)

Claude Codeの個人用スキルをまとめて調べるなら、次のように実行します。

python3 skillcheck.py ~/.claude/skills/*/

公開スキル、Coworkの例、手元の試験用スキルに対して実行した結果の一部です。

■ docx: 4件
  - Agent Builder: 対応外の形式 ['.xsd']
  - Agent Builder: フォルダーの入れ子が5段(上限3)
  - Cowork: 付属60ファイル・計1.1MB(上限20個・10MB)
  - 要確認: SKILL.md にパッケージ導入の記述(Agent Builderは実行時の導入不可)
■ theme-factory: 1件
  - PowerPoint: 対応外の形式 ['.pdf']
■ weekly-report: 2件
  - name「Weekly Report」が英小文字・数字・ハイフンの64字以内でない
  - nameとフォルダー名「weekly-report」が違う
■ my-skill: 公開制約に該当なし

試す前に確かめたい契約と費用

Agent Builderの追加手順には、Microsoft 365 Copilotのライセンスか従量課金が前提と書かれています。Copilot Chatのスキルについては、告知が「Copilot Chatの利用者」が作れると書くだけで、必要なライセンスは示していません。自分のテナントに表示されるかで確かめるしかありません。

Coworkは従量課金で、スキルの呼び出しも消費に数えられます。管理者は利用者やグループごとに上限を決められます。また、Coworkの推論にはAnthropicのClaudeも使われるため、利用はAnthropicの対応地域に限られます。日本は対応地域に含まれています。PowerPointのカスタムスキルは、Windows・Mac・iPad版のPowerPoint for Microsoft 365が対象です。

私ならこの順で試す

  1. 手元のスキルに検査スクリプトをかけ、nameとフォルダー名をそろえる。
  2. 通信しない手順書型のスキルを1つ選び、OneDriveのCoworkかPowerPointのフォルダーに置いて動きを見る。
  3. スクリプトが必要なスキルは、通信も追加導入もしないことを確かめてから、Agent Builder用のZIPにする。

最初の1つは、Word・Excelの組み込みスキルと役割が重ならないものを選ぶと、自作スキルが使われたかを見分けやすくなります。同じSKILL.mdはGeminiにも取り込めます。取り込める場所と条件はGeminiのスキルとGemsの違いで扱いました。Coworkでどのモデルを選べるかはCopilotでGPT-6 Astraは使えるかの記事にまとめています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

IT業界で10年、ソフトウェア開発をしてきたエンジニアです。今もChatGPT、Codex、Claude Codeを中心に、開発の効率化や生産性向上にAIをフル活用しています。応用情報技術者。登壇や執筆もしています。このサイトでは、仕事でAIを使う立場から、料金や利用条件、使い方を調べてまとめています。

目次