Weekly product intelligence brief from ClosedLoop AI. Reads ALL evidence behind every spike, deal blocker, churn risk, and competitor mention — then synthesizes into a 40-line brief a CPO can scan in 60 seconds. Use when the user asks for a weekly brief, weekly summary, weekly update, or what happened this week.
Generate a weekly intelligence brief. Reads everything, synthesizes to ~40 lines. Every claim is backed by evidence you actually read.
Try calling get_overview(time_range="all").
If the call fails or the tool is not found:
ClosedLoop AI MCP is not connected.
claude mcp add --transport http closedloop-ai https://mcp.closedloop.sh
Then restart Claude Code, type /mcp, select closedloop-ai, and authorize.
Guide: https://closedloop.sh/docs/mcp-server/overview
Then stop.
Thousands of insights go in. A 40-line brief comes out. The reader never sees the raw inputs — only the judgment, backed by evidence you actually read.
This is NOT a dashboard. It's an intelligence brief. Every line carries a judgment call because you read the underlying data.
The MCP stores all dates in UTC. The user sees local time. The skill must bridge both.
Detect local timezone:
Run: !date +%Z to get the timezone abbreviation (e.g., "EDT", "CET").
Run: !date -u +%Y-%m-%dT%H:%M and !date +%Y-%m-%dT%H:%M — the difference tells you the UTC offset.
Compute date boundaries:
this_week: last 7 days ending today. Example: if today is Tue Mar 25, this week = Mar 19 - Mar 25.last_week: the 7 days before that. Example: Mar 12 - Mar 18.date_from/date_to, send the UTC-adjusted YYYY-MM-DD.When displaying dates to the user:
Agent 1: Numbers
MCP calls:
get_overview(time_range="7d")get_facets(dimensions=["category", "feature_area", "source_type"], date_from="{this_week_start}")get_facets(dimensions=["category", "feature_area", "source_type"], date_from="{last_week_start}", date_to="{last_week_end}")get_competitors()Compute:
Write to /tmp/wb-numbers.md:
Agent 2: Urgent Items
MCP calls:
search_insights(is_deal_blocker=true, date_from="{this_week_start}", limit=20)search_insights(is_churn_risk=true, date_from="{this_week_start}", limit=20)get_insight(id) for EVERY deal blocker and churn risksearch_signals(type="churn_reason", date_from="{this_week_start}", limit=20)get_signal(id) for EVERY churn_reason signalAfter reading all details, write to /tmp/wb-urgent.md:
Agent 3: Spike Investigation
Wait for Agent 1 to identify spikes, OR independently run these (the most common spikes are predictable from the feature areas):
For EACH of the top 5 feature areas this week, search BOTH sources separately:
search_insights(feature_area="{area}", source_type="support", date_from="{this_week_start}", sort="severity", limit=30)search_insights(feature_area="{area}", source_type="calls", date_from="{this_week_start}", sort="severity", limit=30)get_insight(id) for the top 15 by severity from each sourceFor EACH category that spiked >30%, same split:
search_insights(category="{cat}", source_type="support", date_from="{this_week_start}", sort="severity", limit=20)search_insights(category="{cat}", source_type="calls", date_from="{this_week_start}", sort="severity", limit=20)get_insight(id) for the top 10 by severity from each sourceAfter reading all these insights, write to /tmp/wb-spikes.md:
Agent 4: Competitive + Notable Voices
MCP calls:
search_signals(type="competitor_mention", date_from="{this_week_start}", limit=30)get_signal(id) for EVERY competitor mentionsearch_insights(sort="frustration", date_from="{this_week_start}", limit=20)search_signals(type="satisfaction", date_from="{this_week_start}", limit=10)get_signal(id) for satisfaction signalsFor the 2 most compelling quotes found, load the actual conversation for full context:
list_conversations(customer_name="{customer}", source_type="calls", limit=1) — find the callget_conversation(id="{id}", source="{source}") — load the transcriptAfter reading everything, write to /tmp/wb-voices.md:
Read all 4 files. You now have:
Now write the brief. Every line should carry judgment because you read the evidence.
================================================================================
WEEKLY BRIEF {date_range}
================================================================================
{4-6 line executive summary. Written LAST, after you've read everything.
This is the "if you read nothing else" section. State what happened this
week in plain language. Name the biggest risks. Name the biggest changes.
No numbers — just the story.}
NUMBERS
-------
Insights: {n} ({+/-x%}) | Customers: {n} | Blockers: {n} | Churn: {n}
ATTENTION
---------
{Each urgent item gets exactly 2 lines: customer name + what happened.
Grouped by type. Max 5 items — if more exist, pick the most critical.}
{customer} -- {one sentence: what's blocked/broken and the business impact}
{customer} -- {one sentence}
...
WHAT'S DRIVING THE NUMBERS
--------------------------
{This is the section that makes the brief valuable. For each notable
change this week, explain WHY — and separate what's breaking (support)
from what customers are asking for (calls). This distinction is critical:
support = operational health, calls = strategic direction.}
{Area}: {N from support — what's broken}. {N from calls — what they want}.
{Area}: {explanation with source split}
...
VOICES
------
"{One killer quote}" -- {customer}
"{Another quote, different theme}" -- {customer}
COMPETITIVE
-----------
{Only if competitors were mentioned this week. 1-2 lines per competitor.
Omit entirely if none.}
{Competitor}: {what was said, by whom, and whether it's a threat or opportunity}
================================================================================
This is the most important part. It goes at the top but you write it LAST — after reading all 4 agent files. It should read like a news lede:
Good example: "Rough week on the support side — two critical outages took down checkout and payment processing. A key account's migration is blocked by import gaps. But the calls tell a different story: feature requests surged (+49%) as customers ramp up for Q2, asking for team management and search performance improvements. The fix-vs-build tension is real: 66% of this week's volume is support fires, 34% is strategic product demand."
Bad example: "This week there were 1,423 insights from 258 customers. There were 3 deal blockers and 7 churn risks. Categories that spiked include..."
The good example tells a story. The bad example reads data.
When reading insights, silently exclude noise and report only real human feedback: