1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
|
#+TITLE: Edit Calendar Event Workflow
#+AUTHOR: Craig Jennings & Claude
#+DATE: 2026-02-01
* Overview
Workflow for editing existing calendar events. Uses the Google Calendar MCP server (preferred) or gcalcli (fallback, personal account only).
The MCP server supports direct event updates via =update-event= — no delete-and-recreate needed. gcalcli fallback still uses delete-and-recreate since gcalcli's edit command is interactive.
* Triggers
- "edit the meeting"
- "change my appointment"
- "reschedule"
- "update the event"
- "move my appointment"
* Prerequisites
- Google Calendar MCP server configured and authenticated (=@cocal/google-calendar-mcp=)
- Two accounts available: =personal= (Craig Google) and =work= (Craig Deepsat)
- Fallback: gcalcli installed (personal account only)
- Event must exist on calendar
* CRITICAL: Check All Calendars Before Rescheduling
When rescheduling an event, ALWAYS check for conflicts at the new time across ALL calendars:
1. *MCP server* — check both personal and work accounts via =list-events= or =get-freebusy=
2. *Emacs org files* — for Proton calendar (not accessible via MCP or gcalcli):
#+begin_src bash
grep "TARGET_DATE" ~/.emacs.d/data/pcal.org # Proton calendar
#+end_src
Verify the new time is free across all calendars before rescheduling.
* Workflow Steps
** 1. Parse User Request
Extract:
- Which event (title, partial match, or date hint)
- What to change (if mentioned)
Examples:
- "Edit the dentist appointment" → search for "dentist"
- "Reschedule tomorrow's meeting" → search tomorrow's events
- "Change the 3pm call to 4pm" → search by time
** 2. Search for Event
*** MCP (preferred)
Use =search-events= or =list-events= MCP tool with appropriate =account_id= ("personal" or "work").
*** gcalcli (fallback, personal only)
#+begin_src bash
gcalcli --calendar "Calendar Name" search "event title"
gcalcli --calendar "Calendar Name" agenda "date" "date 11:59pm"
#+end_src
** 3. Handle Multiple Matches
If search returns multiple events:
#+begin_example
Found 3 events matching "meeting":
1. Team Meeting - Feb 3, 2026 at 9:00 AM
2. Project Meeting - Feb 4, 2026 at 2:00 PM
3. Client Meeting - Feb 5, 2026 at 10:00 AM
Which event do you want to edit? (1-3)
#+end_example
** 4. Display Full Event Details
Show the current event state:
#+begin_example
Event: Team Meeting
When: Monday, Feb 3, 2026 at 9:00 AM
Duration: 1 hour
Location: Conference Room A
Description: Weekly sync
Reminders: 5 min, 0 min
Calendar: Craig
#+end_example
** 5. Ask What to Change
Options:
- Title
- Date/Time
- Duration
- Location
- Description
- Reminders
Can change one or multiple fields.
** 6. Show Updated Summary
Before applying changes:
#+begin_example
Updated Event:
Event: Team Standup (was: Team Meeting)
When: Monday, Feb 3, 2026 at 9:30 AM (was: 9:00 AM)
Duration: 30 minutes (was: 1 hour)
Location: Conference Room A
Description: Weekly sync
Reminders: 5 min, 0 min
Calendar: Craig
Apply these changes? (yes/no)
#+end_example
** 7. Explicit Confirmation
*Do NOT apply changes until user confirms.*
** 8. Execute Edit
*** MCP (preferred — direct update)
Use the =update-event= MCP tool:
- =account_id=: "personal" or "work"
- =calendar_id=: calendar name or ID
- =event_id=: event ID (from search/list results)
- Only pass the fields that changed (summary, start, end, location, description, etc.)
*** gcalcli (fallback, personal only — delete + recreate)
Since gcalcli edit is interactive, use delete + add:
#+begin_src bash
# Delete original
gcalcli --calendar "Calendar Name" delete "Event Title" --iamaexpert
# Recreate with updated fields
gcalcli --calendar "Calendar Name" add \
--title "Updated Title" \
--when "new date/time" \
--duration NEW_MINUTES \
--where "Location" \
--description "Description" \
--reminder 5 \
--reminder 0 \
--noprompt
#+end_src
*Warning:* The gcalcli delete+recreate approach deletes ALL instances of a recurring event. The MCP =update-event= tool handles this more gracefully.
** 9. Verify
*** MCP
Use =search-events= or =get-event= to verify the update.
*** gcalcli (fallback)
#+begin_src bash
gcalcli --calendar "Calendar Name" search "Updated Title"
#+end_src
Report success or failure.
* Error Handling
** Event Not Found
- Verify spelling
- Try partial match
- Check date range
** Multiple Matches
- Show all matches
- Ask user to select one
- Use more specific search terms
** MCP Authentication Error
Use =manage-accounts= MCP tool with =action: "add"= to re-authenticate.
* Related
- [[file:add-calendar-event.org][Add Calendar Event]] - create events
- [[file:read-calendar-events.org][Read Calendar Events]] - view events
- [[file:delete-calendar-event.org][Delete Calendar Event]] - remove events
|