Skip to content

内置工具 25 Categories

内置工具是插件核心功能的一部分,位于 src/mcp/tools/ 目录,由 BuiltinMcpServer 管理。

工具管理

通过 Web 面板可以按类别启用/禁用工具,支持热重载无需重启。

目录结构

完整目录结构(点击展开)
src/mcp/tools/
├── index.js         # 工具加载器动态导入类别管理
├── helpers.js       # 工具辅助函数参数校验权限检查
├── basic.js         # 基础工具
├── user.js          # 用户信息
├── group.js         # 群组信息
├── message.js       # 消息操作
├── admin.js         # 群管理
├── groupStats.js    # 群统计
├── file.js          # 文件操作
├── media.js         # 媒体处理
├── web.js           # 网页访问
├── search.js        # 搜索工具
├── utils.js         # 实用工具
├── memory.js        # 记忆管理
├── context.js       # 上下文管理
├── bot.js           # Bot信息
├── voice.js         # 语音/声聊
├── extra.js         # 扩展工具
├── shell.js         # 系统命令(⚠️危险
├── nlSchedule.js    # 定时任务toolModules 键为 schedule
├── bltools.js       # 扩展工具集
├── reminder.js      # 定时提醒
├── imageGen.js      # 绘图服务
├── qzone.js         # QQ空间/说说
├── emoji.js         # 表情包管理
├── skills.js        # Skills 技能管理
└── knowledgeGraph.js # 知识图谱

工具类别(25个)

类别说明

类别键、模块文件与导出名一一对应 src/mcp/tools/index.jstoolModules 表, 共 25 类。以下「名称」列取自同文件 categoryMeta 的中文显示名;「工具数」为 当前源码实际导出数量(动态导入统计)。

类别模块文件名称工具数说明风险等级
basicbasic.js基础工具9时间/农历/节日、sleep/echo、环境、工具列表、数字格式化🟢 安全
useruser.js用户信息9用户资料、好友关系、头像、点赞、发送者信息🟢 安全
groupgroup.js群组信息10群信息/成员/管理员/公告/搜索🟢 安全
messagemessage.js(messageTools + forwardDataTools)消息操作37发消息、@、聊天记录、合并转发、撤回、协议包🟡 中等
adminadmin.js群管理19禁言、踢人、设群名片/头衔/公告、加群申请、退群🟠 较高
groupStatsgroupStats.js群统计14群星级、龙王、打卡、发言榜、幸运字符、荣誉🟢 安全
filefile.js文件操作29群文件上传下载、本地文件读写、URL下载、OCR🟠 较高
webweb.js网页访问2动态渲染访问(website)、只读 HTTP(fetch_url)🟡 中等
memorymemory.js记忆管理5save/get/search/delete/update_user_memory🟢 安全
contextcontext.js上下文管理6会话/群聊上下文、回复消息、@列表、清除对话🟢 安全
mediamedia.js媒体处理18图片/视频/骰子/音乐/分享/QQ表情/二维码/下载🟢 安全
searchsearch.js搜索工具17搜索、百科、翻译、天气、热搜、笑话、油价🟢 安全
utilsutils.js实用工具25计算、编码、正则、文本处理、密码、抽签🟢 安全
botbot.jsBot信息8登录信息、状态、版本、在线客户端、头像、机型🟢 安全
voicevoice.js语音/声聊16AI声聊、TTS、语音识别、语音文件操作🟢 安全
extraextra.js扩展工具6一言、骰子、随机选择、短链、IP、插画🟢 安全
shellshell.js系统命令4执行命令、系统信息、进程信息、环境变量🔴 危险
schedulenlSchedule.js定时任务3自然语言定时任务(schedule_task 等)🟡 中等
bltoolsbltools.js扩展工具11QQ音乐、表情包、Bing图片、B站、GitHub、AI图片编辑、思维导图🟢 安全
reminderreminder.js定时提醒3set/list/cancel_reminder🟢 安全
imageGenimageGen.js绘图服务5文生图/图生图/视频、预设、状态🟢 安全
qzoneqzone.jsQQ空间/说说10说说发布/点赞/删除、签名、戳一戳、收藏🟡 中等
emojiemoji.js表情包管理3save/send_saved/list_saved_emojis🟢 安全
skillsskills.jsSkills 技能管理12技能查询/加载/卸载、自定义工具热加载🟢 安全
knowledgeGraphknowledgeGraph.js知识图谱12实体/关系/历史/子图/统计(kg_*)🟢 安全

