@mpowr/nexus-mcp 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +59 -0
  2. package/dist/auth.d.ts +39 -0
  3. package/dist/auth.d.ts.map +1 -0
  4. package/dist/auth.js +47 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/nexus-api.d.ts +29 -0
  7. package/dist/nexus-api.d.ts.map +1 -0
  8. package/dist/nexus-api.js +76 -0
  9. package/dist/nexus-api.js.map +1 -0
  10. package/dist/server.d.ts +65 -0
  11. package/dist/server.d.ts.map +1 -0
  12. package/dist/server.js +183 -0
  13. package/dist/server.js.map +1 -0
  14. package/dist/tools/add-task-note.d.ts +34 -0
  15. package/dist/tools/add-task-note.d.ts.map +1 -0
  16. package/dist/tools/add-task-note.js +39 -0
  17. package/dist/tools/add-task-note.js.map +1 -0
  18. package/dist/tools/append-session-entry.d.ts +53 -0
  19. package/dist/tools/append-session-entry.d.ts.map +1 -0
  20. package/dist/tools/append-session-entry.js +67 -0
  21. package/dist/tools/append-session-entry.js.map +1 -0
  22. package/dist/tools/create-task.d.ts +52 -0
  23. package/dist/tools/create-task.d.ts.map +1 -0
  24. package/dist/tools/create-task.js +51 -0
  25. package/dist/tools/create-task.js.map +1 -0
  26. package/dist/tools/decision-comments.d.ts +54 -0
  27. package/dist/tools/decision-comments.d.ts.map +1 -0
  28. package/dist/tools/decision-comments.js +80 -0
  29. package/dist/tools/decision-comments.js.map +1 -0
  30. package/dist/tools/get-document.d.ts +47 -0
  31. package/dist/tools/get-document.d.ts.map +1 -0
  32. package/dist/tools/get-document.js +68 -0
  33. package/dist/tools/get-document.js.map +1 -0
  34. package/dist/tools/get-project-memory.d.ts +47 -0
  35. package/dist/tools/get-project-memory.d.ts.map +1 -0
  36. package/dist/tools/get-project-memory.js +53 -0
  37. package/dist/tools/get-project-memory.js.map +1 -0
  38. package/dist/tools/get-related-entities.d.ts +44 -0
  39. package/dist/tools/get-related-entities.d.ts.map +1 -0
  40. package/dist/tools/get-related-entities.js +60 -0
  41. package/dist/tools/get-related-entities.js.map +1 -0
  42. package/dist/tools/governance.d.ts +90 -0
  43. package/dist/tools/governance.d.ts.map +1 -0
  44. package/dist/tools/governance.js +124 -0
  45. package/dist/tools/governance.js.map +1 -0
  46. package/dist/tools/ingest-document.d.ts +40 -0
  47. package/dist/tools/ingest-document.d.ts.map +1 -0
  48. package/dist/tools/ingest-document.js +48 -0
  49. package/dist/tools/ingest-document.js.map +1 -0
  50. package/dist/tools/letter-inbox.d.ts +80 -0
  51. package/dist/tools/letter-inbox.d.ts.map +1 -0
  52. package/dist/tools/letter-inbox.js +118 -0
  53. package/dist/tools/letter-inbox.js.map +1 -0
  54. package/dist/tools/letters.d.ts +91 -0
  55. package/dist/tools/letters.d.ts.map +1 -0
  56. package/dist/tools/letters.js +112 -0
  57. package/dist/tools/letters.js.map +1 -0
  58. package/dist/tools/project-list.d.ts +28 -0
  59. package/dist/tools/project-list.d.ts.map +1 -0
  60. package/dist/tools/project-list.js +43 -0
  61. package/dist/tools/project-list.js.map +1 -0
  62. package/dist/tools/reviews.d.ts +145 -0
  63. package/dist/tools/reviews.d.ts.map +1 -0
  64. package/dist/tools/reviews.js +216 -0
  65. package/dist/tools/reviews.js.map +1 -0
  66. package/dist/tools/search-knowledge.d.ts +48 -0
  67. package/dist/tools/search-knowledge.d.ts.map +1 -0
  68. package/dist/tools/search-knowledge.js +54 -0
  69. package/dist/tools/search-knowledge.js.map +1 -0
  70. package/dist/tools/sessions.d.ts +81 -0
  71. package/dist/tools/sessions.d.ts.map +1 -0
  72. package/dist/tools/sessions.js +120 -0
  73. package/dist/tools/sessions.js.map +1 -0
  74. package/dist/tools/skill-assign.d.ts +77 -0
  75. package/dist/tools/skill-assign.d.ts.map +1 -0
  76. package/dist/tools/skill-assign.js +108 -0
  77. package/dist/tools/skill-assign.js.map +1 -0
  78. package/dist/tools/skills.d.ts +138 -0
  79. package/dist/tools/skills.d.ts.map +1 -0
  80. package/dist/tools/skills.js +192 -0
  81. package/dist/tools/skills.js.map +1 -0
  82. package/dist/tools/update-task-status.d.ts +48 -0
  83. package/dist/tools/update-task-status.d.ts.map +1 -0
  84. package/dist/tools/update-task-status.js +51 -0
  85. package/dist/tools/update-task-status.js.map +1 -0
  86. package/package.json +30 -0
  87. package/src/__tests__/auth.test.ts +162 -0
  88. package/src/__tests__/decision-comments.test.ts +173 -0
  89. package/src/__tests__/helpers.ts +58 -0
  90. package/src/__tests__/layer1-knowledge.test.ts +302 -0
  91. package/src/__tests__/layer2-coordination.test.ts +775 -0
  92. package/src/__tests__/layer3-governance.test.ts +205 -0
  93. package/src/__tests__/project-list-and-skill-assign.test.ts +282 -0
  94. package/src/__tests__/reviews.test.ts +420 -0
  95. package/src/__tests__/server.test.ts +238 -0
  96. package/src/__tests__/setup.ts +15 -0
  97. package/src/auth.ts +81 -0
  98. package/src/nexus-api.ts +110 -0
  99. package/src/server.ts +499 -0
  100. package/src/tools/add-task-note.ts +50 -0
  101. package/src/tools/append-session-entry.ts +83 -0
  102. package/src/tools/create-task.ts +66 -0
  103. package/src/tools/decision-comments.ts +102 -0
  104. package/src/tools/get-document.ts +80 -0
  105. package/src/tools/get-project-memory.ts +65 -0
  106. package/src/tools/get-related-entities.ts +73 -0
  107. package/src/tools/governance.ts +162 -0
  108. package/src/tools/ingest-document.ts +64 -0
  109. package/src/tools/letter-inbox.ts +157 -0
  110. package/src/tools/letters.ts +144 -0
  111. package/src/tools/project-list.ts +52 -0
  112. package/src/tools/reviews.ts +277 -0
  113. package/src/tools/search-knowledge.ts +68 -0
  114. package/src/tools/sessions.ts +154 -0
  115. package/src/tools/skill-assign.ts +142 -0
  116. package/src/tools/skills.ts +252 -0
  117. package/src/tools/update-task-status.ts +64 -0
  118. package/tsconfig.json +20 -0
  119. package/vitest.config.ts +8 -0
