- name
- moody-s-earnings-brief
- description
- Produce an Earnings Call Summary HTML report for 2–5 companies using Moody's GenAI MCP tools. Use this skill whenever the user asks to summarize earnings calls, generate an earnings call summary, analyze earnings transcripts across peers, or create an earnings call report. Trigger even if they just name companies and mention "earnings" or "transcript".
# Earnings Brief Skill
Generates a professional HTML report (styled like a Moody's earnings call summary PDF) for 2–5
companies by pulling data from multiple `Moodys MCP server` MCP tools and consolidating 13
structured sections plus a hardcoded table of contents into a single HTML artifact.
The workflow is **single-artifact delivery**: gather all data, then write the entire filled
HTML document to a single `.html` file in `/mnt/user-data/outputs/` and present it to the user
via `present_files`. The rendered HTML artifact is the deliverable.
> ## ⚠️ CRITICAL — NON-NEGOTIABLE OUTPUT CONTRACT
>
> **The LLM MUST deliver the final report as a single standalone HTML artifact file.** This is
> the only acceptable form of delivery for this skill. Specifically:
>
> - The LLM **MUST** write the **complete, standalone HTML document** (`<!doctype html>` →
> `</html>`), with every section from the streaming protocol populated inline, to a single
> `.html` file in `/mnt/user-data/outputs/` using the `create_file` tool, then surface it
> to the user with `present_files`.
> - The LLM **MUST NOT** emit the report inline as a fenced ` ```html ` code block, as prose,
> Markdown, JSON, attachments, or links. The rendered HTML artifact itself is the answer.
> - The LLM **MUST NOT** split the report across multiple files, multiple messages, partial
> snippets, or summaries.
> - If data gathering fails partially, still produce the single HTML artifact file with the
> best-available content. When the earnings call transcript for a company cannot be
> located, **note that fact in the Executive Summary and omit the company from every other
> section of the report** (no rows, no subtitles, no `"--"` placeholders for that company).
> When a transcript exists but does not contain information for a specific section, **omit
> that company from that section only** (no subtitle, no bullets, no placeholder). Never
> skip the artifact itself.
>
> Treat any other output shape as a hard failure of the skill.
## Allowed data sources
This skill may **only** extract information from the following two sources:
1. `Moodys MCP server` — tools used: `findEntity` and `searchEntityEarningsCall`. These are the
only MCP tools that may be called. Do **not** call `getEntityCreditOpinion`,
`getEntitySectorOutlook`, `getEntityEsg`, `getEntityPeers`, `searchEntityDocuments`,
`searchNews`, or any other MCP tool, regardless of section.
2. `web_search` — used **only as a fallback** when `searchEntityEarningsCall` returns no usable
earnings call transcript for a given company, and used **only** to locate and extract the
text of that company's earnings call transcript on the web. Do not use `web_search` for
credit opinions, sector outlooks, news, peers, ESG, or any other purpose.
**Recency requirement (web_search fallback):** if the transcript located via `web_search`
is older than **100 days** from today, discard it and treat the transcript as unavailable
for that company. Do not fall back to any other source — handle the company per the
missing-transcript policy (note in the Executive Summary, omit from every other section).
These rules apply to **every** section of the report. No section may be enriched with credit,
sector, ESG, peer, filings, or news data.
## Bundled files
- `assets/template.html` — self-contained static report shell (CSS + named section placeholders).
No embedded data, no inline script. Treat this file as the **read-only structural reference**:
read it, fill it in, and write the complete filled document to a new `.html` file in
`/mnt/user-data/outputs/`.
## Template (shared)
Before emitting the HTML report, **read both**:
1. [`skills/shared/template/SKILL.md`](../shared/template/SKILL.md) — authoring rules (which
classes / snippets are owned by the shared layer, allowed per-skill overrides, outlook-badge
usage).
2. [`skills/shared/template/assets/template.html`](../shared/template/assets/template.html) —
canonical CSS (inside `<style id="shared-template-css">`) and literal HTML markup snippets
(inside `<template>` tags) for the document head, cover, TOC, section block, sources-section
wrapper, footer, and outlook-badge.
**Lookup order — always check the shared template before inventing.** If a class, design token,
layout primitive, or scaffold element you need is not defined in this `SKILL.md` or already
present in this skill's `assets/template.html`, the shared template skill is authoritative. Do
not invent CSS, HTML scaffolds, or design tokens that the shared skill already provides; do not
silently restyle anything the shared skill owns (cover, TOC, section, sources-section wrapper,
footer, outlook-badge, design tokens, reset, body / page base).
At emit time, copy the **contents** (not the `<style>` wrapper) of `<style id="shared-template-css">`
from the shared asset into the parent template's reserved marker region between the CSS-comment
markers `/* BEGIN shared-template-css ... */` and `/* END shared-template-css */`. For HTML
scaffolds (head boilerplate, cover, TOC, sources-section wrapper, footer), use the literal markup
from the matching `<template>` snippet in the shared asset. The parent template no longer
carries duplicated chrome CSS — those rules ship only in the shared asset.
This skill uses the **`cover-multi`** variant. Skill-specific overrides retained above the
marker region: **none** for ECS (it inherits the canonical `body { font-size: 13px }` and
`.page { max-width: 900px }` defaults). Skill-specific CSS that stays local: the ECS
`.credit-badge`, the `.yoy-table` / `.ratings-table` rules, and `.ratings-factors`. All
outlook-badge usage in this skill must use the canonical pastel variants
(`stable` / `positive` / `negative` / `review` / `na`) defined by the shared skill — no
solid-fill or inline-color overrides.
## Citations (shared)
Before emitting any `[n]` reference inline, any per-section recap block, or the end-of-document
Citations block, **read both**:
1. [`skills/shared/citations/SKILL.md`](../shared/citations/SKILL.md) — authoring rules
(numbering, hyperlinking, source data shape, carve-outs).
2. [`skills/shared/citations/assets/template.html`](../shared/citations/assets/template.html) —
canonical CSS (inside `<style id="shared-citations-css">`) and literal HTML markup snippets
(inside `<template>` tags) for inline references, the end-of-document Citations block, and
the optional `.section-citations` recap.
At emit time, copy the **contents** (not the wrapper) of `<style id="shared-citations-css">`
from the shared asset into the parent template's reserved marker region, located inside
`assets/template.html` between the CSS-comment markers
`/* BEGIN shared-citations-css … */` and `/* END shared-citations-css */`. The parent
template no longer carries duplicated citation CSS — those rules ship only in the shared
asset.
Skill-specific carve-outs that override or extend the shared rules are listed in the section
synthesis rules below — most importantly: **the numeric `.yoy-change` cell stays
citation-free** (no `<a class="cite-ref">` or `<span class="cite-ref">` inside it). The
prefix used for the end-of-document container in this skill is `ecs`, so the container id is
`#ecs-sources`. Optional per-section recap blocks live in `#ecs-cite-a` … `#ecs-cite-l`.
---
## Step 1 — Resolve companies
For each company name provided by the user, call `findEntity` to get the canonical entity name
and entity ID (use the canonical name throughout the report).
Collect 2–5 companies. If the user gives fewer than 2, ask for more.
---
## Step 2 — Read the template
Read `assets/template.html` (relative to this skill directory) once. Keep its exact structure —
CSS, `<head>`, hardcoded TOC, section order, table skeletons, row labels, and element IDs — as
the scaffold for the final artifact. Do **not** copy it to the workspace and do **not** open it.
---
## Step 3 — Gather earnings call transcripts
For each company, fire the following calls in a single parallel batch (one message, many tool calls):
### Earnings call transcript (×4 per company) — primary source
| Category label | Keywords |
| --------------------- | ----------------------------------------------------------------------------------------------------------- |
| Revenue & Price | `Revenue, Net Sales, Sales, Volumes, Units sold, Price, Pricing` |
| Sector & Market | `Industry, Sector Performance, Demand, Market Condition` |
| Supply Chain & Region | `Supply Chain, Materials, Tariffs, Input, Logistics, Regional Performance, Geographic Condition, Geography` |
| Guidance & Events | `Business Outlook, Guidance, Revision, Corporate Events, Transaction` |
### Web search fallback (only if `searchEntityEarningsCall` returns nothing usable)
If — and only if — `searchEntityEarningsCall` returns no usable transcript content for a given
company, run `web_search` to locate that company's most recent earnings call transcript on the
web, and extract the transcript text from the result. The web search must be scoped solely to
finding the earnings call transcript for that entity — not to news, analyst commentary, credit
opinions, or any other content.
**Apply the 100-day recency rule:** check the date of the transcript located via `web_search`.
If the transcript is older than 100 days from today, discard it and treat the transcript as
unavailable for that company. Do not substitute any other source.
All synthesis in Step 4 must be derived exclusively from the transcript content gathered in
this step (either via `searchEntityEarningsCall` or, where applicable, the web_search
fallback). No other tools may be called.
### Missing-tool handling
If any of the tools required for a section do not exist, inform the user: One or more tools required for this section are not available under your current subscription. Unlock more of the expert insights, data, and analytics you trust. Get [in touch] with us to learn more. The [in touch] should be the link Link:https://www.moodys.com/web/en/us/capabilities/gen-ai/ai-ready-data.html
---
## Step 4 — Synthesize + emit the complete artifact
After data is gathered, write the **entire filled `template.html` document** — with every
element from the streaming protocol populated in place — to a single `.html` file in
`/mnt/user-data/outputs/` using the `create_file` tool, then call `present_files` on that path.
The file is the deliverable; do not also paste the HTML into the chat as a fenced code block.
The HTML file **must**:
- Be a complete, standalone HTML document (doctype → `</html>`) that renders without external
dependencies.
- Preserve the template's `<head>` (CSS, fonts), hardcoded TOC, section order, table skeletons,
row labels, and element IDs exactly. Only the empty targets defined below are populated.
- Be written in a single `create_file` call (no progressive `str_replace` edits, no
multi-file split).
Render order of content inside the file follows the page top-to-bottom so the artifact is
human-readable as well as browser-renderable: cover/TOC fields first, then sections 1 → 13, then
sources.
Use earnings call transcript content as the **sole** source for every section. Do not enrich
with credit, sector outlook, ESG, peer, or news data — those tools are not permitted in this
skill. Write in professional financial language. Name specific companies in bullets rather
than speaking abstractly.
Attribute substantive claims with numbered citation references. The exact inline markup, the
URL-less fallback, and the rule that `n` matches the row position of the source inside
`#ecs-sources` are defined in [skills/shared/citations/SKILL.md](../shared/citations/SKILL.md).
### Cover / header fields (write first)
- `#ecs-report-date` — e.g. `April 4, 2026` (plain text)
- `#ecs-footer-date` — same value (plain text)
- `#ecs-company-count` — number of companies (plain text)
- `#ecs-company-chips` — one `<span class="company-chip">Company Name</span>` per company (space-separated)
- `#ecs-cover-img-right`, `#ecs-cover-img-bottom` — optional. If you have image URLs or data URIs
to use, set the `src` attributes **and** add the `has-cover-image` class to the corresponding
container (`<div class="cover-top has-cover-image">` and/or `<div class="cover-bottom has-cover-image">`).
If you do not have images, leave the template as-is — the empty image strips will collapse
automatically and the cover will render as a clean navy block with the accent bar.
### Section synthesis rules
> **Per-section omit rule (applies to every section a–l).** If a company's earnings call
> transcript exists but does not contain information relevant to a given section, **omit
> that company from that section entirely** — do not emit a row, subtitle, bullet, or any
> "Not disclosed" placeholder for it. The section may legitimately cover fewer companies
> than the full set. (Companies whose transcript could not be located at all are handled
> per rule **a** and are excluded from every section.)
**a. Executive Summary** → `#ecs-executive-summary`
**Exactly one combined `<p>` paragraph of 100 words or less** that summarises the entire contents of the newsletter across all covered companies. **Do NOT write one paragraph per company** and do NOT structure it as a per-company recap — it must be a single, general, combined summary of the whole report based solely on the earnings call transcript content. May carry inline `<a class="cite-ref">[n]</a>` hyperlink citations.
If the earnings call transcript for any requested company could not be located (neither via `searchEntityEarningsCall` nor a web_search result within the 100-day window), **explicitly note that fact in the Executive Summary** (e.g., "An earnings call transcript for {Company X} could not be located and it is therefore not covered in this report."). That company must then be **omitted from every other section** — no row in the YOY tables, no subtitle, no bullets, no placeholder.
**b. Overall Credit Consideration** → `#ecs-credit-badge` + `#ecs-overall-credit`
Answer the question: **Are conditions in the industry and macro-environment credit positive, negative, or neutral?** Determine the answer **solely from the earnings call transcript content**, by looking across all covered companies for industry-wide trends and patterns.
Write the sentiment badge into `#ecs-credit-badge` (see snippet below).
Write one intro `<p>` (≤250 chars) that gives an overview with a **clearly formed opinion** on whether industry/macro conditions are credit positive, negative, or neutral, followed by a `<ul>` of **exactly 5 `<li>` bullets** (≤150 chars each) into `#ecs-overall-credit` that **list the five considerations supporting that view**. The intro paragraph and each bullet may carry inline citations.
**The view and every supporting consideration must be derived from trends or patterns observed across the covered companies — i.e., the industry as a whole.** Do **not** extrapolate isolated events that apply to just one company into an industry-level claim. Group companies that share a dynamic into a single bullet (e.g., "Company A and Company B both cite easing input cost pressure …"). Do **not** write one bullet per company.
Draw exclusively on the earnings call transcript. Do not consult credit opinions, sector outlooks, or any other tool.
**c. Revenue YOY Trend** → `#ecs-tbody-revenue`
One `<tr>` per company: company-wide YOY revenue change (`+X.XX%` / `-X.XX%` / `Up` / `Down` / `Flat` / `Not specified`) and a 70–90 char commentary. Not segment-specific. The commentary cell may carry inline citations; the numeric `.yoy-change` cell stays citation-free.
**d. Volumes YOY Trend** → `#ecs-tbody-volumes`
Same row format as (d) but for sales volumes. The commentary cell may carry inline citations; the numeric `.yoy-change` cell stays citation-free.
**e. Selling Price Trend** → `#ecs-tbody-prices`
Same row format as (d) but for selling prices. The commentary cell may carry inline citations; the numeric `.yoy-change` cell stays citation-free.
**f. Qualitative / Broad Industry Commentary on Revenue, Volumes & Pricing** → `#ecs-qualitative`
Exactly three paragraphs in this fixed order: **a. Revenue, b. Volumes, c. Pricing**. Each paragraph **must give a general view of the industry** in which the covered companies operate — i.e., synthesise the cross-company patterns observed in the earnings call transcripts into an industry-level commentary, not a per-company recap. **Each paragraph must be between 200 and 300 characters.**
Prefix each paragraph with a `<strong class="subsection-title">Revenue</strong>` (etc.) subheader. Derive macro framing exclusively from cross-company observations in the earnings call transcripts. Each paragraph may carry inline citations.
**g. End Market Conditions** → `#ecs-end-markets`
Exactly four thematic commentaries describing the market conditions in which the covered companies operate. Each commentary has a `<strong class="subsection-title">…</strong>` subheader (≤70 chars summarising the bullets) + a `<ul>` with **at least 2 `<li>` bullets**. **Combined bullet length per commentary: 250–300 characters.** Derive narratives exclusively from the earnings call transcripts. Each bullet may carry inline citations.
**Provide your view on the trends or patterns observed across all covered companies** — these commentaries must reflect cross-company industry dynamics, not isolated single-company facts repackaged.
**Each bullet (and every comment) must explicitly name the company or companies it applies to** by stating the company name directly within the sentence. If two or more companies share the dynamic, name all of them in the same bullet. Do not write company-agnostic bullets.
**h. Supply Chain Conditions** → `#ecs-supply-chain`
GitHub에서 보기