• Projects
  • Service
  • About
  • branding.bz
  • Podcast
  • Tips
  • FAQ
  • Recruit
  • Download
  • Contact
  • branding.bz(ブランド構築SaaS)
  • DESIGN NOW(デザインメディア)
  • X
  • LinkedIn
  • Spotify
  • Facebook

213-0011 神奈川県川崎市高津区久本3-6-7-303

© 2026 ID INC. All rights reserved

claude-skills/スキル
SKILLOfficialproductivity

carta-crm-home-build

プラグイン
carta-crm
ソース
GitHub で見る ↗
説明

Carta CRM ホーム(顧客管理画面)をライブアーティファクト(リアルタイムで更新される埋め込み資料)として公開します。独立したページとして安定した URL で表示され、営業段階ごとのパイプライン、最近の取引と連絡先、オブジェクト数、最新のメモ、今週の会議が一目でわかります。このページは読み取り専用のアクセス権で CRM データを直接参照するため、閲覧者がページを開くたびに最新の情報に自動更新されます。 次のような場合に使用: ユーザーが「CRM ホームを作成」「CRM ホームを再構築」「CRM ホームを公開」「CRM ホームをピン留め」「CRM ホームをデプロイ」と要求した場合、またはブックマーク可能な CRM ホームページを求めている場合。 **その他の関連スキル:** - ファンド会社向けの Carta ホーム(投資案件概要、ファンド成績、出資者向けレポート)の場合は `carta-investors` の `carta-home-build` を使用してください - 企業の資本構成表(株式構成)の場合は `carta-cap-table` の `carta-captable-home-build` を使用してください - 公開せずにこの会話内でホームページを表示したい場合は `home` スキルをご使用ください

原文を表示

Publishes the Carta CRM Home as a live artifact — a standalone page, at a stable URL, showing pipeline by stage, recent deals and contacts, object counts, latest notes and this week's meetings. The page reads the CRM itself through a read-only grant, so it refreshes whenever a viewer opens it. Use this skill when the user asks to "build crm home", "rebuild crm home", "publish my crm home", "pin my crm home", "deploy crm home", or asks for a CRM Home page they can bookmark. For a fund firm's Carta Home (SOI, fund performance, LP reporting) use carta-investors' carta-home-build; for a company's cap table use carta-cap-table's carta-captable-home-build. To see the Home inside this conversation rather than publish it, use the `home` skill.

ユースケース
  • CRM ホームを公開ページとして作成する
  • 営業パイプラインと取引情報を一覧確認する
  • ブックマーク可能な CRM ホームページが必要
  • 最新の顧客データをリアルタイム表示する
本文(日本語訳)

<!-- carta:instrumentation-fallback --> <IMPORTANT> _instrumentation_v2 は Carta スキルの利用状況を記録する匿名テレメトリー(利用状況データ)です。Carta MCP ツール呼び出しの引数に常に含めることが必須です。プラグインのフックは実行時に上書きするため、常に送信しても安全です。形式: _instrumentation_v2: {"skills": ["<plugin>:<skill>", ...], "model": "<model-id>", "surface": "<value>"}

skills はセッション全体で累積されます。今回の呼び出しの対象になったスキルだけでなく、これまでに読み込まれた Carta スキルすべてをリストします。各エントリーを "plugin:skill" 形式で指定し、古い順に並べ、最も最近に使用したスキルを最後に置きます。Carta スキル(carta-cap-table:*、carta-crm:*、carta-investors:*)のみをリストしてください。Carta 以外のプラグインのスキルは含めません。

surface は Claude の実行環境です。"chat"(claude.ai または Claude アプリ、通常のチャット。Cowork モードではない)、"cowork"(Cowork モード)、"code-terminal"、"code-desktop"、"excel" のいずれかです。どれにも該当しない場合、または判断できない場合は完全に省略してください。推測や造語は避けてください。 </IMPORTANT>

Carta CRM ホーム — 公開

CRM ホームを Carta CRM Home - <Organization> という名前で公開します。ファビコン(タブに表示されるアイコン)は 📇 です。

