MCP(Model Context Protocol)模型上下文协议 理论篇4 - 工具(Tools)

工具(Tools)是模型上下文协议(MCP)中的一个基本元素,它允许服务器向客户端暴露可执行的功能。通过工具,大语言模型(LLMs)可以与外部系统交互、执行计算并在现实世界中采取行动。工具的设计理念是模型控制,即服务器将工具暴露给客户端,目的是让AI模型能够自动调用这些工具。

工具的核心功能

  1. 发现(Discovery):客户端可以通过tools/list端点列出可用的工具。
  2. 调用(Invocation):工具通过tools/call端点被调用,服务器执行请求的操作并返回结果。
  3. 灵活性(Flexibility):工具的范围从简单的计算到复杂的API交互,具有高度的灵活性。

工具与资源(Resources)不同,资源通常是静态的,而工具代表动态操作,可以修改状态或与外部系统交互。

工具的定义结构

每个工具的定义结构如下:

{
  "name": "string",          // 工具的唯一标识符
  "description": "string",   // 工具的人类可读描述
  "inputSchema": {           // 工具参数的JSON Schema
    "type": "object",
    "properties": { ... }    // 工具特定的参数
  }
}

工具的实现示例

以下是一个在MCP服务器中实现基本工具的示例:

const server = new Server({
  name: "example-server",
  version: "1.0.0"
}, {
  capabilities: {
    tools: {}
  }
});

// 定义可用的工具
server.setRequestHandler(ListToolsRequestSchema, async () => {
  return {
    tools: [{
      name: "calculate_sum",
      description: "Add two numbers together",
      inputSchema: {
        type: "object",
        properties: {
          a: { type: "number" },
          b: { type: "number" }
        },
        required: ["a", "b"]
      }
    }]
  };
});

// 处理工具执行
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  if (request.params.name === "calculate_sum") {
    const { a, b } = request.params.arguments;
    return {
      toolResult: a + b
    };
  }
  throw new Error("Tool not found");
});

工具的模式示例

系统操作:与本地系统交互的工具。

{
  "name": "execute_command",
  "description": "Run a shell command",
  "inputSchema": {
    "type": "object",
    "properties": {
      "command": { "type": "string" },
      "args": { "type": "array", "items": { "type": "string" } }
    }
  }
}

API集成:封装外部API的工具。

{
  "name": "github_create_issue",
  "description": "Create a GitHub issue",
  "inputSchema": {
    "type": "object",
    "properties": {
      "title": { "type": "string" },
      "body": { "type": "string" },
      "labels": { "type": "array", "items": { "type": "string" } }
    }
  }
}

数据处理:用于数据转换或分析的工具。

{
  "name": "analyze_csv",
  "description": "Analyze a CSV file",
  "inputSchema": {
    "type": "object",
    "properties": {
      "filepath": { "type": "string" },
      "operations": {
        "type": "array",
        "items": {
          "enum": ["sum", "average", "count"]
        }
      }
    }
  }
}

总结

工具(Tools)在MCP中是一个核心概念,它通过服务器暴露可执行功能,使LLMs能够与外部系统交互并执行复杂的操作。工具的设计具有高度的灵活性和可扩展性,能够支持从简单的计算到复杂的API集成。通过定义工具的结构和实现方式,开发者可以轻松地将各种功能集成到LLMs中,从而增强模型的能力。

工具的模型控制特性确保了工具的调用是可控的,可以额外加入人工批准作为限制,这为安全性和可控性提供了保障。工具的发现和调用机制使得LLMs能够动态地与服务器交互,执行各种任务,极大地扩展了模型的应用场景。

