ofw-mcp 2.3.2 → 2.4.0
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/LICENSE +21 -0
- package/README.md +42 -22
- package/dist/auth-password.js +7 -2
- package/dist/bundle.js +226 -47
- package/dist/config.js +26 -0
- package/dist/index.js +1 -1
- package/dist/sync.js +68 -9
- package/dist/tools/_shared.js +47 -3
- package/dist/tools/calendar.js +54 -48
- package/dist/tools/expenses.js +17 -13
- package/dist/tools/journal.js +17 -13
- package/dist/tools/messages.js +313 -242
- package/dist/validate.js +35 -0
- package/package.json +5 -1
- package/server.json +8 -2
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
},
|
|
7
7
|
"metadata": {
|
|
8
8
|
"description": "OurFamilyWizard tools for Claude Code",
|
|
9
|
-
"version": "2.
|
|
9
|
+
"version": "2.4.0"
|
|
10
10
|
},
|
|
11
11
|
"plugins": [
|
|
12
12
|
{
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"displayName": "OurFamilyWizard",
|
|
15
15
|
"source": "./",
|
|
16
16
|
"description": "OurFamilyWizard co-parenting tools for Claude — messages, calendar, expenses, and journal via MCP",
|
|
17
|
-
"version": "2.
|
|
17
|
+
"version": "2.4.0",
|
|
18
18
|
"author": {
|
|
19
19
|
"name": "Chris Chall"
|
|
20
20
|
},
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Chris Hall
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# OurFamilyWizard MCP
|
|
2
2
|
|
|
3
|
+
[](https://github.com/chrischall/ofw-mcp/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/ofw-mcp)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
3
7
|
A [Model Context Protocol](https://modelcontextprotocol.io) server that connects Claude to [OurFamilyWizard](https://www.ourfamilywizard.com), giving you natural-language access to your co-parenting messages, calendar, expenses, and journal.
|
|
4
8
|
|
|
5
9
|
> [!WARNING]
|
|
@@ -122,28 +126,44 @@ OFW_USERNAME=you@example.com OFW_PASSWORD=yourpass node dist/index.js
|
|
|
122
126
|
|
|
123
127
|
## Available tools
|
|
124
128
|
|
|
125
|
-
Read-only tools run automatically. Write tools ask for your confirmation first.
|
|
126
|
-
|
|
127
|
-
| Tool | What it does | Permission |
|
|
128
|
-
|
|
129
|
-
| `ofw_get_profile` | Your profile and co-parent info | Auto |
|
|
130
|
-
| `ofw_get_notifications` | Dashboard counts (unread messages, upcoming events, outstanding expenses) | Auto |
|
|
131
|
-
| `ofw_list_message_folders` | Folders with unread counts — **get folder IDs here before listing messages** | Auto |
|
|
132
|
-
| `ofw_list_messages` | Messages in a folder | Auto |
|
|
133
|
-
| `ofw_get_message` | Full content of a single message | Auto |
|
|
134
|
-
| `
|
|
135
|
-
| `
|
|
136
|
-
| `
|
|
137
|
-
| `
|
|
138
|
-
| `
|
|
139
|
-
| `
|
|
140
|
-
| `
|
|
141
|
-
| `
|
|
142
|
-
| `
|
|
143
|
-
| `
|
|
144
|
-
| `
|
|
145
|
-
| `
|
|
146
|
-
| `
|
|
129
|
+
Read-only tools run automatically. Write tools ask for your confirmation first. The *Write mode* column shows the minimum `OFW_WRITE_MODE` a tool needs to be available at all — see [Write protection](#write-protection-ofw_write_mode) below.
|
|
130
|
+
|
|
131
|
+
| Tool | What it does | Permission | Write mode |
|
|
132
|
+
|------|-------------|------------|------------|
|
|
133
|
+
| `ofw_get_profile` | Your profile and co-parent info | Auto | any |
|
|
134
|
+
| `ofw_get_notifications` | Dashboard counts (unread messages, upcoming events, outstanding expenses) | Auto | any |
|
|
135
|
+
| `ofw_list_message_folders` | Folders with unread counts — **get folder IDs here before listing messages** | Auto | any |
|
|
136
|
+
| `ofw_list_messages` | Messages in a folder | Auto | any |
|
|
137
|
+
| `ofw_get_message` | Full content of a single message | Auto | any |
|
|
138
|
+
| `ofw_sync_messages` | Sync messages into the local cache (unread bodies left unfetched to avoid read receipts) | Auto | any |
|
|
139
|
+
| `ofw_get_unread_sent` | Sent messages a recipient hasn't read yet (from local cache) | Auto | any |
|
|
140
|
+
| `ofw_download_attachment` | Download a message attachment to disk (or inline as MCP content) | Auto | any |
|
|
141
|
+
| `ofw_send_message` | Send a message | Confirm | `all` |
|
|
142
|
+
| `ofw_list_drafts` | Draft messages | Auto | any |
|
|
143
|
+
| `ofw_save_draft` | Create or update a draft | Confirm | `drafts` |
|
|
144
|
+
| `ofw_delete_draft` | Delete a draft | Confirm | `drafts` |
|
|
145
|
+
| `ofw_upload_attachment` | Upload a local file to My Files; returns a fileId to attach via `ofw_send_message`/`ofw_save_draft` | Auto | `drafts` |
|
|
146
|
+
| `ofw_list_events` | Calendar events in a date range | Auto | any |
|
|
147
|
+
| `ofw_create_event` | Create a calendar event | Confirm | `all` |
|
|
148
|
+
| `ofw_update_event` | Update a calendar event | Confirm | `all` |
|
|
149
|
+
| `ofw_delete_event` | Delete a calendar event | Confirm | `all` |
|
|
150
|
+
| `ofw_get_expense_totals` | Expense summary totals | Auto | any |
|
|
151
|
+
| `ofw_list_expenses` | Expense history | Auto | any |
|
|
152
|
+
| `ofw_create_expense` | Log a new expense | Confirm | `all` |
|
|
153
|
+
| `ofw_list_journal_entries` | Journal entries | Auto | any |
|
|
154
|
+
| `ofw_create_journal_entry` | Create a journal entry | Confirm | `all` |
|
|
155
|
+
|
|
156
|
+
### Write protection (`OFW_WRITE_MODE`)
|
|
157
|
+
|
|
158
|
+
The "Confirm" permission above is a *hint* to the MCP host — a host configured to auto-approve tools (or a user who clicked "always allow" once) would leave nothing between model output and a sent message. Because OurFamilyWizard is a court-of-record platform, the server also supports a structural gate: set `OFW_WRITE_MODE` in the server's `env` block and tools above your chosen level are **never registered**, so no host setting or prompt-injected instruction can invoke them.
|
|
159
|
+
|
|
160
|
+
| `OFW_WRITE_MODE` | What's available |
|
|
161
|
+
|------------------|------------------|
|
|
162
|
+
| `none` | Read/sync/search only. No write tools exist. |
|
|
163
|
+
| `drafts` | Adds draft-level writes: `ofw_save_draft`, `ofw_delete_draft`, `ofw_upload_attachment`. Nothing that lands on the court-visible record — the AI prepares, only a human signed into the OFW web UI can send. |
|
|
164
|
+
| `all` | Everything (the default — fully backward compatible). |
|
|
165
|
+
|
|
166
|
+
Unrecognized values fail closed to `none`, with a warning on stderr — a typo never silently grants write access.
|
|
147
167
|
|
|
148
168
|
## Troubleshooting
|
|
149
169
|
|
package/dist/auth-password.js
CHANGED
|
@@ -16,8 +16,13 @@ export async function loginWithPassword(username, password) {
|
|
|
16
16
|
headers: { ...OFW_PROTOCOL_HEADERS },
|
|
17
17
|
redirect: 'manual',
|
|
18
18
|
});
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
// headers.get('set-cookie') folds multiple Set-Cookie headers into one
|
|
20
|
+
// comma-joined string; getSetCookie() preserves them individually. Echo
|
|
21
|
+
// every cookie back (name=value only) so login keeps working if OFW ever
|
|
22
|
+
// sets cookies beyond SESSION.
|
|
23
|
+
const sessionCookie = initResponse.headers.getSetCookie()
|
|
24
|
+
.map((c) => c.split(';')[0])
|
|
25
|
+
.join('; ');
|
|
21
26
|
// Step 2: submit the form.
|
|
22
27
|
const response = await fetch(`${BASE_URL}/ofw/login`, {
|
|
23
28
|
method: 'POST',
|