精选

哔哩哔哩 MCP demo 的设计与实现

哔哩哔哩 MCP demo 的设计与实现

好久没发贴了,最近在学习mcp,这是一个基于Model Context Protocol (MCP) 的哔哩哔哩视频demo,包含服务器端和客户端的完整实现,有想学习mcp的小伙伴可以学习体验一下这个项目。

💡 提示: 实现过程鱼皮面试鸭mcp的实现 https://www.cnblogs.com/yupi/p/18814281

📁 项目结构

text
复制代码
spring/ ├── mcp-bilibili-server-main/ # MCP服务器端 - 提供哔哩哔哩API封装 │ ├── src/ │ │ └── main/ │ │ ├── java/ # Java源代码 │ │ └── resources/ # 配置文件 │ ├── pom.xml # Maven配置 │ └── README.md # 服务器端文档 │ └── mcp-bilibili-client/ # MCP客户端 - AI智能管理界面 ├── src/ │ ├── main/ │ │ ├── java/ # Java源代码 │ │ └── resources/ # 配置文件和静态资源 │ └── test/ # 测试代码 ├── pom.xml # Maven配置 └── README.md # 客户端文档

🌟 核心特性

🖥️ MCP服务器端 (mcp-bilibili-server-main)

  • 基于Spring Boot 3.2.5 + JDK 21
  • Spring AI MCP Server 1.0.0 标准实现
  • STDIO通信模式 - 支持标准输入输出通信
  • 完整的哔哩哔哩API封装

🛠️ 提供的MCP工具

  1. setSessdata - 设置哔哩哔哩登录状态
  2. searchVideos - 基础视频搜索
  3. searchVideosFromWeb - 高级视频搜索(支持排序、筛选)
  4. createDownloadTask - 创建视频下载任务
  5. getDownloadStatus - 查询下载任务状态
  6. getServerStatus - 获取服务器运行状态

🤖 MCP客户端 (mcp-bilibili-client)

  • 基于Spring Boot 3.2.5 + JDK 21
  • Spring AI MCP Client 1.0.0 标准实现
  • 集成通义千问AI - 智能意图分析
  • 双模式界面 - AI聊天 + 手动控制
  • 实时步骤展示 - 完整的操作流程可视化

🎯 客户端功能

  1. AI智能助手 - 自然语言交互,自动识别用户意图
  2. 手动控制台 - 传统的API调用界面
  3. 实时状态监控 - 连接状态、工具列表、服务器状态
  4. 批量操作支持 - 搜索后自动批量下载
  5. 错误处理机制 - 环环相扣,快速失败

🚀 快速开始

📋 环境要求

  • Java 21+
  • Maven 3.6+
  • 哔哩哔哩账号 (用于获取SESSDATA)
  • 通义千问API密钥 (用于AI功能)

🔧 安装与配置

1. 下载项目

代码已发布到GitHub,大家可以自行下载(如果可以麻烦大家点点star)

bash
复制代码
https://github.com/q2260391948/bilibili-mcp

2. 配置服务器端

bash
复制代码
cd mcp-bilibili-server-main cp src/main/resources/application-example.yml src/main/resources/application.yml # 编辑配置文件,设置必要的参数

3. 配置客户端

bash
复制代码
cd ../mcp-bilibili-client cp src/main/resources/application-example.yml src/main/resources/application.yml # 配置通义千问API密钥和MCP服务器路径

4. 构建项目

bash
复制代码
# 构建服务器端 cd mcp-bilibili-server-main mvn clean package -DskipTests # 构建客户端 cd ../mcp-bilibili-client mvn clean package -DskipTests

🏃‍♂️ 运行应用

一:进入server

更新配置

a3f43e5aa8224f0f2c2de95a2f3602b.png

打包

999662cf383714e92b1d2cfb038e7fc.png

二:使用client进行调用

本地Client替换为本地的jar包路径

8a381016d42393958fa3e98c65d6217.png

启动

39de94ef66c878caf6a3e7bca24d9c5.png

三:使用外部client进行调用

配置 cursor mcp配置

