链载Ai

标题: 从零开始开发 MCP Server [打印本页]

作者: 链载Ai    时间: 昨天 18:01
标题: 从零开始开发 MCP Server


在大型语言模型(LLM)生态快速演进的今天,Model Context Protocol(MCP)作为连接 AI 能力与真实世界的标准化协议,正逐步成为智能体开发的事实标准。该协议通过定义 Resources(静态资源)、Prompts(提示词模板)和 Tools(可执行工具)三大核心能力,让开发者能够以模块化方式为 LLM 扩展文件系统访问、API 集成甚至物联网控制等交互能力。


然而当前 MCP Server 的开发部署仍存在显著痛点:开发者需要手动配置 Python/TypeScript SDK、处理依赖冲突,最终还需自行解决云端的 IaC 部署难题。这种碎片化体验使得从零构建 MCP Server 的成本过高。而通过 Serverless Devs CLI 工具,开发者能够一键拉起 MCP Server 项目,并在开发完成后一键部署到云端,显著缩短开发链路,提升 MCP Server 的开发效率。


本文将带你通过 Serverless Devs CLI 工具,开发并一键部署一个原生 SSE 的示例 MCP Server 到阿里云函数计算(FC),提供自带 LLM 的 Client ,可对部署好的 MCP Server 进行测试。


什么是 Serverless Devs?

Cloud Native


Serverless Devs【1】是一个开源开放的 Serverless 开发者平台,致力于为开发者提供强大的工具链体系。通过该平台,开发者可以一键体验多云 Serverless 产品,极速部署 Serverless 项目。Serverless Devs 于 2020 年 10 月 23 日正式开源,并于 2022年 进入 CNCF 沙箱,成为首个入选的 Serverless 工具项目,目前项目已经服务于成千上万的开发者和企业用户。


Serverless Devs 包含 CLI 工具,Registry 各类热门 AI 应用模版、实用 AI 工具以及 AI 工作流),CICD 工具,并与函数计算 FC、FunctionAI 开发平台密切合作,为开发者提供更加便利的 Serverless+AI 服务。


从零开发 MCP Server

Cloud Native


本地初始化 MCP Server


初始化 MCP Server 项目到本地需要借助 Serverless Devs 工具。可依照此文档【2】进行安装。安装并配置完成后,通过以下指令初始化一个 Hello World MCP Server 项目:


sinitstart-mcp-nodejs-hello-world


按照提示填入地域,函数名和配置好的 access,即可完成项目的初始化:



项目的目录结构如下:


.├──build.yaml#构建配置├──code#项目代码目录│├──check_node_version.mjs#部署前检查脚本│├──package-lock.json│├──package.json│├──src││└──index.ts#项目源码│├──tsconfig.json│└──webpack.config.js├──readme.md└──s.yaml#部署YAML

开发 MCP Server


项目根目录下的code文件夹即是项目代码的目录,部署时只有这个文件夹里的内容会部署到函数计算 FC 上。打开src/index.ts文件,可以看到 CLI 已经帮你写好了一个简单的、可直接进行部署的Hello World MCP Server:


