geekfujiwara/codeappsdevelopmentstandard/cowork

Claude Code and agent skill by geekfujiwara/codeappsdevelopmentstandard

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

目的特化型の Copilot Cowork プラグイン(M365 アプリパッケージ)を開発する。Agent Skills(SKILL.md)と Dataverse MCP コネクタをセットにし、Entra ID の OAuth 2.0 認可コードフロー認証を構成して Teams 開発者ポータルで registrationId を取得、M365 管理センターのエージェント画面からアップロード・公開して Cowork から Dataverse を利用可能にする。

Install

npx vskill@latest install geekfujiwara/codeappsdevelopmentstandard/cowork

SKILL.md

Cowork プラグイン開発(Dataverse MCP セット)

目的特化型の Copilot Cowork プラグイン(M365 アプリパッケージ .zip)を作る。 ビジネススキル(SKILL.md)と Dataverse MCP コネクタをセットにし、Entra ID の OAuth 2.0 認可コードフロー認証で Cowork から Dataverse を直接操作できるようにする。

データ先は Dataverse だけではない: agentConnectors は remote MCP server を指すため、
mcp-server スキル で構築した 自前 MCP Server(Azure Functions) も
同じようにコネクタにできる。基幹 DB・ファイルサーバー・業務 API など Dataverse に無いデータを
Cowork から扱う場合は 自前 MCP Server をコネクタにする を併せて読む
(差分は Step 3 の権限・Step 4 の可否・Step 5 の Scope・Step 6 の URL の 4 点だけ)。
前提: 利用テナントが Frontier プレビュー に参加していること。
会社環境で Cowork の利用が許可されている場合のみこのスキルを使用してください。利用可否が不明な場合は管理者に確認してください。
異常系・トラブルシュートは references/troubleshooting.md を参照。

サブリファレンス

リファレンス内容
自前 MCP Server をコネクタにするDataverse 外のデータ(基幹 DB / ファイルサーバー / 業務 API)を Cowork から扱う場合の差分手順
営業支援 CRM プラグイン テンプレート予定表・メール・チャットからの活動登録 / 目標達成プラン / マネージャーの障害レビュー。Code Apps の templates/sales-crm と同じ Dataverse を共有し、scaffold で生成する
株主総会 想定問答アシスタント テンプレートIR 抜粋を根拠に想定問答とリハーサル台本を下書きで登録・想定問答の点検。Code Apps の templates/agm-qa-assist と同じ Dataverse。変数は --questions で AskUserQuestion
店長アシスト テンプレート店長の判断基準で品目ごとの発注案(夕方便・朝便・仕込み)→ 承認後だけ発注を登録・本部通達の整理・週次店舗レポート。結果は Render UI のグラフ(単位ごと)・表・HTML レポート(共通ルールの差し込みと report_builder.py)。Code Apps の templates/store-ordering と同じ Dataverse。変数は --questions で AskUserQuestion
必要な権限の案内作る・同意する・登録する・公開する・使う人ごとの最小の権限と、利用者の Dataverse ロールの作り方(scaffold 直後に担当者と確認)
異常系・トラブルシュート実際に踏んだ失敗と恒久対策
結果の見せ方(Render UI のグラフ・表・HTML レポート)提案するスキル・数字を扱うスキルの出力の標準。差し込む共通ルール display-rules.md・ひな形 report-template.html

パッケージ構成(Skills + remote connector)

<plugin-root>/
├── manifest.json # M365 Unified App Manifest v1.28
├── color.png # 192×192 フルカラーアイコン
├── outline.png # 32×32 アウトラインアイコン
├── build-package.ps1 # .zip 生成(検証付き)
└── skills/
└── <skill-name>/ # kebab-case。フォルダ名 = SKILL.md の name と一致必須
└── SKILL.md # frontmatter(name/description) + ワークフロー本文

事前確認(会話の最初に 1 回だけ)

本スキルの利用が確定したら、standard の共通契約に加え、 1 回の AskUserQuestion で次をまとめて確認する。

