@bli-cockpit/mcp 0.1.13 → 0.1.15
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/dist/cal-tools.js +13 -5
- package/dist/tool-result.d.ts +11 -0
- package/dist/tool-result.js +11 -0
- package/package.json +1 -1
package/dist/cal-tools.js
CHANGED
|
@@ -42,8 +42,9 @@ function localZone() {
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
function eventLine(event) {
|
|
45
|
+
const days = Math.max(1, Math.round((Date.parse(event.ends_at) - Date.parse(event.starts_at)) / 86_400_000));
|
|
45
46
|
const when = event.all_day
|
|
46
|
-
? `${event.starts_at.slice(0, 10)} (all day)`
|
|
47
|
+
? `${event.starts_at.slice(0, 10)} (all day${days > 1 ? ` ×${days}d` : ""})`
|
|
47
48
|
: `${event.starts_at.slice(0, 16).replace("T", " ")}–${event.ends_at.slice(11, 16)}`;
|
|
48
49
|
const where = event.location ? ` @ ${event.location}` : "";
|
|
49
50
|
const who = event.attendee_count > 0 ? ` (${event.attendee_count} attendees)` : "";
|
|
@@ -181,7 +182,8 @@ export function registerCalTools(server, deps) {
|
|
|
181
182
|
all_day: z.boolean().optional(),
|
|
182
183
|
time_zone: z.string().min(1).max(80).optional(),
|
|
183
184
|
attendees: z.array(z.string().email()).max(100).optional(),
|
|
184
|
-
|
|
185
|
+
meet: z.boolean().optional().describe("Attach a Google Meet room (BLI-3810). If Google refuses, the event is still created and the answer says meet_not_available."),
|
|
186
|
+
confirm: CONFIRM_INPUT,
|
|
185
187
|
},
|
|
186
188
|
}, async (args) => withSession(deps, async (session) => {
|
|
187
189
|
const refusal = unconfirmed(args, `This would create "${String(args.title)}" and email every attendee from Google.`);
|
|
@@ -195,13 +197,19 @@ export function registerCalTools(server, deps) {
|
|
|
195
197
|
...(args.location ? { location: args.location } : {}),
|
|
196
198
|
...(args.all_day === true ? { all_day: true } : {}),
|
|
197
199
|
...(Array.isArray(args.attendees) && args.attendees.length > 0 ? { attendees: args.attendees } : {}),
|
|
200
|
+
...(args.meet === true ? { meet: true } : {}),
|
|
198
201
|
time_zone: args.time_zone ?? localZone(),
|
|
199
202
|
});
|
|
200
203
|
if (!response.ok)
|
|
201
204
|
return errorResult(doorFailureText("cal_create", response));
|
|
202
205
|
const event = response.body.event;
|
|
203
206
|
return textResult(`Created "${event?.title ?? String(args.title)}" at ${event?.starts_at ?? String(args.starts_at)}.`
|
|
204
|
-
+ (event?.html_link ? `\n${event.html_link}` : "")
|
|
207
|
+
+ (event?.html_link ? `\n${event.html_link}` : "")
|
|
208
|
+
+ (args.meet === true
|
|
209
|
+
? event?.meet_link
|
|
210
|
+
? `\nGoogle Meet: ${event.meet_link}`
|
|
211
|
+
: "\nGoogle did not attach a Meet room (meet_not_available); the event exists without one."
|
|
212
|
+
: ""), { event });
|
|
205
213
|
}));
|
|
206
214
|
register("cal_share", {
|
|
207
215
|
title: "Share a calendar with the org, or take it back",
|
|
@@ -211,7 +219,7 @@ export function registerCalTools(server, deps) {
|
|
|
211
219
|
inputSchema: {
|
|
212
220
|
calendar_id: z.string().uuid(),
|
|
213
221
|
org_visible: z.boolean(),
|
|
214
|
-
|
|
222
|
+
confirm: CONFIRM_INPUT,
|
|
215
223
|
},
|
|
216
224
|
}, async (args) => withSession(deps, async (session) => {
|
|
217
225
|
const refusal = unconfirmed(args, args.org_visible === true
|
|
@@ -251,7 +259,7 @@ export function registerCalTools(server, deps) {
|
|
|
251
259
|
title: "Detach a calendar",
|
|
252
260
|
description: "Removes a calendar and its stored events from Tower. The calendar itself is untouched at Google — this only "
|
|
253
261
|
+ "forgets it here. Requires confirm: true.",
|
|
254
|
-
inputSchema: { calendar_id: z.string().uuid(),
|
|
262
|
+
inputSchema: { calendar_id: z.string().uuid(), confirm: CONFIRM_INPUT },
|
|
255
263
|
}, async (args) => withSession(deps, async (session) => {
|
|
256
264
|
const refusal = unconfirmed(args, "This would detach that calendar and forget its stored events (the calendar itself is untouched at Google).");
|
|
257
265
|
if (refusal)
|
package/dist/tool-result.d.ts
CHANGED
|
@@ -81,6 +81,17 @@ export declare function queryString(params: URLSearchParams): string;
|
|
|
81
81
|
* `confirmation_required`, so a script branching on it reads the same word
|
|
82
82
|
* from either door.
|
|
83
83
|
*/
|
|
84
|
+
/**
|
|
85
|
+
* The `confirm` FIELD's schema, used as `confirm: CONFIRM_INPUT` inside a
|
|
86
|
+
* tool's `inputSchema`. It is a schema, not a shape: NEVER spread it
|
|
87
|
+
* (`...CONFIRM_INPUT`). Three calendar tools did, which spread the schema's own
|
|
88
|
+
* enumerable members (`def`, `type`, `unwrap`, …) into the shape as if they
|
|
89
|
+
* were fields; the SDK's 1.30 `objectFromShape` refuses a shape that mixes
|
|
90
|
+
* Zod schemas with non-schemas ("Mixed Zod versions detected"), so the
|
|
91
|
+
* published server exited at startup on every fleet machine the moment npm
|
|
92
|
+
* resolved `@modelcontextprotocol/sdk` 1.30 (QA tick 20, 2026-09-06).
|
|
93
|
+
* `server.test.ts` walks every registered tool's shape for exactly this.
|
|
94
|
+
*/
|
|
84
95
|
export declare const CONFIRM_INPUT: z.ZodOptional<z.ZodBoolean>;
|
|
85
96
|
/** `null` when the caller confirmed; the refusal itself when they did not. */
|
|
86
97
|
export declare function unconfirmed(args: Record<string, unknown>, sentence: string): ToolResult | null;
|
package/dist/tool-result.js
CHANGED
|
@@ -93,6 +93,17 @@ export function queryString(params) {
|
|
|
93
93
|
* `confirmation_required`, so a script branching on it reads the same word
|
|
94
94
|
* from either door.
|
|
95
95
|
*/
|
|
96
|
+
/**
|
|
97
|
+
* The `confirm` FIELD's schema, used as `confirm: CONFIRM_INPUT` inside a
|
|
98
|
+
* tool's `inputSchema`. It is a schema, not a shape: NEVER spread it
|
|
99
|
+
* (`...CONFIRM_INPUT`). Three calendar tools did, which spread the schema's own
|
|
100
|
+
* enumerable members (`def`, `type`, `unwrap`, …) into the shape as if they
|
|
101
|
+
* were fields; the SDK's 1.30 `objectFromShape` refuses a shape that mixes
|
|
102
|
+
* Zod schemas with non-schemas ("Mixed Zod versions detected"), so the
|
|
103
|
+
* published server exited at startup on every fleet machine the moment npm
|
|
104
|
+
* resolved `@modelcontextprotocol/sdk` 1.30 (QA tick 20, 2026-09-06).
|
|
105
|
+
* `server.test.ts` walks every registered tool's shape for exactly this.
|
|
106
|
+
*/
|
|
96
107
|
export const CONFIRM_INPUT = z
|
|
97
108
|
.boolean()
|
|
98
109
|
.optional()
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bli-cockpit/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.15",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "bli-tower \u2014 an MCP server over BLI Cockpit's agent doors: JARVIS (jarvis_*), documents (docs_*), channels (msg_*), issues (work_*), the daily page (brief_*), meeting notes (notes_*), the ops board (ops_status/slack_*), settings/team/model, Scout and the workbook, plus the legacy event-stream tools (emit_event, get_ticket_timeline, get_active_tickets).",
|
|
6
6
|
"type": "module",
|