Moody's Credit MCP
Moody's v3.0.0
Publisher description
From the marketplace listing
Moody's Credit MCP powers AI applications and analytics workflows with GenAI-ready data and research needed for comprehensive credit analysis. Moody's Credit MCP provides a unified layer across core credit data categories commonly used in risk assessment, offering financial analysis, default risk metrics, and qualitative insights. It combines comprehensive entity information, such as financials, ownership, and management, with Moody's Ratings proprietary ratings and research, and probability of default metrics, all enhanced by unstructured data like company filings, earnings transcripts, news, and macroeconomic trends. By bringing structured and unstructured credit inputs together in a single interface, Moody's Credit MCP enables faster data-to-insight workflows, supporting more rigorous, consistent credit assessment and continuous monitoring of entities, markets, and portfolios. Data includes: - Global entity firmographics and identifiers - Entity hierarchies and ownership structures - Detailed global entity financials - Moody's Ratings credit ratings and research - Expected default frequency - Economic data and research - News and media - Annual reports Use Moody's Credit MCP for: - Credit Analysis - access comprehensive credit risk data and research to assess creditworthiness and compare risk across issuers and instruments - Risk Management - monitor credit risk through forward-looking measures and scenario analysis - Relationship Management - quickly evaluate credit health to support informed engagement and credit structuring - Ratings Advisory - align issuer details with ratings methodologies and peer benchmarks - Investment Research - get data-driven assessments to evaluate relative value and risk - Market Analysis - analyze sector trends and credit risk signals to assess broader market conditions
Language: English · Automatically detected from descriptions.
Files & skills
File archives
Skill instructions
earnings-brief15.4 KB
---
name: 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 actively render it to
the user with **both** `present_files` and `visualize:show_widget`. The rendered HTML artifact
is the deliverable — writing the file without rendering it is a failed run.
> ## ⚠️ CRITICAL — NON-NEGOTIABLE OUTPUT CONTRACT
>
> **The LLM MUST deliver the final report as a single standalone HTML artifact file that it
> then actively renders on screen.** Creating the file is only half the job — a file that is
> written but never surfaced is a failed run, and is the single most common failure mode 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.
> - The LLM **MUST** then render that file with **both** display tools — `present_files`
> **and** `visualize:show_widget` — before ending its turn. Firing both renderers is what
> guarantees the report always appears even if one tool is unavailable.
> - The LLM **MUST NOT** end its turn after `create_file` without having called the display tools.
> - 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 `getCreditOpinion`,
`getEntitySectorOutlook`, `getEntityPeers`, `searchAllDocuments`,
`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/`.
## Shared chrome & citations
Before emitting, read [`references/shared-template.md`](references/shared-template.md) (page
chrome: cover, TOC, section block, sources-section wrapper, footer, outlook-badge, design
tokens) and [`references/shared-citations.md`](references/shared-citations.md) (citation
numbering, hyperlinking, source data shape, markup snippets). Both are **authoritative** — do
not invent, duplicate, or restyle anything they already define. The canonical CSS is already
inlined in `assets/template.html` between the `/* BEGIN/END shared-template-css */` and
`/* BEGIN/END shared-citations-css */` markers; never re-copy it at emit time.
The rest of this section is the skill-specific binding.
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.
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/`, then render it. The full required delivery sequence (`create_file`
→ `present_files` → `visualize:show_widget` → one short sentence) is specified in the
**Output and presentation** section below; follow it exactly. The file is the deliverable; do
not 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 [references/shared-citations.md](references/shared-citations.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, streaming protocol & markup
Before emitting, read [`references/report-spec.md`](references/report-spec.md) for the
authoritative body-authoring spec: the per-section synthesis rules (sections **a–l**,
including the per-section omit rule), where the optional Citations recap blocks
(`#ecs-cite-a` … `#ecs-cite-l`) and the end-of-document `#ecs-sources` rows go, the
**streaming protocol** (element → content mapping), the reference HTML snippets (YOY table
row, company chip, credit badge, subsection subheader), the `.yoy-change` / `.credit-badge`
class-selection rules, and the HTML conventions. Populate every `#ecs-*` target exactly as
specified there. Remember: the numeric `.yoy-change` cell stays citation-free.
---
## Step 5 — Output and presentation (required final steps)
> ## ⚠️ CRITICAL — THE SKILL IS NOT COMPLETE UNTIL THE REPORT IS VISIBLY RENDERED
>
> Writing the file is **not** delivery. After you write the HTML you **must** actively render
> it with every display tool available, in order, before you say anything else. Do not end
> your turn until the rendered report is on screen.
Follow this exact sequence. Do not skip a step, reorder, or substitute alternatives:
1. **Write the HTML file in a single call.** Call `create_file` to write the entire standalone
HTML document (`<!doctype html>` → `</html>`) to
`/mnt/user-data/outputs/{companies_slug}_earnings_call_summary.html` in **one** call. No
progressive edits, no multi-file split.
2. **Present the file.** Immediately call `present_files` on that exact path to surface the
artifact to the user.
3. **Show the widget.** Immediately call `visualize:show_widget` on the same file to render the
report visually. Call this even if `present_files` already succeeded — firing both renderers
is what guarantees the report always appears.
4. **Confirm in one short sentence.** Only after the renderers return, add a single brief
sentence in chat (e.g. `Earnings Call Summary for {Company A}, {Company B}, … — the report
is available above as a self-contained HTML artifact.`). Nothing more.
If a display tool call fails or is unavailable, immediately try the other one rather than
stopping. Never end your turn at step 1, and never paste the HTML into chat or suggest shell
commands.
---
## Tips
- Run ALL data-gathering tool calls in a single parallel batch (one message, many tool calls).
- Emit the final HTML as a single `.html` file written to `/mnt/user-data/outputs/`, then
render it with **both** `present_files` and `visualize:show_widget` (see the Output and
presentation section) — do not paste it inline as a fenced code block, do not stream partial
sections, do not split across multiple files or messages, and never stop at file creation.
- If `searchEntityEarningsCall` returns no usable transcript for a company, fall back to
`web_search` **only** to retrieve that company's earnings call transcript from the web, and
apply the 100-day recency rule. If no transcript can be located within that window, note
the omission in the Executive Summary and exclude that company from every other section
(no rows, no subtitles, no placeholders).
- Do not call any other MCP tool (no credit opinion, no sector outlook, no news, no peers, no
ESG, no document search) — those sources are out of scope for this skill.
- Pick the correct `.yoy-change` / `.credit-badge` modifier class yourself using the rules above — the template no longer does this at render time.
- Emit `<tr>` rows directly inside each `<tbody id="ecs-tbody-…">` placeholder; do not re-create the `<table>` or `<thead>`.
- Inline citations follow the shared citations skill — read [references/shared-citations.md](references/shared-citations.md) before authoring any `[n]` reference or the Citations block.
Referenced files: 20
issuer-brief18.5 KB
---
name: issuer-brief
description: >
Produce a comprehensive Issuer Brief HTML report for a company using Moody's
GenAI MCP tools. Use this skill whenever the user asks to create an Issuer Brief,
company profile report, credit memo, investment book, or comprehensive company analysis. Also
trigger when they ask for a report combining company overview, financials, peer comparison,
industry overview, strategic developments, management, credit profile, risks, and ESG into a
single document. Trigger even if they just name a company and say "Issuer Brief", "info book", "company
book", "credit book", or "full company report".
---
# Issuer Brief Skill
Generates a professional HTML report (styled like a Moody's Issuer Brief) for a
target company. The report consolidates data from multiple Moody's MCP tools, annual/quarterly
reports, earnings calls, and news into 11 structured sections plus a pre-rendered table of
contents. Section 4 is titled "Company Metrics" (formerly "Share Price Performance and Valuation").
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 actively render it to
the user with **both** `present_files` and `visualize:show_widget`. The rendered HTML artifact
is the deliverable — writing the file without rendering it is a failed run.
> ## ⚠️ CRITICAL — NON-NEGOTIABLE OUTPUT CONTRACT
>
> **The LLM MUST deliver the final report as a single standalone HTML artifact file that it
> then actively renders on screen.** Creating the file is only half the job — a file that is
> written but never surfaced is a failed run, and is the single most common failure mode 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.
> - The LLM **MUST** then render that file with **both** display tools — `present_files`
> **and** `visualize:show_widget` — before ending its turn. Firing both renderers is what
> guarantees the report always appears even if one tool is unavailable.
> - The LLM **MUST NOT** end its turn after `create_file` without having called the display tools.
> - 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 and `"--"` placeholders for missing cells — never skip the artifact
> or the render step.
>
> Treat any other output shape as a hard failure of the skill.
> ## ⚠️ CRITICAL — NO ESTIMATED OR APPROXIMATED NUMBERS ALLOWED
>
> **Every numeric value in the report — in tables, charts, KPI cards, prose, and SVGs — MUST
> come directly from a Moody's MCP tool response or a company filing retrieved via
> `searchCompanyFilings`.** Estimation, approximation, interpolation, and inference from
> indirect sources are strictly forbidden. Specifically:
>
> - **NEVER** write `~`, `approx.`, `estimated`, or any similar qualifier next to a number.
> If the exact figure is unavailable from the data gathered, use `"--"` instead.
> - **NEVER** derive a number by splitting, distributing, or back-calculating from an aggregate
> (e.g. do not allocate total debt across maturity buckets by assumption).
> - **NEVER** invent segment revenue, EPS, FCF, ROE, debt maturity amounts, or any other
> metric that was not explicitly returned by a tool call.
> - **Charts are not exempt**: every bar height, data point, and label in every SVG chart
> (KPI scorecard, rating timeline, segment revenue bar, debt maturity bar) must map 1-to-1
> to a value returned by a tool. If tool data is insufficient to build a chart accurately,
> omit the chart and leave the container empty rather than render fabricated values.
> - **Peer data is not exempt**: only populate peer columns with values explicitly returned
> by `getCreditOpinion`, `getEntityFinancials_v2`, or `getEntityRatings` for that peer.
>
> Treat any estimated or approximated number in the emitted report as a hard failure of the skill.
## Required MCP server
`Moodys MCP server` — tools used: `findEntity`, `getEntityPeers`, `getEntityRatings`,
`getCreditOpinion`, `getEntitySectorOutlook`, `searchAllDocuments`,
`searchEntityEarningsCall`, `searchNews`, `getEntityFinancials_v2`, `getEntityManagersDirectors`,
`searchCompanyFilings`.
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 Link:https://www.moodys.com/web/en/us/capabilities/gen-ai/ai-ready-data.html with us to learn more.
> ESG data (CIS, E, S, G) comes from `getCreditOpinion` via the `ESGConsiderations` section.
## Bundled files
- `assets/template.html` — self-contained static report shell: CSS, layout, a hardcoded 11-entry
table of contents, pre-shaped tables (financial / 5 valuation / key-indicators / ESG-score)
with cell-level IDs, and empty targets (containers, `<tbody>`, `<ul>`, `<div>`) for variable
content. Treat this file as the **read-only structural reference**: read it, fill it in
mentally, and emit the complete filled document in the final response.
## Shared chrome & citations
Before emitting, read [`references/shared-template.md`](references/shared-template.md) (page
chrome: cover, TOC, section block, sources-section wrapper, footer, outlook-badge, design
tokens) and [`references/shared-citations.md`](references/shared-citations.md) (citation
numbering, hyperlinking, source data shape, markup snippets). Both are **authoritative** — do
not invent, duplicate, or restyle anything they already define. The canonical CSS is already
inlined in `assets/template.html` between the `/* BEGIN/END shared-template-css */` and
`/* BEGIN/END shared-citations-css */` markers; never re-copy it at emit time.
The rest of this section is the skill-specific binding.
This skill uses the **`cover-simple`** variant. Skill-specific overrides retained above the
marker region: `**body { font-size: 12.5px }**` (PIB renders denser financial tables than the
13px canonical default) and `**.page { max-width: 920px }**` (slightly wider than the 900px
canonical default). Skill-specific CSS that stays local: `table.data-table`, `table.fin-table`,
and the PIB chart helper (`.chart-container` PIB variant — centered, no background).
**Chart spacing rule:** Every `.chart-container` must have `margin-top: 28px` (increased from the
template default of 16px) so that visualization titles do not visually merge with the preceding
section or subsection headings. When emitting the final HTML, ensure the `.chart-container` CSS
rule reads `.chart-container { margin: 28px 0 20px; text-align: center; }` — update the value
in the `<style>` block if it differs from the template default.
**Outlook-badge migration.** PIB previously shipped a solid-fill `.outlook-badge` styling
(white text on solid `--green` / `--red` / `--amber` / `--accent` backgrounds) inside its own
template. That carve-out has been **removed**. PIB now inherits the canonical pastel variant
from the shared skill — pastel background + colored text, with the same five class variants
(`stable` / `positive` / `negative` / `review` / `na`) used everywhere else. Do not re-define
`.outlook-badge` rules locally and do not emit inline `style="..."` overrides on outlook
badges. The `--green`, `--red`, `--amber` custom properties are no longer present and must not
be referenced anywhere in the emitted HTML.
Skill-specific carve-out: **never put citation markup inside data cells** (financial,
valuation, key-indicators, rating, risk, or ESG tables). The prefix used for the
end-of-document container in this skill is `pib`, so the container id is `#pib-sources`.
Per-section recap blocks live in `#pib-cite-a` … `#pib-cite-k`, mapped one-to-one to the
eleven report sections in document order; the full letter→section mapping and recap rules
are in [`references/report-spec.md`](references/report-spec.md). Each recap reuses the global
`[n]` numbering and is left empty when its section carries no inline citations.
## Parameters
The user should provide:
- **Company Name** (required)
- **Currency** (optional, defaults to USD)
---
## Step 1 — Resolve the target company and peers
Call `findEntity` with the company name. Store the canonical entity name and ID.
Then call `getEntityPeers` for the target to get up to 3 peers. Call `findEntity`
for each peer to resolve their entity IDs.
---
## 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 all data in parallel
Fire ALL of the following in a **single parallel batch**. This is the heaviest step — launch
everything at once.
### For the target company
| Tool Call | Purpose |
|-----------|---------|
| `getCreditOpinion` (sections: Profile, Summary, CreditStrengths, CreditChallenges, FactorsLeadingToUpgrade, FactorsLeadingToDowngrade, KeyIndicatorsTable, ScorecardTable, ESGConsiderations) | Credit profile, strengths/challenges, financials, ESG |
| `getEntityFinancials_v2` | Primary source for historical financials (3 full fiscal years + LTM) and valuation table data |
| `getEntityRatings` | Current rating, outlook, historical ratings |
| `getEntitySectorOutlook` | Sector outlook |
| `searchAllDocuments` with "Credit Opinion" | Credit opinion documents |
| `searchAllDocuments` with "Business units, Segment Revenue, Profile, Segments, Revenue Drivers" | Business segment data |
| `searchCompanyFilings` with "segment revenue, business segments, revenue by segment" | Per-segment revenue from annual/quarterly filings to populate Business Segments and Operations section |
| `searchAllDocuments` with "Risk factors, competitive pressures, market volatility, regulatory compliance, litigation" | Risk analysis |
| `searchAllDocuments` with "Leverage, Debt, Liquidity, Credit Facilities, Coverage, Ratings, Outlook" | Credit profile data |
| `searchEntityEarningsCall` with "Target Market, Services, Products, Mission, Vision, Markets, Geographies, Revenue" | Company overview from earnings call |
| `searchEntityEarningsCall` with "Business units, Segment Revenue, Drivers, Revenue Drivers, Earnings" | Business segments from earnings call |
| `searchEntityEarningsCall` with "Market Size, Growth Rate, Demand, Competition, Market Share, Regulation, Trends" | Industry analysis |
| `searchEntityEarningsCall` with "Share, Stock, Price, Market capitalization, Earnings per share, Dividend, Valuation" | Share price data |
| `searchEntityEarningsCall` with "Risk factors, competitive pressures, market volatility, economic uncertainty" | Risks from earnings call |
| `searchEntityEarningsCall` with "merger, acquisitions, strategic developments, alliances, partnerships" | Strategic developments |
| `searchNews` with "{Company} Market, Industry Overview and Trends" | Industry news |
| `searchNews` with "{Company} merger, acquisitions, strategic developments" | M&A news |
| `searchNews` with "{Company} Share, Stock, Price, Valuation" | Share price news |
| `searchNews` with "{Company} Management, governance, leadership" | Management news |
| `getEntityManagersDirectors` | Names and roles of current managers and directors for Management & Governance section |
### For each peer (up to 3 peers)
| Tool Call | Purpose |
|-----------|---------|
| `getCreditOpinion` (Profile, KeyIndicatorsTable, CreditStrengths, CreditChallenges, FactorsLeadingToUpgrade, FactorsLeadingToDowngrade, ScorecardTable, ESGConsiderations) | Peer comparison data + ESG |
| `getEntityFinancials_v2` | Peer valuation and financial data for Share Price Performance and Valuation section |
| `getEntityRatings` | Peer ratings |
---
## Step 4 — Synthesize + emit the complete artifact
Use Moody's internal research as the **primary foundation**. Earnings call data and news
supplement. Write in professional credit-research language with numbered citation references
inline in narrative text. The exact inline markup, the URL-less fallback, and the rule that
`n` matches the row position of the source inside `#pib-sources` are defined in
[references/shared-citations.md](references/shared-citations.md) — read it before authoring
any `[n]` reference.
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/`, then render it. The full required delivery sequence (`create_file`
→ `present_files` → `visualize:show_widget` → one short sentence) is specified in the
**Step 5 — Output and presentation** section below; follow it exactly.
The HTML file **must**:
- Be written in a single `create_file` call (no progressive `StrReplace` edits, no multi-file
split).
- Contain 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.
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 + footer
1. `#pib-cover-company` — plain text, canonical target name.
2. `#pib-company` — plain text target name.
3. `#pib-date` — report date, e.g. `April 15, 2026`.
4. `#pib-footer-date` — same date string.
### Section-by-section authoring (Sections 1–11)
Before emitting, read [`references/report-spec.md`](references/report-spec.md) for the full
per-section element specs — every `#pib-*` target for Sections 1 through 11 (Company
Overview, Business Segments and Operations, Historical Financials, Company Metrics, Peer
Comparison and Competitive Landscape, Industry Overview and Trends, Strategic Developments,
Management and Governance, Credit Profile, Risks and Challenges, ESG Profile), the exact SVG
layout constants for each chart, the financial-table row/column mapping, and the
`#pib-sources` Citations rows. Populate every target exactly as specified there, honoring the
no-estimation contract above.
---
## Step 5 — Output and presentation (required final steps)
> ## ⚠️ CRITICAL — THE SKILL IS NOT COMPLETE UNTIL THE REPORT IS VISIBLY RENDERED
>
> Writing the file is **not** delivery. After you write the HTML you **must** actively render
> it with every display tool available, in order, before you say anything else. Do not end
> your turn until the rendered report is on screen.
Follow this exact sequence. Do not skip a step, reorder, or substitute alternatives:
1. **Write the HTML file in a single call.** Call `create_file` to write the entire standalone
HTML document (`<!doctype html>` → `</html>`) to
`/mnt/user-data/outputs/{company_slug}_issuer_brief.html` in **one** call. No progressive
edits, no multi-file split.
2. **Present the file.** Immediately call `present_files` on that exact path to surface the
artifact to the user.
3. **Show the widget.** Immediately call `visualize:show_widget` on the same file to render the
report visually. Call this even if `present_files` already succeeded — firing both renderers
is what guarantees the report always appears.
4. **Confirm in one short sentence.** Only after the renderers return, add a single brief
sentence in chat (e.g. `Issuer Brief for {Target Company} — the report is available above as
a self-contained HTML artifact.`). Nothing more.
If a display tool call fails or is unavailable, immediately try the other one rather than
stopping. Never end your turn at step 1, and never paste the HTML into chat or suggest shell
commands.
---
## Streaming protocol, markup snippets & chart templates
The element → content mapping table, the reference markup snippets (financial row, peers
table / rating rows, rating-table row, risk-table row, segment bullet, strategy bullet), the
SVG chart templates (KPI scorecard, rating step-line, segment revenue bar, debt-maturity bar,
Porter's Five Forces diagram, management cards) with their layout constants and palette, and
the class-selection rules all live in
[`references/report-spec.md`](references/report-spec.md). Read it before emitting any `#pib-*`
content or chart. The debt-maturity and segment charts require `searchCompanyFilings` data —
leave the container empty rather than fabricate values.
## Tips
- Run ALL research searches in a single parallel batch to minimize latency.
- **No estimated or approximated numbers anywhere in the report.** Every figure in tables,
charts, KPI cards, and prose must come directly from a tool response; use `"--"` when a
value is unavailable. See the CRITICAL no-estimation block above.
- **`searchCompanyFilings` is a required call** for the debt-maturity and segment-revenue
charts. If it does not return the per-year schedule or segment breakdown, leave the chart
container empty rather than fabricate values.
- Target company appears first in every table and comparison; reuse the same column labels
across the valuation / key-indicators tables. Financial values are in millions; never hide
a row. If fewer than 3 peers are returned, leave unused columns/cells blank — do not
collapse the tables.
- Emit each chart SVG directly into its container — the template does not render charts at
load time. Exact placement, layout constants, and the Section 4 / `#pib-val-1-*` omissions
are in [`references/report-spec.md`](references/report-spec.md).
- Citation references `[n]` go inline in narrative text per
[references/shared-citations.md](references/shared-citations.md); never inside table cells.
Each section's optional `#pib-cite-{a..k}` recap reuses the global numbering.
- Deliver the report as **one** `.html` file in `/mnt/user-data/outputs/`, then render it with
**both** `present_files` and `visualize:show_widget` (see Step 5). Never paste it as a fenced
` ```html ` code block, never split across files or messages, and never stop at file creation.
Referenced files: 14
peer-analysis16 KB
---
name: peer-analysis
description: >
Produce a Peer Analysis HTML report for a target company and its credit peers using Moody's
GenAI MCP tools. Use this skill whenever the user asks to compare a company against its peers,
run a peer analysis, do a credit peer comparison, generate a peer group report, or analyze
relative credit positioning. Trigger even if they just name a company and mention "peers",
"peer comparison", "credit comparison", "peer group", or "relative value".
---
# Peer Analysis Skill
Generates a professional HTML report (styled like a Moody's peer analysis PDF) for a target
company and up to 3 credit peers. Data is pulled from multiple `Moodys MCP server` MCP tools and
consolidated into a single HTML artifact covering peers comparison, ratings chart, and ESG.
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 actively render it to
the user with **both** `present_files` and `visualize:show_widget`. The rendered HTML artifact
is the deliverable — writing the file without rendering it is a failed run.
> ## ⚠️ CRITICAL — NON-NEGOTIABLE OUTPUT CONTRACT
>
> **The LLM MUST deliver the final report as a single standalone HTML artifact file that it
> then actively renders on screen.** Creating the file is only half the job — a file that is
> written but never surfaced is a failed run, and is the single most common failure mode 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.
> - The LLM **MUST** then render that file with **both** display tools — `present_files`
> **and** `visualize:show_widget` — before ending its turn. Firing both renderers is what
> guarantees the report always appears even if one tool is unavailable.
> - The LLM **MUST NOT** end its turn after `create_file` without having called the display tools.
> - 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 and `"--"` placeholders for missing cells — never skip the artifact
> or the render step.
>
> Treat any other output shape as a hard failure of the skill.
## Required MCP server
`Moodys MCP server` — tools used: `findEntity`, `getEntityPeers`, `getEntityRatings`,
`getCreditOpinion`, `getEntityFinancials_v2` (sections: Profile, Summary, RatingOutlook, FactorsLeadingToUpgrade,
FactorsLeadingToDowngrade, CreditStrengths, CreditChallenges, ESGConsiderations,
KeyIndicatorsTable, ScorecardTable, ESGConsiderations), `getEntitySectorOutlook`
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 Link:https://www.moodys.com/web/en/us/capabilities/gen-ai/ai-ready-data.html with us to learn more.
## Bundled files
- `assets/template.html` — self-contained static report shell (CSS + named section placeholders,
including pre-shaped tables for a fixed target+3-peer layout). No embedded data, no inline
script. Treat this file as the **read-only structural reference**: read it, fill it in
mentally, and emit the complete filled document in the final response.
## Shared chrome & citations
Before emitting, read [`references/shared-template.md`](references/shared-template.md) (page
chrome: cover, TOC, section block, sources-section wrapper, footer, outlook-badge, design
tokens) and [`references/shared-citations.md`](references/shared-citations.md) (citation
numbering, hyperlinking, source data shape, markup snippets). Both are **authoritative** — do
not invent, duplicate, or restyle anything they already define. The canonical CSS is already
inlined in `assets/template.html` between the `/* BEGIN/END shared-template-css */` and
`/* BEGIN/END shared-citations-css */` markers; never re-copy it at emit time.
The rest of this section is the skill-specific binding.
This skill uses the **`cover-multi`** variant. Skill-specific override retained above the
marker region: `**.page { max-width: 1050px }**` (PA reports are wider than the 900px canonical
default to fit the multi-column scorecard / key-indicators tables). Skill-specific CSS that
stays local: `.sub-heading`, all PA-specific table classes (`.pa-table`, `.credit-drivers-table`,
`.ki-table`, `.sc-table`), and the chart helpers (`.chart-container`, `.chart-title`,
`.chart-legend`, `.chart-legend-item`, `.chart-legend-swatch`). 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. PA flags the target
entity on the cover with `class="company-chip target"`; the chip wrappers themselves come from
the shared cover-multi snippet.
The prefix used for the end-of-document container in this skill is `pa`, so the container id
is `#pa-sources`. Optional per-section recap blocks live in `#pa-cite-peers`,
`#pa-cite-ratings`, and `#pa-cite-esg`. Internal MCP tool names (e.g. `getCreditOpinion`)
are NEVER rendered inside `.source-meta`.
---
## Step 1 — Resolve the target company
Call `findEntity` with the company name provided by the user. Store the canonical entity name
and entity ID.
If the user provides only one company name, that is the **target company**. The peers will be
discovered automatically in Step 2.
---
## Step 2 — Discover and resolve peers
Call `getEntityPeers` for the target company. Select the top 3 peers returned.
You now have a set of up to **4 companies** (1 target + up to 3 peers). For each peer, call
`findEntity` to resolve its canonical entity name and ID.
---
## Step 3 — Read the template
Read `assets/template.html` (relative to this skill directory) once. Keep its exact structure —
CSS, `<head>`, section order, table skeletons (including all pre-shaped 4-company columns/rows),
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 4 — Gather all data in parallel
For every company in the set (target + up to 3 peers), fire **all of the following in a single
parallel batch** (one message, many tool calls):
### Credit Opinion data (per company)
Call `getCreditOpinion`,`getEntityFinancials_v2` requesting these sections, about the key Indicators table this should be populated with most recent fiscal year available (e.g. 2025 FY) on `getEntityFinancials_v2`. Not LTM allowed:
| Section parameter | Purpose |
|---|---|
| `Profile` | Company description for the Peers Table |
| `FactorsLeadingToUpgrade` | Upgrade factors for Credit Drivers |
| `FactorsLeadingToDowngrade` | Downgrade factors for Credit Drivers |
| `CreditStrengths` | Credit strengths for Credit Drivers |
| `CreditChallenges` | Credit challenges for Credit Drivers |
| `KeyIndicatorsTable` | Financial metrics for Key Indicators table |
| `ScorecardTable` | Scorecard data |
| `ESGConsiderations` | ESG narrative containing the CIS classification and E/S/G scores for the ESG Table & Heatmap |
### Ratings (per company)
Call `getEntityRatings` — retrieve the current long-term rating, rating class, rating date,
outlook, and historical ratings (need at least the last 5 rating actions for the Ratings Chart).
### ESG (per company)
Source ESG from the `ESGConsiderations` section of `getCreditOpinion` (requested in the Credit
Opinion call above). This section is narrative text, but Moody's states the overall CIS
classification and the E, S, and G issuer-profile scores within it (e.g. "CIS-3", "E-4", "S-3",
"G-2"). Extract those codes verbatim for the ESG Table & Heatmap. If a given score is not stated
in the narrative, follow the `na` / `--` conventions in the report spec rather than inventing one.
### Sector outlook (once per sector)
Call `getEntitySectorOutlook` for the target company's sector. Reuse for peers in the same
sector.
Hold all results in context for Step 5 synthesis.
---
## Step 5 — 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/`, then render it. The full required delivery sequence (`create_file`
→ `present_files` → `visualize:show_widget` → one short sentence) is specified in the
**Step 6 — Output and presentation** section below; follow it exactly.
The HTML file **must**:
- Be written in a single `create_file` call (no progressive `StrReplace` edits, no multi-file
split).
- Contain a complete, standalone HTML document (doctype → `</html>`) that renders without
external dependencies.
- Preserve the template's `<head>` (CSS, fonts), section order, table skeletons, row labels, and
element IDs exactly. Only the empty targets defined below are populated.
Write in professional financial/credit analysis language. Always reference specific companies by
name. The target company is **always the first column / first row** in every table. 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/header fields first, then Peers Comparison sub-sections
(1–6), Ratings Chart, ESG, and citations/sources last.
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
`#pa-sources` are defined in [references/shared-citations.md](references/shared-citations.md).
### Cover / header fields (write first)
- `#pa-report-date` — e.g. `April 20, 2026` (plain text)
- `#pa-footer-date` — same value (plain text)
- `#pa-target-company` — canonical name of the target (plain text)
- `#pa-peer-count` — integer count of peers resolved in Step 2 (plain text)
- `#pa-company-chips` — `<span class="company-chip target">Target</span>` followed by one
`<span class="company-chip">Peer</span>` per peer (space-separated; target first)
- `#pa-cover-img-right`, `#pa-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.
### Report body — sections, streaming protocol & charts
Before emitting, read [`references/report-spec.md`](references/report-spec.md) for the
authoritative body-authoring spec: the Section 1 sub-sections (Peers Table, Peers Rating,
Credit Drivers, Key Indicators, Scorecards, Conclusion), Section 2 (Ratings Chart + analysis),
Section 3 (ESG Table + analysis), where the optional `#pa-cite-*` recaps and the
`#pa-sources` rows go, the **streaming protocol** (element → content mapping), the reference
HTML snippets, the Ratings-Chart SVG template (constants, rating→value map, coordinate
formulae), and the class-selection rules and conventions. **The spec also carries three
Amendments that override this base layout — apply them.** Populate every `#pa-*` target
exactly as specified there.
---
## Step 6 — Output and presentation (required final steps)
> ## ⚠️ CRITICAL — THE SKILL IS NOT COMPLETE UNTIL THE REPORT IS VISIBLY RENDERED
>
> Writing the file is **not** delivery. After you write the HTML you **must** actively render
> it with every display tool available, in order, before you say anything else. Do not end
> your turn until the rendered report is on screen.
Follow this exact sequence. Do not skip a step, reorder, or substitute alternatives:
1. **Write the HTML file in a single call.** Call `create_file` to write the entire standalone
HTML document (`<!doctype html>` → `</html>`) to
`/mnt/user-data/outputs/{target_company_slug}_peer_analysis.html` in **one** call.
`{target_company_slug}` is the target's canonical name lowercased with spaces and special
characters replaced by underscores (e.g. `apple_inc_peer_analysis.html`). No progressive
edits, no multi-file split.
2. **Present the file.** Immediately call `present_files` on that exact path to surface the
artifact to the user.
3. **Show the widget.** Immediately call `visualize:show_widget` on the same file to render the
report visually. Call this even if `present_files` already succeeded — firing both renderers
is what guarantees the report always appears.
4. **Confirm in one short sentence.** Only after the renderers return, add a single brief
sentence in chat (e.g. `Peer Analysis for {Target Company} — the report is available above as
a self-contained HTML artifact.`). Nothing more.
If a display tool call fails or is unavailable, immediately try the other one rather than
stopping. Never end your turn at step 1, and never paste the HTML into chat or suggest shell
commands.
---
## Tips
- Run ALL data-gathering tool calls in a single parallel batch (one message, many tool calls).
- Deliver the report as **one** `.html` file in `/mnt/user-data/outputs/`, then render it with
**both** `present_files` and `visualize:show_widget` (see Step 6). Never paste it as a fenced
` ```html ` code block, never split across files or messages, and never stop at file creation.
- The target company always appears as the first column / first row in every table and
comparison.
- The conclusion must orient around the target company — how it differentiates from its peers.
- If fewer than 3 peers are returned, leave the unused column/row IDs empty. The pre-shaped
tables keep those cells blank — do not attempt to collapse or restructure the table.
- If `getCreditOpinion` does not return a particular section, write `Not available` in the
corresponding cell rather than leaving it blank.
- `getEntitySectorOutlook` typically applies to all companies in the same sector — call once
and reuse.
- Emit the ratings-chart SVG directly into `#pa-ratings-chart` — the template no longer builds
the chart at render time. Pick the `.outlook-badge` class yourself using the rules above.
- For companies with fewer than 5 historical ratings, either repeat the oldest available rating
value to fill the trailing points, or reduce `maxPts` in the chart formula to the largest
available count (and drop the corresponding `Rating k` x-axis labels).
- Inline citations follow the shared citations skill — read
[references/shared-citations.md](references/shared-citations.md) before authoring any `[n]`
reference or the Citations block.
---
## Amendments (in `references/report-spec.md`)
Three amendments in [`references/report-spec.md`](references/report-spec.md) override the base
report layout and **must be applied**:
1. **Most recent fiscal year** — always populate Key Indicators and Scorecards from each
entity's most recent FY-end `getEntityFinancials_v2` data (with the distorted-EBITDA `†`
handling), not whatever year the credit opinion cites.
2. **Visual Enhancements** — rating summary cards (`#pa-rating-cards`), financial comparison
bar charts (`#pa-fi-charts`), and the ESG score heatmap (`#pa-esg-heatmap`).
3. **Section layout / ratings-chart / ESG overrides** — emit rating cards instead of the
`<tbody id="pa-peers-rating">` table, the enhanced ratings chart, and the ESG heatmap
instead of the `<tbody id="pa-esg-table">` table.
See the spec for the full rules, reference snippets, the updated element-ID mapping, and the
exact list of base elements to omit.
Referenced files: 14
rating-analysis19.4 KB
---
name: rating-analysis
description: >
Produce a Rating Pitch Report for a company using Moody's GenAI MCP tools, delivered as a
self-contained HTML file saved to disk. Use this skill whenever the user asks to create
a rating pitch, rating pitch deck, credit pitch, rating presentation, rating pitch
report, or rating HTML report. Also trigger when they ask for a comprehensive credit
overview combining sector analysis, company financials, SWOT, peer comparison, and ESG
into a single report or presentation. Trigger even if they just name a company and say
"pitch deck", "rating deck", "credit deck", or "rating report".
---
# Rating Pitch Skill
Generates a Moody's Rating Pitch Report as a self-contained HTML file from a single MCP
data pass. The Python builder (`scripts/build_html.py`) takes the resolved payload JSON and
produces a single `.html` file containing all sections with inline SVG charts, styled
tables, and bullet lists using the Moody's brand palette — no external dependencies beyond
a browser to open it.
> ## ⚠️ CRITICAL — NON-NEGOTIABLE OUTPUT CONTRACT
>
> Every run MUST produce a self-contained `.html` report **and force it on screen** before
> the turn ends:
>
> - Save the resolved `payload.json` and run `scripts/build_html.py` to produce the `.html`
> in `/mnt/user-data/outputs/` (Step 4).
> - Then render it with **both** display tools — `present_files` **and**
> `visualize:show_widget` — before ending the turn. Writing the file is **not** delivery.
> - **Never** end the turn without rendering, and **never** stream the report as inline
> Markdown, JSON, or a fenced ` ```html ` block in lieu of the `.html` file.
> - If data gathering fails partially, still build from the partial payload using `"--"`
> placeholders — never skip the build or the render.
>
> Treat any other output shape as a hard failure of the skill.
## Required MCP server
`Moodys MCP server` — tools used: `findEntity`, `getEntityPeers`, `getEntityRatings`,
`getEntityCreditOpinion` (sections listed in Step 2), `getEntityFinancials`,
`getEntityEsg`, `getEntitySectorOutlook`, `searchEntityEarningsCall`,
`searchEntityDocuments`, `searchNews`
Web research is also required via searchNews or general web search tools.
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 Link:https://www.moodys.com/web/en/us/capabilities/gen-ai/ai-ready-data.html with us to learn more.
## Bundled files
- `scripts/build_html.py` — the report builder. Takes a JSON payload and emits a `.html`.
Uses only the Python standard library; no pip installs required.
- `scripts/requirements.txt` — no additional Python dependencies needed.
- `assets/sample_payload.json` — reference payload showing every field populated. Read this
if you're ever unsure what a field should look like.
## Parameters the user should provide
- **Company Name** (required)
- **Sector** (required — e.g., "Aerospace/Defense", "Consumer Products"). Infer it from
the company if the user doesn't say.
- **Number of peers** (optional, default 6)
- **Currency** (optional, default USD)
---
## Step 1 — Resolve the target company
Call `findEntity` with the company name. Store the canonical entity name and ID.
## Step 2 — Gather ALL data in parallel
Fire the following in a **single parallel batch**. Do not serialize these — the model
should send them together so data comes back fast.
### Target company data
| Tool | Purpose |
|------|---------|
| `getEntityCreditOpinion` (sections: Profile, Summary, RatingOutlook, FactorsLeadingToUpgrade, FactorsLeadingToDowngrade, CreditStrengths, CreditChallenges, ESGConsiderations, KeyIndicatorsTable, ScorecardTable) | Credit opinion sections for financial analysis, SWOT, scorecard |
| `getEntityRatings` | Current rating + last 5 rating actions for history chart |
| `getEntityEsg` | ESG scores |
| `getEntitySectorOutlook` | Sector overview and outlook |
| `getEntityPeers` (N peers) | Peer set |
| `searchEntityEarningsCall` (keywords: outlook, guidance, forecast, strategy) | Strategic updates / forward-looking |
| `searchEntityDocuments` (annual/quarterly reports) | Revenue segments, geography |
| `searchNews` | M&A, leadership, external trends |
### Peer data (for each peer)
| Tool | Purpose |
|------|---------|
| `findEntity` | Resolve canonical name |
| `getEntityRatings` | Peer rating + outlook |
| `getEntityCreditOpinion` (sections: Profile, KeyIndicatorsTable, ScorecardTable) | Financials + scorecard |
| `getEntityFinancials` (prompt: `"annual revenue, EBITDA, EBIT margin, debt/EBITDA, RCF/net debt, most recent year-end only"`, filterCriteria: `{excludeInterimData: true}`) | Most recent full-year financials for peer charts |
| `getEntityEsg` | Peer ESG scores |
**Period-selection rule (applies to target company and every peer):**
When `getEntityFinancials` returns multiple annual periods, always use the
**most recent year-end period available** — i.e. the column with the highest
calendar or fiscal year. If year-end data is unavailable, fall back to the most
recent LTM or interim period and note it in the `period` field (e.g. `"LTM Mar 2025"`).
Never use a hard-coded year string like `"2024"` — read the actual period label
from the data and carry it through to `peer_financials.rows[].period` and
`peer_profitability_charts` / `peer_debt_charts` entries.
---
## Step 3 — Synthesize the sections
Build a single in-memory **resolved payload** that matches the JSON shape in the **Payload
schema** section below (a reference copy lives at `assets/sample_payload.json`). This
payload drives the .html build (Step 4) — fill it completely before moving on.
Content rules for each section:
> **`commentary` type rule — applies to every section without exception:**
> All `commentary` fields in the payload MUST be a **JSON array of strings** — never a
> bare string. A bare string passed to the .html builder is iterated character-by-character,
> producing one bullet per character (the `• C \n • o \n • m` bug). Always write:
> `"commentary": ["Sentence one.", "Sentence two."]` — even for a single sentence.
### Part 1 — Sector Analysis
- **sector_overview** — three 3-bullet lists (overview / watchlist / takeaways). Keep
bullets punchy, ≤25 words each.
- **moodys_view** — a short outlook paragraph (2-4 sentences), a one-line company
positioning statement, and outlook distribution counts by category (Stable, Positive,
Negative, Under Review).
- **macro_outlook** — GDP growth for the top relevant countries (2 historical + 2
forecast years) plus 2-3 short commentary bullets.
- **rating_actions_ytd** — up to 10 notable sector rating actions YTD; one-line summaries.
### Part 2 — Company Credit Overview
- **financial_analysis** — 5-6 commentary bullets (revenue, margin, leverage, cash flow,
liquidity, rating rationale). Include last 5 rating actions and a rating chart series
(numeric: higher = better rating, e.g., Aaa=21, Baa3=10, Caa1=4).
**`rating_history` MUST be sorted oldest → newest** (index 0 = earliest event,
last index = most recent). `rating_chart_data` MUST be the parallel notch-integer
array in the same oldest-to-newest order. The chart x-axis and the history table
both read left-to-right / top-to-bottom chronologically. `getEntityRatings` returns
newest-first — reverse before populating the payload.
- **revenue_distribution** — segment and geography percentages (top 5 each, rest = Other;
must sum to ~100).
- **swot** — 3 items per quadrant, 15-25 words each.
- **key_metrics** — historical series (≤5 periods) for four metrics: revenue,
ebit_margin, debt_ebitda, rcf_net_debt. Arrays must match the `periods` array length.
Use `null` (not omission) for missing points.
- **strategic_updates** — `recent` (3-5) and `forward` (3-5, strictly future-looking).
- **news_mna** / **external_trends** — structured list form:
`[{"category": "...", "items": ["...", "..."]}]`. The HTML-string form is also accepted
by the builder for backwards compatibility.
### Part 3 — Company Positioning vs. Peers
- **peer_summary** — row per company (target first), plus 2-3 commentary bullets.
- **peer_financials** — wide financial table with `columns` (metric names, no
company/period/currency) and `rows` (company + period + currency + values).
Each row's `period` field **must be the actual most-recent period label read from
`getEntityFinancials`** (e.g. `"FY2025"`, `"FY2024"`, `"LTM Mar 2025"`). Never
default all rows to the same hard-coded year. Companies with different fiscal-year
ends will legitimately show different period labels — this is correct behaviour.
- **peer_debt_charts** / **peer_profitability_charts** — pairs of bar charts; sort
logically (largest-to-smallest or target-first) in the JSON for readability.
Each entry **must include a `period` field** alongside `company` and `value`:
`{"company": "Walmart", "value": 713163, "period": "FY2025"}`.
The `period` is used as a sub-label on the bar. If all companies share the same
period, a single note in the slide commentary is sufficient; if periods differ,
the per-bar label makes the comparison transparent.
- **peer_scatter** — two scatter series (`margin_vs_leverage`, `fcf_vs_rcf`), each a list
of `{company, x, y}` points. Drop extreme outliers that would distort the axes. Each
company renders as a filled diamond in its own brand colour with the company name in
white bold text centred inside; there is no separate legend.
- **scorecard** — `factors` (row labels, including group headers), `is_header` boolean
flags per row, `companies` (column headers), and `values` as a 3D array: outer = rows,
middle = columns, inner = `[measure, score]` or `[]` for header rows.
> **SCORECARD CONTRACT — READ CAREFULLY:**
> - `companies` must list **the target company first, followed by peer entities** (e.g.
> `["Boeing", "Airbus", "RTX", "Lockheed Martin"]`). Never put two time-horizons of the
> same company here — that produces a scorecard with no peers. The first entry is the
> target; its LTM scorecard data goes at `values[row][1]`.
> - `values[row]` is **1-indexed against `companies`**: index `0` in every row is always `[]`
> (a silent placeholder the builder skips). `companies[0]` maps to `values[row][1]`,
> `companies[1]` maps to `values[row][2]`, and so on. Omitting the `[]` at index 0 will
> shift every peer column one position and silently misalign the data.
> - Header rows (`is_header=true`) use `values[row] = [[], [], [], ...]` — one `[]` per company
> plus one for the placeholder. Length must equal `len(companies) + 1`.
> - **Quick checklist before writing the scorecard payload:**
> 1. `len(companies)` = number of peer entities (not counting the target).
> 2. Every non-header `values[row]` has length `len(companies) + 1`.
> 3. `values[row][0]` is always `[]`.
> 4. `values[row][i+1]` contains `["metric_value", "ScoreLabel"]` for `companies[i]`.
- **esg_analysis** — table of CIS/E/S/G scores plus 3-5 commentary bullets.
Target first in every peer table.
---
## Step 4 — Build the HTML report
**Output location: always build into `/mnt/user-data/outputs/`** so the display tools can
render the report in Step 5. Use `/mnt/user-data/outputs/` as the `<output-dir>`. Only use a
different path if the user explicitly asks for one.
1. Save your resolved payload to `<output-dir>/payload.json`.
2. No additional Python packages are required — `build_html.py` uses only the standard
library. Verify Python 3 is available:
```bash
python3 --version
```
3. Run the builder, emitting the report to a company-slugged filename in the output dir:
```bash
python3 <skill-dir>/scripts/build_html.py <output-dir>/payload.json <output-dir>/<company-slug>_rating_pitch.html
```
`<company-slug>` is the target company's canonical name lowercased with spaces and
special characters replaced by underscores (e.g. `boeing_company_rating_pitch.html`).
If any section data is missing, still include the section in the payload (empty arrays
are fine) — the builder handles empties gracefully and the deck will stay well-formed.
---
## Step 5 — Output and presentation (required final steps)
> ## ⚠️ CRITICAL — NOT COMPLETE UNTIL THE REPORT IS VISIBLY RENDERED
>
> Building the file is **not** delivery. Render it with every display tool available, in
> order, before saying anything else. Do not end your turn until it is on screen.
Follow this exact sequence. Do not skip a step, reorder, or substitute alternatives:
1. **Confirm the built file.** The `rating_pitch.html` produced by `build_html.py` in Step 4
lives at `/mnt/user-data/outputs/<company-slug>_rating_pitch.html`. This exact path is
what you render — do not re-emit or re-write the HTML inline.
2. **Present the file.** Immediately call `present_files` on that exact path to surface the
artifact to the user.
3. **Show the widget.** Immediately call `visualize:show_widget` on the same file to render
the report visually. Call this even if `present_files` already succeeded — firing both
renderers is what guarantees the report always appears.
4. **Confirm in one short sentence.** Only after the renderers return, add a single brief
sentence in chat (e.g. `Rating Pitch for {Company} — the report is available above as a
self-contained HTML artifact.`). Nothing more.
If a display tool call fails or is unavailable, immediately try the other one rather than
stopping. Never end your turn after building the file, and never paste the HTML into chat or
suggest shell commands (`open`, etc.) in lieu of rendering.
---
## Payload schema
**Read `assets/sample_payload.json` for the full, every-field-populated reference** — copy
its exact shapes. The summary below lists the top-level keys and the non-obvious contracts;
the sample is authoritative for field names and nesting.
Top level: `report_date`, `target_company`, `sector`, `currency`, `companies` (target first),
`sources` (`[{id?, title, source, date, url}]`, rendered as `[n]` citations), and `sections`.
`sections` keys and shapes:
- `sector_overview` — `overview_bullets` / `watchlist_bullets` / `takeaway_bullets` (string arrays).
- `moodys_view` — `outlook_summary` (string), `company_positioning` (string),
`outlook_distribution` (`[{category, count, color}]`).
- `macro_outlook` — `gdp_table.year_columns`, `gdp_table.rows` (`[{country, values[]}]`), `gdp_commentary[]`.
- `rating_actions_ytd` — `[{date, company, summary}]`.
- `financial_analysis` — `commentary[]`, `rating_history` (`[{date, rating, outlook, direction, reason}]`),
`rating_chart_data` (int notch array).
- `revenue_distribution` — `by_segment` / `by_geography` (`[{name, percentage}]`), `commentary[]`.
- `swot` — `strengths` / `weaknesses` / `opportunities` / `threats` (string arrays).
- `key_metrics` — `periods[]`, `revenue[]`, `ebit_margin[]`, `debt_ebitda[]`, `rcf_net_debt[]`
(all same length as `periods`; use `null` for gaps).
- `strategic_updates` — `recent[]`, `forward[]`.
- `news_mna` / `external_trends` — `[{category, items[]}]`.
- `peer_summary` — `table` (`[{company, country, market_cap, rating, outlook, business_mix}]`), `commentary[]`.
- `peer_financials` — `columns[]` (metric names only), `rows` (`[{company, period, currency, values[]}]`).
- `peer_debt_charts` — `rcf_net_debt` / `debt_ebitda` (`[{company, value, period}]`), `commentary[]`.
- `peer_profitability_charts` — `revenue` / `ebit_margin` (`[{company, value, period}]`), `commentary[]`.
- `peer_scatter` — `margin_vs_leverage` / `fcf_vs_rcf` (`[{company, x, y}]`), `commentary[]`.
- `scorecard` — `factors[]`, `is_header[]` (bool per row), `companies[]` (target first),
`values` (3D: outer=rows, middle=columns, inner=`[measure, score]` or `[]`). See the
scorecard contract in Step 3.
- `esg_analysis` — `table` (`[{company, cis, environmental, social, governance}]`), `commentary[]`.
> ⚠️ **`rating_chart_data` constraint:** same length as `rating_history`, index-aligned
> (`rating_history[i] ↔ rating_chart_data[i]`), both sorted **oldest → newest**.
---
## Report structure
The Python builder emits these 26 sections as HTML, in this order:
1. Cover
2. Agenda
3. Part 1 divider
4. Sector Overview (3-column chips)
5. Moody's View (outlook text + positioning + outlook pie)
6. Global Macro Outlook (GDP table + takeaways)
7. Rating Actions YTD (table)
8. Part 2 divider
9. Financial Analysis (bullets + rating history line chart + rating rationale)
10. Revenue Distribution (two pie charts + commentary)
11. SWOT (2×2)
12. Key Financial Metrics (four bar charts in 2×2 grid)
13. Strategic Updates (2 columns)
14. News, M&A & Leadership
15. External Trends, Pressures & Risks
16. Part 3 divider
17. Peer Comparison Summary (table + commentary)
18. Detailed Peer Comparison (wide financial table)
19. Peer Comparison — Debt (two horizontal bar charts)
20. Peer Comparison — Profitability (two horizontal bar charts)
21. Peer Scatter Plots (two scatter charts)
22. Scorecard Comparison (multi-column factor table)
23. ESG Analysis (table + commentary)
24. Citations (appendix — canonical numbered [n] references with hyperlinked titles)
25. Thank You
26. Disclaimer
Chart palette (Moody's official, priority order): `#005eff`, `#5eb6bc`, `#c7ab21`,
`#5c068c`, `#ba0168`, `#c64809`, `#bed6ff`, then `#040826` / `#e1e2e1`.
Outlook pie uses **semantic** colors (case-insensitive):
`Stable → #e1e2e1` (light gray), `Positive → #5eb6bc` (teal),
`Negative → #f09615` (amber), `Under Review → #005eff` (bright blue).
All other multi-series charts consume the palette above in priority order (series 0 first).
Charts are **pure inline SVG** computed in `build_html.py` — no Chart.js, no JS, no external
libraries — because the report renders inside a sandboxed `about:srcdoc` iframe (Teams /
M365 Copilot) that blocks CDN scripts and can't be relied on to run JS. SVG renders
everywhere (srcdoc, PDF, print, email). Entrance animations use CSS `@keyframes` only, so
they stay JS-free and respect `prefers-reduced-motion`. The file is fully self-contained.
---
## Tips
- Run ALL data-gathering tool calls in a single parallel batch.
- Keep the target company first in every peer table.
- `rating_chart_data` is numeric (`Aaa=21 … C=1`); both it and `rating_history` must be
oldest-to-newest. `getEntityRatings` returns newest-first — reverse before use.
- Pie percentages must sum to 100 — bucket small categories into "Other".
- `key_metrics` arrays must match `periods` length. Use `null` for missing points.
- Scorecard: see the full contract in Step 3.
- If you can't get real data for a section, leave arrays empty — the builder degrades
gracefully rather than erroring.
- Dates are just strings; format however reads best (e.g., "Nov 20, 2025").
- Output `.html` filename: lower-cased with spaces/special chars as underscores, in
`/mnt/user-data/outputs/` so the display tools can render it.
- Delivery is not complete until rendered with **both** `present_files` and
`visualize:show_widget` (Step 5). Never paste HTML into chat or suggest `open <path>`.
- Revenue bar labels use `"#,##0"` as `y_format` (comma thousands, zero decimals).
- **Never copy `period` values from `sample_payload.json`** — it uses `"FY2024"` only as a
fixed example. Read each company's actual period label from `getEntityFinancials`;
anchoring on the sample year is a silent data-accuracy bug.
Referenced files: 14
sector-brief16.1 KB
---
name: sector-brief
description: >
Produce a Sector Brief HTML report for any industry sector using Moody's GenAI MCP tools
and web research. Use this skill whenever the user asks to analyze a sector, write a sector
report, do an industry analysis, create a sector overview, or generate a sector deep-dive.
Trigger even if they just name a sector and mention "analysis", "overview", "outlook", "report",
or "deep-dive". Also trigger for phrases like "what's happening in the retail sector" or
"give me a sector breakdown for aerospace".
---
# Sector Brief Skill
Generates a professional HTML report (styled like a Moody's sector brief document) for a
specified industry sector. The report is research-heavy and text-driven, combining Moody's
internal research with supplemental web data across six structured sections plus an executive
summary and citations.
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 actively render it to
the user with **both** `present_files` and `visualize:show_widget`. The rendered HTML artifact
is the deliverable — writing the file without rendering it is a failed run.
> ## ⚠️ CRITICAL — NON-NEGOTIABLE OUTPUT CONTRACT
>
> **The LLM MUST deliver the final report as a single standalone HTML artifact file that it
> then actively renders on screen.** Creating the file is only half the job — a file that is
> written but never surfaced is a failed run, and is the single most common failure mode 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.
> - The LLM **MUST** then render that file with **both** display tools — `present_files`
> **and** `visualize:show_widget` — before ending its turn. Firing both renderers is what
> guarantees the report always appears even if one tool is unavailable.
> - The LLM **MUST NOT** end its turn after `create_file` without having called the display tools.
> - 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 and brief `"Data unavailable"` placeholders for missing sections —
> never skip the artifact or the render step.
>
> Treat any other output shape as a hard failure of the skill.
## Required MCP server
`Moodys MCP server` — tools used: `searchAllDocuments` (sector research), `getEntitySectorOutlook`,
`searchNews`, `findEntity`
Web research is also required via `searchNews` or general web search tools.
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 Link:https://www.moodys.com/web/en/us/capabilities/gen-ai/ai-ready-data.html with us to learn more.
## Bundled files
- `assets/template.html` — pre-styled scaffold with the Moody's cover, a baked-in static 6-item
table of contents, and empty fill-in targets (cover title, date, section-content divs, sources
container). Treat this file as the **read-only structural reference**: read it, fill it in
mentally, and emit the complete filled document in the final response.
## Shared chrome & citations
Before emitting, read [`references/shared-template.md`](references/shared-template.md) (page
chrome: cover, TOC, section block, sources-section wrapper, footer, outlook-badge, design
tokens) and [`references/shared-citations.md`](references/shared-citations.md) (citation
numbering, hyperlinking, source data shape, markup snippets). Both are **authoritative** — do
not invent, duplicate, or restyle anything they already define. The canonical CSS is already
inlined in `assets/template.html` between the `/* BEGIN/END shared-template-css */` and
`/* BEGIN/END shared-citations-css */` markers; never re-copy it at emit time.
The rest of this section is the skill-specific binding.
This skill uses the **`cover-simple`** variant. Skill-specific overrides retained above the
marker region: **none** for SA (it inherits the canonical `body { font-size: 13px }` and
`.page { max-width: 900px }` defaults). SA is the lightest of the four parent skills — almost
all its visual chrome now lives in the shared layer. Any outlook-badge usage in this skill
(e.g. for sector outlook indicators) must use the canonical pastel variants
(`stable` / `positive` / `negative` / `review` / `na`) defined by the shared skill — no
solid-fill or inline-color overrides.
The prefix used for the end-of-document container in this skill is `sa`, so the container id
is `#sa-sources`. This skill does not use the optional per-section `.section-citations` recap
component.
## Parameters
The user should provide:
- **Sector** (required — e.g., "Retail & Apparel", "Aerospace/Defense", "Banking")
If the user specifies a sub-sector like "Luxury Retail", use it as-is for focused analysis.
---
## Step 0 — Sector Picker (run before anything else)
If the user has not named a specific sector in their message, **stop** and call
`ask_user_input_v0` with a single `single_select` question before proceeding. Do **not**
begin any research or template reading until the sector is confirmed.
**Preamble:** "Which Moody's-covered sector would you like to analyze? Select one below
and I'll generate the full report."
**Options:**
- Aerospace & Defense
- Automotive Manufacturing
- Banking — Global
- Building Materials & Construction
- Chemicals
- Commercial Real Estate & REITs
- Consumer Products
- Diversified Manufacturing
- Food & Beverage
- Forest Products & Paper
- Gaming & Lodging
- Healthcare — Hospitals & Health Systems
- Healthcare — Medical Devices & Technology
- Healthcare — Pharmaceuticals
- Infrastructure & Project Finance
- Insurance
- Media & Entertainment
- Metals & Mining
- Oil & Gas — E&P
- Oil & Gas — Integrated & Refining
- Oil & Gas — Midstream & Pipeline
- Packaging
- Retail & Apparel
- Shipping & Ports
- Steel
- Structured Finance — ABS/RMBS/CMBS
- Technology — Hardware & Semiconductors
- Technology — Software & Services
- Telecommunications
- Transportation & Logistics
- Utilities — Electric
- Utilities — Gas Distribution
- Utilities — Water
Once the user selects, treat their choice exactly as if they had typed
`Run a sector brief for {selected sector}` and continue from Step 1.
If the user already named a sector, **skip this step entirely** and go straight to Step 1.
---
## Step 1 — Read the template
Read `assets/template.html` (relative to this skill directory) once. Keep its exact structure —
CSS, `<head>`, cover, hardcoded TOC, section order, and element IDs — as the scaffold for the
final artifact. Do **not** copy it to the workspace and do **not** open it.
---
## Step 2 — Research phase (parallel)
Fire ALL of the following searches in a **single parallel batch**:
### Moody's internal research (via MCP)
| Search | Purpose |
|--------|---------|
| `searchAllDocuments` with criteria: "{Sector} Sector Overview" | Sector definition, methodology, key activities |
| `searchAllDocuments` with criteria: "Economic factors impact on {Sector} Sector" | Macro-economic context |
| `searchAllDocuments` with criteria: "{Sector} Sector, industry" | Financial performance data |
| `searchAllDocuments` with criteria: "{Sector} Sector Risk and challenges" | Risk analysis |
| `searchAllDocuments` with criteria: "{Sector} sector Outlook" | Sector outlook |
| `getEntitySectorOutlook` for a major company in the sector | Formal Moody's outlook |
### Web research (via searchNews or web tools)
| Search | Purpose |
|--------|---------|
| "Key players from {Sector} industry, market share, roles" | Key players for overview |
| "Key regions of activity and growth markets for {Sector} sector" | Geographic scope |
| "{Sector} sector aggregate revenue, profit margins, return on equity" | Financial metrics |
| "Major companies from {Sector} sector benchmark comparison" | Industry structure and dynamics |
---
## Step 3 — Synthesize all sections
Use Moody's internal research as the **primary foundation** for every section. Web sources
serve only to supplement gaps or validate findings. When conflicts arise, prioritize Moody's
unless external data provides substantial evidence for reconsideration.
Write in professional credit-research language. Always attribute sources with numbered citation
references inline. The exact inline markup, the URL-less fallback, and the rule that `n`
matches the row position of the source inside `#sa-sources` are defined in
[references/shared-citations.md](references/shared-citations.md).
Author the Executive Summary and Sections 1–6 per the per-section content specs in
[`references/report-spec.md`](references/report-spec.md) (see `## Section content specs`).
Each section's required subsections — and the inline SVG charts that attach to Sections 3, 4,
and 6 — are defined there. Populate the `#sa-*` content targets listed in Step 4.
### Sources
Collect all sources. The source data shape (`id`, `title`, `source`, `date`, `url`) and the
end-of-document Citations row markup are defined in
[references/shared-citations.md](references/shared-citations.md).
---
## Inline SVG Charts — Section Instructions
This report embeds three inline SVG charts (Chart A in Section 3, Chart C in Section 4,
Chart D in Section 6). Before emitting them, read
[`references/report-spec.md`](references/report-spec.md) for each chart's type, axes,
colors, `viewBox`, placement, and the **mandatory pre-computation requirement** (compute
every coordinate programmatically with bash/Python — never mentally). If source data for a
chart is unavailable, emit a `<p>Chart data unavailable</p>` placeholder rather than
omitting it silently.
---
## Step 4 — Assemble the complete HTML artifact
After all sections are synthesized, 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/`. The full required delivery sequence (`create_file` → `present_files`
→ `visualize:show_widget` → one short sentence) is specified in the **Output and presentation**
section below; follow it exactly.
The HTML file **must**:
- Be written in a single `create_file` call (no progressive `StrReplace` edits, no multi-file
split).
- Contain a complete, standalone HTML document (doctype → `</html>`) that renders without
external dependencies.
- Preserve the template's `<head>` (CSS, fonts), cover, hardcoded TOC, section order, and
element IDs exactly. Only the empty targets defined below are populated.
### Cover + footer
1. `#sa-cover-title` — `<strong>{Sector}</strong><br>Analysis` (HTML, not plain text).
2. `#sa-date` — report date string, e.g. `April 15, 2026`.
3. `#sa-footer-date` — same date string.
### Section headings
4. `#sa-overview-title` — override the default "Sector Overview" with
`{Sector} — Sector Overview`.
### Section content targets
Each of the following divs takes fully-authored HTML (`<p>`, `<ul><li>`, and
`<strong class="subsection-title">…</strong>` only — no other block tags):
5. `#sa-exec` — Executive Summary. Flowing paragraphs only, no bullets.
6. `#sa-overview` — Section 1 body with four `<strong class="subsection-title">` subheaders.
7. `#sa-macro` — Section 2 body with three subheaders.
8. `#sa-financial` — Section 3 body with three subheaders. Every metric must include a
concrete number.
9. `#sa-structure` — Section 4 body with four subheaders. Porter's Five Forces must use
High / Moderate / Low ratings per force.
10. `#sa-risks` — Section 5 body with five subheaders.
11. `#sa-outlook` — Section 6 body. Lead with the Moody's outlook (Positive / Stable /
Negative) and date, then 2–3 paragraphs. Paragraph form only.
### Sources container
12. `#sa-sources` — end-of-document Citations rows. One `<div class="source-item">` per
source, in ascending `id` order, using the canonical row markup defined in
[references/shared-citations.md](references/shared-citations.md). Apply that file's rules
for URL-less rows and missing `source`/`date` fields.
### HTML conventions
- Use `<p>` for paragraphs.
- Use `<ul><li>…</li></ul>` for bullet points (nested `<ul>` for sub-bullets).
- Use `<strong class="subsection-title">Subheader</strong>` for subsection headers within
each section. Do not repeat the top-level section title — the template already renders it.
- Emit inline citations per
[references/shared-citations.md](references/shared-citations.md).
- Escape any `&`, `<`, `>` that appear in the narrative (`&`, `<`, `>`).
---
## Tips
- Run ALL research searches in a single parallel batch.
- Moody's data is the foundation — web data supplements. Make this hierarchy clear in the
writing by attributing external sources explicitly.
- The executive summary should be written last, after all other sections are synthesized.
- Financial Performance must include actual numbers, not just directional statements.
- Porter's Five Forces in Industry Structure should use ratings (High, Moderate, Low) for
each force.
- Sector Outlook must be in paragraph form only — no bullet points.
- Citations follow the shared citations skill — read
[references/shared-citations.md](references/shared-citations.md) before authoring any `[n]`
reference or the Citations block.
---
## Negative number formatting
Unify ALL negative numbers across narrative, tables, and any JSON/HTML string values to use
the parenthesis-minus convention `(-X)`. Examples: `(-9%)`, `(-1.2pp)`, `(-$3.4B)`,
`(-250 bps)`. Do NOT use a bare leading minus (`-9%`), en-dash (`–9%`), or accounting
parentheses without the minus sign (`(9%)`). Apply this consistently to growth rates, margin
changes, YoY deltas, and any negative monetary values.
---
## Output and presentation (required final steps)
> ## ⚠️ CRITICAL — THE SKILL IS NOT COMPLETE UNTIL THE REPORT IS VISIBLY RENDERED
>
> Writing the file is **not** delivery. After you write the HTML you **must** actively render
> it with every display tool available, in order, before you say anything else. Do not end
> your turn until the rendered report is on screen.
Follow this exact sequence. Do not skip a step, reorder, or substitute alternatives. When
updating this skill, do not delete or modify any other file in the `skills/sector-brief/`
folder.
1. **Write the HTML file in a single call.** Call `create_file` to write the entire standalone
HTML document (`<!doctype html>` → `</html>`) to
`/mnt/user-data/outputs/{sector_slug}_sector_analysis.html` in **one** call. `{sector_slug}`
is the lowercased, hyphenated sector name (e.g. `retail-apparel`, `oil-gas`). No progressive
edits, no multi-file split.
2. **Present the file.** Immediately call `present_files` on that exact path to surface the
artifact to the user.
3. **Show the widget.** Immediately call `visualize:show_widget` on the same file to render the
report visually. Call this even if `present_files` already succeeded — firing both renderers
is what guarantees the report always appears.
4. **Confirm in one short sentence.** Only after the renderers return, add a single brief
sentence in chat (e.g. `Sector Brief for {Sector} — the report is available above as a
self-contained HTML artifact.`). Nothing more.
If a display tool call fails or is unavailable, immediately try the other one rather than
stopping. Never end your turn at step 1.
**Strict prohibitions:**
- **Never** emit the HTML as a fenced ` ```html ` code block in the chat response.
- **Never** inline the HTML, JSON payload, or large excerpts of the report body in the chat
message.
- **Never** end your turn after `create_file` without having called both display tools.
Referenced files: 14
Package details
Publisher declarations from the archived package. These are separate from our research and the live service's terms.
- Package author
- Moody's
Package observed Oct 2, 2026.
Technical details
- First seen
- Sep 30, 2026 · 22:02 UTC
- Last seen
- Oct 2, 2026 · 06:00 UTC
- Collection status
- Collected
plugin_asdk_app_6a215179debc8191a28dd0f3723c0646
Download plugin data (JSON)