Help us improve
Share bugs, ideas, or general feedback.
From monday CRM
Reads monday.com deals board, ranks deals by activity and stall age, and publishes a timestamped Morning Briefing update inside monday.com.
npx claudepluginhub mondaycom/mcp --plugin monday-crmHow this skill is triggered — by the user, by Claude, or both
Slash command
/monday-crm:morning-briefing [optional: board name or ID, e.g. 'Deals' or '10046221612'][optional: board name or ID, e.g. 'Deals' or '10046221612']This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Produces a daily prioritized briefing over the user's monday CRM pipeline and **publishes it as a monday artifact** (update on a pinned item, or a doc in the user's workspace) so the briefing lives inside monday — not just in the chat. Replaces the five-minute "let me scan my deals" routine that power users (Kevin, Amit, Jaisy) automate via overnight Claude runs.
Syncs monday NoteTaker meeting transcripts to CRM deals by matching participants and appending structured updates with key points, next steps, and commitments.
Generates weekly pipeline health digest for active Linear deals, categorizing by progress, stale status, risks, and new additions; compiles action items, stage summaries, and posts to Slack.
Generates prioritized daily sales briefings from meetings, deals, priorities, or connected calendar, CRM, and email for action plans.
Share bugs, ideas, or general feedback.
Produces a daily prioritized briefing over the user's monday CRM pipeline and publishes it as a monday artifact (update on a pinned item, or a doc in the user's workspace) so the briefing lives inside monday — not just in the chat. Replaces the five-minute "let me scan my deals" routine that power users (Kevin, Amit, Jaisy) automate via overnight Claude runs.
Flow: Trigger → Gather → Synthesize → Publish (α, default) → Share (β, opt-in) → Proactive extension (opt-in).
Morning Briefing — <weekday>, <Mon DD>. Body carries the Generated by Claude footer + an HTML comment <!-- claude-skill-id: morning-briefing --> for idempotency. Markdown brief printed in the chat as a mirror.create_update on stalled deals; create_notification for commitments due today.get_user_context — resolve user + favorite boards.list_workspaces — enumerate workspaces when search is ambiguous.search — find CRM boards matching deals|opportunities|pipeline|leads.get_board_info — board schema + column IDs + labels.get_column_type_info — resolve columns by type when names aren't English.get_board_items_page — pull active deals, recently closed, recent activity.board_insights — aggregate fallback when >200 active deals.create_update — publish α to pinned item, post proactive nudges on stalled deals.create_doc — publish α as a doc when no pinned item exists.create_notification — β share to manager; proactive alert for commitments due today.list_users_and_teams — resolve recipient for β share.all_monday_api — escape hatch for doc updates / metadata lookups not in wrapped tools./monday-crm:forecast-dashboard for a structured view./monday-crm:board-diagnosis.Goal: Fail fast if the user has no monday MCP connection. No partial writes, no guessing.
mcp__monday__get_user_context.user.id and user.name for Step 7 artifact metadata.PAUSE: do not write any
create_*call before Step 6, and never before Step 0 passes.
Goal: Know whether to confirm writes, run silent, or run proactive — before doing anything that writes.
Read the project/session context:
create_* or change_* call in chat before executing.If the user hasn't declared a mode, assume Default.
Hard safety rail regardless of mode: no deletes, no cross-workspace moves, no amount-column writes. Stage, owner, last-touch, and source column edits are allowed when bundled in a batched-confirm plan (Default mode) or under a session-level approval (Proactive mode).
Goal: Land on a single boardId — or a confirmed set — before reading any deal data.
boardId directly.mcp__monday__search with searchType: "BOARD", searchTerm: <arg>. If exactly one match, use it. If multiple, ask via AskUserQuestion.mcp__monday__get_user_context. Scan relevantBoards + favorites for names matching deals|deal|opportunities|opportunity|pipeline|leads|sales.AskUserQuestion: "Which board should I brief on?" + option "all of them".mcp__monday__list_workspaces → mcp__monday__search("deal"). Still zero → print: "I don't see a CRM-shaped board in your workspaces. If you have one under a different name, tell me the name or ID. Otherwise see /monday-crm:board-diagnosis once a board is connected." Stop.If the user picks "all", run Steps 3-7 per board and publish one combined α artifact.
Goal: Resolve column IDs by type, not by English name — global teams (Investment, Wealth Mgmt) have non-English column titles.
mcp__monday__get_board_info(boardId). Cache the column list.| Concept | Type match | Title hint | Fallback |
|---|---|---|---|
| Stage | status | contains "stage", "status" | first status column with is_done labels |
| Owner | people | contains "owner", "rep", "person" | first people column |
| Value | numbers | unit $, or title contains "value", "amount", "revenue", "size" | first numbers column with unit symbol |
| Close probability | numbers | unit %, or title contains "probability", "%" | first numbers column with % unit |
| Expected close date | date | title contains "close", "expected", "target" | earliest-named date column matching |
| Last interaction | date | title contains "interaction", "activity", "touch", "contacted" | latest date column that's not close-date |
| Forecast value | formula | title contains "forecast", "weighted" | skip if absent |
mcp__monday__get_column_type_info to confirm settings (e.g., unit.symbol, labels[].is_done)./monday-crm:board-diagnosis.PAUSE only if more than two core columns are missing — in that case, confirm the user still wants a partial brief.
Goal: Distinguish "closed" from "active" without hardcoding English.
From the stage column's settings.labels:
is_done: true.lost|closed lost|cerrado perdido|verloren|perdu (lowercased contains).is_done: true exists, ask the user which labels mean "won".Cache label index values.
Goal: Three parallel get_board_items_page calls get us active deals, recent closures, and recent activity in one round-trip.
Pass A — Active deals (everything not Won or Lost):
get_board_items_page(
boardId,
filters: [{ columnId: "<stage_id>", compareValue: [<won_idx>, <lost_idx>], operator: "not_any_of" }],
includeColumns: true,
columnIds: [<stage_id>, <owner_id>, <value_id>, <probability_id>, <close_date_id>, <last_interaction_id>, <forecast_id>],
limit: 200
)
Pass B — Recently closed (Won or Lost since yesterday):
get_board_items_page(
boardId,
filters: [{ columnId: "<stage_id>", compareValue: [<won_idx>, <lost_idx>], operator: "any_of" }],
orderBy: [{ columnId: "<close_date_id>", direction: "desc" }],
limit: 50
)
Then in-memory filter to items with updated_at within last 24h.
Pass C — Recent activity: reuse Pass A results; sort by updated_at desc; take anything within 24h.
cursor / more pages: paginate until you have 2,000 items OR cursor is null. Cap at 2,000 most-recent by updated_at and flag sampling in the brief: "Sampled the 2,000 most-recently-updated deals — full board has N."get_board_items_page 429 (rate limit): exponential backoff 3x (1s, 2s, 4s). On the third failure: "monday is rate-limiting right now. Retry in 60 seconds, or narrow to fewer boards." Stop — no partial α artifact.board_insights errors (9% baseline): if invoked as a fallback and it fails, skip that strand; add "couldn't analyze <strand> — retry later" to the hygiene line.board_insights aggregates; keep per-deal detail only on Slipping + Stale.Goal: Rank deals by what actually needs action today. Prioritize: (a) new activity, (b) stalled >14d, (c) commitments due today.
For each deal in Pass A, compute category membership:
| Bucket | Criteria |
|---|---|
| Slipping | close_date in past AND stage not Won/Lost |
| Stale | last_interaction > 14d ago AND stage in non-closed |
| Follow-up | last_interaction > 7d ago AND probability ≥ 50% |
| Hot | probability ≥ 70% AND last_interaction ≤ 7d AND close_date ≤ 30d |
| New | created within last 7d AND stage = earliest-index label |
| Commit-today | close_date = today AND stage ≠ Won/Lost (drives β proactive notification) |
A deal can match multiple buckets — display in the most actionable one: Commit-today > Slipping > Stale > Follow-up > Hot > New.
Pipeline totals:
Goal: Put the brief inside monday, not just in chat. That's the whole α thesis: artifacts drive return visits to monday.
My Morning (exact, case-insensitive). If found → create_update on that item.create_doc in the user's personal workspace with title Morning Briefing — <weekday>, <Mon DD>, <YYYY>.Morning Briefing — <weekday>, <Mon DD> AND containing the HTML comment <!-- claude-skill-id: morning-briefing --> in its body. If found, update it in place (create_update on the same item, or update the existing doc via all_monday_api). Never duplicate.# CRM Morning Briefing — <weekday>, <Mon DD>
<!-- claude-skill-id: morning-briefing -->
## Pipeline at a glance
- Active pipeline: $<total>K across <N> deals
- Forecast: $<forecast>K (weighted)
- Closing this week: <N> deals, $<value>K
## Yesterday's movements
- Won: <deal> ($<value>K, <owner>)
- Lost: <deal> ($<value>K, <owner>)
## Needs you today
### Closing today (<N>)
- <deal> — <stage>, $<value>K, owner <name>, last touch <X days ago>
### Slipping (<N>)
- <deal> — <stage>, $<value>K, expected <date> (<X> days overdue), owner <name>
### Going cold (<N>)
- <deal> — <stage>, no touch in <X> days, owner <name>
### Follow-up (<N>)
- <deal> — <stage>, <probability>%, last touch <X days ago>
## On track
- <deal> — <stage>, <probability>%, closing in <X> days, owner <name>
## Data hygiene
- <N> deals missing owner · <N> missing close date · <N> missing amount
- (Run `/monday-crm:board-diagnosis` for a full audit.)
---
Generated by Claude · <ISO timestamp> · run `/monday-crm:morning-briefing` to refresh.
Before the create_update / create_doc call, Default mode must print:
"I'll publish this as <target>. OK to post? (yes / no / show first)."
Silent mode skips this confirmation. Proactive mode honors the session-level decision made in Step 1.
After the artifact is published (or attempted), also print the brief in chat as a mirror + include the artifact URL on the last line: Posted: <url>.
create_doc in personal workspace; if that also fails, print the brief in chat with a banner "Couldn't publish to monday (permission error). Brief below — paste it where you want."create_dashboard: not applicable to this skill (no dashboard in α). The fallback doesn't apply here.Goal: Notify manager / post to team rollup. Only runs if user explicitly asked ("share this with my manager", "post to the team", or Proactive mode selected Share).
mcp__monday__list_users_and_teams → resolve recipient. If user has a declared manager in their profile metadata, default to that; else AskUserQuestion with top-5 most-linked teammates.mcp__monday__create_notification({ userId, itemId: <artifact item>, text: "Morning briefing for <Mon DD>" }).create_update on a team-rollup board — one whose name suggests a team or sales rollup (e.g. contains "team", "rollup", or "sales"), or one the user names explicitly. These are not default monday CRM boards, so resolve by search / AskUserQuestion rather than assuming a fixed name; if none is found, ask the user which board to post to. Same footer + skill-id-comment convention as the personal-workspace artifact.create_notification. Silent mode: skip confirmation. Proactive: honors session choice.Goal: Act on the briefing — not just render it.
Only runs if mode = Proactive AND the session-level decision was "approve all" or "review each".
For each deal in Stale bucket:
create_update(itemId, text: "*Claude nudge:* No activity in <X> days. What's the next step?").For each deal in Commit-today bucket:
create_notification({ userId: <deal owner>, itemId, text: "Commitment due today on <deal> — $<value>K" }).For each deal where the transcript / chat made a clear stage transition signal (e.g., user typed "mark Acme as Negotiation"): bundle the stage edits into the batched-confirm plan from Step 7 — never write standalone.
(Stale count + Commit-today count) > 20: batch into one review-list doc (Proactive actions — <date>, with the <!-- claude-skill-id: morning-briefing --> comment in body) rather than 20 individual confirms. Print a single prompt: "20+ proactive actions queued — open the list and confirm in bulk?"Goal: Leave a clean audit trail for Tom (and for red-flag monitoring post-GA).
Published Morning Briefing — <date>. <N> deals scanned, <N> actions posted, <N> pending.Generated by Claude · <ISO timestamp> footer and the embedded <!-- claude-skill-id: <skill> --> HTML comment in update/doc bodies. For items the plugin creates, use Source = Claude on a status column (auto-create the column with user confirm if missing).| Failure | Behavior |
|---|---|
| Connector not installed | Step 0 stops; print install link. |
| No CRM board | Step 2 stops; offer path to /monday-crm:board-diagnosis once a board exists. |
| Board >10K items | Cap at 2K most-recent, flag sampling. |
| MCP tool error (retryable) | Exponential backoff 3x; on third fail, skip that strand, surface partial brief with hygiene note. |
| Same-day artifact exists | Update in place via item/doc ID. |
| User halts mid-session | Keep writes up to halt; Step 9 batches roll back via delete_item only if the batched doc was partially created. |
| 429 rate limit | Backoff 3x, then "monday is rate-limiting; retry in 60s or narrow to fewer boards." Stop. |
| Non-admin publish perms | Degrade create_update → create_doc → print-only. |
| Multiple CRM boards | AskUserQuestion with "all of them" option. |
| Non-English column names | Resolve by type via get_column_type_info. |
| Proactive writes >20 | Batch into one review-list doc. |
Generated by Claude footer + <!-- claude-skill-id: morning-briefing --> comment.