mcpField
T
tear-sheet

tear-sheet

github.com/anthropicsドキュメント40.9k1.7k 回インストール今日更新
リポジトリ

tear-sheet について

S&P Global MCP ツールのライブデータを使い、対象者に合わせた企業概要を Word 文書として作成するスキルです。4種類の対象者向けに、データ取得手順と文書レイアウトを定めています。

主な機能

  1. 014種類の対象者別フォーマット
  2. 02財務・企業データの取得
  3. 03Word文書の生成
  4. 04再利用可能なレイアウト関数
  5. 05出典と免責事項のフッター

活用シーン

  1. 01株式調査向け企業プロフィールの作成
  2. 02IB / M&A取引向け企業概要の作成
  3. 03Corp Devによる買収候補の評価
  4. 04営業面談用の企業情報の準備

MCP 対応

S&P Global MCP ツールを使い、概要作成に必要な企業、財務、市場などの構造化データを取得します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/anthropics/financial-services --skill tear-sheet

インストール後、Claude Code で/tear-sheetを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

LICENSE
references/
corp-dev.md
equity-research.md
ib-ma.md
sales-bd.md

詳細

財務ティアシートジェネレーター

S&P Global MCP ツールを使って S&P Capital IQ からリアルタイムデータを取得し、プロフェッショナルな Word 文書に整形して、対象読者に合わせた企業ティアシートを作成します。

スタイル設定

以下は妥当なデフォルト設定です。自社のブランドに合わせてカスタマイズするには、このセクションを変更してください。よくある変更には、カラーパレットの差し替え、フォントの変更(多くの銀行では Calibri が標準です)、免責事項の文面の更新などがあります。

カラー:

  • プライマリ(ヘッダーバナーの背景、セクション見出しのテキスト):#1F3864
  • アクセント(署名セクションの強調表示):#2E75B6
  • 表のヘッダー行の塗りつぶし:#D6E4F0
  • 表の交互の行の塗りつぶし:#F2F2F2
  • 表の枠線:#CCCCCC
  • ヘッダーバナーのテキスト:#FFFFFF

タイポグラフィ(docx-js の半ポイント単位のサイズ):

  • フォントファミリー:Arial
  • 会社名:18pt 太字(サイズ:36)
  • セクション見出し:11pt 太字(サイズ:22)、プライマリカラー
  • 本文:9pt(サイズ:18)
  • 表のテキスト:8.5pt(サイズ:17)
  • フッター/免責事項:7pt 斜体(サイズ:14)
  • テンプレートごとの上書き設定は、各参照ファイルの書式設定メモに記載されています。

