@gwdn/nexus-mcp 0.8.0 → 0.8.3

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/README.md CHANGED
@@ -78,6 +78,31 @@ src/
78
78
  __tests__/ # Unit tests (112) and E2E integration tests (34)
79
79
  ```
80
80
 
81
+ ## Known Issues
82
+
83
+ ### npx cache prevents version upgrade
84
+
85
+ When using `npx` to run the MCP server, npm caches the resolved package in
86
+ `~/.npm/_npx/`. Subsequent invocations may continue to use the cached
87
+ (outdated) version even after a new release is published — especially in
88
+ terminals that were started before the update.
89
+
90
+ **Symptoms:** MCP tools report an older version, or new tools/fixes are missing.
91
+
92
+ **Fix:** Before starting OpenCode, clear stale npx caches:
93
+
94
+ ```bash
95
+ find ~/.npm/_npx -path "*/node_modules/@gwdn/nexus-mcp/package.json" \
96
+ -exec node -e "if(require('{}').version!=='0.8.1') console.log(require('path').resolve('{}','../../..'))" \; \
97
+ | xargs rm -rf
98
+ ```
99
+
100
+ Then start OpenCode normally. npx will fetch the latest version into a fresh
101
+ cache entry.
102
+
103
+ > **Tip:** To avoid this entirely, pin `@latest` in your MCP config args:
104
+ > `["--yes", "@gwdn/nexus-mcp@latest"]`
105
+
81
106
  ## Related
82
107
 
83
108
  - [nexus](https://github.com/gwnexus/nexus-hub) — Backend + Frontend (Next.js/Supabase/Netlify)
package/dist/server.js CHANGED
@@ -85,6 +85,9 @@ import { appendSessionEntry, appendSessionEntrySchema, } from './tools/append-se
85
85
  import { createTask, createTaskSchema } from './tools/create-task.js';
86
86
  import { addDecisionComment, addDecisionCommentSchema, listDecisionComments, listDecisionCommentsSchema, } from './tools/decision-comments.js';
87
87
  import { ingestDocument, ingestDocumentSchema, } from './tools/ingest-document.js';
88
+ import { classifyDocument, classifyDocumentSchema, } from './tools/classify-document.js';
89
+ import { updateDocument, updateDocumentSchema, } from './tools/update-document.js';
90
+ import { deleteDocument, deleteDocumentSchema, } from './tools/delete-document.js';
88
91
  import { acknowledgeLetter, acknowledgeLetterSchema, listInbox, listInboxSchema, listOutbox, listOutboxSchema, } from './tools/letter-inbox.js';
89
92
  import { createLetter, createLetterSchema, replyLetter, replyLetterSchema, } from './tools/letters.js';
90
93
  import { listDocuments, listDocumentsSchema, } from './tools/list-documents.js';
@@ -146,6 +149,9 @@ server.tool('task_note', 'Append a note to an existing task. Notes are append-on
146
149
  server.tool('task_list', 'List tasks for a project with optional status filtering. Returns tasks ordered by creation date (newest first).', listTasksSchema, withIdentity(listTasks));
147
150
  server.tool('doc_ingest', 'Push text or markdown content into a project knowledge base. Creates an ingest item that can later be classified. Useful for agents to persist research results, generated documents, or extracted knowledge.', ingestDocumentSchema, withIdentity(ingestDocument));
148
151
  server.tool('doc_list', 'List ingested documents for a project with optional source filtering. Returns documents ordered by creation date (newest first).', listDocumentsSchema, withIdentity(listDocuments));
152
+ server.tool('doc_classify', 'Update the classification of an ingest item. Valid classifications: unclassified, research_note, planning_item, decision_input, reference, archive.', classifyDocumentSchema, withIdentity(classifyDocument));
153
+ server.tool('doc_update', 'Update title, body, or source_url of an ingest item. Supports full body replacement or append mode via append_body. At least one field must be provided.', updateDocumentSchema, withIdentity(updateDocument));
154
+ server.tool('doc_delete', 'Delete an ingest item from a project knowledge base. This action is irreversible.', deleteDocumentSchema, withIdentity(deleteDocument));
149
155
  server.tool('session_append', 'Append an entry to an existing session. Enforces session write isolation: only the session creator can append entries.', appendSessionEntrySchema, withIdentity(appendSessionEntry));
150
156
  server.tool('session_create', 'Create a new work session for a project. Returns the session ID. The session starts in open status and must be closed explicitly via session_close.', createSessionSchema, withIdentity(createSession));
151
157
  server.tool('session_close', 'Close an open session. Sets status to closed, optionally records a summary and next entry point. Only the session creator can close it.', closeSessionSchema, withIdentity(closeSession));
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,7 @@ export declare const appendSessionEntrySchema: {
26
26
  linked_entity_type: z.ZodOptional<z.ZodString>;
27
27
  linked_entity_id: z.ZodOptional<z.ZodString>;
28
28
  agent_id: z.ZodOptional<z.ZodString>;
29
+ metadata: z.ZodOptional<z.ZodString>;
29
30
  };
30
31
  type AppendSessionEntryArgs = {
31
32
  session_id: string;
@@ -35,6 +36,7 @@ type AppendSessionEntryArgs = {
35
36
  linked_entity_id?: string;
36
37
  user_id: string;
37
38
  agent_id?: string;
39
+ metadata?: string;
38
40
  };
39
41
  export declare function appendSessionEntry(args: AppendSessionEntryArgs): Promise<{
40
42
  content: {
@@ -1 +1 @@
1
- {"version":3,"file":"append-session-entry.d.ts","sourceRoot":"","sources":["../../src/tools/append-session-entry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;CAgCpC,CAAA;AAED,KAAK,sBAAsB,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB;;;;;;;;;;;;GA4BpE"}
1
+ {"version":3,"file":"append-session-entry.d.ts","sourceRoot":"","sources":["../../src/tools/append-session-entry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;CAwCpC,CAAA;AAED,KAAK,sBAAsB,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB;;;;;;;;;;;;GA8CpE"}
@@ -37,8 +37,31 @@ export const appendSessionEntrySchema = {
37
37
  .optional()
38
38
  .describe('UUID of the linked entity'),
39
39
  agent_id: z.string().max(200).optional().describe('Agent identifier if applicable'),
40
+ metadata: z
41
+ .string()
42
+ .max(10_000)
43
+ .optional()
44
+ .describe('JSON string of metadata to merge into the session entry. ' +
45
+ 'Example: \'{"model": "claude-opus-4", "toolstack": "opencode", "machine_id": "..."}\''),
40
46
  };
41
47
  export async function appendSessionEntry(args) {
48
+ let parsedMetadata;
49
+ if (args.metadata) {
50
+ try {
51
+ parsedMetadata = JSON.parse(args.metadata);
52
+ }
53
+ catch {
54
+ return {
55
+ content: [
56
+ {
57
+ type: 'text',
58
+ text: JSON.stringify({ error: 'metadata must be a valid JSON string' }, null, 2),
59
+ },
60
+ ],
61
+ isError: true,
62
+ };
63
+ }
64
+ }
42
65
  const result = await nexusPost('/api/mcp/sessions', {
43
66
  action: 'session_append',
44
67
  session_id: args.session_id,
@@ -47,6 +70,7 @@ export async function appendSessionEntry(args) {
47
70
  agent_id: args.agent_id,
48
71
  linked_entity_type: args.linked_entity_type,
49
72
  linked_entity_id: args.linked_entity_id,
73
+ ...(parsedMetadata ? { metadata: parsedMetadata } : {}),
50
74
  });
51
75
  if (!result.ok) {
52
76
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"append-session-entry.js","sourceRoot":"","sources":["../../src/tools/append-session-entry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACnE,UAAU,EAAE,CAAC;SACV,IAAI,CAAC;QACJ,qBAAqB;QACrB,cAAc;QACd,cAAc;QACd,aAAa;QACb,gBAAgB;QAChB,gBAAgB;QAChB,mBAAmB;QACnB,aAAa;QACb,cAAc;QACd,kBAAkB;QAClB,MAAM;QACN,YAAY;KACb,CAAC;SACD,QAAQ,CAAC,uBAAuB,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IACzE,kBAAkB,EAAE,CAAC;SAClB,MAAM,EAAE;SACR,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,QAAQ,CACP,6EAA6E,CAC9E;IACH,gBAAgB,EAAE,CAAC;SAChB,MAAM,EAAE;SACR,IAAI,EAAE;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,2BAA2B,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;CACpF,CAAA;AAYD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAA4B;IACnE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,mBAAmB,EAAE;QAClD,MAAM,EAAE,gBAAgB;QACxB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KACxC,CAAC,CAAA;IAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvD;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;SACtE;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"append-session-entry.js","sourceRoot":"","sources":["../../src/tools/append-session-entry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACnE,UAAU,EAAE,CAAC;SACV,IAAI,CAAC;QACJ,qBAAqB;QACrB,cAAc;QACd,cAAc;QACd,aAAa;QACb,gBAAgB;QAChB,gBAAgB;QAChB,mBAAmB;QACnB,aAAa;QACb,cAAc;QACd,kBAAkB;QAClB,MAAM;QACN,YAAY;KACb,CAAC;SACD,QAAQ,CAAC,uBAAuB,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IACzE,kBAAkB,EAAE,CAAC;SAClB,MAAM,EAAE;SACR,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,QAAQ,CACP,6EAA6E,CAC9E;IACH,gBAAgB,EAAE,CAAC;SAChB,MAAM,EAAE;SACR,IAAI,EAAE;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,2BAA2B,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IACnF,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,CAAC,MAAM,CAAC;SACX,QAAQ,EAAE;SACV,QAAQ,CACP,2DAA2D;QACzD,uFAAuF,CAC1F;CACJ,CAAA;AAaD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAA4B;IACnE,IAAI,cAAmD,CAAA;IACvD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,sCAAsC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;qBACjF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAA;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,mBAAmB,EAAE;QAClD,MAAM,EAAE,gBAAgB;QACxB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxD,CAAC,CAAA;IAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvD;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;SACtE;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * doc_classify -- Layer 2 Coordination
3
+ *
4
+ * Update the classification of an ingest item.
5
+ * Delegates to POST /api/mcp/documents (action: doc_classify).
6
+ */
7
+ import { z } from 'zod';
8
+ export declare const classifyDocumentSchema: {
9
+ document_id: z.ZodString;
10
+ classification: z.ZodEnum<{
11
+ research_note: "research_note";
12
+ planning_item: "planning_item";
13
+ unclassified: "unclassified";
14
+ decision_input: "decision_input";
15
+ reference: "reference";
16
+ archive: "archive";
17
+ }>;
18
+ };
19
+ type ClassifyDocumentArgs = {
20
+ document_id: string;
21
+ classification: string;
22
+ user_id: string;
23
+ };
24
+ export declare function classifyDocument(args: ClassifyDocumentArgs): Promise<{
25
+ content: {
26
+ type: "text";
27
+ text: string;
28
+ }[];
29
+ isError: boolean;
30
+ } | {
31
+ content: {
32
+ type: "text";
33
+ text: string;
34
+ }[];
35
+ isError?: undefined;
36
+ }>;
37
+ export {};
38
+ //# sourceMappingURL=classify-document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify-document.d.ts","sourceRoot":"","sources":["../../src/tools/classify-document.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,sBAAsB;;;;;;;;;;CAYlC,CAAA;AAED,KAAK,oBAAoB,GAAG;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB;;;;;;;;;;;;GAwBhE"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * doc_classify -- Layer 2 Coordination
3
+ *
4
+ * Update the classification of an ingest item.
5
+ * Delegates to POST /api/mcp/documents (action: doc_classify).
6
+ */
7
+ import { z } from 'zod';
8
+ import { nexusPost } from '../nexus-api.js';
9
+ export const classifyDocumentSchema = {
10
+ document_id: z.string().uuid().describe('Document UUID to classify'),
11
+ classification: z
12
+ .enum([
13
+ 'unclassified',
14
+ 'research_note',
15
+ 'planning_item',
16
+ 'decision_input',
17
+ 'reference',
18
+ 'archive',
19
+ ])
20
+ .describe('New classification for the document'),
21
+ };
22
+ export async function classifyDocument(args) {
23
+ const result = await nexusPost('/api/mcp/documents', {
24
+ action: 'doc_classify',
25
+ document_id: args.document_id,
26
+ classification: args.classification,
27
+ });
28
+ if (!result.ok) {
29
+ return {
30
+ content: [
31
+ {
32
+ type: 'text',
33
+ text: JSON.stringify({ error: result.error }, null, 2),
34
+ },
35
+ ],
36
+ isError: true,
37
+ };
38
+ }
39
+ return {
40
+ content: [
41
+ { type: 'text', text: JSON.stringify(result.data, null, 2) },
42
+ ],
43
+ };
44
+ }
45
+ //# sourceMappingURL=classify-document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify-document.js","sourceRoot":"","sources":["../../src/tools/classify-document.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACpE,cAAc,EAAE,CAAC;SACd,IAAI,CAAC;QACJ,cAAc;QACd,eAAe;QACf,eAAe;QACf,gBAAgB;QAChB,WAAW;QACX,SAAS;KACV,CAAC;SACD,QAAQ,CAAC,qCAAqC,CAAC;CACnD,CAAA;AAQD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAA0B;IAC/D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,oBAAoB,EAAE;QACnD,MAAM,EAAE,cAAc;QACtB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,cAAc,EAAE,IAAI,CAAC,cAAc;KACpC,CAAC,CAAA;IAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvD;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;SACtE;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * doc_delete -- Layer 2 Coordination
3
+ *
4
+ * Delete an ingest item from a project's knowledge base.
5
+ * Delegates to POST /api/mcp/documents (action: doc_delete).
6
+ */
7
+ import { z } from 'zod';
8
+ export declare const deleteDocumentSchema: {
9
+ document_id: z.ZodString;
10
+ };
11
+ type DeleteDocumentArgs = {
12
+ document_id: string;
13
+ user_id: string;
14
+ };
15
+ export declare function deleteDocument(args: DeleteDocumentArgs): Promise<{
16
+ content: {
17
+ type: "text";
18
+ text: string;
19
+ }[];
20
+ isError: boolean;
21
+ } | {
22
+ content: {
23
+ type: "text";
24
+ text: string;
25
+ }[];
26
+ isError?: undefined;
27
+ }>;
28
+ export {};
29
+ //# sourceMappingURL=delete-document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-document.d.ts","sourceRoot":"","sources":["../../src/tools/delete-document.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,oBAAoB;;CAEhC,CAAA;AAED,KAAK,kBAAkB,GAAG;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,kBAAkB;;;;;;;;;;;;GAuB5D"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * doc_delete -- Layer 2 Coordination
3
+ *
4
+ * Delete an ingest item from a project's knowledge base.
5
+ * Delegates to POST /api/mcp/documents (action: doc_delete).
6
+ */
7
+ import { z } from 'zod';
8
+ import { nexusPost } from '../nexus-api.js';
9
+ export const deleteDocumentSchema = {
10
+ document_id: z.string().uuid().describe('Document UUID to delete'),
11
+ };
12
+ export async function deleteDocument(args) {
13
+ const result = await nexusPost('/api/mcp/documents', {
14
+ action: 'doc_delete',
15
+ document_id: args.document_id,
16
+ });
17
+ if (!result.ok) {
18
+ return {
19
+ content: [
20
+ {
21
+ type: 'text',
22
+ text: JSON.stringify({ error: result.error }, null, 2),
23
+ },
24
+ ],
25
+ isError: true,
26
+ };
27
+ }
28
+ return {
29
+ content: [
30
+ { type: 'text', text: JSON.stringify(result.data, null, 2) },
31
+ ],
32
+ };
33
+ }
34
+ //# sourceMappingURL=delete-document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-document.js","sourceRoot":"","sources":["../../src/tools/delete-document.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CACnE,CAAA;AAOD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAwB;IAC3D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,oBAAoB,EAAE;QACnD,MAAM,EAAE,YAAY;QACpB,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAA;IAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvD;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;SACtE;KACF,CAAA;AACH,CAAC"}
@@ -86,11 +86,11 @@ export declare const rvDecideSchema: {
86
86
  review_id: z.ZodString;
87
87
  transition: z.ZodEnum<{
88
88
  accept: "accept";
89
+ archive: "archive";
89
90
  submit: "submit";
90
91
  reject: "reject";
91
92
  request_revision: "request_revision";
92
93
  resubmit: "resubmit";
93
- archive: "archive";
94
94
  }>;
95
95
  rationale: z.ZodOptional<z.ZodString>;
96
96
  };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * doc_update -- Layer 2 Coordination
3
+ *
4
+ * Update title, body, or source_url of an ingest item.
5
+ * Supports full body replacement or append mode.
6
+ * Delegates to POST /api/mcp/documents (action: doc_update).
7
+ */
8
+ import { z } from 'zod';
9
+ export declare const updateDocumentSchema: {
10
+ document_id: z.ZodString;
11
+ title: z.ZodOptional<z.ZodString>;
12
+ body: z.ZodOptional<z.ZodString>;
13
+ source_url: z.ZodOptional<z.ZodString>;
14
+ append_body: z.ZodOptional<z.ZodString>;
15
+ };
16
+ type UpdateDocumentArgs = {
17
+ document_id: string;
18
+ title?: string;
19
+ body?: string;
20
+ source_url?: string;
21
+ append_body?: string;
22
+ user_id: string;
23
+ };
24
+ export declare function updateDocument(args: UpdateDocumentArgs): Promise<{
25
+ content: {
26
+ type: "text";
27
+ text: string;
28
+ }[];
29
+ isError: boolean;
30
+ } | {
31
+ content: {
32
+ type: "text";
33
+ text: string;
34
+ }[];
35
+ isError?: undefined;
36
+ }>;
37
+ export {};
38
+ //# sourceMappingURL=update-document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-document.d.ts","sourceRoot":"","sources":["../../src/tools/update-document.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,oBAAoB;;;;;;CAgBhC,CAAA;AAED,KAAK,kBAAkB,GAAG;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,kBAAkB;;;;;;;;;;;;GA2B5D"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * doc_update -- Layer 2 Coordination
3
+ *
4
+ * Update title, body, or source_url of an ingest item.
5
+ * Supports full body replacement or append mode.
6
+ * Delegates to POST /api/mcp/documents (action: doc_update).
7
+ */
8
+ import { z } from 'zod';
9
+ import { nexusPost } from '../nexus-api.js';
10
+ export const updateDocumentSchema = {
11
+ document_id: z.string().uuid().describe('Document UUID to update'),
12
+ title: z.string().max(500).optional().describe('New document title'),
13
+ body: z
14
+ .string()
15
+ .max(100_000)
16
+ .optional()
17
+ .describe('New document body (replaces existing content)'),
18
+ source_url: z.string().url().optional().describe('Updated source URL'),
19
+ append_body: z
20
+ .string()
21
+ .max(100_000)
22
+ .optional()
23
+ .describe('Content to append to existing body (ignored if body is also provided)'),
24
+ };
25
+ export async function updateDocument(args) {
26
+ const result = await nexusPost('/api/mcp/documents', {
27
+ action: 'doc_update',
28
+ document_id: args.document_id,
29
+ title: args.title,
30
+ body: args.body,
31
+ source_url: args.source_url,
32
+ append_body: args.append_body,
33
+ });
34
+ if (!result.ok) {
35
+ return {
36
+ content: [
37
+ {
38
+ type: 'text',
39
+ text: JSON.stringify({ error: result.error }, null, 2),
40
+ },
41
+ ],
42
+ isError: true,
43
+ };
44
+ }
45
+ return {
46
+ content: [
47
+ { type: 'text', text: JSON.stringify(result.data, null, 2) },
48
+ ],
49
+ };
50
+ }
51
+ //# sourceMappingURL=update-document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-document.js","sourceRoot":"","sources":["../../src/tools/update-document.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAClE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IACpE,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,CAAC,OAAO,CAAC;SACZ,QAAQ,EAAE;SACV,QAAQ,CAAC,+CAA+C,CAAC;IAC5D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IACtE,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,CAAC,OAAO,CAAC;SACZ,QAAQ,EAAE;SACV,QAAQ,CACP,uEAAuE,CACxE;CACJ,CAAA;AAWD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAwB;IAC3D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,oBAAoB,EAAE;QACnD,MAAM,EAAE,YAAY;QACpB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAA;IAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvD;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;SACtE;KACF,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gwdn/nexus-mcp",
3
- "version": "0.8.0",
3
+ "version": "0.8.3",
4
4
  "description": "MCP server for the Nexus platform",
5
5
  "type": "module",
6
6
  "main": "dist/server.js",
@@ -206,6 +206,82 @@ describe('Layer 2: session_append', () => {
206
206
 
207
207
  expect(result.isError).toBe(true)
208
208
  })
209
+
210
+ it('should forward parsed metadata to the API', async () => {
211
+ vi.mocked(nexusPost).mockResolvedValue(
212
+ mockApiSuccess({
213
+ action: 'session_append',
214
+ entry_id: TEST_IDS.entryId,
215
+ session_id: TEST_IDS.sessionId,
216
+ entry_type: 'note',
217
+ project_id: TEST_IDS.projectId,
218
+ }),
219
+ )
220
+
221
+ const { appendSessionEntry } = await import('../tools/append-session-entry.js')
222
+ const metadata = JSON.stringify({
223
+ model: 'claude-opus-4',
224
+ toolstack: 'opencode',
225
+ machine_id: '00000000-0000-0000-0000-000000000001',
226
+ })
227
+ const result = await appendSessionEntry({
228
+ session_id: TEST_IDS.sessionId,
229
+ entry_type: 'note',
230
+ summary: 'Entry with metadata',
231
+ user_id: TEST_IDS.userId,
232
+ metadata,
233
+ })
234
+
235
+ expect(result.isError).toBeUndefined()
236
+ expect(vi.mocked(nexusPost)).toHaveBeenCalledWith(
237
+ '/api/mcp/sessions',
238
+ expect.objectContaining({
239
+ metadata: {
240
+ model: 'claude-opus-4',
241
+ toolstack: 'opencode',
242
+ machine_id: '00000000-0000-0000-0000-000000000001',
243
+ },
244
+ }),
245
+ )
246
+ })
247
+
248
+ it('should return error for invalid metadata JSON', async () => {
249
+ const { appendSessionEntry } = await import('../tools/append-session-entry.js')
250
+ const result = await appendSessionEntry({
251
+ session_id: TEST_IDS.sessionId,
252
+ entry_type: 'note',
253
+ summary: 'Bad metadata',
254
+ user_id: TEST_IDS.userId,
255
+ metadata: '{invalid json',
256
+ })
257
+
258
+ expect(result.isError).toBe(true)
259
+ const parsed = parseToolResponse(result)
260
+ expect(parsed.error).toContain('valid JSON')
261
+ })
262
+
263
+ it('should omit metadata key when not provided', async () => {
264
+ vi.mocked(nexusPost).mockResolvedValue(
265
+ mockApiSuccess({
266
+ action: 'session_append',
267
+ entry_id: TEST_IDS.entryId,
268
+ session_id: TEST_IDS.sessionId,
269
+ entry_type: 'note',
270
+ project_id: TEST_IDS.projectId,
271
+ }),
272
+ )
273
+
274
+ const { appendSessionEntry } = await import('../tools/append-session-entry.js')
275
+ await appendSessionEntry({
276
+ session_id: TEST_IDS.sessionId,
277
+ entry_type: 'note',
278
+ summary: 'No metadata',
279
+ user_id: TEST_IDS.userId,
280
+ })
281
+
282
+ const call = vi.mocked(nexusPost).mock.calls[0][1] as Record<string, unknown>
283
+ expect(call).not.toHaveProperty('metadata')
284
+ })
209
285
  })
210
286
 
211
287
  // ---------------------------------------------------------------------------
@@ -78,9 +78,9 @@ describe('MCP Server: withIdentity wrapper', () => {
78
78
  })
79
79
 
80
80
  describe('MCP Server: Schema exports', () => {
81
- const EXPECTED_TOOL_COUNT = 45
81
+ const EXPECTED_TOOL_COUNT = 48
82
82
 
83
- it('should register exactly 45 tools in server.ts', () => {
83
+ it('should register exactly 48 tools in server.ts', () => {
84
84
  // Static analysis: count server.tool( calls in server.ts as a regression guard.
85
85
  // If you add or remove a tool, update EXPECTED_TOOL_COUNT above.
86
86
  const serverSource = readFileSync(
@@ -146,6 +146,7 @@ describe('MCP Server: Schema exports', () => {
146
146
 
147
147
  const appendEntry = await import('../tools/append-session-entry.js')
148
148
  expect(appendEntry.appendSessionEntrySchema).toBeDefined()
149
+ expect(appendEntry.appendSessionEntrySchema.metadata).toBeDefined()
149
150
  expect(typeof appendEntry.appendSessionEntry).toBe('function')
150
151
 
151
152
  const letters = await import('../tools/letters.js')
package/src/server.ts CHANGED
@@ -109,6 +109,18 @@ import {
109
109
  ingestDocument,
110
110
  ingestDocumentSchema,
111
111
  } from './tools/ingest-document.js'
112
+ import {
113
+ classifyDocument,
114
+ classifyDocumentSchema,
115
+ } from './tools/classify-document.js'
116
+ import {
117
+ updateDocument,
118
+ updateDocumentSchema,
119
+ } from './tools/update-document.js'
120
+ import {
121
+ deleteDocument,
122
+ deleteDocumentSchema,
123
+ } from './tools/delete-document.js'
112
124
  import {
113
125
  acknowledgeLetter,
114
126
  acknowledgeLetterSchema,
@@ -354,6 +366,27 @@ server.tool(
354
366
  withIdentity(listDocuments),
355
367
  )
356
368
 
369
+ server.tool(
370
+ 'doc_classify',
371
+ 'Update the classification of an ingest item. Valid classifications: unclassified, research_note, planning_item, decision_input, reference, archive.',
372
+ classifyDocumentSchema,
373
+ withIdentity(classifyDocument),
374
+ )
375
+
376
+ server.tool(
377
+ 'doc_update',
378
+ 'Update title, body, or source_url of an ingest item. Supports full body replacement or append mode via append_body. At least one field must be provided.',
379
+ updateDocumentSchema,
380
+ withIdentity(updateDocument),
381
+ )
382
+
383
+ server.tool(
384
+ 'doc_delete',
385
+ 'Delete an ingest item from a project knowledge base. This action is irreversible.',
386
+ deleteDocumentSchema,
387
+ withIdentity(deleteDocument),
388
+ )
389
+
357
390
  server.tool(
358
391
  'session_append',
359
392
  'Append an entry to an existing session. Enforces session write isolation: only the session creator can append entries.',
@@ -41,6 +41,14 @@ export const appendSessionEntrySchema = {
41
41
  .optional()
42
42
  .describe('UUID of the linked entity'),
43
43
  agent_id: z.string().max(200).optional().describe('Agent identifier if applicable'),
44
+ metadata: z
45
+ .string()
46
+ .max(10_000)
47
+ .optional()
48
+ .describe(
49
+ 'JSON string of metadata to merge into the session entry. ' +
50
+ 'Example: \'{"model": "claude-opus-4", "toolstack": "opencode", "machine_id": "..."}\'',
51
+ ),
44
52
  }
45
53
 
46
54
  type AppendSessionEntryArgs = {
@@ -51,9 +59,27 @@ type AppendSessionEntryArgs = {
51
59
  linked_entity_id?: string
52
60
  user_id: string
53
61
  agent_id?: string
62
+ metadata?: string
54
63
  }
55
64
 
56
65
  export async function appendSessionEntry(args: AppendSessionEntryArgs) {
66
+ let parsedMetadata: Record<string, unknown> | undefined
67
+ if (args.metadata) {
68
+ try {
69
+ parsedMetadata = JSON.parse(args.metadata)
70
+ } catch {
71
+ return {
72
+ content: [
73
+ {
74
+ type: 'text' as const,
75
+ text: JSON.stringify({ error: 'metadata must be a valid JSON string' }, null, 2),
76
+ },
77
+ ],
78
+ isError: true,
79
+ }
80
+ }
81
+ }
82
+
57
83
  const result = await nexusPost('/api/mcp/sessions', {
58
84
  action: 'session_append',
59
85
  session_id: args.session_id,
@@ -62,6 +88,7 @@ export async function appendSessionEntry(args: AppendSessionEntryArgs) {
62
88
  agent_id: args.agent_id,
63
89
  linked_entity_type: args.linked_entity_type,
64
90
  linked_entity_id: args.linked_entity_id,
91
+ ...(parsedMetadata ? { metadata: parsedMetadata } : {}),
65
92
  })
66
93
 
67
94
  if (!result.ok) {
@@ -0,0 +1,55 @@
1
+ /**
2
+ * doc_classify -- Layer 2 Coordination
3
+ *
4
+ * Update the classification of an ingest item.
5
+ * Delegates to POST /api/mcp/documents (action: doc_classify).
6
+ */
7
+
8
+ import { z } from 'zod'
9
+ import { nexusPost } from '../nexus-api.js'
10
+
11
+ export const classifyDocumentSchema = {
12
+ document_id: z.string().uuid().describe('Document UUID to classify'),
13
+ classification: z
14
+ .enum([
15
+ 'unclassified',
16
+ 'research_note',
17
+ 'planning_item',
18
+ 'decision_input',
19
+ 'reference',
20
+ 'archive',
21
+ ])
22
+ .describe('New classification for the document'),
23
+ }
24
+
25
+ type ClassifyDocumentArgs = {
26
+ document_id: string
27
+ classification: string
28
+ user_id: string
29
+ }
30
+
31
+ export async function classifyDocument(args: ClassifyDocumentArgs) {
32
+ const result = await nexusPost('/api/mcp/documents', {
33
+ action: 'doc_classify',
34
+ document_id: args.document_id,
35
+ classification: args.classification,
36
+ })
37
+
38
+ if (!result.ok) {
39
+ return {
40
+ content: [
41
+ {
42
+ type: 'text' as const,
43
+ text: JSON.stringify({ error: result.error }, null, 2),
44
+ },
45
+ ],
46
+ isError: true,
47
+ }
48
+ }
49
+
50
+ return {
51
+ content: [
52
+ { type: 'text' as const, text: JSON.stringify(result.data, null, 2) },
53
+ ],
54
+ }
55
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * doc_delete -- Layer 2 Coordination
3
+ *
4
+ * Delete an ingest item from a project's knowledge base.
5
+ * Delegates to POST /api/mcp/documents (action: doc_delete).
6
+ */
7
+
8
+ import { z } from 'zod'
9
+ import { nexusPost } from '../nexus-api.js'
10
+
11
+ export const deleteDocumentSchema = {
12
+ document_id: z.string().uuid().describe('Document UUID to delete'),
13
+ }
14
+
15
+ type DeleteDocumentArgs = {
16
+ document_id: string
17
+ user_id: string
18
+ }
19
+
20
+ export async function deleteDocument(args: DeleteDocumentArgs) {
21
+ const result = await nexusPost('/api/mcp/documents', {
22
+ action: 'doc_delete',
23
+ document_id: args.document_id,
24
+ })
25
+
26
+ if (!result.ok) {
27
+ return {
28
+ content: [
29
+ {
30
+ type: 'text' as const,
31
+ text: JSON.stringify({ error: result.error }, null, 2),
32
+ },
33
+ ],
34
+ isError: true,
35
+ }
36
+ }
37
+
38
+ return {
39
+ content: [
40
+ { type: 'text' as const, text: JSON.stringify(result.data, null, 2) },
41
+ ],
42
+ }
43
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * doc_update -- Layer 2 Coordination
3
+ *
4
+ * Update title, body, or source_url of an ingest item.
5
+ * Supports full body replacement or append mode.
6
+ * Delegates to POST /api/mcp/documents (action: doc_update).
7
+ */
8
+
9
+ import { z } from 'zod'
10
+ import { nexusPost } from '../nexus-api.js'
11
+
12
+ export const updateDocumentSchema = {
13
+ document_id: z.string().uuid().describe('Document UUID to update'),
14
+ title: z.string().max(500).optional().describe('New document title'),
15
+ body: z
16
+ .string()
17
+ .max(100_000)
18
+ .optional()
19
+ .describe('New document body (replaces existing content)'),
20
+ source_url: z.string().url().optional().describe('Updated source URL'),
21
+ append_body: z
22
+ .string()
23
+ .max(100_000)
24
+ .optional()
25
+ .describe(
26
+ 'Content to append to existing body (ignored if body is also provided)',
27
+ ),
28
+ }
29
+
30
+ type UpdateDocumentArgs = {
31
+ document_id: string
32
+ title?: string
33
+ body?: string
34
+ source_url?: string
35
+ append_body?: string
36
+ user_id: string
37
+ }
38
+
39
+ export async function updateDocument(args: UpdateDocumentArgs) {
40
+ const result = await nexusPost('/api/mcp/documents', {
41
+ action: 'doc_update',
42
+ document_id: args.document_id,
43
+ title: args.title,
44
+ body: args.body,
45
+ source_url: args.source_url,
46
+ append_body: args.append_body,
47
+ })
48
+
49
+ if (!result.ok) {
50
+ return {
51
+ content: [
52
+ {
53
+ type: 'text' as const,
54
+ text: JSON.stringify({ error: result.error }, null, 2),
55
+ },
56
+ ],
57
+ isError: true,
58
+ }
59
+ }
60
+
61
+ return {
62
+ content: [
63
+ { type: 'text' as const, text: JSON.stringify(result.data, null, 2) },
64
+ ],
65
+ }
66
+ }