MCP Server 之旅第 6 站:FC MCP Server研发实战
系列文章已详细介绍了 MCP 协议的基本概念及其在函数计算(FC)托管 MCP Server 场景下的应用。相信读者已经对 MCP 协议的原理和应用场景有了初步了解。但对于 AI 应用开发者来说,如何开发一个高效的 MCP Server?有哪些最佳实践?本文将结合实际案例,深入剖析 FC MCP Server 的设计与实现。背景与设计目标
MCP(Model Context Protocol)协议为 AI 应用开发者提供了标准化的上下文交互能力。MCP Client 负责“思考”,而 MCP Server 则为其赋能“行动”——即操作外部系统,实现自动化的业务流程。
在实际应用中,MCP Server 通常与 MCP Client(如 Cursor IDE)配合,完成代码生成、构建、部署等一系列自动化操作。本文以“引导 MCP Client 生成网页应用代码工程,并自动构建、部署到函数计算”为例,详细剖析 FC MCP Server 的设计与实现。
subgraph "本地主机"
Host["装有MCP Client的主机\n(Claude, IDEs, Tools)"]
S1["MCP Server A"]
S2["FC MCP Server"]
Host <-->|"MCP Protocol"| S1
Host <-->|"MCP Protocol"| S2
S1 <--> |"文件系统API"| D1[("本地\n文件系统 A")]
S2 <--> |"文件系统API"| D1
end
subgraph "互联网"
subgraph "函数实例"
S3["MCP Server C"]
end
Host <-->|"MCP Protocal with Authentication"| S3
S2 <-->|"OpenAPI + Devs"| D2[("函数计算API服务 B")]
S3 <-->|"Web APIs"| D3[("远程\服务 C")]
end
MCP Server 的核心能力
MCP Server 主要提供三大核心能力:
[*]资源:以 URI 形式暴露给 MCP Client 文件或数据,支持资源读写和批量查找。资源是文本或二进制类型的数据,需要支持读写以及批量查找的方法。通过资源访问协议访问,并返回资源的类型以及内容。
[*]工具:封装对外部系统的操作,供 LLM 调用(需用户批准),返回操作结果。MCP Client通过工具调用协议访问,并返回调用的结果。
[*]提示词:面对不同的参数化的业务场景,引导MCP Client完成具体任务的提示词。通过提示词获取协议访问,并返回目标业务场景对应的提示词。
MCP Server 的“资源”和“提示词”能力目前并非所有 MCP Client 都支持,实际开发时应以“工具”为核心。
从MCP协议来看,工具侧设计需要如下能力:
[*]工具发现:提供tools/list方法,返回可用工具列表以及调用方式。
[*]工具调用:提供tools/call能力,返回工具执行的结果。
借助 MCP SDK,开发者只需关注工具参数设计和实现逻辑,协议适配由 SDK 自动完成。
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
const server = new McpServer({
name: "alibabacloud-fc-mcp-server",
version: "0.0.1",
});
// 此处添加工具实现
server.tool(
"toolName",
"toolDescription",
{
arg1:z.string().describe("参数说明,例如:这是一个参数")
},
async (args) => {
const { arg1 } = args;
return {
isError: false,
content: [
{
type: "text",
text: `成功,得到参数:${arg1}`
}
]
}
}
)
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch((error) => {
process.stderr.write(JSON.stringify(error));
process.exit(1);
});FC MCP Server工具的设计与最佳实践
参考官方文档,工具设计应遵循以下原则:
[*]名称与描述清晰:工具名称和描述应准确反映其功能和使用场景,便于 LLM 理解。
[*]参数定义规范:使用详细的 JSON Schema 定义参数,包括类型、描述、默认值、枚举等。
[*]包含使用示例:在描述中给出调用示例,帮助 LLM 正确使用工具。
[*]完善错误处理:实现合理的错误校验和提示,提升健壮性。
[*]操作专注原子:每个工具只做一件事,保持原子性,避免副作用。
为满足将MCP Client生成的网页类型代码工程部署到函数计算,我们至少需要设计一个工具,实现将代码工程以Custom Runtime的形式,部署到函数计算。
下面是工具的示例代码,完整的源代码可以参考这里。
server.tool(
// 提供与工具实际作用相符的名称与描述信息,说明工具的具体使用场景以及需要注意的事项,便于MCP Client理解
"put-custom-runtime-function",
"将构建完成的匹配阿里云自定义运行时的工程,部署到函数计算。代码工程不需要手动打包,会自动处理。如果函数已存在,则尝试覆盖并更新目标函数。",
{
// 提供完整的参数定义,包括参数的类型、描述、默认值、枚举值等,便于MCP Client理解
location: locationSchema,
functionName: functionNameSchema,
region: regionSchema,
// ...其他部署参数,根据实际需求添加
// TODO
},
async (args) => {
// args的数据结构与上述schema定义一致
const { location } = args;
if (!fs.existsSync(location)) {
return { isError: true, content: [{ type: "text", text: `执行失败,需要指定本地代码工程根路径` }] };
}
return await createCustomRuntimeFunction(args);
}
);
FC MCP Server 的测试最佳实践
开发测试
[*]使用 MCP Inspector 工具查看 MCP Server 的工具列表及调用方式,详见官方文档。
[*]推荐日志输出到文件或 stderr,便于问题定位和追踪。
# 对代码工程进行构建npm install && npm run build# 使用MCP Inspector工具,启动MCP Servernpx @modelcontextprotocol/inspector -e ALIBABA_CLOUD_ACCESS_KEY_ID=${ALIBABA_CLOUD_ACCESS_KEY_ID} -e ALIBABA_CLOUD_ACCESS_KEY_SECRET=${ALIBABA_CLOUD_ACCESS_KEY_SECRET} node build/index.js# 根据输出的地址,打开调试页面# MCP Inspector is up and running at http://127.0.0.1:6274
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]