chaimi-keep-mcp 3.1.33-beta.2 → 3.1.33-beta.3

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 (2) hide show
  1. package/package.json +1 -1
  2. package/server.js +39 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chaimi-keep-mcp",
3
- "version": "3.1.33-beta.2",
3
+ "version": "3.1.33-beta.3",
4
4
  "description": "柴米记账 MCP Server - 支持 Claude、Cursor、OpenClaw、WorkBuddy 等 AI 工具直接记账",
5
5
  "main": "server.js",
6
6
  "bin": {
package/server.js CHANGED
@@ -421,10 +421,43 @@ async function callMcpHub(tool, params, token) {
421
421
  return await response.json();
422
422
  }
423
423
 
424
- // Skill 读取记录(用于强制检查)
425
- let lastSkillReadTime = 0;
424
+ // Skill 读取记录文件路径
425
+ const SKILL_READ_LOG_PATH = path.join(os.homedir(), '.chaimi-mcp', 'skill-read.log');
426
426
  const SKILL_VALID_DURATION = 5 * 60 * 1000; // 5分钟内有效
427
427
 
428
+ /**
429
+ * 获取上次读取 Skill 的时间
430
+ */
431
+ function getLastSkillReadTime() {
432
+ try {
433
+ if (fs.existsSync(SKILL_READ_LOG_PATH)) {
434
+ const data = JSON.parse(fs.readFileSync(SKILL_READ_LOG_PATH, 'utf8'));
435
+ return data.lastReadTime || 0;
436
+ }
437
+ } catch (error) {
438
+ console.error('读取 Skill 记录失败:', error);
439
+ }
440
+ return 0;
441
+ }
442
+
443
+ /**
444
+ * 记录 Skill 读取时间
445
+ */
446
+ function recordSkillRead() {
447
+ try {
448
+ const logDir = path.dirname(SKILL_READ_LOG_PATH);
449
+ if (!fs.existsSync(logDir)) {
450
+ fs.mkdirSync(logDir, { recursive: true });
451
+ }
452
+ fs.writeFileSync(SKILL_READ_LOG_PATH, JSON.stringify({
453
+ lastReadTime: Date.now(),
454
+ readAt: new Date().toISOString()
455
+ }, null, 2));
456
+ } catch (error) {
457
+ console.error('记录 Skill 读取失败:', error);
458
+ }
459
+ }
460
+
428
461
  // 工具调用处理
429
462
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
430
463
  const { name, arguments: args } = request.params;
@@ -432,7 +465,8 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
432
465
  // 强制检查:记账工具必须先调用 get_skill
433
466
  if (name === 'save_expense' || name === 'save_receipt' || name === 'save_income') {
434
467
  const now = Date.now();
435
- if (now - lastSkillReadTime > SKILL_VALID_DURATION) {
468
+ const lastReadTime = getLastSkillReadTime();
469
+ if (now - lastReadTime > SKILL_VALID_DURATION) {
436
470
  return {
437
471
  content: [
438
472
  {
@@ -484,8 +518,8 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
484
518
  skillContent = '无法读取 Skill 文件,请检查安装是否完整';
485
519
  }
486
520
 
487
- // 更新读取时间
488
- lastSkillReadTime = Date.now();
521
+ // 更新读取时间(持久化到文件)
522
+ recordSkillRead();
489
523
 
490
524
  result = {
491
525
  success: true,