
API 設計原理:從理論到實踐
項目的目錄結構如下:
.
├── 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
項目根目錄下的?code?
文件夾即是項目代碼的目錄,部署時只有這個文件夾里的內容會部署到函數計算 FC 上。打開?src/index.ts?
文件,可以看到 CLI 已經幫你寫好了一個簡單的、可直接進行部署的Hello World MCP Server:
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
// Create a new server instance every time a new connection is made to ensure concurrency
const createServer = () => {
// Create server instance
const server = new McpServer({
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!',
}]
}
},
);
return server;
}
// Create a new server instance
const server = createServer();
// Create a new stdio transport instance
const transport = new StdioServerTransport();
// Start the server
server.connect(transport).then(() => {
console.log("Server started");
}).catch((err) => {
console.error("Error starting server:", err);
});
這個 Server 包含一個名字為 hello_world
的工具,它只會返回一個字符串 'hello world!'
,且不需要任何輸入參數。你可以參考當前代碼的實現自行修改工具,且 CLI 已經幫你配置好了 package.json
,你可以按照你開發任意 Node.js
項目的方式來開發這個 Server。
完成 Server 的開發后,你可以通過 Serverless Devs CLI 工具一鍵將你的 MCP Server 部署到Function AI。Serverless Devs 是通過 s.yaml
部署代碼的,其需要包含所有部署需要的信息,包括實例規格、代碼目錄、觸發器配置等等,而 CLI 已經幫你寫好了,因此你不需要在意這些。
在部署之前,還需要對代碼進行打包。在這里我們使用 webpack
進行打包,配置已經幫你寫好了,因此你只需在 code
目錄下執行以下指令:
注意:需要本地 node 版本為 20 或以上。
npm install # 如果你之前沒有執行
npm run build
若?code?
目錄下出現了?dist?
文件夾并包含以下文件,則說明構建成功:
此時,你已經準備好將這個 Server 部署到Function AI了!回到項目根目錄,執行以下指令:
s deploy -y
若看到以下信息,則說明部署成功。部署成功后,Serverless Devs 會打印部署成功的函數的配置信息:
? [nodejs-stdio-hello-world] completed (37.35s)
?? Result for [deploy] of [start-mcp-server-nodejs]
====================
serviceName: xxxxx
......配置信息
其中,projectName 和 serviceName 是部署好的項目和服務的名稱,你可以登錄阿里云Function AI控制臺[3]查看。你還可以在配置信息中找到 internetUrl 字段,這個就是你的 MCP Server 的 URL,可以用于測試和集成到你自己的系統。
你可以本地啟動一個官方 inspector[4]測試部署好的 MCP,只需執行:
npx @modelcontextprotocol/inspector node build/index.js
或者,你也可以啟動一個我們基于官方項目修改的,內置好了 LLM 的 inspector:
npx @serverless-devs/inspector node build/index.js
Transport Type?
選擇?SSE
,復制之前部署獲取到的?internetUrl?,在尾部添加?/sse
,然后粘貼到?URL?
輸入框。點擊?Connect
,再切到?Tools
,點擊?List Tools
,即可看到部署好的 Server 的工具信息,并能進行調試。
若你使用的是我們的包含大模型的 inspector,還可以切到 LLM
,選擇大模型,填入你的 API Key,測試大模型使用你的工具的效果:
需要先點擊 List Tools,否則大模型無法使用工具
所有部署到函數計算 FC 的 MCP Server 都遵循 SSE 協議。對于已經支持 SSE 的官方 Client (例如Cursor),接入配置如下:
{
"mcpServers": {
"server-name": {
"url": "<部署好的internetUrl>/sse",
"env": { // 如果有的話
"key": "value"
}
}
}
}
對于暫未支持 SSE 的 Client,可以參考一些開源社區代理解決方案,例如:
對于非官方的 Client,接入 MCP Server 需要使用官方的提供的 sdk 進行連接。具體開發方式可參考官方文檔[7]。一個示例 Node Client 如下:
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
const client = new Client({
name: "example-client",
version: "1.0.0"
}, {
capabilities: {}
});
const transport = new SSEClientTransport(
new URL("<部署好的internetUrl>/sse")
);
await client.connect(transport);
如果你需要一個遠端的 Client,你也可以在函數計算 FC 應用中心部署 inspector 到函數計算。你可以通過這個鏈接[8]一鍵部署。部署完成后,點擊訪問域名即可進入 inspector 界面。
至此,你已經成功初始化,開發并部署了一個屬于你自己的 SSE MCP Server!除了文章中示范的基于 Node 的 MCP Server Hello World 項目,Serverless Devs 還提供了基于 Python,Java 的 Hello World 項目,以及大量可以一鍵部署的開源 Server,包括高德地圖、百度地圖、Github 等等,詳情可以查看這個代碼倉庫[9]。
文章轉載自:從零開始開發 MCP Server