#質問合格条件
1Cowork と Frontier を会社が許可し、対象者を登録済みか管理者とテストユーザーに Microsoft Copilot ライセンスがあり、Frontier 対象ユーザーである
2Dataverse MCP を使う対象環境とテーブルはどれかDATAVERSE_URL、論理名、データ分類、許可する read / write 操作が確定している
3Entra OAuth アプリを作成・変更する担当者は誰かアプリ登録を作成でき、必要な API permission を構成できる担当者を記録している
4管理者同意と MCP クライアント許可の担当者は誰かtenant-wide consent の担当者と、環境の allowedmcpclients を変更できる担当者を記録している
5Teams Developer Portal と M365 管理センターの担当者は誰かOAuth registration ID を作成でき、AI Administrator がパッケージの追加・公開・配布を実行できる
6公開対象と検証範囲はどこまでか最初は単一テストユーザーまたはセキュリティ グループ、1 skill + 1 connector で合意している
担当ごとの必要な権限は references/permissions.md を見せて確認する(同意できるロール: クラウド アプリケーション管理者・アプリケーション管理者・AI 管理者)。

Frontier は Cowork を利用するためのプレビュー条件であり、Microsoft Copilot ライセンスとは別に確認する。 Global Administrator を常用せず、Agent 管理は AI Administrator、全テナントへの高権限な OAuth 同意が必要な場合は Privileged Role Administrator を担当工程だけに使用する。

前提チェック:

  1. python .github/skills/standard/scripts/check_mcp_client.py cowork が ✅ であること。
  2. Python 3(auth_helper.py / アイコン生成)と PowerShell(パッケージビルド)が利用可能であること。
  3. いずれかの前提が未確認なら、アプリ登録・シークレット作成・公開へ進まないこと。

スキル同梱スクリプト(再利用)

scripts/ のスクリプトは汎用化されており、どのテナント・環境でも .env(TENANT_ID / DATAVERSE_URL / PUBLISHER_PREFIX / COWORK_OAUTH_CLIENT_ID)を参照して動作する。

スクリプト用途
scripts/setup_entra_oauth_graph.py(推奨) Entra OAuth クライアントアプリを Microsoft Graph API 経由で作成。standard の auth_helper.py が共有するブラウザー認証キャッシュを利用(Step 3)
scripts/setup_entra_oauth.ps1(代替)az CLI 経由で同等の処理。az CLI のブラウザーサインインと独立した資格情報キャッシュを使う(Step 3)
scripts/register_mcp_client.pyClient ID を Dataverse 許可 MCP クライアント(allowedmcpclients)に登録・有効化・確認(Step 4)
scripts/diagnose_cowork_connector.pyアプリ登録・admin consent・allowedmcpclients の3層をまとめて診断(Step 4→5 の間で実行推奨)
scripts/check_oauth_signins.pyEntra のサインイン ログから、Cowork がこの OAuth アプリでトークンを取得できたかを集計し、テナント側か Cowork 側かを判定(Step 9 で接続済みなのにツールが使えないとき。読み取りのみ)
scripts/build_agent_package.ps1.env の COWORK_OAUTH_REGISTRATION_ID(引用符付きでも可)を manifest.json のプレースホルダーに注入し、必須ファイルとコネクタ ID(汎用 ID・重複の禁止)を検証して .zip を生成(Step 7)
scripts/check_visual_output.pyスキルの結果の見せ方が省かれない書き方かを確かめる(提案するスキルに Render UI のグラフの手順があるか・「このスキルのグラフ」・同梱の report_builder.py・「返す前の確認」・ひな形の図とレポートの行・ほかのスキルへの参照・条件付きの書き方・同梱 HTML のスクリプト)。--compose で書き途中の SKILL.md をビルドと同じ差し込みで検査。build_agent_package.ps1 からも呼ばれる。読み取りのみ
scripts/report_builder.py1 つの計算結果(results.json)から、Render UI に写すグラフ(単位ごと)・文字のグラフと表・HTML レポートを作り、3 つの数字の一致・取得不足・単位・単位数・内部識別子を検査する。build_agent_package.ps1 が include のあるスキルの scripts/ に同梱する
scripts/check_connector_ids.pyコネクタ ID が汎用的でないか、手元のほかのプラグイン(--scan / COWORK_PLUGIN_SCAN_DIRS)と重ならないかを確かめる(Step 6。build_agent_package.ps1 からも呼ばれる。読み取りのみ)
scripts/manage_agent_package_graph.pyGraph v1.0 で組織アプリを一覧し、Graph で管理している app package を更新(Step 8 代替)
scripts/build_cowork_publish_payloads.pystageCustomApp() の結果から新規公開(finalize / allow / deploy)または更新(UPDATEAPP)の plan payload を生成(Step 8 / 10)
scripts/manage_oauth_registration_api.pyDeveloper Portal OAuth registration の CRUD(Step 5)。plan → hash 承認 → CLI から送信 → 読み戻し → .env に生の ID。重複は事前に止める。--transport browser で統合ブラウザ用の plan だけを出す
scripts/install_agent_package_personal.py作成者が自分だけにインストール/アンインストールする(Step 8 の前の個人テスト)。ZIP の事前検証 → plan → hash 承認 → launchInfo で照合
scripts/rehearse_plugin.py公開前リハーサル。プラグインの SKILL.md と tools 定義を、実際の Dataverse MCP と Azure OpenAI で通しで動かし、会話とツール呼び出しを記録する(専用クライアントの setup-client / ツール名の差の tools / 依頼から登録までの run。既定は書き込みを送らない)(Step 7 の後)
scripts/get_developer_account.pyプラグインの作成者(developer.name / metadata.author)にする開発中のサインイン アカウントを Graph /me で取得。--write-env で COWORK_DEVELOPER_NAME を書き、--check-manifest で manifest と照合(Step 2 / 6)
../admin/scripts/manage_m365_portal_api.pyAgent Registry の Finalize / Allow / Install / Update / Permission plan を検証(Step 8 / 10)
../admin/scripts/m365_portal_browser_runner.mjsstageCustomApp() で ZIP をステージし、承認済み plan を browser session API で実行して poll と read-back を検証(Step 8 / 10)

