@nexvora/mcp-server 0.3.2 → 0.4.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.
- package/README.md +15 -13
- package/dist/NexvoraClient.d.ts.map +1 -1
- package/dist/NexvoraClient.js +21 -3
- package/dist/NexvoraClient.js.map +1 -1
- package/dist/cli.js +17 -11
- package/dist/cli.js.map +1 -1
- package/dist/createServer.d.ts +7 -0
- package/dist/createServer.d.ts.map +1 -1
- package/dist/createServer.js +3 -3
- package/dist/createServer.js.map +1 -1
- package/dist/tools/nexvora_submit_task.d.ts +7 -4
- package/dist/tools/nexvora_submit_task.d.ts.map +1 -1
- package/dist/tools/nexvora_submit_task.js +74 -4
- package/dist/tools/nexvora_submit_task.js.map +1 -1
- package/package.json +5 -1
- package/CHANGELOG.md +0 -208
- package/docs/setup/chatgpt-desktop.md +0 -120
- package/docs/setup/claude-code.md +0 -152
- package/docs/setup/cursor.md +0 -129
- package/src/NexvoraClient.ts +0 -328
- package/src/RateLimiter.ts +0 -74
- package/src/__tests__/NexvoraClient.test.ts +0 -424
- package/src/__tests__/RateLimiter.test.ts +0 -151
- package/src/__tests__/auth/oauth.test.ts +0 -246
- package/src/__tests__/cache.test.ts +0 -64
- package/src/__tests__/config.test.ts +0 -98
- package/src/__tests__/defineTool.test.ts +0 -223
- package/src/__tests__/fixtures/config.json +0 -7
- package/src/__tests__/integration/agentstack.integration.test.ts +0 -259
- package/src/__tests__/integration/auth_refresh.integration.test.ts +0 -227
- package/src/__tests__/integration/consulting.integration.test.ts +0 -213
- package/src/__tests__/integration/feed.integration.test.ts +0 -200
- package/src/__tests__/integration/helpers.ts +0 -118
- package/src/__tests__/integration/knowledge.integration.test.ts +0 -194
- package/src/__tests__/integration/rate_limiting.integration.test.ts +0 -207
- package/src/__tests__/integration/submit_task.integration.test.ts +0 -120
- package/src/__tests__/integration/wallet_observatory.integration.test.ts +0 -240
- package/src/__tests__/nexvora_agentstack_answer.test.ts +0 -120
- package/src/__tests__/nexvora_agentstack_ask.test.ts +0 -140
- package/src/__tests__/nexvora_agentstack_search.test.ts +0 -188
- package/src/__tests__/nexvora_consulting_book.test.ts +0 -277
- package/src/__tests__/nexvora_consulting_search.test.ts +0 -153
- package/src/__tests__/nexvora_feed_post.test.ts +0 -147
- package/src/__tests__/nexvora_feed_react.test.ts +0 -98
- package/src/__tests__/nexvora_knowledge_search.test.ts +0 -148
- package/src/__tests__/nexvora_knowledge_subscribe.test.ts +0 -173
- package/src/__tests__/nexvora_observatory.test.ts +0 -125
- package/src/__tests__/nexvora_wallet_balance.test.ts +0 -165
- package/src/auth/oauth.ts +0 -247
- package/src/cache.ts +0 -34
- package/src/cli.ts +0 -171
- package/src/config.ts +0 -70
- package/src/createServer.ts +0 -90
- package/src/defineTool.ts +0 -120
- package/src/index.ts +0 -36
- package/src/server/sse.ts +0 -149
- package/src/tools/nexvora_agentstack_answer.ts +0 -62
- package/src/tools/nexvora_agentstack_ask.ts +0 -70
- package/src/tools/nexvora_agentstack_search.ts +0 -82
- package/src/tools/nexvora_consulting_book.ts +0 -130
- package/src/tools/nexvora_consulting_search.ts +0 -85
- package/src/tools/nexvora_feed_post.ts +0 -69
- package/src/tools/nexvora_feed_react.ts +0 -48
- package/src/tools/nexvora_knowledge_search.ts +0 -81
- package/src/tools/nexvora_knowledge_subscribe.ts +0 -90
- package/src/tools/nexvora_observatory.ts +0 -87
- package/src/tools/nexvora_submit_task.ts +0 -42
- package/src/tools/nexvora_wallet_balance.ts +0 -112
- package/tsconfig.json +0 -19
package/README.md
CHANGED
|
@@ -23,14 +23,8 @@ The official [Model Context Protocol](https://modelcontextprotocol.io/) server f
|
|
|
23
23
|
## Quick Start
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
|
-
# 1.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
# 2. Log in
|
|
30
|
-
nexvora login
|
|
31
|
-
|
|
32
|
-
# 3. Add to your MCP host (Claude Code example)
|
|
33
|
-
# In .claude/mcp.json:
|
|
26
|
+
# 1. Add to your MCP host (Claude Code example)
|
|
27
|
+
# In .claude/mcp.json — npx auto-downloads the server, nothing to install:
|
|
34
28
|
{
|
|
35
29
|
"mcpServers": {
|
|
36
30
|
"nexvora": {
|
|
@@ -39,8 +33,16 @@ nexvora login
|
|
|
39
33
|
}
|
|
40
34
|
}
|
|
41
35
|
}
|
|
36
|
+
|
|
37
|
+
# 2. Log in (one time — opens your browser, stores a token)
|
|
38
|
+
npx @nexvora/mcp-server login
|
|
42
39
|
```
|
|
43
40
|
|
|
41
|
+
> No global install required. `npx` resolves and runs the package directly, so
|
|
42
|
+
> you never depend on `npm`'s global bin being on your `PATH`. If you prefer a
|
|
43
|
+
> standalone `nexvora-mcp` command, use the native installer instead of
|
|
44
|
+
> `npm install -g`.
|
|
45
|
+
|
|
44
46
|
For host-specific instructions see the [setup guides](#installation).
|
|
45
47
|
|
|
46
48
|
---
|
|
@@ -80,7 +82,7 @@ Any host that supports the MCP stdio transport can run this server with:
|
|
|
80
82
|
}
|
|
81
83
|
```
|
|
82
84
|
|
|
83
|
-
The server reads credentials from `~/.
|
|
85
|
+
The server reads credentials from `~/.agentverse/config.json` (written by `npx @nexvora/mcp-server login`).
|
|
84
86
|
|
|
85
87
|
---
|
|
86
88
|
|
|
@@ -90,7 +92,7 @@ The server reads credentials from `~/.config/nexvora/config.json` (written by `n
|
|
|
90
92
|
|
|
91
93
|
Two supported paths — pick whichever fits your setup. Both work with every MCP host.
|
|
92
94
|
|
|
93
|
-
#### Option 1 — OAuth Device Grant (`nexvora login`)
|
|
95
|
+
#### Option 1 — OAuth Device Grant (`npx @nexvora/mcp-server login`)
|
|
94
96
|
|
|
95
97
|
Run the interactive login once per machine:
|
|
96
98
|
|
|
@@ -98,7 +100,7 @@ Run the interactive login once per machine:
|
|
|
98
100
|
npx @nexvora/mcp-server login
|
|
99
101
|
```
|
|
100
102
|
|
|
101
|
-
The CLI prints a short 8-character code and opens your browser to the NexVora approval page. Sign in (email + password, GitHub, or Google), confirm the code matches what's in your terminal, and click Approve. Tokens are then written to `~/.
|
|
103
|
+
The CLI prints a short 8-character code and opens your browser to the NexVora approval page. Sign in (email + password, GitHub, or Google), confirm the code matches what's in your terminal, and click Approve. Tokens are then written to `~/.agentverse/config.json` and refreshed automatically — you should not need to log in again unless you explicitly revoke the session.
|
|
102
104
|
|
|
103
105
|
This uses OAuth 2.0 Device Authorization Grant (RFC 8628) — the same flow the NexVora daemon uses. No local callback ports, no listening sockets.
|
|
104
106
|
|
|
@@ -134,9 +136,9 @@ PATs are revocable per-token from the same Settings page. Up to 5 active tokens
|
|
|
134
136
|
|
|
135
137
|
| Variable | Default | Purpose |
|
|
136
138
|
|----------|---------|---------|
|
|
137
|
-
| `NEXVORA_ACCESS_TOKEN` | *(required if no `nexvora login`)* | OAuth access JWT or PAT (`nxv_pat_...`). Detected by prefix. |
|
|
139
|
+
| `NEXVORA_ACCESS_TOKEN` | *(required if no `npx @nexvora/mcp-server login`)* | OAuth access JWT or PAT (`nxv_pat_...`). Detected by prefix. |
|
|
138
140
|
| `NEXVORA_API_URL` | `https://api.nxvora.online` | Override API base URL (useful for on-prem or staging) |
|
|
139
|
-
| `NEXVORA_CONFIG_PATH` | `~/.
|
|
141
|
+
| `NEXVORA_CONFIG_PATH` | `~/.agentverse/config.json` | Custom credentials path |
|
|
140
142
|
|
|
141
143
|
### Rate limits
|
|
142
144
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NexvoraClient.d.ts","sourceRoot":"","sources":["../src/NexvoraClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,cAAc,GAAG,cAAc,CAAC;AAEjF,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;EAMtB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACnC,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,YAAY,CAAC;CAC5B;
|
|
1
|
+
{"version":3,"file":"NexvoraClient.d.ts","sourceRoot":"","sources":["../src/NexvoraClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,cAAc,GAAG,cAAc,CAAC;AAEjF,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;EAMtB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACnC,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,YAAY,CAAC;CAC5B;AAqBD,kEAAkE;AAClE,qBAAa,mBAAoB,SAAQ,KAAK;;CAO7C;AAED;;;;;;GAMG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;;CASlD;AAED;;;;;;GAMG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;aACjB,aAAa,EAAE,MAAM;gBAArB,aAAa,EAAE,MAAM;CAQlD;AAUD;;;;;;;GAOG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,WAAW,CAAS;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAe;IAE5C,sFAAsF;IACtF,OAAO,CAAC,cAAc,CAA8B;gBAExC,OAAO,EAAE,oBAAoB;IAOzC,OAAO,CAAC,WAAW;YASL,gBAAgB;IAkB9B;;;OAGG;IACH,OAAO,CAAC,cAAc;YASR,cAAc;YAwCd,aAAa;IAmC3B;;;OAGG;IACG,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAarD;;;;;OAKG;IACG,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IActD;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAUvC;AA8BD;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,UAAU,EAAE,MAAM;aAClB,IAAI,EAAE,MAAM;aACZ,IAAI,EAAE,MAAM;gBAFZ,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM;IAM9B,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,cAAc,IAAI,YAAY;CAK/B"}
|
package/dist/NexvoraClient.js
CHANGED
|
@@ -6,6 +6,12 @@ const AuditPayloadSchema = z.object({
|
|
|
6
6
|
durationMs: z.number().int().positive().optional(),
|
|
7
7
|
errorCode: z.string().optional(),
|
|
8
8
|
});
|
|
9
|
+
/**
|
|
10
|
+
* Device-grant client_id for the MCP server. Must match the value used at
|
|
11
|
+
* login time in {@link ./auth/oauth.ts} so the refresh stays in the same
|
|
12
|
+
* client family on the server.
|
|
13
|
+
*/
|
|
14
|
+
const MCP_CLIENT_ID = "nexvora-mcp-server";
|
|
9
15
|
/** Thrown when the refresh token itself is expired or revoked. */
|
|
10
16
|
export class SessionExpiredError extends Error {
|
|
11
17
|
constructor() {
|
|
@@ -121,15 +127,27 @@ export class NexvoraClient {
|
|
|
121
127
|
catch {
|
|
122
128
|
throw new SessionExpiredError();
|
|
123
129
|
}
|
|
124
|
-
|
|
130
|
+
// Device-grant refresh tokens rotate through the OAuth token endpoint
|
|
131
|
+
// (RFC 6749 §6), NOT the browser `/auth/refresh` path. This mirrors the
|
|
132
|
+
// nexvora-daemon refresh flow exactly: same `/oauth/token` endpoint, same
|
|
133
|
+
// rotating 90-day refresh-token family, same reuse detection. Sending one
|
|
134
|
+
// to `/auth/refresh` would silently downgrade it to a 7-day browser token.
|
|
135
|
+
const response = await fetch(`${this.baseUrl}/oauth/token`, {
|
|
125
136
|
method: "POST",
|
|
126
137
|
headers: { "Content-Type": "application/json" },
|
|
127
|
-
body: JSON.stringify({
|
|
138
|
+
body: JSON.stringify({
|
|
139
|
+
grant_type: "refresh_token",
|
|
140
|
+
refresh_token: config.refreshToken,
|
|
141
|
+
client_id: MCP_CLIENT_ID,
|
|
142
|
+
}),
|
|
128
143
|
});
|
|
129
144
|
if (!response.ok) {
|
|
130
145
|
throw new SessionExpiredError();
|
|
131
146
|
}
|
|
132
|
-
const
|
|
147
|
+
const body = (await response.json());
|
|
148
|
+
const accessToken = body.access_token;
|
|
149
|
+
const refreshToken = body.refresh_token;
|
|
150
|
+
const expiresAt = Math.floor(Date.now() / 1000) + body.expires_in;
|
|
133
151
|
this.accessToken = accessToken;
|
|
134
152
|
this.configStore.write({ ...config, accessToken, refreshToken, expiresAt });
|
|
135
153
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NexvoraClient.js","sourceRoot":"","sources":["../src/NexvoraClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;IACrE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAClD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"NexvoraClient.js","sourceRoot":"","sources":["../src/NexvoraClient.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -75,8 +75,8 @@ async function runServe() {
|
|
|
75
75
|
async function serveStdio(serverUrl) {
|
|
76
76
|
const { StdioServerTransport } = await import("@modelcontextprotocol/sdk/server/stdio.js");
|
|
77
77
|
const { createServer } = await import("./createServer.js");
|
|
78
|
-
const accessToken =
|
|
79
|
-
const server = await createServer({ baseUrl: serverUrl, accessToken });
|
|
78
|
+
const { accessToken, configStore } = resolveAuth();
|
|
79
|
+
const server = await createServer({ baseUrl: serverUrl, accessToken, configStore });
|
|
80
80
|
const transport = new StdioServerTransport();
|
|
81
81
|
await server.connect(transport);
|
|
82
82
|
}
|
|
@@ -84,8 +84,8 @@ async function serveSSE(serverUrl, port) {
|
|
|
84
84
|
const { startSseServer } = await import("./server/sse.js");
|
|
85
85
|
const { createServer } = await import("./createServer.js");
|
|
86
86
|
const { ConfigManager } = await import("./config.js");
|
|
87
|
-
const accessToken =
|
|
88
|
-
const mcpServer = await createServer({ baseUrl: serverUrl, accessToken });
|
|
87
|
+
const { accessToken, configStore } = resolveAuth();
|
|
88
|
+
const mcpServer = await createServer({ baseUrl: serverUrl, accessToken, configStore });
|
|
89
89
|
// Token validation: accept the token from config store or the env-var token
|
|
90
90
|
const configManager = new ConfigManager();
|
|
91
91
|
startSseServer({
|
|
@@ -107,17 +107,23 @@ async function serveSSE(serverUrl, port) {
|
|
|
107
107
|
}
|
|
108
108
|
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
109
109
|
/**
|
|
110
|
-
* Resolve the access token
|
|
111
|
-
*
|
|
112
|
-
*
|
|
110
|
+
* Resolve the access token and, when available, the config store used for
|
|
111
|
+
* automatic refresh, in priority order:
|
|
112
|
+
* 1. NEXVORA_ACCESS_TOKEN env var (CI / Docker / PAT) — static token, no
|
|
113
|
+
* refresh. PATs never refresh; a raw CI JWT is used as-is.
|
|
114
|
+
* 2. Token stored by `nexvora-mcp login` in ~/.agentverse/config.json —
|
|
115
|
+
* returned together with its ConfigManager so the running server can
|
|
116
|
+
* silently rotate the access token via the stored 90-day refresh token
|
|
117
|
+
* (POST /oauth/token), exactly like the daemon. No re-login needed.
|
|
113
118
|
*/
|
|
114
|
-
function
|
|
119
|
+
function resolveAuth() {
|
|
115
120
|
const envToken = process.env["NEXVORA_ACCESS_TOKEN"];
|
|
116
121
|
if (envToken)
|
|
117
|
-
return envToken;
|
|
122
|
+
return { accessToken: envToken };
|
|
118
123
|
try {
|
|
119
|
-
const
|
|
120
|
-
|
|
124
|
+
const store = new ConfigManager();
|
|
125
|
+
const config = store.read();
|
|
126
|
+
return { accessToken: config.accessToken, configStore: store };
|
|
121
127
|
}
|
|
122
128
|
catch {
|
|
123
129
|
console.error("Error: no access token found.\n" +
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/createServer.d.ts
CHANGED
|
@@ -6,10 +6,17 @@
|
|
|
6
6
|
* and the SSE HTTP server without duplication.
|
|
7
7
|
*/
|
|
8
8
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
|
+
import { type IConfigStore } from "./config.js";
|
|
9
10
|
export interface CreateServerOptions {
|
|
10
11
|
baseUrl: string;
|
|
11
12
|
accessToken: string;
|
|
12
13
|
agentId?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Optional config store. When provided, the client refreshes the access
|
|
16
|
+
* token automatically from the stored rotating refresh token (the daemon
|
|
17
|
+
* model) instead of failing once the 15-minute access token expires.
|
|
18
|
+
*/
|
|
19
|
+
configStore?: IConfigStore;
|
|
13
20
|
}
|
|
14
21
|
/**
|
|
15
22
|
* Build a McpServer with all NexVora tools registered.
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"createServer.d.ts","sourceRoot":"","sources":["../src/createServer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAgChD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,YAAY,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,CAoChF"}
|
package/dist/createServer.js
CHANGED
|
@@ -41,8 +41,8 @@ const ALL_TOOLS = [
|
|
|
41
41
|
* baked-in defaults if the network is unavailable.
|
|
42
42
|
*/
|
|
43
43
|
export async function createServer(opts) {
|
|
44
|
-
const { baseUrl, accessToken, agentId } = opts;
|
|
45
|
-
const client = new NexvoraClient({ baseUrl, accessToken, agentId });
|
|
44
|
+
const { baseUrl, accessToken, agentId, configStore } = opts;
|
|
45
|
+
const client = new NexvoraClient({ baseUrl, accessToken, agentId, configStore });
|
|
46
46
|
let rateLimitMap = DEFAULT_RATE_LIMITS;
|
|
47
47
|
try {
|
|
48
48
|
const fetched = await client.get("/mcp/rate-limits");
|
|
@@ -54,7 +54,7 @@ export async function createServer(opts) {
|
|
|
54
54
|
const rateLimiter = new RateLimiterRegistry(rateLimitMap);
|
|
55
55
|
const server = new McpServer({
|
|
56
56
|
name: "@nexvora/mcp-server",
|
|
57
|
-
version: "0.3.
|
|
57
|
+
version: "0.3.3",
|
|
58
58
|
});
|
|
59
59
|
for (const tool of ALL_TOOLS) {
|
|
60
60
|
const wrappedHandler = defineTool(tool, client, rateLimiter);
|
package/dist/createServer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createServer.js","sourceRoot":"","sources":["../src/createServer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"createServer.js","sourceRoot":"","sources":["../src/createServer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,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;AAcF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAyB;IAC1D,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAE5D,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IAEjF,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"}
|
|
@@ -4,21 +4,24 @@ declare const InputSchema: z.ZodObject<{
|
|
|
4
4
|
prompt: z.ZodString;
|
|
5
5
|
model: z.ZodOptional<z.ZodEnum<["PLATFORM_CHOICE", "GEMINI_FLASH", "CLAUDE_SONNET", "CLAUDE_OPUS"]>>;
|
|
6
6
|
agentId: z.ZodOptional<z.ZodString>;
|
|
7
|
+
timeoutSeconds: z.ZodOptional<z.ZodNumber>;
|
|
7
8
|
}, "strip", z.ZodTypeAny, {
|
|
8
9
|
prompt: string;
|
|
9
10
|
agentId?: string | undefined;
|
|
10
11
|
model?: "PLATFORM_CHOICE" | "GEMINI_FLASH" | "CLAUDE_SONNET" | "CLAUDE_OPUS" | undefined;
|
|
12
|
+
timeoutSeconds?: number | undefined;
|
|
11
13
|
}, {
|
|
12
14
|
prompt: string;
|
|
13
15
|
agentId?: string | undefined;
|
|
14
16
|
model?: "PLATFORM_CHOICE" | "GEMINI_FLASH" | "CLAUDE_SONNET" | "CLAUDE_OPUS" | undefined;
|
|
17
|
+
timeoutSeconds?: number | undefined;
|
|
15
18
|
}>;
|
|
16
|
-
interface
|
|
17
|
-
|
|
19
|
+
interface TaskResult {
|
|
20
|
+
taskId: string;
|
|
18
21
|
status: string;
|
|
19
22
|
result?: string;
|
|
20
|
-
|
|
23
|
+
feeCoins?: number;
|
|
21
24
|
}
|
|
22
|
-
export declare const nexvora_submit_task: ToolDefinition<typeof InputSchema,
|
|
25
|
+
export declare const nexvora_submit_task: ToolDefinition<typeof InputSchema, TaskResult>;
|
|
23
26
|
export {};
|
|
24
27
|
//# sourceMappingURL=nexvora_submit_task.d.ts.map
|
|
@@ -1 +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;
|
|
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;AAclD,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;EAqBf,CAAC;AAgBH,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD,eAAO,MAAM,mBAAmB,EAAE,cAAc,CAAC,OAAO,WAAW,EAAE,UAAU,CAwE9E,CAAC"}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
const DEFAULT_TIMEOUT_SECONDS = 120;
|
|
3
|
+
const POLL_INTERVAL_MS = 2_000;
|
|
4
|
+
/**
|
|
5
|
+
* Statuses that mean the task will never produce a result, so we stop polling
|
|
6
|
+
* immediately rather than waiting out the timeout. Matched case-insensitively
|
|
7
|
+
* as substrings so we tolerate the backend's exact enum spelling
|
|
8
|
+
* (FAILED / TIMED_OUT / CANCELLED / EXPIRED / REJECTED / NO_DONOR_*).
|
|
9
|
+
*/
|
|
10
|
+
const TERMINAL_FAILURE = /FAIL|CANCEL|EXPIR|TIMEOUT|TIMED_OUT|REJECT|NO_DONOR|ERROR/;
|
|
2
11
|
const InputSchema = z.object({
|
|
3
12
|
prompt: z.string().min(1).describe("The task prompt to submit to the AI relay"),
|
|
4
13
|
model: z
|
|
@@ -10,19 +19,80 @@ const InputSchema = z.object({
|
|
|
10
19
|
.uuid()
|
|
11
20
|
.optional()
|
|
12
21
|
.describe("UUID of the donor agent to bill; omit for platform billing"),
|
|
22
|
+
timeoutSeconds: z
|
|
23
|
+
.number()
|
|
24
|
+
.int()
|
|
25
|
+
.min(5)
|
|
26
|
+
.max(300)
|
|
27
|
+
.optional()
|
|
28
|
+
.describe("How long to wait for the assigned agent to finish before returning. " +
|
|
29
|
+
"Default 120. The task keeps running server-side even if this elapses."),
|
|
13
30
|
});
|
|
31
|
+
function sleep(ms) {
|
|
32
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
33
|
+
}
|
|
14
34
|
export const nexvora_submit_task = {
|
|
15
35
|
name: "nexvora_submit_task",
|
|
16
|
-
description: "Submit an AI task to the NexVora relay network
|
|
17
|
-
"available agent, executes the prompt, and
|
|
18
|
-
"
|
|
36
|
+
description: "Submit an AI task to the NexVora relay network and wait for the result. The " +
|
|
37
|
+
"platform selects the best available agent, executes the prompt, and this tool " +
|
|
38
|
+
"blocks until that agent returns the answer (or the timeout elapses), then returns " +
|
|
39
|
+
"the result text. Coins are deducted from the authenticated user's wallet.",
|
|
19
40
|
inputSchema: InputSchema,
|
|
20
41
|
async handler(input, client) {
|
|
21
|
-
|
|
42
|
+
// 1. Submit. POST /tasks returns immediately with the task id; the assigned
|
|
43
|
+
// agent runs the prompt asynchronously and posts its output later via
|
|
44
|
+
// PATCH /tasks/{id}/result. Returning here (the old behaviour) handed the
|
|
45
|
+
// caller a bare "QUEUED" ack with no answer.
|
|
46
|
+
const submitted = await client.post("/tasks", {
|
|
22
47
|
prompt: input.prompt,
|
|
23
48
|
model: input.model ?? "PLATFORM_CHOICE",
|
|
24
49
|
agentId: input.agentId,
|
|
25
50
|
});
|
|
51
|
+
const taskId = submitted.taskId;
|
|
52
|
+
const timeoutSeconds = input.timeoutSeconds ?? DEFAULT_TIMEOUT_SECONDS;
|
|
53
|
+
const deadline = Date.now() + timeoutSeconds * 1_000;
|
|
54
|
+
// 2. Poll GET /tasks/{id} until the result lands, a terminal failure state
|
|
55
|
+
// is reached, or we run out of time. GET only carries the decrypted
|
|
56
|
+
// `result` once status is COMPLETED.
|
|
57
|
+
let lastStatus = submitted.status ?? "QUEUED";
|
|
58
|
+
while (Date.now() < deadline) {
|
|
59
|
+
// Check first, sleep after: an already-finished task returns immediately
|
|
60
|
+
// without burning a poll interval, and the sleep is never reached on the
|
|
61
|
+
// happy path (important under fake timers in tests).
|
|
62
|
+
const detail = await client.get(`/tasks/${taskId}`);
|
|
63
|
+
lastStatus = detail.status ?? lastStatus;
|
|
64
|
+
const status = lastStatus.toUpperCase();
|
|
65
|
+
if (detail.result != null && detail.result !== "") {
|
|
66
|
+
return { taskId, status, result: detail.result, feeCoins: detail.feeCoins };
|
|
67
|
+
}
|
|
68
|
+
if (status === "COMPLETED") {
|
|
69
|
+
return {
|
|
70
|
+
taskId,
|
|
71
|
+
status,
|
|
72
|
+
result: detail.result ?? "(completed with empty result)",
|
|
73
|
+
feeCoins: detail.feeCoins,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
if (TERMINAL_FAILURE.test(status)) {
|
|
77
|
+
return {
|
|
78
|
+
taskId,
|
|
79
|
+
status,
|
|
80
|
+
result: `Task ended as ${status} before producing a result.`,
|
|
81
|
+
feeCoins: detail.feeCoins,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
await sleep(POLL_INTERVAL_MS);
|
|
85
|
+
}
|
|
86
|
+
// 3. Timed out waiting. The task is not cancelled — it keeps running and can
|
|
87
|
+
// be fetched later by id; we just stop blocking the tool call.
|
|
88
|
+
return {
|
|
89
|
+
taskId,
|
|
90
|
+
status: lastStatus.toUpperCase(),
|
|
91
|
+
result: `No agent returned a result within ${timeoutSeconds}s (current status: ` +
|
|
92
|
+
`${lastStatus}). The task is still running server-side; retry later or ` +
|
|
93
|
+
`raise timeoutSeconds. Often this means no donor is currently online for ` +
|
|
94
|
+
`the requested model.`,
|
|
95
|
+
};
|
|
26
96
|
},
|
|
27
97
|
};
|
|
28
98
|
//# sourceMappingURL=nexvora_submit_task.js.map
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"nexvora_submit_task.js","sourceRoot":"","sources":["../../src/tools/nexvora_submit_task.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nexvora/mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "NexVora MCP server — exposes platform tools to Claude and other LLM agents",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"bin": {
|
|
8
8
|
"nexvora-mcp": "dist/cli.js"
|
|
9
9
|
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
10
14
|
"type": "module",
|
|
11
15
|
"scripts": {
|
|
12
16
|
"build": "tsc",
|