@tiongcreative/assistant-mcp 0.0.0-stage → 0.1.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/CHANGELOG.md +23 -0
- package/LICENSE +21 -0
- package/README.md +66 -2
- package/package.json +64 -4
- package/src/apps/client-manager.js +623 -0
- package/src/apps/due-again.js +384 -0
- package/src/apps/gift-keeper.js +427 -0
- package/src/apps/lists-and-notes.js +166 -0
- package/src/connection.js +115 -0
- package/src/dates.js +18 -0
- package/src/index.js +116 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.1.0] - 2026-10-18
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- Gift Keeper dates came out a day early east of UTC: the occasion date is local midnight as an ISO timestamp and was cut to its UTC day; it is now formatted in local time (found on real data, 2026-10-18)
|
|
8
|
+
- `package.json` version set back to 0.1.0: a Gift Keeper version bump had been run in this folder by mistake and committed as 1.3.0; nothing was published under that number
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- MCP server over stdio (`src/index.js`) for Claude Desktop and Claude Code, with tools `whats_on` (upcoming items across every available app), `open_app` (opens an app only after the user agrees), and Due Again tools `due_again_items`, `due_again_history`, `due_again_add_item` (category given by name; a miss returns the category list) and `due_again_complete`.
|
|
13
|
+
- Gift Keeper reads `gift_keeper_ideas` (the ideas pool, including ideas not tied to an occasion) and `gift_keeper_gifts` (every tracked gift by stage), both filterable by person. Found in use: asking what gifts were available only showed gifts already attached to an occasion.
|
|
14
|
+
- Change tools so every app can be edited, not only added to: Due Again `update_item`, `reschedule`, `skip`; Gift Keeper `update_gift`, `add_person`, `add_occasion`, `complete_occasion`; Client Manager `add_client`, `add_job`, `update_job`. Each returns the changed record and refuses a call with nothing to change.
|
|
15
|
+
- Tools are registered only for apps installed on this Mac (app bundle in Applications, or a data folder), checked at start-up. An installed app with the switch off still says so; an app the user does not have is simply absent, so the assistant never tells them to enable it. `whats_on` says which apps it works with when none are installed.
|
|
16
|
+
- Client Manager: `client_manager_update_task` (move the due date, change status, edit title or notes) and `client_manager_update_reminder` (complete, snooze, move or edit; completing a recurring reminder lets the app create the next one). Found in use: the assistant could add a task but not move an overdue one to today.
|
|
17
|
+
- Lists & Notes tools, read-only: `lists_and_notes_lists` (all lists, or one by name with its items), `lists_and_notes_notes` (search titles, previews, summaries and tags) and `lists_and_notes_note` (the full markdown of one note by title). End-to-end test against a real Lists & Notes server.
|
|
18
|
+
- Client Manager tools: `client_manager_reminders`, `client_manager_tasks`, `client_manager_invoices` (with totals and balance from `?totals=1`), `client_manager_client`, `client_manager_add_reminder`, `client_manager_add_task`, `client_manager_log_activity`; reminders, dated tasks and invoices owing appear in `whats_on`. End-to-end test against a real Client Manager server. Apps may name their token file (`tokenFile`) when it is not under `local_data`.
|
|
19
|
+
- Gift Keeper tools: `gift_keeper_upcoming`, `gift_keeper_people`, `gift_keeper_add_idea` (person given by name; a miss returns the people list) and `gift_keeper_mark_gift_given`; Gift Keeper occasions appear in `whats_on`. End-to-end test against a real Gift Keeper server (`tests/gift-keeper.test.js`).
|
|
20
|
+
- App discovery and auth (`src/connection.js`): reads each app's per-launch `local_data/assistant.json` (port, pid, token) under `~/Library/Application Support` (or `TC_DATA_ROOT`), checks the process and `/api/health`, and calls the app's API on 127.0.0.1 with a Bearer token; no network listener of its own.
|
|
21
|
+
- Tests: `tests/due-again.test.js` runs a real Due Again server on a temp data folder and drives this server through the SDK stdio client (tool listing, not-enabled state, reads, a completion, the app's validation error, revocation); `tests/dates.test.js`.
|
|
22
|
+
- Release workflow (`.github/workflows/publish.yml`): on a `v*` tag, validates, tests and publishes to npm through trusted publishing with automatic provenance; the tag must match `package.json`. `publishConfig.access` set to public for the scoped name.
|
|
23
|
+
- Project scaffold from build-policy (CI, husky, allowlist, lint, prettier), MIT licence.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 David Tiong (Tiong Creative)
|
|
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,3 +1,67 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Tiong Creative assistant (MCP server)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Lets an AI assistant on your Mac, such as Claude Desktop, use your Tiong Creative apps while
|
|
4
|
+
they are open. Ask "what's on this month" and it reads Due Again, Gift Keeper, Client Manager and Lists & Notes; say "mark the car insurance
|
|
5
|
+
done" and Due Again records it and works out the next date, the same as if you had clicked.
|
|
6
|
+
|
|
7
|
+
It only works with the apps, and only while each app has **Settings → Assistant → Allow
|
|
8
|
+
assistant access** turned on. With it off, or the app closed, the assistant is told so and
|
|
9
|
+
nothing else happens.
|
|
10
|
+
|
|
11
|
+
## Apps
|
|
12
|
+
|
|
13
|
+
| App | Reads | Changes |
|
|
14
|
+
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
|
|
15
|
+
| Due Again 1.1.0 or later | items with status and next due date, an item's history | add an item, record that an item was done |
|
|
16
|
+
| Gift Keeper 1.3.0 or later | people with interests, sizes and preferences; upcoming occasions with budget, spend and whether a gift is chosen | add a gift idea for a person, mark a gift as given |
|
|
17
|
+
| Client Manager 1.6.0 or later | pending reminders, open tasks, invoices owing with totals and balance, one client with their jobs | add a client, a job, a reminder or a task, change a job, task or reminder, log an activity |
|
|
18
|
+
| Lists & Notes 1.22.0 or later | lists with their items, notes with previews, the full text of a note | nothing yet |
|
|
19
|
+
|
|
20
|
+
More apps follow, and the assistant can also open an app for you, but only after you agree.
|
|
21
|
+
|
|
22
|
+
## Setup
|
|
23
|
+
|
|
24
|
+
You need Node.js 20 or later and Claude Desktop. Add this to Claude Desktop's config file
|
|
25
|
+
(Settings → Developer → Edit Config), then restart Claude Desktop:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"mcpServers": {
|
|
30
|
+
"tiongcreative": {
|
|
31
|
+
"command": "npx",
|
|
32
|
+
"args": ["-y", "@tiongcreative/assistant-mcp"]
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
In each app, turn on **Allow assistant access** in Settings. Open the app, then ask Claude
|
|
39
|
+
what's on. The assistant only offers tools for the apps installed on your Mac, checked when it
|
|
40
|
+
starts, so after installing another app restart Claude Desktop once.
|
|
41
|
+
|
|
42
|
+
For Claude Code: `claude mcp add tiongcreative -- npx -y @tiongcreative/assistant-mcp`.
|
|
43
|
+
|
|
44
|
+
## How it stays on your Mac
|
|
45
|
+
|
|
46
|
+
- The server opens no network connection of its own. It talks to each app on 127.0.0.1 only.
|
|
47
|
+
- While assistant access is on, the app writes a small file in its own data folder holding its
|
|
48
|
+
port and a token made fresh for that launch, readable only by your user account. The server
|
|
49
|
+
reads it and sends the token with each request. The file is removed when you turn the setting
|
|
50
|
+
off or quit the app, so there is nothing to copy or store.
|
|
51
|
+
- What the assistant reads goes to whichever AI service it uses. Turn access on only for an
|
|
52
|
+
assistant you trust.
|
|
53
|
+
- The package holds no secrets and never contacts tiongcreative.com.au.
|
|
54
|
+
|
|
55
|
+
## Development
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm install
|
|
59
|
+
npm test # needs ../due-again checked out: runs its server on a temp data folder
|
|
60
|
+
npm run validate
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Registering a local checkout with Claude Code: `claude mcp add tiongcreative -- node /path/to/src/index.js`.
|
|
64
|
+
|
|
65
|
+
## Licence
|
|
66
|
+
|
|
67
|
+
Released under the MIT licence.
|
package/package.json
CHANGED
|
@@ -1,6 +1,66 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tiongcreative/assistant-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server that lets an AI assistant on your Mac use your Tiong Creative apps while they are open.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"tiongcreative-assistant-mcp": "src/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"src",
|
|
11
|
+
"README.md",
|
|
12
|
+
"LICENSE",
|
|
13
|
+
"CHANGELOG.md"
|
|
14
|
+
],
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=20"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"start": "node src/index.js",
|
|
20
|
+
"test": "npm run test:unit && npm run test:integration",
|
|
21
|
+
"lint": "eslint . --max-warnings 0",
|
|
22
|
+
"lint:fix": "eslint . --fix",
|
|
23
|
+
"format": "prettier --write .",
|
|
24
|
+
"format:check": "prettier --check .",
|
|
25
|
+
"security": "npm audit --audit-level=high --omit=dev",
|
|
26
|
+
"sast": "semgrep scan --config auto --error --quiet --exclude-rule javascript.lang.security.audit.path-traversal.path-join-resolve-traversal.path-join-resolve-traversal --exclude-rule javascript.express.security.audit.express-path-join-resolve-traversal.express-path-join-resolve-traversal --exclude-rule javascript.express.security.audit.express-res-sendfile.express-res-sendfile --exclude-rule javascript.express.security.audit.remote-property-injection.remote-property-injection --exclude-rule html.security.audit.missing-integrity.missing-integrity",
|
|
27
|
+
"secrets": "betterleaks git . --redact",
|
|
28
|
+
"secrets:staged": "betterleaks git --staged --redact",
|
|
29
|
+
"licenses": "license-checker --production --failOn 'GPL-2.0;GPL-3.0;AGPL-1.0;AGPL-3.0' --summary",
|
|
30
|
+
"licenses:file": "license-checker --production --relativeLicensePath | sed -e \"s|$PWD/||g\" -e \"s|$PWD|.|g\" > THIRD-PARTY-LICENSES.txt",
|
|
31
|
+
"deps:check": "node ../build-policy/scripts/check-allowlist.js .",
|
|
32
|
+
"deps:verify": "node ../build-policy/scripts/verify-package.js",
|
|
33
|
+
"review": "coderabbit review --agent --include-untracked",
|
|
34
|
+
"prepare": "husky",
|
|
35
|
+
"validate": "npm run lint && npm run format:check",
|
|
36
|
+
"quality": "npm run validate && npm run sast && npm run security && npm run secrets && npm run licenses && npm run deps:check && npm run review",
|
|
37
|
+
"test:unit": "node --test tests/dates.test.js",
|
|
38
|
+
"test:integration": "node --test tests/due-again.test.js tests/gift-keeper.test.js tests/client-manager.test.js tests/lists-and-notes.test.js"
|
|
39
|
+
},
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@modelcontextprotocol/sdk": "^1.32.1",
|
|
43
|
+
"zod": "^4.6.7"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@eslint/js": "^9.27.0",
|
|
47
|
+
"eslint": "^9.27.0",
|
|
48
|
+
"eslint-plugin-security": "^3.0.1",
|
|
49
|
+
"husky": "^9.1.7",
|
|
50
|
+
"license-checker": "^25.0.1",
|
|
51
|
+
"prettier": "^3.5.3"
|
|
52
|
+
},
|
|
53
|
+
"repository": {
|
|
54
|
+
"type": "git",
|
|
55
|
+
"url": "git+https://github.com/davettt/assistant-mcp.git"
|
|
56
|
+
},
|
|
57
|
+
"keywords": [
|
|
58
|
+
"mcp",
|
|
59
|
+
"claude",
|
|
60
|
+
"tiongcreative",
|
|
61
|
+
"due-again"
|
|
62
|
+
],
|
|
63
|
+
"publishConfig": {
|
|
64
|
+
"access": "public"
|
|
65
|
+
}
|
|
66
|
+
}
|