@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.
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "PickUp Patrol school-dismissal tools for Claude Code",
9
- "version": "1.1.4"
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.1.4",
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.1.4",
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. Otherwise the first call makes no
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. An unrecognised value is treated as `refuse`. |
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 confirmation = bound === void 0 || rest.binding ? rest : { ...rest, binding: { key: confirmKeyFromEnv(env), args: bound, ttlSeconds: ttlSeconds ?? DEFAULT_TTL_SECONDS2 } };
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 hint = mode === "refuse" ? REFUSE_HINT : BAD_TTL_HINT;
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.1.4";
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
@@ -7,4 +7,4 @@
7
7
  * annotation, so there is exactly one line to keep in sync and
8
8
  * `versionSyncTest` has exactly one line to check.
9
9
  */
10
- export declare const VERSION = "1.1.4";
10
+ export declare const VERSION = "1.2.0";
package/dist/version.js CHANGED
@@ -7,4 +7,4 @@
7
7
  * annotation, so there is exactly one line to keep in sync and
8
8
  * `versionSyncTest` has exactly one line to check.
9
9
  */
10
- export const VERSION = '1.1.4'; // x-release-please-version
10
+ export const VERSION = '1.2.0'; // x-release-please-version
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrischall/pickuppatrol-mcp",
3
- "version": "1.1.4",
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.14.0",
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.1.4",
9
+ "version": "1.2.0",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@chrischall/pickuppatrol-mcp",
14
- "version": "1.1.4",
14
+ "version": "1.2.0",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  }