@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.
- package/agent-pack/AGENTS.md +12 -6
- package/dist/server.js +53 -4
- package/package.json +1 -1
package/agent-pack/AGENTS.md
CHANGED
|
@@ -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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
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",
|
|
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",
|
|
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",
|
|
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
|
|
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",
|