会社ヘッダーバナー:

  • ヘッダーはページ幅全体に広がるネイビー(#1F3864)のバナーで、会社名を白字で表示します。
  • バナーの下には、キーと値のペアを、ページ幅全体に広がる2列の枠線なしテーブルで必ず表示してください。 左列:会社の識別情報(ティッカー、HQ、設立年、従業員数、セクター)。右列:財務の識別情報(時価総額、EV、株価、発行済み株式数)。各セルには、同じ行に太字のラベルと通常の太さの値を配置します(例:「時価総額 $124.7B」)。すべての項目を1列にまとめて左寄せしないでください。横方向のスペースが無駄になり、プロフェッショナルさに欠けます。2列に広げることは、プロフェッショナルなティアシートと既定の文書を見分ける最も重要な視覚的要素です。
    • 実装: borders: none と shading: none をすべてのセルに設定した2列のテーブルを作成します。列幅はそれぞれ50%にします。左列のセルには、ティッカー、HQ、設立年、従業員数を別々の段落として配置します。右列のセルには、時価総額、EV、株価、発行済み株式数を配置します。各項目は1つの段落にし、ラベルには太字のラン、値には通常のランを使います。
    • 各列に含める具体的な項目は対象読者によって異なります。ヘッダーの仕様については、参照ファイルを確認してください。原則は常に、項目を左側にまとめず、ページ全体に広げることです。
  • ヘッダーのキーと値のブロックに枠線付きテーブルを使用しないでください。 枠線付きテーブルは財務データ専用です。
  • ヘッダーの主要指標(時価総額、EV、株価)は、別の枠線付きテーブルではなく、インラインのキーと値のペアとして表示してください。

セクション見出し:

  • セクションを見やすく区切るため、各セクション見出しの直下に水平線(細線、#CCCCCC、0.5pt)を配置します。
  • 線は見出し段落自体の下罫線として描画してください。 線専用の段落要素を別途挿入しないでください。別の段落を挿入すると、その前後の余白が加わり、セクション見出しの下に過剰な空白が生じます。
  • 実装: docx-js では、paragraph.borders.bottom = { style: BorderStyle.SINGLE, size: 1, color: "CCCCCC" } を使ってセクション見出しの段落に下罫線を適用します。水平線要素を別途追加するために doc.addParagraph() を使用しないでください。thematicBreak も使用しないでください。罫線は見出し段落自体に設定し、段落後の間隔は0ptにして、線が見出しテキストにぴったり接するようにします。
  • 間隔:見出し段落の前に12pt、見出し段落の後に0pt、次のコンテンツ要素の前に4pt。 箇条書きの書式:
  • すべてのティアシート種別で、箇条書きには単一の箇条書き記号(•)を使用してください。ティアシート内またはティアシート間で、•、-、▸、番号付きリストを混在させないでください。
  • 統合/分析の箇条書き(業績のハイライト、戦略的適合性、統合に関する考慮事項、会話のきっかけ):左インデント360 DXA(0.25インチ)で、箇条書き記号にぶら下げインデントを設定したブロック形式にしてください。本文とは視覚的に区別してください。これらは解釈を含む内容であり、データテーブルや文章段落とは異なる見た目にする必要があります。
  • 関係性セクション内の情報提供を目的とする箇条書き:標準の本文インデント(180 DXA)を使用し、ぶら下げインデントは設定しないでください。
  • 箇条書きセクションに左ボーダーのアクセントを適用しないでください。 左ボーダーのスタイルはdocx-jsで一貫して描画されず、視覚的な乱れが生じます。代わりに、インデントと文字サイズの違いで特徴的なセクションを区別してください。

テーブル(財務データのみ):

  • ヘッダー行:Table Header Fill(#D6E4F0)を使用し、濃い色の太字にする
  • 本文行:白とTable Alternating Fill(#F2F2F2)を交互に使用する
  • ボーダー:Table Borderの色(#CCCCCC)を使用し、細線にする(BorderStyle.SINGLE、サイズ1)
  • セルの余白:上下40 DXA、左右80 DXA
  • 数値列はすべて右揃えにする
  • 必ずShadingType.CLEARを使用してください(SOLIDは使用しないでください。背景が黒くなる原因になります)

レイアウト:

  • US Letter縦向き、余白0.75インチ(全辺1080 DXA)

数値の書式:

  • 通貨:USDを使用します。会社の売上高が500億ドルを超えない限り、単位は百万ドルとします。500億ドルを超える場合は、10億ドル単位で小数点以下1桁まで表示します。単位は個々のセルではなく、列ヘッダーに記載します(例:「売上高($M)」)。
  • テーブルのセルには、ドル記号を付けず、カンマ区切りの数値のみを記載します。 例:売上高のセルには「$4,916」ではなく「4,916」と表示します。単位は列ヘッダーに記載します。
  • 会計年度:相対表記(FY-2、FY-1)ではなく、実際の年度(FY2022、FY2023、FY2024)を使用します。
  • 負の数:括弧で囲みます(例:(2.3%))
  • パーセンテージ:小数点以下1桁まで表示します
  • 大きな数値:千単位の区切りにカンマを使用します

フッター(本文中ではなく、文書のフッター): 出典と免責事項は、ページ下部の本文中ではなく、実際の文書フッターに配置してください(すべてのページに繰り返し表示)。フッターは、すべてのページで中央揃えの2行にしてください。

  • 1行目:「データ:S&P Capital IQ(Kensho経由) | 分析:AI生成 | [月 日, 年]」
  • 2行目:「情報提供のみを目的としています。投資助言ではありません。」
  • 書式:7ptの斜体、中央揃え、文字色#666666
  • このフッターのテキストは、同一企業のすべてのティアシート種別で完全に同じにしてください。対象者によって文言を変えないでください。
  • このフッターは、すべてのティアシート、すべての対象者種別、すべてのページで必須です。 省略しないでください。

コンポーネント関数

ドキュメント要素の作成には、必ず以下の関数を使用してください。カスタムの docx-js スタイル設定コードは記述しないでください。 これらの関数を生成する Node スクリプトにコピーし、呼び出してください。上記のスタイル設定に関する説明はドキュメントとして残し、これらの関数でスタイルを適用します。

const docx = require("docx");
const {
  Document, Paragraph, TextRun, Table, TableRow, TableCell,
  WidthType, AlignmentType, BorderStyle, ShadingType,
  Header, Footer, PageNumber, HeadingLevel, TableLayoutType,
  convertInchesToTwip
} = docx;

// ── Color constants ──
const COLORS = {
  PRIMARY: "1F3864",
  ACCENT: "2E75B6",
  TABLE_HEADER_FILL: "D6E4F0",
  TABLE_ALT_ROW: "F2F2F2",
  TABLE_BORDER: "CCCCCC",
  HEADER_TEXT: "FFFFFF",
  FOOTER_TEXT: "666666",
};

const FONT = "Arial";

// ── 1. createHeaderBanner ──
// Returns an array of docx elements: [banner paragraph, key-value table]
function createHeaderBanner(companyName, leftFields, rightFields) {
  // leftFields / rightFields: arrays of { label: string, value: string }
  const banner = new Paragraph({
    children: [
      new TextRun({
        text: companyName,
        bold: true,
        size: 36, // 18pt
        color: COLORS.HEADER_TEXT,
        font: FONT,
      }),
    ],
    shading: { type: ShadingType.CLEAR, color: "auto", fill: COLORS.PRIMARY },
    spacing: { after: 0 },
    alignment: AlignmentType.LEFT,
  });

  function buildCellParagraphs(fields) {
    return fields.map(
      (f) =>
        new Paragraph({
          children: [
            new TextRun({ text: f.label + "  ", bold: true, size: 18, font: FONT }),
            new TextRun({ text: f.value, size: 18, font: FONT }),
          ],
          spacing: { after: 40 },
        })
    );
  }

  const noBorder = { style: BorderStyle.NONE, size: 0, color: "FFFFFF" };
  const noBorders = { top: noBorder, bottom: noBorder, left: noBorder, right: noBorder };
  const noShading = { type: ShadingType.CLEAR, color: "auto", fill: "FFFFFF" };

  const kvTable = new Table({
    rows: [
      new TableRow({
        children: [
          new TableCell({
            children: buildCellParagraphs(leftFields),
            width: { size: 50, type: WidthType.PERCENTAGE },
            borders: noBorders,
            shading: noShading,
          }),
          new TableCell({
            children: buildCellParagraphs(rightFields),
            width: { size: 50, type: WidthType.PERCENTAGE },
            borders: noBorders,
            shading: noShading,
          }),
        ],
      }),
    ],
    width: { size: 100, type: WidthType.PERCENTAGE },
  });

  return [banner, kvTable];
}

// ── 2. createSectionHeader ──
// Returns a single Paragraph with bottom border rule
function createSectionHeader(text) {
  return new Paragraph({
    children: [
      new TextRun({
        text: text,
        bold: true,
        size: 22, // 11pt
        color: COLORS.PRIMARY,
        font: FONT,
      }),
    ],
    spacing: { before: 240, after: 0 }, // 12pt before, 0pt after
    border: {
      bottom: { style: BorderStyle.SINGLE, size: 1, color: COLORS.TABLE_BORDER },
    },
  });
}

// ── 3. createTable ──
// headers: string[], rows: string[][], options: { accentHeader?, fontSize? }
function createTable(headers, rows, options = {}) {
  const fontSize = options.fontSize || 17; // 8.5pt default
  const headerFill = options.accentHeader ? COLORS.ACCENT : COLORS.TABLE_HEADER_FILL;
  const headerTextColor = options.accentHeader ? COLORS.HEADER_TEXT : "000000";

  const cellBorders = {
    top: { style: BorderStyle.SINGLE, size: 1, color: COLORS.TABLE_BORDER },
    bottom: { style: BorderStyle.SINGLE, size: 1, color: COLORS.TABLE_BORDER },
    left: { style: BorderStyle.SINGLE, size: 1, color: COLORS.TABLE_BORDER },
    right: { style: BorderStyle.SINGLE, size: 1, color: COLORS.TABLE_BORDER },
  };

  const cellMargins = { top: 40, bottom: 40, left: 80, right: 80 };

  function isNumeric(val) {
    if (typeof val !== "string") return false;
    const cleaned = val.replace(/[,$%()]/g, "").trim();
    return cleaned !== "" && !isNaN(cleaned);
  }

  // Header row
  const headerRow = new TableRow({
    children: headers.map(
      (h) =>
        new TableCell({
          children: [
            new Paragraph({
              children: [
                new TextRun({
                  text: h,
                  bold: true,
                  size: fontSize,
                  color: headerTextColor,
                  font: FONT,
                }),
              ],
            }),
          ],
          shading: { type: ShadingType.CLEAR, color: "auto", fill: headerFill },
          borders: cellBorders,
          margins: cellMargins,
        })
    ),
  });

  // Data rows with alternating shading
  const dataRows = rows.map((row, rowIdx) => {
    const fill = rowIdx % 2 === 1 ? COLORS.TABLE_ALT_ROW : "FFFFFF";
    return new TableRow({
      children: row.map((cell, colIdx) => {
        const align = colIdx > 0 && isNumeric(cell)
          ? AlignmentType.RIGHT
          : AlignmentType.LEFT;
        return new TableCell({
          children: [
            new Paragraph({
              children: [
                new TextRun({ text: cell, size: fontSize, font: FONT }),
              ],
              alignment: align,
            }),
          ],
          shading: { type: ShadingType.CLEAR, color: "auto", fill: fill },
          borders: cellBorders,
          margins: cellMargins,
        });
      }),
    });
  });

  return new Table({
    rows: [headerRow, ...dataRows],
    width: { size: 100, type: WidthType.PERCENTAGE },
  });
}

// ── 4. createBulletList ──
// items: string[], style: "synthesis" | "informational"
function createBulletList(items, style = "synthesis") {
  const indent =
    style === "synthesis"
      ? { left: 360, hanging: 180 }   // 360 DXA left, hanging indent for bullet
      : { left: 180 };                 // 180 DXA, no hanging

  return items.map(
    (item) =>
      new Paragraph({
        children: [
          new TextRun({ text: "•  ", font: FONT, size: 18 }),
          new TextRun({ text: item, font: FONT, size: 18 }),
        ],
        indent: indent,
        spacing: { after: 60 },
      })
  );
}

// ── 5. createFooter ──
// date: string (e.g., "February 23, 2026")
function createFooter(date) {
  return new Footer({
    children: [
      new Paragraph({
        children: [
          new TextRun({
            text: `Data: S&P Capital IQ via Kensho | Analysis: AI-generated | ${date}`,
            italics: true,
            size: 14, // 7pt
            color: COLORS.FOOTER_TEXT,
            font: FONT,
          }),
        ],
        alignment: AlignmentType.CENTER,
      }),
      new Paragraph({
        children: [
          new TextRun({
            text: "For informational purposes only. Not investment advice.",
            italics: true,
            size: 14,
            color: COLORS.FOOTER_TEXT,
            font: FONT,
          }),
        ],
        alignment: AlignmentType.CENTER,
      }),
    ],
  });
}

生成するスクリプトでの使用方法:

  1. 上記のすべての関数と定数を生成する Node.js スクリプトにコピーします
  2. バナーの段落や表を手動で作成する代わりに、createHeaderBanner(...) を呼び出します
  3. すべてのセクションタイトルに createSectionHeader(...) を呼び出します。段落の枠線を手動で設定しないでください
  4. すべての表形式のデータ(財務サマリー、類似企業比較、M&A 活動、関係性の表、資金調達履歴など)に createTable(...) を呼び出します。M&A 活動の表(IB/M&A テンプレート)には { accentHeader: true } を渡します。数値を含まない表(例:関係性、所有権)でも、この関数は正しく動作します。数値を含むセルだけが右揃えになります
  5. 業績のハイライト、戦略的適合性、統合に関する検討事項、会話のきっかけには createBulletList(items, "synthesis") を呼び出します
  6. 関係性の項目には createBulletList(items, "informational") を呼び出します
  7. Document コンストラクターの footers.default プロパティに createFooter(date) を渡します

これらの関数で解消できる問題:

  • 表の背景が黒くなる(すべての箇所で ShadingType.CLEAR を適用します)
  • セクション見出しの下に別途水平線の段落が追加される(段落自体に border.bottom を適用します)
  • ヘッダーのキーと値の表に枠線が付く(borders: none を適用します)
  • 箇条書きのスタイルが統一されない(• 文字のみを適用します)
  • フッターがない(所定のフッター構造を使用します)

ワークフロー

ステップ 1:入力情報を確認する

作業を始める前に、次の 4 項目までを確認します。

  1. 企業 — 企業名またはティッカーシンボルです。ティッカーシンボルしか指定されていない場合は、最初の照会で正式な企業名を特定します(例:企業情報ツールを使用します)。
  2. 対象読者 — 次の 4 種類のいずれかです。
    • 株式リサーチ — 投資先を評価するバイサイド/セルサイドのアナリスト向け
    • IB / M&A — 取引の文脈で企業のプロファイルを作成するバンカー向け
    • コーポレート開発 — 買収候補を評価する社内の戦略チーム向け
    • 営業 / BD — クライアントとの打ち合わせに備える営業チーム向け
  3. 比較対象企業(任意)— ユーザーが特定の比較対象企業を想定している場合は、その企業名を記録します。指定がない場合は、スキルが S&P Global のデータから同業企業を特定します。株式リサーチ、IB/M&A、コーポレート開発のティアシートで必要になります。
  4. ページ数の希望(任意)— 対象読者によってデフォルトが異なります(下記参照)が、ユーザーは変更できます。

対象読者が指定されていない場合は、ユーザーに確認してください。

ステップ 2:対象読者別のリファレンスを読む

このスキルのディレクトリから、該当するリファレンスファイルを読みます。

  • 株式リサーチ → references/equity-research.md
  • IB / M&A → references/ib-ma.md
  • コーポレート開発 → references/corp-dev.md
  • 営業 / BD → references/sales-bd.md

各リファレンスには、セクション、照会計画、書式設定のガイダンス、ページ数のデフォルトが定められています。

ステップ 3:S&P Global MCP 経由でデータを取得する

**まず、**中間ファイル用のディレクトリを作成します。

mkdir -p /tmp/tear-sheet/

S&P Global MCP ツール(Kensho LLM-ready API とも呼ばれます)を使用します。Claude は、財務データ、企業情報、市場データ、コンセンサス予想、決算説明会のトランスクリプト、M&A 取引、ビジネス上の関係に関する構造化ツールを利用できます。各リファレンスファイルのクエリプランには、各セクションで取得するデータが記載されています。会話で利用できる適切な S&P Global ツールに対応付けてください。

各クエリの実行後、ただちに取得データを、リファレンスファイルのクエリプランで指定された中間ファイルに書き込んでください。 書き込みを後回しにしないでください。ディスクに書き込まれたデータは、長い会話でコンテキストが劣化しても保護されます。

クエリ戦略: 各リファレンスファイルには、4〜6 個のデータ取得ステップを含むクエリプランがあります。これらは出発点であり、厳格な制約ではありません。呼び出しを最小限に抑えることより、データを完全に取得することを優先してください。

  • 必ず 4 会計年度分の財務データを取得してください。 表示するのは 3 年分ですが、最も古い 4 年目のデータは、最初に表示する年の前年比売上高成長率を計算するために必要です。これがないと、最も古い年の成長率が「N/A」と表示され、設計上の選択ではなくデータ欠落のように見えます。
  • 利用するデータに応じた S&P Global ツールを使って、記載どおりにクエリプランを実行してください。
  • ツール呼び出しで結果が不完全な場合は、代替ツールを試すか、クエリの範囲を絞ってください。たとえば、企業概要にセグメントの詳細が含まれていない場合は、セグメントツールを直接試してください。
  • 対象を絞った再試行後もデータポイントが取得できない場合は、先に進み、「N/A」または「非開示」と記載してください。
  • データを決して捏造しないでください。ツールから数値が返されない場合、学習済みの知識から推定しないでください。

ユーザー指定の比較対象企業: ユーザーが比較対象企業を指定した場合は、各社の財務情報とマルチプルを個別にクエリしてください。指定がない場合は、ツールが返すピアデータを使用するか、competitors ツールで企業のセクターから同業他社を特定してください。

ユーザーからの任意の補足情報: ユーザーが自然な形で伝える追加情報に注意してください。買収者が誰か(「自社プラットフォーム向けに検討しています」)、何を販売しているか(「銀行にデータ分析を提供しています」)、有力な買い手が誰か(「Salesforce や Microsoft が関心を持ちそうです」)について言及した場合は、その情報を関連する分析セクション(戦略的適合性、会話のきっかけ、取引の切り口)に反映してください。この情報を尋ねる必要はありません。提供された場合にのみ活用してください。

非公開企業への対応: CIQ には非公開企業のデータも含まれているため、同じ方法でクエリしてください。ただし、結果が限られることが予想されます。非公開企業向けに生成する場合は、以下のとおりにしてください。

  • 省略:株価、52 週レンジ、ベータ、株価パフォーマンス、コンセンサス予想、トレーディング・コンプス
  • 重視:事業概要、関係、所有構造、利用可能な財務情報
  • ヘッダーに「Private Company」と目立つように記載する
ステップ 3b:派生指標を計算する

すべてのデータ収集が完了し、中間ファイルを書き込んだら、専用の一括処理で派生指標をすべて計算します。これは計算のみを行うステップです。新たな MCP クエリは行いません。

すべての中間ファイルを読み込み、コンテキストに取り込んでから、次の項目を計算します。

  • マージン: 粗利益率、EBITDA マージン、FCF マージン、営業利益率
  • 成長率: 前年比売上高成長率、前年比セグメント売上高成長率、前年比 EPS 成長率
  • 効率性比率: FCF コンバージョン(FCF/EBITDA)、売上高に占める研究開発費の割合、売上高に占める設備投資額の割合
  • 資本構成: 純有利子負債(有利子負債合計 − 現金および現金同等物)、純有利子負債 / EBITDA
  • セグメント構成: 各セグメントの売上高が連結売上高合計に占める割合(データ整合性ルール 8 に従い、連結売上高を分母として使用します)

検証(算術検証から移動): この計算処理中に、すべての算術チェックを実施します。

  • マージンの計算: EBITDA マージン = EBITDA / 売上高、粗利益率 = 粗利益 / 売上高などを検証します。計算したマージンが元の数値と一致しない場合は、元の構成要素から計算した値を使用します。
  • 成長率: 前年比成長率 =(当期 − 前期)/ 前期であることを検証します。基礎となる数値がある場合、事前計算済みの成長率に依存しないでください。
  • セグメント合計: セグメント別売上高を表示する場合は、セグメントの合計が売上高合計と一致することを(丸め誤差の許容範囲内で)検証します。一致しない場合は、整合性のない数値を公開するのではなく、合計行を省略します。
  • パーセンテージ列: 「合計に占める割合」の列の合計がおよそ 100% になることを検証します。
  • バリュエーションのクロスチェック: EV と EV/売上高の両方を表示する場合は、EV / 売上高 ≈ 記載された倍率であることを検証します。

検証に失敗した場合は、元データから再計算してください。それでも整合しない場合は、誤った数値を公開するのではなく、その指標を「N/A」としてください。ティアシートにおける気づかれない計算ミスは、信頼性を損ないます。

計算結果を /tmp/tear-sheet/calculations.csv に次の列で書き込みます:metric,value,formula,components

行の例:

metric,value,formula,components
gross_margin_fy2024,72.4%,gross_profit/revenue,"9524/13159"
revenue_growth_fy2024,12.3%,(current-prior)/prior,"13159/11716"
net_debt_fy2024,2150,total_debt-cash,"4200-2050"
ステップ 3c:データファイルを検証する

ドキュメントを生成する前に、すべての中間ファイルが存在し、データが入力されていることを確認します。

各中間ファイルを個別の読み取り処理で読み込み、検証サマリーを出力します。

=== Tear Sheet Data Verification ===
company-profile.txt: ✓ (12 fields)
financials.csv:      ✓ (36 rows)
segments.csv:        ✓ (8 rows)
valuation.csv:       ✓ (5 rows)
calculations.csv:    ✓ (18 rows)
earnings.txt:        ✓ (populated)
relationships.txt:   ⚠ MISSING
peer-comps.csv:      ✓ (12 rows)
================================

ソフトゲート: 現在の対象読者タイプで必要なファイルが欠落している、または空の場合は、警告を出力して処理を続行します。ティアシートでは、欠損データを「N/A」で適切に処理し、該当セクションを省略します。ただし、警告を出すことで、失われたデータを把握できるようになります。

重要なルール:ドキュメント内のすべての数値について、唯一の信頼できる情報源はファイルです。以前の会話の記憶ではありません。 ステップ 4 で DOCX を生成する際は、中間ファイルから値を読み込んでください。財務データに会話のコンテキストを頼らないでください。

ステップ 4:DOCX として書式設定する

DOCX 作成の仕組み(Node 経由の docx-js)については、/mnt/skills/public/docx/SKILL.md を読んでください。上記のスタイル設定に加え、参照ファイルに記載されたセクション固有の書式設定を適用します。

ページ数の既定値(ユーザーによる変更可):

  • 株式調査:1 ページ(情報密度を高めるのが通例です)
  • IB / M&A:1~2 ページ
  • 企業開発:1~2 ページ
  • 営業 / 事業開発:1~2 ページ

内容が目標ページ数を超える場合は、各参照ファイルで指定された優先順位に従ってセクションを削除します。

出力ファイル名: [CompanyName]_TearSheet_[Audience]_[YYYYMMDD].docx 例:Nvidia_TearSheet_CorpDev_20260220.docx

/mnt/user-data/outputs/ に保存し、ユーザーに提示します。

データ整合性ルール

以下のルールは、他のすべてのルールに優先します。

  1. 金融データの情報源はS&P Globalのツールのみです。 トレーニングデータの知識で不足を補わないでください。情報が古かったり、誤っていたりする可能性があります。
  2. 見つからない情報は明記してください。 行を黙って省略するのではなく、「N/A」または「非開示」と記載してください。
  3. 日付は重要です。 会計年度末または報告期間を記載してください。暦年と会計年度が同じだと仮定しないでください。市場データ(株価、時価総額)には「基準日」を記載してください。
  4. 異なる報告期間のデータを混在させないでください。 FY2023の売上高とLTMのEBITDAがある場合は、それぞれを区別して記載してください。
  5. 手動計算よりも、MCPから返されるフィールドを優先してください。 S&P Globalのツールが事前計算済みのフィールド(例:純有利子負債、EBITDA、FCF)を返す場合、構成要素から計算するのではなく、その値を直接使用してください。派生指標の手動計算は、ツールがそのフィールドを返さない場合に限ります。これにより不整合を減らせます。
  6. ティアシートの種類が異なっても、一貫性を保ってください。 同じ企業について複数のティアシート(例:同じセッション内での株式調査とIB/M&A)を作成する場合、同じ基礎データポイントからは、すべての出力で同一の値を算出してください。純有利子負債、売上高、EBITDA、利益率、成長率は完全に一致させてください。レポートごとに独立して再取得または再計算せず、取得済みの値を再利用してください。
  7. 判明している取引価値を、決して格下げしないでください。 M&Aツールが取引のディール価値を返す場合、その値を出力に記載してください。判明しているディール価値を「非開示」に置き換えないでください。「非開示」を使用できるのは、ツールがその取引の値を実際に返さない場合に限ります。
  8. セグメント比率の分母には、連結売上高を使用してください。 セグメント表で「総売上高に占める割合」を計算する場合、各セグメントの売上高を、セグメント売上高の合計ではなく、(損益計算書に報告されている)連結売上高で割ってください。セグメント間消去により、セグメントの合計が連結売上高を上回ることはよくあります。連結売上高を使用すると、比率が文書内の他の箇所に示される総売上高と一致します。
  9. 入手可能な場合は、必ずフォワード(NTM)倍率を記載してください。 ツールがトレーリング倍率とフォワード倍率の両方を返す場合、出力に両方を含めてください。フォワード倍率は、株式調査、IB/M&A、コーポレート・ディベロップメントの対象読者にとって、主要なバリュエーションの参照値です。フォワードデータが入手可能な場合、トレーリング倍率のみを表示しないでください。
  10. S&P Globalのツールは、経営幹部または経営陣の情報を返しません。 トレーニングデータから経営陣の氏名、役職、経歴を記載しないでください。これはルール1に違反し、古い情報を生む原因になります。テンプレートに経営陣のセクションがある場合は、そのセクション全体を省略してください。所有構造(機関投資家の保有者、インサイダー保有比率、PEスポンサー)は、ツールが返す場合に限り、「データが入手可能な場合」という条件付きで記載できます。

中間ファイルのルール

MCP ツールから取得したすべてのデータは、文書を生成する前に構造化された中間ファイルに保存する必要があります。会話のコンテキストではなく、これらのファイルを文書内のすべての数値の唯一の信頼できる情報源とします。

セットアップ: ステップ 3 の開始時に、作業ディレクトリを作成します。

mkdir -p /tmp/tear-sheet/

クエリ後の書き込み必須: MCP クエリの各ステップが完了したら、取得したデータを直ちに該当する中間ファイルに書き込みます。すべてのクエリが完了するまで待たないでください。各参照ファイルのクエリ計画には、各ステップの後にどのファイルに書き込むかが指定されています。

ファイルスキーマ:

ファイル形式列/構造使用対象
/tmp/tear-sheet/company-profile.txtキーと値のテキストname, ticker, exchange, HQ, sector, industry, founded, employees, market_cap, enterprise_value, stock_price, 52wk_high, 52wk_low, shares_outstanding, beta, ownershipすべて
/tmp/tear-sheet/financials.csvCSVperiod,line_item,value,sourceすべて
/tmp/tear-sheet/segments.csvCSVperiod,segment_name,revenue,sourceER、IB、CD
/tmp/tear-sheet/valuation.csvCSVmetric,trailing,forward,sourceER、IB、CD
/tmp/tear-sheet/consensus.csvCSVmetric,fy_year,value,sourceER
/tmp/tear-sheet/earnings.txt構造化テキスト四半期、日付、主な引用、ガイダンス、主な要因ER、IB、Sales
/tmp/tear-sheet/relationships.txt構造化テキスト顧客、サプライヤー、パートナー、競合他社 — それぞれに説明を付記IB、CD、Sales
/tmp/tear-sheet/peer-comps.csvCSVticker,metric,value,sourceER、IB、CD
/tmp/tear-sheet/ma-activity.csvCSVdate,target,deal_value,type,rationale,sourceIB、CD
/tmp/tear-sheet/calculations.csvCSVmetric,value,formula,componentsすべて(ステップ 3b で書き込み)

略語: ER = 株式調査、IB = IB/M&A、CD = コーポレート・ディベロップメント、Sales = 営業/BD。

対象の種類によって、使用するファイルは異なります。どのクエリステップが該当するかは参照ファイルで定義されています。現在の対象の種類に関係しないファイルは作成する必要はありません。

未加工の値のみ。 中間ファイルには、ツールから返された未加工の値を保存します。これらのファイルで利益率、成長率、その他の派生指標を事前に計算しないでください。計算はステップ 3b で行います。

ページ数の上限の適用: 各参照ファイルには、既定のページ数と番号付きの削減順序が定められています。生成した文書が目標ページ数を超える場合は、指定された順序で削減してください。テンプレートの最小値を下回るフォントサイズや余白に縮小しないでください。削減順序は厳格な優先順位です。セクション 2 に手を付ける前に、セクション 1 をすべて削減してください。

コンテンツ品質ルール

  1. 読者に合わせて、すべての説明文を作成し直します。 CIQ の企業概要は入力情報であり、出力ではありません。読者の種類ごとに異なる説明が必要です。株式調査向けには簡潔で投資テーゼを重視し、IB 向けにはピッチブック形式の文章にし、Corp Dev 向けには製品を中心に説明し、営業/BD 向けには平易な言葉で記述します。CIQ の概要をそのままティアシートに貼り付けてはいけません。
  2. 読者に合わせて業績ハイライトを差別化します。 同じ決算説明会でも、読者によって異なる要点が得られます。株式調査ではセグメント別の業績とコンセンサス予想に対する上振れ・下振れが必要です。IB では利益率の推移と戦略に関するコメントが重要です。営業/BD では、会話のきっかけとなる戦略的テーマが必要です。異なる種類のティアシートで同じ箇条書きを使い回してはいけません。
  3. 統合分析のセクションが差別化要因です。 戦略的適合性分析、統合時の検討事項、会話のきっかけ、事業概要の段落は、ティアシートの価値を高める部分です。これらのセクションには、データをつなぎ合わせてストーリーを組み立てる分析的な推論が必要です。文脈なしに企業名を列挙しても、統合分析にはなりません。
  4. セグメント表では、保留中の事業売却を明記します。 セグメントまたは事業部門の売却が発表済みで、まだ完了していない場合は、「Mobility* — *2026 年半ばに売却完了予定」のように、取引が保留中であることを示す脚注または括弧書きをセグメント表に追加します。Corp Dev および IB/M&A 向けのティアシートでは、売却対象セグメントを除いたプロフォーマ売上高と売上構成比を、セグメント表の下に 1 行で記載します。これにより、読者は自分で計算せずに「今後の」事業を評価できます。
算術検証

→ 算術検証はステップ 3b(派生指標の計算)で実施されるようになりました。 利益率、成長率、セグメント合計、パーセンテージ列、バリュエーションの照合はすべて、文書の生成開始前に、専用の計算工程で検証されます。検証チェックリストの全項目については、ステップ 3b を参照してください。

コメント