🍹
Insight Daily
🪺
Aitrainee | 公众号:AI进修生
Hi,这里是Aitra inee,欢迎阅 读本期新文章。
你可能听说过 MCP 服务器,甚至看过相关配置实践。
但今天,我们将更进一步:构建你自己的 MCP 服务器。
这不仅仅是一个教程。
我们将深入 MCP 服务器的核心概念。
并展示如何利用 AI,轻松生成它。
无需编写大量代码,只需提供关键上下文。
我们会先构建一个最简单的mcp。
但,MCP 服务器不仅可以用于本地工具,还可以与 API 交互。
换句话说,MCP 服务器可以控制任何有 API 的平台。
所以我们会到构建一个基于Firecrawl的AI搜索和AI爬虫的、初具使用价值的MCP。
你可以用这个方法,为几乎任何工具构建 MCP 服务器,无论是本地运行的程序,还是远程 API,都可以通过 MCP 服务器进行控制。
准备好了吗?
MCP 文档支持多种 SDK,包括 Python、TypeScript、Java 和 Kotlin。
https://modelcontextprotocol.io/introduction
选择你最擅长的。
我将使用 TypeScript SDK,你可以在 GitHub 上找到。
https://github.com/modelcontextprotocol/typescript-sdk/blob/main/README.md
这个文档,除了安装指南,还有一个快速构建MCP入门指南。
掌握这些基础,你将能够构建任何你想要的功能。
什么是 MCP?
MCP,全称模型上下文协议,是一种协议,旨在以安全、标准化的方式连接大型语言模型(LLMs)与外部数据源和工具。它被比作AI应用程序的USB-C端口,简化了AI模型与数据和服务的交互。
- 通过
资源(Resources)
暴露数据(类似于 GET 端点;用于将信息加载到 LLM 的上下文中)。
- 通过
工具(Tools)
提供功能(类似于 POST 端点;用于执行代码或产生副作用)。
- 通过
提示(Prompts)
定义交互模式(可复用的 LLM 交互模板)。
- 以及更多功能!
更多的详情,你可以在我这个做实验的网站中找到:
构建一个最简单的加法计数MCP
每当我们构建一些新的东西的时候,通常需要做一些开发环境。MCP也不例外。
所以首先,我们需要安装MCP第三方包。
- 全局安装MCP SDK包
- 创建一个简单的MCP 服务器(如图片所示的示例代码)
创建一个目录。
创建一个index文件
index文件里面的代码详细是这样:
先来搭个 MCP 服务器的架子:
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
这几行,把需要的工具先准备好。
McpServer
用来建服务器,
ResourceTemplate
用来做资源模板,
StdioServerTransport
负责通信,
zod
用来校验数据格式。
建个服务器:
const server = new McpServer({
name: "Demo",
version: "1.0.0"
});
给服务器起个名(Demo),写上版本号(1.0.0)。
加个加法工具:
server.tool("add",
{ a: z.number(), b: z.number() },
async ({ a, b }) => ({
content: [{ type: "text", text: String(a + b) }]
})
);
server.tool
就是添加工具。
"add"
是工具名,后面跟着输入参数(
a
和
b
,都是数字),最后是具体干啥:把
a
和
b
加起来。
再加个打招呼的资源:
server.resource(
"greeting",
new ResourceTemplate("greeting://{name}", { list: undefined }),
async (uri, { name }) => ({
contents: [{
uri: uri.href,
text: `Hello, ${name}!`
}]
})
);
server.resource
就是添加资源。
"greeting"
是资源名,
greeting://{name}
是资源模板,
{name}
是个变量。后面跟着具体干啥:根据
name
变量,生成一句 “Hello, xxx!”。
最后,让服务器跑起来:
const transport = new StdioServerTransport();
await server.connect(transport);
StdioServerTransport
负责用标准输入输出(stdin/stdout)来通信。
server.connect
就把服务器和通信方式连起来了。
完整如下:
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
// Create an MCP server
const server = new McpServer({
name: "Demo",
version: "1.0.0"
});
// Add an addition tool
server.tool("add",
{ a: z.number(), b: z.number() },
async ({ a, b }) => ({
content: [{ type: "text", text: String(a + b) }]
})
);
// Add a dynamic greeting resource
server.resource(
"greeting",
new ResourceTemplate("greeting://{name}", { list: undefined }),
async (uri, { name }) => ({
contents: [{
uri: uri.href,
text: `Hello, ${name}!`
}]
})
);
// Start receiving messages on stdin and sending messages on stdout
const transport = new StdioServerTransport();
await server.connect(transport);