Install
openclaw skills install @paudyyin/financial-financial-analysisProvides comprehensive financial modeling and analysis tools including DCF, LBO, comparable company analysis, 3-statement models, competitive analysis, and m...
openclaw skills install @paudyyin/financial-financial-analysisCore financial modeling and analysis tools: DCF, comps, LBO, 3-statement models, competitive analysis, and deck QC
来自 Anthropic 官方 financial-services 仓库的 financial-analysis 插件。 原始仓库: https://github.com/anthropics/financial-services
Load the 3-statement-model skill and populate a 3-statement financial model (Income Statement, Balance Sheet, Cash Flow Statement).
If a file path is provided, use it as the template. Otherwise ask the user for their model template.
Load the competitive-analysis skill and build a competitive landscape analysis for the specified company or industry.
If a company/industry is provided as an argument, use it. Otherwise ask the user what they want to analyze.
Build an institutional-grade comparable company analysis with operating metrics, valuation multiples, and statistical benchmarking.
If a company name or ticker is provided, use it. Otherwise ask:
Use skill: "comps-analysis" to build the analysis:
Clarify the analysis purpose:
Identify peer group (4-6 comparable companies):
Gather data (prioritize MCP sources if available):
Build the analysis:
Generate Excel
Build an institutional-quality DCF model that uses comparable company analysis to inform valuation ranges.
If a company name or ticker is provided, use it. Otherwise ask:
First, load the comps-analysis skill to build trading comps:
Use skill: "comps-analysis" to:
Key outputs to capture from comps:
Load the dcf-model skill to construct the valuation:
Use skill: "dcf-model" to:
Use comps to inform DCF assumptions:
| Comp
Load the audit-xls skill with scope model and audit the specified financial model for broken formulas, balance sheet imbalances, hardcoded overrides, circular references, and logic errors — including the full model-integrity checks (BS balance, cash tie-out, roll-forwards, model-type-specific bugs).
If a file path is provided, use it. Otherwise ask the user for the model to review.
Load the lbo-model skill and build a leveraged buyout model for the specified company or deal.
If a company name is provided as an argument, use it. Otherwise ask the user for the target company and deal parameters.
Create a self-contained PPT template skill from a user-provided PowerPoint template.
Ask for the template file if not provided:
Load the ppt-template-creator skill:
skill: "ppt-template-creator" tool to load the full skill instructionsGather additional info:
Execute the skill workflow:
Deliver the packaged skill to the user
Complete and populate integrated financial model templates with proper linkages between Income Statement, Balance Sheet, and Cash Flow Statement.
Environment — Office JS vs Python:
range.formulas = [["=D14*(1+Assumptions!$B$5)"]] — never range.values for derived cells. No separate recalc; Excel computes natively. Use context.workbook.worksheets.getItem(...) to navigate tabs.ws["D15"] = "=D14*(1+Assumptions!$B$5)", then run recalc.py before delivery..merge() then set .values on the merged range — throws InvalidArgument because the range still reports its pre-merge dimensions. Instead write value to top-left cell alone, then merge + format the full range: ws.getRange("A1").values = [["INCOME STATEMENT"]]; const h = ws.getRange("A1:G1"); h.merge(); h.format.fill.color = "#1F4E79";Formulas over hardcodes (non-negotiable):
ws["D15"] = "=D14*(1+Assumptions!$B$5)"), NOT computed resulAudit formulas and data for accuracy and mistakes. Scope determines depth — from quick formula checks on a selection up to full financial-model integrity audits.
If the user already gave a scope, use it. Otherwise ask them:
What scope do you want me to audit?
- selection — just the currently selected range
- sheet — the current active sheet only
- model — the whole workbook, including financial-model integrity checks (BS balance, cash tie-out, roll-forwards, logic sanity)
The model scope is the deepest — use it for DCF, LBO, 3-statement, merger, comps, or any integrated financial model before sending to a client or IC.
Run these regardless of scope:
| Check | What to look for |
|---|---|
| Formula errors | #REF!, #VALUE!, #N/A, #DIV/0!, #NAME? |
| Hardcodes inside formulas | =A1*1.05 — the 1.05 should be a cell reference |
| Inconsistent formulas | A formula that breaks the pattern of its neighbors in a row/column |
| Off-by-one ranges | SUM/AVERAGE that misses the first or last row |
| Pasted-over formulas | Cell that looks like a formula but is actually a hardcoded value |
| Circular references | Intentional or accidental |
| Broken cross-sheet links | References to cells that moved or were deleted |
| Unit/scale mismatches | Thousands mixed with millions, % stored as whole numbers |
| Hidden rows/tabs | Could contain overrides or stale c |
Clean messy data in the active sheet or a specified range.
Excel.run(async (context) => {...})). Read via range.values, write helper-column formulas via range.formulas = [["=TRIM(A2)"]]. The in-place vs helper-column decision still applies.A1:F200), use it| Issue | What to look for |
|---|---|
| Whitespace | leading/trailing spaces, double spaces |
| Casing | inconsistent casing in categorical columns (usa / USA / Usa) |
| Number-as-text | numeric values stored as text; stray $, ,, % in number cells |
| Dates | mixed formats in the same column (3/8/26, 2026-03-08, March 8 2026) |
| Duplicates | exact-duplicate rows and near-duplicates (case/whitespace differences) |
| Blanks | empty cells in otherwise-populated columns |
| Mixed types | a column that's 98% numbers but has 3 text entries |
| Encoding | mojibake (é, ’), non-printing characters |
| Errors | #REF!, #N/A, #VALUE!, #DIV/0! |
Show a summary table before changing anything:
| Column | Issue | Count | Proposed Fix |
|---|
Build a complete competitive analysis deck. This is a two-phase process: gather requirements and get outline approval first, then build.
This skill works in both the PowerPoint add-in and chat. Identify which you're in before starting — the mechanics differ, the workflow doesn't:
.pptx file (or build into one the user uploaded).Everything below applies in both.
Competitive analysis means different things to different people. Before any research or slide-building, use ask_user_question to pin down what they actually want. Don't guess — a 20-slide peer benchmarking deck and a 5-slide market map are both "competitive analysis" and take completely different shapes.
Gather in one round if you can (the tool takes up to 4 questions):
name: comps-analysis description: | Build institutional-grade comparable company analyses with operating metrics, valuation multiples, and statistical benchmarking in Excel/spreadsheet format.
Perfect for:
Not ideal for:
ALWAYS follow this data source hierarchy:
Why this matters: MCP sources provide verified, institutional-grade data with proper citations. Web search results can be outdated, inaccurate, or unreliable for financial analysis.
This skill teaches Claude to build institutional-grade comparable company analyses that combine operating metrics, valuation multiples, and statistical benchmarking. The output is a structured Excel/spreadsheet that enables informed investment decisions through peer comparison.
Reference Material & Contextualization:
An example comparable company analysis is provided in examples/comps_example.xlsx. When using this or other example f
This skill creates institutional-quality DCF models for equity valuation following investment banking standards. Each analysis produces a detailed Excel model (with sensitivity analysis included at the bottom of the DCF sheet).
These constraints apply throughout all DCF model building. Review before starting:
Environment: Office JS vs Python/openpyxl:
range.formulas = [["=D19*(1+$B$8)"]]. No separate recalc step needed; Excel calculates natively. Use range.format.* for styling. The same formulas-over-hardcodes rule applies: set .formulas, never .values for derived cells.recalc.py before delivery.⚠️ Office JS merged cell pitfall: When building section headers with merged cells, do NOT call .merge() then set .values on the merged range — Office JS st
Update numbers across the deck. The deck is the source of truth for formatting; you're only changing values.
This skill works in both the PowerPoint add-in and chat. Identify which you're in before starting — the edit mechanism differs, the intent doesn't:
Either way: smallest possible change, existing formatting stays intact.
This is a four-phase process and the third phase is an approval gate. Don't edit until the user has seen the plan.
Use ask_user_question to find out how the new numbers are arriving:
Also ask about derived numbers: if revenue moves, does the user want growth rates and share percentages recalculated, or left alone? Most decks have "+15% YoY" baked in somewhere that's now stale. Whether to touch those is a judgment call the user should ma
Perform comprehensive QC on the presentation across four dimensions. Read every slide, then report findings.
This skill works in both the PowerPoint add-in and chat. Identify which you're in before starting:
.pptx file.This is read-and-report only — no edits — so the workflow is identical in both.
Pull text from every slide, keeping track of which slide each line came from. You'll need slide-level attribution for every finding ("$500M appears on slides 3 and 8, but slide 15 shows $485M"). A deck with 30 slides is too much to hold in working memory reliably — write the extracted text to a file so the number-checking script can process it.
The script expects markdown-ish input with slide markers. Format as:
## Slide 1
[slide 1 text content]
## Slide 2
[slide 2 text content]
Run the extraction script on what you collected:
python scripts/extract_numbers.py /tmp/deck_content.md --check
It normalizes units ($500M vs $500MM vs $500,000,000 → same number), categorizes values (revenue, EBITDA, multiples, margins), and flags when the same metric category shows conflicting values on different slides. This is the part most likely to catch something a human missed on the fifth read-through.
Beyond what the script flags, verify:
This skill uses templates for LBO models. Always check for an attached template file first.
Before starting any LBO model:
examples/LBO_Model.xlsx as your starting point and populate it with the user's assumptionsIMPORTANT: When a file like LBO_Model.xlsx is attached, you MUST use it as your template - do not build from scratch. Even if the template seems complex or has more features than needed, copy it and adapt it to the user's requirements. Never decide to "build from scratch" when a template is provided.
If running inside Excel (Office Add-in / Office JS environment):
Excel.run(async (context) => {...})) directly — do NOT use Python/openpyxlrange.formulas = [["=B5*B6"]] — Office JS formulas recalculate natively in the live workbookrange.formulas, never range.values for anything that should be a calculationrange.format.font.color / range.format.fill.color for the blue/black/purple/green conventionThis skill creates SKILLS, not presentations. Use this when a user wants to turn their PowerPoint template into a reusable skill that can generate presentations later. If the user just wants to create a presentation, use the pptx skill instead.
The generated skill includes:
assets/template.pptx - the template fileSKILL.md - complete instructions (no reference to this meta skill needed)For general skill-building best practices, refer to the skill-creator skill. This skill focuses on PPT-specific patterns.
skill-creator skill to set up the skill structureassets/template.pptxskill-creator skill to package into a .skill fileCRITICAL: Extract precise placeholder positions - this determines content area boundaries.
from pptx import Presentation
prs = Presentation(template_path)
print(f"Dimensions: {prs.slide_width/914400:.2f}\" x {prs.slide_height/914400:.2f}\"")
print(f"Layouts: {len(prs.slide_layouts)}")
for idx, layout in enumerate(prs.slide_layouts):
print(f"\n[{idx}] {layout.name}:")
for ph in layout.placeholders:
try:
ph_idx = ph.placeholder_format.idx
ph_type = ph.placeholder_format.type
# IMPORTANT: Extract exact positions in inches
left = ph.left / 914400
---
### pptx-author
---
name: pptx-author
description: Produce a .pptx file on disk (headless) instead of driving a live PowerPoint document — for managed-agent sessions with no open Office app.
---
# pptx-author
Use this skill when running **headless** (managed-agent / CMA mode) and you need to deliver a PowerPoint deck as a **file artifact** rather than editing a live document via `mcp__office__powerpoint_*`.
## Output contract
- Write to `./out/<name>.pptx`. Create `./out/` if it does not exist.
- Return the relative path in your final message so the orchestration layer can collect it.
## How to build the deck
Write a short Python script and run it with Bash. Use `python-pptx`:
```python
from pptx import Presentation
from pptx.util import Inches, Pt
prs = Presentation("./templates/firm-template.pptx") # if a template is provided
# or: prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5]) # title-only
slide.shapes.title.text = "Valuation Summary"
# ... add tables / charts / text boxes ...
prs.save("./out/pitch-<target>.pptx")
pitch-deck skill)./out/model.xlsx, footnote the sheet and cell../templates/; otherwise default layouts.If mcp__office__powerpoint_* tools are available (Cowork plugin mode), use those instead — they drive the user's live document with review checkpoints. This skill is the file-producing fallback for headless runs.
This skill provides guidance for creating effective skills.
Skills are modular, self-contained packages that extend Claude's capabilities by providing specialized knowledge, workflows, and tools. Think of them as "onboarding guides" for specific domains or tasks—they transform Claude from a general-purpose agent into a specialized agent equipped with procedural knowledge that no model can fully possess.
The context window is a public good. Skills share the context window with everything else Claude needs: system prompt, conversation history, other Skills' metadata, and the actual user request.
Default assumption: Claude is already very smart. Only add context Claude doesn't already have. Challenge each piece of information: "Does Claude really need this explanation?" and "Does this paragraph justify its token cost?"
Prefer concise examples over verbose explanations.
Match the level of specificity to the task's fragility and variability:
High freedom (text-based instructions): Use when multiple approaches are valid, decisions depend on context, or heuristics guide the approach.
Medium freedom (pseudocode or scripts with parameters): Use when a preferred pattern exists, some variation is acceptable, o
Use this skill when running headless (managed-agent / CMA mode) and you need to deliver an Excel workbook as a file artifact rather than editing a live workbook via mcp__office__excel_*.
./out/<name>.xlsx. Create ./out/ if it does not exist.Write a short Python script and run it with Bash. Use openpyxl:
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
wb = Workbook()
ws = wb.active; ws.title = "Inputs"
ws["B2"] = "Revenue"; ws["C2"] = 1_250_000_000
ws["C2"].font = Font(color="0000FF") # blue = hardcoded input
calc = wb.create_sheet("DCF")
calc["C5"] = "=Inputs!C2*(1+Inputs!C3)" # black = formula
wb.save("./out/model.xlsx")
audit-xls)If mcp__office__excel_* tools are available (Cowork plugin mode), use those instead — they drive the user's live workbook with review checkpoints. This skill is the file-producing fallback for headless runs.