Browse Source

增加余额查询mcp

cq.tianyong 5 hours ago
parent
commit
a72d9e2388
2 changed files with 33 additions and 6 deletions
  1. 12 1
      apis/MCP/aiAssistantMcp/McpRPC.js
  2. 21 5
      lib/AIChat/AiAssistantMcp.js

+ 12 - 1
apis/MCP/aiAssistantMcp/McpRPC.js

@@ -62,6 +62,17 @@ const tools = [
             required: ['sender']
             required: ['sender']
         }
         }
     },
     },
+    {
+        name: 'get_lepao_count_balance',
+        description: '查询当前用户剩余的乐跑次数余额。用户只问“我还有多少次乐跑”“剩余乐跑次数”“乐跑余额”时使用此工具;如果用户要查看变动原因或历史流水,再使用 list_lepao_count_ledger。',
+        inputSchema: {
+            type: 'object',
+            properties: {
+                sender
+            },
+            required: ['sender']
+        }
+    },
     {
     {
         name: 'list_goods',
         name: 'list_goods',
         description: '查询当前上架且可购买的商品列表。用户询问价格、套餐、库存、分类、权益或购买选项前使用。支持关键词、分类筛选和分页返回,响应不包含内部 id 和不必要的媒体字段。',
         description: '查询当前上架且可购买的商品列表。用户询问价格、套餐、库存、分类、权益或购买选项前使用。支持关键词、分类筛选和分页返回,响应不包含内部 id 和不必要的媒体字段。',
@@ -100,7 +111,7 @@ const tools = [
                 area: { type: 'string', description: '要使用的跑区。取值只能是:["兰花湖校区跑区", "主校区北跑区", "主校区南跑区", "重庆工商大学茶园校区"]。用户要求随机跑区时使用空值。' },
                 area: { type: 'string', description: '要使用的跑区。取值只能是:["兰花湖校区跑区", "主校区北跑区", "主校区南跑区", "重庆工商大学茶园校区"]。用户要求随机跑区时使用空值。' },
                 auto_time: { type: 'integer', minimum: -1, maximum: 23, description: '自动乐跑开始小时,范围 7-21;使用 -1 表示随机时间。' },
                 auto_time: { type: 'integer', minimum: -1, maximum: 23, description: '自动乐跑开始小时,范围 7-21;使用 -1 表示随机时间。' },
                 auto_run: { type: 'integer', enum: [0, 1], description: '自动乐跑开关:1 开启,0 关闭。' },
                 auto_run: { type: 'integer', enum: [0, 1], description: '自动乐跑开关:1 开启,0 关闭。' },
-                target_count: { type: 'number', minimum: 0, maximum: 99, description: '目标总乐跑次数,范围 0-99。开启自动乐跑时,目标次数不能小于或等于账号已累计完成次数,除非设置为 0。' },
+                target_count: { type: 'number', minimum: 0, maximum: 99, description: '目标总乐跑次数,范围 0-99。开启自动乐跑时,目标次数不能小于或等于账号已累计完成次数,除非设置为 0,0为不限次。' },
                 auto_day: { type: 'array', items: { type: 'integer', minimum: 0, maximum: 6 }, description: '自动乐跑星期。0 周日,1 周一,依此类推,6 周六。' },
                 auto_day: { type: 'array', items: { type: 'integer', minimum: 0, maximum: 6 }, description: '自动乐跑星期。0 周日,1 周一,依此类推,6 周六。' },
                 notice_type: { type: 'string', enum: ['email', 'none', 'bot'], description: '乐跑后的通知渠道:email 邮件,bot 机器人,none 不通知。' },
                 notice_type: { type: 'string', enum: ['email', 'none', 'bot'], description: '乐跑后的通知渠道:email 邮件,bot 机器人,none 不通知。' },
                 notes: { type: 'string', description: '该账号的用户可见备注。' }
                 notes: { type: 'string', description: '该账号的用户可见备注。' }

+ 21 - 5
lib/AIChat/AiAssistantMcp.js

@@ -297,9 +297,9 @@ class AiAssistantMcp {
         return asJson({ list: rows.map(mapLepaoRecord), pagination: pagination(page, totalRows) })
         return asJson({ list: rows.map(mapLepaoRecord), pagination: pagination(page, totalRows) })
     }
     }
 
 
-    async list_lepao_count_ledger(args) {
-        const { sender, biz_type, remark, start_time, end_time, current, pagesize } = args
-        if (required([sender])) return '缺少 sender'
+    async list_lepao_count_ledger(args) {
+        const { sender, biz_type, remark, start_time, end_time, current, pagesize } = args
+        if (required([sender])) return '缺少 sender'
         const page = pageArgs({ current, pagesize })
         const page = pageArgs({ current, pagesize })
         const where = ['user_uuid = ?']
         const where = ['user_uuid = ?']
         const params = [sender]
         const params = [sender]
@@ -337,8 +337,24 @@ class AiAssistantMcp {
         if (!rows || !totalRows) return '查询失败'
         if (!rows || !totalRows) return '查询失败'
         return asJson({ list: rows.map(mapCountLedger), pagination: pagination(page, totalRows) })
         return asJson({ list: rows.map(mapCountLedger), pagination: pagination(page, totalRows) })
     }
     }
-
-    async list_goods(args) {
+
+    async get_lepao_count_balance(args) {
+        const { sender } = args
+        if (required([sender])) return '缺少 sender'
+
+        const rows = await db.query(
+            'SELECT username, lepao_count FROM users WHERE uuid = ? LIMIT 1',
+            [sender]
+        )
+        if (!rows || rows.length !== 1) return '获取用户乐跑次数余额失败'
+
+        return asJson({
+            username: rows[0].username,
+            lepao_count: Number(rows[0].lepao_count || 0)
+        })
+    }
+
+    async list_goods(args) {
         const { keyword, category, current, pagesize } = args
         const { keyword, category, current, pagesize } = args
         const page = pageArgs({ current, pagesize })
         const page = pageArgs({ current, pagesize })
         const where = ['state = 1']
         const where = ['state = 1']