複数のアプリやMCPホストからブランド画像・動画を生成、調整、書き出し、挿入する作業を支援します。ライブラリ選択や修正依頼も扱います。
- スライド用のブランド画像を作りたいとき
- 既存素材をフィードバックに合わせて直したいとき
- 動画素材を生成して書き出したいとき
標準パネルでは表現できない独自の可視化や操作を、ダッシュボード内の拡張ブロックとして作成・埋め込み・修復・複製するスキルです。
Create, embed, clone, or repair a Custom Block (extension panel). Use for a bespoke visualization native panels cannot draw, or to fix or copy an extension-backed dashboard.
実行スコア 未検証
インストール方法を見るAnalyticsのダッシュボードに埋め込む拡張ブロック「Custom Block」の作成、埋め込み、複製、修復を扱います。標準のグラフや表、Data Programで表現できない一度限りの可視化・操作が必要な場合に、拡張を作ってパネルとして配置します。既存ダッシュボードの顧客別コピーでは、拡張本体の必要箇所だけを置き換えて新しいダッシュボードに埋め込む手順を示します。データ読み込みの修復では、既存のデザインや操作を保ちながら該当箇所を絞って変更します。
標準パネルでは忠実に表せない独自表示を、特定のダッシュボードだけに追加したいときに向いています。既存の拡張付きダッシュボードを別顧客向けに複製したい場合や、移行後のデータ読み込みを直したい場合にも使えます。
再利用する機能やアプリ本体の変更にはCustom Blockを使わず、connect-builderへ依頼します。拡張は閲覧者にも共有しないと表示されません。閲覧者ごとに選ぶウィジェットはユーザー単位のインストールとなり、定期レポートでは空欄になる場合があります。
この紹介文は、公開されている SKILL.md をもとに AI(OpenAI Codex)が作成しました。正確な仕様は下の原文を確認してください。
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Analytics has one user-facing artifact type: dashboards. Build with native dashboard panels and Data Programs first. A sandboxed extension embedded in a dashboard is presented to users as a Custom Block, not as a separate Analytics artifact.
Use native chart, table, metric, section, funnel, heatmap, callout, filter, and
layout capabilities whenever they can represent the request faithfully.
Reusable ROI, engagement, cross-sell, and win/loss dashboards compose these
native panels around real SQL or Data Program results. Use a Data Program when
the durable need is reusable fetching, transformation, or computed data that
native panels can render. Dual-axis charts are native (config.rightYKeys),
never an extension. Do not create a Custom Block merely because a request says
custom, asks for a dashboard, or would take more effort with native components.
Create a Custom Block only when the user explicitly asks for a genuinely bespoke or one-off visualization or interaction, the native dashboard model cannot represent it faithfully, and its intended scope is this dashboard.
create-extension, immediately embed it as a
chartType: "extension" panel with config.extensionId, and set
config.customBlock to { authoredBy: "agent", intent: "one-off", scope: "dashboard", nativeGapReason: "custom-visualization" | "custom-interaction" | "custom-layout" | "other" }.
Choose the narrow categorical reason; never put prompt text, customer data, or
other free text in this metadata.connect-builder with the request verbatim instead
of creating a Custom Block. If scope is ambiguous, ask whether the user wants a
one-off block for this dashboard or a reusable app feature.connect-builder; do not delete or replace the block until
the native implementation is reviewed and deployed.An explicit request to build one authorizes every non-destructive step in the
same turn: query or scaffold, seed extension data (extension-data-set), save,
embed, and navigate. Do not leave an empty shell or ask whether to proceed.
Code inside a Custom Block runs in an iframe and may call only actions that are
HTTP-mounted and intended for appAction. Use the canonical bigquery action
for warehouse SQL; never call query-agent-native-analytics,
bigquery-table-info, or another http: false agent-only action from extension
code. For first-party Analytics data, prefer a native source: "first-party"
panel, or query it as the agent and seed the extension data store.
Use chartType: "extension" to add an extension box alongside normal SQL
charts. The panel skips source and sql. For ordinary requests such as "put
X in this dashboard," save the author-selected extension id in
config.extensionId. This makes the selection part of the shared dashboard and
keeps the widget present in scheduled report captures:
{
"id": "pipeline-widget",
"title": "Pipeline Widget",
"chartType": "extension",
"width": 3,
"config": { "extensionId": "extension-123" },
}
Direct embeds receive the dashboard id, name, description, current filters, and
panel context. Embedding does not grant extension access, so share the
extension with the dashboard audience (share-resource --resourceType extension ...); otherwise viewers see an "extension unavailable" placeholder.
Use a stable config.extensionSlotId only when the user explicitly wants each
viewer to choose or install their own widget:
analytics.dashboard.<dashboard-id>.panel.<panel-id>
Create or choose the extension, call add-extension-slot-target with the
extension id and slot id, then call install-extension with the same values.
The dashboard panel is shared, while the installed extension is per-user. Empty
slots show the normal install affordance instead of a broken iframe.
{
"id": "pipeline-widget",
"title": "Pipeline Widget",
"chartType": "extension",
"width": 3,
"config": {
"extensionSlotId": "analytics.dashboard.weekly-metrics.panel.pipeline-widget",
},
}
get-sql-dashboard panel
summaries (extensionId, extensionSlotId).When the user asks for a copy of an existing extension-backed dashboard for a
different customer/org (for example "make an Intuit version of the Roku usage
dashboard"), follow this playbook. Extension bodies are frequently tens of
thousands of characters. The reliable path is to read+transform+write the body
INSIDE run-code (where workspaceRead returns the full file) and then create
from that written file — never by pulling the body into chat context first or
re-typing it as a content argument.
get-sql-dashboard on the source dashboard (pass the extension panel's id in
panelIds) and confirm the target panel is a chartType: "extension" panel
with config.extensionId; grab that extension id. For a slot-backed panel,
clone the dashboard panel with a new stable extensionSlotId, then target
and install the desired extension into that slot instead of using this
body-copy playbook.get-extension for that id with forceContent: true exactly once. Reuse
that body for the rest of the turn — a second same-run read intentionally
omits content and returns contentOmitted instead. That is not the content
disappearing; use the copy you already have. Do NOT try to re-fetch the body
with run-code (appAction('get-extension')) to page past a display
truncation — the same-run omit makes it return empty content, wasting turns.
If you need the full body again, read the workspace resource file (step 5) or
set forceContent: true on a single native get-extension.ACCOUNT_USAGE_STATIC block: company name, title, org-discovery filters,
messaging). Prefer a focused update-extension edit/patch over regenerating
the entire HTML.create-extension / update-extension as native tools. They are
mutating actions and are NOT callable from run-code / appAction (the
sandbox bridge only exposes read-only actions). Do not try to create or update
an extension from inside run-code.intuit-analytics-extension.html), do the read AND the
customer swap in ONE run-code call, then create from the written file:
run-code: const src = await workspaceRead('<source>.html')
returns the WHOLE file (it auto-pages; there is no 50k cap here), do the
small string-replace on the static config block, then
await workspaceWrite('<target>.html', modified).create-extension (native) with
contentFromWorkspaceFile: '<target>.html' and leave content empty — the
server reads the full file verbatim.
Do NOT read the source body with the resources read tool (or get-extension)
first just to transform it: that display is capped and wastes a turn. And do
NOT re-emit an 80k+ char body as the content argument — it gets cut off
mid-stream. contentFromAttachment only sees files the user pasted into chat,
not workspace resources. create-extension/update-extension are mutating and
cannot run from run-code, so only the read+write+transform happens there.chartType: "extension", config.extensionId) with update-dashboard, then
navigate to it.When the user asks to fix data loading in an existing or migrated
extension-backed dashboard, treat the current extension body as user-authored
design. Read the dashboard config and extension once, identify the smallest
data-loading seam, and call update-extension with exactly id,
operation="edit", and a payloadJson string containing focused
patches/edits that change only that seam. Never send empty placeholder
fields. Preserve the existing layout, CSS, copy, and interactions. Do not send a
reconstructed full content body for a data-only repair.
A request that combines a visual rewrite (compacting, removing sections,
renaming, changing padding) with a data repair is a broad rewrite: after
inspecting the current extension, use operation="replace" with the complete
replacement in payloadJson. If a focused edit fails, inspect the current body
and change the target rather than retrying the same arguments.
A tool result ending in ...[truncated — full result was N chars; only first 50,000 shown] (from the resources read tool or get-extension) means only the
DISPLAYED text was capped. The file is intact. run-code's workspaceRead
returns the full N chars, and contentFromWorkspaceFile hosts the full file.
Never read the same file twice or try to "page the rest" to recover the tail —
that is the single biggest source of wasted turns on clone requests. Decide to
clone, then go straight to the run-code read+transform+write path in step 5.
まだレビューはありません。使ってみた感想をお寄せください。
ログインなしで書き込めます。使ってみた感想、質問、動かなかった環境などを気軽にどうぞ。
まだコメントはありません。最初のコメントを書いてみませんか。
複数のアプリやMCPホストからブランド画像・動画を生成、調整、書き出し、挿入する作業を支援します。ライブラリ選択や修正依頼も扱います。
特定の顧客企業について、契約と製品利用の数値を照らし合わせ、根拠や不足情報を明記した健全性レポートをまとめます。
アプリの操作をエージェントと画面の両方から呼び出せるアクションとして実装し、API連携や画面のデータ取得を一貫した形で追加するスキルです。
新機能をUI・エージェント用アクション・説明資料・画面状態の4領域でそろえ、利用者とエージェントのどちらからも一貫して使えるようにするチェックリストです。
複数のデータソースを照合して、傾向や指標、根拠をまとめた分析結果を作成します。必要に応じて、再実行できるダッシュボードとして保存できます。
Analyticsの管理画面で、機能フラグの状態確認と切り替え、ダッシュボード利用状況の調査、接続先アプリのデータベース管理を行います。