json
复制代码
{ "mcpServers": { "bilibili-downloader": { "command": "C:\\Users\\Administrator\\.jdks\\ms-21.0.7\\bin\\java.exe", "args": [ "-Dspring.ai.mcp.server.stdio=true", "-Dspring.main.web-application-type=none", "-Dlogging.pattern.console=", "-jar", //此处需替换为本地 Serever jar包绝对路径 "E:\\学习\\MCP\\spring\\mcp-bilibili-server-main\\target\\bilibili-mcp-server-1.0.0-SNAPSHOT.jar" ], "env": { "JAVA_HOME": "C:\\Users\\Administrator\\.jdks\\ms-21.0.7" } } } }

效果

绿色表示已经连接到了 MCP server,红色则表示连接失败

7e419d4e244d90929db482d7ca160fa.png 浅浅调用一下吧~

b5b78e150a23eb8082c392f362947c9.png

60798d1a477db6a8960ffb1f247c4c1.png

5b20606cc83f0453a35a9319bb078e5.png

Cherry Studio 调用

a59a2b83d6b8ff0faba6ce3abf055b0.png

bee0d41ca79803eb5ae0e98e048316b.png

🌐 访问界面

启动客户端后,可以通过以下地址访问:

📖 使用指南

🤖 AI智能助手使用

AI助手支持自然语言交互,以下是一些使用示例:

1. 设置登录信息

text
复制代码
设置SESSDATA=XXX

2. 搜索视频

text
复制代码
搜索JAVA学习的视频

cbfd1db342402885902f5bb999aa8a3.png

3. 下载(单个/批量)

text
复制代码
下载JAVA学习的所有视频

单个

d6fe5f7548d7a0ace506d07c5f517bb.png

eb01ad7e6a0bdb1741bd078c97fc87f.png

批量

c83098231beb5dc581335d461037bff.png

cc15e708b56b02b8498430814dd20f1.png

4. 检查状态

text
复制代码
检查系统状态

🎛️ 手动控制台使用

手动控制台提供传统的表单界面,支持:

  • 系统状态监控
  • 登录信息设置
  • 视频搜索(基础和高级)
  • 下载任务管理

🏗️ 技术架构

📊 整体架构图

text
复制代码
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ │ 前端界面 │ │ MCP客户端 │ │ MCP服务器 │ │ (HTML/JS/CSS) │ │ (Spring Boot) │ │ (Spring Boot) │ ├─────────────────┤ ├──────────────────┤ ├─────────────────┤ │ • AI聊天界面 │───▶│ • 通义千问集成 │───▶│ • 哔哩哔哩API │ │ • 手动控制台 │ │ • MCP客户端 │ │ • 下载管理 │ │ • 实时反馈 │ │ • 意图分析 │ │ • 状态监控 │ └─────────────────┘ └──────────────────┘ └─────────────────┘ │ │ ▼ ▼ ┌──────────────────┐ ┌─────────────────┐ │ AI分析引擎 │ │ 哔哩哔哩平台 │ │ (通义千问API) │ │ (外部API服务) │ └──────────────────┘ └─────────────────┘

🔧 核心组件

MCP服务器端

  • BilibiliMcpServerApplication - 主启动类
  • MCP工具实现 - 各种哔哩哔哩操作的封装
  • STDIO通信 - 标准输入输出通信协议
  • 配置管理 - Spring Boot配置体系

MCP客户端

  • BilibiliMcpClientApplication - 主启动类
  • SimpleAIService - 基于推理的意图分析
  • AIBilibiliService - 通义千问AI集成(可选)
  • BilibiliClientService - MCP客户端调用封装
  • Web界面 - AI聊天和手动控制界面

📡 通信协议

项目使用标准的MCP (Model Context Protocol) 进行通信:

text
复制代码
客户端 ──STDIO──▶ 服务器 ◀────────
  • 协议版本: MCP 1.0.0
  • 通信方式: STDIO (标准输入输出)
  • 数据格式: JSON-RPC 2.0
  • 工具调用: 同步调用模式

🛠️ 开发指南

📝 添加新的MCP工具

服务器端

  1. 在服务器端实现新的工具方法
  2. 添加对应的参数验证
  3. 更新工具列表

客户端

  1. BilibiliClientService中添加调用方法
  2. 在AI服务中添加意图识别
  3. 更新前端界面(如需要)

🧪 测试

单元测试

bash
复制代码
# 服务器端测试 cd mcp-bilibili-server-main mvn test # 客户端测试 cd mcp-bilibili-client mvn test

集成测试

bash
复制代码
# 启动服务器后,运行客户端测试 mvn test -Dtest=IntegrationTest

📦 构建与部署

开发环境

bash
复制代码
mvn spring-boot:run

生产环境

bash
复制代码
mvn clean package java -jar target/app.jar

Docker部署

dockerfile
复制代码
FROM openjdk:21-jre-slim COPY target/app.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]

🔧 配置说明

服务器端配置 (mcp-bilibili-server-main)

yaml
复制代码
spring: ai: mcp: server: stdio: true # 启用STDIO通信 application: name: bilibili-mcp-server # 哔哩哔哩相关配置 bilibili: api: base-url: https://api.bilibili.com timeout: 30s download: path: ./downloads concurrent: 3

客户端配置 (mcp-bilibili-client)

yaml
复制代码
spring: ai: dashscope: api-key: ${AI_API_KEY} # 通义千问API密钥 chat: options: model: qwen-plus mcp: client: enabled: true stdio: connections: bilibili-server: command: java args: - -jar - ../mcp-bilibili-server-main/target/bilibili-mcp-server-1.0.0-SNAPSHOT.jar server: port: 8090

🔍 故障排除

常见问题

1. MCP连接失败

症状: 客户端显示"MCP客户端未连接" 解决方案:

  • 检查服务器是否正常启动
  • 确认JAR文件路径正确
  • 查看日志中的详细错误信息

2. AI调用失败

症状: AI分析返回错误 解决方案:

  • 检查通义千问API密钥是否正确
  • 确认网络连接正常
  • 查看API调用限制

3. 视频下载失败

症状: 下载任务创建失败 解决方案:

  • 确认SESSDATA已正确设置
  • 检查视频链接或BV号有效性
  • 确认磁盘空间充足

4. 权限问题

症状: 无法访问哔哩哔哩API 解决方案:

  • 检查SESSDATA是否过期
  • 确认账号状态正常
  • 检查IP是否被限制

📋 日志排查

启用调试日志

yaml
复制代码
logging: level: com.demo.mcp: DEBUG org.springframework.ai: DEBUG root: INFO

关键日志位置

  • MCP通信日志: org.springframework.ai.mcp
  • 业务逻辑日志: com.demo.mcp
  • HTTP请求日志: org.springframework.web

📊 性能监控

关键指标

  • MCP连接状态: 客户端与服务器的连接健康度
  • API响应时间: 哔哩哔哩API调用延迟
  • 下载任务数量: 当前活跃的下载任务
  • 内存使用率: JVM内存占用情况

监控端点

  • 健康检查: /actuator/health
  • 指标信息: /actuator/metrics
  • MCP状态: /api/bilibili/status

🔐 安全说明

敏感信息保护

  • SESSDATA: 妥善保管,定期更换
  • API密钥: 使用环境变量,不要硬编码
  • 日志脱敏: 避免在日志中输出敏感信息

网络安全

  • HTTPS: 生产环境建议使用HTTPS
  • 防火墙: 限制不必要的端口访问
  • 认证授权: 考虑添加用户认证机制

🤝 贡献指南

提交代码

  1. Fork项目
  2. 创建特性分支
  3. 提交更改
  4. 创建Pull Request

代码规范

  • 使用Java代码规范
  • 添加必要的注释
  • 编写单元测试
  • 更新相关文档

💡 提示: 这是一个教育和学习项目,仅作为学习使用,遵守相关平台的使用条款。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
yes
作者分享
抽奖
0
抽奖
0
抽奖
0
#工作# #日常分享# 武汉今天早上起来天气有点阴沉,有点小冷,早上去公司手里也没什么活干,就摸鱼修改自己的论文。后面听到组长问产品还有什么简单的需求没,然后产品说没什么简单的需求了,然后就说其他需求都有点难,主要是我总共做的三个需求,至今都还没提测上线。组长也怕我之前的需求没做好什么的。后面就说到我没有组里上一个实习生积极(已转正),然后我听着其实也有体会,因为基本上需求写的过程中有问题了/bug自己解决不了等等我才会和组长沟通,其他时间基本就自己一个人呆着埋头干,自己也挺郁闷的,可能是因为我本身就有点社恐加上组里的开发包括组长都是三十多岁的,有时候聊的都是关于家庭啊家里小孩什么的,和组里的其他开发基本没有什么交流,因此总的来说就像是一个透明人一样,有我没我都一样那种。后来中午时候我和姐姐交流了下这件事。 就我目前这种处境,肯定是有问题的。①职场不同于在上学,这个过程中要转变自己的学生思维,职场上不能说一天到晚什么也不说,这样领导都不知道你今天做了什么,无法体现自己的价值。其实我也有感觉,如果一天都没和组长沟通,我自己内心也很虚,但是和组长说上那么几句我心里也特别有底气。②工作积极主动点,和同事交流交流项目啊,问问需不需要帮助。绝不能做个透明人,否则同事可能觉得你是有心理疾病什么,也会觉得有你没你都一样,无法体现自己的价值,更别指望转正了。③组里聊天,可以适当的附和几句,象征性的聊两句,不能让人把自己排在外,尝试融入团体。 沟通过后我也觉得我得改变,目前这种处境很危险,只能说慢慢改变吧。晚上和身边的同事一起去吃晚饭(之前一直都是独来独往自己吃饭),然后路上听他们在闲聊,也会插上几句,后来就和其中一个老大简单哥聊了聊家庭里的一些琐事,买没买房啊,来公司干几年了等等,聊的也挺开心。 晚饭回来组长让一起吃饭的那个老大哥看看我写的代码有没有什么问题,然后就和老大哥一起看代码,也指出了我之前写的代码哪里哪里不妥当,比如redis只存不取、多个地方使用同一个key就可能出问题等等,这些因为我刚进来时照着别的代码抄过来的,每细想。还有做的第二个需求,算下来做了差不多两个月了。至今需求都没有个定论。做的就是一个数据库表之间的数据同步问题。因为这个需求是没有严格意义上的说明文档的,只能依靠一张图片,来尽可能实现他的功能,但是到最后的效果并不理想。 首先最大的问题就是这个需求我并没有理清楚,究竟能不能多个表往同一个表里写数据,这在我开发阶段完全忽略了这个问题,也没有想到过,假设有表A、表B同时往表C里写数据,表A向表C写数据是个定时任务,每天要执行定时任务,需要将表C中前一天同步到A表中的数据删除(删除如果数据量很大又会有问题),再进行同步,但问题是表A、B、C并不固定,并没有说有一个字段可以作为通用的标识,来作为判断表C中哪个数据是来自于表A,哪些数据来自B等等,我当时想过使用活动ID作为标识,但又想到如果表A中数据量很多,活动ID多则成千上万,来将活动ID作为数据来源进行维护又是一个问题,因此我也和产品撕逼半天。其次,同步有自动同步(定时任务quarz实现)和手动同步(多线程异步实现),手动同步是可以指定活动ID,然后立即同步,代码逻辑里需要考虑删除之前指定活动ID的数据,在原来数据的基础上插入新的数据,我之前做的是通过TRUNCATE TABLE 语法,直接删除整张表的数据,因为原始数据数量不固定,少到几十条多到成千上几十万条数据,但这样就会引出一个新问题,如果使用我的方案,就违背了产品以及业务那边的想法,但是通过加where条件删除,如果数据量几十万,删除的过程会很漫长,同时不断删除插入数据,由于自增ID,ID会不断累加,导致很多问题。 晚上和产品,组长,我旁边的老大哥聊的很开心,也发现开发中的一些问题,组长的意思是明天和业务那边进行沟通,最终再做定论。
18
【求职】通过星球项目斩获了 2 个 Offer,开心!
3440
下载 APP