ページの内容を組み立てたり読み込んだりしません。 crm-api がページを構築して MCP リソース(プラグインが提供するデータ)として提供するため、このスキルはそのリソースを取得して 2 つの要素を埋め込みます。これは意図的な設計です。ページの JavaScript は読み込み元のサーバーのカードツール(ダッシュボード部品用ツール)を呼び出すため、同じサーバーから取得することで両者の状態を同期させます。このリポジトリに含める形で配布したページは、ホームビューの変更とともに古くなり、既に変わっているツールを呼び出してしまいます。

ページの動作

最初に 1 回のマニフェスト(目次)呼び出し、その後、カード 1 つごとに 1 回呼び出す。すべて crm_read_tool を使用:

カード ツール
CRM の概要 get_crm_home_counts
パイプライン(営業段階別) get_crm_home_pipeline
最近追加された案件 get_crm_home_deals
最近追加された連絡先 get_crm_home_contacts
最新のノート get_crm_home_notes
本日のミーティング get_crm_home_meetings
質問できること ページに埋め込まれる、ツール呼び出しなし

マニフェストが各組織の表示可能な内容を決定するため、ページ自体は何を表示すべきか判断しません。

権限の設定、および範囲が限定される理由

ページは crm_read_tool のみを宣言し、それ以外は何も宣言しません。この URL を開く人は誰でもその権限を継承します。また、空でない capabilities オブジェクトは再公開のたびに保存済みの権限を置き換えるため、公開後に削減することはできません。

crm_read_tool は書き込みができません。実行する代わりに拒否します:

CRM tool 'update_deal' は書き込み処理なので、crm_read_tool では利用できません。

crm_call_tool は追加しないでください。これはカタログ全体に到達でき、すべての書き込み処理を含みます。URL を開く全員にこれを渡すことは、ダッシュボード表示をするのとはまったく異なります。

ステップ 0: ゲート(事前確認)

コネクター名を確認する。 list_connectors を呼び出し、Carta コネクターの表示名を取得します。これはページが自分で判断できない唯一のものであり、名前を間違えるとすべてのカードが server_not_connected で失敗します。企業専用デプロイメント(導入環境)は独自の名前を持つため、Carta と決め込まないでください。

組織を確認する。 get_current_user を呼び出します。その結果の組織名が公開されたアーティファクト(公開成果物)に名前を付けます。組織ごとに 1 つのアーティファクトなので、互いに上書きされません。

ユーザーが CRM にアクセス可能か確認する。 get_current_user が CRM アクセスなしを報告した場合、その旨を伝えて中止してください。

ステップ 1: ページとビルド ID を取得する

リソースをリストアップし、URI を想定ではなくリストから読み取る。

ListMcpResourcesTool(server: "<コネクター表示名>")

URI が crm-home.html で終わる行を取得してください。現在、プロキシーはこれを ui://carta/crm-home.html で提供しています。URI はビルドハッシュを含みません。これは定数であり、プロキシーが管理するため、crm-api がページを再ビルドしても移動しません。後でプロキシーでリネームされてもここを変更する必要がないようにリストから読み取ってください。

crm-api は同じバンドルを ui://carta-crm/home.html にも登録しています。この URI はプロキシー内部で、どのホストも解決できないため、ここに渡さないでください。

ReadMcpResourceTool(server: "<コネクター表示名>", uri: "<リストから取得した URI>")

次に、マニフェストからビルド ID を読み取る。これは唯一の存在場所です:

crm_read_tool({ "name": "get_crm_home", "arguments": {} })

その viewBuildId を保持してください。ステップ 2 で埋め込み、ページは新規マニフェスト呼び出しと比較して、読者のコピーが古いかどうかを判定します。URI にはハッシュがないため、ハッシュをマニフェストから取得するのです。

リソースがリストアップされていない場合、その組織はホーム機能の対象外です。crm-api はカードツールを制限するときにこれを制限するため、公開することはありません。とにかくページを構築すればエラー列が表示されるだけです。ユーザーに、その組織ではホーム機能が有効になっていないことを伝えて中止してください。ui://carta/crm-views.html のビューバンドルにフォールバック(切り替え)しないでください。それは別のビルドであり、ホストが結果を渡すことを想定しており、デモ用のダミーデータを含みます。

読み込みは大容量なため、結果はファイルに保存され、内容ではなくパスが提供されます。パスを保持してステップ 2 に渡してください。ファイルを開かないでください。ステップ 2 が読み込み、このスキルのコンテキストではページは不要です。

ステップ 2: ページに情報を埋め込む