合计 25 类 293 个工具定义(各模块 name 字段计数;去重与启用过滤发生在 getAllTools 层)。

各类工具名清单(与源码导出逐一对齐)

以下清单按「文件 → 导出 → 工具名」核对,括号内为该类实际导出数量。

知识图谱工具(kg_*,12 个)

knowledgeGraph 类别共 12 个工具,统一读写 kg_entities / kg_relationships 表。

工具作用参数要点
kg_get_knowledge获取当前用户/群的知识图谱上下文user_idgroup_id(默认取当前会话);max_entities(默认 15,最大 100);include_relations(默认 true)
kg_list_entities列出指定作用域的实体scope_idglobal / user:<id> / group:<id> / group:<id>:user:<id>,默认按会话推导);type(person/thing/place/concept/event,五选一);limit(默认 20,最大 100)
kg_search_entities按名称模糊搜索实体query(必填);typelimit(默认 10,最大 100)
kg_save_entity保存实体,同作用域同名自动合并更新nametype(必填);scope_idproperties(对象,如 {age: 20, job: "学生"}
kg_update_entity更新实体属性或类型(用户纠正信息时)entity_id(必填);nametypeproperties(整体替换)
kg_delete_entity删除实体(保留历史可回滚)entity_id(必填)
kg_entity_history获取实体的历史版本记录entity_id(必填);limit(默认 10,最大 100)
kg_entity_relations获取与某实体直接关联的实体(关系列表)entity_id(必填)
kg_save_relation保存两个实体间的关系from_entityto_entityrelation_type(必填,端点可为 ID 或精确名称);scope_idproperties
kg_delete_relation删除关系(保留历史可回滚)relationship_id(必填)
kg_query_subgraph以某实体为中心探索子图entity_id(必填);depth(默认 1,最大 3)
kg_stats获取作用域统计(实体数、关系数、类型分布)scope_id(默认当前会话作用域;传 null 查全局合计)

scope_id 未显式传入时按当前事件上下文推导:群+用户 → group:<gid>:user:<uid>;仅群 → group:<gid>;仅用户 → user:<uid>;无事件 → global。实体类型枚举与 KnowledgeGraphExtractor 白名单一致(person / thing / place / concept / event)。

knowledgeGraph 为 2026-09 新增类别,既有配置通过「自动启用新增分类」逻辑默认启用。

memory.js(5 个,memoryTools)

工具名description 摘录(以源码为准)
save_user_memory保存关于用户的重要信息到记忆库
get_user_memories获取用户的记忆列表
search_user_memory搜索用户记忆,支持多关键词
delete_user_memory删除指定的用户记忆(仅当前会话用户)
update_user_memory更新已有的记忆内容(仅当前会话用户)

group.js(10 个,groupTools)

get_group_infoget_group_listget_group_member_listget_group_member_infoget_current_groupget_group_adminssearch_group_memberget_group_noticecheck_in_groupsearch_group

admin.js(19 个,adminTools)

mute_memberkick_memberset_group_cardset_group_whole_banset_group_adminset_group_nameset_group_special_titlesend_group_noticedelete_group_noticeset_group_add_requestset_friend_add_requestget_group_muted_listset_group_leavedelete_friendset_group_portraitget_group_at_all_remainset_group_anonymous_banset_group_anonymousget_group_system_msg

其余类别要点(按名称与源码比对)

  • basic(9):get_current_timesleepechoget_environmentlist_available_toolsget_tool_infoget_lunar_dateget_festivalformat_number
  • user(9):get_user_infoget_friend_listsend_likeget_avatarget_sender_infosearch_friendcheck_is_friendget_bot_infoget_user_profile
  • message(37,messageTools + forwardDataTools 合并):send_to_masterget_master_infosend_private_messagesend_group_messagereply_current_messageat_userat_rolerandom_atget_chat_historyrecall_messageget_forward_msgdeep_parse_messagesend_forward_msgresend_quoted_cardmark_msg_as_readget_essence_msg_listset_essence_msgdelete_essence_msgpoke_userset_msg_emoji_likeget_msgsend_raw_messagesend_cardsend_markdownsend_buttoncall_apisend_long_msgget_msg_reactionssend_long_messagesend_protocol_packetsend_pb_messagesend_forward_directmake_forward_msgextract_forward_datadeserialize_messagedecode_protobufget_message_record
  • groupStats(14):get_group_levelget_dragon_kingget_sign_in_todayget_speak_rankget_group_dataget_lucky_listdraw_luckyequip_luckyswitch_luckyget_inactive_membersget_recent_join_membersget_group_honorget_group_statget_random_group_member
  • file(29):get_group_filesget_file_urlupload_group_filedelete_group_filecreate_group_folderget_group_file_system_infoget_group_root_filesget_group_files_by_foldermove_group_filerename_group_filedelete_group_folderupload_private_fileget_private_file_urldownload_filesend_file_messageget_fileocr_imagecan_send_recordcan_send_imageread_filewrite_filelist_directorydownload_to_filedownload_group_file_to_filedelete_filecopy_filemove_fileget_file_infocreate_directory
  • web(2):websitefetch_url
  • context(6):get_current_contextget_conversation_contextclear_conversationget_reply_messageget_at_membersget_group_context
  • media(18):parse_imagegenerate_qrcodeget_image_infosend_imagesend_videoparse_videosend_dicesend_rpssend_musicsend_locationsend_sharesend_facesend_mfacesend_flash_imagesend_giftget_face_listparse_mfacedownload_image
  • search(17):bing_searchfetch_webpageweb_searchsearch_wikisearch_group_historytranslateget_weatherget_ip_infosearch_baikeget_hitokotoget_hot_searchget_douyin_hotget_history_todayget_jokeget_morning_paperget_short_urlget_oil_price
  • utils(25):calculaterandom_numberrandom_choiceuuidhashbase64_encodebase64_decodeurl_encodejson_formattimestampcountdownregex_matchregex_replacetext_statstext_transformextract_urlsextract_emailsextract_phonessplit_textjoin_texttruncate_textescape_htmlgenerate_passworddice_rolldraw_lots
  • bot(8):get_login_infoget_bot_statusget_stranger_infoget_version_infoget_online_clientsset_qq_avatarget_model_showget_self_info
  • voice(16):set_ai_voice_chatget_ai_voice_characterssend_ai_voicesend_voiceparse_voiceget_recordget_tts_speakerssend_ttsget_ai_recordsend_private_ai_recordget_voice_infodownload_voicevoice_to_textget_ai_voice_statuslist_voice_formatssend_voice_reply
  • extra(6):hitokotoroll_dicerandom_choosecreate_short_urlquery_ip_infoget_illustration
  • shell(4):execute_commandget_system_infoget_process_inforead_env
  • schedule(3):schedule_taskcancel_scheduled_tasklist_my_scheduled_tasks
  • bltools(11):search_music_qqsearch_emojisearch_image_bingset_msg_reactionsearch_wallpaperbilibili_searchgithub_repo_infoai_image_editbilibili_video_summaryvideo_analysisai_mindmap
  • reminder(3):set_reminderlist_reminderscancel_reminder
  • imageGen(5):generate_imagegenerate_videolist_image_presetsuse_image_presetget_image_gen_status
  • qzone(10):publish_qzone_moodget_qzone_feedslike_qzone_postdelete_qzone_moodset_self_longnickfriend_pokegroup_pokeget_profile_likecreate_collectionget_collection_list
  • emoji(3):save_emojisend_saved_emojilist_saved_emojis
  • skills(12):list_skillsload_skillget_skill_infolist_skill_filesread_skill_filesearch_skillsunload_skillreload_skillscreate_custom_toolupdate_custom_toolinvoke_custom_tooldelete_custom_tool

shell 类别警告

shell 类别可执行系统命令,存在安全风险。建议仅在可信环境下启用,并限制为主人权限。

创建内置工具

开发流程

  1. 在类别文件中添加工具定义 → 2. 注册新类别(可选)→ 3. 配置启用

Step 1:在对应类别文件中添加工具

javascript
// src/mcp/tools/basic.js
export const basicTools = [
  {
    // 工具名称(snake_case,全局唯一)
    name: 'my_tool',
    
    // 工具描述(AI 可见,描述清晰有助于正确调用)
    description: '我的工具描述,说明功能和使用场景',
    
    // 参数定义(JSON Schema 格式)
    inputSchema: {
      type: 'object',
      properties: {
        input: {
          type: 'string',
          description: '输入参数说明'
        }
      },
      required: ['input']
    },
    
    // 处理函数(异步)
    handler: async (args) => {
      const { input } = args
      // 实现逻辑
      return { success: true, result: input }
    }
  },
  // ...其他工具
]

Step 2:注册工具模块(新类别时需要)

仅新类别需要

如果是在已有类别中添加工具,跳过此步骤。

javascript
// src/mcp/tools/index.js
const toolModules = {
  basic: { file: './basic.js', export: 'basicTools' },
  myCategory: { file: './myCategory.js', export: 'myCategoryTools' },
  // ...
}

// 类别元信息(用于 Web 面板展示)
const categoryMeta = {
  myCategory: { 
    name: '我的类别',         // 显示名称
    description: '类别描述',   // 类别说明
    icon: 'Tool'              // 图标名称(Lucide 图标)
  }
}

Step 3:配置启用

内置工具的启用由 builtinTools 配置控制(管理面板 → 工具管理可改,对应 GET/PUT /api/tools/builtin/config):

yaml
# config.yaml
builtinTools:
  enabled: true
  enabledCategories:
    - basic
    - myCategory  # 添加新类别

通过 Web 面板管理

也可以在 Web 管理面板 → 工具管理 中启用/禁用工具类别。

工具示例

完整示例

以下是两个典型的内置工具实现示例,展示常见模式。

示例 1:获取时间(无上下文)

javascript
// src/mcp/tools/basic.js
{
  name: 'get_current_time',
  description: '获取当前时间和日期信息,支持指定时区和格式',
  
  inputSchema: {
    type: 'object',
    properties: {
      format: {
        type: 'string',
        description: '时间格式:full(完整)、date(仅日期)、time(仅时间)、timestamp(时间戳)',
        enum: ['full', 'date', 'time', 'timestamp']
      },
      timezone: {
        type: 'string',
        description: '时区,默认 Asia/Shanghai'
      }
    }
  },
  
  handler: async (args) => {
    const now = new Date()
    const tz = args.timezone || 'Asia/Shanghai'
    
    const options = { timeZone: tz }
    const dateStr = now.toLocaleDateString('zh-CN', { ...options, year: 'numeric', month: '2-digit', day: '2-digit' })
    const timeStr = now.toLocaleTimeString('zh-CN', { ...options, hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false })
    const weekday = ['日', '一', '二', '三', '四', '五', '六'][now.getDay()]
    
    return {
      text: `当前时间: ${dateStr} ${timeStr} 星期${weekday}`,
      datetime: now.toISOString(),
      timestamp: now.getTime(),
      timezone: tz
    }
  }
}

示例 2:发送消息(需要上下文)

javascript
{
  name: 'send_private_message',
  description: '发送私聊消息给指定用户',
  
  inputSchema: {
    type: 'object',
    properties: {
      user_id: { type: 'string', description: '目标用户QQ号' },
      message: { type: 'string', description: '消息内容' }
    },
    required: ['user_id', 'message']
  },
  
  handler: async (args, context) => {
    await context.getApi().sendPrivate(args.user_id, args.message)
    return { success: true, text: '消息已发送' }
  }
}

工具属性

属性类型必需说明
namestring工具名称,全局唯一,使用 snake_case 格式
descriptionstring工具描述,AI 可见,描述清晰有助于正确调用
inputSchemaobjectJSON Schema 格式的参数定义,无参数时可省略
handlerfunction异步处理函数 async (args) => result

inputSchema 格式

参数定义遵循 JSON Schema 规范,支持以下类型:

  • string - 字符串
  • number / integer - 数值
  • boolean - 布尔值
  • array - 数组
  • object - 对象

下一步

文档说明适用场景
自定义 JS 工具开发用户工具快速开发、无需修改源码
安全与权限工具安全配置了解权限控制机制
MCP 服务器接入外部 MCP复用现有 MCP 服务器

基于 MIT 许可发布