ofw-mcp 1.2.0 → 1.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 +28 -0
- package/.claude-plugin/plugin.json +15 -0
- package/.mcp.json +12 -0
- package/dist/client.js +2 -1
- package/dist/tools/messages.js +1 -1
- package/package.json +5 -2
- package/skills/ofw/SKILL.md +148 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "chrischall",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "Chris Chall",
|
|
5
|
+
"email": "chris.c.hall@gmail.com"
|
|
6
|
+
},
|
|
7
|
+
"metadata": {
|
|
8
|
+
"description": "OurFamilyWizard tools for Claude Code",
|
|
9
|
+
"version": "1.4.0"
|
|
10
|
+
},
|
|
11
|
+
"plugins": [
|
|
12
|
+
{
|
|
13
|
+
"name": "ofw",
|
|
14
|
+
"displayName": "OurFamilyWizard",
|
|
15
|
+
"source": "./",
|
|
16
|
+
"description": "OurFamilyWizard co-parenting tools for Claude — messages, calendar, expenses, and journal via MCP",
|
|
17
|
+
"version": "1.4.0",
|
|
18
|
+
"author": {
|
|
19
|
+
"name": "Chris Chall"
|
|
20
|
+
},
|
|
21
|
+
"homepage": "https://github.com/chrischall/ofw-mcp",
|
|
22
|
+
"repository": "https://github.com/chrischall/ofw-mcp",
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"keywords": ["ofw", "coparenting", "ourFamilyWizard", "mcp", "family"],
|
|
25
|
+
"category": "productivity"
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ofw",
|
|
3
|
+
"displayName": "OurFamilyWizard",
|
|
4
|
+
"version": "1.4.0",
|
|
5
|
+
"description": "OurFamilyWizard co-parenting tools for Claude — messages, calendar, expenses, and journal via MCP",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Chris Chall"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/chrischall/ofw-mcp",
|
|
10
|
+
"repository": "https://github.com/chrischall/ofw-mcp",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": ["ofw", "coparenting", "ourFamilyWizard", "mcp", "family"],
|
|
13
|
+
"skills": "./skills/",
|
|
14
|
+
"mcp": "./.mcp.json"
|
|
15
|
+
}
|
package/.mcp.json
ADDED
package/dist/client.js
CHANGED
|
@@ -48,7 +48,8 @@ export class OFWClient {
|
|
|
48
48
|
if (!response.ok) {
|
|
49
49
|
throw new Error(`OFW API error: ${response.status} ${response.statusText} for ${method} ${path}`);
|
|
50
50
|
}
|
|
51
|
-
|
|
51
|
+
const text = await response.text();
|
|
52
|
+
return (text ? JSON.parse(text) : null);
|
|
52
53
|
}
|
|
53
54
|
async ensureAuthenticated() {
|
|
54
55
|
if (!this.isTokenExpiredSoon())
|
package/dist/tools/messages.js
CHANGED
|
@@ -140,7 +140,7 @@ export async function handleTool(name, args, client) {
|
|
|
140
140
|
form.append('messageIds', String(draftId));
|
|
141
141
|
await client.request('DELETE', '/pub/v1/messages', form);
|
|
142
142
|
}
|
|
143
|
-
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
143
|
+
return { content: [{ type: 'text', text: data ? JSON.stringify(data, null, 2) : 'Message sent successfully.' }] };
|
|
144
144
|
}
|
|
145
145
|
case 'ofw_list_drafts': {
|
|
146
146
|
const { page = 1, size = 50 } = args;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ofw-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "OurFamilyWizard MCP server for Claude — developed and maintained by AI (Claude Sonnet 4.6)",
|
|
5
5
|
"author": "Claude Sonnet 4.6 (AI) <https://www.anthropic.com/claude>",
|
|
6
6
|
"repository": {
|
|
@@ -12,7 +12,10 @@
|
|
|
12
12
|
"ofw-mcp": "dist/index.js"
|
|
13
13
|
},
|
|
14
14
|
"files": [
|
|
15
|
-
"dist"
|
|
15
|
+
"dist",
|
|
16
|
+
".claude-plugin",
|
|
17
|
+
"skills",
|
|
18
|
+
".mcp.json"
|
|
16
19
|
],
|
|
17
20
|
"scripts": {
|
|
18
21
|
"build": "tsc",
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ofw-mcp
|
|
3
|
+
description: This skill should be used when the user asks about OurFamilyWizard (OFW) co-parenting data. Triggers on phrases like "check OFW", "OurFamilyWizard inbox", "OFW messages", "OFW calendar", "OFW expenses", "what did my co-parent say", "log an expense in OFW", "OFW journal", or any request involving co-parenting messages, calendar events, shared expenses, or journal entries.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ofw-mcp
|
|
7
|
+
|
|
8
|
+
MCP server for OurFamilyWizard — provides read/write access to messages, calendar, expenses, and journal.
|
|
9
|
+
|
|
10
|
+
- **npm:** [npmjs.com/package/ofw-mcp](https://www.npmjs.com/package/ofw-mcp)
|
|
11
|
+
- **Source:** [github.com/chrischall/ofw-mcp](https://github.com/chrischall/ofw-mcp)
|
|
12
|
+
|
|
13
|
+
## Setup
|
|
14
|
+
|
|
15
|
+
### Option A — Claude Code (direct MCP, no mcporter)
|
|
16
|
+
|
|
17
|
+
Add to `.mcp.json` in your project or `~/.claude/mcp.json`:
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"mcpServers": {
|
|
22
|
+
"ofw": {
|
|
23
|
+
"command": "npx",
|
|
24
|
+
"args": ["-y", "ofw-mcp"],
|
|
25
|
+
"env": {
|
|
26
|
+
"OFW_USERNAME": "you@example.com",
|
|
27
|
+
"OFW_PASSWORD": "yourpassword"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Option B — mcporter
|
|
35
|
+
|
|
36
|
+
#### 1. Install
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm install -g ofw-mcp
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Or from source:
|
|
43
|
+
```bash
|
|
44
|
+
git clone https://github.com/chrischall/ofw-mcp
|
|
45
|
+
cd ofw-mcp
|
|
46
|
+
npm install && npm run build
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
#### 2. Configure credentials
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
cp .env.example .env
|
|
53
|
+
# Edit .env: set OFW_USERNAME and OFW_PASSWORD
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
#### 3. Register with mcporter
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
mcporter config add ofw \
|
|
60
|
+
--command "ofw-mcp" \
|
|
61
|
+
--env "OFW_USERNAME=you@example.com" \
|
|
62
|
+
--env "OFW_PASSWORD=yourpassword" \
|
|
63
|
+
--config ~/.mcporter/mcporter.json
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
#### 4. Verify
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
mcporter list --config ~/.mcporter/mcporter.json
|
|
70
|
+
mcporter call ofw.ofw_get_profile --config ~/.mcporter/mcporter.json
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Calling tools (mcporter)
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
mcporter call ofw.<tool_name> [key=value ...] --config ~/.mcporter/mcporter.json
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Always pass `--config ~/.mcporter/mcporter.json` unless a local `config/mcporter.json` exists.
|
|
80
|
+
|
|
81
|
+
## Tools
|
|
82
|
+
|
|
83
|
+
### User
|
|
84
|
+
| Tool | Description |
|
|
85
|
+
|------|-------------|
|
|
86
|
+
| `ofw_get_profile` | Current user + co-parent info (IDs, contact details) |
|
|
87
|
+
| `ofw_get_notifications` | Dashboard summary: unread count, upcoming events, outstanding expenses. ⚠️ Updates last-seen status. |
|
|
88
|
+
|
|
89
|
+
### Messages
|
|
90
|
+
| Tool | Notes |
|
|
91
|
+
|------|-------|
|
|
92
|
+
| `ofw_list_message_folders` | Get folder IDs (inbox, sent, etc.) — call this first |
|
|
93
|
+
| `ofw_list_messages(folderId)` | List messages in a folder |
|
|
94
|
+
| `ofw_get_message(messageId)` | Read a message. ⚠️ Marks unread messages as read. |
|
|
95
|
+
| `ofw_send_message(subject, body, recipientIds[], replyToId?, draftId?)` | Send a message. Pass `replyToId` to thread the original message history (like email reply). Pass `draftId` to auto-delete the draft after sending. |
|
|
96
|
+
| `ofw_list_drafts` | List saved drafts |
|
|
97
|
+
| `ofw_save_draft(subject, body, recipientIds?, messageId?, replyToId?)` | Create or update a draft |
|
|
98
|
+
| `ofw_delete_draft(messageId)` | Delete a draft |
|
|
99
|
+
|
|
100
|
+
### Calendar
|
|
101
|
+
| Tool | Notes |
|
|
102
|
+
|------|-------|
|
|
103
|
+
| `ofw_list_events(startDate, endDate, detailed?)` | Dates as `YYYY-MM-DD` |
|
|
104
|
+
| `ofw_create_event(title, startDate, endDate, ...)` | `startDate`/`endDate` as ISO datetime |
|
|
105
|
+
| `ofw_update_event(eventId, ...)` | Partial update — only pass fields to change |
|
|
106
|
+
| `ofw_delete_event(eventId)` | Permanent delete |
|
|
107
|
+
|
|
108
|
+
### Expenses
|
|
109
|
+
| Tool | Notes |
|
|
110
|
+
|------|-------|
|
|
111
|
+
| `ofw_get_expense_totals` | Summary of owed/paid totals |
|
|
112
|
+
| `ofw_list_expenses(start?, max?)` | Paginated; default max 20 |
|
|
113
|
+
| `ofw_create_expense(amount, description)` | Log a new expense |
|
|
114
|
+
|
|
115
|
+
### Journal
|
|
116
|
+
| Tool | Notes |
|
|
117
|
+
|------|-------|
|
|
118
|
+
| `ofw_list_journal_entries(start?, max?)` | 1-based offset; default max 10 |
|
|
119
|
+
| `ofw_create_journal_entry(title, body)` | Create a new entry |
|
|
120
|
+
|
|
121
|
+
## Workflows
|
|
122
|
+
|
|
123
|
+
**Check inbox:**
|
|
124
|
+
1. `ofw_list_message_folders` → find inbox folder ID
|
|
125
|
+
2. `ofw_list_messages(folderId)` → list messages
|
|
126
|
+
3. `ofw_get_message(messageId)` → read a specific message
|
|
127
|
+
|
|
128
|
+
**Send a message:**
|
|
129
|
+
1. `ofw_get_profile` → get co-parent's user ID
|
|
130
|
+
2. `ofw_send_message(subject, body, [coParentId])`
|
|
131
|
+
|
|
132
|
+
**Reply to a message (with thread history):**
|
|
133
|
+
1. `ofw_get_message(messageId)` → read the message to reply to
|
|
134
|
+
2. `ofw_send_message(subject, body, [coParentId], replyToId: messageId)` — original message is included in the thread
|
|
135
|
+
|
|
136
|
+
**Draft before sending (sensitive messages):**
|
|
137
|
+
1. `ofw_save_draft(subject, body)` → review with user
|
|
138
|
+
2. `ofw_send_message(..., draftId)` after approval — draft is auto-deleted on send
|
|
139
|
+
|
|
140
|
+
**Check what's coming up:**
|
|
141
|
+
- `ofw_get_notifications` for a quick summary
|
|
142
|
+
- `ofw_list_events(today, +30days)` for calendar detail
|
|
143
|
+
|
|
144
|
+
## Caution
|
|
145
|
+
|
|
146
|
+
- **Always confirm before sending messages or deleting anything** — OFW is a legal co-parenting record.
|
|
147
|
+
- `ofw_get_notifications` updates last-seen status — avoid calling silently in the background.
|
|
148
|
+
- `ofw_get_message` marks messages read — warn the user if they want to keep something unread.
|