@cpenned/mcp 0.5.0 → 0.6.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/README.md +8 -0
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/strava.js +124 -0
- package/dist/tools/strava.js.map +1 -0
- package/package.json +1 -1
- package/skills/open-brain-mcp/SKILL.md +26 -4
package/README.md
CHANGED
|
@@ -82,6 +82,14 @@ Point the `args` at the absolute `packages/mcp/dist/index.js` path with
|
|
|
82
82
|
independently of status), `delete_reading_item` (true soft delete, hidden
|
|
83
83
|
everywhere; restore with `{deleted: false}`), `add_reading_tags`/
|
|
84
84
|
`remove_reading_tags`.
|
|
85
|
+
- **Strava**: `list_strava_activities`, `get_strava_activity`,
|
|
86
|
+
`update_strava_activity` (`notes`/`archived`/`deleted` only — everything
|
|
87
|
+
else is Strava-authoritative), `delete_strava_activity` (soft delete;
|
|
88
|
+
restore with `{deleted: false}`), `add_strava_activity_tags`/
|
|
89
|
+
`remove_strava_activity_tags`, `sync_strava_activities` (manual
|
|
90
|
+
backfill/fallback; real-time ingestion is a webhook). No create tool —
|
|
91
|
+
activities only arrive via webhook or sync. Requires connecting a Strava
|
|
92
|
+
account first, from the web app's Settings page.
|
|
85
93
|
- **Views & reviews**: `get_view`, `get_reviews`, `review_garden`,
|
|
86
94
|
`request_garden_review`, `mark_task_reviewed`, `mark_project_reviewed`.
|
|
87
95
|
- **Settings**: `get_settings`, `update_settings` — the default review period
|
package/dist/tools/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import { registerPeopleTools } from "./people.js";
|
|
|
6
6
|
import { registerProjectTools } from "./projects.js";
|
|
7
7
|
import { registerReadingTools } from "./reading.js";
|
|
8
8
|
import { registerSettingsTools } from "./settings.js";
|
|
9
|
+
import { registerStravaTools } from "./strava.js";
|
|
9
10
|
import { registerTagTools } from "./tags.js";
|
|
10
11
|
import { registerTaskTools } from "./tasks.js";
|
|
11
12
|
import { registerUiTools } from "./ui.js";
|
|
@@ -17,6 +18,7 @@ export function registerAllTools(server, client) {
|
|
|
17
18
|
registerTagTools(server, client);
|
|
18
19
|
registerPeopleTools(server, client);
|
|
19
20
|
registerReadingTools(server, client);
|
|
21
|
+
registerStravaTools(server, client);
|
|
20
22
|
registerListTools(server, client);
|
|
21
23
|
registerViewTools(server, client);
|
|
22
24
|
registerAiTools(server, client);
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAuB;IACzE,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAuB;IACzE,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// Strava activity tools. Activities are never created here - they're only
|
|
2
|
+
// ingested via webhook or sync_strava_activities (a manual/backfill trigger).
|
|
3
|
+
// Every other field except title/notes/archived/deleted/tags is
|
|
4
|
+
// Strava-authoritative and rejected by update_strava_activity's underlying
|
|
5
|
+
// endpoint if attempted.
|
|
6
|
+
// GPS/speed streams aren't exposed as a tool - they're large binary-ish data
|
|
7
|
+
// meant for the web UI's map, not an agent's context; get_strava_activity
|
|
8
|
+
// exposes hasStreams so an agent can point the user at the web UI to view it.
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { runTool } from "../result.js";
|
|
11
|
+
const listStravaActivitiesSchema = z.object({
|
|
12
|
+
ids: z.array(z.string()).optional(),
|
|
13
|
+
tagIds: z.array(z.string()).optional(),
|
|
14
|
+
type: z.string().optional().describe("Strava activity type, e.g. Run, Ride, Swim"),
|
|
15
|
+
query: z
|
|
16
|
+
.string()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("Case-insensitive substring search over name/notes/tags"),
|
|
19
|
+
limit: z.number().int().positive().optional(),
|
|
20
|
+
includeArchived: z
|
|
21
|
+
.boolean()
|
|
22
|
+
.optional()
|
|
23
|
+
.describe("Include archived activities. Defaults to false"),
|
|
24
|
+
});
|
|
25
|
+
export function listStravaActivities(client, args) {
|
|
26
|
+
return client.get("/v1/strava/activities", {
|
|
27
|
+
ids: args.ids?.length ? args.ids.join(",") : undefined,
|
|
28
|
+
tag: args.tagIds?.length ? args.tagIds.join(",") : undefined,
|
|
29
|
+
type: args.type,
|
|
30
|
+
q: args.query,
|
|
31
|
+
limit: args.limit,
|
|
32
|
+
includeArchived: args.includeArchived,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const getStravaActivitySchema = z.object({ id: z.string() });
|
|
36
|
+
export function getStravaActivity(client, args) {
|
|
37
|
+
return client.get(`/v1/strava/activities/${args.id}`);
|
|
38
|
+
}
|
|
39
|
+
const updateStravaActivitySchema = z.object({
|
|
40
|
+
id: z.string(),
|
|
41
|
+
title: z
|
|
42
|
+
.string()
|
|
43
|
+
.nullable()
|
|
44
|
+
.optional()
|
|
45
|
+
.describe("Overrides the Strava-synced name for display; null reverts to it."),
|
|
46
|
+
notes: z.string().optional(),
|
|
47
|
+
archived: z
|
|
48
|
+
.boolean()
|
|
49
|
+
.optional()
|
|
50
|
+
.describe("Find-later flag; true hides it from the default list (unless includeArchived), false restores it."),
|
|
51
|
+
deleted: z
|
|
52
|
+
.boolean()
|
|
53
|
+
.optional()
|
|
54
|
+
.describe("true deletes (same as delete_strava_activity, hidden everywhere); false restores."),
|
|
55
|
+
});
|
|
56
|
+
export function updateStravaActivity(client, args) {
|
|
57
|
+
const { id, ...patch } = args;
|
|
58
|
+
return client.patch(`/v1/strava/activities/${id}`, patch);
|
|
59
|
+
}
|
|
60
|
+
const deleteStravaActivitySchema = z.object({ id: z.string() });
|
|
61
|
+
export function deleteStravaActivity(client, args) {
|
|
62
|
+
return client.del(`/v1/strava/activities/${args.id}`);
|
|
63
|
+
}
|
|
64
|
+
const stravaActivityTagsSchema = z.object({
|
|
65
|
+
id: z.string(),
|
|
66
|
+
tagIds: z.array(z.string()),
|
|
67
|
+
});
|
|
68
|
+
export function addStravaActivityTags(client, args) {
|
|
69
|
+
return client.post(`/v1/strava/activities/${args.id}/tags`, { tagIds: args.tagIds });
|
|
70
|
+
}
|
|
71
|
+
export function removeStravaActivityTags(client, args) {
|
|
72
|
+
return client.request("DELETE", `/v1/strava/activities/${args.id}/tags`, {
|
|
73
|
+
body: { tagIds: args.tagIds },
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const syncStravaActivitiesSchema = z.object({
|
|
77
|
+
sinceDays: z
|
|
78
|
+
.number()
|
|
79
|
+
.int()
|
|
80
|
+
.positive()
|
|
81
|
+
.optional()
|
|
82
|
+
.describe("Only import activities from the last N days. Omit to sync all history."),
|
|
83
|
+
});
|
|
84
|
+
export function syncStravaActivities(client, args) {
|
|
85
|
+
return client.post("/v1/strava/sync", args);
|
|
86
|
+
}
|
|
87
|
+
export function registerStravaTools(server, client) {
|
|
88
|
+
server.registerTool("list_strava_activities", {
|
|
89
|
+
title: "List Strava activities",
|
|
90
|
+
description: "List Strava activities, multi-get by ids, or filter by tags/type/query. Archived activities are excluded unless includeArchived is set.",
|
|
91
|
+
inputSchema: listStravaActivitiesSchema.shape,
|
|
92
|
+
}, (args) => runTool(() => listStravaActivities(client, args)));
|
|
93
|
+
server.registerTool("get_strava_activity", {
|
|
94
|
+
title: "Get Strava activity",
|
|
95
|
+
description: "Fetch one Strava activity with its tags. Use hasStreams to know whether a GPS/speed map is available in the web UI.",
|
|
96
|
+
inputSchema: getStravaActivitySchema.shape,
|
|
97
|
+
}, (args) => runTool(() => getStravaActivity(client, args)));
|
|
98
|
+
server.registerTool("update_strava_activity", {
|
|
99
|
+
title: "Update Strava activity",
|
|
100
|
+
description: "Update a Strava activity's title (override the synced name; null reverts to it), notes, archived (find-later flag), or deleted. Every other field (distance, etc.) is Strava-authoritative and can't be edited here.",
|
|
101
|
+
inputSchema: updateStravaActivitySchema.shape,
|
|
102
|
+
}, (args) => runTool(() => updateStravaActivity(client, args)));
|
|
103
|
+
server.registerTool("delete_strava_activity", {
|
|
104
|
+
title: "Delete Strava activity",
|
|
105
|
+
description: "Soft-delete a Strava activity (hidden everywhere). Restore with update_strava_activity {deleted: false}.",
|
|
106
|
+
inputSchema: deleteStravaActivitySchema.shape,
|
|
107
|
+
}, (args) => runTool(() => deleteStravaActivity(client, args)));
|
|
108
|
+
server.registerTool("add_strava_activity_tags", {
|
|
109
|
+
title: "Tag Strava activity",
|
|
110
|
+
description: "Attach tags to a Strava activity.",
|
|
111
|
+
inputSchema: stravaActivityTagsSchema.shape,
|
|
112
|
+
}, (args) => runTool(() => addStravaActivityTags(client, args)));
|
|
113
|
+
server.registerTool("remove_strava_activity_tags", {
|
|
114
|
+
title: "Untag Strava activity",
|
|
115
|
+
description: "Detach tags from a Strava activity.",
|
|
116
|
+
inputSchema: stravaActivityTagsSchema.shape,
|
|
117
|
+
}, (args) => runTool(() => removeStravaActivityTags(client, args)));
|
|
118
|
+
server.registerTool("sync_strava_activities", {
|
|
119
|
+
title: "Sync Strava activities",
|
|
120
|
+
description: "Manually pull recent activities from Strava (backfill/fallback alongside the real-time webhook). Capped per call; re-run to continue further back in history.",
|
|
121
|
+
inputSchema: syncStravaActivitiesSchema.shape,
|
|
122
|
+
}, (args) => runTool(() => syncStravaActivities(client, args)));
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=strava.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strava.js","sourceRoot":"","sources":["../../src/tools/strava.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -59,6 +59,17 @@ pre-guessing constraints.
|
|
|
59
59
|
`add_reading_tags`/`remove_reading_tags`; person links live on the person
|
|
60
60
|
side (`add_person_links`/`remove_person_links` with `readingListItemIds`),
|
|
61
61
|
not here.
|
|
62
|
+
- **Strava activity** = a GPS-tracked activity mirrored in from Strava
|
|
63
|
+
(real-time webhook, plus `sync_strava_activities` for backfill/fallback).
|
|
64
|
+
Never created here — every field except `notes`, `archived`, `deleted`, and
|
|
65
|
+
tags is Strava-authoritative and rejected if you try to patch it.
|
|
66
|
+
`detailStatus` (`pending|ready|failed`) tracks the async enrichment fetch;
|
|
67
|
+
`hasStreams` tells you whether a GPS/speed map is available (streams land
|
|
68
|
+
slightly after the summary, so a just-synced activity may briefly show
|
|
69
|
+
`hasStreams: false`). `archived`/`deleted` are independent booleans, same
|
|
70
|
+
reversible semantics as reading list items. GPS/speed stream data itself
|
|
71
|
+
isn't exposed as a tool (too large for an agent's context) — point the user
|
|
72
|
+
at the web UI's activity detail page to see the map.
|
|
62
73
|
|
|
63
74
|
## Tool catalog
|
|
64
75
|
|
|
@@ -91,6 +102,14 @@ pre-guessing constraints.
|
|
|
91
102
|
`archived`/`deleted` toggle independently of status), `delete_reading_item`
|
|
92
103
|
(true soft delete, hidden everywhere; restore with `update_reading_item
|
|
93
104
|
{deleted: false}`), `add_reading_tags`/`remove_reading_tags`.
|
|
105
|
+
- **Strava**: `list_strava_activities` (filter by `tagIds`/`type`/`query`, or
|
|
106
|
+
multi-get via `ids`; archived excluded unless `includeArchived`),
|
|
107
|
+
`get_strava_activity`, `update_strava_activity` (`notes`/`archived`/
|
|
108
|
+
`deleted` only), `delete_strava_activity` (soft delete; restore with
|
|
109
|
+
`update_strava_activity {deleted: false}`),
|
|
110
|
+
`add_strava_activity_tags`/`remove_strava_activity_tags`,
|
|
111
|
+
`sync_strava_activities` (manual backfill; optional `sinceDays`; capped per
|
|
112
|
+
call — re-run to pull further back in history).
|
|
94
113
|
- **Saved lists** (named, reusable task-list filters): `list_saved_lists`,
|
|
95
114
|
`create_saved_list`, `update_saved_list`, `delete_saved_list`.
|
|
96
115
|
- **Views & reviews**: `get_view` (today/upcoming/overdue, timezone-aware),
|
|
@@ -173,10 +192,13 @@ pre-guessing constraints.
|
|
|
173
192
|
from the web app's Settings page, not `apiKeys:bootstrap`.
|
|
174
193
|
- Scopes gate tools: resource tools need `<resource>:read|write` (people tools
|
|
175
194
|
`people:read|write`, settings tools `settings:read|write`, reading list tools
|
|
176
|
-
`reading:read|write`), review tools
|
|
177
|
-
`ai:invoke`, the `*_key` tools
|
|
178
|
-
|
|
179
|
-
unless they hold `*`.
|
|
195
|
+
`reading:read|write`, Strava tools `strava:read|write`), review tools
|
|
196
|
+
`reviews:*`, `find_tasks`/`ai_triage` need `ai:invoke`, the `*_key` tools
|
|
197
|
+
need `keys:manage`. A missing scope returns a 403 tool error. Keys minted
|
|
198
|
+
before a feature shipped won't carry its scope unless they hold `*`.
|
|
199
|
+
- `sync_strava_activities` requires a Strava account already connected (via
|
|
200
|
+
the web UI's Settings page) — it does nothing useful if nobody has
|
|
201
|
+
authorized the app yet.
|
|
180
202
|
- `create_reading_item`'s title/description fetch is best-effort and
|
|
181
203
|
asynchronous — a failed fetch (unreachable page, timeout, non-HTML response)
|
|
182
204
|
silently leaves the item with its URL as the title; this is expected, not a
|