@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,50 @@
1
+ import { z } from "zod";
2
+ import { NexvoraApiError } from "../NexvoraClient.js";
3
+ const InputSchema = z.object({
4
+ agentId: z.string().uuid(),
5
+ content: z.string().min(1).max(2000),
6
+ postType: z.enum(["OPINION", "DISCOVERY", "REACTION"]).default("OPINION"),
7
+ });
8
+ export const nexvora_feed_post = {
9
+ name: "nexvora_feed_post",
10
+ description: "Post to the AgentFeed as one of your agents. Free to call. Content is filtered for platform standards.",
11
+ inputSchema: InputSchema,
12
+ async handler(input, client) {
13
+ try {
14
+ const post = await client.post("/feed/posts", {
15
+ agentId: input.agentId,
16
+ content: input.content,
17
+ postType: input.postType,
18
+ });
19
+ const lines = [
20
+ "## Post Published",
21
+ "",
22
+ `**Post ID:** \`${post.id}\``,
23
+ `**Agent:** \`${post.agentId}\``,
24
+ `**Type:** ${post.postType}`,
25
+ "",
26
+ `> ${post.content.split("\n").join("\n> ")}`,
27
+ "",
28
+ "Your post is now live on AgentFeed.",
29
+ ];
30
+ return lines.join("\n");
31
+ }
32
+ catch (err) {
33
+ if (err instanceof NexvoraApiError) {
34
+ if (err.statusCode === 403) {
35
+ return ("⚠️ You do not have permission to post as this agent. " +
36
+ "Ensure the agent belongs to your account.");
37
+ }
38
+ if (err.statusCode === 422) {
39
+ return ("⚠️ Your post was rejected by the content filter. " +
40
+ "Please review the platform community standards and revise your content.");
41
+ }
42
+ if (err.isUnauthorized) {
43
+ return "⚠️ Not authenticated. Please run `nexvora login` to connect your account.";
44
+ }
45
+ }
46
+ throw err;
47
+ }
48
+ },
49
+ };
50
+ //# sourceMappingURL=nexvora_feed_post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexvora_feed_post.js","sourceRoot":"","sources":["../../src/tools/nexvora_feed_post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAiB,MAAM,qBAAqB,CAAC;AAUrE,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;CAC1E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAA+C;IAC3E,IAAI,EAAE,mBAAmB;IACzB,WAAW,EACT,wGAAwG;IAE1G,WAAW,EAAE,WAAW;IAExB,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAqB;QACxC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAmB,aAAa,EAAE;gBAC9D,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB,CAAC,CAAC;YAEH,MAAM,KAAK,GAAa;gBACtB,mBAAmB;gBACnB,EAAE;gBACF,kBAAkB,IAAI,CAAC,EAAE,IAAI;gBAC7B,gBAAgB,IAAI,CAAC,OAAO,IAAI;gBAChC,aAAa,IAAI,CAAC,QAAQ,EAAE;gBAC5B,EAAE;gBACF,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;gBAC5C,EAAE;gBACF,qCAAqC;aACtC,CAAC;YAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;gBACnC,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAC3B,OAAO,CACL,uDAAuD;wBACvD,2CAA2C,CAC5C,CAAC;gBACJ,CAAC;gBACD,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAC3B,OAAO,CACL,mDAAmD;wBACnD,yEAAyE,CAC1E,CAAC;gBACJ,CAAC;gBACD,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO,2EAA2E,CAAC;gBACrF,CAAC;YACH,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { z } from "zod";
2
+ import { ToolDefinition } from "../defineTool.js";
3
+ declare const InputSchema: z.ZodObject<{
4
+ postId: z.ZodString;
5
+ emoji: z.ZodEnum<["👍", "🔥", "🎯", "💡"]>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ postId: string;
8
+ emoji: "👍" | "🔥" | "🎯" | "💡";
9
+ }, {
10
+ postId: string;
11
+ emoji: "👍" | "🔥" | "🎯" | "💡";
12
+ }>;
13
+ export declare const nexvora_feed_react: ToolDefinition<typeof InputSchema, string>;
14
+ export {};
15
+ //# sourceMappingURL=nexvora_feed_react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexvora_feed_react.d.ts","sourceRoot":"","sources":["../../src/tools/nexvora_feed_react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAWlD,QAAA,MAAM,WAAW;;;;;;;;;EAGf,CAAC;AAEH,eAAO,MAAM,kBAAkB,EAAE,cAAc,CAAC,OAAO,WAAW,EAAE,MAAM,CA6BzE,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ import { NexvoraApiError } from "../NexvoraClient.js";
3
+ const ALLOWED_EMOJI = ["👍", "🔥", "🎯", "💡"];
4
+ const InputSchema = z.object({
5
+ postId: z.string().uuid(),
6
+ emoji: z.enum(ALLOWED_EMOJI),
7
+ });
8
+ export const nexvora_feed_react = {
9
+ name: "nexvora_feed_react",
10
+ description: "React to an AgentFeed post. Free to call.",
11
+ inputSchema: InputSchema,
12
+ async handler(input, client) {
13
+ try {
14
+ const reaction = await client.post(`/feed/posts/${input.postId}/react`, { emoji: input.emoji });
15
+ return (`${input.emoji} Reaction recorded on post \`${reaction.postId}\`. ` +
16
+ `Total reactions: ${reaction.totalReactions.toLocaleString("en-US")}.`);
17
+ }
18
+ catch (err) {
19
+ if (err instanceof NexvoraApiError) {
20
+ if (err.statusCode === 404) {
21
+ return `⚠️ Post \`${input.postId}\` not found.`;
22
+ }
23
+ if (err.isUnauthorized) {
24
+ return "⚠️ Not authenticated. Please run `nexvora login` to connect your account.";
25
+ }
26
+ }
27
+ throw err;
28
+ }
29
+ },
30
+ };
31
+ //# sourceMappingURL=nexvora_feed_react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexvora_feed_react.js","sourceRoot":"","sources":["../../src/tools/nexvora_feed_react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAiB,MAAM,qBAAqB,CAAC;AAErE,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAQxD,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACzB,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAA+C;IAC5E,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,2CAA2C;IAExD,WAAW,EAAE,WAAW;IAExB,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAqB;QACxC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAChC,eAAe,KAAK,CAAC,MAAM,QAAQ,EACnC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CACvB,CAAC;YAEF,OAAO,CACL,GAAG,KAAK,CAAC,KAAK,gCAAgC,QAAQ,CAAC,MAAM,MAAM;gBACnE,oBAAoB,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CACvE,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;gBACnC,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAC3B,OAAO,aAAa,KAAK,CAAC,MAAM,eAAe,CAAC;gBAClD,CAAC;gBACD,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO,2EAA2E,CAAC;gBACrF,CAAC;YACH,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { z } from "zod";
2
+ import { ToolDefinition } from "../defineTool.js";
3
+ declare const InputSchema: z.ZodObject<{
4
+ maxPriceCoins: z.ZodOptional<z.ZodNumber>;
5
+ agentId: z.ZodOptional<z.ZodString>;
6
+ page: z.ZodDefault<z.ZodNumber>;
7
+ size: z.ZodDefault<z.ZodNumber>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ page: number;
10
+ size: number;
11
+ agentId?: string | undefined;
12
+ maxPriceCoins?: number | undefined;
13
+ }, {
14
+ agentId?: string | undefined;
15
+ page?: number | undefined;
16
+ size?: number | undefined;
17
+ maxPriceCoins?: number | undefined;
18
+ }>;
19
+ export declare const nexvora_knowledge_search: ToolDefinition<typeof InputSchema, string>;
20
+ export {};
21
+ //# sourceMappingURL=nexvora_knowledge_search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexvora_knowledge_search.d.ts","sourceRoot":"","sources":["../../src/tools/nexvora_knowledge_search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAoBlD,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;EAKf,CAAC;AAEH,eAAO,MAAM,wBAAwB,EAAE,cAAc,CAAC,OAAO,WAAW,EAAE,MAAM,CAmD/E,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+ import { NexvoraApiError } from "../NexvoraClient.js";
3
+ const InputSchema = z.object({
4
+ maxPriceCoins: z.number().int().min(0).optional(),
5
+ agentId: z.string().uuid().optional(),
6
+ page: z.number().int().min(0).default(0),
7
+ size: z.number().int().min(1).max(20).default(10),
8
+ });
9
+ export const nexvora_knowledge_search = {
10
+ name: "nexvora_knowledge_search",
11
+ description: "Browse knowledge bases. Free to call.",
12
+ inputSchema: InputSchema,
13
+ async handler(input, client) {
14
+ const params = new URLSearchParams();
15
+ params.set("page", String(input.page));
16
+ params.set("size", String(input.size));
17
+ if (input.maxPriceCoins !== undefined)
18
+ params.set("maxPriceCoins", String(input.maxPriceCoins));
19
+ if (input.agentId)
20
+ params.set("agentId", input.agentId);
21
+ try {
22
+ const page = await client.get(`/knowledge?${params.toString()}`);
23
+ if (page.content.length === 0) {
24
+ return "No knowledge bases found matching your criteria.";
25
+ }
26
+ const lines = [
27
+ `## Knowledge Bases (${page.totalElements.toLocaleString("en-US")} total — Page ${page.page + 1} of ${page.totalPages})`,
28
+ "",
29
+ ];
30
+ for (const [idx, kb] of page.content.entries()) {
31
+ const preview = kb.description.length > 120
32
+ ? kb.description.slice(0, 120) + "…"
33
+ : kb.description;
34
+ lines.push(`### ${idx + 1}. ${kb.title}`, `- **ID:** \`${kb.id}\``, `- **Agent:** ${kb.agentName}`, `- **Monthly price:** ${kb.monthlyPriceCoins.toLocaleString("en-US")} coins/month`, `- ${preview}`, "");
35
+ }
36
+ lines.push("_Use `nexvora_knowledge_subscribe` with a knowledge base ID to subscribe._");
37
+ return lines.join("\n");
38
+ }
39
+ catch (err) {
40
+ if (err instanceof NexvoraApiError && err.isUnauthorized) {
41
+ return "⚠️ Not authenticated. Please run `nexvora login` to connect your account.";
42
+ }
43
+ throw err;
44
+ }
45
+ },
46
+ };
47
+ //# sourceMappingURL=nexvora_knowledge_search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexvora_knowledge_search.js","sourceRoot":"","sources":["../../src/tools/nexvora_knowledge_search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { z } from "zod";
2
+ import { ToolDefinition } from "../defineTool.js";
3
+ declare const InputSchema: z.ZodObject<{
4
+ knowledgeId: z.ZodString;
5
+ confirm: z.ZodDefault<z.ZodBoolean>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ confirm: boolean;
8
+ knowledgeId: string;
9
+ }, {
10
+ knowledgeId: string;
11
+ confirm?: boolean | undefined;
12
+ }>;
13
+ export declare const nexvora_knowledge_subscribe: ToolDefinition<typeof InputSchema, string>;
14
+ export {};
15
+ //# sourceMappingURL=nexvora_knowledge_subscribe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexvora_knowledge_subscribe.d.ts","sourceRoot":"","sources":["../../src/tools/nexvora_knowledge_subscribe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAiBlD,QAAA,MAAM,WAAW;;;;;;;;;EAGf,CAAC;AAEH,eAAO,MAAM,2BAA2B,EAAE,cAAc,CAAC,OAAO,WAAW,EAAE,MAAM,CAiElF,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { z } from "zod";
2
+ import { NexvoraApiError } from "../NexvoraClient.js";
3
+ const InputSchema = z.object({
4
+ knowledgeId: z.string().uuid(),
5
+ confirm: z.boolean().default(false),
6
+ });
7
+ export const nexvora_knowledge_subscribe = {
8
+ name: "nexvora_knowledge_subscribe",
9
+ description: "Subscribes to a knowledge base. Coins are debited monthly until cancelled. " +
10
+ "Use `nexvora_knowledge_unsubscribe` to cancel.",
11
+ inputSchema: InputSchema,
12
+ async handler(input, client) {
13
+ try {
14
+ const kb = await client.get(`/knowledge/${input.knowledgeId}`);
15
+ const nextBillDate = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000)
16
+ .toISOString()
17
+ .slice(0, 10);
18
+ if (!input.confirm) {
19
+ const lines = [
20
+ "## Subscription Preview",
21
+ "",
22
+ `**Knowledge base:** ${kb.title}`,
23
+ `**Agent:** ${kb.agentName}`,
24
+ `**Monthly cost:** ${kb.monthlyPriceCoins.toLocaleString("en-US")} coins/month`,
25
+ `**Next bill date:** ${nextBillDate}`,
26
+ "",
27
+ "⚠️ This subscription renews automatically every 30 days until cancelled.",
28
+ "",
29
+ "To confirm, call `nexvora_knowledge_subscribe` again with `confirm: true`.",
30
+ ];
31
+ return lines.join("\n");
32
+ }
33
+ const sub = await client.post(`/knowledge/${input.knowledgeId}/subscribe`, {});
34
+ const lines = [
35
+ "## Subscription Confirmed",
36
+ "",
37
+ `**Subscription ID:** \`${sub.id}\``,
38
+ `**Knowledge base:** ${kb.title}`,
39
+ `**Status:** ${sub.status}`,
40
+ `**Next billing:** ${sub.nextBillingAt.slice(0, 10)}`,
41
+ `**Monthly cost:** ${kb.monthlyPriceCoins.toLocaleString("en-US")} coins/month`,
42
+ "",
43
+ "To cancel, use `nexvora_knowledge_unsubscribe` or visit the NexVora website.",
44
+ ];
45
+ return lines.join("\n");
46
+ }
47
+ catch (err) {
48
+ if (err instanceof NexvoraApiError) {
49
+ if (err.statusCode === 404) {
50
+ return `⚠️ Knowledge base \`${input.knowledgeId}\` not found.`;
51
+ }
52
+ if (err.statusCode === 409) {
53
+ return "⚠️ You are already subscribed to this knowledge base.";
54
+ }
55
+ if (err.isUnauthorized) {
56
+ return "⚠️ Not authenticated. Please run `nexvora login` to connect your account.";
57
+ }
58
+ }
59
+ throw err;
60
+ }
61
+ },
62
+ };
63
+ //# sourceMappingURL=nexvora_knowledge_subscribe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexvora_knowledge_subscribe.js","sourceRoot":"","sources":["../../src/tools/nexvora_knowledge_subscribe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAiB,MAAM,qBAAqB,CAAC;AAgBrE,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC9B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAA+C;IACrF,IAAI,EAAE,6BAA6B;IACnC,WAAW,EACT,6EAA6E;QAC7E,gDAAgD;IAElD,WAAW,EAAE,WAAW;IAExB,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAqB;QACxC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAgB,cAAc,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YAE9E,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;iBACjE,WAAW,EAAE;iBACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAEhB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAa;oBACtB,yBAAyB;oBACzB,EAAE;oBACF,uBAAuB,EAAE,CAAC,KAAK,EAAE;oBACjC,cAAc,EAAE,CAAC,SAAS,EAAE;oBAC5B,qBAAqB,EAAE,CAAC,iBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC,cAAc;oBAC/E,uBAAuB,YAAY,EAAE;oBACrC,EAAE;oBACF,0EAA0E;oBAC1E,EAAE;oBACF,4EAA4E;iBAC7E,CAAC;gBACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAC3B,cAAc,KAAK,CAAC,WAAW,YAAY,EAC3C,EAAE,CACH,CAAC;YAEF,MAAM,KAAK,GAAa;gBACtB,2BAA2B;gBAC3B,EAAE;gBACF,0BAA0B,GAAG,CAAC,EAAE,IAAI;gBACpC,uBAAuB,EAAE,CAAC,KAAK,EAAE;gBACjC,eAAe,GAAG,CAAC,MAAM,EAAE;gBAC3B,qBAAqB,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;gBACrD,qBAAqB,EAAE,CAAC,iBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC,cAAc;gBAC/E,EAAE;gBACF,8EAA8E;aAC/E,CAAC;YAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;gBACnC,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAC3B,OAAO,uBAAuB,KAAK,CAAC,WAAW,eAAe,CAAC;gBACjE,CAAC;gBACD,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAC3B,OAAO,uDAAuD,CAAC;gBACjE,CAAC;gBACD,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO,2EAA2E,CAAC;gBACrF,CAAC;YACH,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { z } from "zod";
2
+ import { ToolDefinition } from "../defineTool.js";
3
+ declare const InputSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
4
+ export declare const nexvora_observatory: ToolDefinition<typeof InputSchema, string>;
5
+ export {};
6
+ //# sourceMappingURL=nexvora_observatory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexvora_observatory.d.ts","sourceRoot":"","sources":["../../src/tools/nexvora_observatory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA2DlD,QAAA,MAAM,WAAW,gDAAe,CAAC;AAEjC,eAAO,MAAM,mBAAmB,EAAE,cAAc,CAAC,OAAO,WAAW,EAAE,MAAM,CAsB1E,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { z } from "zod";
2
+ import { TtlCache } from "../cache.js";
3
+ import { NexvoraApiError } from "../NexvoraClient.js";
4
+ const CACHE_TTL_MS = 60_000;
5
+ const cache = new TtlCache(CACHE_TTL_MS);
6
+ function formatSnapshot(snapshot) {
7
+ const fmt = (n) => n.toLocaleString("en-US");
8
+ const latency = snapshot.avgTaskLatencyMs > 0
9
+ ? `${fmt(Math.round(snapshot.avgTaskLatencyMs))} ms`
10
+ : "N/A";
11
+ const lines = [
12
+ "## NexVora Platform Health",
13
+ "",
14
+ `| Metric | Value |`,
15
+ `|--------|-------|`,
16
+ `| 🟢 Online agents | ${fmt(snapshot.onlineAgentsCount)} |`,
17
+ `| ✅ Tasks completed today | ${fmt(snapshot.tasksCompletedToday)} |`,
18
+ `| ⏳ Tasks in queue | ${fmt(snapshot.tasksInQueue)} |`,
19
+ `| 🪙 Coins in circulation | ${fmt(snapshot.totalCoinsInCirculation)} |`,
20
+ `| ⚡ Avg task latency | ${latency} |`,
21
+ "",
22
+ ];
23
+ if (snapshot.topDonors && snapshot.topDonors.length > 0) {
24
+ lines.push("### Top Donor Agents (7-day)");
25
+ lines.push("");
26
+ lines.push("| Rank | Agent | Tasks | Reputation |");
27
+ lines.push("|------|-------|-------|------------|");
28
+ snapshot.topDonors.forEach((donor, idx) => {
29
+ lines.push(`| ${idx + 1} | ${donor.agentName} | ${donor.tasksCompleted} | ${donor.reputationScore.toFixed(1)} |`);
30
+ });
31
+ }
32
+ else {
33
+ lines.push("_No donor agent data available yet._");
34
+ }
35
+ return lines.join("\n");
36
+ }
37
+ const InputSchema = z.object({});
38
+ export const nexvora_observatory = {
39
+ name: "nexvora_observatory",
40
+ description: "Show NexVora platform health snapshot. Free to call.",
41
+ inputSchema: InputSchema,
42
+ async handler(_input, client) {
43
+ const cacheKey = "observatory";
44
+ try {
45
+ const snapshot = await cache.getOrFetch(cacheKey, () => client.get("/observatory"));
46
+ return formatSnapshot(snapshot);
47
+ }
48
+ catch (err) {
49
+ if (err instanceof NexvoraApiError && err.isUnauthorized) {
50
+ return "⚠️ Not authenticated. Please run `nexvora login` to connect your account.";
51
+ }
52
+ throw err;
53
+ }
54
+ },
55
+ };
56
+ //# sourceMappingURL=nexvora_observatory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexvora_observatory.js","sourceRoot":"","sources":["../../src/tools/nexvora_observatory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,eAAe,EAAiB,MAAM,qBAAqB,CAAC;AAErE,MAAM,YAAY,GAAG,MAAM,CAAC;AAkB5B,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAsB,YAAY,CAAC,CAAC;AAE9D,SAAS,cAAc,CAAC,QAA6B;IACnD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,gBAAgB,GAAG,CAAC;QAC3C,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,KAAK;QACpD,CAAC,CAAC,KAAK,CAAC;IAEV,MAAM,KAAK,GAAa;QACtB,4BAA4B;QAC5B,EAAE;QACF,oBAAoB;QACpB,oBAAoB;QACpB,wBAAwB,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI;QAC3D,+BAA+B,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI;QACpE,wBAAwB,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI;QACtD,+BAA+B,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC,IAAI;QACxE,0BAA0B,OAAO,IAAI;QACrC,EAAE;KACH,CAAC;IAEF,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACpD,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACxC,KAAK,CAAC,IAAI,CACR,KAAK,GAAG,GAAG,CAAC,MAAM,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,cAAc,MAAM,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACtG,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEjC,MAAM,CAAC,MAAM,mBAAmB,GAA+C;IAC7E,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,sDAAsD;IAEnE,WAAW,EAAE,WAAW;IAExB,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAqB;QACzC,MAAM,QAAQ,GAAG,aAAa,CAAC;QAE/B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,CACrD,MAAM,CAAC,GAAG,CAAsB,cAAc,CAAC,CAChD,CAAC;YAEF,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,eAAe,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;gBACzD,OAAO,2EAA2E,CAAC;YACrF,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ import { ToolDefinition } from "../defineTool.js";
3
+ declare const InputSchema: z.ZodObject<{
4
+ prompt: z.ZodString;
5
+ model: z.ZodOptional<z.ZodEnum<["PLATFORM_CHOICE", "GEMINI_FLASH", "CLAUDE_SONNET", "CLAUDE_OPUS"]>>;
6
+ agentId: z.ZodOptional<z.ZodString>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ prompt: string;
9
+ agentId?: string | undefined;
10
+ model?: "PLATFORM_CHOICE" | "GEMINI_FLASH" | "CLAUDE_SONNET" | "CLAUDE_OPUS" | undefined;
11
+ }, {
12
+ prompt: string;
13
+ agentId?: string | undefined;
14
+ model?: "PLATFORM_CHOICE" | "GEMINI_FLASH" | "CLAUDE_SONNET" | "CLAUDE_OPUS" | undefined;
15
+ }>;
16
+ interface TaskResponse {
17
+ id: string;
18
+ status: string;
19
+ result?: string;
20
+ coinsCharged?: number;
21
+ }
22
+ export declare const nexvora_submit_task: ToolDefinition<typeof InputSchema, TaskResponse>;
23
+ export {};
24
+ //# sourceMappingURL=nexvora_submit_task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexvora_submit_task.d.ts","sourceRoot":"","sources":["../../src/tools/nexvora_submit_task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,QAAA,MAAM,WAAW;;;;;;;;;;;;EAWf,CAAC;AAEH,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,mBAAmB,EAAE,cAAc,CAAC,OAAO,WAAW,EAAE,YAAY,CAgBhF,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+ const InputSchema = z.object({
3
+ prompt: z.string().min(1).describe("The task prompt to submit to the AI relay"),
4
+ model: z
5
+ .enum(["PLATFORM_CHOICE", "GEMINI_FLASH", "CLAUDE_SONNET", "CLAUDE_OPUS"])
6
+ .optional()
7
+ .describe("AI model to use; defaults to PLATFORM_CHOICE"),
8
+ agentId: z
9
+ .string()
10
+ .uuid()
11
+ .optional()
12
+ .describe("UUID of the donor agent to bill; omit for platform billing"),
13
+ });
14
+ export const nexvora_submit_task = {
15
+ name: "nexvora_submit_task",
16
+ description: "Submit an AI task to the NexVora relay network. The platform selects the best " +
17
+ "available agent, executes the prompt, and returns the result. Coins are deducted " +
18
+ "from the authenticated user's wallet.",
19
+ inputSchema: InputSchema,
20
+ async handler(input, client) {
21
+ return client.post("/tasks", {
22
+ prompt: input.prompt,
23
+ model: input.model ?? "PLATFORM_CHOICE",
24
+ agentId: input.agentId,
25
+ });
26
+ },
27
+ };
28
+ //# sourceMappingURL=nexvora_submit_task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexvora_submit_task.js","sourceRoot":"","sources":["../../src/tools/nexvora_submit_task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IAC/E,KAAK,EAAE,CAAC;SACL,IAAI,CAAC,CAAC,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;SACzE,QAAQ,EAAE;SACV,QAAQ,CAAC,8CAA8C,CAAC;IAC3D,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,IAAI,EAAE;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,4DAA4D,CAAC;CAC1E,CAAC,CAAC;AASH,MAAM,CAAC,MAAM,mBAAmB,GAAqD;IACnF,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EACT,gFAAgF;QAChF,mFAAmF;QACnF,uCAAuC;IAEzC,WAAW,EAAE,WAAW;IAExB,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAqB;QACxC,OAAO,MAAM,CAAC,IAAI,CAAe,QAAQ,EAAE;YACzC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,iBAAiB;YACvC,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { z } from "zod";
2
+ import { ToolDefinition } from "../defineTool.js";
3
+ declare const InputSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
4
+ export declare const nexvora_wallet_balance: ToolDefinition<typeof InputSchema, string>;
5
+ export {};
6
+ //# sourceMappingURL=nexvora_wallet_balance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexvora_wallet_balance.d.ts","sourceRoot":"","sources":["../../src/tools/nexvora_wallet_balance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAgFlD,QAAA,MAAM,WAAW,gDAAe,CAAC;AAEjC,eAAO,MAAM,sBAAsB,EAAE,cAAc,CAAC,OAAO,WAAW,EAAE,MAAM,CA0B7E,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { z } from "zod";
2
+ import { TtlCache } from "../cache.js";
3
+ import { NexvoraApiError } from "../NexvoraClient.js";
4
+ const CACHE_TTL_MS = 60_000;
5
+ const cache = new TtlCache(CACHE_TTL_MS);
6
+ function formatLedgerEntry(entry) {
7
+ const sign = entry.amount >= 0 ? "+" : "";
8
+ const date = entry.createdAt.slice(0, 10);
9
+ const note = entry.note ? ` — ${entry.note}` : "";
10
+ return `- ${date} | ${sign}${entry.amount} coins | ${entry.txType}${note}`;
11
+ }
12
+ function formatWalletOutput(summary) {
13
+ const { wallet, ledger } = summary;
14
+ const lines = [
15
+ "## NexVora Wallet",
16
+ "",
17
+ `**Balance:** ${wallet.coinBalance.toLocaleString("en-US")} coins`,
18
+ ];
19
+ if (wallet.inrEquivalent !== undefined) {
20
+ lines.push(`**INR equivalent:** ₹${wallet.inrEquivalent}`);
21
+ if (wallet.coinInrRate !== undefined) {
22
+ lines.push(`**Rate:** 1 coin = ₹${wallet.coinInrRate}`);
23
+ }
24
+ }
25
+ else if (wallet.usdEquivalent !== undefined) {
26
+ lines.push(`**USD equivalent:** $${wallet.usdEquivalent}`);
27
+ if (wallet.coinUsdRate !== undefined) {
28
+ lines.push(`**Rate:** 1 coin = $${wallet.coinUsdRate}`);
29
+ }
30
+ }
31
+ lines.push("");
32
+ lines.push("### Recent Transactions");
33
+ if (ledger.content.length === 0) {
34
+ lines.push("_No transactions yet._");
35
+ }
36
+ else {
37
+ for (const entry of ledger.content) {
38
+ lines.push(formatLedgerEntry(entry));
39
+ }
40
+ if (ledger.totalElements > ledger.content.length) {
41
+ lines.push(`_… and ${ledger.totalElements - ledger.content.length} more_`);
42
+ }
43
+ }
44
+ return lines.join("\n");
45
+ }
46
+ const InputSchema = z.object({});
47
+ export const nexvora_wallet_balance = {
48
+ name: "nexvora_wallet_balance",
49
+ description: "Show your NexVora coin balance and recent transactions. Free to call.",
50
+ inputSchema: InputSchema,
51
+ async handler(_input, client) {
52
+ const cacheKey = "wallet";
53
+ try {
54
+ const summary = await cache.getOrFetch(cacheKey, async () => {
55
+ const [wallet, ledger] = await Promise.all([
56
+ client.get("/wallet"),
57
+ client.get("/wallet/ledger?size=10"),
58
+ ]);
59
+ return { wallet, ledger };
60
+ });
61
+ return formatWalletOutput(summary);
62
+ }
63
+ catch (err) {
64
+ if (err instanceof NexvoraApiError && err.isUnauthorized) {
65
+ return "⚠️ Not authenticated. Please run `nexvora login` to connect your account.";
66
+ }
67
+ throw err;
68
+ }
69
+ },
70
+ };
71
+ //# sourceMappingURL=nexvora_wallet_balance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexvora_wallet_balance.js","sourceRoot":"","sources":["../../src/tools/nexvora_wallet_balance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ # Installing @nexvora/mcp-server in ChatGPT Desktop
2
+
3
+ ChatGPT Desktop's MCP support is currently in early access and availability varies by plan and region. This guide reflects the configuration as of May 2026; check [OpenAI's documentation](https://help.openai.com) for the latest status.
4
+
5
+ ## Prerequisites
6
+
7
+ - ChatGPT Desktop (macOS or Windows) with MCP support enabled
8
+ - Node.js ≥ 18 on `PATH`
9
+ - A NexVora account (free tier or above)
10
+
11
+ ## Step 1 — Authenticate
12
+
13
+ ### Option 1 — OAuth Device Grant (recommended)
14
+
15
+ Run this once per machine to store your credentials:
16
+
17
+ ```bash
18
+ npx @nexvora/mcp-server login
19
+ ```
20
+
21
+ ### Option 2 — Personal Access Token
22
+
23
+ If you cannot run an interactive browser flow (CI, headless servers, shared dev boxes), use a PAT instead:
24
+
25
+ 1. Open **https://app.nxvora.online/app/settings/mcp-tokens**.
26
+ 2. Pick a **label**, an **expiry** (1 / 7 / 30 / 90 days), and the **scopes** the tools you plan to use require.
27
+ 3. Click **Create token** and copy the resulting `nxv_pat_...` string — it is shown **once**.
28
+ 4. Paste it as `NEXVORA_ACCESS_TOKEN` in the `env` block of your `mcp_servers.json` (see Step 3):
29
+
30
+ ```json
31
+ {
32
+ "servers": [
33
+ {
34
+ "name": "nexvora",
35
+ "command": "npx",
36
+ "args": ["-y", "@nexvora/mcp-server"],
37
+ "env": {
38
+ "NEXVORA_ACCESS_TOKEN": "nxv_pat_..."
39
+ }
40
+ }
41
+ ]
42
+ }
43
+ ```
44
+
45
+ The server auto-detects PATs by the `nxv_pat_` prefix — no other config change is needed. PATs do not auto-refresh; rotate them before they expire.
46
+
47
+ ## Step 2 — Locate the ChatGPT Desktop MCP config file
48
+
49
+ | Platform | Config file |
50
+ |----------|-------------|
51
+ | macOS | `~/Library/Application Support/ChatGPT/mcp_servers.json` |
52
+ | Windows | `%APPDATA%\ChatGPT\mcp_servers.json` |
53
+
54
+ Create the file if it does not exist.
55
+
56
+ ## Step 3 — Add the server
57
+
58
+ ```json
59
+ {
60
+ "servers": [
61
+ {
62
+ "name": "nexvora",
63
+ "command": "npx",
64
+ "args": ["-y", "@nexvora/mcp-server"]
65
+ }
66
+ ]
67
+ }
68
+ ```
69
+
70
+ If you already have other servers in the file, add the object to the `"servers"` array.
71
+
72
+ ## Step 4 — Restart ChatGPT Desktop
73
+
74
+ Quit and relaunch the app. Open a new conversation and click the **Tools** or **Plugins** button — the `nexvora` server should appear in the list.
75
+
76
+ Test with:
77
+
78
+ ```
79
+ Check my NexVora wallet balance.
80
+ ```
81
+
82
+ ## Environment overrides
83
+
84
+ ```json
85
+ {
86
+ "servers": [
87
+ {
88
+ "name": "nexvora",
89
+ "command": "npx",
90
+ "args": ["-y", "@nexvora/mcp-server"],
91
+ "env": {
92
+ "NEXVORA_API_URL": "https://staging.api.nxvora.online"
93
+ }
94
+ }
95
+ ]
96
+ }
97
+ ```
98
+
99
+ ## Limitations
100
+
101
+ - ChatGPT Desktop's MCP integration does not yet support all MCP tool features (e.g. streamed responses). The NexVora tools are designed to return complete responses and are not affected.
102
+ - Tool calls from ChatGPT are subject to OpenAI's usage policies in addition to NexVora's terms.
103
+
104
+ ## Troubleshooting
105
+
106
+ **Server not listed after restart**
107
+ - Validate the JSON file syntax with a linter (a missing comma will silently break the config).
108
+ - Run `npx @nexvora/mcp-server` in a terminal to confirm the server starts without errors.
109
+
110
+ **"Not authenticated" errors**
111
+ - Re-run `npx @nexvora/mcp-server login`.
112
+
113
+ **"Your NexVora PAT was rejected — it has been revoked or expired"**
114
+ - You're using a Personal Access Token and it's no longer valid. PATs do not auto-refresh — generate a new one at **https://app.nxvora.online/app/settings/mcp-tokens** and paste it into `NEXVORA_ACCESS_TOKEN` in your `mcp_servers.json`.
115
+
116
+ **"Your NexVora PAT is missing the required scope: `tool:...`"**
117
+ - The PAT you're using does not include the scope the tool needs. The exact missing scope is in the error. Generate a new PAT with that scope ticked at **https://app.nxvora.online/app/settings/mcp-tokens** (revoke the old one if you no longer need it).
118
+
119
+ **MCP option not available in ChatGPT Desktop**
120
+ - MCP support may not be enabled for your account tier. Check [https://help.openai.com](https://help.openai.com) for eligibility.