@manudota/artist-mcp 1.8.2-staging.87 → 1.8.2

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.
@@ -13,12 +13,18 @@ Load them before working on the musician's notes:
13
13
  - Without the server, read `.artist/policies/` directly. Every file there
14
14
  applies to this work whether or not anyone loaded it.
15
15
 
16
- OneNote is never written, no message is ever sent, and nothing is ever booked:
17
- drafts, plans, audits and page patches are handed to the musician, who applies
18
- them or does not. What an install may change beyond that is not fixed, and this
19
- file does not say — `list_agent_workflows` states it in full at the top of every
20
- briefing, because it depends on what the user granted at install time. Assuming
21
- either answer is how this file drifted before.
16
+ No message is ever sent. That one is unconditional — a scope commitment, not a
17
+ grant — and it is the only absolute this file is entitled to state. Otherwise
18
+ the shape of the work is that it is handed over rather than applied: drafts,
19
+ plans, audits and page patches go to the musician, who uses them or does not.
20
+
21
+ What an install may actually change is not fixed, and this file does not say —
22
+ `list_agent_workflows` states it in full at the top of every briefing, because
23
+ it depends on what the user granted at install time. Assuming either answer is
24
+ how this file drifted before, and this paragraph did it again: it claimed
25
+ OneNote was never written and nothing was ever booked, two sentences above the
26
+ warning against exactly that, and both had been false since the first write
27
+ grant shipped.
22
28
 
23
29
  ## Why this file says so little
24
30
 
package/dist/server.js CHANGED
@@ -164,7 +164,7 @@ const renderChangedSections = (chosen, notebook, since) => {
164
164
  caveats.join("\n\n"),
165
165
  ].join("\n\n");
166
166
  };
167
- const serverVersion = '1.8.2-staging.87'; // x-release-please-version
167
+ const serverVersion = '1.8.2'; // x-release-please-version
168
168
  const errorResult = (err) => {
169
169
  const message = err instanceof GraphError ? err.message : `Unexpected error: ${err}`;
170
170
  return { content: [{ type: "text", text: message }], isError: true };
@@ -311,6 +311,23 @@ const renderWorkflowBriefing = async (entries, load, writes = []) => {
311
311
  * Derived, never restated. An install with no grant says so too — that line is
312
312
  * the one that keeps a read-only install describing itself correctly.
313
313
  */
314
+ /**
315
+ * The sentence that puts the playbooks in force on a client that never sees the
316
+ * handshake.
317
+ *
318
+ * Claude Desktop does not deliver the `instructions` field to the model at all,
319
+ * so on the one client `init` configures a tool description is the only thing
320
+ * that reaches a session before it answers. It opens every note-reading tool's
321
+ * description: a client may clip the tool list to one line, and the opening is
322
+ * what is read most often.
323
+ *
324
+ * One constant, not three literals. Three copies of a rule is how `AGENTS.md`
325
+ * drifted from the pack it restated. See #99.
326
+ */
327
+ const PLAYBOOK_GATE = "Call `list_agent_workflows` first if you have not already this session — " +
328
+ "the playbooks it returns govern how pages are surveyed, what is stated " +
329
+ "and how firmly, and how anything is handed over. Without them no policy " +
330
+ "is in force. ";
314
331
  const capabilityLine = (writes) => {
315
332
  if (writes.length === 0) {
316
333
  return (" This install can only read. It cannot create, change or delete " +
@@ -345,6 +362,18 @@ const createServer = async (call, grants = []) => {
345
362
  // alone with no policy in force. That is the "a rule in a role is not in
346
363
  // force" failure one level up: the briefing was correct and never arrived.
347
364
  //
365
+ // Kept, but do not mistake it for the channel that binds. Claude Desktop —
366
+ // the client `init` configures — does not deliver this field to the model at
367
+ // all: a live Desktop session, asked to quote it back, reported the tool list
368
+ // and no preamble of any kind. Claude Code does deliver it verbatim, and a
369
+ // Code session called `list_agent_workflows` unprompted, which is why this
370
+ // stays. The rule a Desktop session actually reads is the one on `list_notes`
371
+ // and `read_note`, and #99 is why it is there as well as here.
372
+ //
373
+ // The capability line below is subject to the same limit. A Desktop session
374
+ // that described its writes correctly did so from its own tool list, since
375
+ // write tools are registered only when granted — not from this sentence.
376
+ //
348
377
  // It deliberately carries no rules of its own. `AGENTS.md` restated the pack
349
378
  // for repository clients and drifted from it — it still announces three
350
379
  // always-loaded policies, and still uses the winner-picking phrasing that
@@ -410,7 +439,18 @@ const createServer = async (call, grants = []) => {
410
439
  return errorResult(err);
411
440
  }
412
441
  });
413
- server.tool("list_notes", "List the user's OneNote pages, with title, notebook, section and last " +
442
+ server.tool("list_notes",
443
+ // The playbook gate lives here, not only in the handshake. Claude Desktop
444
+ // does not deliver the `instructions` field to the model at all — verified
445
+ // against a live session, which reported the tool list and no preamble —
446
+ // so on the one client `init` configures, the handshake reaches nothing.
447
+ // A description does reach it: `preview_calendar_event`'s refusal clause
448
+ // sits ~650 characters in and a Desktop session acted on it. See #99.
449
+ //
450
+ // It opens the description because a client may render the listing clipped
451
+ // to one line, and because the first paragraph is what is read most often.
452
+ PLAYBOOK_GATE +
453
+ "List the user's OneNote pages, with title, notebook, section and last " +
414
454
  "date. Takes an optional notebook name. When the account holds " +
415
455
  "more than one notebook and none is given, this returns the list of " +
416
456
  "notebooks instead of any pages, so the user can say which one to work " +
@@ -523,7 +563,12 @@ const createServer = async (call, grants = []) => {
523
563
  return errorResult(err);
524
564
  }
525
565
  });
526
- server.tool("map_notes", "Sketch every page in one notebook without reading them, so a notebook can " +
566
+ server.tool("map_notes",
567
+ // A third entry point, and often the first: a session may triage a notebook
568
+ // before it lists anything, so gating list_notes alone leaves the survey
569
+ // itself running with no policy in force. See #99.
570
+ PLAYBOOK_GATE +
571
+ "Sketch every page in one notebook without reading them, so a notebook can " +
527
572
  "be triaged before any page is read in full. Returns the opening of each " +
528
573
  "page — for a well-kept page that is its headline facts. Use it to decide " +
529
574
  "which pages are worth read_note. What it returns is the TOP of a page, " +
@@ -651,7 +696,11 @@ const createServer = async (call, grants = []) => {
651
696
  return errorResult(err);
652
697
  }
653
698
  });
654
- server.tool("read_note", "Read the text content of one OneNote page. Takes the id from list_notes. " +
699
+ server.tool("read_note",
700
+ // Both entry points carry it: an id can be remembered from earlier in a
701
+ // session, so read_note is not always reached through list_notes. See #99.
702
+ PLAYBOOK_GATE +
703
+ "Read the text content of one OneNote page. Takes the id from list_notes. " +
655
704
  "A page too long for one answer comes back in parts, and the answer says " +
656
705
  "so and how to continue — a page is never truncated silently.", {
657
706
  note_id: z.string().describe("The id of the note, as returned by list_notes"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@manudota/artist-mcp",
3
- "version": "1.8.2-staging.87",
3
+ "version": "1.8.2",
4
4
  "description": "MCP server that reads your OneNote notes, with optional Gmail and Calendar as supporting evidence, via a hosted connection.",
5
5
  "repository": {
6
6
  "type": "git",