乐于分享
好东西不私藏

AI Agent开发必懂:Skill调用MCP原理+实操一步到位

AI Agent开发必懂:Skill调用MCP原理+实操一步到位

现在做AI开发,早就不是单纯调大模型API、写几行Prompt就能搞定生产级项目了。

很多开发者做完Demo都会遇到同一个痛点:大模型本身再强,连不上数据库、读不了业务文件、调不通内部API,就永远只能停留在“聊天玩具”阶段。

想要让AI真正落地办公、运维、数据查询、业务自动化场景,必须吃透两个核心概念:Skill(智能体技能流程) 和 MCP(Model Context Protocol 模型上下文协议)

不少新手开发者经常搞混:Skill和MCP到底啥关系?为什么两个都要配?Skill怎么才能正常调用MCP?配置完为啥提示“没有可用数据库MCP工具”?

今天这篇文章,不讲空话、不堆概念,从核心定位、底层原理、完整调用流程、实操配置、常见报错排查,一次性讲透Skill调用MCP全逻辑,AI开发人手必备收藏。

壹、 先搞懂核心定位:Skill和MCP分工完全不同

很多人踩坑的根源,就是把Skill和MCP混为一谈,以为二选一就行,其实二者是各司其职、强弱搭配、缺一不可的黄金组合。

🔹 MCP:AI智能体的「通用USB-C接口」

MCP全称Model Context Protocol(模型上下文协议),是Anthropic推出的AI标准化外部连接协议,业内公认AI时代的通用USB-C接口

它的核心作用只有一个:统一AI模型和外部系统的通信标准

不管你要连接SQL Server、MySQL、本地文件、飞书企业应用、第三方业务API、运维服务器,不需要每对接一个工具就写一套定制胶水代码。

只要适配MCP标准,一次配置、处处调用,完美解决AI对接外部服务碎片化、兼容性差、维护麻烦的痛点。

简单总结MCP:只管“有没有能力”,不管“怎么用能力”

👉 相当于AI的手脚和感官,负责底层连接、工具注册、指令执行。

🔹 Skill:AI智能体的「标准化工作流剧本」

Skill是AI Agent的业务技能编排层,以标准化文档(SKILL.md)为载体,专门用来定义业务流程。

它不做任何底层连接、不写数据库连接字符串、不处理接口签名,只专注三件事:

  • 这个业务要做什么

  • 执行步骤先后顺序

  • 需要调用哪个MCP工具、传什么参数、拿到结果后怎么处理

简单总结Skill:只管“怎么干活”,不管“工具怎么连”

👉 相当于AI的工作手册和执行大脑,负责流程编排、逻辑调度、任务串联。

🔹 核心关系一句话讲清

MCP负责造枪(提供能力),Skill负责瞄准开枪(调度使用)。

没有MCP,Skill无工具可用;没有Skill,MCP有能力没人调度,没法落地复杂业务。

贰、 底层调用原理:Skill调用MCP核心全链路

Skill调用MCP不是复杂黑盒,整个链路只有4步,所有AI Agent框架、Claude Code、Claude Desktop全部通用。

✅ 第一步:配置MCP,注册外部工具能力

开发者提前在配置文件中,配置好各类外部服务的MCP服务信息(比如查询天气、文件读写权限、API对接参数)。

系统启动后,MCP服务自动初始化,把天气查询、文件读取等能力注册成可被AI调用的标准化工具,随时待命。

✅ 第二步:编写Skill,声明依赖MCP工具

创建业务Skill工作流,在Skill头部明确声明:当前这个业务流程,依赖哪个MCP服务、需要调用哪个工具函数

比如做天气查询的Skill,就必须声明依赖天气查询的MCP工具,不声明就无法关联调用。

✅ 第三步:Agent匹配Skill,解析MCP调用指令

用户下发业务指令后,AI Agent自动匹配对应的Skill工作流,逐行读取Skill中的执行步骤,精准解析出:

  • 要调用哪个MCP服务

  • 执行哪个具体工具方法

  • 需要传递哪些业务参数

✅ 第四步:MCP执行操作,结果回传给Skill闭环

Agent通过MCP客户端发送标准化调用请求,MCP服务执行数据库查询、文件操作等任务,执行完成后把结果原路返回。