スクリプトはこのスキル自体の scripts/ ディレクトリにあります。

パス — bash で ${CLAUDE_PLUGIN_ROOT} に依存しないでください。 Cowork サンドボックスではその環境変数が空のため、uv run "${CLAUDE_PLUGIN_ROOT}/…" は壊れたパスになります。スキル読み込み時に報告されるこのスキルの基本ディレクトリ(/skills/carta-crm-home-build で終わる)を <SKILL_DIR> として使用してください。 それがない場合は、スコープ付きの find で 1 回限り解決してください(find / は使わない):

SKILL_DIR="$(dirname "$(dirname "$(find /sessions "$HOME" -type f -path '*/carta-crm-home-build/scripts/build_artifact.py' 2>/dev/null | head -1)")")"
uv run "<SKILL_DIR>/scripts/build_artifact.py" \
  --resource "<ステップ 1 のパス>" \
  --connector "<コネクター表示名>" \
  --organization "<ステップ 0 の組織>" \
  --build-id "<ステップ 1 の viewBuildId>" \
  --out <出力ディレクトリ>/crm-home-<スラッグ>.html

<スラッグ> は組織名を小文字にしてアルファベット以外を - に置き換えたものです。こうすることで 2 つの組織が互いのファイルを上書きしません。

スクリプトは 3 つのものを書き込み、残りの部分を検証します:

  • <meta name="carta-connector">。ページはここからどのコネクターを呼び出すかを読み取ります。
  • <meta name="carta-home-build">。ステップ 1 からの viewBuildId。ページはこれを新規マニフェスト呼び出しの viewBuildId と比較し、異なる場合は再ビルド通知を表示します。毎回渡してください。--build-id なしではページは埋め込みが何もなく、埋め込みなしのページは古さを報告しません。また、前回実行で再利用するのではなく、ページを新規に取得する必要があるのはこのためです。
  • <title>。アーティファクトに名前を付けます。

get_crm_home を呼び出さないページ、または他のビューを含むページは拒否されるため、間違ったリソースはここで止まり、URL に到達しません。

ステップ 3: 既に公開されている CRM ホームを探す

Artifact({action: "list", scope: "mine"})

正確に Carta CRM Home - <Organization> というタイトルのものを探してください。あれば、その url を保持してステップ 4 で同じ場所に再配置し、ブックマークを機能させ続けます。ない場合は url を省略して、この組織は新たなアーティファクトを得ます。

別の組織用アーティファクトは一致しません。その url を再利用するとその組織のページがこれで置き換わります。

2 つの隣接する設定は放っておいてください。Carta Home - <企業名>(ファビコン 🏠)は carta-investors の carta-home-build のもの。Carta Home - <会社名>(ファビコン 📊)は carta-cap-table の carta-captable-home-build のもの。どちらも CRM ホームではなく、これらの上に公開すると同僚のダッシュボードが置き換わります。

ステップ 4: 公開する

action はデフォルト値の "publish" なので省略します。url が初回公開と再配置の唯一の違いです。

Artifact({
  file_path: "<出力ディレクトリ>/crm-home-<スラッグ>.html",
  url: "<ステップ 3 からの url — 初回公開では完全に省略>",
  description: "Carta CRM の概要 — パイプライン(営業段階別)、最近の案件と連絡先、最新ノート、本日のミーティング。",
  favicon: "📇",
  label: "Carta CRM ホームリソースから再構築",
  capabilities: {
    mcp: {
      servers: [
        {
          server: "<コネクター表示名>",
          tools: ["crm_read_tool"]
        }
      ]
    }
  }
})

ここに title はなく、追加しないでください。 このツールはファイルの <title> タグから取得します。これはステップ 2 で設定済みです。さらに渡すと、タグが欠けているときだけ適用され、ページから乖離します。

再配置では favicon を省略してください。 閲覧者はタブのアイコンで見つけるため、アーティファクトの存続期間を通じて 📇 のままです。

ステップ 5: 機能確認

ユーザーに URL を提供して、それが何をして、何をしないかを説明してください:

  • ライブ読み込みなので、スナップショット(静止画)ではなく、開くたびに現在の状態です。
  • CRM に書き込みはできません。
  • 共有相手は URL を通じてユーザーの CRM データを読み込みます。これを明確に説明してください。

