Skip to content

feat: recurring occurrence edits, virtual member tools, and tool metadata - #49

Merged
ehs208 merged 6 commits into
mainfrom
feat/recurrence-virtual-members-tool-metadata
Oct 18, 2026
Merged

ehs208 merged 6 commits into
mainfrom
feat/recurrence-virtual-members-tool-metadata

Conversation

@ehs208

@ehs208 ehs208 commented Oct 18, 2026

Copy link
Copy Markdown
Owner

Summary

Adds 7 tools (28 total) and the tool metadata Glama flagged as missing.

New tools

  • update_event_occurrence, delete_event_occurrence: change or delete one occurrence of a recurring event (scope: "this"), or it and every later one ("this_and_following"). They write what the TimeTree app writes:
    • Deleting one occurrence adds it to the single comma-separated EXDATE line.
    • Editing one occurrence creates an event with parent_id set to the series, then excludes that occurrence from the series.
    • "This and following" ends the series with a date-only UNTIL=YYYYMMDD and, for updates, starts a new series with the remaining COUNT and later EXDATEs.
    • If the second step fails, the event created in the first step is deleted.
  • copy_event: copies an event to a new time, optionally into another calendar. It sends copy: true like the app. Attendees and files are kept only within the same calendar.
  • create_virtual_member, update_virtual_member, delete_virtual_member: update and delete use the member uuid. A PUT clears omitted fields, so the update reads the current member and merges first. The 10-member limit is checked before creating.
  • get_current_user: returns user_id and name only.

Glama feedback

  • Every tool declares MCP annotations (read-only, destructive, idempotent, open-world) and an outputSchema, and returns matching structuredContent.
  • The server publishes instructions covering calendar IDs, times, memos, and recurring events.
  • Descriptions were rewritten to say what each tool changes and which tool to use instead. Internal jargon was removed (CSRF wording, "verified endpoint", category=2). The label color list moved to the label_id parameters.

Fix

  • get_events dropped the last occurrence of a series ending on a date-only UNTIL, which is what the app writes for "delete this and future events". UNTIL is now compared by local date.

Docs

  • Updated README (en/ko/ja), COMMANDS, CHANGELOG [Unreleased], CLAUDE.md, CONTRIBUTING, and the mcpb/manifest.json tool list.
  • New docs/FEATURE_CANDIDATES.md lists observed web features that are not built yet (reactions, likes, album, comment images, batch, free time) and the ones not planned, with reasons.

The version stays at 0.5.0, so this can ship in the next release.

Testing

  • npm run verify passes: 91/91 tests, and audit shows only 1 low-severity finding.
  • New tests:
    • Recurrence helpers checked against the app's observed output.
    • Occurrence, copy, and virtual member tools, plus rollback.
    • Field merging on virtual member update.
    • Validation of every tool's structuredContent against its outputSchema using the SDK's Ajv validator.
  • npm run build:mcpb plus a stdio smoke test: initialize and tools/list return 28 tools, each with annotations and an output schema, and the instructions are present.
  • Manual check on a test calendar with made-up events: the requests the new code generates were sent to TimeTree and succeeded. The app then showed the expected series, occurrence, copy, and virtual member state. All test data was deleted afterwards. No captures are committed.

🤖 Generated with Claude Code

…data

- update_event_occurrence / delete_event_occurrence change or delete one
  occurrence of a recurring event, or it and every later one, matching the
  TimeTree app (EXDATE, parent_id child event, date-only UNTIL split).
- copy_event copies an event to a new time, optionally into another calendar.
- create/update/delete_virtual_member; updates merge current fields because
  a PUT clears omitted ones. get_current_user returns user ID and name.
- Every tool declares annotations and an output schema and returns
  structuredContent; the server publishes instructions. Descriptions were
  rewritten with sibling-tool guidance and without implementation details.
- Fix get_events dropping the last occurrence of a date-only UNTIL series.
- docs/FEATURE_CANDIDATES.md records observed features not built yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-18T13:07:43.087256Z 16821cc New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7d4b37d88e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/utils/recurrence.ts Outdated
Comment thread src/tools/calendar-metadata-tools.ts Outdated
Comment thread src/tools/recurring-event-tools.ts Outdated
…rthdays

- Move UNTIL with the new start time when splitting a series, so a moved
  last occurrence is not cut off (date-only UNTIL follows the local day).
- Re-read the series before undoing a failed second step; if the update was
  applied, keep the created event, and if it cannot be checked, keep it and
  say so instead of deleting occurrences.
- update_virtual_member accepts birthday: null to remove a birthday.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ehs208

ehs208 commented Oct 18, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 23ebd26c7f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/tools/recurring-event-tools.ts Outdated
Comment thread src/tools/recurring-event-tools.ts Outdated
Comment thread src/tools/recurring-event-tools.ts Outdated
Comment thread src/tools/recurring-event-tools.ts
- Refuse a this-and-following move to another day when the rule repeats on
  set days (BYDAY, BYMONTHDAY, BYMONTH) unless new recurrences are given.
- When every earlier occurrence was deleted and the start moves, update the
  series with the reduced COUNT instead of the original one.
- A create that fails without a clear answer leaves the series unchanged and
  tells the caller it may exist; a failed rollback names the leftover event.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ehs208

ehs208 commented Oct 18, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

timeZone: event.start_timezone,
windowStart: start_after === undefined ? Number.NEGATIVE_INFINITY : start_after + 1,
windowEnd: start_before,

P2 Badge Expand all-day recurrences in UTC

When an all-day series carries a non-UTC start_timezone, this expands it in that timezone even though all-day recurrence dates are stored at midnight UTC; loadSeries already compensates by forcing UTC. For example, a Monday all-day BYDAY=MO series with America/New_York has a Sunday local DTSTART, so get_events emits Tuesday UTC occurrences that update_event_occurrence then rejects as not belonging to the series. Use UTC here whenever event.all_day is true so reads and occurrence writes agree.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/tools/recurring-event-tools.ts Outdated
Comment thread src/utils/recurrence.ts Outdated
Comment thread src/tools/recurring-event-tools.ts Outdated
Comment thread src/tools/event-tools.ts
Comment thread src/tools/recurring-event-tools.ts
- A supplied this-and-following rule keeps the remaining COUNT or UNTIL and
  the later exclusions unless it sets its own.
- Later EXDATEs and UNTIL move by wall-clock time, so a DST change between
  them and the moved start no longer puts them off the rule.
- The set-days check also catches a start_timezone change.
- Occurrence events and copies keep map coordinates unless the location
  changes.
- Event output keeps only string recurrence lines, matching the schema.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ehs208

ehs208 commented Oct 18, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: aeebe32c00

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/tools/recurring-event-tools.ts Outdated
Comment thread src/utils/recurrence.ts Outdated
…oss zones

- When every earlier occurrence was deleted, a this-and-following change
  moves the series start to the selected occurrence, so a new rule cannot
  bring back earlier dates.
- Later EXDATEs and UNTIL are mapped from the series time zone into the
  requested start_timezone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ehs208

ehs208 commented Oct 18, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c648db4a0f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/tools/recurring-event-tools.ts
An empty list or EXDATE-only lines made the new series a single event
while the original was still cut, losing the later occurrences.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ehs208
ehs208 merged commit e7e3f08 into main Oct 18, 2026
2 checks passed
@ehs208 ehs208 mentioned this pull request Oct 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant