如何使用MCP让AI自动调用全网工具(附创建MCP服务案例)
今天要给大伙介绍一个流行且实用的AI技术——MCP(Model Context Protocol),它能让AI像人使用工具一样,自动调用全网工具,帮咱们解决各种难题。
一、MCP到底是什么?
MCP是从热门的AI Agent领域衍生出来的,简单来说,它是function calling协议的升级版。要是从应用层去理解,它就是一种能让AI更好地使用工具的方法,就像是给AI准备了一个装满各种工具的“百宝箱”,还附带了详细的使用说明。
以前的Function Calling,开发者得手动把所有工具函数都注册好,这不仅麻烦,还容易导致请求冗余,而且扩展性也不好。正是因为这些问题,MCP协议才应运而生,它在一定程度上改变了AI和工具之间的交互方式。
有想深入了解MCP的朋友可以参考这篇文章:MCP Server 介绍及核心功能架构详解
二、Function Calling和MCP的差别
在理解MCP之前,咱们先对比下Function Calling和MCP增强的Agent。Function Calling就好比一个只会单一技能的学徒,手里只有一把“小锄头”,只能重复做同一件事;而MCP增强的Agent则像一位经验丰富的工匠,各种工具的使用方法都门儿清,还能根据不同的任务需求,灵活搭配工具,制定出最佳方案。
三、MCP是如何工作的?
当你向使用MCP的agent提出一个请求时,它会按照下面的步骤来处理:
- 仔细分析你的需求,搞清楚你到底想要它做什么。
- 打开自己的“工具箱”,看看里面都有哪些可用的工具。
- 根据需求挑选合适的工具,并按照正确的方式使用这些工具。
- 把各个工具的运行结果整合起来,最后给你一个完整的答案。
四、MCP的总体架构
MCP的核心采用客户端 – 服务器架构。在这个架构里,主机应用程序可以连接到多个服务器。简单来讲,你的电脑就像客户端,它通过MCP协议和不同的服务器进行通信。这些服务器有的可能是本地数据源,有的可能连接着网络API,通过这种方式,客户端就能获取到各种各样的数据和服务。
五、MCP协议的优势在哪?
从使用者的角度来看,MCP协议的优势非常明显,和Function Calling相比,主要体现在以下几个方面:
- 工具增减:Function Calling里工具是固定的,需要提前设定好,后续很难添加新工具;而MCP协议就方便多了,通过json配置就能轻松搞定工具的添加和删除。
- 任务执行方式:Function Calling只能按照固定的步骤执行任务,灵活性差;MCP协议下,agent会自动组合工具,根据任务需求完成工作。
- 开发难易度:Function Calling开发时需要重复编写大量模板代码,很繁琐;MCP协议只需要进行json配置就行,开发难度大大降低。
- 跨设备兼容:Function Calling在不同系统上使用时,往往需要针对系统进行调整;MCP协议则统一了配置,不用太操心不同系统的实现细节。
- 功能扩展能力:Function Calling添加新功能比较困难;MCP协议通过json配置,扩展功能轻松又便捷。
- 日常维护:Function Calling的日常维护很麻烦;MCP协议维护起来简单,修改json配置就可以了。
六、动手实践:制作MCP服务
从开发者的角度来看,下面以cursor和nodejs为例,给大家展示如何构建一个简单的MCP服务,帮助大家更好地理解。
(一)前期准备
在开始编写代码前,先进行一些基础的准备工作,在命令行中执行以下操作:
# 创建项目文件夹 mkdir see-girl-mcp-server cd see-girl-mcp-server # 初始化npm项目 npm init -y # 安装对应mcp依赖 npm i @modelcontextprotocol/sdk zod # 创建主文件 copy nul index.mjs
这些命令的作用是创建项目文件夹、初始化npm项目、安装所需的依赖包,最后创建一个主文件,为后续编写代码做好准备。
(二)编写核心代码
接下来,在index.mjs
文件中写入以下代码:
// 引入McpServer和StdioServerTransport,用于创建和连接MCP服务器 import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; // 引入exec函数,用于执行系统命令 import { exec } from 'child_process'; // 引入zod库,用于数据验证 import { z } from 'zod'; // 创建MCP服务器实例,指定名称和版本 const server = new McpServer({ name: "see-girl", version: "0.0.1" }); // 定义一个获取视频的函数,从指定接口获取视频链接 const url = "https://api.kuleu.com/api/MP4_xiaojiejie"; const getVideo = async () => { const response = await fetch(`${url}?type=json`); const data = await response.json(); return data.mp4_video; }; // 注册一个名为get-video的工具,用于获取视频 server.tool( "get-video", async () => { try { const video = await getVideo(); // 启动后直接浏览器启动 return { content: [{ type: 'text', text: video, }], isError: false, }; } catch (error) { console.warn(error); return { content: [{ type: 'text', text: error.message, }], isError: true, }; } } ); // 注册一个名为open-video的工具,用于打开视频链接 server.tool('open-video', { url: z.string().describe('妹子视频的url') }, async ({ url }) => { // 区分mac和windows系统,执行不同的打开命令 if (process.platform === 'darwin') { exec(`open ${url}`, { shell: true }); } else { exec(`start ${url}`, { shell: true }); } return { content: [{ type: 'text', text: 'ok', }], isError: false, } }) // 启动服务器的主函数 async function main() { try { // 输出服务器启动信息 console.log("启动MCP服务器..."); // 使用标准输入/输出作为传输方式 const transport = new StdioServerTransport(); await server.connect(transport); console.log("MCP服务器已启动并等待连接"); } catch (error) { console.error("启动服务器时出错:", error); process.exit(1); } } main();
这段代码创建了一个简单的MCP服务,包含两个工具:get-video
用于获取视频链接,open-video
用于打开视频链接。这样一个简单的 mcp 服务脚本就写好了,这里包含两个工具,我们可以运行看一下效果:
(三)配置并使用MCP服务
写好服务脚本后,我们要将其配置到cursor的agent中使用。打开cursor的设置,选择左边的mcp菜单,在右上角点击“add new mcp server”,把下面这段代码复制进去(注意args
里的路径要替换成你自己脚本的绝对路径):
{ "mcpServers": { "see-girl": { "name": "查询妹子视频服务", "key": "see-girl", "command": "node", "args": ["D:\code\nodeJS\weather-mcp-server\index.mjs"] } } }
粘贴完成后,服务会自动尝试启动。配置成功后,在cursor的对话框里输入类似“生成并打开妹子视频”的指令,agent就会自动调用我们之前编写的工具,先获取视频链接,再打开视频,最后在浏览器中预览视频。
需要注意的是,这里的脚本运行环境是nodejs,而不是浏览器。
七、总结
通过基于mcp协议包开发工具,和之前的Function Calling时代相比,开发量大幅减少。从上面的案例可以看出,MCP协议将AI的工具化能力提升到了一个新的高度。使用者不用再编写复杂的硬编码逻辑,通过声明式的工具注册,就能构建出智能化的AI服务生态。随着Claude、Cursor等平台对mcp的原生支持,这种“智能工具箱”模式正逐渐成为AI应用开发的新趋势。如果大家对MCP感兴趣,不妨自己动手试试啊!