SpringAI2.0

目录

[1.0 简介](#1.0 简介)

(1)简介

[(2) 提示词技巧](#(2) 提示词技巧)

[(3) Cursor Rules](#(3) Cursor Rules)

[2.0 各种模型](#2.0 各种模型)

(1)图像模型

[(2)ImageModel API](#(2)ImageModel API)

[(3)QianFan AI](#(3)QianFan AI)

(4)阿里云百炼平台

[3.0 Tool Calling (工具调用)](#3.0 Tool Calling (工具调用))

(1)简介

(2)快速使用

(3)ToolCalling原理

[(4) 声明定义工具](#(4) 声明定义工具)

(5)编程式定义工具

(6)工具规范

[4.0 MCP](#4.0 MCP)

(1)简介

(2)内容

[(3)MCP JavaSDK架构](#(3)MCP JavaSDK架构)

(4)MCP使用

(5)环境准备

[5.0 cursor](#5.0 cursor)

(1)简介

[(2) 安装MCP服务端](#(2) 安装MCP服务端)

[(3) 使用Cursor安装MCP服务器](#(3) 使用Cursor安装MCP服务器)

[5.0 Cline](#5.0 Cline)

[(1) 简介与安装](#(1) 简介与安装)

(2)使用Cline安装MCP服务

[(3) SpringAI接入MCP Server](#(3) SpringAI接入MCP Server)

[6.0 自定义MCP Server](#6.0 自定义MCP Server)

(1)STDIO

(2)SSE

[7.0 MCP部署](#7.0 MCP部署)

(1)部署

(2)MCP推荐


1.0 简介

(1)简介

内容整体介绍:有Spring开发基础,希望快速掌握如何将大语言模型集成到企业级应用开发项目里

动手实践 注重思考

SpringAI处于快速迭代期,版本升级非常快,要学会如何看官方文档和官方案例

(2) 提示词技巧

结构化:

目标:你要做什么? 背景:发生在什么场景下? 受众:给谁听? 风格:用什么方式表达?

语气:带着什么情绪说话? 格式:输出长什么样? 约束条件:不能做什么?

CO-STAR框架:

context 背景 objective 目标 style 风格 tone 语气 audience 观众 response 回应格式

少样本提示:

先给AI看几个标准的例子 让AI照葫芦画瓢

例如:苹果-->红圆 梨--->黄扁 那么橙子呢?

适用于:风格迁移 数据提取与标准化 情感分类,意图识别等

思维链提示:

就是让AI给出最终答案前,先展示它的"思考过程" 提升模型在数学计算 逻辑推理 因果判断等复杂任务上的表现

"请一步一步推理一下问题,展示你的完整思考过程,最后得出结论"

可以使得AI自我拆解问题,自我检验,增强可解释性

自我一致性:

同一个问题问AI两遍,AI给出两个不同的答案? 是一种基于思维链提示的改进推理策略

让AI对同一问题生成多条不同的推理路径 然后从这些路径中找出频率最高或逻辑最连贯的答案

最终输出共识性的结论

例:请从不同角度独立思考一下问题三次,每次采用不同的表达方式或拆解顺序,展示完整的推理过程,然后比较三个答案,选择最合理且一直的结果作为最终输出

混合玩法:

上面的各种方法结合起来

提示词工程指南:

提示工程指南 | Prompt Engineering Guide 里面有更多对于提示词的详细讲解

(3) Cursor Rules

掌握一套系统化的AI协作工程方法

cursor:是一个完整的AI驱动编程工具(AI驱动的IDE),不仅仅是一个代码补全工具,更实现了更深层次的AI集成 可以直接⽤⾃然语⾔和它对话, 询问任何编程相关的问题, 它不仅能即时⽣成代码, 还能解释 代码的原理和设计思路.

但是要想发挥其最大潜力,必须善用它的Rules系统 ---- 也就是我们所说的Cursor Rules

Cursor Rules 是⼀组预先定义、可复⽤的系统级提⽰规则, ⽤于指导 AI 在⽣成或修改代码时遵循特定的技术规范、架构约定和编码⻛格. 这些规则不是语法规范, ⽽是如何与 AI 对话才能写出⾼质量代码的最佳实践.你可以把他理解为"AI编程时的'⾏为守则 '".

官⽅推荐的Rules: Java | Cursor Directory | Cursor Directory 下面来简单了解一下:

语言:你是Java技术方面的专家,精通SpringBoot SpringFramework、Maven、Junit和Java相关技术

代码风格与结构:编写简洁 高效且具有良好文档注释的Java代码 并提供准确的SpringBoot示例 在整个项目中遵循SpringBoot的最佳实践和约定 设计Web服务时采用Restful API模式 使用描述性强的方法和变量名 命名遵循camelCase规范 按照标准分层结构组织SpringBoot应用:控制器controllers 服务services 仓库repositories 模型models 配置类configurations

SpringBoot特定要求:使用SpringBootStarters快速搭建项目并管理依赖 正确使用注解,例如@SpringApplicaiton @RestController @Service等 有效利用SpringBoot的自动配置(auto=configuration)特性 使用@ControllerAdvice和@ExceptionHandler实现统一异常处理

命名规范:类名使用PascalCase 例如UserController OrderService 方法和变量名使用camelCase例如isOrderValid 常量全部大写,单词用下划线分割 例如MAX------RETRY_ATTEMPTS

Java与SpringBoot使用规范:在适用场景中使用Java17或更高版本的新特性,如record sealed class 模式匹配等 充分利用SpringBoot 3.x 的功能与最佳实践 数据库操作优先使用SpringData JPA 使用BeanBalidation实现输入校验(如@Valid 自定义验证器)

依赖注入与IoC:使用构造器注入(constructor injection) 避免字段注入field injection 以提升可测试性 充分利用Spring 的IoC容器管理Bean的生命周期

测试:使用JUnit5编写单元测试 并结合@SpringBootTest 进行集成测试 使用MockMvc对Web层进行接口测试 使用@DataJpaTest对Repository层进行数据访问测试

性能与扩展性:使用SpringCache抽象实现缓存策略 (如Cacheable) 使用@Async实现异步非阻塞处理 合理设计数据库索引 优化查询语句性能

安全性:使用SpringSecurity实现身份认证(authentication)和权限控制(authorization) 密码存储必须使用BCrypt等安全编码方式 如需跨域访问 应正确配置CORS

日志与监控:使用SLF4J配合Logback进行日志输出 合理使用日志级别:ERROR WARN INFO DEBUG 使用SpringBootActuator实现健康检查 指标监控和运行时信息暴露

API文档:使用SpringdocOpenAPI(原Swagger)生成API接口文档,确保接口清晰可读

数据访问与ORM:使用SpringDataJPA进行数据库操作 正确定义实体之间的关联关系(如OneToMany ManyToOne)及级联行为 使用Flyway 或Liquibase管理数据库schema变更与迁移

构建与部署:使用maven进行依赖管理和构建流程 使用SpringProfiles区分不同环境的构建配置(dev test prod) 若设计容器化部署,使用Docker打包应用镜像

最佳实践遵循:遵循RESTfulAPI设计原则(合理使用HTTP方法 状态码等) 异步处理优先使用Spring的@Async或响应编程模型(SpringWebFlux)

设计原则:遵循SOLID原则 保持高内聚 低耦合的代码结构 提升系统性的可维护性与可扩展性

Rules 最佳实践:

聚焦单⼀职责 每条 Rule 只解决⼀个问题, 如"命名规范"、"测试要求"

内容具体清晰 避免"写得好⼀点"这类模糊表达, 应写成"变量名使⽤ camelCase"

控制⻓度在 500 ⾏以内 过⻓的规则难以被模型有效解析

规则拆分 把⼤型规则拆分成多个可组合的⼩规则

提供⽰例代码 提供具体⽰例或引⽤⽂件, "像这样写"⽐"不要那样写"更有

2.0 各种模型

(1)图像模型

简介:图像模型是专注于处理与理解视觉数据的人工智能模型 是计算机视觉与多模态学习的核心。 "看图说话" "根据描述画画"

springAI支持图像模型,并设计了统一的接口(SpringImageModelAPI)用于与各种图像生成的AI模型交互,允许开发者通过最小的代码在不同的图像模型之间切换。

OpenAI入门案例:

申请API_KEY: API keys - OpenAI API

充值:Billing overview - OpenAI API //需要准备一张海外的Visa/Master的信用卡或借记卡

//可以通过某宝搜索 虚拟m国支付 虚拟visa支付卡等购买 但是风险自行辨别 可能会封号

选GPT image1 这个模型是付费的 而且没有免费试用 最低5$----->35.75元

环境搭建:为方便代码的维护 使用父子工程的方式创建项目

添加依赖 : springboot的版本和spring ai框架的版本 //spirngAI统一使用1.0.1版本 SpringBoot使用3.5.3版本

java 复制代码
<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <spring-ai.version>1.0.1</spring-ai.version>
</properties>

<!-- 完善依赖 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.5.3</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-bom</artifactId>
            <version>${spring-ai.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

创建模块 : spring-image-demo //子项目

子项目添加相关的依赖: 一个springbootweb 一个maven打包的插件

java 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

写启动类: 添加启动类注解

springAI图像模型接入:图片模型API :: Spring AI 参考

API KEY可以作为配置环境变量 这样就不用把API_KEY写死在代码里面了

测试 、 异常:

(2)ImageModel API

ImageModelAPI是springAI框架中专门用于图像生成的模块化接口,它提供了一套统一的方式来与各种图像生成的AI模型进行交互,该API的设计遵循Spring框架的模块化和可互换性原则 使开发者能够以最小代价的代码变更在不同图像相关AI模型之间切换

接口官方文档介绍: 里面有接入图像模型的教程

//翻译成中文更好理解

1配置文件

java 复制代码
# In application.yml
spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}

//写入apikey 这个时候可以把apikey写成环境变量 不会泄露 但是注意配置好之后需要重启idea

2添加相关依赖 //子项目中

java 复制代码
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>

3运行的时候如何使用: 先创建接口 然后把官方文档里面的代码复制进来

@Autowired

private OpenaiImageController openaiImageController; 注入进来直接使用

代码举例:

java 复制代码
package com.bit.image.controller;


import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.openai.OpenAiImageModel;
import org.springframework.ai.openai.OpenAiImageOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("openai")
public class OpenaiImageController {
    @Autowired
    private OpenAiImageModel openAiImageModel;
    @RequestMapping("/image")
    public void image(){
        ImageResponse response = openAiImageModel.call(
                new ImagePrompt("A light cream colored mini golden doodle",
                        OpenAiImageOptions.builder()
                                .quality("hd")
                                .N(1)
                                .height(1024)
                                .width(1024).build())

        );
        String imageUrl = response.getResult().getOutput().getUrl();
        System.out.println(imageUrl);
     }
}

4配置系统属性

本地开发时 即使配置了代理 有时候也无法让你的SpringAI应用正常请求api 这通常是代理软件无法让你整个系统实现全局代理造成的 你只需要在启动类中加入下述代码即可

java 复制代码
// 配置HTTP/HTTPS网络代理
System.setProperty("http.proxyHost", System.getenv("proxyHost"));  // 代理服务器IP
System.setProperty("https.proxyHost", System.getenv("proxyHost"));
System.setProperty("http.proxyPort", "7890");  // 代理软件端口号
System.setProperty("https.proxyPort", "7890");

5测试

接⼝: http://127.0.0.1:8080/openai/image

在控制台可以看到⽣成图⽚的链接, 点击可以看到⽣成的图⽚

(5)Azure OpenAI

SpringAI支持来自Azure OpenAI的图像生成模型DALL-E
Azure OpenAI 和 OpenAI 的关系:可以理解为: OpenAI 负责"造引擎" (训练模型 ) , 微软负责"装⻋" (把引擎装进 Azure 这辆企业级汽⻋⾥ ) .

使⽤ Azure OpenAI , 需要准备⼀张海外的Visa/Master 的信⽤卡或借记卡(⽬前暂停中国个⼈的OpenAI 使⽤). Azure OpenAI Image Generation :: Spring AI Reference

还是和前面的openai一样 官方文档有讲解的部分Image Model API :: Spring AI Reference

(3)QianFan AI

百度千帆是百度智能云推出的AI原生应用开发平台,基于文心大模型构建 提供从模型开发到应用部署的全栈AI能力支持

千帆平台:百度千帆 - 百度智能云控制台 长下面这个样子哦

apikey:百度千帆 - 百度智能云控制台

开通产品:百度千帆 - 百度智能云控制台 个人认证之后 有免费使用额度

项目搭建:

官方文档:通用说明 - 千帆AI应用开发者中心-API参考qianfan-api | 百度智能云文档

引入依赖: v1版本是早期的 从25年4月30日起,v1版本推理服务创建入口已全面关闭 新服 务默认基于v2接口创建 //和openai完全兼容

java 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-starter-model-openai</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

配置文件:

java 复制代码
spring:
  ai:
    openai:
      api-key: ${QIANFAN_API_KEY}
      base-url: https://qianfan.baidubce.com
      completions-path: /v2/chat/completions
      chat:
        options:
          model: "ernie-tiny-8k"
          temperature: 0.7

接口:

java 复制代码
package com.bit.qianfan.controller;


import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/qianfan")
public class QianfanController {

    @Autowired
    private OpenAiChatModel  openAiChatModel;
    @RequestMapping("/chat")
    public String chat(String message){
        return openAiChatModel.call(message);
    }
}

测试接口:127.0.0.1:8080/qianfan/chat?message=你好

成果展示:

图像模型:

和OpenAI保持一致

参考文档:通用图像生成 - 千帆AI应用开发者中心-API参考qianfan-api | 百度智能云文档

配置文件里面添加图像模型有关的内容 注意model里面填的是model参数接入点

//文档不全的时候 通过看源码 看有没有提供相关的配置项

语音模型:

是人工智能领域中用于处理和理解人类语音信号的计算模型 广泛应用于语音识别 语音合成 语音助手等系统中

比如:你对着手机说 今天天气怎么样 AI能立刻听懂你的问题理解语义

官方文档介绍:Moderation :: Spring AI Reference

使用openAI来进行讲述

1申请API_KEY 2添加依赖 3编写接口 4测试运行

java 复制代码
spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}
------------------------------------
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
----------------------------------- 
@Slf4j
@RequestMapping("/speech")
@RestController
public class OpenaiSpeechController {

    @Autowired
   private OpenAiAudioSpeechModel openAiAudioSpeechModel;

    @RequestMapping("/tts")
    public void tts() throws IOException {
        // 构建 TTS 参数配置
        OpenAiAudioSpeechOptions speechOptions = OpenAiAudioSpeechOptions.builder()
                .model("tts-1")
                .voice(OpenAiAudioApi.SpeechRequest.Voice.ALLOY)
                .responseFormat(OpenAiAudioApi.SpeechRequest.AudioResponseFormat.MP3)
                .speed(1.0f)
                .build();

        // 合成文本(修复了乱码)
        SpeechPrompt speechPrompt = new SpeechPrompt("Hello, this is a text-to-speech example.", speechOptions);

        // 调用 OpenAI 接口
        SpeechResponse response = openAiAudioSpeechModel.call(speechPrompt);

        // 生成文件路径(项目根目录下 output.mp3)
        File file = new File(System.getProperty("user.dir") + "/output.mp3");

        // 写入音频文件
        try (FileOutputStream fos = new FileOutputStream(file)) {
            fos.write(response.getResult().getOutput());
        } catch (IOException e) {
            throw new IOException("音频文件写入失败:" + e.getMessage(), e);
        }
    }
}

完成之后 编译器内部会生成一个mp3文件

代码讲解:

(4)阿里云百炼平台

大模型服务平台百炼控制台

里面有文档介绍

DashScope: 百炼是阿里云推出的大模型开发和应用平台,dashscope是大模型API服务平台

百炼平台使用DashScope来调用模型

springAI:是官方推出的AI开发框架

springAI Alibaba:基于springAI构建的

springAiAlibaba代码案例:examples/spring-ai-alibaba-image-example at main · spring-ai-alibaba/examples · GitHub

图像生成:

创建项目 添加配置项 启动类 测试

下面是生成的图片: //只是简单描述一下 感觉非常的不错捏

问AI 生成一些代码之后粘贴到自己的编译器里面 就能将图片保存在目录里面 非常的方便

下面可以在文档上面看到 每个模型的特点:

关于模型的参数调整 在文档里面都有

语音合成:

和之前讲解的文字转语音是一样的 找到对应的模型生成音频文件

音色 等等这些都是可以调整的

使用DashscopeSDK调用模型:

Dadhscope-sdk-java是阿里云官方提供的,不依赖任何特定框架的Java客户端 你可以在任何普通的Java应用程序中引入这个SDK 通过编程式地调用它的API来使用大模型服务

参考文档:安装阿里云百炼SDK-大模型服务平台百炼(Model Studio)-阿里云帮助中心

其实就是引入依赖 我们不需要了解内部 直接使用就行

语音识别:

是指对音频文件进行语音识别,将语音转换为文本

代码参考:examples/spring-ai-alibaba-audio-example at main · spring-ai-alibaba/examples · GitHub

换做使用DashScopeSDK调用模型:录音文件识别JavaSDK使用指南-大模型服务平台百炼-阿里云-大模型服务平台百炼(Model Studio)-阿里云帮助中心

其他模型: 官方文档里面有相关的讲解

例如实时语音识别: 具体讲解API参考 官方文档里面有详细的讲解

文生视频:

一些模型完成视频生成的功能

代码参考:万相2.7文生视频API参考-大模型服务平台百炼(Model Studio)-阿里云帮助中心

3.0 Tool Calling (工具调用)
(1)简介

引入:随着大语言模型的飞速发展 ... 我们想要让帮忙与外界世界交互 执行具体任务 比如查询数据库 发送邮件 或分析数据,为了解决这一挑战,工具调用ToolCalling应运而生

是AI应用程序中的一种常见模式,允许大语言模型根据用户请求,智能地选择 调用外部工具(如函数 API 服务)并获取结果地技术流程 从而增强其功能

Tool Calling 让LLM 从⼀个''⽆所不知的学者"变成了⼀个"⽆所不能的指挥家", 它负责思考和规划, ⽽ 具体的⼯作则由外部⼯具执⾏.

工具调用让AI从只会动脑变成可以动手办事

//打开大众点评 查看附近的热门餐厅 确定餐厅 预定餐厅 提醒大家 等待出发

按钮1:查询餐厅 按钮2:预定餐桌 按钮3:发邮件 按钮4:叫车

例如旅游规划:杭州 周末两天 预算1000元 AI可以生成我可能的花费 路费100元给你

路线规划 景点费用60元 餐厅推荐200元 住宿 费用300元等

和FunctionCalling什么关系?

springAI官方文档有关的介绍:Tool Calling :: Spring AI Reference

functionCalling最早是由openai提出来的 functionCalling是toolCalling早期更为流行的束语

function是函数的意思 functioncalling是指LLM请求调用一个开发者预定义的函数(方法)

toolCalling是一个更通用 更广泛的概念

不仅包含了FunctionCalling,还涵盖了调用其他类型的工具

应用场景:

信息检索: 可以借助Tool从外部资源检索信息 例如数据库 web服务器 文件系统等

采取行动: 借助tool完成一些操作 例如发送电子邮件 在数据库中创建新记录

//模型可以生成预订北京旅⾏的计划. 但是, 该模型不具备执⾏计划的能⼒. 这就是⼯具的⽤武之地. 它 们可⽤于执⾏模型⽣成的计划.

(2)快速使用

添加依赖:

java 复制代码
<dependency>
    <groupId>com.github.victools</groupId>
    <artifactId>jsonschema-generator</artifactId>
    <!-- 可根据实际情况使用最新稳定版本 -->
    <version>4.37.0</version>
</dependency>

//如何把方法定义为一个工具

模型获取不了实时的东西 我们可以定义实时的工具 让AI操控这些工具

定义工具、应用工具:

java 复制代码
@Tool(description = "Get the current date and time in the user's timezone")   
public String call(String message) {
    return chatClient.prompt()
            .user(message)
            .tools(new DateTimeTools())

跟着这个描述知道这个工具是嘎嘛的

测试:

(3)ToolCalling原理

官方文档:https://springdoc.cn/spring-ai/api/tools.html

下面详细讲解6步的每一步:

注册工具:在向AI模型发送请求时,应用程序需要提前告诉模型有哪些工具可用,包括工具的名称 描述 和 参数格式

//看这些源码里面有的那些属性:

描述是灵魂 这个是模型决定是否调用工具的核心依据 描述必须清晰准确

模型决策:AI模型根据对话内容判断是否需要调用工具 当模型决定调用工具时 它会发送一个工具调用的请求 其中包含工具名称和符合预定义的输入参数

查找并执行:应用程序接收到这个 工具调用请求之后 会根据工具名称找到对应的工具 并用模型提供的参数来执行它

//所以工具名称不可以重复

获取结果:工具执行后产生一个结果 (比如,查询到了今天的温度是25度) 应用程序会处理返回的结果

返回结果:应用程序将这个工具执行的结果再次发送给AI模型

生成最终回复:AI模型结合工具返回的结果 生成最终的回复

例:构建一个能帮助你点咖啡的AI助手

⽐如: 你正在构建⼀个能帮你点咖啡的AI助⼿ 但是AI模型不会"点咖啡", 所以需要提供⼀个额外的⼯具, 来完成"点咖啡"这个功能 • 注册⼯具: 你告诉AI助⼿:你现在有⼀个⼯具, 叫 orderCoffee, 功能是'帮⽤⼾下单⼀杯咖啡'. 它需要两个参数:coffeeType (⽐如'拿铁'、'美式') 和 size (⽐如'中杯'、'⼤杯') . " ⽤⼾请求:你对AI说:"帮我点⼀杯⼤杯的拿铁. " • 模型决策:AI模型理解你的意图后, 它不会直接说"好的", ⽽是会"调⽤⼯具". 它给应⽤程序的回复 (内部表⽰) 是:"我需要调⽤⼯具 orderCoffee, 并传⼊参数 coffeeType=拿铁, size=⼤杯. " 这就是模型返回了⼀个⼯具调⽤请求, ⽽不是最终答案. • 执⾏⼯具:你的应⽤程序 (⽐如⼀个Spring Boot服务) 接收到这个请求, ⽴刻找到名为 orderCoffee 的⼯具 (可能是⼀个Java⽅法) , 并⽤参数执⾏它. 这个⽅法会调⽤后端的订单系统, 真正下⼀单. 这就是 ToolCallingManager 和你的 ToolCallback 在⼲活. • 返回结果:订单系统返回:"订单创建成功, 订单号是 #12345, 预计5分钟后完成. " 这是⼯具执⾏的结果. • 返回结果:你的应⽤程序把这个结果 ("订单号#12345...") 塞回给AI模型. • ⽣成最终回复: AI模型看到后, 组织了⼀下语⾔, 最终对你说:"好的, 已为您下单⼤杯拿铁!订单号 是 #12345, 请稍等⽚刻哦~" 模型利⽤⼯具执⾏的结果, ⽣成了对⽤⼾友好的最终回复. AI模型本⾝不会点咖啡, 它只是个"⼤脑". 应⽤程序 (通过Spring AI的⼯具调⽤框架) 提供 了"⼿"和"脚" ( orderCoffee ⼯具) , 让"⼤脑"可以指挥"⼿脚"去完成实际任务。

(4) 声明定义工具

声明式定义工具:

tool: name是指定工具的名称 description:工具秒数 模型可以使用它来了解何时以及如何调用工具 如果不指定规则使用方法名 建议详细清楚的描述工具的功能 这对于工具的使用至关重要,直接影响大模型的使用效果 returnDirect:指定工具执行的结果是直接返回 还是要发给大模型 默认发送给大模型 resultConvertre:指定工具执行结果转换器 默认将工具调用结果转换为String

springAI将自动为 @Tool 注解方法的输入参数生成JSON Schema 该Schema供模型理解如何调用工具以及准备工具请求

例如: 把json数据块变成下面这样了 帮助模型理解

开发⼈员可以通过**@ToolParam** 注解为输⼊参数提供额外信息 (如描述、是否必需等), 默认情况下所有输⼊参数均为必需参数.

为chatClient添加默认工具和运行时工具

为chatModel添加工具:

java 复制代码
ChatModel chatModel = ...

ToolCallback[] dateTimeTools = ToolCallbacks.from(new DateTimeTools());
ChatOptions chatOptions = ToolCallingChatOptions.builder()
        .toolCallbacks(dateTimeTools)
        .build();

Prompt prompt = new Prompt("What day is tomorrow?", chatOptions);
chatModel.call(prompt);
(5)编程式定义工具

除了声明式之外,我们也可以通过编程式构建MethodToolCallback 将方法转为工具

java 复制代码
Method method = ReflectionUtils.findMethod(WeatherTools.class, "getCurrentWeatherByCityName", String.class);
ToolCallback toolCallback = MethodToolCallback.builder()
        .toolDefinition(
                ToolDefinitions.builder(method)
                        .description("根据给定的城市名称, 获取当前城市的天气")
                        .build())
        .toolMethod(method)
        .toolObject(new WeatherTools())
        .build();

为ChatClient 添加工具

定义一个方法 定义ToolCallback 通过toolCallbacks为ChatClient添加工具//也可以抽取出来

下面是有关的代码:

java 复制代码
//定义一个方法
public class WeatherTools {
    String getCurrentWeatherByCityName(String cityName) {
        switch (cityName) {
            case "北京":
                return "北京今天天气: 晴空万里";
            case "上海":
                return "上海今天天气: 电闪雷鸣";
            case "广州":
                return "广州今天天气: 细雨蒙蒙";
            default:
                return "没有该城市的天气信息";
        }
    }
}
// 定义ToolCallback
Method method = ReflectionUtils.findMethod(WeatherTools.class, "getCurrentWeatherByCityName", String.class);

ToolCallback toolCallback = MethodToolCallback.builder()
        .toolDefinition(
                ToolDefinitions.builder(method)
                        .description("根据给定的城市名称, 获取当前城市的天气")
                        .build()
        )
        .toolMethod(method)
        .toolObject(new WeatherTools())
        .build();
//通过toolCallbacks为ChatClient添加工具
@RequestMapping("/call")
public String call(String prompt) {
    Method method = ReflectionUtils.findMethod(WeatherTools.class, "getCurrentWeatherByCityName", String.class);
    
    ToolCallback weatherTools = MethodToolCallback.builder()
            .toolDefinition(ToolDefinitions.builder(method)
                    .description("根据给定的城市名称, 获取城市当前的天气 ")
                    .build())
            .toolMethod(method)
            .toolObject(new WeatherTools())
            .build();
            
    return chatClient.prompt()
            .toolCallbacks(weatherTools)
            .user(prompt)
            .call()
            .content();
}
//也可以抽取出来
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Method;

@Configuration
public class ToolConfig {

    @Bean
    public ToolCallback weatherToolCallback() {
        Method method = ReflectionUtils.findMethod(WeatherTools.class,
                "getCurrentWeatherByCityName", String.class);
        
        ToolCallback weatherTools = MethodToolCallback.builder()
                .toolDefinition(ToolDefinitions.builder(method)
                        .description("根据给定的城市名称, 获取城市当前的天气 ")
                        .build())
                .toolMethod(method)
                .toolObject(new WeatherTools())
                .build();
                
        return weatherTools;
    }
}
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/chat")
public class ChatController {

    public ChatClient chatClient;

    public ChatController(DashScopeChatModel chatModel, ToolCallback weatherTools) {
        this.chatClient = ChatClient.builder(chatModel)
                .defaultToolCallbacks(weatherTools)
                .build();
    }

    @RequestMapping("/call")
    public String call(String prompt) {
        return chatClient.prompt()
                .user(prompt)
                .call()
                .content();
    }
}
(6)工具规范

ToolCallback 是⼀个⽤于与 AI 模型交互的回调接⼝,允许开发者定义可被 AI 调⽤的外部⼯具, 在 AI 应⽤(⽐如⼤语⾔模型)中集成"⼯具" (Tools), 让 AI 模型可以在需要时调⽤外部功能。

getToolDefinition:返回工具的信息描述 参数列表等结构化信息 表示这个工具在什么时候使用 怎么使用

getToolMetadata:非必要 非功能性元数据,主要用于框架层面的扩展性支持 不影响核心逻辑

call:toolcontext 带上下文的调用方法 也是默认实现 如果toolContext有值则不支持,主要用于被子类重写支持上下文功能

MethodToolCallback:是springAI框架中实现Tool Calling的核心机制之一,它用于将普通Java方法包装成AI模型可调用的"工具" 就相当于桥梁

可以点开看看源码部分的描述 很清晰 例如:

java 复制代码
public final class MethodToolCallback implements ToolCallback {
    // 工具默认执行的转换器
    private static final ToolCallResultConverter DEFAULT_RESULT_CONVERTER = new DefaultToolCallResultConverter();
    
    // 工具默认元数据
    private static final ToolMetadata DEFAULT_TOOL_METADATA = ToolMetadata.builder().build();
    
    // 工具定义,也称为工具的元信息:名字、描述、参数列表等,告诉 AI "我能干啥"
    private final ToolDefinition toolDefinition;
    
    // 工具额外元数据(如权限, 分类)
    private final ToolMetadata toolMetadata;
    
    // 真正要执行的那个 Java 方法对象(通过反射获取)
    private final Method toolMethod;
    
    // 工具对象: 如果方法不是静态的,需要这个对象来调用(即 object.method())
    @Nullable
    private final Object toolObject;
    
    // 工具转换器:把方法返回值转成字符串,返回给 AI(默认用 JSON)
    private final ToolCallResultConverter toolCallResultConverter;
}

ToolDefintion

这个接口提供AI模型识别工具可用性所需的信息,包括工具名称,描述以及输入模式,每个ToolCallback实现必须提供ToolDefinition实例来定义工具

name属性是工具名称,在提供给模型的工具集中是唯一的 description:AI模型使用工具描述来确定工具的功能 innputSchema 用于调用工具的参数的模式

ToolDefinition.Builder 允许使⽤默认实现 ( DefaultToolDefinition ) 构建 ToolDefinition 实例.

ToolDefinition定义:基于方法构建工具时,ToolDefintion会自动生成,若需自行创建 可使用此便捷Builder 若需显式指定部分或全部属性,可使用ToolDefintion.Builder构建自定义的ToolDefinition实例

ToolContext:

springAI支持通过ToolContextAPI向工具传递额外的上下文信息,此功能允许开发人员提供用户自定义的额外数据,这些数据可与AI模型传递的工具数一起在工具执行过程中使用 ToolContext中提供的任何数据都不会发送给AI模型 调用ChatModel也可以定义工具上下文数据

ReturnDirect:

默认情况下,工具调用结果将作为响应返回模型,随后模型可利用该结果继续对话

某些场景下,开发人员可能希望将结果直接返回调用方而非传回模型。

工具执行:是指提供的输入参数调用工具并返回结果的过程

这个过程由ToolCallingManager接口处理 该接口是SpringAI中负责管理 AI调用工具 全过程的核心组件 负责管理工具执行的完整生命周期

这个接口主要有两个方法 一个是resolveToolDefinitions 一个是executeToolCalls

从模型的工具调用选项中解析工具定义,告诉模型 : 我能用哪些工具

第二个 执行模型所要求的工具调用 也就是真正的去调工具

4.0 MCP

(1)简介

引入:当今快速发展的AI应用生态中,有越来越多这样的应用场景

用户提问时,系统要通过进行联网搜索 多平台兼容性差 某智能助手需要调用高德地图获

取位置信息

为了解决这个问题

一个名为 模型上下文协议的标准应运而生,MCP并不替代ToolCalling,而是为其提供一个统一、可拓展、跨平台的连接基础设施。

可以把两者的关系理解为:

Tool Calling 是"决策⾏为": 模型决定"要不要调⽤⼯具"、"调哪个⼯具"、"传什么参数" MCP 是"通信协议" : 规定"如何描述⼯具"、"如何发起调⽤"、"如何传递结果"、"如何管理会话状态"。

通俗 :假设你想要做一个旅游推荐机器人,它可以查天气,查景点信息,预定酒店。这些功能分贝由三个不同的团队提供服务。如果每个服务都有自己定义一套交互方式,有的XML有的RESTAPI有的gRPC 你的AI应用程序就要写三套调用逻辑,维护三种错误处理机制,非常麻烦。更糟糕的是,AI本身并不直接理解HTTP请求怎么发、JSON怎么构造,它只能告诉你:"我想查某个用户的地址 ⾄于怎么调⽤接⼝、传什么参数、如何解析结果, 必须有⼈帮它完成. 于是, 我们需要⼀个"翻译官" + "中介平台"⸺这就是MCP诞⽣的意义。

MCP:Model Context Protocol

就像 Web 应用中的浏览器与 HTTP 协议的关系

  • 浏览器决定要访问哪个页面(相当于模型发起 Tool Calling)
  • 而真正完成数据传输的是底层的 HTTP 协议(相当于 MCP 承载调用过程)
(2)内容

MCP官方文档介绍:What is the Model Context Protocol (MCP)? - Model Context Protocol

MCP是一个开放标准协议,它的目标是让大模型驱动的AI应用(例Claude ChatGPT)能够像"插上USB接口"一样,轻松的连接到外部系统-----包括数据库,文件,工具,软件甚至物理设备

以前每个AI工具都要接入某个服务,都得单独开发一套对接逻辑,现在有了MCP,就像所有设备都统一使用USB充电一样 只要遵循这个标准,就能即插即用 AI的万能插座,或 通用接口

MCP让AI模型不再是"聊天机器人" 而是可以 获取你的私人数据(在授权的前提下) 使用专业工具执行任务 自动完成复杂工作流

对于开发者⽽⾔, 可以不再为每个 AI 应⽤重复开发插件, 只需做⼀个 MCP Server, 多个 AI 都能调⽤. 对于AI应⽤商⽽⾔, 可以快速集成海量⼯具, 增强产品竞争⼒ (⽐如让 ChatGPT 能控制微信) 对于普通⽤⼾⽽⾔, 可以获得更聪明、更懂你、能办事的 AI 助⼿, ⽽不是只会回答问题的"百科机器⼈"

来个直观的例子吧:

(3)MCP JavaSDK架构

MCP Java SDK 提供 MCP 的 Java 实现, ⽀持通过同步和异步通信模式与 AI 模型及⼯具进⾏标准化交互.

同步模式和异步模式:

Client/Server层:McpClient处理客户端操作,McpServer管理服务端协议操作,二者均通过McpSession进行通信管理。 Session层通过DefaultMcpSession实现通信模式及状态。 Transport 处理json-rpc消息的序列化与反序列化 支持多种传输协议实现

传输协议:就像你可以用微信、打电话、或者当面喊人来传递消息一样,MCP支持不同的"传输方式"------这就是所谓的传输协议 目前它支持三种传输方式:基于Stdio的进程间通信传输协议 基于JavaHttpClient的SSE客户端传输协议 WebFluxSSE客户端传输协议(用于响应式HTTP流式通信)

(4)MCP使用

MCP爱好者社区:MCP Servers https://mcpcc.cc/ MCPFlow - 中文MCP技术社区 docs.mcpservers.cn

这些网站汇集了丰富的MCP服务器信息,支持按人气排名,功能类型等多种条件筛选,帮助用户快速找到心仪的服务器。同时,它们也为开服者提供了展示成果、推广服务器的重要渠道,积极推动了MCP生态繁荣与发展。

下面我们来讲解社区里面的一篇文章:

大白话帮你拆解这个mcp-server-flomo项目

这个项目就是一个现成的写字机器人,你把它插到智能家居系统里,AI就能随时帮你记笔记了

项目名:mcp-server-flomo 一看就知道是给Flomo用的MCP服务器 作者:jamesfeng2009

功能标签:笔记记录 这个机器专门干笔记的活 技术栈:JavaScript 通过stdio方式通信

配置代码: command:"npx" 用npx来启动它 npx负责临时下载并运行这些工具 args: ["-y", "@chatmcp/mcp-server-flomo"]

-y的意思是别问我 直接执行 @chat这里是npm上的包名,告诉npx去下载并运行这个工具

env:设置环境变量 把FLOMO_API_URL换成你自己的FlomoAPI地址,就像告诉机器人 用这个地址把笔记存进去 readme是功能清单:里面有一些介绍

开发与安装:

下面是我的尝试记录:

localhost:8080/chat?message=这是我第一次把AI应用到具体软件里面 记录到里面了吗嘟嘟?

其他好玩的mcp:

MCP Client:

有了MCP服务器之后,如何在实际开发或使用中调用这些服务?这就需要借助MCP客户端(MCP Client) MCP 客⼾端是连接本地开发环境或应⽤与远程 MCP 服务器之间的桥梁

现在市面上有很多中类型地MCP客户端。比如电脑软件,代码编辑器插件,智能自动化框架等。它们各有侧重,有些适合程序员辅助写代码 有些功能更全面 适合处理复杂任务流程 你可以根据自己的需要选择合适的客户端 用户可以根据自己的需求选择合适的客户端。 例:

(5)环境准备

在使用MCP Client之前,通常需要先运行一个或多个MCPServer实例,而许多MCP Server是通过npx或uv命令启动的,在开始使用前,必须正确配置相应的运行环境。

MCP Client 环境准备:

核心概念解释:

Node.js 是一个基于Chrome V8引擎构建的JavaScript运行时环境 允许开发者在服务端执行JavaScript代码 在MCP生态中 部分MCP Server 实现是用TypeScript编写的 需要依赖Node.js来运行

npx和npm的区别:

npm:是Node.js自带的包管理工具 用于安装和管理JavaScript包

npx:用于执行npm包中可执行命令 支持临时下载并运行远程包

python与现代包管理工具uv:许多MCP Server使用Python编写 在MCP生态中,uv被推荐为首选工具来运行Python的MCPServer

安装必要软件: Node.js(含npm 和 npx) python uv(高效管理python包与虚拟环境)

安装Node.js https://nodejs.org //务必勾选Add to Path这个选项

验证安装:cmd里面 node --version和npm --version和npx --version

安装python https://www.python.org/downloads/ //务必add to path和 勾选pip

安装uv : 通过pip安装 安装 | uv 中文文档

安装方式有很多种 刚刚不是装好python了嘛 在写一个pip install uv就可

验证安装:

5.0 cursor

(1)简介

cursor是一个完整的AI驱动编程工具(AI驱动的IDE) 不仅仅是一个代码补全工具,更实现了深层次的AI集成 可以直接用自然语言和它对话 询问任何编程相关的问题 它不仅仅能即时生成代码,还能解释代码的原理和设计思路

https://www.cursor.com/cn //下载地址

Cursor 文档 --- 智能体、规则、MCP、技能和 CLI //cursor官方文档

cursor配置: 字体改为中文简体

ctrl + shift + x打开扩展商店 输入chinese 改成中文版

常用快捷键:ctrl shift L:打开聊天 右侧会显示对话框,可以和AI沟通交流

例如:

之前我们说过 AI光有一个聪明的大脑 但是没有手脚

我们直接跟AI说 打开浏览器搜索百度 它是做不到的 但是接入手脚之后就可以了

(2) 安装MCP服务端

cursor文档:Cursor 文档 --- 智能体、规则、MCP、技能和 CLI

配置安装:

https://docs.cursor.com/zh/context/mcp

一键安装:从MCP库中安装MCP服务器,并通过OAuth完成认证

下面这些都是可以在cursor里面使用的

点击之后可以直接添加到cursor

之后就是在cursor里面安装就可以了

(3) 使用Cursor安装MCP服务器

上面添加的是官网默认的MCP 我们在社区里面的MCP如何接入呢?

写入代码之后自动保存

之后会自动更新 绿点表示成功

点击能看报错信息 为什么这个mcp没有启动

5.0 Cline

(1) 简介与安装

是一个基于MCP协议构建的 独立命令行AI代理工具允许用户通过自然语言与本地系统进行交互

执行文件操作 运行脚本 调用外部服务等任务

简单讲解一下就是:能用嘴指挥电脑干活的黑窗口工具,基于MCP接各种外挂,让它能动手改文件,执行命令,调网络服务

安装:

提供了VisualStudio Code的插件版本,为 Cline CLI 的核⼼能⼒提供图形化界⾯⽀持. 它允许⽤⼾在不打开终端的情况下, 直接在编辑器侧边栏或命令⾯板中调⽤ AI 代理功能.

我们借助VS Code的插件来使用Cline

Cline默认英文版本,也会有对应的中文版本,我们选择使用Cline Chinese

Cline集成了丰富的AI供应商 只需要填写对应的API_KEY即可

里面可以调整 AI供应商 切换各种模型等 这个自己调整

右下角 计划 执行 //执行是立即执行任务 计划是收集信息 生成计划

例如 :输入框输入 创建一个文件 用Java代码编译二分查找法

(2)使用Cline安装MCP服务

市场 远程服务器 已安装

和之前在cursor里面的配置一样 输入代码之后就可以运行了

现在的大模型不再是聪明的脑袋 长出了好多手脚

(3) SpringAI接入MCP Server

MCP社区提供了非常丰富的MCP服务,除了上述讲的客户端之外,我们也可以通过SpringAI代码来接入这些资源

首先最基础的环境搭建部分:

创建模块 添加相应的pom配置:springbootweb和springboot test springAlibaba的框架

配置文件:复制之前的就行 添加启动类 写接口

如何接入MCP server?

添加依赖 和 配置文件: springAI的mcp依赖

java 复制代码
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-client</artifactId>
</dependency>
---------------------------------------------------------
spring:
  ai:
    mcp:
      client:
        request-timeout: 60000
        stdio:
          servers-configuration: classpath:/mcp/mcp-servers-config.json

配置文件最后一行里面的网址里面 内容就是之前配置mcp的时候的代码 只是有略微区别

方便观察 添加日志:

java 复制代码
logging:
  level:
    io:
      modelcontextprotocol:
        client: DEBUG
        spec: DEBUG

添加工具到ChatClient:

java 复制代码
public ChatController(DashScopeChatModel chatModel, ToolCallbackProvider toolCallbackProvider) {
    this.chatClient = ChatClient.builder(chatModel)
            .defaultToolCallbacks(toolCallbackProvider)
            .build();
}

ToolCallbackProvider帮助我们自动绑定

启动程序,观察日志

6.0 自定义MCP Server

在MCP社区中,开发者可以发现大量由社区成员贡献的MCP服务,也可以基于自身需求,创建和发布自己的MCP服务。

这块内容是学习如何自己开发MCP Server

(1)STDIO

翻译:标准化输入输出 就是程序最基本的说话和听话的方式

你在命令行里面敲字,程序读到的东西叫做 标准输入;程序在屏幕上打印出来的字,叫标准输出

STDIO 就是 MCP 服务通过标准输入输出跟 AI 代理交流,像一个本地随叫随到的工具人,不用上网,直接用命令行传话干活。 直接传输

创建模块mcp-stdio-server-demo

依次完善pom文件:添加mcp-server依赖 配置文件 启动类

//开发一个获取用户信息的工具

定义工具:

java 复制代码
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import java.util.HashMap;
import java.util.Map;

public class UserService {

    static Map<String, UserInfo> userInfoMap = new HashMap<>();

    static {
        userInfoMap.put("zhangsan", new UserInfo("zhangsan", 15, "男", "北京"));
        userInfoMap.put("lisi", new UserInfo("lisi", 16, "男", "上海"));
        userInfoMap.put("wangwu", new UserInfo("wangwu", 17, "男", "广州"));
        userInfoMap.put("zhaoliu", new UserInfo("zhaoliu", 18, "女", "深圳"));
        userInfoMap.put("sungi", new UserInfo("sungi", 19, "女", "香港"));
        userInfoMap.put("zhaoba", new UserInfo("zhaoba", 20, "女", "澳门"));
    }

    @Tool(description = "根据用户的姓名,返回用户信息")
    public String getUserInfo(@ToolParam(description = "用户的姓名") String name) {
        if (userInfoMap.containsKey(name)) {
            return userInfoMap.get(name).toString();
        }
        return "未查询到用户信息";
    }
}

暴漏工具:

java 复制代码
package com.bit.mcp.config;

import com.bit.mcp.service.UserService;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ToolConfig {
    @Bean
    public ToolCallbackProvider getUserInfo(UserService userservice) {
        return MethodToolCallbackProvider.builder()
                .toolObjects()
                .build();
    }
}

配置文件 表示这是一个MCP Server:

java 复制代码
spring:
  ai:
    mcp:
      server:
        name: user-info
        version: 0.0.1
  main:
    web-application-type: none
    banner-mode: off.

打包:

这样就打包完成了

接下来就是客户端调用了

cursor调用:

在cursor里面配置mcp 然后输入代码一刷新

java 复制代码
"user-info": {
    "command": "E:/chengxu/jdk17/bin/java.exe",
    "args": [
        "-Dspring.ai.mcp.server.stdio=true",
        "-Dlogging.pattern.console=",
        "-jar",
        "E:/JavaCode/JavaCode02/ai02/spring-ai-project/mcp-stdio-server-demo/target/mcp-stdio-server-demo-1.0-SNAPSHOT.jar"
    ]
}

这个时候去看cursor 就有了这个工具了

cursor调用:

SpringAI接入:

在mcp-servers-config.json 文件中配置mcp server

添加工具 :构建ChatClient

测试接口

(2)SSE

SSE:服务器推送事件

SSE实现方式和STDIO实现上有一些配置不同

创建模块mcp-sse-server-demo //复制一下mcp-stdio-server-demo改下名称

添加依赖 配置文件 测试 客户端调用 cursor调用 其他starter

7.0 MCP部署

(1)部署

MCP ⽀持多种传输⽅式, ⽽不同的协议决定了不同的部署策略.

• 本地部署: 适⽤于Stdio传输⽅式(进程间通信)

• 远程部署: 适⽤于SSE, WebFlux SSE传输⽅式(基于SSE协议的通信)

本地部署:就是上面案例的部署方式 打包成jar 这种方式简单粗暴但是不够灵活,扩展性差,管理起来比较麻烦

远程部署:MCP服务远程部署和部署后端项目的流程是一样的,需要在服务器上部署

作为Java开发者,更推荐使用远程部署,将MCP Server注册为服务

提交到平台:MCP服务部署好之后,还可以提交各种MCP开源社区,让其他人也能使用你的MCP服务 每个平台的提交规则不同 按各个平台要求就可以

远程部署是一种基于HTTP 单项实时通信协议 允许服务端向客户端推送数据

提交到平台:MCP Servers 点击submit

(2)MCP推荐

Playwright MCP Serve: AI 模型与浏览器自动化之间的桥梁,使大语言模型能够通过标准化协议直接操作网页内容

• 控制浏览器 (Chrome、Firefox、Safari)

• ⾃动点击、输⼊、截图、爬⽹⻚

• 模拟真实⽤⼾操作

Fetch:是一个网页内容抓取服务器 使大型语言模型能够:

• 从互联⽹检索⽹⻚内容

• 将 HTML 转换为易读的 Markdown 格式 //提取页面内容并转换为Markdown格式

• 分块读取⻓⽹⻚

//技术初型 尽量选择官方提供的MCP

相关推荐
Elastic 中国社区官方博客1 小时前
一个索引,所有媒体:介绍 jina-embeddings-v5-omni
大数据·人工智能·elasticsearch·搜索引擎·ai·媒体·jina
极客老王说Agent2 小时前
实在Agent委外加工智能化管控方案与落地案例:重构2026制造业协同新范式
人工智能·ai·chatgpt
程序员鱼皮2 小时前
再见百度,我用 1 小时,开发了个 AI 搜索引擎!Codex + GPT 5.5 + DeepSeek V4 真香~
计算机·ai·程序员·编程·ai编程
笨蛋©2 小时前
[实战] 2026制造业数字化:检验计划软件在质量控制中的应用与流程优化
ai·数字化·cad·质量管理·制造业
xixixi777772 小时前
从“联网通行证”到“安全可信根”:AI-eSIM的硬件级安全底座正在重构物联网安全边界
人工智能·安全·ai·重构·大模型·通信
qcx232 小时前
RAO 深度解读:当 Agent 学会递归调用自己——推理时扩展的新范式
人工智能·ai·llm·prompt·agent·递归
Agent产品评测局2 小时前
传统RPAvsAI Agent,制造业生产场景能力对比详解 —— 2026智能制造自动化选型全景盘点
人工智能·ai·chatgpt·自动化·制造
Bruce_Liuxiaowei2 小时前
OpenAI双杀_40亿部署公司+Daybreak安全AI_博客初稿
人工智能·安全·ai·大模型
三寸3372 小时前
又搞事情,OpenAI 开始关闭微调服务!
人工智能·ai·chatgpt·ai编程