geekfujiwara/codeappsdevelopmentstandard/cowork
Claude Code and agent skill by geekfujiwara/codeappsdevelopmentstandard
- community
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/coworkSKILL.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)
事前確認(会話の最初に 1 回だけ)
本スキルの利用が確定したら、standard の共通契約に加え、 1 回の AskUserQuestion で次をまとめて確認する。
| # | 質問 | 合格条件 | |
|---|---|---|---|
| 1 | Cowork と Frontier を会社が許可し、対象者を登録済みか | 管理者とテストユーザーに Microsoft Copilot ライセンスがあり、Frontier 対象ユーザーである | |
| 2 | Dataverse MCP を使う対象環境とテーブルはどれか | DATAVERSE_URL、論理名、データ分類、許可する read / write 操作が確定している | |
| 3 | Entra OAuth アプリを作成・変更する担当者は誰か | アプリ登録を作成でき、必要な API permission を構成できる担当者を記録している | |
| 4 | 管理者同意と MCP クライアント許可の担当者は誰か | tenant-wide consent の担当者と、環境の allowedmcpclients を変更できる担当者を記録している | |
| 5 | Teams 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 を担当工程だけに使用する。
前提チェック:
python .github/skills/standard/scripts/check_mcp_client.py coworkが ✅ であること。- Python 3(auth_helper.py / アイコン生成)と PowerShell(パッケージビルド)が利用可能であること。
- いずれかの前提が未確認なら、アプリ登録・シークレット作成・公開へ進まないこと。
スキル同梱スクリプト(再利用)
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.py | Client ID を Dataverse 許可 MCP クライアント(allowedmcpclients)に登録・有効化・確認(Step 4) | |
| scripts/diagnose_cowork_connector.py | アプリ登録・admin consent・allowedmcpclients の3層をまとめて診断(Step 4→5 の間で実行推奨) | |
| scripts/check_oauth_signins.py | Entra のサインイン ログから、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.py | 1 つの計算結果(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.py | Graph v1.0 で組織アプリを一覧し、Graph で管理している app package を更新(Step 8 代替) | |
| scripts/build_cowork_publish_payloads.py | stageCustomApp() の結果から新規公開(finalize / allow / deploy)または更新(UPDATEAPP)の plan payload を生成(Step 8 / 10) | |
| scripts/manage_oauth_registration_api.py | Developer 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.py | Agent Registry の Finalize / Allow / Install / Update / Permission plan を検証(Step 8 / 10) | |
| ../admin/scripts/m365_portal_browser_runner.mjs | stageCustomApp() で ZIP をステージし、承認済み plan を browser session API で実行して poll と read-back を検証(Step 8 / 10) |
ワークフロー(正常系)
Step 0: ヒアリング(プラグイン構想の提案)
ユーザーが「プラグインを作りたい」「Cowork で〜したい」と相談してきたら、いきなり実装に入らず まず構想を提案する。以下の流れで会話を始める。
- 目的の確認: 「Cowork 用のプラグインとして作りますか? 例えば『〇〇業務を Cowork から
Dataverse のデータで支援する』ような形を想定しています」と確認する。
- 対象データの把握: 連携する Dataverse 環境/テーブル(顧客・契約・実績など)をヒアリング。
不明なら describe / search 系で既存テーブルを軽く調べて候補を出す。 Dataverse に無いデータ(基幹 DB・ファイルサーバー・業務 API)が必要なら、この段階で確認する。 必要なら mcp-server スキル で自前 MCP Server を先に立て、 references/custom-mcp-connector.md でコネクタとして併載する。
- スキル案を5つ提案: その業務ドメインで Cowork が役立つスキルを5つ程度列挙する。
各スキルは「名前(kebab-case)+一言の用途+トリガー語の例」をセットで示す。
例(保守契約ドメインの場合):
| スキル名 | 用途 | トリガー語の例 | |
|---|---|---|---|
annual-customer-review | 年次レビュー資料作成 | 「年間レビュー資料を作って」 | |
contract-renewal-proposal | 契約更新提案の下書き | 「更新提案をまとめて」 | |
incident-trend-report | 障害傾向レポート | 「故障傾向を分析して」 | |
equipment-lifecycle-plan | 機器更新計画 | 「更新計画を提案して」 | |
cost-optimization-summary | コスト最適化提案 | 「コスト削減案を出して」 |
- プラグイン名を提案: 5つのスキル群を束ねるプラグイン名(短縮名 / 正式名)を 2〜3 案提示する。
個社名は避け、業務ドメインが伝わる名前にする(例: 「MFP 年間レビュー」「保守契約アシスタント」)。
- 合意: ユーザーが採用するスキル(1つでも複数でも可)とプラグイン名を選んだら、Step 1 以降に進む。
テンプレートから始める: 営業支援(予定表・メール・チャット → CRM)なら、合意後にCode Apps の templates/sales-crm と同じ Dataverse を共有する。
最初は 1スキル + Dataverse MCP コネクタの最小構成で公開・疎通確認し、動いたら残りのスキルを追加する流れが安全(コネクタ認証の検証を先に済ませられる)。
Step 1: 対象テーブルを describe でスキーマ確認(クエリを書く前に必須)
スキル本文にクエリを書く前に、必ず `describe` で対象テーブルの実スキーマを確認する。 テーブル名・列名・ルックアップ(外部キー)列の正確な名前を推測で書かない(推測は実行時の Read query Failed の主因。特に FK 列は環境やクエリ方式で表記が異なる)。
- 対象テーブルごとに
describeを実行し、以下を確定する:
- テーブル名(論理名 / コレクション名のどちらをクエリで使うか)
- 列の論理名(表示名ではなく論理名)
- ルックアップ列の表記:
describeの結果に出る実際の列名を使う。
read_query のクエリ方式に合わせること(Web API/OData 形式の _xxxid_value と SQL/論理名 xxxid は別物。describe が返す名前をそのまま使う)。
- 選択肢(Picklist)の値とラベルの対応
- 確認できたスキーマだけを使ってクエリを書く。describe に無い列・テーブルは使わない。
- スキル本文の冒頭にも「Step 1: 対象テーブルを
describeで確認してからクエリする」を入れ、
生成するスキル自身も実行時に describe で裏取りする手順にする(下のテンプレート参照)。
確認結果は「対象データ(テーブル)」表に論理名でまとめる。表示名は補足に留める。
Step 2: スキル(SKILL.md)を作る
skills/<skill-name>/SKILL.md を作成。フォルダ名と frontmatter `name` を完全一致させ、 name は kebab-case(小文字英数とハイフン、連続/先頭/末尾ハイフン禁止)。
作成者は開発中のサインイン アカウントにする。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
- SKILL.md in the repositoryChecking.github/skills/cowork/SKILL.md
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
[](https://verified-skill.com/skills/geekfujiwara/codeappsdevelopmentstandard/cowork)