ワークフロー(正常系)

Step 0: ヒアリング(プラグイン構想の提案)

ユーザーが「プラグインを作りたい」「Cowork で〜したい」と相談してきたら、いきなり実装に入らず まず構想を提案する。以下の流れで会話を始める。

  1. 目的の確認: 「Cowork 用のプラグインとして作りますか? 例えば『〇〇業務を Cowork から

Dataverse のデータで支援する』ような形を想定しています」と確認する。

  1. 対象データの把握: 連携する Dataverse 環境/テーブル(顧客・契約・実績など)をヒアリング。

不明なら describe / search 系で既存テーブルを軽く調べて候補を出す。 Dataverse に無いデータ(基幹 DB・ファイルサーバー・業務 API)が必要なら、この段階で確認する。 必要なら mcp-server スキル で自前 MCP Server を先に立て、 references/custom-mcp-connector.md でコネクタとして併載する。

  1. スキル案を5つ提案: その業務ドメインで Cowork が役立つスキルを5つ程度列挙する。

各スキルは「名前(kebab-case)+一言の用途+トリガー語の例」をセットで示す。

例(保守契約ドメインの場合):

スキル名用途トリガー語の例
annual-customer-review年次レビュー資料作成「年間レビュー資料を作って」
contract-renewal-proposal契約更新提案の下書き「更新提案をまとめて」
incident-trend-report障害傾向レポート「故障傾向を分析して」
equipment-lifecycle-plan機器更新計画「更新計画を提案して」
cost-optimization-summaryコスト最適化提案「コスト削減案を出して」
  1. プラグイン名を提案: 5つのスキル群を束ねるプラグイン名(短縮名 / 正式名)を 2〜3 案提示する。

個社名は避け、業務ドメインが伝わる名前にする(例: 「MFP 年間レビュー」「保守契約アシスタント」)。

  1. 合意: ユーザーが採用するスキル(1つでも複数でも可)とプラグイン名を選んだら、Step 1 以降に進む。
テンプレートから始める: 営業支援(予定表・メール・チャット → CRM)なら、合意後に
sales-crm-plugin を scaffold_from_template.py で生成して Step 1 の describe 確認から続ける。
Code Apps の templates/sales-crm と同じ Dataverse を共有する。
最初は 1スキル + Dataverse MCP コネクタの最小構成で公開・疎通確認し、動いたら
残りのスキルを追加する流れが安全(コネクタ認証の検証を先に済ませられる)。
Step 1: 対象テーブルを describe でスキーマ確認(クエリを書く前に必須)

スキル本文にクエリを書く前に、必ず `describe` で対象テーブルの実スキーマを確認する。 テーブル名・列名・ルックアップ(外部キー)列の正確な名前を推測で書かない(推測は実行時の Read query Failed の主因。特に FK 列は環境やクエリ方式で表記が異なる)。

  1. 対象テーブルごとに describe を実行し、以下を確定する:
  • テーブル名(論理名 / コレクション名のどちらをクエリで使うか)
  • 列の論理名(表示名ではなく論理名)
  • ルックアップ列の表記: describe の結果に出る実際の列名を使う。

