ofw-mcp 2.6.7 → 2.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ofw-mcp",
3
- "version": "2.6.7",
3
+ "version": "2.7.1",
4
4
  "license": "MIT",
5
5
  "mcpName": "io.github.chrischall/ofw-mcp",
6
6
  "description": "OurFamilyWizard MCP server for Claude — developed and maintained by AI (Claude Code)",
@@ -42,13 +42,13 @@
42
42
  "zod": "^4.4.3"
43
43
  },
44
44
  "devDependencies": {
45
- "@chrischall/mcp-connector": "^1.0.0",
45
+ "@chrischall/mcp-connector": "^1.1.1",
46
46
  "@cloudflare/vitest-pool-workers": "^0.18.4",
47
47
  "@cloudflare/workers-oauth-provider": "^0.8.1",
48
48
  "@cloudflare/workers-types": "^5.20260708.1",
49
49
  "@types/node": "^26.0.0",
50
50
  "@vitest/coverage-v8": "^4.1.7",
51
- "agents": "^0.17.3",
51
+ "agents": "^0.19.0",
52
52
  "esbuild": "^0.28.0",
53
53
  "typescript": "^7.0.2",
54
54
  "vitest": "^4.1.7",
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/chrischall/ofw-mcp",
7
7
  "source": "github"
8
8
  },
9
- "version": "2.6.7",
9
+ "version": "2.7.1",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "ofw-mcp",
14
- "version": "2.6.7",
14
+ "version": "2.7.1",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },
@@ -97,11 +97,12 @@ Always pass `--config ~/.mcporter/mcporter.json` unless a local `config/mcporter
97
97
  | `ofw_get_message(messageId)` | Read a message OR draft body. Cache-first. Ids in the drafts cache return `folder: "drafts"`. ⚠️ Falls through to OFW for unread inbox messages, which marks them as read. |
98
98
  | `ofw_send_message(subject, body, recipientIds[], replyToId?, draftId?, myFileIDs?)` | Send a message. Pass `replyToId` to thread original history. Pass `draftId` to auto-delete the draft after sending. Pass `myFileIDs` (from `ofw_upload_attachment`) to attach files. |
99
99
  | `ofw_get_unread_sent` | Sent messages your co-parent hasn't read yet (from cache). |
100
- | `ofw_list_drafts` | List saved drafts (cache-backed). |
100
+ | `ofw_list_drafts` | List saved drafts (cache-backed). Each draft carries `serverConfirmed` — see [Freshness](#freshness). |
101
101
  | `ofw_save_draft(subject, body, recipientIds?, messageId?, replyToId?, myFileIDs?)` | Create a new draft. Pass `messageId` to **replace** an existing draft: the tool creates a fresh draft and deletes the old one (OFW's update-in-place endpoint silently no-ops). The returned `id` is the NEW id; the response includes a `NOTE` documenting the swap. |
102
102
  | `ofw_delete_draft(messageId)` | Delete a draft. |
103
103
  | `ofw_upload_attachment(path, shareClass?, label?, description?)` | Upload a local file to My Files; returns a fileId to pass into `myFileIDs`. |
104
104
  | `ofw_download_attachment(fileId, inline?, saveTo?, force?)` | Download an attachment. `inline:true` returns bytes as MCP content; default writes to `~/Downloads/ofw-mcp/`. |
105
+ | `ofw_check_freshness(folders?, messageIds?, allowMarkRead?)` | Cheap live check that the cache still matches OFW — one request for folder counts plus one per id, no bodies, no sync. Use before asserting current state. Only probes ids in the drafts cache unless `allowMarkRead:true` (probing others marks inbox messages read). |
105
106
 
106
107
  ### Calendar
107
108
  | Tool | Notes |
@@ -124,6 +125,19 @@ Always pass `--config ~/.mcporter/mcporter.json` unless a local `config/mcporter
124
125
  | `ofw_list_journal_entries(start?, max?)` | 1-based offset; default max 10 |
125
126
  | `ofw_create_journal_entry(title, body)` | Create a new entry |
126
127
 
128
+ ## Freshness
129
+
130
+ Message and draft reads come from a local cache, so **a result can be stale without looking stale**. Every read tool returns a `freshness` block: `staleness` (`fresh`/`unverified`/`stale`), `asOf`, `ageSeconds`, and a `warning` whenever it is not `fresh`. Drafts additionally carry `serverConfirmed`.
131
+
132
+ Rules for using it:
133
+
134
+ - **Never state current state from memory.** If you saved a draft earlier in the session, that is not evidence it still exists unsent now — the user may have sent or deleted it in the web app since.
135
+ - **`serverConfirmed: false` means "remembered, not known."** Do not say a draft "is still sitting unsent" on that basis. Call `ofw_check_freshness(messageIds: [id])` first, or say plainly that you are reporting cached state and give its age.
136
+ - **If `freshness.staleness` is not `fresh`, either re-read or surface the caveat** in your answer. The `warning` string is written to be quotable.
137
+ - OFW does **not** bump a draft's timestamp when it is edited in the web app, which is why freshness is tracked separately and compared by content revision. "Nothing changed" and "we didn't look" are otherwise indistinguishable.
138
+ - A missing folder count in `ofw_sync_messages` output means that folder was **not checked** — it is never "no changes". Check `notRefreshed`.
139
+
140
+
127
141
  ## Workflows
128
142
 
129
143
  **Check inbox:**
@@ -152,3 +166,4 @@ Always pass `--config ~/.mcporter/mcporter.json` unless a local `config/mcporter
152
166
  - **Always confirm before sending messages or deleting anything** — OFW is a legal co-parenting record.
153
167
  - `ofw_get_notifications` updates last-seen status — avoid calling silently in the background.
154
168
  - `ofw_get_message` marks messages read — warn the user if they want to keep something unread.
169
+ - **Do not narrate cached state as present fact.** Check `freshness`/`serverConfirmed` before saying what "is" true on OFW right now, and prefer `ofw_check_freshness` over guessing — it is one cheap call.