@uzqw/mcp 0.1.6 → 0.1.8

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/dist/index.js CHANGED
@@ -235,12 +235,12 @@ function registerTools(server2, client2) {
235
235
 
236
236
  // src/index.ts
237
237
  var CALLBACK_PORT = 8199;
238
- var LOGIN_TIMEOUT_MS = 12e4;
238
+ var LOGIN_TIMEOUT_MS = 3e5;
239
239
  var require2 = createRequire(import.meta.url);
240
240
  var MCP_VERSION = require2("../package.json").version;
241
241
  var sub = process.argv[2];
242
242
  if (sub === "install" || sub === "uninstall") {
243
- const { runInstall, runUninstall, parseEnvFlag } = await import("./install-D7FNIM42.js");
243
+ const { runInstall, runUninstall, parseEnvFlag } = await import("./install-5NYCT73T.js");
244
244
  const args = process.argv.slice(3);
245
245
  const yes = args.includes("--yes") || args.includes("-y");
246
246
  const noLogin = args.includes("--no-login");
@@ -268,27 +268,36 @@ var READ_ONLY2 = { readOnlyHint: true, destructiveHint: false, openWorldHint: tr
268
268
  server.registerTool(
269
269
  "login",
270
270
  {
271
- description: "\u767B\u5F55 Recolx\uFF08OAuth PKCE\uFF09\uFF1A\u6253\u5F00\u6D4F\u89C8\u5668\u8DF3\u8F6C\u6388\u6743\u9875\uFF0C\u540C\u610F\u540E\u5728\u672C\u5730 8199 \u56DE\u8C03\u6536\u53D6 token \u5E76\u5199\u5165 ~/.recolx/tokens-mcp-{env}.json\uFF08\u6BCF\u73AF\u5883\u72EC\u7ACB\uFF09\uFF1B\u5DF2\u767B\u5F55\u65F6\u76F4\u63A5\u8FD4\u56DE",
271
+ description: "\u767B\u5F55 Recolx\uFF08OAuth PKCE\uFF09\uFF1A\u6253\u5F00\u6D4F\u89C8\u5668\u8DF3\u8F6C\u6388\u6743\u9875\uFF0C\u540C\u610F\u540E\u5728\u672C\u5730 8199 \u56DE\u8C03\u6536\u53D6 token \u5E76\u5199\u5165 ~/.recolx/tokens-mcp-{env}.json\uFF08\u6BCF\u73AF\u5883\u72EC\u7ACB\uFF09\uFF1B\u5DF2\u767B\u5F55\u65F6\u76F4\u63A5\u8FD4\u56DE\u3002\u767B\u51FA\u540E\u7B2C\u4E00\u6B21 login \u4F1A\u81EA\u52A8\u5F3A\u5236\u91CD\u65B0\u8BA4\u8BC1\uFF08\u5F39 Logto \u9875\uFF09\uFF0C\u65E0\u9700\u989D\u5916\u53C2\u6570",
272
272
  annotations: { title: "\u767B\u5F55 Recolx", ...READ_ONLY2 },
273
273
  inputSchema: LoginInput
274
274
  },
275
- async () => {
276
- const existingToken = await client.auth.getAccessToken();
277
- if (existingToken) {
278
- try {
279
- await client.getCurrentUser();
280
- return { content: [{ type: "text", text: "\u5DF2\u767B\u5F55\u3002" }] };
281
- } catch (err) {
282
- const msg = err instanceof Error ? err.message : String(err);
283
- if (msg.includes("401") || msg.includes("\u672A\u767B\u5F55")) {
284
- await client.auth.logout();
285
- } else {
286
- return { content: [{ type: "text", text: `\u767B\u5F55\u6001\u6821\u9A8C\u5931\u8D25\uFF1A${msg}` }], isError: true };
275
+ async (args = {}) => {
276
+ if (!args.force && !await client.auth.isForceLoginPending()) {
277
+ const existingToken = await client.auth.getAccessToken();
278
+ if (existingToken) {
279
+ try {
280
+ await client.getCurrentUser();
281
+ return {
282
+ content: [
283
+ {
284
+ type: "text",
285
+ text: "\u5DF2\u767B\u5F55\u3002\u60F3\u6362\u8D26\u53F7\uFF1A\u5148 logout \u518D login\uFF08\u4F1A\u81EA\u52A8\u5F3A\u5236\u91CD\u65B0\u8BA4\u8BC1\u5F39\u51FA\u767B\u5F55\u9875\uFF09\uFF0C\u6216\u76F4\u63A5 login(force: true)\u3002"
286
+ }
287
+ ]
288
+ };
289
+ } catch (err) {
290
+ const msg = err instanceof Error ? err.message : String(err);
291
+ if (msg.includes("401") || msg.includes("\u672A\u767B\u5F55")) {
292
+ await client.auth.logout();
293
+ } else {
294
+ return { content: [{ type: "text", text: `\u767B\u5F55\u6001\u6821\u9A8C\u5931\u8D25\uFF1A${msg}` }], isError: true };
295
+ }
287
296
  }
288
297
  }
289
298
  }
290
299
  const devUserId = process.env.RECOLX_DEV_USER_ID;
291
- const authReq = client.auth.createAuthorizationRequest(devUserId ? { user_id: devUserId } : {});
300
+ const authReq = await client.auth.createAuthorizationRequest(devUserId ? { user_id: devUserId } : args.force ? { prompt: "login" } : {});
292
301
  const authUrlFile = process.env.RECOLX_DEV_AUTH_URL_FILE;
293
302
  const result = await runOAuthCallback({
294
303
  port: CALLBACK_PORT,
@@ -320,10 +329,9 @@ server.registerTool(
320
329
  content: [
321
330
  {
322
331
  type: "text",
323
- text: `\u6388\u6743\u8D85\u65F6\uFF082 \u5206\u949F\uFF09\u3002\u82E5\u6D4F\u89C8\u5668\u672A\u81EA\u52A8\u6253\u5F00\uFF0C\u8BF7\u624B\u52A8\u8BBF\u95EE\uFF1A
324
- ${authReq.url}
332
+ text: `\u6388\u6743\u7B49\u5F85\u8D85\u65F6\uFF085 \u5206\u949F\uFF09\u3002\u82E5\u6D4F\u89C8\u5668\u5DF2\u8DF3\u8F6C\u5E76\u663E\u793A "localhost:8199 \u65E0\u6CD5\u8BBF\u95EE"\uFF0C\u8BF4\u660E\u672C\u6B21\u6388\u6743\u7A97\u53E3\u5DF2\u8FC7\u671F\u2014\u2014\u8BF7\u91CD\u65B0\u8C03\u7528 login \u518D\u8BD5\uFF08\u767B\u5F55\u9700\u5728 5 \u5206\u949F\u5185\u5B8C\u6210\uFF09\u3002
325
333
 
326
- \u8FDC\u7A0B/\u65E0\u5934\u673A\u5668\uFF1A\u53EF\u8BBE RECOLX_DEV_AUTH_URL_FILE=/path/url.txt \u8BA9 login \u628A\u6388\u6743 URL \u5199\u5165\u6587\u4EF6\u540E\u518D\u624B\u52A8\u5904\u7406\uFF1B\u5E76\u9700\u8F6C\u53D1\u672C\u5730\u7AEF\u53E3 ${CALLBACK_PORT}\uFF1Assh -L ${CALLBACK_PORT}:localhost:${CALLBACK_PORT}`
334
+ \u65E0\u5934/\u8FDC\u7A0B\u673A\u5668\uFF1A\u53EF\u8BBE RECOLX_DEV_AUTH_URL_FILE=/path/url.txt \u8BA9 login \u628A\u6388\u6743 URL \u5199\u5165\u6587\u4EF6\u540E\u518D\u624B\u52A8\u5904\u7406\uFF1B\u5E76\u9700\u8F6C\u53D1\u672C\u5730\u7AEF\u53E3 ${CALLBACK_PORT}\uFF1Assh -L ${CALLBACK_PORT}:localhost:${CALLBACK_PORT}`
327
335
  }
328
336
  ],
329
337
  isError: true
@@ -355,15 +363,15 @@ server.registerTool(
355
363
  },
356
364
  async () => {
357
365
  const existingToken = await client.auth.getAccessToken();
358
- if (!existingToken) {
359
- return { content: [{ type: "text", text: "\u5C1A\u672A\u767B\u5F55\u3002" }] };
360
- }
361
- try {
362
- await client.revokeCurrentUser();
363
- } catch {
366
+ if (existingToken) {
367
+ try {
368
+ await client.revokeCurrentUser();
369
+ } catch {
370
+ }
364
371
  }
365
372
  await client.auth.logout();
366
- return { content: [{ type: "text", text: "\u5DF2\u767B\u51FA\u5E76\u64A4\u9500\u6388\u6743\u3002" }] };
373
+ const text = existingToken ? "\u5DF2\u767B\u51FA\u5E76\u64A4\u9500 Recolx \u6388\u6743\uFF08\u672C\u5730 token \u5DF2\u5220\u9664\uFF09\u3002\u4E0B\u6B21 login \u4F1A\u81EA\u52A8\u5F3A\u5236\u91CD\u65B0\u8BA4\u8BC1\uFF1A\u6D4F\u89C8\u5668\u5F39\u51FA Logto \u767B\u5F55\u9875\uFF0C\u53EF\u76F4\u63A5\u6362\u8D26\u53F7\u3002" : "\u5C1A\u672A\u767B\u5F55\uFF08\u672C\u5730\u65E0 token\uFF09\u3002\u5DF2\u6807\u8BB0\uFF1A\u4E0B\u6B21 login \u4F1A\u8D70\u5F3A\u5236\u91CD\u65B0\u8BA4\u8BC1\uFF08\u5F39 Logto \u767B\u5F55\u9875\uFF09\u3002";
374
+ return { content: [{ type: "text", text }] };
367
375
  }
368
376
  );
369
377
  registerTools(server, client);
@@ -453,7 +453,7 @@ function pickIdentity(user) {
453
453
  async function runLogin() {
454
454
  const client = new RecolxClient({});
455
455
  const devUserId = process.env.RECOLX_DEV_USER_ID;
456
- const authReq = client.auth.createAuthorizationRequest(devUserId ? { user_id: devUserId } : {});
456
+ const authReq = await client.auth.createAuthorizationRequest(devUserId ? { user_id: devUserId } : {});
457
457
  const authUrlFile = process.env.RECOLX_DEV_AUTH_URL_FILE;
458
458
  const result = await runOAuthCallback({
459
459
  port: CALLBACK_PORT,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uzqw/mcp",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "Recolx read-only MCP server (stdio) — 7 read-only tools, readOnlyHint: true",
5
5
  "mcpName": "io.github.uzqw/recolx-mcp",
6
6
  "publishConfig": {