@nexvora/mcp-server 0.3.1

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 (148) hide show
  1. package/CHANGELOG.md +208 -0
  2. package/README.md +511 -0
  3. package/dist/NexvoraClient.d.ts +120 -0
  4. package/dist/NexvoraClient.d.ts.map +1 -0
  5. package/dist/NexvoraClient.js +266 -0
  6. package/dist/NexvoraClient.js.map +1 -0
  7. package/dist/RateLimiter.d.ts +32 -0
  8. package/dist/RateLimiter.d.ts.map +1 -0
  9. package/dist/RateLimiter.js +68 -0
  10. package/dist/RateLimiter.js.map +1 -0
  11. package/dist/auth/oauth.d.ts +53 -0
  12. package/dist/auth/oauth.d.ts.map +1 -0
  13. package/dist/auth/oauth.js +175 -0
  14. package/dist/auth/oauth.js.map +1 -0
  15. package/dist/auth/pkce.d.ts +12 -0
  16. package/dist/auth/pkce.d.ts.map +1 -0
  17. package/dist/auth/pkce.js +17 -0
  18. package/dist/auth/pkce.js.map +1 -0
  19. package/dist/cache.d.ts +16 -0
  20. package/dist/cache.d.ts.map +1 -0
  21. package/dist/cache.js +36 -0
  22. package/dist/cache.js.map +1 -0
  23. package/dist/cli.d.ts +16 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +149 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/config.d.ts +32 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +50 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/createServer.d.ts +20 -0
  32. package/dist/createServer.d.ts.map +1 -0
  33. package/dist/createServer.js +69 -0
  34. package/dist/createServer.js.map +1 -0
  35. package/dist/defineTool.d.ts +25 -0
  36. package/dist/defineTool.d.ts.map +1 -0
  37. package/dist/defineTool.js +93 -0
  38. package/dist/defineTool.js.map +1 -0
  39. package/dist/index.d.ts +10 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +31 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/server/sse.d.ts +34 -0
  44. package/dist/server/sse.d.ts.map +1 -0
  45. package/dist/server/sse.js +110 -0
  46. package/dist/server/sse.js.map +1 -0
  47. package/dist/tools/nexvora_agentstack_answer.d.ts +18 -0
  48. package/dist/tools/nexvora_agentstack_answer.d.ts.map +1 -0
  49. package/dist/tools/nexvora_agentstack_answer.js +42 -0
  50. package/dist/tools/nexvora_agentstack_answer.js.map +1 -0
  51. package/dist/tools/nexvora_agentstack_ask.d.ts +21 -0
  52. package/dist/tools/nexvora_agentstack_ask.d.ts.map +1 -0
  53. package/dist/tools/nexvora_agentstack_ask.js +49 -0
  54. package/dist/tools/nexvora_agentstack_ask.js.map +1 -0
  55. package/dist/tools/nexvora_agentstack_search.d.ts +21 -0
  56. package/dist/tools/nexvora_agentstack_search.d.ts.map +1 -0
  57. package/dist/tools/nexvora_agentstack_search.js +57 -0
  58. package/dist/tools/nexvora_agentstack_search.js.map +1 -0
  59. package/dist/tools/nexvora_consulting_book.d.ts +21 -0
  60. package/dist/tools/nexvora_consulting_book.d.ts.map +1 -0
  61. package/dist/tools/nexvora_consulting_book.js +87 -0
  62. package/dist/tools/nexvora_consulting_book.js.map +1 -0
  63. package/dist/tools/nexvora_consulting_search.d.ts +24 -0
  64. package/dist/tools/nexvora_consulting_search.d.ts.map +1 -0
  65. package/dist/tools/nexvora_consulting_search.js +48 -0
  66. package/dist/tools/nexvora_consulting_search.js.map +1 -0
  67. package/dist/tools/nexvora_feed_post.d.ts +18 -0
  68. package/dist/tools/nexvora_feed_post.d.ts.map +1 -0
  69. package/dist/tools/nexvora_feed_post.js +50 -0
  70. package/dist/tools/nexvora_feed_post.js.map +1 -0
  71. package/dist/tools/nexvora_feed_react.d.ts +15 -0
  72. package/dist/tools/nexvora_feed_react.d.ts.map +1 -0
  73. package/dist/tools/nexvora_feed_react.js +31 -0
  74. package/dist/tools/nexvora_feed_react.js.map +1 -0
  75. package/dist/tools/nexvora_knowledge_search.d.ts +21 -0
  76. package/dist/tools/nexvora_knowledge_search.d.ts.map +1 -0
  77. package/dist/tools/nexvora_knowledge_search.js +47 -0
  78. package/dist/tools/nexvora_knowledge_search.js.map +1 -0
  79. package/dist/tools/nexvora_knowledge_subscribe.d.ts +15 -0
  80. package/dist/tools/nexvora_knowledge_subscribe.d.ts.map +1 -0
  81. package/dist/tools/nexvora_knowledge_subscribe.js +63 -0
  82. package/dist/tools/nexvora_knowledge_subscribe.js.map +1 -0
  83. package/dist/tools/nexvora_observatory.d.ts +6 -0
  84. package/dist/tools/nexvora_observatory.d.ts.map +1 -0
  85. package/dist/tools/nexvora_observatory.js +56 -0
  86. package/dist/tools/nexvora_observatory.js.map +1 -0
  87. package/dist/tools/nexvora_submit_task.d.ts +24 -0
  88. package/dist/tools/nexvora_submit_task.d.ts.map +1 -0
  89. package/dist/tools/nexvora_submit_task.js +28 -0
  90. package/dist/tools/nexvora_submit_task.js.map +1 -0
  91. package/dist/tools/nexvora_wallet_balance.d.ts +6 -0
  92. package/dist/tools/nexvora_wallet_balance.d.ts.map +1 -0
  93. package/dist/tools/nexvora_wallet_balance.js +71 -0
  94. package/dist/tools/nexvora_wallet_balance.js.map +1 -0
  95. package/docs/setup/chatgpt-desktop.md +120 -0
  96. package/docs/setup/claude-code.md +152 -0
  97. package/docs/setup/cursor.md +129 -0
  98. package/package.json +59 -0
  99. package/src/NexvoraClient.ts +328 -0
  100. package/src/RateLimiter.ts +74 -0
  101. package/src/__tests__/NexvoraClient.test.ts +424 -0
  102. package/src/__tests__/RateLimiter.test.ts +151 -0
  103. package/src/__tests__/auth/oauth.test.ts +246 -0
  104. package/src/__tests__/cache.test.ts +64 -0
  105. package/src/__tests__/config.test.ts +98 -0
  106. package/src/__tests__/defineTool.test.ts +223 -0
  107. package/src/__tests__/fixtures/config.json +7 -0
  108. package/src/__tests__/integration/agentstack.integration.test.ts +259 -0
  109. package/src/__tests__/integration/auth_refresh.integration.test.ts +227 -0
  110. package/src/__tests__/integration/consulting.integration.test.ts +213 -0
  111. package/src/__tests__/integration/feed.integration.test.ts +200 -0
  112. package/src/__tests__/integration/helpers.ts +118 -0
  113. package/src/__tests__/integration/knowledge.integration.test.ts +194 -0
  114. package/src/__tests__/integration/rate_limiting.integration.test.ts +207 -0
  115. package/src/__tests__/integration/submit_task.integration.test.ts +120 -0
  116. package/src/__tests__/integration/wallet_observatory.integration.test.ts +240 -0
  117. package/src/__tests__/nexvora_agentstack_answer.test.ts +120 -0
  118. package/src/__tests__/nexvora_agentstack_ask.test.ts +140 -0
  119. package/src/__tests__/nexvora_agentstack_search.test.ts +188 -0
  120. package/src/__tests__/nexvora_consulting_book.test.ts +277 -0
  121. package/src/__tests__/nexvora_consulting_search.test.ts +153 -0
  122. package/src/__tests__/nexvora_feed_post.test.ts +147 -0
  123. package/src/__tests__/nexvora_feed_react.test.ts +98 -0
  124. package/src/__tests__/nexvora_knowledge_search.test.ts +148 -0
  125. package/src/__tests__/nexvora_knowledge_subscribe.test.ts +173 -0
  126. package/src/__tests__/nexvora_observatory.test.ts +125 -0
  127. package/src/__tests__/nexvora_wallet_balance.test.ts +165 -0
  128. package/src/auth/oauth.ts +247 -0
  129. package/src/cache.ts +34 -0
  130. package/src/cli.ts +171 -0
  131. package/src/config.ts +70 -0
  132. package/src/createServer.ts +90 -0
  133. package/src/defineTool.ts +120 -0
  134. package/src/index.ts +36 -0
  135. package/src/server/sse.ts +149 -0
  136. package/src/tools/nexvora_agentstack_answer.ts +62 -0
  137. package/src/tools/nexvora_agentstack_ask.ts +70 -0
  138. package/src/tools/nexvora_agentstack_search.ts +82 -0
  139. package/src/tools/nexvora_consulting_book.ts +130 -0
  140. package/src/tools/nexvora_consulting_search.ts +85 -0
  141. package/src/tools/nexvora_feed_post.ts +69 -0
  142. package/src/tools/nexvora_feed_react.ts +48 -0
  143. package/src/tools/nexvora_knowledge_search.ts +81 -0
  144. package/src/tools/nexvora_knowledge_subscribe.ts +90 -0
  145. package/src/tools/nexvora_observatory.ts +87 -0
  146. package/src/tools/nexvora_submit_task.ts +42 -0
  147. package/src/tools/nexvora_wallet_balance.ts +112 -0
  148. package/tsconfig.json +19 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/auth/pkce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Minimal in-process TTL cache.
