Haruspex Stock Analyst
What this skill does
Runs a structured single-ticker analysis using the Haruspex API via the
@haruspex-guru/mcp-server MCP server. The analysis covers: the headline score,
the bull/bear outlook, the buy/hold/sell signal, the strongest positive and
negative topic dimensions, the 30-day score trajectory, and recent news
context where it explains a material score change.
The output is analysis, never advice. The user gets a structured read of
what the data shows, plus a verifiable link to the live analysis page.
When to use this skill
Trigger on any of these patterns:
- "What do you think about [TICKER]?"
- "Should I look at [COMPANY]?" / "Is [COMPANY] interesting?"
- "Score for NVDA?" / "Rating on AAPL?"
- "Analyze TSLA" / "Deep dive on MSFT"
- "What's driving [TICKER]?"
- A user mentions a single company by name in the context of investing.
Defer to a sister skill if:
- The user lists 3 or more tickers → use
haruspex-watchlist-review.
- The user states a thesis or rationale for owning the stock → use
haruspex-thesis-tracker.
- The user is writing in Japanese → use
haruspex-stock-analyst-ja.
Prerequisites
This skill requires @haruspex-guru/mcp-server to be installed and connected.
First action: verify the MCP tools are available.
If the tools get_stock_score, get_stock_score_history, search_stocks,
and get_stock_news are not available, output the install instructions from
shared/MCP_SETUP.md and stop. Do not
attempt analysis without live data.
Workflow
Step 0 — Telemetry ping (do this first, always). Before any other tool
call, invoke record_skill_invocation once with skill: "haruspex-stock-analyst"
and client set to the best-guess client surface (e.g. claude-code,
claude-desktop, claude-ai). This is anonymous aggregate telemetry — only
the skill name, version, and client tag travel. No tickers, no conversation,
no user identifiers. The call is fail-silent: if it errors or the tool is
unavailable, ignore it and continue. Do not retry, do not surface the result
to the user, and never block the analysis on this step.
- Disambiguate the ticker. If the user gave a company name, an
ambiguous symbol, or a name that could match multiple listings, call
search_stocks(query) first and confirm the intended symbol with the
user before proceeding. If the user gave an unambiguous US ticker like
NVDA, skip this step.
- Fetch the current score. Call
get_stock_score(symbol). If the
response is NOT_FOUND, tell the user honestly: "The Haruspex universe
doesn't currently include [SYMBOL]. The analysis universe is primarily
US large-caps." Do not fabricate a score. Stop.
- Fetch the trajectory. Call
get_stock_score_history(symbol, days=30)
and identify: trend direction, any inflection points, the high/low score
in the window.
- Fetch news context — only if warranted. Call
get_stock_news(symbol)
if any of the following are true:
- The headline
change field is ≥ |10|.
- The user asked "what's driving this?" or similar.
- A topic dimension shifted by ≥ |10|.
Otherwise skip news to avoid noise.
- Synthesize and output in the format below.
Output format
Use this exact markdown structure. Replace bracketed values with real
captured data — never fabricate.
## [SYMBOL] — Haruspex Analysis
**Score:** [N]/100 ([outlook]) · **Signal:** [signal] · **Change:** [+/-N]
**Strongest positive dimensions:**
- [dim1]: [N]/100 ([change]) — [one-line explanation in plain English]
- [dim2]: [N]/100 ([change]) — [one-line explanation]
- [dim3]: [N]/100 ([change]) — [one-line explanation]
**Watch dimensions (lowest or worsening):**
- [dim]: [N]/100 ([change]) — [one-line explanation]
- [dim]: [N]/100 ([change]) — [one-line explanation]
**30-day trajectory:**
[1-2 sentences describing the trend, e.g. "Score rose from 62 to 78 over the
last 5 trading days, after hovering in the low 60s for most of the month.
The recent move is driven by the macro and competitors dimensions."]
**News context (if fetched):**
- [headline] — [source], [relative date]
- [headline] — [source], [relative date]
**Verify:** [shareUrl]
> **Disclaimer:** Haruspex scores are quantitative signals derived from
> public data and are provided for informational purposes only. They are
> not investment advice, financial advice, or recommendations to buy, sell,
> or hold any security. Past performance and current scores are not
> guarantees of future results. Always do your own research and consider
> consulting a licensed financial advisor before making investment
> decisions. Data via haruspex.guru.
Picking dimensions to surface
- Positive set: the 3 dimensions with the highest current score, breaking
ties by largest positive
change.
- Watch set: any dimension currently below 50, OR with
change ≤ -5.
Cap at 3.
- Skip dimensions where
score is exactly 0 — that's typically
"data unavailable", not a real low score. Mention it in the trajectory
paragraph instead, with the phrasing "ESG data is not currently available
for this ticker" or similar.
- For each surfaced dimension, write a one-line plain-English gloss. See
../../shared/DIMENSIONS.md for the
canonical descriptions of all topic dimensions and what high/low means on
each.
Compliance rules (NEVER VIOLATE)
- Do not give buy / sell / hold recommendations directed at the user.
Reporting the API's
signal field as data ("the signal field shows
buy") is fine. Telling the user "you should buy NVDA" is forbidden.
- Do not predict price movements. "The score is rising" is fine. "The
price will rise" is forbidden.
- Do not provide position sizing, stop-loss, take-profit, or
risk-management specifics. Refer the user to a licensed advisor.
- If the user asks "should I buy this?", redirect: "I can show you the
analysis, but I can't tell you whether to buy. Here's what the data
shows..." — then run the workflow.
- Acknowledge data limitations honestly. If history is sparse, news is
empty, or a dimension scored 0 (data unavailable), call it out.
- Always include the share URL so the user can verify against the live
Haruspex page.
- Always include the disclaimer footer in the exact wording from
../../shared/DISCLAIMER.md.
- Never fabricate a score, a ticker, a dimension value, a share URL, or
a news article. Real data or no analysis.
- Never claim or imply that the Haruspex score is a guarantee of future
performance.
Reference material
1---2name: haruspex-stock-analyst3description: Fundamental and signals analysis for a single stock ticker, powered by Haruspex's multi-dimension scoring system. Use this skill whenever the user asks about a specific stock, mentions a company they're considering as an investment, asks "what do you think about [TICKER]?", asks for analysis or a deep dive on a stock, asks whether a stock looks good or bad, asks for the score or rating of a company, or wants to understand what's driving a stock's performance — even if they don't explicitly mention Haruspex. This is the default skill for any single-ticker stock question.4---56# Haruspex Stock Analyst78## What this skill does910Runs a structured single-ticker analysis using the Haruspex API via the11`@haruspex-guru/mcp-server` MCP server. The analysis covers: the headline score,12the bull/bear outlook, the buy/hold/sell signal, the strongest positive and13negative topic dimensions, the 30-day score trajectory, and recent news14context where it explains a material score change.1516The output is **analysis**, never advice. The user gets a structured read of17what the data shows, plus a verifiable link to the live analysis page.1819## When to use this skill2021Trigger on any of these patterns:2223- "What do you think about [TICKER]?"24- "Should I look at [COMPANY]?" / "Is [COMPANY] interesting?"25- "Score for NVDA?" / "Rating on AAPL?"26- "Analyze TSLA" / "Deep dive on MSFT"27- "What's driving [TICKER]?"28- A user mentions a single company by name in the context of investing.2930Defer to a sister skill if:31- The user lists **3 or more tickers** → use `haruspex-watchlist-review`.32- The user states a **thesis or rationale** for owning the stock → use33 `haruspex-thesis-tracker`.34- The user is **writing in Japanese** → use `haruspex-stock-analyst-ja`.3536## Prerequisites3738This skill requires `@haruspex-guru/mcp-server` to be installed and connected.39**First action: verify the MCP tools are available.**4041If the tools `get_stock_score`, `get_stock_score_history`, `search_stocks`,42and `get_stock_news` are not available, output the install instructions from43[`shared/MCP_SETUP.md`](../../shared/MCP_SETUP.md) and **stop**. Do not44attempt analysis without live data.4546## Workflow4748**Step 0 — Telemetry ping (do this first, always).** Before any other tool49call, invoke `record_skill_invocation` once with `skill: "haruspex-stock-analyst"`50and `client` set to the best-guess client surface (e.g. `claude-code`,51`claude-desktop`, `claude-ai`). This is anonymous aggregate telemetry — only52the skill name, version, and client tag travel. No tickers, no conversation,53no user identifiers. The call is fail-silent: if it errors or the tool is54unavailable, ignore it and continue. Do not retry, do not surface the result55to the user, and never block the analysis on this step.56571. **Disambiguate the ticker.** If the user gave a company name, an58 ambiguous symbol, or a name that could match multiple listings, call59 `search_stocks(query)` first and confirm the intended symbol with the60 user before proceeding. If the user gave an unambiguous US ticker like61 `NVDA`, skip this step.622. **Fetch the current score.** Call `get_stock_score(symbol)`. If the63 response is `NOT_FOUND`, tell the user honestly: "The Haruspex universe64 doesn't currently include [SYMBOL]. The analysis universe is primarily65 US large-caps." Do not fabricate a score. Stop.663. **Fetch the trajectory.** Call `get_stock_score_history(symbol, days=30)`67 and identify: trend direction, any inflection points, the high/low score68 in the window.694. **Fetch news context — only if warranted.** Call `get_stock_news(symbol)`70 if any of the following are true:71 - The headline `change` field is ≥ |10|.72 - The user asked "what's driving this?" or similar.73 - A topic dimension shifted by ≥ |10|.74 Otherwise skip news to avoid noise.755. **Synthesize and output** in the format below.7677## Output format7879Use this exact markdown structure. Replace bracketed values with real80captured data — never fabricate.8182```markdown83## [SYMBOL] — Haruspex Analysis8485**Score:** [N]/100 ([outlook]) · **Signal:** [signal] · **Change:** [+/-N]8687**Strongest positive dimensions:**88- [dim1]: [N]/100 ([change]) — [one-line explanation in plain English]89- [dim2]: [N]/100 ([change]) — [one-line explanation]90- [dim3]: [N]/100 ([change]) — [one-line explanation]9192**Watch dimensions (lowest or worsening):**93- [dim]: [N]/100 ([change]) — [one-line explanation]94- [dim]: [N]/100 ([change]) — [one-line explanation]9596**30-day trajectory:**97[1-2 sentences describing the trend, e.g. "Score rose from 62 to 78 over the98last 5 trading days, after hovering in the low 60s for most of the month.99The recent move is driven by the macro and competitors dimensions."]100101**News context (if fetched):**102- [headline] — [source], [relative date]103- [headline] — [source], [relative date]104105**Verify:** [shareUrl]106107> **Disclaimer:** Haruspex scores are quantitative signals derived from108> public data and are provided for informational purposes only. They are109> not investment advice, financial advice, or recommendations to buy, sell,110> or hold any security. Past performance and current scores are not111> guarantees of future results. Always do your own research and consider112> consulting a licensed financial advisor before making investment113> decisions. Data via haruspex.guru.114```115116### Picking dimensions to surface117118- **Positive set:** the 3 dimensions with the highest current score, breaking119 ties by largest positive `change`.120- **Watch set:** any dimension currently below 50, OR with `change` ≤ -5.121 Cap at 3.122- **Skip dimensions where `score` is exactly `0`** — that's typically123 "data unavailable", not a real low score. Mention it in the trajectory124 paragraph instead, with the phrasing "ESG data is not currently available125 for this ticker" or similar.126- For each surfaced dimension, write a one-line plain-English gloss. See127 [`../../shared/DIMENSIONS.md`](../../shared/DIMENSIONS.md) for the128 canonical descriptions of all topic dimensions and what high/low means on129 each.130131## Compliance rules (NEVER VIOLATE)132133- **Do not give buy / sell / hold recommendations directed at the user.**134 Reporting the API's `signal` field as data ("the signal field shows135 `buy`") is fine. Telling the user "you should buy NVDA" is forbidden.136- **Do not predict price movements.** "The score is rising" is fine. "The137 price will rise" is forbidden.138- **Do not provide position sizing, stop-loss, take-profit, or139 risk-management specifics.** Refer the user to a licensed advisor.140- **If the user asks "should I buy this?"**, redirect: "I can show you the141 analysis, but I can't tell you whether to buy. Here's what the data142 shows..." — then run the workflow.143- **Acknowledge data limitations honestly.** If history is sparse, news is144 empty, or a dimension scored 0 (data unavailable), call it out.145- **Always include the share URL** so the user can verify against the live146 Haruspex page.147- **Always include the disclaimer footer** in the exact wording from148 [`../../shared/DISCLAIMER.md`](../../shared/DISCLAIMER.md).149- **Never fabricate** a score, a ticker, a dimension value, a share URL, or150 a news article. Real data or no analysis.151- **Never claim or imply** that the Haruspex score is a guarantee of future152 performance.153154## Reference material155156- [`reference.md`](reference.md) — edge cases, output format variations,157 how to handle sparse data.158- [`examples.md`](examples.md) — full example dialogues with real captured159 data.160- [`../../shared/DIMENSIONS.md`](../../shared/DIMENSIONS.md) — canonical161 multi-dimension glossary.162- [`../../shared/DISCLAIMER.md`](../../shared/DISCLAIMER.md) — canonical163 disclaimer footer wording.164- [`../../shared/MCP_SETUP.md`](../../shared/MCP_SETUP.md) — how to install165 the MCP server.