Help us improve
Share bugs, ideas, or general feedback.
From monday CRM
Syncs monday NoteTaker meeting transcripts to CRM deals by matching participants and appending structured updates with key points, next steps, and commitments.
npx claudepluginhub mondaycom/mcp --plugin monday-crmHow this skill is triggered — by the user, by Claude, or both
Slash command
/monday-crm:meeting-to-opportunity [optional: time window — 'today', 'yesterday', 'last 7 days', or 'since 2026-05-20'][optional: time window — 'today', 'yesterday', 'last 7 days', or 'since 2026-05-20']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
Pulls recent NoteTaker meetings, matches each to a CRM deal, and writes structured notes back as monday updates. Reverse-Salesforce-Einstein — Salesforce ships this loop, monday hasn't (until now). Cross-product stickiness for NoteTaker + CRM users.
Reads monday.com deals board, ranks deals by activity and stall age, and publishes a timestamped Morning Briefing update inside monday.com.
Enhances Granola meeting notes post-transcript with AI templates, shares to Slack/Notion/CRM, extracts action items, and supports follow-ups.
Reviews CRM pipeline stages by pulling prospects, analyzing email histories and meeting transcripts, and sending concise Slack summaries with actions and hygiene recommendations.
Share bugs, ideas, or general feedback.
Pulls recent NoteTaker meetings, matches each to a CRM deal, and writes structured notes back as monday updates. Reverse-Salesforce-Einstein — Salesforce ships this loop, monday hasn't (until now). Cross-product stickiness for NoteTaker + CRM users.
Flow: Trigger → Pull meetings → Match → Synthesize → Publish (α) → Auto-contact (β, opt-in) → Proactive next-step nudges (opt-in).
Meeting recap update per matched deal, summarizing key points + commitments + next steps. Body carries the Generated by Claude · <ISO timestamp> footer + <!-- claude-skill-id: meeting-to-opportunity --><!-- meeting-id: <id> --> comments. A Meeting sync — <Mon DD> doc lists what was matched, what wasn't, and unresolved attendees.Source = Claude on a status column.create_notification to deal owner for commitments due this week. Stage column edits and last-touch updates are also OK in Proactive (or in Default with batched confirm) when a clear transition phrase is present in the transcript ("we agreed to move to procurement review", "they signed today"). Surfaced as a single batched plan: " stage transitions detected. Apply all / review each / skip stage edits?". Amount-column writes still forbidden.get_user_context — user identity for filtering meetings.get_notetaker_meetings — recent meetings + transcripts.search / list_workspaces / get_board_info — locate Deals + Contacts boards.get_board_items_page — fetch active deals to match against.get_column_type_info — resolve email/company columns by type.create_update — write the recap onto the matched deal.create_item — β auto-contact on the Contacts board.change_item_column_values — populate the new contact's email + company columns, write Source = Claude on contacts, and apply confirmed stage / last-touch edits on matched deals. Never for amount columns.create_notification — proactive next-step nudges.create_doc — sync summary doc.all_monday_api — escape hatch for connect-board column writes (linking contact ↔ deal).bulk-data-hygiene to clean contact data.Goal: Fail fast if either the monday MCP connector or NoteTaker is missing.
mcp__monday__get_user_context. On error → standard install prompt, stop.mcp__monday__get_notetaker_meetings({ limit: 1 }).PAUSE: do not write any
create_*call before Step 6.
If undeclared, Default.
Hard safety rail regardless of mode: no deletes, no amount-column writes, no cross-workspace moves. Stage transitions are bundled into a batched plan — never written one-off, never silently.
AskUserQuestion (large windows produce noisy recaps).mcp__monday__get_notetaker_meetings({ since: <ISO>, until: <ISO>, limit: 50 }). Cache transcripts + attendees + meeting metadata.
Edge cases:
<window>. Try a wider range, e.g. last 7 days." Stop.Resolve the boards directly — this skill is self-contained:
get_user_context → scan favorites + relevantBoards for names matching deals|opportunities|pipeline|sales. One candidate → use it; multiple → AskUserQuestion; zero → list_workspaces → search("deal", BOARD). Still zero → degrade per step 4 below.contacts|people|leads (only if β auto-contact may run).get_board_info on each. Resolve columns by type:
email (if present), text company-name, people owner, status stage, numbers value, date last-touch.email, text (or company-link board_relation), phone, people owner./monday-crm:workspace-builder.Goal: For each meeting, find the single best matching deal — or flag it as unmatched.
For each meeting:
limit: 500.Edge cases:
@monday.com or @<company-domain>) and no deal-name title match: skip (likely standup), log to summary doc as "skipped: internal-only".For each matched meeting, compose a structured recap from the transcript:
? or signaled by "we need to figure out", "TBD").confidence: high|low based on (a) explicit phrase ("we agreed to ", "signed today") = high, (b) inferred ("seems like they're ready for legal review") = low. Only high transitions enter the batched plan; low ones surface as text recommendations.Deal-side metadata lookup: pull current stage + value + close date for context (single get_board_items_page filtered to the matched item ID).
For each matched meeting + deal pair:
<!-- claude-skill-id: meeting-to-opportunity --> and <!-- meeting-id: <id> -->. If found → update via all_monday_api, don't post a duplicate.create_update({ itemId: <dealId>, body: <recap markdown> }).# Meeting recap — <meeting title>
*<meeting date> · <duration>m · <attendee count> attendees*
## Key points
- ...
## Commitments
- <person> → <commitment> (due <date or "open">)
## Open questions
- ...
## Stage signal
<"applied: <old> → <new>" if the batched plan included it> OR <text recommendation if low-confidence> OR "no stage change">
---
<!-- claude-skill-id: meeting-to-opportunity -->
<!-- meeting-id: <noteTakerMeetingId> -->
Generated by Claude · <ISO timestamp> · run `/monday-crm:meeting-to-opportunity` to refresh.
Before any write, print a single plan:
"I'll write: recaps · stage edits (high-confidence only) · last-touch updates · new contacts. meetings unmatched (will list separately). low-confidence stage signals will surface as text only. Proceed? (yes / show plan in detail / no)."
If user picks "show plan in detail", walk through one example per write-type, confirm, then batch the rest. Never per-deal confirms beyond that.
Goal: Don't make the user manually add every meeting attendee to Contacts.
Only runs if mode = Proactive (option a) OR Default-mode user opts in at Step 7 confirm (added prompt: "+ create N missing contacts on Contacts board?").
For each unique attendee email not found on the Contacts board:
create_item({ boardId: <contactsBoard>, itemName: "<First Last>", groupId: "new" }).change_item_column_values to populate email, company (from email domain), the matching deal link (board_relation column → <dealId>), and Source = Claude on the board's source/status column. If no source/status column exists, prompt the user once: "Add a Source status column on Contacts so we can flag plugin-created records? (yes / skip)". If skipped, contacts are still created but source isn't tracked.Cap at 25 contacts per run. Above that, batch into a review-list doc rather than creating silently.
Only runs if mode = Proactive AND session-level approval was given.
For commitments parsed in Step 6 with a parseable due-date within next 7 days:
create_notification({ userId: <deal owner>, itemId: <dealId>, text: "Commitment due <date> on <deal>: <commitment>" }).Hard rail: never write commitments to amount columns. Notifications only for proactive nudges (stage edits already handled in Step 7's batched plan, not here).
If >20 nudges queued, batch into one This week's commitments doc (with <!-- claude-skill-id: meeting-to-opportunity --> in body) and notify once with a link.
create_doc (idempotent — same-day update-in-place):
# Meeting sync — <Mon DD>
## Matched (<N>)
- <meeting title> → <deal name> (<deal url>)
## Multi-match (<N>)
- <meeting title> → <deal A> + <deal B>
## Ambiguous (<N>)
- <meeting title> — candidates: <deal A>, <deal B> — review and re-run with explicit deal ID
## Unmatched (<N>)
- <meeting title> — attendees: <emails> — no matching deal. Suggest creating one.
## Skipped (<N>)
- <meeting title> — internal-only, no CRM relevance
## Contacts created (<N>)
- <name> (<email>) → linked to <deal>
---
Generated by Claude · <ISO timestamp>
One-line chat summary: Synced <N> meetings to <M> deals. <K> unmatched, <L> contacts created. Doc: <url>.
Generated by Claude footer + <!-- claude-skill-id: meeting-to-opportunity --> comment in update/doc bodies; Source = Claude on contact items.| Failure | Behavior |
|---|---|
| Connector / NoteTaker missing | Step 0 stops; print install link. |
| 0 meetings in window | Step 3 stops; suggest wider window. |
| No Deals board | Step 4 degrades — sync doc only, suggest workspace-builder. |
| Ambiguous match (≥2 candidates within 2 points) | Skip the write; log to sync doc as "ambiguous". |
| Idempotency hit (same meeting-id in update) | Update existing content, don't duplicate. |
429 on get_notetaker_meetings or create_update | Backoff 3x; halt on third with retry message. |
| Contacts board missing | Skip β; log "no Contacts board" once in sync doc. |
| Transcript empty / NoteTaker still processing | Skip that meeting; surface in sync doc as "transcript pending". |
| Cross-board permission error | Skip just that deal/contact; continue with the rest. |
<!-- claude-skill-id: meeting-to-opportunity --> + <!-- meeting-id: <id> --> + Generated by Claude footer.Source = Claude and a link to the matched deal.