read_query のクエリ方式に合わせること(Web API/OData 形式の _xxxid_value と SQL/論理名 xxxid は別物。describe が返す名前をそのまま使う)。

  • 選択肢(Picklist)の値とラベルの対応
  1. 確認できたスキーマだけを使ってクエリを書く。describe に無い列・テーブルは使わない。
  2. スキル本文の冒頭にも「Step 1: 対象テーブルを describe で確認してからクエリする」を入れ、

生成するスキル自身も実行時に describe で裏取りする手順にする(下のテンプレート参照)。

確認結果は「対象データ(テーブル)」表に論理名でまとめる。表示名は補足に留める。
Step 2: スキル(SKILL.md)を作る

skills/<skill-name>/SKILL.md を作成。フォルダ名と frontmatter `name` を完全一致させ、 name は kebab-case(小文字英数とハイフン、連続/先頭/末尾ハイフン禁止)。

yaml
---
name: annual-customer-review
description: |
<何をするスキルか>。Use when ユーザーが「<トリガー語1>」「<トリガー語2>」と依頼したとき。
Dataverse MCP コネクタ(read_query / search_data / search / describe)を使用する。
license: MIT
metadata:
author: <作成者> # 開発中のサインイン アカウントの表示名(manifest の developer.name と同じ値)
version: "1.0"
---
作成者は開発中のサインイン アカウントにする。python .github/skills/cowork/scripts/get_developer_account.py が
auth_helper のキャッシュで Graph の /me を読み、表示名(developerName。manifest の上限 32 文字に切り詰め)を返す。
この値を COWORK_DEVELOPER_NAME として manifest の developer.name と各スキルの metadata.author に入れる
(テンプレートでは質問の detect で既定値になる)。会社名・固定の文字列を入れない。

本文は ワークフローとして書く(番号付き手順/使用ツール名を明示/出力フォーマットを定義)。 本文は約 1,500〜2,000 語以内。詳細は references/ に逃がす(コンパニオンファイルは最大20・各5MB)。

生成するスキル本文の必須ルール: ワークフローの最初の Step を
「対象テーブルを describe でスキーマ確認(列名・FK 列名を確定)」とする。
クエリ例の列名は describe で確認済みのものだけを使い、未確認の列を推測で書かない。

結果の見せ方(提案するスキルは標準で Render UI のグラフ): 提案・助言・打ち手・対策案を出すスキルと、数字を扱うスキル(集計・点検・登録の確認)は、 答えを チャットのグラフ(Render UI)・表・保存用の HTML レポート で返す。スキルに書くのは 3 つだけ: ① 必須ルールの後に <!-- include: display-rules.md -->(ビルドで共通ルール display-rules.md に置き換わり、 scripts/ に report_builder.py とひな形が入る)、② 「このスキルのグラフ」の節(図の題名・種類 stacked_hbar / grouped_bar・元の表・単位)、 ③ 図の位置 〔Render UI の図: …〕 と 📄 レポート: <ファイル名>.html を入れた回答のひな形と、「このスキルの確認(返す前・毎回)」。 グラフ・表・HTML は report_builder.py が 1 つの計算結果(results.json)から作り、取得不足・単位の混在・内部識別子・3 つの数字の不一致を止める。 Render UI の仕様と正式な色は公開されていないため、実行時に Render UI の説明を読んで使い、表示を確かめるまで成功と書かず、1 回直して駄目なら文字のグラフに切り替える。 書き方の例・results.json の形は references/visual-output.md。build_agent_package.ps1 が check_visual_output.py で毎回検査し、提案するスキルに手順が無ければ止める(#52・#53)。

Step 3: Entra アプリ(OAuth クライアント)を作成・構成

Dataverse MCP は Microsoft ファーストパーティ API のため、トークンの audience が Dataverse 自身 (https://<org>.crm.dynamics.com)である必要がある。SSO 方式は audience が「自前アプリ」になり失敗する (→ troubleshooting #14)。そのため OAuth 2.0 認可コードフローを使い、Enterprise Token Store に Dataverse 宛のトークンを直接取得させる。クライアントシークレットが必要。値は .env に保存する。

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 95 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
57
Repository forks
20
7-day trend score
20

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/geekfujiwara/codeappsdevelopmentstandard/cowork/badge)](https://verified-skill.com/skills/geekfujiwara/codeappsdevelopmentstandard/cowork)

Something wrong with this skill or its page? Tell us.