3
+ *
4
+ * Avoids hammering the backend when an LLM repeatedly calls the same read-only tool
5
+ * within a short window. TTL is per-key; expired entries are evicted lazily on access.
6
+ */
7
+ export declare class TtlCache<V> {
8
+ private readonly ttlMs;
9
+ private readonly store;
10
+ constructor(ttlMs: number);
11
+ get(key: string): V | undefined;
12
+ set(key: string, value: V): void;
13
+ /** Returns the cached value if fresh, otherwise calls {@code fn} and caches the result. */
14
+ getOrFetch(key: string, fn: () => Promise<V>): Promise<V>;
15
+ }
16
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,qBAAa,QAAQ,CAAC,CAAC;IAGT,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsD;gBAE/C,KAAK,EAAE,MAAM;IAE1C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAU/B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAIhC,2FAA2F;IACrF,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAOhE"}
package/dist/cache.js ADDED
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Minimal in-process TTL cache.
3
+ *
4
+ * Avoids hammering the backend when an LLM repeatedly calls the same read-only tool
5
+ * within a short window. TTL is per-key; expired entries are evicted lazily on access.
6
+ */
7
+ export class TtlCache {
8
+ ttlMs;
9
+ store = new Map();
10
+ constructor(ttlMs) {
11
+ this.ttlMs = ttlMs;
12
+ }
13
+ get(key) {
14
+ const entry = this.store.get(key);
15
+ if (!entry)
16
+ return undefined;
17
+ if (Date.now() > entry.expiresAt) {
18
+ this.store.delete(key);
19
+ return undefined;
20
+ }
21
+ return entry.value;
22
+ }
23
+ set(key, value) {
24
+ this.store.set(key, { value, expiresAt: Date.now() + this.ttlMs });
25
+ }
26
+ /** Returns the cached value if fresh, otherwise calls {@code fn} and caches the result. */
27
+ async getOrFetch(key, fn) {
28
+ const cached = this.get(key);
29
+ if (cached !== undefined)
30
+ return cached;
31
+ const fresh = await fn();
32
+ this.set(key, fresh);
33
+ return fresh;
34
+ }
35
+ }
36
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,QAAQ;IAGU;IAFZ,KAAK,GAAG,IAAI,GAAG,EAA2C,CAAC;IAE5E,YAA6B,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;IAE9C,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAQ;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,2FAA2F;IAC3F,KAAK,CAAC,UAAU,CAAC,GAAW,EAAE,EAAoB;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * nexvora CLI
4
+ *
5
+ * Commands:
6
+ * nexvora login [--server-url URL] — OAuth Device Grant; stores tokens
7
+ * nexvora serve [--transport stdio|sse] — Start the MCP server
8
+ * [--port PORT] — SSE listen port (default 7700)
9
+ * [--server-url URL] — NexVora API base URL
10
+ *
11
+ * When run with no arguments (or as a bin via "npx @nexvora/mcp-server") the
12
+ * default behaviour is "serve --transport stdio", preserving backward compat
13
+ * with existing Claude Code / Cursor configurations.
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
package/dist/cli.js ADDED
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * nexvora CLI
4
+ *
5
+ * Commands:
6
+ * nexvora login [--server-url URL] — OAuth Device Grant; stores tokens
7
+ * nexvora serve [--transport stdio|sse] — Start the MCP server
8
+ * [--port PORT] — SSE listen port (default 7700)
9
+ * [--server-url URL] — NexVora API base URL
10
+ *
11
+ * When run with no arguments (or as a bin via "npx @nexvora/mcp-server") the
12
+ * default behaviour is "serve --transport stdio", preserving backward compat
13
+ * with existing Claude Code / Cursor configurations.
14
+ */
15
+ import { ConfigManager } from "./config.js";
16
+ import { loginInteractive } from "./auth/oauth.js";
17
+ // ── Argument parsing ──────────────────────────────────────────────────────────
18
+ const args = process.argv.slice(2);
19
+ function flag(name) {
20
+ const idx = args.indexOf(name);
21
+ return idx >= 0 ? args[idx + 1] : undefined;
22
+ }
23
+ function hasFlag(name) {
24
+ return args.includes(name);
25
+ }
26
+ const command = args[0] ?? "serve";
27
+ // ── Command dispatch ──────────────────────────────────────────────────────────
28
+ switch (command) {
29
+ case "login":
30
+ await runLogin();
31
+ break;
32
+ case "serve":
33
+ case "--transport": // allow "nexvora --transport sse" as shorthand
34
+ await runServe();
35
+ break;
36
+ case "--help":
37
+ case "-h":
38
+ case "help":
39
+ printHelp();
40
+ break;
41
+ default:
42
+ // Unknown first arg — treat the whole argv as a serve invocation
43
+ // (handles "nexvora" called with no subcommand from Claude Code)
44
+ await runServe();
45
+ }
46
+ // ── login ─────────────────────────────────────────────────────────────────────
47
+ async function runLogin() {
48
+ const serverUrl = flag("--server-url") ?? process.env["NEXVORA_BASE_URL"] ?? "https://api.nxvora.online";
49
+ console.error(`Authenticating with ${serverUrl} …`);
50
+ try {
51
+ const config = await loginInteractive(serverUrl);
52
+ const configManager = new ConfigManager();
53
+ configManager.write(config);
54
+ console.error(`\n✓ Logged in. Credentials stored in ~/.agentverse/config.json`);
55
+ console.error(` User ID : ${config.userId || "(unknown)"}`);
56
+ console.error(` Expires : ${new Date(config.expiresAt * 1000).toLocaleString()}`);
57
+ }
58
+ catch (err) {
59
+ console.error(`\n✗ Login failed: ${err.message}`);
60
+ process.exit(1);
61
+ }
62
+ }
63
+ // ── serve ─────────────────────────────────────────────────────────────────────
64
+ async function runServe() {
65
+ const transport = flag("--transport") ?? "stdio";
66
+ const port = parseInt(flag("--port") ?? "7700", 10);
67
+ const serverUrl = flag("--server-url") ?? process.env["NEXVORA_BASE_URL"] ?? "https://api.nxvora.online";
68
+ if (transport === "sse") {
69
+ await serveSSE(serverUrl, port);
70
+ }
71
+ else {
72
+ await serveStdio(serverUrl);
73
+ }
74
+ }
75
+ async function serveStdio(serverUrl) {
76
+ const { StdioServerTransport } = await import("@modelcontextprotocol/sdk/server/stdio.js");
77
+ const { createServer } = await import("./createServer.js");
78
+ const accessToken = resolveToken();
79
+ const server = await createServer({ baseUrl: serverUrl, accessToken });
80
+ const transport = new StdioServerTransport();
81
+ await server.connect(transport);
82
+ }
83
+ async function serveSSE(serverUrl, port) {
84
+ const { startSseServer } = await import("./server/sse.js");
85
+ const { createServer } = await import("./createServer.js");
86
+ const { ConfigManager } = await import("./config.js");
87
+ const accessToken = resolveToken();
88
+ const mcpServer = await createServer({ baseUrl: serverUrl, accessToken });
89
+ // Token validation: accept the token from config store or the env-var token
90
+ const configManager = new ConfigManager();
91
+ startSseServer({
92
+ port,
93
+ mcpServer,
94
+ nexvoraBaseUrl: serverUrl,
95
+ validateToken: async (bearerToken) => {
96
+ if (bearerToken === accessToken)
97
+ return true;
98
+ try {
99
+ const config = configManager.read();
100
+ return config.accessToken === bearerToken;
101
+ }
102
+ catch {
103
+ return false;
104
+ }
105
+ },
106
+ });
107
+ }
108
+ // ── Helpers ───────────────────────────────────────────────────────────────────
109
+ /**
110
+ * Resolve the access token in priority order:
111
+ * 1. NEXVORA_ACCESS_TOKEN env var (CI / Docker)
112
+ * 2. Token stored by `nexvora login` in ~/.agentverse/config.json
113
+ */
114
+ function resolveToken() {
115
+ const envToken = process.env["NEXVORA_ACCESS_TOKEN"];
116
+ if (envToken)
117
+ return envToken;
118
+ try {
119
+ const config = new ConfigManager().read();
120
+ return config.accessToken;
121
+ }
122
+ catch {
123
+ console.error("Error: no access token found.\n" +
124
+ " • Run `nexvora login` to authenticate, or\n" +
125
+ " • Set the NEXVORA_ACCESS_TOKEN environment variable.");
126
+ process.exit(1);
127
+ }
128
+ }
129
+ function printHelp() {
130
+ console.log(`
131
+ nexvora — NexVora MCP server CLI
132
+
133
+ Usage:
134
+ nexvora login [--server-url URL] Authenticate via OAuth (stores token)
135
+ nexvora serve [--transport stdio|sse] Start the MCP server (default: stdio)
136
+ [--port PORT] SSE listen port (default: 7700)
137
+ [--server-url URL] NexVora API base URL
138
+
139
+ Environment variables:
140
+ NEXVORA_ACCESS_TOKEN Raw API token (bypasses stored credentials)
141
+ NEXVORA_BASE_URL Override the default API base URL
142
+
143
+ Examples:
144
+ nexvora login
145
+ nexvora serve --transport sse --port 7700
146
+ NEXVORA_ACCESS_TOKEN=tok nexvora serve --transport stdio
147
+ `);
148
+ }
149
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface Config {
2
+ accessToken: string;
3
+ refreshToken: string;
4
+ /** Unix epoch seconds */
5
+ expiresAt: number;
6
+ serverUrl: string;
7
+ userId: string;
8
+ }
9
+ /**
10
+ * Abstraction over the config store so tools and tests can inject
11
+ * an in-memory implementation without touching the filesystem.
12
+ */
13
+ export interface IConfigStore {
14
+ read(): Config;
15
+ write(config: Config): void;
16
+ }
17
+ /** Default path: ~/.agentverse/config.json */
18
+ export declare function defaultConfigPath(): string;
19
+ /**
20
+ * Reads and writes ~/.agentverse/config.json.
21
+ *
22
+ * Writes are atomic on POSIX (write to .tmp, then rename).
23
+ * On Windows the rename is not guaranteed atomic but is still safer than
24
+ * a direct overwrite. File permissions are set to 0600 on POSIX after write.
25
+ */
26
+ export declare class ConfigManager implements IConfigStore {
27
+ private readonly configPath;
28
+ constructor(configPath?: string);
29
+ read(): Config;
30
+ write(config: Config): void;
31
+ }
32
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,IAAI,MAAM,CAAC;IACf,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,8CAA8C;AAC9C,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;;;;GAMG;AACH,qBAAa,aAAc,YAAW,YAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,GAAE,MAA4B;IAErE,IAAI,IAAI,MAAM;IAKd,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CA2B5B"}
package/dist/config.js ADDED
@@ -0,0 +1,50 @@
1
+ import * as fs from "node:fs";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ /** Default path: ~/.agentverse/config.json */
5
+ export function defaultConfigPath() {
6
+ return path.join(os.homedir(), ".agentverse", "config.json");
7
+ }
8
+ /**
9
+ * Reads and writes ~/.agentverse/config.json.
10
+ *
11
+ * Writes are atomic on POSIX (write to .tmp, then rename).
12
+ * On Windows the rename is not guaranteed atomic but is still safer than
13
+ * a direct overwrite. File permissions are set to 0600 on POSIX after write.
14
+ */
15
+ export class ConfigManager {
16
+ configPath;
17
+ constructor(configPath = defaultConfigPath()) {
18
+ this.configPath = configPath;
19
+ }
20
+ read() {
21
+ const raw = fs.readFileSync(this.configPath, "utf8");
22
+ return JSON.parse(raw);
23
+ }
24
+ write(config) {
25
+ const dir = path.dirname(this.configPath);
26
+ fs.mkdirSync(dir, { recursive: true });
27
+ const content = JSON.stringify(config, null, 2);
28
+ const tmpPath = `${this.configPath}.tmp`;
29
+ fs.writeFileSync(tmpPath, content, { encoding: "utf8", mode: 0o600 });
30
+ try {
31
+ fs.renameSync(tmpPath, this.configPath);
32
+ }
33
+ catch (err) {
34
+ // Windows: EEXIST when target exists (not atomic but acceptably safe)
35
+ if (err.code === "EEXIST") {
36
+ fs.rmSync(this.configPath, { force: true });
37
+ fs.renameSync(tmpPath, this.configPath);
38
+ }
39
+ else {
40
+ fs.rmSync(tmpPath, { force: true });
41
+ throw err;
42
+ }
43
+ }
44
+ // Restrict permissions on POSIX (no-op on Windows)
45
+ if (process.platform !== "win32") {
46
+ fs.chmodSync(this.configPath, 0o600);
47
+ }
48
+ }
49
+ }
50
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAoBlC,8CAA8C;AAC9C,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,aAAqB,iBAAiB,EAAE;QAAxC,eAAU,GAAV,UAAU,CAA8B;IAAG,CAAC;IAEzE,IAAI;QACF,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAW,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,MAAc;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1C,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,UAAU,MAAM,CAAC;QAEzC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAEtE,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,sEAAsE;YACtE,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5C,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpC,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QAED,mDAAmD;QACnD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Factory that builds and returns a fully-configured McpServer with all 12
3
+ * NexVora tools registered.
4
+ *
5
+ * Extracted from index.ts so it can be shared by both the stdio entry point
6
+ * and the SSE HTTP server without duplication.
7
+ */
8
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
+ export interface CreateServerOptions {
10
+ baseUrl: string;
11
+ accessToken: string;
12
+ agentId?: string;
13
+ }
14
+ /**
15
+ * Build a McpServer with all NexVora tools registered.
16
+ * Fetches per-tool rate limits from the backend; silently falls back to
17
+ * baked-in defaults if the network is unavailable.
18
+ */
19
+ export declare function createServer(opts: CreateServerOptions): Promise<McpServer>;
20
+ //# sourceMappingURL=createServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createServer.d.ts","sourceRoot":"","sources":["../src/createServer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkCpE,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,CAoChF"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Factory that builds and returns a fully-configured McpServer with all 12
3
+ * NexVora tools registered.
4
+ *
5
+ * Extracted from index.ts so it can be shared by both the stdio entry point
6
+ * and the SSE HTTP server without duplication.
7
+ */
8
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
+ import { defineTool } from "./defineTool.js";
10
+ import { NexvoraClient } from "./NexvoraClient.js";
11
+ import { DEFAULT_RATE_LIMITS, RateLimiterRegistry } from "./RateLimiter.js";
12
+ import { nexvora_agentstack_answer } from "./tools/nexvora_agentstack_answer.js";
13
+ import { nexvora_agentstack_ask } from "./tools/nexvora_agentstack_ask.js";
14
+ import { nexvora_agentstack_search } from "./tools/nexvora_agentstack_search.js";
15
+ import { nexvora_consulting_book } from "./tools/nexvora_consulting_book.js";
16
+ import { nexvora_consulting_search } from "./tools/nexvora_consulting_search.js";
17
+ import { nexvora_knowledge_search } from "./tools/nexvora_knowledge_search.js";
18
+ import { nexvora_knowledge_subscribe } from "./tools/nexvora_knowledge_subscribe.js";
19
+ import { nexvora_feed_post } from "./tools/nexvora_feed_post.js";
20
+ import { nexvora_feed_react } from "./tools/nexvora_feed_react.js";
21
+ import { nexvora_observatory } from "./tools/nexvora_observatory.js";
22
+ import { nexvora_submit_task } from "./tools/nexvora_submit_task.js";
23
+ import { nexvora_wallet_balance } from "./tools/nexvora_wallet_balance.js";
24
+ const ALL_TOOLS = [
25
+ nexvora_submit_task,
26
+ nexvora_wallet_balance,
27
+ nexvora_observatory,
28
+ nexvora_agentstack_search,
29
+ nexvora_agentstack_ask,
30
+ nexvora_agentstack_answer,
31
+ nexvora_feed_post,
32
+ nexvora_feed_react,
33
+ nexvora_consulting_search,
34
+ nexvora_consulting_book,
35
+ nexvora_knowledge_search,
36
+ nexvora_knowledge_subscribe,
37
+ ];
38
+ /**
39
+ * Build a McpServer with all NexVora tools registered.
40
+ * Fetches per-tool rate limits from the backend; silently falls back to
41
+ * baked-in defaults if the network is unavailable.
42
+ */
43
+ export async function createServer(opts) {
44
+ const { baseUrl, accessToken, agentId } = opts;
45
+ const client = new NexvoraClient({ baseUrl, accessToken, agentId });
46
+ let rateLimitMap = DEFAULT_RATE_LIMITS;
47
+ try {
48
+ const fetched = await client.get("/mcp/rate-limits");
49
+ rateLimitMap = { ...DEFAULT_RATE_LIMITS, ...fetched };
50
+ }
51
+ catch {
52
+ // network failure or auth error — silently use defaults
53
+ }
54
+ const rateLimiter = new RateLimiterRegistry(rateLimitMap);
55
+ const server = new McpServer({
56
+ name: "@nexvora/mcp-server",
57
+ version: "0.3.1",
58
+ });
59
+ for (const tool of ALL_TOOLS) {
60
+ const wrappedHandler = defineTool(tool, client, rateLimiter);
61
+ server.tool(tool.name, tool.description,
62
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
63
+ tool.inputSchema.shape,
64
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
65
+ wrappedHandler);
66
+ }
67
+ return server;
68
+ }
69
+ //# sourceMappingURL=createServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createServer.js","sourceRoot":"","sources":["../src/createServer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,UAAU,EAAuB,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,EAAE,2BAA2B,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAE3E,MAAM,SAAS,GAAG;IAChB,mBAAmB;IACnB,sBAAsB;IACtB,mBAAmB;IACnB,yBAAyB;IACzB,sBAAsB;IACtB,yBAAyB;IACzB,iBAAiB;IACjB,kBAAkB;IAClB,yBAAyB;IACzB,uBAAuB;IACvB,wBAAwB;IACxB,2BAA2B;CAC5B,CAAC;AAQF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAyB;IAC1D,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAE/C,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IAEpE,IAAI,YAAY,GAA2B,mBAAmB,CAAC;IAC/D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,CAAyB,kBAAkB,CAAC,CAAC;QAC7E,YAAY,GAAG,EAAE,GAAG,mBAAmB,EAAE,GAAG,OAAO,EAAE,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;IAC1D,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,cAAc,GAAG,UAAU,CAC/B,IAAwD,EACxD,MAAM,EACN,WAAW,CACZ,CAAC;QACF,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,WAAW;QAChB,8DAA8D;QAC9D,IAAI,CAAC,WAAW,CAAC,KAAY;QAC7B,8DAA8D;QAC9D,cAAqB,CACtB,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { z } from "zod";
2
+ import { NexvoraClient } from "./NexvoraClient.js";
3
+ import { type RateLimiterRegistry } from "./RateLimiter.js";
4
+ export interface ToolDefinition<TInput extends z.ZodTypeAny, TOutput> {
5
+ name: string;
6
+ description: string;
7
+ inputSchema: TInput;
8
+ handler: (input: z.infer<TInput>, client: NexvoraClient) => Promise<TOutput>;
9
+ }
10
+ export interface ToolCallResult {
11
+ content: Array<{
12
+ type: "text";
13
+ text: string;
14
+ }>;
15
+ isError?: boolean;
16
+ }
17
+ /**
18
+ * Wraps a raw tool handler with:
19
+ * - Zod input validation
20
+ * - Timing measurement
21
+ * - Fire-and-forget audit to POST /mcp/audit
22
+ * - Structured error handling with MCP-compatible result shape
23
+ */
24
+ export declare function defineTool<TInput extends z.ZodTypeAny, TOutput>(definition: ToolDefinition<TInput, TOutput>, client: NexvoraClient, rateLimiter?: RateLimiterRegistry): (rawInput: unknown) => Promise<ToolCallResult>;
25
+ //# sourceMappingURL=defineTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defineTool.d.ts","sourceRoot":"","sources":["../src/defineTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAmB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,MAAM,WAAW,cAAc,CAAC,MAAM,SAAS,CAAC,CAAC,UAAU,EAAE,OAAO;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9E;AAED,MAAM,WAAW,cAAc;IAC7B,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;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,SAAS,CAAC,CAAC,UAAU,EAAE,OAAO,EAC7D,UAAU,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3C,MAAM,EAAE,aAAa,EACrB,WAAW,CAAC,EAAE,mBAAmB,GAChC,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,cAAc,CAAC,CA2FhD"}
@@ -0,0 +1,93 @@
1
+ import { NexvoraApiError } from "./NexvoraClient.js";
2
+ /**
3
+ * Wraps a raw tool handler with:
4
+ * - Zod input validation
5
+ * - Timing measurement
6
+ * - Fire-and-forget audit to POST /mcp/audit
7
+ * - Structured error handling with MCP-compatible result shape
8
+ */
9
+ export function defineTool(definition, client, rateLimiter) {
10
+ return async (rawInput) => {
11
+ const start = Date.now();
12
+ if (rateLimiter) {
13
+ const result = rateLimiter.tryConsume(definition.name);
14
+ if (!result.allowed) {
15
+ const retrySec = (result.retryAfterMs / 1000).toFixed(1);
16
+ await client.sendAudit({
17
+ toolName: definition.name,
18
+ outcome: "rate_limited",
19
+ agentId: client.agentId,
20
+ });
21
+ return {
22
+ content: [
23
+ {
24
+ type: "text",
25
+ text: `Rate limit exceeded for ${definition.name}. Retry after ${retrySec} seconds.`,
26
+ },
27
+ ],
28
+ isError: true,
29
+ };
30
+ }
31
+ }
32
+ const parsed = definition.inputSchema.safeParse(rawInput);
33
+ if (!parsed.success) {
34
+ await client.sendAudit({
35
+ toolName: definition.name,
36
+ outcome: "error",
37
+ agentId: client.agentId,
38
+ errorCode: "VALIDATION_ERROR",
39
+ });
40
+ return {
41
+ content: [{ type: "text", text: `Invalid input: ${parsed.error.message}` }],
42
+ isError: true,
43
+ };
44
+ }
45
+ try {
46
+ const result = await definition.handler(parsed.data, client);
47
+ const durationMs = Date.now() - start;
48
+ await client.sendAudit({
49
+ toolName: definition.name,
50
+ outcome: "success",
51
+ agentId: client.agentId,
52
+ durationMs,
53
+ });
54
+ return {
55
+ content: [
56
+ {
57
+ type: "text",
58
+ text: typeof result === "string" ? result : JSON.stringify(result, null, 2),
59
+ },
60
+ ],
61
+ };
62
+ }
63
+ catch (err) {
64
+ const durationMs = Date.now() - start;
65
+ if (err instanceof NexvoraApiError) {
66
+ await client.sendAudit({
67
+ toolName: definition.name,
68
+ outcome: err.toAuditOutcome(),
69
+ agentId: client.agentId,
70
+ durationMs,
71
+ errorCode: String(err.statusCode),
72
+ });
73
+ return {
74
+ content: [{ type: "text", text: err.message }],
75
+ isError: true,
76
+ };
77
+ }
78
+ await client.sendAudit({
79
+ toolName: definition.name,
80
+ outcome: "error",
81
+ agentId: client.agentId,
82
+ durationMs,
83
+ errorCode: "UNEXPECTED_ERROR",
84
+ });
85
+ const message = err instanceof Error ? err.message : String(err);
86
+ return {
87
+ content: [{ type: "text", text: `Unexpected error: ${message}` }],
88
+ isError: true,
89
+ };
90
+ }
91
+ };
92
+ }
93
+ //# sourceMappingURL=defineTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defineTool.js","sourceRoot":"","sources":["../src/defineTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Stdio entry point — backward-compatible with all existing Claude Code /
3
+ * Cursor / ChatGPT Desktop configurations that launch the server as a
4
+ * subprocess via "command" + "args".
5
+ *
6
+ * For the SSE (remote MCP) transport or the OAuth login command, use the
7
+ * `nexvora` CLI (src/cli.ts → dist/cli.js).
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
package/dist/index.js ADDED
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Stdio entry point — backward-compatible with all existing Claude Code /
3
+ * Cursor / ChatGPT Desktop configurations that launch the server as a
4
+ * subprocess via "command" + "args".
5
+ *
6
+ * For the SSE (remote MCP) transport or the OAuth login command, use the
7
+ * `nexvora` CLI (src/cli.ts → dist/cli.js).
8
+ */
9
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
10
+ import { createServer } from "./createServer.js";
11
+ const NEXVORA_BASE_URL = process.env["NEXVORA_BASE_URL"] ?? "https://api.nxvora.online";
12
+ const NEXVORA_ACCESS_TOKEN = process.env["NEXVORA_ACCESS_TOKEN"] ?? "";
13
+ const NEXVORA_AGENT_ID = process.env["NEXVORA_AGENT_ID"];
14
+ if (!NEXVORA_ACCESS_TOKEN) {
15
+ console.error("Error: NEXVORA_ACCESS_TOKEN environment variable is required");
16
+ console.error(" Two ways to set it:");
17
+ console.error(" 1. Run `nexvora login` (OAuth Device Grant — auto-refreshes)");
18
+ console.error(" 2. Generate a Personal Access Token at");
19
+ console.error(" https://app.nxvora.online/app/settings/mcp-tokens and paste");
20
+ console.error(" the nxv_pat_... string into NEXVORA_ACCESS_TOKEN in your");
21
+ console.error(" mcp.json env block.");
22
+ process.exit(1);
23
+ }
24
+ const server = await createServer({
25
+ baseUrl: NEXVORA_BASE_URL,
26
+ accessToken: NEXVORA_ACCESS_TOKEN,
27
+ agentId: NEXVORA_AGENT_ID,
28
+ });
29
+ const transport = new StdioServerTransport();
30
+ await server.connect(transport);
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,2BAA2B,CAAC;AACxF,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;AACvE,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAEzD,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAC9E,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACvC,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;IAClF,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC5D,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACpF,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACjF,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;IAChC,OAAO,EAAE,gBAAgB;IACzB,WAAW,EAAE,oBAAoB;IACjC,OAAO,EAAE,gBAAgB;CAC1B,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}