@nestr/mcp 0.1.45 → 0.1.46
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 +42 -2
- package/build/analytics/ga4.js +2 -5
- package/build/analytics/ga4.js.map +1 -1
- package/build/api/client.d.ts +20 -3
- package/build/api/client.d.ts.map +1 -1
- package/build/api/client.js +54 -6
- package/build/api/client.js.map +1 -1
- package/build/http.d.ts.map +1 -1
- package/build/http.js +94 -40
- package/build/http.js.map +1 -1
- package/build/oauth/storage.d.ts +8 -0
- package/build/oauth/storage.d.ts.map +1 -1
- package/build/oauth/storage.js +65 -0
- package/build/oauth/storage.js.map +1 -1
- package/build/server.d.ts.map +1 -1
- package/build/server.js +67 -221
- package/build/server.js.map +1 -1
- package/build/skills/doing-work.d.ts +10 -0
- package/build/skills/doing-work.d.ts.map +1 -0
- package/build/skills/doing-work.js +257 -0
- package/build/skills/doing-work.js.map +1 -0
- package/build/skills/tension-processing.d.ts.map +1 -1
- package/build/skills/tension-processing.js +88 -12
- package/build/skills/tension-processing.js.map +1 -1
- package/build/tools/index.d.ts +810 -65
- package/build/tools/index.d.ts.map +1 -1
- package/build/tools/index.js +219 -41
- package/build/tools/index.js.map +1 -1
- package/package.json +7 -5
- package/web/favicon.png +0 -0
- package/web/index.html +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAiB,KAAK,WAAW,EAA6C,MAAM,kBAAkB,CAAC;AA+E9G,eAAO,MAAM,OAAO
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAiB,KAAK,WAAW,EAA6C,MAAM,kBAAkB,CAAC;AA+E9G,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAianB,CAAC;AAQF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmhC3B,CAAC;AAGF,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAuBF,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,UAAU,CAAC,CAcrB"}
|
package/build/tools/index.js
CHANGED
|
@@ -77,7 +77,7 @@ export const schemas = {
|
|
|
77
77
|
}),
|
|
78
78
|
createWorkspace: z.object({
|
|
79
79
|
title: z.string().describe("Workspace name"),
|
|
80
|
-
purpose: z.string().optional().describe("Workspace purpose
|
|
80
|
+
purpose: z.string().optional().describe("Workspace purpose — the aspirational future state of the organization. Defines the north star that all circles and roles serve."),
|
|
81
81
|
type: z.enum(['personal', 'collaborative']).optional().describe("'personal' for individual use (free forever), 'collaborative' for team use (free trial, then paid). Defaults to 'collaborative'."),
|
|
82
82
|
governance: z.enum(['holacracy', 'sociocracy', 'roles_circles']).optional().describe("Self-organization model. Defaults to 'roles_circles' (generic role-based)."),
|
|
83
83
|
plan: z.enum(['starter', 'pro']).optional().describe("Subscription plan for collaborative workspaces. Defaults to 'pro' (17-day trial)."),
|
|
@@ -104,8 +104,8 @@ export const schemas = {
|
|
|
104
104
|
createNest: z.object({
|
|
105
105
|
parentId: z.string().describe("Parent nest ID (workspace, circle, or project)"),
|
|
106
106
|
title: z.string().describe("Title of the new nest (plain text, HTML stripped)"),
|
|
107
|
-
purpose: z.string().optional().describe("Purpose
|
|
108
|
-
description: z.string().optional().describe("Detailed description
|
|
107
|
+
purpose: z.string().optional().describe("Purpose — the aspirational future state this nest is working towards. Most important for workspaces, circles, and roles where it defines the north star and context boundary. For other nests, prefer description or fields for detailed information — but purpose can be set if meaningful. Supports HTML."),
|
|
108
|
+
description: z.string().optional().describe("Detailed description — the primary field for storing information about a nest. Use for project details, task context, acceptance criteria, Definition of Done, etc. Supports HTML: <b>, <i>, <code>, <ul>, <li>, <a>."),
|
|
109
109
|
labels: z.array(z.string()).optional().describe("Label IDs to apply"),
|
|
110
110
|
users: z.array(z.string()).optional().describe("User IDs to assign (required for tasks/projects to associate with a person)"),
|
|
111
111
|
accountabilities: z.array(z.string()).optional().describe("Accountability titles for roles/circles. Only used when labels include 'role' or 'circle'. Each string becomes an accountability child nest."),
|
|
@@ -115,8 +115,8 @@ export const schemas = {
|
|
|
115
115
|
updateNest: z.object({
|
|
116
116
|
nestId: z.string().describe("Nest ID to update"),
|
|
117
117
|
title: z.string().optional().describe("New title (plain text, HTML stripped)"),
|
|
118
|
-
purpose: z.string().optional().describe("New purpose
|
|
119
|
-
description: z.string().optional().describe("New description
|
|
118
|
+
purpose: z.string().optional().describe("New purpose — the aspirational future state. Most important for workspaces, circles, and roles. For other nests, prefer description or fields — but purpose can be set if meaningful. Supports HTML."),
|
|
119
|
+
description: z.string().optional().describe("New description — the primary field for detailed information. Use for project details, task context, acceptance criteria, etc. Supports HTML."),
|
|
120
120
|
parentId: z.string().optional().describe("New parent ID (move nest to different location, e.g., move inbox item to a role or project)"),
|
|
121
121
|
labels: z.array(z.string()).optional().describe("Label IDs to set (e.g., ['project'] to convert an item into a project)"),
|
|
122
122
|
fields: z.record(z.unknown()).optional().describe("Field updates (e.g., { 'project.status': 'Current' })"),
|
|
@@ -295,7 +295,7 @@ export const schemas = {
|
|
|
295
295
|
markNotificationsRead: z.object({}),
|
|
296
296
|
// Tension tools
|
|
297
297
|
createTension: z.object({
|
|
298
|
-
nestId: z.string().describe("ID of the
|
|
298
|
+
nestId: z.string().describe("ID of the role or circle to create the tension on. Use a role ID when that role is sensing the tension. Use a circle ID for cross-role, governance, or personally sensed tensions."),
|
|
299
299
|
title: z.string().describe("The gap you're sensing — what is the difference between current reality and desired state (plain text)"),
|
|
300
300
|
description: z.string().optional().describe("The observable facts — what you see/hear/experience that creates this tension (supports HTML)"),
|
|
301
301
|
feeling: z.string().optional().describe("The feeling this tension evokes in you — separated from the facts to keep the organizational response clean (plain text)"),
|
|
@@ -333,35 +333,58 @@ export const schemas = {
|
|
|
333
333
|
_id: z.string().optional().describe("ID of an existing governance item to change or remove. Omit to propose a new item."),
|
|
334
334
|
title: z.string().optional().describe("Title for the governance item"),
|
|
335
335
|
labels: z.array(z.string()).optional().describe("Labels defining the item type (e.g., ['role'], ['circle'], ['policy'], ['accountability'], ['domain'])"),
|
|
336
|
-
purpose: z.string().optional().describe("Purpose
|
|
337
|
-
description: z.string().optional().describe("Description
|
|
336
|
+
purpose: z.string().optional().describe("Purpose — aspirational future state. Most important for roles/circles where it defines the north star. Supports HTML."),
|
|
337
|
+
description: z.string().optional().describe("Description — detailed information about the item. Supports HTML."),
|
|
338
338
|
parentId: z.string().optional().describe("Parent ID — use to move/restructure items (e.g., move role to different circle)"),
|
|
339
339
|
users: z.array(z.string()).optional().describe("User IDs to assign (e.g., for role elections: assign the elected user to the role)"),
|
|
340
340
|
due: z.string().optional().describe("Due date / re-election date (ISO format)"),
|
|
341
|
-
accountabilities: z.array(z.string()).optional().describe("Accountability titles to set on a role (replaces
|
|
342
|
-
domains: z.array(z.string()).optional().describe("Domain titles to set on a role (replaces
|
|
343
|
-
removeNest: z.boolean().optional().describe("Set to true with _id to propose removal of the existing governance item"),
|
|
341
|
+
accountabilities: z.array(z.string()).optional().describe("Accountability titles to set on a role (replaces all — use children endpoint for individual management)"),
|
|
342
|
+
domains: z.array(z.string()).optional().describe("Domain titles to set on a role (replaces all — use children endpoint for individual management)"),
|
|
344
343
|
}),
|
|
345
344
|
modifyTensionPart: z.object({
|
|
346
345
|
nestId: z.string().describe("ID of the circle or role the tension belongs to"),
|
|
347
346
|
tensionId: z.string().describe("Tension ID"),
|
|
348
347
|
partId: z.string().describe("Part ID to modify"),
|
|
349
348
|
title: z.string().optional().describe("Updated title"),
|
|
350
|
-
purpose: z.string().optional().describe("Updated purpose
|
|
351
|
-
description: z.string().optional().describe("Updated description
|
|
349
|
+
purpose: z.string().optional().describe("Updated purpose — aspirational future state. Most important for roles/circles. Supports HTML."),
|
|
350
|
+
description: z.string().optional().describe("Updated description — detailed information. Supports HTML."),
|
|
352
351
|
labels: z.array(z.string()).optional().describe("Updated labels"),
|
|
353
352
|
parentId: z.string().optional().describe("Updated parent ID"),
|
|
354
353
|
users: z.array(z.string()).optional().describe("Updated user assignments"),
|
|
355
354
|
due: z.string().optional().describe("Updated due date (ISO format)"),
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
domains: z.array(z.string()).optional().describe("Updated domains"),
|
|
355
|
+
accountabilities: z.array(z.string()).optional().describe("Updated accountabilities (replaces all — use children endpoint for individual management)"),
|
|
356
|
+
domains: z.array(z.string()).optional().describe("Updated domains (replaces all — use children endpoint for individual management)"),
|
|
359
357
|
}),
|
|
360
358
|
removeTensionPart: z.object({
|
|
361
359
|
nestId: z.string().describe("ID of the circle or role the tension belongs to"),
|
|
362
360
|
tensionId: z.string().describe("Tension ID"),
|
|
363
361
|
partId: z.string().describe("Part ID to remove from the proposal"),
|
|
364
362
|
}),
|
|
363
|
+
getTensionPartChildren: z.object({
|
|
364
|
+
nestId: z.string().describe("ID of the circle or role the tension belongs to"),
|
|
365
|
+
tensionId: z.string().describe("Tension ID"),
|
|
366
|
+
partId: z.string().describe("Part ID"),
|
|
367
|
+
}),
|
|
368
|
+
createTensionPartChild: z.object({
|
|
369
|
+
nestId: z.string().describe("ID of the circle or role the tension belongs to"),
|
|
370
|
+
tensionId: z.string().describe("Tension ID"),
|
|
371
|
+
partId: z.string().describe("Part ID"),
|
|
372
|
+
title: z.string().describe("Title for the new accountability or domain"),
|
|
373
|
+
labels: z.array(z.string()).describe("Labels defining the type: ['accountability'] or ['domain']"),
|
|
374
|
+
}),
|
|
375
|
+
updateTensionPartChild: z.object({
|
|
376
|
+
nestId: z.string().describe("ID of the circle or role the tension belongs to"),
|
|
377
|
+
tensionId: z.string().describe("Tension ID"),
|
|
378
|
+
partId: z.string().describe("Part ID"),
|
|
379
|
+
childId: z.string().describe("Child ID to update"),
|
|
380
|
+
title: z.string().describe("Updated title"),
|
|
381
|
+
}),
|
|
382
|
+
deleteTensionPartChild: z.object({
|
|
383
|
+
nestId: z.string().describe("ID of the circle or role the tension belongs to"),
|
|
384
|
+
tensionId: z.string().describe("Tension ID"),
|
|
385
|
+
partId: z.string().describe("Part ID"),
|
|
386
|
+
childId: z.string().describe("Child ID to soft-delete (will remove the original accountability/domain when enacted)"),
|
|
387
|
+
}),
|
|
365
388
|
getTensionChanges: z.object({
|
|
366
389
|
nestId: z.string().describe("ID of the circle or role the tension belongs to"),
|
|
367
390
|
tensionId: z.string().describe("Tension ID"),
|
|
@@ -376,6 +399,24 @@ export const schemas = {
|
|
|
376
399
|
tensionId: z.string().describe("Tension ID"),
|
|
377
400
|
status: z.enum(["proposed", "draft"]).describe("'proposed' to submit for voting, 'draft' to retract back to draft"),
|
|
378
401
|
}),
|
|
402
|
+
// Graph link tools
|
|
403
|
+
getGraphLinks: z.object({
|
|
404
|
+
nestId: z.string().describe("Nest ID to get graph links for"),
|
|
405
|
+
relation: z.string().describe("Relation name (e.g., 'meeting' for meeting agenda items)"),
|
|
406
|
+
direction: z.enum(["outgoing", "incoming"]).optional().describe("Link direction: 'outgoing' (default) = links FROM this nest, 'incoming' = links TO this nest"),
|
|
407
|
+
limit: z.number().optional().describe("Max results per page (default 50)"),
|
|
408
|
+
page: z.number().optional().describe("Page number for pagination"),
|
|
409
|
+
}),
|
|
410
|
+
addGraphLink: z.object({
|
|
411
|
+
nestId: z.string().describe("Source nest ID"),
|
|
412
|
+
relation: z.string().describe("Relation name (e.g., 'meeting' to link a tension to a meeting as an agenda item)"),
|
|
413
|
+
targetId: z.string().describe("Target nest ID to link to"),
|
|
414
|
+
}),
|
|
415
|
+
removeGraphLink: z.object({
|
|
416
|
+
nestId: z.string().describe("Source nest ID"),
|
|
417
|
+
relation: z.string().describe("Relation name (e.g., 'meeting')"),
|
|
418
|
+
targetId: z.string().describe("Target nest ID to unlink"),
|
|
419
|
+
}),
|
|
379
420
|
};
|
|
380
421
|
// Tool annotations for MCP - hints for clients on tool behavior
|
|
381
422
|
const readOnly = { annotations: { readOnlyHint: true, destructiveHint: false } };
|
|
@@ -505,8 +546,8 @@ export const toolDefinitions = [
|
|
|
505
546
|
properties: {
|
|
506
547
|
parentId: { type: "string", description: "Parent nest ID (workspace, circle, or project)" },
|
|
507
548
|
title: { type: "string", description: "Title of the new nest (plain text, HTML tags stripped)" },
|
|
508
|
-
purpose: { type: "string", description: "Purpose
|
|
509
|
-
description: { type: "string", description: "Detailed description
|
|
549
|
+
purpose: { type: "string", description: "Purpose — the aspirational future state this nest works towards. Most important for workspaces/circles/roles where it defines the north star and context boundary. For other nests, prefer description or fields — but purpose can be set if meaningful. Supports HTML." },
|
|
550
|
+
description: { type: "string", description: "Detailed description — primary field for nest information: project details, task context, acceptance criteria, DoD, etc. Use fields (e.g., project.status) for structured data and comments for progress updates. Supports HTML." },
|
|
510
551
|
labels: {
|
|
511
552
|
type: "array",
|
|
512
553
|
items: { type: "string" },
|
|
@@ -544,8 +585,8 @@ export const toolDefinitions = [
|
|
|
544
585
|
properties: {
|
|
545
586
|
nestId: { type: "string", description: "Nest ID to update" },
|
|
546
587
|
title: { type: "string", description: "New title (plain text, HTML tags stripped)" },
|
|
547
|
-
purpose: { type: "string", description: "New purpose
|
|
548
|
-
description: { type: "string", description: "New description
|
|
588
|
+
purpose: { type: "string", description: "New purpose — aspirational future state. Most important for workspaces/circles/roles. For other nests, prefer description or fields — but purpose can be set if meaningful. Supports HTML." },
|
|
589
|
+
description: { type: "string", description: "New description — primary field for nest information. Use for details, context, criteria. Use fields for structured data, comments for progress. Supports HTML." },
|
|
549
590
|
parentId: { type: "string", description: "New parent ID (move nest to different location)" },
|
|
550
591
|
labels: {
|
|
551
592
|
type: "array",
|
|
@@ -1127,11 +1168,11 @@ export const toolDefinitions = [
|
|
|
1127
1168
|
// Tension tools
|
|
1128
1169
|
{
|
|
1129
1170
|
name: "nestr_create_tension",
|
|
1130
|
-
description: "Create a new tension — the fundamental unit of inter-role communication. Tensions represent a gap between current reality and potential. Use for ALL cross-role communication: requesting information, sharing information, requesting outcomes/projects, requesting actions/tasks, or setting expectations (governance).
|
|
1171
|
+
description: "Create a new tension — the fundamental unit of inter-role communication. Tensions represent a gap between current reality and potential. Use for ALL cross-role communication: requesting information, sharing information, requesting outcomes/projects, requesting actions/tasks, or setting expectations (governance). Placement matters: use a role ID as nestId when that role is sensing the tension, or a circle ID for cross-role, governance, or personally sensed tensions.",
|
|
1131
1172
|
inputSchema: {
|
|
1132
1173
|
type: "object",
|
|
1133
1174
|
properties: {
|
|
1134
|
-
nestId: { type: "string", description: "ID of the
|
|
1175
|
+
nestId: { type: "string", description: "ID of the role or circle to create the tension on. Place on a role to indicate that role is sensing the tension. Place on a circle for cross-role or governance tensions (use individual-action label if sensed personally without role authority)." },
|
|
1135
1176
|
title: { type: "string", description: "The gap — what is the difference between current reality and desired state (plain text)" },
|
|
1136
1177
|
description: { type: "string", description: "The observable facts — what you see/hear/experience (supports HTML)" },
|
|
1137
1178
|
feeling: { type: "string", description: "The feeling this tension evokes — separated to keep the organizational response clean (plain text)" },
|
|
@@ -1216,11 +1257,13 @@ export const toolDefinitions = [
|
|
|
1216
1257
|
name: "nestr_add_tension_part",
|
|
1217
1258
|
description: `Add a governance change to a tension. Three modes based on input:
|
|
1218
1259
|
|
|
1219
|
-
**New item** (no _id): Propose creating a new governance item. Provide title and labels (e.g., ["role"], ["circle"], ["policy"], ["accountability"], ["domain"]). For roles, include accountabilities and/or domains.
|
|
1260
|
+
**New item** (no _id): Propose creating a new governance item. Provide title and labels (e.g., ["role"], ["circle"], ["policy"], ["accountability"], ["domain"]). For roles, include accountabilities and/or domains as bulk shorthand.
|
|
1261
|
+
|
|
1262
|
+
**Change existing item** (_id provided): Propose changes to an existing governance item. Provide the _id of the item plus fields to change. Supports title/purpose changes, restructuring (parentId to move between circles), conversions (labels to convert role↔circle), user assignment changes (for elections), and accountability/domain changes. When updating a role with _id, if accountabilities/domains arrays are not provided, existing children are auto-copied into the proposal — use nestr_get_tension_part_children to list them and manage individually.
|
|
1220
1263
|
|
|
1221
|
-
**
|
|
1264
|
+
**Remove existing item** (_id only, no other fields): Use nestr_remove_tension_part after adding the part, or use DELETE /parts to propose removal.
|
|
1222
1265
|
|
|
1223
|
-
|
|
1266
|
+
The accountabilities/domains arrays are bulk shorthand — they replace all children at once. For individual management (rename, add, remove single accountabilities/domains), use the tension part children tools instead.`,
|
|
1224
1267
|
inputSchema: {
|
|
1225
1268
|
type: "object",
|
|
1226
1269
|
properties: {
|
|
@@ -1234,9 +1277,8 @@ export const toolDefinitions = [
|
|
|
1234
1277
|
parentId: { type: "string", description: "Parent ID — use to move/restructure items (e.g., move role to different circle)" },
|
|
1235
1278
|
users: { type: "array", items: { type: "string" }, description: "User IDs to assign (e.g., for elections: assign elected user to the role)" },
|
|
1236
1279
|
due: { type: "string", description: "Due date / re-election date (ISO format)" },
|
|
1237
|
-
accountabilities: { type: "array", items: { type: "string" }, description: "Accountability titles to set on a role (replaces
|
|
1238
|
-
domains: { type: "array", items: { type: "string" }, description: "Domain titles to set on a role (replaces
|
|
1239
|
-
removeNest: { type: "boolean", description: "Set to true with _id to propose removal of the existing governance item" },
|
|
1280
|
+
accountabilities: { type: "array", items: { type: "string" }, description: "Accountability titles to set on a role (replaces all — use children endpoint for individual management)" },
|
|
1281
|
+
domains: { type: "array", items: { type: "string" }, description: "Domain titles to set on a role (replaces all — use children endpoint for individual management)" },
|
|
1240
1282
|
},
|
|
1241
1283
|
required: ["nestId", "tensionId"],
|
|
1242
1284
|
},
|
|
@@ -1244,7 +1286,7 @@ export const toolDefinitions = [
|
|
|
1244
1286
|
},
|
|
1245
1287
|
{
|
|
1246
1288
|
name: "nestr_modify_tension_part",
|
|
1247
|
-
description: "Modify an existing proposal part. Use to refine proposed values after initial creation — e.g., adjust a role's title or
|
|
1289
|
+
description: "Modify an existing proposal part. Use to refine proposed values after initial creation — e.g., adjust a role's title or purpose. For individual accountability/domain changes, prefer the children endpoint (nestr_get_tension_part_children, etc.).",
|
|
1248
1290
|
inputSchema: {
|
|
1249
1291
|
type: "object",
|
|
1250
1292
|
properties: {
|
|
@@ -1258,9 +1300,8 @@ export const toolDefinitions = [
|
|
|
1258
1300
|
parentId: { type: "string", description: "Updated parent ID" },
|
|
1259
1301
|
users: { type: "array", items: { type: "string" }, description: "Updated user assignments" },
|
|
1260
1302
|
due: { type: "string", description: "Updated due date (ISO format)" },
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
domains: { type: "array", items: { type: "string" }, description: "Updated domains" },
|
|
1303
|
+
accountabilities: { type: "array", items: { type: "string" }, description: "Updated accountabilities (replaces all — use children endpoint for individual management)" },
|
|
1304
|
+
domains: { type: "array", items: { type: "string" }, description: "Updated domains (replaces all — use children endpoint for individual management)" },
|
|
1264
1305
|
},
|
|
1265
1306
|
required: ["nestId", "tensionId", "partId"],
|
|
1266
1307
|
},
|
|
@@ -1268,7 +1309,7 @@ export const toolDefinitions = [
|
|
|
1268
1309
|
},
|
|
1269
1310
|
{
|
|
1270
1311
|
name: "nestr_remove_tension_part",
|
|
1271
|
-
description: "Remove a part from the proposal entirely
|
|
1312
|
+
description: "Remove a part from the proposal entirely, or propose deletion of a governance item. When used on a part that references an existing item (_id), this proposes removal of that governance item. When used on a part for a new item, it simply removes the proposal part.",
|
|
1272
1313
|
inputSchema: {
|
|
1273
1314
|
type: "object",
|
|
1274
1315
|
properties: {
|
|
@@ -1280,6 +1321,63 @@ export const toolDefinitions = [
|
|
|
1280
1321
|
},
|
|
1281
1322
|
...destructive,
|
|
1282
1323
|
},
|
|
1324
|
+
{
|
|
1325
|
+
name: "nestr_get_tension_part_children",
|
|
1326
|
+
description: "List children (accountabilities/domains) of a proposal part. When a part proposes changes to an existing role (_id), existing accountabilities/domains are auto-copied into the proposal. Use this to see them and then manage individually with create/update/delete children tools.",
|
|
1327
|
+
inputSchema: {
|
|
1328
|
+
type: "object",
|
|
1329
|
+
properties: {
|
|
1330
|
+
nestId: { type: "string", description: "ID of the circle or role the tension belongs to" },
|
|
1331
|
+
tensionId: { type: "string", description: "Tension ID" },
|
|
1332
|
+
partId: { type: "string", description: "Part ID" },
|
|
1333
|
+
},
|
|
1334
|
+
required: ["nestId", "tensionId", "partId"],
|
|
1335
|
+
},
|
|
1336
|
+
},
|
|
1337
|
+
{
|
|
1338
|
+
name: "nestr_create_tension_part_child",
|
|
1339
|
+
description: "Add a new accountability or domain to a proposal part. When the proposal is enacted, this creates a new accountability/domain on the role.",
|
|
1340
|
+
inputSchema: {
|
|
1341
|
+
type: "object",
|
|
1342
|
+
properties: {
|
|
1343
|
+
nestId: { type: "string", description: "ID of the circle or role the tension belongs to" },
|
|
1344
|
+
tensionId: { type: "string", description: "Tension ID" },
|
|
1345
|
+
partId: { type: "string", description: "Part ID" },
|
|
1346
|
+
title: { type: "string", description: "Title for the new accountability or domain" },
|
|
1347
|
+
labels: { type: "array", items: { type: "string" }, description: "Labels defining the type: ['accountability'] or ['domain']" },
|
|
1348
|
+
},
|
|
1349
|
+
required: ["nestId", "tensionId", "partId", "title", "labels"],
|
|
1350
|
+
},
|
|
1351
|
+
},
|
|
1352
|
+
{
|
|
1353
|
+
name: "nestr_update_tension_part_child",
|
|
1354
|
+
description: "Rename an accountability or domain within a proposal part. When the proposal is enacted, the original accountability/domain is updated.",
|
|
1355
|
+
inputSchema: {
|
|
1356
|
+
type: "object",
|
|
1357
|
+
properties: {
|
|
1358
|
+
nestId: { type: "string", description: "ID of the circle or role the tension belongs to" },
|
|
1359
|
+
tensionId: { type: "string", description: "Tension ID" },
|
|
1360
|
+
partId: { type: "string", description: "Part ID" },
|
|
1361
|
+
childId: { type: "string", description: "Child ID to update" },
|
|
1362
|
+
title: { type: "string", description: "Updated title" },
|
|
1363
|
+
},
|
|
1364
|
+
required: ["nestId", "tensionId", "partId", "childId", "title"],
|
|
1365
|
+
},
|
|
1366
|
+
},
|
|
1367
|
+
{
|
|
1368
|
+
name: "nestr_delete_tension_part_child",
|
|
1369
|
+
description: "Soft-delete an accountability or domain from a proposal part. When the proposal is enacted, the original accountability/domain is removed from the role.",
|
|
1370
|
+
inputSchema: {
|
|
1371
|
+
type: "object",
|
|
1372
|
+
properties: {
|
|
1373
|
+
nestId: { type: "string", description: "ID of the circle or role the tension belongs to" },
|
|
1374
|
+
tensionId: { type: "string", description: "Tension ID" },
|
|
1375
|
+
partId: { type: "string", description: "Part ID" },
|
|
1376
|
+
childId: { type: "string", description: "Child ID to soft-delete" },
|
|
1377
|
+
},
|
|
1378
|
+
required: ["nestId", "tensionId", "partId", "childId"],
|
|
1379
|
+
},
|
|
1380
|
+
},
|
|
1283
1381
|
{
|
|
1284
1382
|
name: "nestr_get_tension_changes",
|
|
1285
1383
|
description: "Get the namespaced diff for a proposal part. Returns { nestId, variable, newValue, oldValue } entries showing exactly what will change. Variables are namespaced: role.title, accountability.title, domain.title, policy.title, etc. For creates: oldValue is null. For deletes: newValue is null.",
|
|
@@ -1321,6 +1419,51 @@ export const toolDefinitions = [
|
|
|
1321
1419
|
},
|
|
1322
1420
|
...mutating,
|
|
1323
1421
|
},
|
|
1422
|
+
// Graph link tools
|
|
1423
|
+
{
|
|
1424
|
+
name: "nestr_get_graph_links",
|
|
1425
|
+
description: "Get nests linked via a named graph relation. Use relation 'meeting' on a meeting with direction 'incoming' to get its agenda items (linked tensions), or on a tension with direction 'outgoing' to see which meetings it's on. Supports pagination.",
|
|
1426
|
+
inputSchema: {
|
|
1427
|
+
type: "object",
|
|
1428
|
+
properties: {
|
|
1429
|
+
nestId: { type: "string", description: "Nest ID to get graph links for" },
|
|
1430
|
+
relation: { type: "string", description: "Relation name (e.g., 'meeting' for meeting agenda items)" },
|
|
1431
|
+
direction: { type: "string", enum: ["outgoing", "incoming"], description: "Link direction: 'outgoing' (default) = links FROM this nest, 'incoming' = links TO this nest" },
|
|
1432
|
+
limit: { type: "number", description: "Max results per page (default 50)" },
|
|
1433
|
+
page: { type: "number", description: "Page number for pagination" },
|
|
1434
|
+
},
|
|
1435
|
+
required: ["nestId", "relation"],
|
|
1436
|
+
},
|
|
1437
|
+
...readOnly,
|
|
1438
|
+
},
|
|
1439
|
+
{
|
|
1440
|
+
name: "nestr_add_graph_link",
|
|
1441
|
+
description: "Create a bidirectional graph link between two nests. Primary use case: link a tension to a meeting as an agenda item using relation 'meeting' (nestId = tension, targetId = meeting). Links are bidirectional — queryable from either side.",
|
|
1442
|
+
inputSchema: {
|
|
1443
|
+
type: "object",
|
|
1444
|
+
properties: {
|
|
1445
|
+
nestId: { type: "string", description: "Source nest ID" },
|
|
1446
|
+
relation: { type: "string", description: "Relation name (e.g., 'meeting' to link a tension to a meeting)" },
|
|
1447
|
+
targetId: { type: "string", description: "Target nest ID to link to" },
|
|
1448
|
+
},
|
|
1449
|
+
required: ["nestId", "relation", "targetId"],
|
|
1450
|
+
},
|
|
1451
|
+
...mutating,
|
|
1452
|
+
},
|
|
1453
|
+
{
|
|
1454
|
+
name: "nestr_remove_graph_link",
|
|
1455
|
+
description: "Remove a graph link between two nests. For example, remove a tension from a meeting's agenda by removing the 'meeting' relation.",
|
|
1456
|
+
inputSchema: {
|
|
1457
|
+
type: "object",
|
|
1458
|
+
properties: {
|
|
1459
|
+
nestId: { type: "string", description: "Source nest ID" },
|
|
1460
|
+
relation: { type: "string", description: "Relation name (e.g., 'meeting')" },
|
|
1461
|
+
targetId: { type: "string", description: "Target nest ID to unlink" },
|
|
1462
|
+
},
|
|
1463
|
+
required: ["nestId", "relation", "targetId"],
|
|
1464
|
+
},
|
|
1465
|
+
...destructive,
|
|
1466
|
+
},
|
|
1324
1467
|
];
|
|
1325
1468
|
// Strip description fields from nest objects in response data
|
|
1326
1469
|
function stripDescriptionFields(data) {
|
|
@@ -1824,14 +1967,9 @@ async function _handleToolCall(client, name, args) {
|
|
|
1824
1967
|
}
|
|
1825
1968
|
case "nestr_add_tension_part": {
|
|
1826
1969
|
const parsed = schemas.addTensionPart.parse(args);
|
|
1827
|
-
const { nestId, tensionId,
|
|
1828
|
-
if (body._id
|
|
1829
|
-
// Propose
|
|
1830
|
-
const part = await client.proposeTensionRemoval(nestId, tensionId, { _id: body._id });
|
|
1831
|
-
return formatResult({ message: "Removal proposal added successfully", part });
|
|
1832
|
-
}
|
|
1833
|
-
else if (body._id) {
|
|
1834
|
-
// Propose change to existing item
|
|
1970
|
+
const { nestId, tensionId, ...body } = parsed;
|
|
1971
|
+
if (body._id) {
|
|
1972
|
+
// Propose change to existing item (existing children auto-copied if accountabilities/domains not provided)
|
|
1835
1973
|
const part = await client.proposeTensionChange(nestId, tensionId, body);
|
|
1836
1974
|
return formatResult({ message: "Change proposal added successfully", part });
|
|
1837
1975
|
}
|
|
@@ -1852,6 +1990,26 @@ async function _handleToolCall(client, name, args) {
|
|
|
1852
1990
|
await client.removeTensionPart(parsed.nestId, parsed.tensionId, parsed.partId);
|
|
1853
1991
|
return formatResult({ message: `Tension part ${parsed.partId} removed successfully` });
|
|
1854
1992
|
}
|
|
1993
|
+
case "nestr_get_tension_part_children": {
|
|
1994
|
+
const parsed = schemas.getTensionPartChildren.parse(args);
|
|
1995
|
+
const children = await client.getTensionPartChildren(parsed.nestId, parsed.tensionId, parsed.partId);
|
|
1996
|
+
return formatResult(children);
|
|
1997
|
+
}
|
|
1998
|
+
case "nestr_create_tension_part_child": {
|
|
1999
|
+
const parsed = schemas.createTensionPartChild.parse(args);
|
|
2000
|
+
const child = await client.createTensionPartChild(parsed.nestId, parsed.tensionId, parsed.partId, { title: parsed.title, labels: parsed.labels });
|
|
2001
|
+
return formatResult({ message: "Child created successfully", child });
|
|
2002
|
+
}
|
|
2003
|
+
case "nestr_update_tension_part_child": {
|
|
2004
|
+
const parsed = schemas.updateTensionPartChild.parse(args);
|
|
2005
|
+
const child = await client.updateTensionPartChild(parsed.nestId, parsed.tensionId, parsed.partId, parsed.childId, { title: parsed.title });
|
|
2006
|
+
return formatResult({ message: "Child updated successfully", child });
|
|
2007
|
+
}
|
|
2008
|
+
case "nestr_delete_tension_part_child": {
|
|
2009
|
+
const parsed = schemas.deleteTensionPartChild.parse(args);
|
|
2010
|
+
await client.deleteTensionPartChild(parsed.nestId, parsed.tensionId, parsed.partId, parsed.childId);
|
|
2011
|
+
return formatResult({ message: `Child ${parsed.childId} soft-deleted successfully` });
|
|
2012
|
+
}
|
|
1855
2013
|
case "nestr_get_tension_changes": {
|
|
1856
2014
|
const parsed = schemas.getTensionChanges.parse(args);
|
|
1857
2015
|
const changes = await client.getTensionPartChanges(parsed.nestId, parsed.tensionId, parsed.partId);
|
|
@@ -1867,6 +2025,26 @@ async function _handleToolCall(client, name, args) {
|
|
|
1867
2025
|
const status = await client.updateTensionStatus(parsed.nestId, parsed.tensionId, parsed.status);
|
|
1868
2026
|
return formatResult({ message: `Tension status updated to '${parsed.status}'`, status });
|
|
1869
2027
|
}
|
|
2028
|
+
// Graph link tools
|
|
2029
|
+
case "nestr_get_graph_links": {
|
|
2030
|
+
const parsed = schemas.getGraphLinks.parse(args);
|
|
2031
|
+
const result = await client.getGraphLinks(parsed.nestId, parsed.relation, {
|
|
2032
|
+
direction: parsed.direction,
|
|
2033
|
+
limit: parsed.limit,
|
|
2034
|
+
page: parsed.page,
|
|
2035
|
+
});
|
|
2036
|
+
return formatResult(compactResponse(result));
|
|
2037
|
+
}
|
|
2038
|
+
case "nestr_add_graph_link": {
|
|
2039
|
+
const parsed = schemas.addGraphLink.parse(args);
|
|
2040
|
+
const result = await client.addGraphLink(parsed.nestId, parsed.relation, parsed.targetId);
|
|
2041
|
+
return formatResult(result);
|
|
2042
|
+
}
|
|
2043
|
+
case "nestr_remove_graph_link": {
|
|
2044
|
+
const parsed = schemas.removeGraphLink.parse(args);
|
|
2045
|
+
const result = await client.removeGraphLink(parsed.nestId, parsed.relation, parsed.targetId);
|
|
2046
|
+
return formatResult({ message: "Graph link removed" });
|
|
2047
|
+
}
|
|
1870
2048
|
default:
|
|
1871
2049
|
return formatError({
|
|
1872
2050
|
error: true,
|