@chrischall/pickuppatrol-mcp 1.1.4 → 1.2.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/README.md +4 -2
- package/dist/bundle.js +32 -4
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
- package/server.json +2 -2
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
},
|
|
7
7
|
"metadata": {
|
|
8
8
|
"description": "PickUp Patrol school-dismissal tools for Claude Code",
|
|
9
|
-
"version": "1.
|
|
9
|
+
"version": "1.2.0"
|
|
10
10
|
},
|
|
11
11
|
"plugins": [
|
|
12
12
|
{
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"displayName": "PickUp Patrol",
|
|
15
15
|
"source": "./",
|
|
16
16
|
"description": "Read and change your children's school dismissal plans in PickUp Patrol — defaults, day-by-day changes and school cutoff times — via MCP",
|
|
17
|
-
"version": "1.
|
|
17
|
+
"version": "1.2.0",
|
|
18
18
|
"author": {
|
|
19
19
|
"name": "Chris Chall"
|
|
20
20
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pickuppatrol",
|
|
3
3
|
"displayName": "PickUp Patrol",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.2.0",
|
|
5
5
|
"description": "Read and change your children's school dismissal plans in PickUp Patrol — defaults, day-by-day changes and school cutoff times — via MCP",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Chris Chall"
|
package/README.md
CHANGED
|
@@ -61,7 +61,8 @@ and only reports the configuration error on the first tool call.
|
|
|
61
61
|
| `pup_healthcheck` | Credentials sign in and the API answers; on failure, `error.kind` says which hop broke (`edge_blocked`, `credential_rejected`, …) |
|
|
62
62
|
|
|
63
63
|
**Writes** — every one asks you to confirm first. A client that can show a
|
|
64
|
-
confirmation prompt (Claude Code) shows one
|
|
64
|
+
confirmation prompt (Claude Code) shows one, unless `MCP_CONFIRM_ELICITATION=off`.
|
|
65
|
+
Otherwise the first call makes no
|
|
65
66
|
change and returns a preview of the exact payload it would send plus a
|
|
66
67
|
`confirmToken`, and only a repeat call with that token makes the change — see
|
|
67
68
|
[Confirmations](#confirmations).
|
|
@@ -76,7 +77,8 @@ change and returns a preview of the exact payload it would send plus a
|
|
|
76
77
|
|
|
77
78
|
| variable | default | |
|
|
78
79
|
|---|---|---|
|
|
79
|
-
| `MCP_CONFIRM_MODE` | `ask-user` | What a write does on a client that cannot show a confirmation prompt (claude.ai, Claude Desktop). `ask-user`: two steps — the first call does nothing and returns a preview plus a token, and the model must get your approval in chat before calling again with it. `auto`: the same two steps, but the model may use the token after reviewing the preview itself. `refuse`: writes are refused on such clients. A client that can show prompts (Claude Code) always gets the real prompt
|
|
80
|
+
| `MCP_CONFIRM_MODE` | `ask-user` | What a write does on a client that cannot show a confirmation prompt (claude.ai, Claude Desktop). `ask-user`: two steps — the first call does nothing and returns a preview plus a token, and the model must get your approval in chat before calling again with it. `auto`: the same two steps, but the model may use the token after reviewing the preview itself. `refuse`: writes are refused on such clients. A client that can show prompts (Claude Code) always gets the real prompt, unless `MCP_CONFIRM_ELICITATION=off`. An unrecognised value is treated as `refuse`. |
|
|
81
|
+
| `MCP_CONFIRM_ELICITATION` | `on` | `off` never shows a confirmation prompt, so every client gets the `MCP_CONFIRM_MODE` path. Set it for a client that claims to support prompts but never shows one (the write hangs — opencode 2.0.x). Any other value stays `on`, with a warning on stderr. |
|
|
80
82
|
| `MCP_CONFIRM_TTL_SECONDS` | `600` | How long a token stays valid. |
|
|
81
83
|
| `MCP_CONFIRM_SECRET` | random per process | Signing key; set it only if tokens must survive a server restart. On mcp-host the host supplies a stable per-child key (`MCP_HOST_CONFIRM_SECRET`) and spent tokens are recorded under `MCP_DATA_DIR`, so an approval survives an idle restart. |
|
|
82
84
|
|
package/dist/bundle.js
CHANGED
|
@@ -57978,6 +57978,7 @@ function escapeKey(key) {
|
|
|
57978
57978
|
var DEFAULT_REQUEST_KEY = "confirmation";
|
|
57979
57979
|
var DEFAULT_CONFIRMATION_LABEL = "Confirm this action should proceed.";
|
|
57980
57980
|
var UNSUPPORTED_NOTE = "Nothing was done because this client cannot show a confirmation prompt (it declares no MCP elicitation capability), and this action is never taken without one";
|
|
57981
|
+
var DISABLED_NOTE = "Nothing was done because confirmation prompts are turned off for this server, and this action is never taken without one";
|
|
57981
57982
|
var STATE_PREFIX = "mcpu.confirm.v1.";
|
|
57982
57983
|
function bindingKey(binding) {
|
|
57983
57984
|
if (binding.ttlSeconds !== void 0 && !(Number.isFinite(binding.ttlSeconds) && binding.ttlSeconds > 0)) {
|
|
@@ -58050,6 +58051,15 @@ ${JSON.stringify(preview, null, 2)}`,
|
|
|
58050
58051
|
};
|
|
58051
58052
|
const response = inputResponse(ctx.mcpReq.inputResponses, requestKey);
|
|
58052
58053
|
const accepted = acceptedContent(ctx.mcpReq.inputResponses, requestKey, confirmationSchema);
|
|
58054
|
+
if (options.elicitation === false) {
|
|
58055
|
+
return textResult({
|
|
58056
|
+
confirmed: false,
|
|
58057
|
+
dispatched: false,
|
|
58058
|
+
action: options.action,
|
|
58059
|
+
reason: "confirmation-unsupported",
|
|
58060
|
+
note: options.unsupportedNote ? `${DISABLED_NOTE}. ${options.unsupportedNote}` : `${DISABLED_NOTE}.`
|
|
58061
|
+
});
|
|
58062
|
+
}
|
|
58053
58063
|
if (response.kind === "missing") {
|
|
58054
58064
|
if (callerAcceptsFormElicitation(ctx) === false) {
|
|
58055
58065
|
return textResult({
|
|
@@ -58244,7 +58254,7 @@ async function tokenConfirmation(action, fb) {
|
|
|
58244
58254
|
}
|
|
58245
58255
|
async function requireConfirmationWithFallback(ctx, options) {
|
|
58246
58256
|
const { tokenFallback, ...confirmation } = options;
|
|
58247
|
-
if (tokenFallback && callerAcceptsFormElicitation(ctx) === false) {
|
|
58257
|
+
if (tokenFallback && (options.elicitation === false || callerAcceptsFormElicitation(ctx) === false)) {
|
|
58248
58258
|
return tokenConfirmation(options.action, tokenFallback);
|
|
58249
58259
|
}
|
|
58250
58260
|
return requireConfirmation(ctx, confirmation);
|
|
@@ -58381,6 +58391,20 @@ function readConfirmMode(env = process.env) {
|
|
|
58381
58391
|
}
|
|
58382
58392
|
return "refuse";
|
|
58383
58393
|
}
|
|
58394
|
+
function readConfirmElicitation(env = process.env) {
|
|
58395
|
+
const raw = readEnvVar("MCP_CONFIRM_ELICITATION", { env })?.trim().toLowerCase();
|
|
58396
|
+
if (!raw || raw === "on")
|
|
58397
|
+
return "on";
|
|
58398
|
+
if (raw === "off")
|
|
58399
|
+
return "off";
|
|
58400
|
+
const key = `elicitation:${raw}`;
|
|
58401
|
+
if (!warned.has(key)) {
|
|
58402
|
+
warned.add(key);
|
|
58403
|
+
process.stderr.write(`MCP_CONFIRM_ELICITATION="${raw}" is not one of on, off; treating it as on.
|
|
58404
|
+
`);
|
|
58405
|
+
}
|
|
58406
|
+
return "on";
|
|
58407
|
+
}
|
|
58384
58408
|
function readConfirmTtl(env) {
|
|
58385
58409
|
const raw = readEnvVar("MCP_CONFIRM_TTL_SECONDS", { env })?.trim();
|
|
58386
58410
|
if (!raw)
|
|
@@ -58425,6 +58449,7 @@ function spentTokenStoreFromEnv(env = process.env) {
|
|
|
58425
58449
|
}
|
|
58426
58450
|
var CONFIRM_TOKEN_AUTO_INSTRUCTION = "Nothing has been done yet. Review this preview; if it is what was intended, call again with the same arguments plus confirmToken. (This server runs with MCP_CONFIRM_MODE=auto, so the user's approval in chat is not required.)";
|
|
58427
58451
|
var REFUSE_HINT = "Set MCP_CONFIRM_MODE=ask-user on the server to allow two-step confirmation instead.";
|
|
58452
|
+
var ELICITATION_OFF_HINT = "MCP_CONFIRM_ELICITATION=off on the server turns confirmation prompts off.";
|
|
58428
58453
|
var BAD_TTL_HINT = "MCP_CONFIRM_TTL_SECONDS on the server is not a positive whole number of seconds; fix it to allow two-step confirmation.";
|
|
58429
58454
|
function boundArgs(args) {
|
|
58430
58455
|
if (args === null || typeof args !== "object" || Array.isArray(args) || !("confirmToken" in args))
|
|
@@ -58438,10 +58463,13 @@ function confirmationFromEnv(options) {
|
|
|
58438
58463
|
const spent = callerSpent ?? spentTokenStoreFromEnv(env);
|
|
58439
58464
|
const mode = readConfirmMode(env);
|
|
58440
58465
|
const ttlSeconds = readConfirmTtl(env);
|
|
58466
|
+
const elicitationOff = readConfirmElicitation(env) === "off";
|
|
58441
58467
|
const bound = args === void 0 ? void 0 : boundArgs(args);
|
|
58442
|
-
const
|
|
58468
|
+
const bindingAdded = bound === void 0 || rest.binding ? rest : { ...rest, binding: { key: confirmKeyFromEnv(env), args: bound, ttlSeconds: ttlSeconds ?? DEFAULT_TTL_SECONDS2 } };
|
|
58469
|
+
const confirmation = elicitationOff ? { ...bindingAdded, elicitation: false } : bindingAdded;
|
|
58443
58470
|
if (mode === "refuse" || ttlSeconds === void 0) {
|
|
58444
|
-
const
|
|
58471
|
+
const reason = mode === "refuse" ? REFUSE_HINT : BAD_TTL_HINT;
|
|
58472
|
+
const hint = elicitationOff ? `${ELICITATION_OFF_HINT} ${reason}` : reason;
|
|
58445
58473
|
return {
|
|
58446
58474
|
...confirmation,
|
|
58447
58475
|
unsupportedNote: confirmation.unsupportedNote ? `${confirmation.unsupportedNote} ${hint}` : hint
|
|
@@ -59275,7 +59303,7 @@ var PickUpPatrolClient = class {
|
|
|
59275
59303
|
var client = new PickUpPatrolClient();
|
|
59276
59304
|
|
|
59277
59305
|
// src/version.ts
|
|
59278
|
-
var VERSION = "1.
|
|
59306
|
+
var VERSION = "1.2.0";
|
|
59279
59307
|
|
|
59280
59308
|
// node_modules/@chrischall/mcp-utils/dist/internal/edge-block.js
|
|
59281
59309
|
function objectField(value) {
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chrischall/pickuppatrol-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"mcpName": "io.github.chrischall/pickuppatrol-mcp",
|
|
6
6
|
"description": "PickUp Patrol MCP server for Claude — developed and maintained by AI (Claude Code)",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"test:watch": "vitest"
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
|
-
"@chrischall/mcp-utils": "^2.
|
|
60
|
+
"@chrischall/mcp-utils": "^2.15.0",
|
|
61
61
|
"@modelcontextprotocol/server": "^2.3.0",
|
|
62
62
|
"dotenv": "^18.0.2",
|
|
63
63
|
"zod": "^4.6.5"
|
package/server.json
CHANGED
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"url": "https://github.com/chrischall/pickuppatrol-mcp",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "1.
|
|
9
|
+
"version": "1.2.0",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "@chrischall/pickuppatrol-mcp",
|
|
14
|
-
"version": "1.
|
|
14
|
+
"version": "1.2.0",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
}
|