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-insightsis more efficient than counting raw timeline items. - Timeline items are append-only in the UI; the API allows updates to existing entries.
update-timeline-itemvisibility 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 withcreate_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:
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_pageon 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
itemIdandboardIdfor 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 / <custom types from account>)"
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 <item name>?"
(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 <type> on <item name>. 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 <type> — 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 <item name> in <window>. 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 <item name>?"
(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
Completion criteria
- Step 0 connector check passed; activity types cached or degraded gracefully.
- Intent correctly classified (log / read / update).
- CRM item resolved before any write.
- Every write/update went through HITL confirmation.
- Structured activities used when available; notes as fallback.
- No timeline entries deleted (hard rail).
- Errors surfaced with actionable guidance.


