| name | pos-morning |
| description | Morning brief pipeline โ auto-detects MCP servers, gathers calendar + tasks + sessions + vault, synthesizes ONE focus sentence. Three output modes. |
| version | 3 |
| user_invocable | true |
| arguments | [{"name":"style","description":"Output: brief (default), full, telegram","required":false}] |
POS Morning โ Daily Brief Pipeline
Generate a morning brief by auto-detecting your integrations, gathering context from every available source, and synthesizing ONE focused sentence for the day. Works with zero setup โ adapts to whatever you have connected.
This is the "aha moment" of a POS โ the first time all your data sources produce a single actionable priority.
Step 0: Detect Available Integrations
Read MCP config to know what's available BEFORE gathering data:
cat ~/.claude/mcp.json 2>/dev/null
Build integrations map from configured servers:
| Server | Capability | Loader |
|---|
| krisp | Meetings, transcripts, action items | ToolSearch: "+krisp" |
| linear | Tasks, projects, sprints | ToolSearch: "+linear list" |
| telegram | Saved messages (context clues) | ToolSearch: "+telegram get" |
| notion | Notes, databases | ToolSearch: "+notion search" |
| exa | Web context (optional) | ToolSearch: "+exa" |
Only ToolSearch servers found in mcp.json. Don't guess โ if not configured, don't try.
Also check for local tools:
GCAL_SCRIPTS=("$HOME/.claude/scripts/gcal-smart.sh" "$HOME/.claude/scripts/gcal.sh")
for s in "${GCAL_SCRIPTS[@]}"; do [ -x "$s" ] && echo "gcal: $s" && break; done
find ~/.claude/projects -name "linear-tracking.md" -type f 2>/dev/null | head -1
Step 1: Gather Context
Try each source in degradation order. Skip silently if unavailable โ never error, never ask to install.
1.1 Calendar
Degradation chain (stop at first success):
-
Krisp MCP (if in mcp.json):
ToolSearch: "+krisp meetings"
mcp__krisp__list_upcoming_meetings
mcp__krisp__search_meetings (yesterday, for recap)
Krisp also provides action items from yesterday's meetings โ extract these.
-
Google Calendar script:
"$HOME/.claude/scripts/gcal-smart.sh" today
"$HOME/.claude/scripts/gcal-smart.sh" week
-
Skip โ note "no calendar" in output header.
1.2 Tasks
Degradation chain:
-
Linear MCP:
ToolSearch: "+linear list_issues"
mcp__linear__list_issues(assignee: "me", status: "started")
mcp__linear__list_issues(assignee: "me", status: "unstarted")
Also check for recently completed (last 3 days) to show momentum.
-
Linear cache (memory file):
TRACKING=$(find ~/.claude/projects -name "linear-tracking.md" -type f 2>/dev/null | head -1)
Read and extract cached task list with statuses.
-
Local TODO:
find . -maxdepth 2 \( -name "TODO.md" -o -name "tasks.md" -o -name "TODO" \) 2>/dev/null | head -3
-
Skip โ note "no task source".
1.3 Messages (context clues)
Only if Telegram MCP detected:
ToolSearch: "+telegram get_messages"
mcp__telegram__telegram_get_messages(dialog: "me", limit: 5)
Saved messages reveal what the user was thinking about. Extract themes, don't display raw messages.
1.4 Recent Sessions
touch -t $(date +%Y%m%d)0000 /tmp/pos-today-marker 2>/dev/null
find ~/.claude/projects -name "*.jsonl" -newer /tmp/pos-today-marker -maxdepth 3 2>/dev/null | head -5
YESTERDAY=$(date -v-1d +%Y%m%d 2>/dev/null || date -d "yesterday" +%Y%m%d 2>/dev/null)
touch -t ${YESTERDAY}0000 /tmp/pos-yesterday-marker 2>/dev/null
find ~/.claude/projects -name "*.jsonl" -newer /tmp/pos-yesterday-marker -maxdepth 3 2>/dev/null | head -5
For each session, read first 20 and last 20 lines to extract:
- Project name (from path)
- Topic (from first user message)
- Tools used (count of tool calls, approximate effort)
1.5 Vault State (optional)
If working directory is a vault:
find . -name "*.md" -mmin -720 \
-not -path "./.obsidian/*" \
-not -path "./.trash/*" \
-not -path "./.smart-env/*" \
-not -path "./node_modules/*" \
2>/dev/null | head -10
1.6 Yesterday's Meetings (if Krisp available)
mcp__krisp__search_meetings (yesterday's date range)
mcp__krisp__list_activities
Extract per-meeting:
- Title, duration, participants
- Action items generated
- Talk time ratio (were you presenting or listening?)
Step 2: Synthesize
Weekday-aware mode
Adjust synthesis by day:
| Day | Mode | Extra |
|---|
| Monday | Week overview | Show full week calendar, sprint status |
| Tuesday-Thursday | Standard | Focus on today's blocks |
| Friday | Wins + lessons | Show completed tasks this week, retrospective prompt |
FOCUS derivation
The single most important output. Derive ONE sentence from ALL context:
- Check today's calendar โ what's the biggest time commitment?
- Check in-progress tasks โ what's most urgent or overdue?
- Check yesterday's sessions โ what was the user mid-work on?
- Check action items from yesterday's meetings โ what was promised?
- Combine: "[Action verb] [specific thing] [by when / why]"
Examples:
- "Finalize workshop slides before 14:00 session"
- "Close 3 overdue Linear tasks โ sprint ends Friday"
- "No meetings today โ deep work on dashboard generator"
- "Follow up on partnership call action items before standup"
NEVER generic focus like "have a productive day" โ must be specific.
Output structure
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ MORNING BRIEF ยท {weekday} {date} โ
โ sources: {list of what connected} โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
FOCUS
> {main priority โ 1 sentence from all context}
CALENDAR ({count} events)
โโ {time} {title} ({duration})
โโ {time} {title} ({duration})
โโ {time} {title} ({duration})
TASKS ({in_progress} IP ยท {todo} todo)
โโ {id} {title} โ IP
โโ {id} {title} โ IP
โโ +{N} in backlog
YESTERDAY
> {1-2 sentences: what you worked on, based on sessions + meetings}
OBSERVATIONS
ยท {schedule insight โ conflicts, free blocks, back-to-back}
ยท {task insight โ overdue items, approaching deadlines}
ยท {pattern โ "3 sessions on X this week, close it today?"}
Step 3: Output Modes
brief (default)
Terminal output as above.
full
Same + additional sections:
YESTERDAY'S MEETINGS ({count})
โโ {title} {duration} {participants}
โ โ action: {item}
โโ {title} {duration}
RECENT FILES ({count})
โโ {filename} {modified time ago}
โโ {filename} {modified time ago}
SAVED MESSAGES
โโ {preview of recent telegram saved}
โโ {preview}
INTEGRATIONS
โโ calendar {krisp|gcal|none}
โโ tasks {linear|cache|local|none}
โโ messaging {telegram|none}
โโ meetings {krisp|none}
โโ sessions {N found}
telegram
Compact version for Telegram Saved Messages:
#morning {weekday}
focus: {priority}
{time} {event}
{time} {event}
tasks: {count} IP ยท {count} todo
ยท {most important}
ยท {second}
> {one observation}
Send via:
ToolSearch: "+telegram send_self"
mcp__telegram__telegram_send_self(message: "{brief}")
If Telegram not available, fall back to brief and note it.
Principles
- Graceful degradation: 0 integrations = minimal brief; full stack = rich brief
- Never error on missing source: skip silently, note what connected in header
- Opinionated focus: ALWAYS synthesize ONE focus โ this is the core value
- Fast: direct tool calls only, no background agents needed, <30 seconds
- Weekday-aware: Monday overview, Friday retrospective, standard midweek
- Action items carry forward: yesterday's meeting commitments appear in today's brief
Common Mistakes
| Mistake | Fix |
|---|
| ToolSearch for server not in mcp.json | Only search servers found in config |
| Generic focus: "be productive today" | Focus MUST be specific: action + object + deadline |
| Showing raw JSONL content | Extract topic from first user message only |
| Failing when no calendar | Skip silently โ brief with just tasks is valuable |
| Hardcoded MCP tool names | ToolSearch first โ tool names vary across setups |
| Sending telegram without checking | Check Step 0 map โ only send if detected |
| Reading entire session files | First 20 + last 20 lines is enough for topic |
| Skipping yesterday's meetings | Krisp action items are tomorrow's priorities |