mcpField
I
intent-signal-aggregator-skill

intent-signal-aggregator-skill

github.com/scientiacapitalMarketing & growth2836 installsUpdated 3w ago
Repository

About intent-signal-aggregator-skill

A skill that ranks target accounts by buying-intent signals from Apollo and Epiphan CRM activity. It gates accounts before signal collection and delivers a Slack digest plus handoff data for follow-up skills.

Key features

  1. 01Resolve account lists and domains
  2. 02Qualify accounts before signal collection
  3. 03Gather hiring, funding, growth, and leadership signals
  4. 04Include first-party engagement and tech-stack data
  5. 05Score and rank accounts with signal decay
  6. 06Deliver Slack digest and hot-account handoff JSON

Use cases

  1. 01Find accounts showing recent buying signals
  2. 02Prioritize outreach by account intent score
  3. 03Monitor hiring or leadership changes at target accounts
  4. 04Pass hot-account details to dialing and contact research workflows

MCP support

Uses MCP tools for account qualification, Apollo organization and people signals, and Epiphan CRM activity. Results can be delivered through Slack and a handoff JSON file; outreach copy is drafted only after checks.

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/scientiacapital/skills --skill intent-signal-aggregator-skill

After installing, type/intent-signal-aggregator-skillin Claude Code to confirm it loaded.

Bundled filesconfig.json

Details

From the project README

Intent Signal Aggregator

Turn a target-account list into a ranked intent feed where every signal is a tool result: Apollo job postings and organization enrichment for hiring, funding, growth, and leadership changes; Epiphan CRM activity for first-party engagement. Accounts are gated through `qualify_lead` before they can be hot, scored 0-100, and delivered as a Slack digest plus a handoff file for sdr-dial-lists and contact-hunter. Timing is the product: same prospect, different week, different outcome. Keywords: `intent signals`, `buying signals`, `hot accounts`, `job postings`, `funding`, `in-market`

<quick_start> Trigger: "track intent signals for [account list / vertical]" or "which accounts are showing buying signals this week?"

Tool order:

  1. Account list — from the request, a HubSpot list (hubspot_search_lists + hubspot_list_members), or execute_sql over hubspot_companies for the vertical. Resolve domains.
  2. Gate Q — qualify_lead per account before any signal pull (no credits on excluded accounts). Verdict decides exclude / STALE AE LEAD / net-new.
  3. Signals, per surviving domain:
    • apollo_organizations_job_postings → open roles; match titles/descriptions against the AV/video keyword list below.
    • apollo_organizations_enrich → funding events, estimated_num_employees trend, leadership (current_technologies, latest_funding_stage, founded_year).
    • apollo_mixed_people_api_search with ATL titles + the domain, apollo_people_bulk_match for tenure → new executive < 90 days.
    • First-party: activity_get_timeline on known contacts and analytics_search_by_email for product-page / pricing / demo activity.
    • Optional Clay track-event for funding/news when configured.
  4. Score (table below), rank, write the digest.
  5. Deliver: Slack DM to Tim with the digest; handoff JSON to ~/.claude/skill-state/intent-signal-aggregator/<date>-hot.json for sdr-dial-lists / contact-hunter; any outreach copy goes through Gate B then create_draft. </quick_start>

<house_rules> Customer-facing skill. Before output, run the gates in order (details: ~/.claude/skills/epiphan-house-rules-skill/reference/gates.md): S: search_product_catalog (Epiphan AI) or Epiphan Knowledge search before any product claim. B: check_my_copy on every customer-facing string. Q: qualify_lead right after the candidate pull, before tiering/enrichment/drafts. D: outbound text becomes a Gmail draft, never a send. Identifiers (owner IDs, portal, emails, seats) come from reference/identifiers.md in that skill — do not restate them here. On any gate failure follow reference/self-healing.md (retry, degrade with a flag, alert Tim, halt) and append a line to ~/.claude/skill-runs/.jsonl. </house_rules>

<success_criteria>

  • Every account passed through qualify_lead before signal pulls; exclusions and STALE AE LEAD counted
  • Every signal cites its source call and date (job posting id, funding event, timeline event); nothing narrated
  • Each account has an intent score 0-100 with the per-signal contribution visible
  • Per-source degradation reported (which source was empty/failed) rather than silently skipped
  • Digest delivered as Slack DM; hot-account handoff JSON written
  • Recommended action per hot account names the contact tier (from qualify_lead) and the next skill
  • Outcome sidecar and run-log line written </success_criteria>

Stage 1 — Account list and Gate Q

Resolve the list to HubSpot company ids and domains. Run qualify_lead on each; Golden Rules, the AE 90-day rule, suppression, and geo default (USA/Canada) are evaluated inside that call — see epiphan-house-rules-skill reference/gates.md and reference/identifiers.md, do not restate owner IDs here. Excluded accounts are dropped before any Apollo credit is spent. qualify_lead unavailable → halt.

Stage 2 — Signal sources (all live)

SignalToolWhat counts
Hiring (relevant)apollo_organizations_job_postingsTitles/descriptions matching: AV, audiovisual, media services, lecture capture, video production, streaming, classroom technology, instructional technology, courtroom technology, broadcast engineer
Hiring (volume)same≥ 3 open roles in IT / facilities / media departments
Fundingapollo_organizations_enrichlatest_funding_stage / funding event ≤ 90 days; for public institutions, bond or capital-project news via Clay track-event when configured
Headcount growthapollo_organizations_enrichemployee estimate up ≥ 10% vs the stored prior value in skill-state
Leadership changeapollo_mixed_people_api_search + apollo_people_bulk_matchATL title with role start ≤ 90 days
Tech stackapollo_organizations_enrich current_technologiesPanopto, Kaltura, Echo360, YuJa, Zoom Rooms, Crestron, Extron present or newly added
First-party engagementactivity_get_timeline, analytics_search_by_emailpricing/demo page views, form fills, email replies in the last 30 days

Each source is retried once on a transient error, then degraded: empty or failed source → that signal scores 0, the account is flagged partial:<source>, and the run continues.

Stage 3 — Scoring

SignalPointsDecay
Relevant job posting25 (first) + 5 each additional, cap 35halves after 30 days
New ATL executive25halves after 60 days
Funding / capital event15halves after 90 days
First-party engagement15halves after 14 days
Headcount growth5per quarter
Tech stack match5static

Cap 100. Hot ≥ 60 (act this week) · Warm 35-59 (act within 2 weeks) · Watch < 35.

Stage 4 — Output

# Intent Signal Report — [date range]
Accounts in: [n] · excluded by Gate Q: [n] · stale AE surfaced: [n] · scored: [n] · hot: [n] · warm: [n]
Sources degraded: [none | job_postings for 3 accounts | …]

## HOT
### #1 [Company] — [vertical] — score [n]/100
1. Hiring: [n] relevant roles — "[title]" posted [date] (job posting id) — mentions [keyword]
2. Leadership: [Name], [Title], started [date] (Apollo id) — tier [ATL] per qualify_lead
3. First-party: [contact] viewed pricing [date] (timeline event)
Action: [call this week via sdr-dial-lists | contact-hunter for the new exec] — contact tier [ATL/GRAY]
Opener (draft id [Gmail id] after check_my_copy): "[one line]"

## WARM … ## WATCH …
## STALE AE LEADS — Tim decides
[Company] — owner [AE] — last activity [date] — score [n]

Signal win-rate tables are not emitted unless computed from ~/.claude/skill-analytics/outcomes.jsonl; no illustrative percentages in the report.

Stage 5 — Delivery and handoff

  1. Slack DM to Tim: the HOT block plus counts, with the path to the full report saved at ~/.claude/skill-state/intent-signal-aggregator/<date>.md.
  2. Handoff JSON ~/.claude/skill-state/intent-signal-aggregator/<date>-hot.json: [{company_id, domain, score, signals[], recommended_skill, contact_tier}] consumed by sdr-dial-lists and contact-hunter-skill.
  3. Openers: get_writing_style once, check_my_copy per line, create_draft for hot accounts with a verified contact. Never send.
  4. Persist the headcount snapshot per domain in skill-state for the next run's growth comparison.

Stage 6 — Emit outcome sidecar + run log

Write ~/.claude/skill-analytics/last-outcome-intent-signal-aggregator-skill.json:

{"ts":"[UTC ISO8601]","skill":"intent-signal-aggregator-skill","version":"<frontmatter version>","variant":"default",
 "status":"[success|partial|error]","runtime_ms":[estimated ms from start],
 "metrics":{"accounts_in":[n],"excluded_by_qualify":[n],"stale_ae_surfaced":[n],"accounts_scanned":[n],"signals_detected":[n],"hot_accounts":[n],
 "signal_types":{"hiring":[n],"funding":[n],"leadership":[n],"tech_stack":[n],"engagement":[n]},"sources_degraded":["job_postings"]},
 "error":null,"session_id":"[YYYY-MM-DD]"}

status partial must name the degraded source(s) in error. Append one line to ~/.claude/skill-runs/intent-signal-aggregator-skill.jsonl.

<self_healing> partial = a ranking was produced but a source degraded: job postings or enrichment empty/failed after retry (signal scored 0, account flagged partial:<source>), Slack DM failed (report path returned in chat), create_draft failed (opener in chat). error = no account list resolvable, Apollo entirely unavailable, or qualify_lead unavailable (halt: never mark an account hot that Gate Q has not seen). Ladder per ~/.claude/skills/epiphan-house-rules-skill/reference/self-healing.md: retry once → degrade with a flag → Slack DM Tim → halt with state in ~/.claude/skill-state/intent-signal-aggregator/. </self_healing>

<anti_patterns>

  • Writing "Posted 5 job listings" without a job-posting result to cite.
  • Restating owner IDs or Golden Rules inline; qualify_lead owns the verdict.
  • Emitting win-rate benchmarks that were never measured.
  • Marking an account hot on a single stale signal; apply the decay. </anti_patterns>

<reference_guides>

  • ~/.claude/skills/epiphan-house-rules-skill/reference/gates.md — Gate Q verdicts, suppression, geo default
  • ~/.claude/skills/epiphan-house-rules-skill/reference/identifiers.md — owner IDs, portal, emails (never restate here)
  • Siblings: linkedin-sales-navigator-alt-skill (people who changed roles), lookalike-customer-finder-skill (who to monitor), sdr-dial-lists / contact-hunter-skill (act on hot accounts) </reference_guides>

Comments

Markdown supported