package/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # nexus-mcp
2
+
3
+ MCP server for the mpowr-nexus platform. Provides the mediation layer between
4
+ local agent runtimes (terminals) and the Nexus HTTP API.
5
+
6
+ ## Architecture
7
+
8
+ The server exposes 36 tools across 4 layers via the Model Context Protocol
9
+ (stdio transport). All data access goes through the Nexus API — the MCP server
10
+ has no direct database access.
11
+
12
+ - **Layer 1 — Knowledge Access:** kb_search, kb_memory, kb_get, kb_related, project_list
13
+ - **Layer 2 — Coordination:** vault letters (vl_create/vl_reply/vl_inbox/vl_outbox/vl_ack),
14
+ tasks (task_create/task_update/task_note), sessions (session_create/session_list/session_close/session_append),
15
+ decision comments (dc_add/dc_list), document ingestion (doc_ingest),
16
+ skills (sk_list/sk_get/sk_create/sk_update/sk_activate/sk_assign/sk_unassign/sk_export)
17
+ - **Layer 3 — Governance:** ADR lifecycle (adr_create/adr_submit/adr_decide)
18
+ - **Layer 4 — Reviews:** entity reviews (rv_list/rv_get/rv_create/rv_decide/rv_comment)
19
+
20
+ ## Authentication
21
+
22
+ Identity is resolved once at startup via `GET /api/mcp/identity` using the
23
+ `NEXUS_PRIVATE_TOKEN` as a Bearer token. All subsequent API calls use the same
24
+ token for authentication. The Nexus backend resolves the token to a user
25
+ identity and enforces project-scoped RBAC.
26
+
27
+ ## Environment Variables
28
+
29
+ | Variable | Required | Description |
30
+ |---|---|---|
31
+ | `NEXUS_API_URL` | yes | Nexus API base URL (e.g. `https://nexus.mpowr.tech`) |
32
+ | `NEXUS_PRIVATE_TOKEN` | yes | nxs_pat_* API token for identity resolution |
33
+
34
+ ## Development
35
+
36
+ ```bash
37
+ npm install
38
+ npm run typecheck # TypeScript check
39
+ npm test # Run tests
40
+ npm run build # Compile to dist/
41
+ npm run dev # Run via tsx (development)
42
+ npm start # Run compiled JS (production)
43
+ ```
44
+
45
+ ## Project Structure
46
+
47
+ ```
48
+ src/
49
+ server.ts # MCP server entry point (stdio transport)
50
+ auth.ts # Token-based identity resolution via Nexus API
51
+ nexus-api.ts # HTTP client for Nexus API (nexusGet, nexusPost)
52
+ tools/ # Tool modules (36 tools total)
53
+ __tests__/ # Unit tests with mocked API responses
54
+ ```
55
+
56
+ ## Related
57
+
58
+ - [nexus](https://github.com/mpowr-it/nexus) — Backend + Frontend (Next.js/Supabase/Netlify)
59
+ - [nexus-cli](https://github.com/mpowr-it/nexus-cli) — Rust CLI client
package/dist/auth.d.ts ADDED
@@ -0,0 +1,39 @@
1
+ /**
2
+ * MCP Authentication Layer
3
+ *
4
+ * Resolves the NEXUS_PRIVATE_TOKEN environment variable at server startup
5
+ * to a verified user identity by calling the Nexus API identity endpoint.
6
+ *
7
+ * Flow:
8
+ * 1. Read NEXUS_PRIVATE_TOKEN from process.env
9
+ * 2. Call GET /api/mcp/identity with Bearer token
10
+ * 3. Cache resolved identity for the lifetime of the MCP process
11
+ */
12
+ export interface McpIdentity {
13
+ userId: string;
14
+ email: string | null;
15
+ displayName: string | null;
16
+ isPlatformAdmin: boolean;
17
+ isPlatformOwner: boolean;
18
+ tenantId: string | null;
19
+ memberships: Array<{
20
+ project_id: string;
21
+ role: string;
22
+ }>;
23
+ agentAssignments: Array<{
24
+ project_id: string;
25
+ agent_id: string;
26
+ agent_owner: string;
27
+ }>;
28
+ }
29
+ /**
30
+ * Resolve the MCP server identity from NEXUS_PRIVATE_TOKEN.
31
+ * Called once at server startup. Caches the result.
32
+ * Throws if no valid token is available.
33
+ */
34
+ export declare function initIdentity(): Promise<McpIdentity>;
35
+ /**
36
+ * Get the cached MCP identity. Must call initIdentity() first.
37
+ */
38
+ export declare function getIdentity(): McpIdentity;
39
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,eAAe,EAAE,OAAO,CAAA;IACxB,eAAe,EAAE,OAAO,CAAA;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,WAAW,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxD,gBAAgB,EAAE,KAAK,CAAC;QACtB,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,CAAA;QAChB,WAAW,EAAE,MAAM,CAAA;KACpB,CAAC,CAAA;CACH;AASD;;;;GAIG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC,CAyBzD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,WAAW,CAKzC"}
package/dist/auth.js ADDED
@@ -0,0 +1,47 @@
1
+ /**
2
+ * MCP Authentication Layer
3
+ *
4
+ * Resolves the NEXUS_PRIVATE_TOKEN environment variable at server startup
5
+ * to a verified user identity by calling the Nexus API identity endpoint.
6
+ *
7
+ * Flow:
8
+ * 1. Read NEXUS_PRIVATE_TOKEN from process.env
9
+ * 2. Call GET /api/mcp/identity with Bearer token
10
+ * 3. Cache resolved identity for the lifetime of the MCP process
11
+ */
12
+ import { nexusGet } from './nexus-api.js';
13
+ // Module-level cache: resolved once at startup
14
+ let _identity = null;
15
+ // ---------------------------------------------------------------------------
16
+ // Public API
17
+ // ---------------------------------------------------------------------------
18
+ /**
19
+ * Resolve the MCP server identity from NEXUS_PRIVATE_TOKEN.
20
+ * Called once at server startup. Caches the result.
21
+ * Throws if no valid token is available.
22
+ */
23
+ export async function initIdentity() {
24
+ if (_identity)
25
+ return _identity;
26
+ const rawToken = process.env.NEXUS_PRIVATE_TOKEN;
27
+ if (!rawToken) {
28
+ throw new Error('MCP: NEXUS_PRIVATE_TOKEN is not set. The MCP server requires a valid nxs_pat_* token.');
29
+ }
30
+ const result = await nexusGet('/api/mcp/identity');
31
+ if (!result.ok || !result.data) {
32
+ throw new Error(`MCP: Identity resolution failed: ${result.error ?? 'Unknown error'}. Check that the token is valid, not expired, and not revoked.`);
33
+ }
34
+ _identity = result.data;
35
+ console.error(`[nexus-mcp] Identity resolved: ${_identity.displayName ?? _identity.email ?? _identity.userId} (admin=${_identity.isPlatformAdmin}, owner=${_identity.isPlatformOwner})`);
36
+ return _identity;
37
+ }
38
+ /**
39
+ * Get the cached MCP identity. Must call initIdentity() first.
40
+ */
41
+ export function getIdentity() {
42
+ if (!_identity) {
43
+ throw new Error('MCP: Identity not initialized. Call initIdentity() first.');
44
+ }
45
+ return _identity;
46
+ }
47
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAqBzC,+CAA+C;AAC/C,IAAI,SAAS,GAAuB,IAAI,CAAA;AAExC,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,SAAS;QAAE,OAAO,SAAS,CAAA;IAE/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAA;IAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAc,mBAAmB,CAAC,CAAA;IAE/D,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,oCAAoC,MAAM,CAAC,KAAK,IAAI,eAAe,gEAAgE,CACpI,CAAA;IACH,CAAC;IAED,SAAS,GAAG,MAAM,CAAC,IAAI,CAAA;IAEvB,OAAO,CAAC,KAAK,CACX,kCAAkC,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,MAAM,WAAW,SAAS,CAAC,eAAe,WAAW,SAAS,CAAC,eAAe,GAAG,CAC1K,CAAA;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;IAC9E,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Nexus API client for MCP server context.
3
+ *
4
+ * Replaces direct Supabase access with HTTP calls to the Nexus API.
5
+ * All operations go through /api/mcp/* endpoints, authenticated
6
+ * via the NEXUS_PRIVATE_TOKEN (nxs_pat_*) Bearer token.
7
+ */
8
+ export interface NexusApiResponse<T = unknown> {
9
+ ok: boolean;
10
+ status: number;
11
+ data: T | null;
12
+ error: string | null;
13
+ }
14
+ /**
15
+ * Make an authenticated request to the Nexus API.
16
+ */
17
+ export declare function nexusApi<T = unknown>(path: string, options?: {
18
+ method?: 'GET' | 'POST' | 'PATCH' | 'DELETE';
19
+ body?: unknown;
20
+ }): Promise<NexusApiResponse<T>>;
21
+ /**
22
+ * Convenience: POST to a Nexus MCP endpoint.
23
+ */
24
+ export declare function nexusPost<T = unknown>(path: string, body: unknown): Promise<NexusApiResponse<T>>;
25
+ /**
26
+ * Convenience: GET from a Nexus MCP endpoint.
27
+ */
28
+ export declare function nexusGet<T = unknown>(path: string): Promise<NexusApiResponse<T>>;
29
+ //# sourceMappingURL=nexus-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexus-api.d.ts","sourceRoot":"","sources":["../src/nexus-api.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA6BH,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IAC3C,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,GAAG,OAAO,EACxC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAA;CACV,GACL,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAuC9B;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,CAAC,GAAG,OAAO,EACzC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAE9B;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,GAAG,OAAO,EACxC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAE9B"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Nexus API client for MCP server context.
3
+ *
4
+ * Replaces direct Supabase access with HTTP calls to the Nexus API.
5
+ * All operations go through /api/mcp/* endpoints, authenticated
6
+ * via the NEXUS_PRIVATE_TOKEN (nxs_pat_*) Bearer token.
7
+ */
8
+ let _baseUrl = null;
9
+ let _token = null;
10
+ function getConfig() {
11
+ if (_baseUrl && _token)
12
+ return { baseUrl: _baseUrl, token: _token };
13
+ const url = process.env.NEXUS_API_URL ?? process.env.NEXUS_URL;
14
+ const token = process.env.NEXUS_PRIVATE_TOKEN;
15
+ if (!url) {
16
+ throw new Error('MCP: Missing NEXUS_API_URL. Set the base URL of the Nexus app (e.g. https://nexus.mpowr.tech).');
17
+ }
18
+ if (!token) {
19
+ throw new Error('MCP: Missing NEXUS_PRIVATE_TOKEN. The MCP server requires a valid nxs_pat_* token.');
20
+ }
21
+ // Normalize: strip trailing slash
22
+ _baseUrl = url.replace(/\/$/, '');
23
+ _token = token.trim();
24
+ return { baseUrl: _baseUrl, token: _token };
25
+ }
26
+ /**
27
+ * Make an authenticated request to the Nexus API.
28
+ */
29
+ export async function nexusApi(path, options = {}) {
30
+ const { baseUrl, token } = getConfig();
31
+ const method = options.method ?? 'GET';
32
+ const url = `${baseUrl}${path}`;
33
+ const headers = {
34
+ Authorization: `Bearer ${token}`,
35
+ 'Content-Type': 'application/json',
36
+ };
37
+ try {
38
+ const fetchOpts = { method, headers };
39
+ if (options.body !== undefined) {
40
+ fetchOpts.body = JSON.stringify(options.body);
41
+ }
42
+ const response = await fetch(url, fetchOpts);
43
+ const data = (await response.json());
44
+ if (!response.ok) {
45
+ return {
46
+ ok: false,
47
+ status: response.status,
48
+ data: null,
49
+ error: data?.error ??
50
+ `HTTP ${response.status}`,
51
+ };
52
+ }
53
+ return { ok: true, status: response.status, data, error: null };
54
+ }
55
+ catch (err) {
56
+ return {
57
+ ok: false,
58
+ status: 0,
59
+ data: null,
60
+ error: err instanceof Error ? err.message : 'Unknown fetch error',
61
+ };
62
+ }
63
+ }
64
+ /**
65
+ * Convenience: POST to a Nexus MCP endpoint.
66
+ */
67
+ export async function nexusPost(path, body) {
68
+ return nexusApi(path, { method: 'POST', body });
69
+ }
70
+ /**
71
+ * Convenience: GET from a Nexus MCP endpoint.
72
+ */
73
+ export async function nexusGet(path) {
74
+ return nexusApi(path, { method: 'GET' });
75
+ }
76
+ //# sourceMappingURL=nexus-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexus-api.js","sourceRoot":"","sources":["../src/nexus-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * nexus-mcp -- MCP Server for mpowr-nexus
4
+ *
5
+ * Provides Knowledge Access (Layer 1), Coordination (Layer 2),
6
+ * Governance (Layer 3), and Reviews (Layer 4) tools.
7
+ * Runs as a standalone stdio MCP server.
8
+ *
9
+ * Authentication:
10
+ * Identity is resolved once at startup from NEXUS_PRIVATE_TOKEN (nxs_pat_*).
11
+ * All write tools receive user_id automatically from the resolved identity.
12
+ * Callers no longer pass user_id as a parameter.
13
+ *
14
+ * Layer 1 - Knowledge Access:
15
+ * - kb_search: Search project knowledge (keyword/semantic/hybrid)
16
+ * - kb_memory: Curated project context for agent bootstrapping
17
+ * - kb_get: Fetch a single knowledge object
18
+ * - kb_related: Navigate entity relationships
19
+ * - project_list: List accessible projects
20
+ *
21
+ * Layer 2 - Coordination:
22
+ * - vl_create: Create a new vault letter
23
+ * - vl_reply: Reply to an existing vault letter
24
+ * - vl_inbox: List letters addressed to the calling agent/user
25
+ * - vl_outbox: List letters sent by the calling agent/user
26
+ * - vl_ack: Acknowledge receipt of a new vault letter
27
+ * - task_create: Create a task in a project
28
+ * - task_update: Update task status, priority, or assignee
29
+ * - task_note: Append a note to a task (append-only)
30
+ * - dc_add: Add a comment to an ADR (append-only)
31
+ * - dc_list: List comments for an ADR
32
+ * - sk_list: List skills for the current tenant
33
+ * - sk_get: Get full skill content by identifier
34
+ * - sk_create: Create a new skill in draft status
35
+ * - sk_update: Update skill content or metadata
36
+ * - sk_activate: Change skill status (draft/active/archived)
37
+ * - sk_assign: Assign a skill to a project
38
+ * - sk_unassign: Remove a skill assignment from a project
39
+ * - sk_export: Export all skill assignments for a project
40
+ * - doc_ingest: Push text/markdown content into project knowledge base
41
+ * - session_append: Append to a session (write-isolated)
42
+ * - session_create: Start a new work session
43
+ * - session_close: End a session with summary and next entry point
44
+ * - session_list: List open sessions for a project
45
+ *
46
+ * Layer 3 - Governance:
47
+ * - adr_create: Create a new ADR draft
48
+ * - adr_submit: Submit an ADR for review
49
+ * - adr_decide: Accept or reject an ADR
50
+ *
51
+ * Layer 4 - Reviews:
52
+ * - rv_list: List reviews with optional filters
53
+ * - rv_get: Get a review by ID or entity reference
54
+ * - rv_create: Create a new review for an entity
55
+ * - rv_decide: Transition a review state
56
+ * - rv_comment: Add a comment to a review
57
+ *
58
+ * Usage:
59
+ * npx tsx src/mcp/server.ts
60
+ *
61
+ * Or via .mcp.json configuration:
62
+ * { "command": "npx", "args": ["tsx", "src/mcp/server.ts"] }
63
+ */
64
+ export {};
65
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG"}
package/dist/server.js ADDED
@@ -0,0 +1,183 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * nexus-mcp -- MCP Server for mpowr-nexus
4
+ *
5
+ * Provides Knowledge Access (Layer 1), Coordination (Layer 2),
6
+ * Governance (Layer 3), and Reviews (Layer 4) tools.
7
+ * Runs as a standalone stdio MCP server.
8
+ *
9
+ * Authentication:
10
+ * Identity is resolved once at startup from NEXUS_PRIVATE_TOKEN (nxs_pat_*).
11
+ * All write tools receive user_id automatically from the resolved identity.
12
+ * Callers no longer pass user_id as a parameter.
13
+ *
14
+ * Layer 1 - Knowledge Access:
15
+ * - kb_search: Search project knowledge (keyword/semantic/hybrid)
16
+ * - kb_memory: Curated project context for agent bootstrapping
17
+ * - kb_get: Fetch a single knowledge object
18
+ * - kb_related: Navigate entity relationships
19
+ * - project_list: List accessible projects
20
+ *
21
+ * Layer 2 - Coordination:
22
+ * - vl_create: Create a new vault letter
23
+ * - vl_reply: Reply to an existing vault letter
24
+ * - vl_inbox: List letters addressed to the calling agent/user
25
+ * - vl_outbox: List letters sent by the calling agent/user
26
+ * - vl_ack: Acknowledge receipt of a new vault letter
27
+ * - task_create: Create a task in a project
28
+ * - task_update: Update task status, priority, or assignee
29
+ * - task_note: Append a note to a task (append-only)
30
+ * - dc_add: Add a comment to an ADR (append-only)
31
+ * - dc_list: List comments for an ADR
32
+ * - sk_list: List skills for the current tenant
33
+ * - sk_get: Get full skill content by identifier
34
+ * - sk_create: Create a new skill in draft status
35
+ * - sk_update: Update skill content or metadata
36
+ * - sk_activate: Change skill status (draft/active/archived)
37
+ * - sk_assign: Assign a skill to a project
38
+ * - sk_unassign: Remove a skill assignment from a project
39
+ * - sk_export: Export all skill assignments for a project
40
+ * - doc_ingest: Push text/markdown content into project knowledge base
41
+ * - session_append: Append to a session (write-isolated)
42
+ * - session_create: Start a new work session
43
+ * - session_close: End a session with summary and next entry point
44
+ * - session_list: List open sessions for a project
45
+ *
46
+ * Layer 3 - Governance:
47
+ * - adr_create: Create a new ADR draft
48
+ * - adr_submit: Submit an ADR for review
49
+ * - adr_decide: Accept or reject an ADR
50
+ *
51
+ * Layer 4 - Reviews:
52
+ * - rv_list: List reviews with optional filters
53
+ * - rv_get: Get a review by ID or entity reference
54
+ * - rv_create: Create a new review for an entity
55
+ * - rv_decide: Transition a review state
56
+ * - rv_comment: Add a comment to a review
57
+ *
58
+ * Usage:
59
+ * npx tsx src/mcp/server.ts
60
+ *
61
+ * Or via .mcp.json configuration:
62
+ * { "command": "npx", "args": ["tsx", "src/mcp/server.ts"] }
63
+ */
64
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
65
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
66
+ import { getIdentity, initIdentity } from './auth.js';
67
+ // Layer 1: Knowledge Access
68
+ import { projectList, projectListSchema } from './tools/project-list.js';
69
+ import { getDocument, getDocumentSchema } from './tools/get-document.js';
70
+ import { getProjectMemory, getProjectMemorySchema, } from './tools/get-project-memory.js';
71
+ import { getRelatedEntities, getRelatedEntitiesSchema, } from './tools/get-related-entities.js';
72
+ import { searchKnowledge, searchKnowledgeSchema, } from './tools/search-knowledge.js';
73
+ // Layer 2: Coordination
74
+ import { addTaskNote, addTaskNoteSchema } from './tools/add-task-note.js';
75
+ import { appendSessionEntry, appendSessionEntrySchema, } from './tools/append-session-entry.js';
76
+ import { createTask, createTaskSchema } from './tools/create-task.js';
77
+ import { addDecisionComment, addDecisionCommentSchema, listDecisionComments, listDecisionCommentsSchema, } from './tools/decision-comments.js';
78
+ import { ingestDocument, ingestDocumentSchema, } from './tools/ingest-document.js';
79
+ import { acknowledgeLetter, acknowledgeLetterSchema, listInbox, listInboxSchema, listOutbox, listOutboxSchema, } from './tools/letter-inbox.js';
80
+ import { createLetter, createLetterSchema, replyLetter, replyLetterSchema, } from './tools/letters.js';
81
+ import { closeSession, closeSessionSchema, createSession, createSessionSchema, listOpenSessions, listOpenSessionsSchema, } from './tools/sessions.js';
82
+ import { skActivate, skActivateSchema, skCreate, skCreateSchema, skGet, skGetSchema, skList, skListSchema, skUpdate, skUpdateSchema, } from './tools/skills.js';
83
+ import { skAssign, skAssignSchema, skExport, skExportSchema, skUnassign, skUnassignSchema, } from './tools/skill-assign.js';
84
+ import { updateTaskStatus, updateTaskStatusSchema, } from './tools/update-task-status.js';
85
+ // Layer 3: Governance
86
+ import { createAdrDraft, createAdrDraftSchema, recordAdrDecision, recordAdrDecisionSchema, submitAdrReview, submitAdrReviewSchema, } from './tools/governance.js';
87
+ // Layer 4: Reviews
88
+ import { rvComment, rvCommentSchema, rvCreate, rvCreateSchema, rvDecide, rvDecideSchema, rvGet, rvGetSchema, rvList, rvListSchema, } from './tools/reviews.js';
89
+ // ---------------------------------------------------------------------------
90
+ // Identity injection helper
91
+ // ---------------------------------------------------------------------------
92
+ /**
93
+ * Wrap a write-tool handler to inject user_id from the resolved identity.
94
+ * The caller does not need to pass user_id — it comes from the token.
95
+ */
96
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
97
+ function withIdentity(handler) {
98
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
99
+ return async (args) => {
100
+ const identity = getIdentity();
101
+ return handler({ ...args, user_id: identity.userId });
102
+ };
103
+ }
104
+ // ---------------------------------------------------------------------------
105
+ // Server setup
106
+ // ---------------------------------------------------------------------------
107
+ const server = new McpServer({
108
+ name: 'nexus-mcp',
109
+ version: '0.5.0',
110
+ }, {
111
+ capabilities: {
112
+ tools: {},
113
+ },
114
+ });
115
+ // ---------------------------------------------------------------------------
116
+ // Layer 1: Knowledge Access tools
117
+ // ---------------------------------------------------------------------------
118
+ server.tool('kb_search', 'Search project knowledge using keyword, semantic, or hybrid mode. Applies project scope filters before retrieval. Returns matching entities with relevance ranking.', searchKnowledgeSchema, async (args) => searchKnowledge(args));
119
+ server.tool('kb_memory', 'Get curated project context for agent bootstrapping. Returns ADRs, active tasks, recent sessions, open letters, and other project knowledge based on selected categories and depth.', getProjectMemorySchema, async (args) => getProjectMemory(args));
120
+ server.tool('kb_get', 'Fetch a single knowledge object (session, decision, letter, task, etc.) in structured, markdown, or summary format. Includes child entries for sessions and letters.', getDocumentSchema, async (args) => getDocument(args));
121
+ server.tool('kb_related', 'Navigate entity relationships. Returns graph-neighbor entities related to a given item, such as supersession chains for ADRs, thread siblings for letters, or tasks created during sessions.', getRelatedEntitiesSchema, async (args) => getRelatedEntities(args));
122
+ server.tool('project_list', 'List accessible projects for the authenticated user or agent. Returns project metadata ordered by name.', projectListSchema, async (args) => projectList(args));
123
+ // ---------------------------------------------------------------------------
124
+ // Layer 2: Coordination tools
125
+ // ---------------------------------------------------------------------------
126
+ server.tool('vl_create', 'Create a new vault letter for agent-to-agent or agent-to-human coordination. Returns the new letter ID and status.', createLetterSchema, withIdentity(createLetter));
127
+ server.tool('vl_reply', 'Reply to an existing vault letter with a new message. Optionally update the letter status. Enforces append-only semantics.', replyLetterSchema, withIdentity(replyLetter));
128
+ server.tool('vl_inbox', 'List vault letters addressed to the calling agent or user. Returns letters scoped to the given project, ordered by blocking status and recency. Supports status filtering.', listInboxSchema, withIdentity(listInbox));
129
+ server.tool('vl_outbox', 'List vault letters sent by the calling agent or user. Returns letters scoped to the given project, ordered by recency. Supports status filtering.', listOutboxSchema, withIdentity(listOutbox));
130
+ server.tool('vl_ack', 'Acknowledge receipt of a new vault letter. Transitions the letter from new to acknowledged status and appends an acknowledgment message.', acknowledgeLetterSchema, withIdentity(acknowledgeLetter));
131
+ server.tool('task_create', 'Create a new task within a project scope. Returns the new task ID.', createTaskSchema, withIdentity(createTask));
132
+ server.tool('task_update', 'Update the status of an existing task. Optionally change priority or assignee. Automatically records a status-change note for audit trail.', updateTaskStatusSchema, withIdentity(updateTaskStatus));
133
+ server.tool('task_note', 'Append a note to an existing task. Notes are append-only and maintain a chronological audit trail. Useful for recording progress, blockers, or decisions.', addTaskNoteSchema, withIdentity(addTaskNote));
134
+ 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));
135
+ 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));
136
+ 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));
137
+ 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));
138
+ server.tool('session_list', 'List open sessions for a project. Returns sessions ordered by creation date (newest first). Useful for checking active work before starting a new session.', listOpenSessionsSchema, async (args) => listOpenSessions(args));
139
+ // ---------------------------------------------------------------------------
140
+ // Layer 2 (continued): Decision comment tools
141
+ // ---------------------------------------------------------------------------
142
+ server.tool('dc_add', 'Add a comment to an ADR decision. Comments are append-only and support both human and agent actors.', addDecisionCommentSchema, withIdentity(addDecisionComment));
143
+ server.tool('dc_list', 'List comments for an ADR decision in chronological order.', listDecisionCommentsSchema, async (args) => listDecisionComments(args));
144
+ // ---------------------------------------------------------------------------
145
+ // Layer 2 (continued): Skill management tools
146
+ // ---------------------------------------------------------------------------
147
+ server.tool('sk_list', 'List skills for the current tenant. Supports status filtering (draft, active, archived). Returns skill metadata without full body content.', skListSchema, withIdentity(skList));
148
+ server.tool('sk_get', 'Get full skill content by skill identifier or UUID. Includes associated command information.', skGetSchema, withIdentity(skGet));
149
+ server.tool('sk_create', 'Create a new skill in draft status. Optionally auto-generates an OpenCode command. Skill content is markdown-based instruction text.', skCreateSchema, withIdentity(skCreate));
150
+ server.tool('sk_update', 'Update an existing skill content, metadata, or command auto-generation setting. Increments version when body changes.', skUpdateSchema, withIdentity(skUpdate));
151
+ server.tool('sk_activate', 'Change a skill status (draft, active, archived). Active skills are available for agent loading and project selection.', skActivateSchema, withIdentity(skActivate));
152
+ server.tool('sk_assign', 'Assign a skill to a project. Optionally pin to a specific version and set enabled state.', skAssignSchema, withIdentity(skAssign));
153
+ server.tool('sk_unassign', 'Remove a skill assignment from a project.', skUnassignSchema, withIdentity(skUnassign));
154
+ server.tool('sk_export', 'Export all skill assignments for a project. Returns the full assignment list with pinned versions and enabled states.', skExportSchema, withIdentity(skExport));
155
+ // ---------------------------------------------------------------------------
156
+ // Layer 3: Governance tools
157
+ // ---------------------------------------------------------------------------
158
+ server.tool('adr_create', 'Create a new ADR (Architecture Decision Record) in draft state. Auto-assigns the next ADR number for the project. Optionally links to a superseded ADR.', createAdrDraftSchema, withIdentity(createAdrDraft));
159
+ server.tool('adr_submit', 'Submit an ADR for review. Transitions an ADR from draft to under_review state. Only drafts can be submitted.', submitAdrReviewSchema, withIdentity(submitAdrReview));
160
+ server.tool('adr_decide', 'Accept or reject an ADR that is under review. If accepted and it supersedes another ADR, the superseded ADR is automatically marked. Optional rationale is appended to the ADR body.', recordAdrDecisionSchema, withIdentity(recordAdrDecision));
161
+ // ---------------------------------------------------------------------------
162
+ // Layer 4: Review tools
163
+ // ---------------------------------------------------------------------------
164
+ server.tool('rv_list', 'List reviews with optional filters by entity type and status. Returns reviews ordered by recency.', rvListSchema, withIdentity(rvList));
165
+ server.tool('rv_get', 'Get a review by review ID, or by entity type and entity ID. Returns full review details including status and history.', rvGetSchema, withIdentity(rvGet));
166
+ server.tool('rv_create', 'Create a new review for a skill or agent entity. Returns the new review ID and initial status.', rvCreateSchema, withIdentity(rvCreate));
167
+ server.tool('rv_decide', 'Transition a review state (submit, accept, reject, request_revision, resubmit, archive). Enforces valid state transitions. Optional rationale is recorded.', rvDecideSchema, withIdentity(rvDecide));
168
+ server.tool('rv_comment', 'Add a comment to a review. Supports inline comments with optional line range. Comments are append-only and maintain a chronological audit trail.', rvCommentSchema, withIdentity(rvComment));
169
+ // ---------------------------------------------------------------------------
170
+ // Start
171
+ // ---------------------------------------------------------------------------
172
+ async function main() {
173
+ // Resolve identity from NEXUS_PRIVATE_TOKEN before accepting connections
174
+ await initIdentity();
175
+ const transport = new StdioServerTransport();
176
+ await server.connect(transport);
177
+ console.error('[nexus-mcp] Server started on stdio');
178
+ }
179
+ main().catch((err) => {
180
+ console.error('[nexus-mcp] Fatal error:', err);
181
+ process.exit(1);
182
+ });
183
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * task_note -- Layer 2 Coordination
3
+ *
4
+ * Appends a note to an existing task. Notes are append-only and
5
+ * maintain a chronological history/timeline.
6
+ * Delegates to POST /api/mcp/tasks (action: task_note).
7
+ */
8
+ import { z } from 'zod';
9
+ export declare const addTaskNoteSchema: {
10
+ task_id: z.ZodString;
11
+ note: z.ZodString;
12
+ agent_id: z.ZodOptional<z.ZodString>;
13
+ };
14
+ type AddTaskNoteArgs = {
15
+ task_id: string;
16
+ note: string;
17
+ user_id: string;
18
+ agent_id?: string;
19
+ };
20
+ export declare function addTaskNote(args: AddTaskNoteArgs): Promise<{
21
+ content: {
22
+ type: "text";
23
+ text: string;
24
+ }[];
25
+ isError: boolean;
26
+ } | {
27
+ content: {
28
+ type: "text";
29
+ text: string;
30
+ }[];
31
+ isError?: undefined;
32
+ }>;
33
+ export {};
34
+ //# sourceMappingURL=add-task-note.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-task-note.d.ts","sourceRoot":"","sources":["../../src/tools/add-task-note.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,iBAAiB;;;;CAI7B,CAAA;AAED,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe;;;;;;;;;;;;GAyBtD"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * task_note -- Layer 2 Coordination
3
+ *
4
+ * Appends a note to an existing task. Notes are append-only and
5
+ * maintain a chronological history/timeline.
6
+ * Delegates to POST /api/mcp/tasks (action: task_note).
7
+ */
8
+ import { z } from 'zod';
9
+ import { nexusPost } from '../nexus-api.js';
10
+ export const addTaskNoteSchema = {
11
+ task_id: z.string().uuid().describe('Task UUID to add a note to'),
12
+ note: z.string().describe('Note content to append'),
13
+ agent_id: z.string().optional().describe('Agent identifier if applicable'),
14
+ };
15
+ export async function addTaskNote(args) {
16
+ const result = await nexusPost('/api/mcp/tasks', {
17
+ action: 'task_note',
18
+ task_id: args.task_id,
19
+ note: args.note,
20
+ agent_id: args.agent_id,
21
+ });
22
+ if (!result.ok) {
23
+ return {
24
+ content: [
25
+ {
26
+ type: 'text',
27
+ text: JSON.stringify({ error: result.error }, null, 2),
28
+ },
29
+ ],
30
+ isError: true,
31
+ };
32
+ }
33
+ return {
34
+ content: [
35
+ { type: 'text', text: JSON.stringify(result.data, null, 2) },
36
+ ],
37
+ };
38
+ }
39
+ //# sourceMappingURL=add-task-note.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-task-note.js","sourceRoot":"","sources":["../../src/tools/add-task-note.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,iBAAiB,GAAG;IAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACjE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IACnD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;CAC3E,CAAA;AASD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAqB;IACrD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,gBAAgB,EAAE;QAC/C,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,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"}