Log Activity
Flow: Trigger → Detect intent (log / read / update) → Resolve CRM item → Gather activity details → Execute → Confirm.
Input
- Optional: activity description via argument (e.g., "call with Acme about renewal").
- Optional: CRM item name or identifier if mentioned.
Output
- Log (create): structured activity record (call, meeting, note) on the target item's timeline, with confirmation.
- Read: formatted activity history for the specified item and time range.
- Update: edited timeline entry with confirmation of changes.
Knowledge
- Timeline = the activity feed on any CRM item (deal, contact, lead, account).
- Activity types: calls, meetings, notes, emails (read-only from timeline), custom types per account.
- For aggregated stats (team totals, rep comparisons), use the activity-insights skill —
get-activity-insights is more efficient than counting raw timeline items.
- Timeline items are append-only in the UI; the API allows updates to existing entries.
update-timeline-item visibility on external connector is unconfirmed — degrade gracefully if it fails.
Tools (MCP)
get-custom-activities — list activity types configured on the account (call, meeting, note, custom).
get-timeline-items — read an item's timeline (activities, emails, notes).
create-timeline-item — log a structured activity (call, meeting) with type, date, attendees, notes.
update-timeline-item — edit an existing timeline activity's content.
create-timeline-note — add a free-text note to an item's timeline.
get_user_context — user identity for attribution.
search / get_board_info / get_board_items_page — resolve CRM items by name or company.
Cross-skill handoffs
- From meeting-to-opportunity: after a meeting recap, suggest logging the meeting as a structured activity on the deal.
- From run-sequence: when a sequence triggers a manual call step, suggest logging the call outcome.
- To morning-briefing: logged activities feed the daily brief's "recent activity" section.
- From daily-briefing: brief surfaces items with no activity in N days → suggest logging.
- To activity-insights: when the user asks about team totals or rep comparisons rather than a specific item's history.
Step 0: Connector check + activity types
Goal: Confirm connector works and cache available activity types.
- Try
mcp__monday__get_user_context. On error → print install prompt, stop.
- Try
mcp__monday__get-custom-activities.
- If successful → cache the list of activity types (id, name, icon) for use in Step 3. Set
activities_available: true.
- If permission error or tool unavailable → set
activities_available: false. The skill can still operate with create_timeline_note (free-text notes don't require activity-type resolution), but structured activities (calls, meetings) will degrade to notes. Print: "Activity types couldn't be loaded — I can still add notes to timelines. Structured call/meeting logging may be limited."
Step 1: Detect intent
Parse the user's argument to classify:
| Intent |
Trigger signals |
| log |
"log", "record", "add", "note on", "track", "I just spoke with", default |
| read |
"what activities", "activity history", "what happened on", "show timeline" |
| update |
"update the note", "edit the activity", "change the meeting note", "correct" |
If ambiguous and no CRM item mentioned, ask:
"Would you like to (a) log a new activity, (b) view activity history, or (c) update an existing entry?"
Step 2: Resolve CRM item
Goal: Find the specific deal, contact, lead, or account the activity relates to.
Extract item identifier from the argument:
- Company name ("Acme", "Globex", "TechCorp")
- Contact name ("Johnson", "Sarah at Acme")
- Deal name ("Q2 renewal", "enterprise upgrade")
- Item ID (if explicitly given)
If name extracted → mcp__monday__search({ query: "<name>", objectTypes: ["ITEM"] }).
- Single result → use it.
- Multiple results → present top 5 with board context: "Found multiple matches: (1) Acme Corp [Deals board] (2) Acme Inc [Leads board] (3) Acme - renewal [Deals board]. Which one?"
- Zero results → broaden: try partial name, try
get_board_items_page on likely boards (Deals, Contacts, Leads). Still zero → ask user.
If no name in argument → ask: "Which CRM item should I log this activity on? (company name, deal name, or contact name)"
Once resolved, note the itemId and boardId for subsequent calls.
Step 3: Execute — Log (Create)
3a: Determine activity type
If activities_available: true:
- Parse the user's description for type signals:
- "call", "spoke with", "phoned", "rang" → call
- "meeting", "met with", "demo", "presentation" → meeting
- "note", "add a note", "reminder", "FYI" → note (free-text)
- If unclear, present available types: "What type of activity? (call / meeting / note / )"
If activities_available: false:
- Default to free-text note via
create_timeline_note.
3b: Gather details
Based on type, collect (ask only what's missing from the argument):
Call:
- Date/time (default: now)
- Duration (optional)
- Attendees/contacts (optional)
- Outcome/summary (required — at least one line)
- Follow-up action (optional)
Meeting:
- Date/time (default: now)
- Duration (optional)
- Attendees (optional)
- Summary/key points (required)
- Next steps (optional)
Note:
- Content (required)
- That's it — notes are lightweight.
Parsing heuristic: extract as much as possible from the original argument before asking.
3c: Confirm and write
HITL GATE: Present the structured activity:
"Log this to ?"
Type: Call
Date: 2026-06-23 10:00
Summary: They want to renew but need pricing by Friday
Follow-up: Send pricing by Friday
(yes / edit / cancel)
On "yes":
- For structured activities:
mcp__monday__create-timeline-item({ itemId, activityType, date, content: { summary, attendees, followUp } }).
- For notes:
mcp__monday__create-timeline-note({ itemId, content: "<note text>" }).
Report: "Logged on . Timeline updated."
If the tool call fails, fall back to create_timeline_note with the same content formatted as text. Inform: "Couldn't log as a structured — added as a timeline note instead."
Step 4: Execute — Read
mcp__monday__get-timeline-items({ itemId }).
- Parse time filter from argument (this week / last 7 days / today / default last 10).
- Format output as a table with Date, Type, Summary columns.
- If zero activities: "No activities on in . Want to log one now?"
- For team-wide aggregated stats (totals by rep or type), use the activity-insights skill instead.
Step 5: Execute — Update
- Retrieve timeline:
mcp__monday__get-timeline-items({ itemId }).
- Present recent entries; resolve which to update from context or by asking.
- Collect the edit.
HITL GATE: "Update this entry on ?"
Before: "Demo scheduled for next week"
After: "Demo scheduled for next week. Decision moved to July."
(yes / edit / cancel)
mcp__monday__update-timeline-item({ timelineItemId, content: <updated content> }).
- If tool fails: surface error and suggest editing directly in monday CRM.
Shared patterns
- HITL gates on all writes and updates.
- Parse-first, ask-second.
- Graceful type degradation — if structured activity creation fails, fall back to
create-timeline-note.
- No deletes — timeline entries cannot be removed via MCP.
- Attribution — entries carry the user's identity from
get_user_context.
Error handling reference
| Failure |
Behavior |
| Connector missing |
Step 0 stops; print install link. |
| Activity types unavailable |
Degrade to notes; inform user. |
| CRM item not found |
Broaden search; ask user. |
| Create fails (invalid type) |
Fall back to create-timeline-note; inform user. |
| Update fails |
Surface error; suggest editing in monday CRM UI. |
| Timeline empty on read |
Offer to log a new activity. |
| Tool unavailable (Gateway) |
"Activity logging tools aren't available on the connector yet — use the monday CRM UI for now." |
Completion criteria
1---2name: log-activity3description: Log calls, meetings, notes, and other activities to CRM item timelines — structured records with attendees, outcomes, and follow-ups. Use when someone says "log my call with", "add a note to the deal", "what activities happened on", "record this meeting", "update my note on", "track a call with", "log a meeting with", "what's the activity history for", "add meeting notes to", "I just spoke with", "note on the account", or "update the activity I logged".4---56# Log Activity78Flow: **Trigger → Detect intent (log / read / update) → Resolve CRM item → Gather activity details → Execute → Confirm**.910## Input11- Optional: activity description via argument (e.g., "call with Acme about renewal").12- Optional: CRM item name or identifier if mentioned.1314## Output15- **Log (create):** structured activity record (call, meeting, note) on the target item's timeline, with confirmation.16- **Read:** formatted activity history for the specified item and time range.17- **Update:** edited timeline entry with confirmation of changes.1819## Knowledge20- Timeline = the activity feed on any CRM item (deal, contact, lead, account).21- Activity types: calls, meetings, notes, emails (read-only from timeline), custom types per account.22- For aggregated stats (team totals, rep comparisons), use the **activity-insights** skill — `get-activity-insights` is more efficient than counting raw timeline items.23- Timeline items are append-only in the UI; the API allows updates to existing entries.24- `update-timeline-item` visibility on external connector is unconfirmed — degrade gracefully if it fails.2526## Tools (MCP)27- `get-custom-activities` — list activity types configured on the account (call, meeting, note, custom).28- `get-timeline-items` — read an item's timeline (activities, emails, notes).29- `create-timeline-item` — log a structured activity (call, meeting) with type, date, attendees, notes.30- `update-timeline-item` — edit an existing timeline activity's content.31- `create-timeline-note` — add a free-text note to an item's timeline.32- `get_user_context` — user identity for attribution.33- `search` / `get_board_info` / `get_board_items_page` — resolve CRM items by name or company.3435## Cross-skill handoffs36- **From meeting-to-opportunity:** after a meeting recap, suggest logging the meeting as a structured activity on the deal.37- **From run-sequence:** when a sequence triggers a manual call step, suggest logging the call outcome.38- **To morning-briefing:** logged activities feed the daily brief's "recent activity" section.39- **From daily-briefing:** brief surfaces items with no activity in N days → suggest logging.40- **To activity-insights:** when the user asks about team totals or rep comparisons rather than a specific item's history.4142---4344## Step 0: Connector check + activity types4546**Goal:** Confirm connector works and cache available activity types.47481. Try `mcp__monday__get_user_context`. On error → print install prompt, stop.492. Try `mcp__monday__get-custom-activities`.503. If successful → cache the list of activity types (id, name, icon) for use in Step 3. Set `activities_available: true`.514. If permission error or tool unavailable → set `activities_available: false`. The skill can still operate with `create_timeline_note` (free-text notes don't require activity-type resolution), but structured activities (calls, meetings) will degrade to notes. Print: *"Activity types couldn't be loaded — I can still add notes to timelines. Structured call/meeting logging may be limited."*5253---5455## Step 1: Detect intent5657Parse the user's argument to classify:5859| Intent | Trigger signals |60|---|---|61| **log** | "log", "record", "add", "note on", "track", "I just spoke with", default |62| **read** | "what activities", "activity history", "what happened on", "show timeline" |63| **update** | "update the note", "edit the activity", "change the meeting note", "correct" |6465If ambiguous and no CRM item mentioned, ask:66> *"Would you like to (a) log a new activity, (b) view activity history, or (c) update an existing entry?"*6768---6970## Step 2: Resolve CRM item7172**Goal:** Find the specific deal, contact, lead, or account the activity relates to.73741. Extract item identifier from the argument:75 - Company name ("Acme", "Globex", "TechCorp")76 - Contact name ("Johnson", "Sarah at Acme")77 - Deal name ("Q2 renewal", "enterprise upgrade")78 - Item ID (if explicitly given)79802. If name extracted → `mcp__monday__search({ query: "<name>", objectTypes: ["ITEM"] })`.81 - Single result → use it.82 - Multiple results → present top 5 with board context: *"Found multiple matches: (1) Acme Corp [Deals board] (2) Acme Inc [Leads board] (3) Acme - renewal [Deals board]. Which one?"*83 - Zero results → broaden: try partial name, try `get_board_items_page` on likely boards (Deals, Contacts, Leads). Still zero → ask user.84853. If no name in argument → ask: *"Which CRM item should I log this activity on? (company name, deal name, or contact name)"*86874. Once resolved, note the `itemId` and `boardId` for subsequent calls.8889---9091## Step 3: Execute — Log (Create)9293### 3a: Determine activity type9495If `activities_available: true`:961. Parse the user's description for type signals:97 - "call", "spoke with", "phoned", "rang" → call98 - "meeting", "met with", "demo", "presentation" → meeting99 - "note", "add a note", "reminder", "FYI" → note (free-text)1002. If unclear, present available types: *"What type of activity? (call / meeting / note / <custom types from account>)"*101102If `activities_available: false`:103- Default to free-text note via `create_timeline_note`.104105### 3b: Gather details106107Based on type, collect (ask only what's missing from the argument):108109**Call:**110- Date/time (default: now)111- Duration (optional)112- Attendees/contacts (optional)113- Outcome/summary (required — at least one line)114- Follow-up action (optional)115116**Meeting:**117- Date/time (default: now)118- Duration (optional)119- Attendees (optional)120- Summary/key points (required)121- Next steps (optional)122123**Note:**124- Content (required)125- That's it — notes are lightweight.126127Parsing heuristic: extract as much as possible from the original argument before asking.128129### 3c: Confirm and write130131> **HITL GATE:** Present the structured activity:132> *"Log this to <item name>?"*133> ```134> Type: Call135> Date: 2026-06-23 10:00136> Summary: They want to renew but need pricing by Friday137> Follow-up: Send pricing by Friday138> ```139> *(yes / edit / cancel)*140141On "yes":142- For structured activities: `mcp__monday__create-timeline-item({ itemId, activityType, date, content: { summary, attendees, followUp } })`.143- For notes: `mcp__monday__create-timeline-note({ itemId, content: "<note text>" })`.144145Report: *"Logged <type> on <item name>. Timeline updated."*146147If the tool call fails, fall back to `create_timeline_note` with the same content formatted as text. Inform: *"Couldn't log as a structured <type> — added as a timeline note instead."*148149---150151## Step 4: Execute — Read1521531. `mcp__monday__get-timeline-items({ itemId })`.1542. Parse time filter from argument (this week / last 7 days / today / default last 10).1553. Format output as a table with Date, Type, Summary columns.1564. If zero activities: *"No activities on <item name> in <window>. Want to log one now?"*1575. For team-wide aggregated stats (totals by rep or type), use the **activity-insights** skill instead.158159---160161## Step 5: Execute — Update1621631. Retrieve timeline: `mcp__monday__get-timeline-items({ itemId })`.1642. Present recent entries; resolve which to update from context or by asking.1653. Collect the edit.166167> **HITL GATE:** *"Update this entry on <item name>?"*168> ```169> Before: "Demo scheduled for next week"170> After: "Demo scheduled for next week. Decision moved to July."171> ```172> *(yes / edit / cancel)*1731744. `mcp__monday__update-timeline-item({ timelineItemId, content: <updated content> })`.1755. If tool fails: surface error and suggest editing directly in monday CRM.176177---178179## Shared patterns180181- **HITL gates on all writes and updates.**182- **Parse-first, ask-second.**183- **Graceful type degradation** — if structured activity creation fails, fall back to `create-timeline-note`.184- **No deletes** — timeline entries cannot be removed via MCP.185- **Attribution** — entries carry the user's identity from `get_user_context`.186187---188189## Error handling reference190191| Failure | Behavior |192|---|---|193| Connector missing | Step 0 stops; print install link. |194| Activity types unavailable | Degrade to notes; inform user. |195| CRM item not found | Broaden search; ask user. |196| Create fails (invalid type) | Fall back to `create-timeline-note`; inform user. |197| Update fails | Surface error; suggest editing in monday CRM UI. |198| Timeline empty on read | Offer to log a new activity. |199| Tool unavailable (Gateway) | *"Activity logging tools aren't available on the connector yet — use the monday CRM UI for now."* |200201---202203## Completion criteria204205- [ ] Step 0 connector check passed; activity types cached or degraded gracefully.206- [ ] Intent correctly classified (log / read / update).207- [ ] CRM item resolved before any write.208- [ ] Every write/update went through HITL confirmation.209- [ ] Structured activities used when available; notes as fallback.210- [ ] No timeline entries deleted (hard rail).211- [ ] Errors surfaced with actionable guidance.