Skill接收返回数据,继续执行后续业务逻辑,整理结果输出给用户,全链路闭环、全程无需人工干预

叁、 极简实操落地:Skill调用查询天气 MCP 示范

1、准备MCP

以Spring Boot工程为例进行说明,工程目录如下

pom.xml

Spring AI MCP 服务端核心依赖spring-ai-starter-mcp-server-webflux,让 Spring Boot 项目变成 MCP 服务端,自动注册工具、自动处理 AI 调用请求。

<?xml version="1.0" encoding="UTF-8"?>
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.2</version>
<relativePath/><!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>mcp-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mcp-server</name>
<description>demo</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
<version>1.0.1</version>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>default-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</execution>
<execution>
<id>default-testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

</project>

application.yaml

spring:
application:
name:mcp-server
ai:
mcp:
server:
name:mcp-serverMCP服务名称(AI看到的名字)
version:1.0.0# 版本
type:sync# 同步调用(最常用)

WeatherService.java

MCP 工具实现。

核心注解说明

  • @Tool标记方法 = MCP 工具AI 能看到工具名、描述、参数
  • @ToolParam告诉 AI:参数含义、是否必填
  • ToolContext可选,AI 对话上下文(如用户 ID、对话 ID 等)
package com.example.demo.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.model.ToolContext;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;

import java.util.Map;

@Slf4j
@Service
publicclassWeatherService{

privatefinal RestClient restClient;

publicWeatherService(){
this.restClient = RestClient.create();
    }

@Tool(description = "可以获取到某个城市的天气信息")
public Map<String, String> getTemperature(@ToolParam(required = true, description = "入参城市,请传入城市拼音") String city,
                                              ToolContext toolContext) 
{
        System.out.println("获取到了城市信息:" + city);
return Map.of("datas", city + "的天气为大雪,温度为零下5度到零下10度");
    }
}

McpServerConfig

自动扫描类中所有@Tool方法,注册成 MCP 可用工具,Claude 等 AI 客户端可以自动发现并调用。

package com.example.demo.config;

import com.example.demo.service.WeatherService;
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
publicclassMcpServerConfig{

@Bean
public ToolCallbackProvider weatherTools(WeatherService weatherService){
return MethodToolCallbackProvider.builder()
                .toolObjects(weatherService)
                .build();
    }

}

2、MCP核心配置(.mcp.json)

在工程根目录下创建.mcp.json文件,并配置MCP服务

{
"mcpServers": {
"filesystem": {
"type""stdio",
"command""npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"C:/Users/XXX/Documents",
"C:/Users/XXX/Desktop"
      ],
"env": {}
    },
"my-mcp-server": {
"type""sse",
"url""http://IP:端口/sse"
    }
  }
}

3、Skill核心编写规则(关键)

Skill无需复杂代码,核心就两点:头部声明依赖MCP,步骤内写调用参数

Skill头部必须绑定MCP服务名,执行步骤中标准化调用天气查询能力。

---
name: weather
description: 当用户询问天气时,要求用户输入城市,查询城市天气后,返回给用户
dependencies:
  - mcp: my-mcp-server  # 依赖 MCP 工具名
tools:
  - name: getTemperature
    mcp: my-mcp-server  # 绑定到 MCP 服务
    function: getTemperature  # MCP 工具方法
---


# 步骤

1. 
用户询问天气时,要求用户输入城市名
2. 调用`getTemperature`查询天气信息
3. 查询后的信息不要进行任何加工,直接返回给用户

4、生效关键动作

配置修改完成后,必须彻底退出Claude Code所有进程,重新启动生效,只关窗口不重启,配置永远不生效,必然报错无可用MCP工具。

肆、 高频报错速解:没有可用的数据库MCP工具

开发中最常见报错:当前环境中没有可用的数据库 MCP 工具来查询

不是代码问题,全是配置和操作问题,按以下顺序排查秒修复:

  1. 配置文件路径错误:必须写入官方指定Claude配置目录,不要新建、不要放错文件夹

  2. 未彻底重启客户端:必须退出托盘进程,仅关闭窗口配置不加载

  3. Skill未声明MCP依赖:Skill头部没绑定 MCP服务,Agent识别不到可用工具