import{McpServer}from"@modelcontextprotocol/sdk/server/mcp.js";import{ z }from"zod";importexpressfrom"express";import{SSEServerTransport}from"@modelcontextprotocol/sdk/server/sse.js";
// Create a map to store the transport for each sessionconstsessionTransport:Map<string,SSEServerTransport> =newMap();
// Create a new server instance every time a new connection is made to ensure concurrencyconstcreateServer= () => {// Create server instanceconstserver =newMcpServer({ name:"my-mcp-server", version:"1.0.0", });
// Implement your tools here server.tool( "hello_world", "Return string 'hello world!'", { // Define input parameters using zod. example: // prefix: z.string().describe('prefix').optional(), }, async() => { console.log("Hello World tool called"); return{ content: [{ type:"text", text:'hello world!', }] } }, );returnserver;}
constapp =express();
app.get("/sse",async(req, res) => {console.log("SSE connection opened");console.log("Request Headers:", req?.headers);// 按需输出特定属性console.log("Request Query:", req?.query);constserver =createServer(); server.server.onclose=async() => { awaitserver.close(); sessionTransport.delete(transport.sessionId); };consttransport =newSSEServerTransport("/messages", res); sessionTransport.set(transport.sessionId, transport);awaitserver.server.connect(transport);return;});
app.post("/messages",async(req, res) => {constsessionId = req.query.sessionIdasstring;if(!sessionId) { thrownewError("sessionId query parameter is required"); }consttransport = sessionTransport.get(sessionId);if(transport) { console.log("SSE message received"); console.log("Request Headers:", req?.headers);// 按需输出特定属性 console.log("Request Query:", req?.query); console.log("Request Body:", req?.body); awaittransport.handlePostMessage(req, res); }return;});
app.listen(8080,() =>{console.log('MCP Server running on port 8080');});


这个 Server 包含一个名字为hello_world的工具,它只会返回一个字符串'hello world!',且不需要任何输入参数。你可以参考当前代码的实现自行修改工具,且 CLI 已经帮你配置好了package.json,你可以按照你开发任意Node.js项目的方式来开发这个 Server。


部署 MCP Server 到函数计算 FC

Cloud Native


完成 Server 的开发后,你可以通过 Serverless Devs CLI 工具一键将你的 MCP Server 部署到函数计算。Serverless Devs 是通过s.yaml部署代码的,其需要包含所有部署需要的信息,包括实例规格、代码目录、触发器配置等等,而 CLI 已经帮你写好了,因此你不需要在意这些。


在部署之前,还需要对代码进行打包。在这里我们使用webpack进行打包,配置已经帮你写好了,因此你只需在code目录下执行以下指令:


注意:需要本地 node 版本为 20 或以上。


npminstall#如果你之前没有执行npmrunbuild


code目录下出现了dist文件夹并包含以下文件,则说明构建成功:



此时,你已经准备好将这个 Server 部署到函数计算了!回到项目根目录,执行以下指令:


sdeploy-y


若看到以下信息,则说明部署成功。部署成功后,Serverless Devs 会打印部署成功的函数的配置信息:


✔ [start-mcp-nodejs-hello-world] completed (5.9s)
? Result for [deploy] of [start-mcp-server-nodejs]====================region: xxxxx......配置信息


其中,functionName就是部署好的函数的名称,你可以登录阿里云函数计算控制台【3】查看。你还可以在配置信息中找到system_url字段,这个就是你的 MCP Server 的 URL,可以用于测试和集成到你自己的系统。


测试 MCP Server

Cloud Native


你可以本地启动一个官方 inspector【4】测试部署好的 MCP,只需执行:


npx@modelcontextprotocol/inspectornodebuild/index.js


或者,你也可以启动一个我们基于官方项目修改的,内置好了 LLM 的 inspector:


npx@serverless-devs/inspectornodebuild/index.js


Transport Type选择SSE,复制之前部署获取到的system_url,在尾部添加/sse,然后粘贴到URL输入框。点击Connect,再切到Tools,点击List Tools,即可看到部署好的 Server 的工具信息,并能进行调试。



若你使用的是我们的包含大模型的 inspector,还可以切到LLM,选择大模型,填入你的 API Key,测试大模型使用你的工具的效果:


需要先点击 List Tools,否则大模型无法使用工具



三种方式接入客户端

Cloud Native


方式一:官方 Client


所有部署到函数计算 FC 的 MCP Server 都遵循 SSE 协议。对于已经支持 SSE 的官方 Client (例如Cursor),接入配置如下:


{"mcpServers":{"server-name":{"url":"<部署好的system_url>/sse","env":{//如果有的话"key":"value"}}}}


对于暂未支持 SSE 的 Client,可以参考一些开源社区代理解决方案,例如:



方式二:其他本地 Client


对于非官方的 Client,接入 MCP Server 需要使用官方的提供的 sdk 进行连接。具体开发方式可参考官方文档【7】。一个示例 Node Client 如下:


import{Client}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport}from"@modelcontextprotocol/sdk/client/sse.js";
constclient =newClient({name:"example-client",version:"1.0.0"}, {capabilities: {}});
consttransport =newSSEClientTransport(newURL("<部署好的system_url>/sse"));awaitclient.connect(transport);

方式三:在 FC 部署一个 Client


如果你需要一个远端的 Client,你也可以在函数计算 FC 应用中心部署 inspector 到函数计算。你可以通过这个链接【8】一键部署。部署完成后,点击访问域名即可进入 inspector 界面。




结语




Cloud Native


至此,你已经成功初始化,开发并部署了一个属于你自己的 SSE MCP Server!除了文章中示范的基于 Node 的 MCP Server Hello World 项目,Serverless Devs 还提供了基于 Python,Java 的 Hello World 项目,以及大量可以一键部署的开源 Server,包括高德地图、百度地图、Github 等等,详情可以查看这个代码仓库【9】






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5