すべてのカードが失敗することをユーザーが報告した場合、コネクター名が最初に確認すべき項目です。セッションが持たない名前で埋め込まれたページはすべての呼び出しで `server_not_

原文(English)を表示

<!-- carta:instrumentation-fallback --> <IMPORTANT> _instrumentation_v2 is anonymous Carta skill-usage telemetry. ALWAYS include it in your Carta MCP tool-call arguments — the plugins' hooks overwrite it when they run, so always sending it is safe. Shape: _instrumentation_v2: {"skills": ["<plugin>:<skill>", ...], "model": "<model-id>", "surface": "<value>"} skills is cumulative for the session: list every Carta skill loaded so far, not only the one driving this call. Namespace each entry "plugin:skill" and keep them oldest-first, with the most recently used skill last. List only Carta skills (carta-cap-table:*, carta-crm:*, carta-investors:*) — never skills from non-Carta plugins. surface is the Claude surface you are running in: "chat" (claude.ai or the Claude app, i.e. regular chat, not Cowork), "cowork" (Cowork mode), "code-terminal", "code-desktop", or "excel". Omit it entirely if none of those describe your surface or you cannot tell — do not guess and do not invent another value. </IMPORTANT>

Carta CRM Home — publish

Publishes the CRM Home as Carta CRM Home - <Organization>, favicon 📇.

You never assemble or read the page. crm-api builds it and serves it as an MCP resource, so this skill fetches that resource and stamps two things into it. That is deliberate: the page's JavaScript calls the card tools of the server it will read from, so fetching it from that same server is what keeps the two in step. A copy vendored into this repository would drift the moment the Home view changed, and would call tools whose payloads had moved on.

What the page does

One manifest call, then one call per card, all through crm_read_tool:

Card Tool
Your CRM at a glance get_crm_home_counts
Pipeline by stage get_crm_home_pipeline
Deals added recently get_crm_home_deals
Contacts added recently get_crm_home_contacts
Latest notes get_crm_home_notes
Meetings today get_crm_home_meetings
What you can ask rendered in the page, no tool

The manifest decides which of those the organization may see, so the page never chooses for itself what to show.

The grant, and why it is this narrow

The page declares crm_read_tool and nothing else. Every viewer of the URL inherits that grant, and a non-empty capabilities object replaces the stored one on every republish, so it cannot be trimmed afterwards.

crm_read_tool cannot write. It refuses, rather than executing:

CRM tool 'update_deal' writes, so it is not available through crm_read_tool.

Do not add crm_call_tool. It reaches the whole catalogue, including every write, and handing that to everyone who opens a URL is a different thing entirely from showing them a dashboard.

Step 0: Gates

Resolve the connector name. Call list_connectors and take the Carta connector's display name. This is the one thing the page cannot work out for itself, and a wrong name fails every card with server_not_connected. A firm-specific deployment carries its own name, so never assume Carta.

Resolve the organization. Call get_current_user. Its organization names the published artifact. One artifact per organization, so two never write over each other.

Confirm the user holds CRM. If get_current_user reports no CRM access, say so and stop.

Step 1: Fetch the page and its build id

List the resources first, and read the URI off the row rather than assuming it.

ListMcpResourcesTool(server: "<connector display name>")

Take the row whose URI ends crm-home.html — today the proxy serves it at ui://carta/crm-home.html. The URI carries no build hash: it is a constant, and the proxy owns it, so it does not move when crm-api rebuilds the page. Read it from the list anyway, so a later rename in the proxy does not need a change here.

crm-api registers the same bundle under ui://carta-crm/home.html. That URI is internal to the proxy and no host can resolve it, so never pass it here.

ReadMcpResourceTool(server: "<connector display name>", uri: "<the URI from the list>")

Then read the build id off the manifest, which is the only place it exists:

crm_read_tool({ "name": "get_crm_home", "arguments": {} })

Keep its viewBuildId. Step 2 stamps it, and the page compares it against a fresh manifest call to tell a reader their copy is behind. It comes from the manifest and not from the URI because the URI has no hash to take.

If the resource is not listed, the organization is outside the Home rollout. crm-api withholds it exactly when it withholds the card tools, so there is nothing to publish and a page built anyway would be a column of errors. Tell the user the Home is not switched on for their organization, and stop. Do not fall back to the views bundle at ui://carta/crm-views.html: it is a different build that expects a host to hand it a result, and it carries demo fixtures.

The read is large, so the result is saved to a file and you are given the path rather than the content. Keep the path and pass it to Step 2. Do not open it — Step 2 reads it, and nothing in this skill needs the page in your context.

Step 2: Stamp the page

The script lives in this skill's own scripts/ directory.

Path — do NOT rely on ${CLAUDE_PLUGIN_ROOT} in bash. In the Cowork sandbox that env var is empty, so uv run "${CLAUDE_PLUGIN_ROOT}/…" resolves to a broken path. Use the base directory reported for this skill when it loaded (it ends in /skills/carta-crm-home-build) as <SKILL_DIR>. If you do not have it, resolve it once with a scoped find (NOT find /):

SKILL_DIR="$(dirname "$(dirname "$(find /sessions "$HOME" -type f -path '*/carta-crm-home-build/scripts/build_artifact.py' 2>/dev/null | head -1)")")"
uv run "<SKILL_DIR>/scripts/build_artifact.py" \
  --resource "<path from Step 1>" \
  --connector "<connector display name>" \
  --organization "<organization from Step 0>" \
  --build-id "<viewBuildId from Step 1>" \
  --out <outputs-directory>/crm-home-<slug>.html

<slug> is the organization lowercased with non-alphanumerics collapsed to -, so two organizations never write over each other's file.

The script writes three things and validates the rest:

  • <meta name="carta-connector">, where the page reads which connector to call.
  • <meta name="carta-home-build">, the viewBuildId from Step 1. The page compares it against viewBuildId on a fresh manifest call and shows a rebuild notice when the two disagree. Pass it every time: without --build-id the page carries no stamp, and a page with no stamp never reports being behind. This is also why the page must be fetched fresh rather than reused from a previous run.
  • the <title> that names the artifact.

It refuses a page that never calls get_crm_home, or one carrying the other views, so a wrong resource stops here rather than reaching a URL.

Step 3: Find an already-published CRM Home

Artifact({action: "list", scope: "mine"})

Look for one titled exactly Carta CRM Home - <Organization>. If it is there, keep its url so Step 4 redeploys in place and the bookmark keeps working. If there is none, omit url and this organization gets its own artifact.

An artifact for a different organization is not a match — reusing its url would replace that organization's page with this one.

Two neighbours to leave alone. Carta Home - <firm> (favicon 🏠) belongs to carta-investors' carta-home-build. Carta Home - <company> (favicon 📊) belongs to carta-cap-table's carta-captable-home-build. Neither is a CRM Home, and publishing over one would replace a colleague's dashboard.

Step 4: Publish

action defaults to "publish", so it is omitted. url is the only difference between a first publish and a redeploy.

Artifact({
  file_path: "<outputs-directory>/crm-home-<slug>.html",
  url: "<url from Step 3 — omit entirely on a first publish>",
  description: "Your Carta CRM at a glance — pipeline by stage, recent deals and contacts, latest notes, and today's meetings.",
  favicon: "📇",
  label: "Rebuilt from the Carta CRM Home resource",
  capabilities: {
    mcp: {
      servers: [
        {
          server: "<connector display name>",
          tools: ["crm_read_tool"]
        }
      ]
    }
  }
})

No title here, and do not add one. The tool takes the title from the file's own <title> tag, which Step 2 set. Passing one as well would only apply if the tag were missing, and it would drift from the page.

Omit favicon on a redeploy. A viewer finds their tab by its icon, so it stays 📇 for the life of the artifact.

Step 5: Confirm it works

Give the user the URL and tell them what it will and will not do:

  • It reads live, so it is current whenever they open it, not a snapshot.
  • It cannot write to their CRM.
  • Anyone they share it with reads their CRM data through it. Say this plainly.

If they report every card failing, the connector name is the first thing to check: a page stamped with a name their session does not carry gets server_not_connected on every call. Rebuild with the right name and republish to the same url.

What this skill does not do

It does not render the Home in the conversation. That is the home skill, and it is the one that works everywhere the CRM MCP is reachable. This skill only publishes.

It does not choose between the two. The home skill selects a target and calls this one when the user wants a page.

It does not build the page. If the Home looks wrong, the fix is in crm-api's src/components/mcp/ui, not here. Rebuilding through this skill republishes whatever that server currently serves.

原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。