<think>好的,我现在需要解决用户的问题:如何使用Spring Boot和Spring AI SDK编写一个MCP协议客户端代码示例,要求支持动态配置外部MCP服务并集成内部自定义工具。首先,我得理解用户的具体需求。 用户提到了几个关键点:Spring Boot、Spring AI SDK、MCP协议客户端、动态配置外部服务、内部自定义工具。根据提供的引用内容,特别是引用1到4,里面提到了MCP客户端的启动器、配置示例、依赖项以及Docker配置。我需要将这些信息整合起来,生成一个完整的示例代码。 首先,我需要确定所需的依赖项。根据引用1和3,用户需要添加spring-ai-mcp-client-spring-boot-starter依赖,可能还需要核心库spring-ai-mcp-core。然后,配置文件中需要设置MCP相关的属性,如应用名称、传输协议工具启用等,如引用2中的application.properties示例。 接下来是动态配置外部MCP服务。动态配置可能意味着在运行时加载不同的服务配置,而不是硬编码在代码中。引用1提到MCP客户端支持多实例管理,所以可能需要通过配置类来创建多个客户端实例,每个实例对应不同的服务配置。例如,使用@ConfigurationProperties来绑定配置,然后根据不同的配置名称初始化客户端。 然后是内部自定义工具的集成。引用1提到Spring AI工具执行框架集成,所以可能需要创建自定义工具类,并用@Bean注解将其注册到Spring上下文中。这样,MCP客户端在处理请求时能够调用这些工具。 接下来,代码结构方面,主应用类需要启用自动配置,可能使用@SpringBootApplication。配置类可能需要使用@Configuration和@EnableConfigurationProperties来加载配置属性。然后,通过@Bean方法创建McpClient实例,使用McpClientBuilder,并设置传输协议工具执行器等参数。工具执行器可能需要注入Spring的ApplicationContext来获取所有注册的工具。 在动态配置方面,可能需要读取外部配置文件(如JSON),如引用2中的mcp-servers-config.json,里面定义了不同服务的地址和传输协议。配置类需要解析这些配置,并为每个服务创建对应的客户端实例。 另外,引用4提到了Docker配置,但用户主要关注代码示例,所以可能需要忽略Docker部分,除非需要展示如何部署。 测试部分,用户可能需要一个控制器来接收请求并调用MCP客户端。例如,创建一个RestController,注入McpClient,然后处理请求,调用客户端的execute方法,传入Prompt,并获取响应。 需要注意的是,代码示例中的配置属性是否正确,比如base-url、api-key是否正确引用,工具是否启用,传输协议是否正确配置。此外,自定义工具需要实现Tool接口,并注册为Spring组件。 可能遇到的问题包括依赖版本是否正确,配置属性是否正确绑定,工具是否被正确识别和调用。需要确保所有依赖项都已正确添加到pom.xml中,配置文件的路径和内容正确,工具类被正确扫描并注册。 最后,验证代码是否能够动态加载外部MCP服务配置,例如通过不同的服务名称调用不同的服务,并能够使用内部工具处理请求。同时,确保生命周期管理正确,如引用1提到的自动清理资源。 总结步骤:添加依赖、配置属性、创建配置类动态初始化客户端、注册自定义工具、编写控制器进行测试。需要检查每个部分的代码是否正确,并参考提供的引用内容中的配置示例和依赖信息。</think>根据需求整理实现步骤及代码示例: ### 一、添加Maven依赖 ```xml <!-- 引用[1]标准MCP客户端 --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId> </dependency> <!-- 引用[3]核心库(若需要) --> <dependency> <groupId>org.springframework.experimental</groupId> <artifactId>spring-ai-mcp-core</artifactId> <version>0.1.0</version> </dependency> ``` ### 二、配置application.properties ```properties # 引用[2]基础配置 spring.application.name=mcp-client-demo spring.ai.mcp.client.toolcallback.enabled=true spring.ai.mcp.client.servers-configuration=classpath:mcp-servers.json # 动态服务配置示例 spring.ai.mcp.clients.external1.transport=http spring.ai.mcp.clients.external1.endpoint=https://api.example.com/mcp/v1 spring.ai.mcp.clients.external2.transport=webflux spring.ai.mcp.clients.external2.endpoint=http://localhost:8081/mcp ``` ### 三、动态客户端配置类 ```java @Configuration @EnableConfigurationProperties(McpClientProperties.class) public class McpClientConfig { @Autowired private McpClientProperties properties; @Bean public McpClientFactory mcpClientFactory() { return new McpClientFactory(properties.getClients()); } @Bean @Primary public McpClient dynamicMcpClient(McpClientFactory factory) { return factory.createClient("default"); } } ``` ### 四、自定义工具实现 ```java @Component public class DataProcessorTool implements Tool { @Override public String getName() { return "data_processor"; } @Override public Object execute(Map<String, Object> params) { // 实现数据处理逻辑 return processData(params.get("input")); } } ``` ### 五、服务调用示例 ```java @RestController public class McpController { @Autowired private McpClient mcpClient; @PostMapping("/ask") public String askQuestion(@RequestBody String query) { Prompt prompt = new Prompt(query); McpResponse response = mcpClient.execute(prompt); return response.getContent(); } } ``` ### 六、动态服务配置文件 在resources/mcp-servers.json中定义: ```json { "servers": [ { "name": "external-service-1", "transport": "http", "endpoint": "https://api.example.com/mcp", "interceptors": ["loggingInterceptor"] }, { "name": "internal-service", "transport": "stdio", "command": "python3 internal_tool.py" } ] } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值