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 Server npx @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 🚀
日志示例:
console.error("这是一行需要记录的日志")
集成测试
- 工具测试需关注返回结构的语义正确性,而非仅仅是数据结构本身。
- 工具名称、Schema 描述等会直接影响业务效果。
- 工具与提示词需同步维护,确保整体体验一致。
集成到 Cursor IDE
配置示例:
{ "mcpServers": { "alibabacloud-fc-mcp-server": { "command": "node", "args": ["${absolute-path-to-your-project}/build/index.js"], "env": { "ALIBABA_CLOUD_ACCESS_KEY_ID": "${your-access-key-id}", "ALIBABA_CLOUD_ACCESS_KEY_SECRET": "${your-access-key-secret}" } } } }
配置方式如下所示:
完成配置后,检查工具列表是否符合预期。
使用提示词,测试代码生成、构建并部署的能力
在 Cursor IDE 新建空项目,打开Agent 模式。输入下方 Prompts
,然后要求智能IDE生成一个网页小游戏2048,并部署到函数计算。
# 角色 你是一位专业的阿里云函数计算(FC) Copilot,专注于为客户提供关于构建、部署代码到函数计算的建议。 ## 函数计算构建约束 - 工程必须构建以后,才能部署在函数计算。对于Python等语言,需要将依赖安装到代码工程根路径下的./python中;Node等语言,需要将依赖安装到相对根路径下的./node_modules中,Java等语言,需要使用maven或gradle等工具,将工程打包为带有依赖的Jar。这样运行时依赖才能被读取到。 - 工程构建必须满足函数计算运行时约束。 - 不需要将工程打包,构建完成后可以直接调用MCP Server的工具进行部署。 ## 函数计算运行时约束 - 用户必须在运行时暴露一个端口提供http服务。 - 运行环境是debian10,并预先安装了Python3.10版本、Node20版本、OpenJDK JRE21版本。 - 函数计算运行时中,提供了Python、Node、Java、Golang四种语言的某个具体版本的运行环境。 Python3.10的安装路径是/opt/python3.10,已默认将/opt/python3.10/bin以及代码包中的/code/python添加到PATH环境变量中。Node20的安装路径是/opt/nodejs20,已默认将/opt/nodejs20/bin以及代码包中的/code/node_modules添加到PATH环境变量中。OpenJDK21的安装路径是/opt/java21,已默认/opt/java21/bin添加到PATH环境变量中,且已经添加环境变量JAVA_HOME=/opt/java21。如果要修改环境变量中的PATH,应该将上述的PATH内容包含。Golang语言不需要运行环境支持。 ## 技能 ### 技能一:问题拆解与分析 - 能够对用户提出的问题进行深入拆解,明确问题的核心需求及可能涉及的步骤或指令。 - 提供清晰的任务分解步骤,确保每一步都能指向最终解决方案。 - 回答结果中尽量以表格的形式进行整理。 ### 技能二:alibabacloud-fc-mcp-server MCP工具调用 - 熟练调用alibabacloud-fc-mcp-server MCP工具获取函数相关信息或执行相关操作。 - 工具调用前必须先完成任务拆解,并确保调用逻辑清晰且符合客户需求。 - 根据用户的具体问题,选择合适的MCP功能模块进行操作,如创建自定义运行时函数、更新自定义运行时函数等。 ## 限制条件 - **任务拆解优先**:必须先给出详细的任务拆解步骤。 - **工具依赖明确**:所有需要调用MCP工具的操作,都应基于清晰的任务需求和逻辑推理。 - **代码生成与构建**:代码必须在本地完成构建,然后部署运行在函数计算上。代码的生成与构建必须满足函数计算构建与运行时约束。
等待 agent 生成项目并部署到阿里云函数计算。
访问测试地址,获取2048小游戏页面,确认符合预期。
FC MCP Server的云上部署改造
云上部署 MCP Server 时需注意:
- 协议适配:云端无法通过
stdio
协议通信,需切换为sse
协议。 - 代码包传递:云端无法直接访问本地路径。代码包需要通过其他方式传递给FC MCP Server。
如下图所示:
对于第一个问题,参考前文,Function AI通过MCP Proxy组件,已经解决了协议转换的问题。推荐通过 Function AI 的 MCP部署,实现协议转换,无需手动适配。
对于第二个问题,我们可以考虑如下方案。将代码工程构建后,通过OSS MCP Server(待开发)上传到云端,获取下载地址codeuri
,然后将codeuri
作为工具调用参数传递至FC MCP Server。FC MCP Server可以通过OSS的OpenAPI,将代码包下载到本地后,完成后续的部署操作。
对应的改造代码如下所示:
// 通过环境变量,区分本地模式与远程模式 const remoteMode = process.env.REMOTE_MODE === 'true'; //...省略其他代码 if (remoteMode) { server.tool( "put-custom-runtime-function", "提供构建完成的匹配阿里云自定义运行时的zip格式的代码包的可下载链接以及其他函数部署配置,创建函数并部署代码到该函数。如果函数已存在,则尝试覆盖并更新目标函数。建议使用该方法前先确认函数是否存在,如果存在需要确认更新目标函数", { codeUri: codeUriSchema, functionName: functionNameSchema, region: regionSchema, //...省略其他代码 }, async (args) => { // 添加适配代码,将codeuri下载到本地location const { codeUri } = args; if (!codeUri) { return { isError: true, content: [{ type: "text", text: `执行失败,需要指定codeUri参数` }] }; } const location = path.join(os.tmpdir(), `code-${Date.now()}.zip`); // 下载代码到本地location位置 await downloadFile(codeUri, location); if (!fs.existsSync(location)) { return { isError: true, content: [{ type: "text", text: `执行失败,需要指定本地代码工程根路径` }] }; } const nextArgs = { ...args, location, } return await createCustomRuntimeFunction(nextArgs); } ); } else { server.tool( "put-custom-runtime-function", "将构建完成的匹配阿里云自定义运行时的工程,部署到函数计算。代码工程不需要手动打包,会自动处理。如果函数已存在,则尝试覆盖并更新目标函数。建议使用该方法前先确认函数是否存在", { location: locationSchema, functionName: functionNameSchema, region: regionSchema, //...省略其他代码 }, async (args) => { const { location } = args; if (!fs.existsSync(location)) { return { isError: true, content: [{ type: "text", text: `执行失败,需要指定本地代码工程根路径` }] }; } return await createCustomRuntimeFunction(args); } ); }
完整的改造代码可以参考这里。改造完毕后的FC MCP Server可以通过Function AI一键部署到函数计算上。
部署到函数计算后,可以通过如下配置集成,有效解决配置需要AK/SK带来的安全风险:
{ "mcpServers": { "aliyun-fc-mcp-server": { "url": "https://xxx.cn-hangzhou.fcapp.run/sse", "headers": { "Authorization": "Bearer Token" } } } }
总结
本文通过演示FC MCP Server的设计、研发、测试、上云的实战过程,为MCP Server应用开发者展示了研发MCP Server,并部署到函数计算的便捷性。
将MCP Server部署到函数计算,可以有效解决本地部署MCP Server带来的安全问题,避免敏感信息(例如AK/SK)的外泄,此外还能充分利用函数计算的弹性和按需计费优势,极大降低运维和部署成本。
更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
图挖掘在反作弊场景的应用
本文全面探讨了营销活动反作弊与电商反作弊的图算法应用。首先介绍了黑产薅取活动奖励、刷单等作弊行为的背景,随后深入讲解了同人挖掘技术,包括同人建模、挖掘步骤及稳定性处理。接着,依次介绍了标签传播算法、Fraudar算法、GCN网络的原理、优缺点及应用。最后,文章展望了未来图算法在风控反作弊应用的发展方向,如多模态数据融合与动态图实时计算,旨在应对黑产的快速演化,确保营销活动的公平性与数据真实性。 01 业务背景 在营销活动场景中,黑产团伙通过自动化手段大规模获取活动奖励,挤占真实用户权益造成营销资金浪费,并污染数据指标导致活动效果失真,从而影响运营决策准确性。 以当前主流作弊模式为例,黑产实施路径如下: 1. 资源准备阶段:通过虚拟机登录批量购买的百度账号。 2. 任务执行阶段:部署自动化脚本模拟用户行为,如视频播放、广告点击等。 3. 资金变现阶段:使用分散的真实微信账号进行提现操作。 在与反作弊的对抗中,黑产工具持续升级(如改机工具、IP池轮换等),传统特征采集数据趋于分散。我们的反作弊体系从两个方向不断提升防御能力: 1. 多维特征挖掘,包括设备指纹、行为特征以及环境特征。 2. ...
- 下一篇
技术科普|首个 GraphRAG-Bench 如何评估九大 GraphRAG 性能?
导读:传统 RAG 遇瓶颈,复杂推理怎么办? GraphRAG 正成为知识管理新利器。 但关键问题来了:GraphRAG 真的超越了 RAG 吗?GraphRAG 哪家强?GraphRAG 性能评估标准有哪些?面针对不同场景需求如何选择?香港理工大学等学者在 6 月 3 日发表论文,重磅推出首个大规模、领域特定基准 GraphRAG-Bench,为技术选型提供硬核依据。 🔍本文翻译略有删减,论文原文如下 https://arxiv.org/pdf/2506.02404 本文首发于「NebulaGraph 技术社区」,更多产品资讯请访问「NebulaGraph 官网」 一、摘要 图检索增强生成(Graph Retrieval-Augmented Generation, GraphRAG)因其在结构化组织领域特定语料库并提升复杂推理能力的潜力,正日益受到认可。然而,当前 GraphRAG 模型的评估主要依赖传统的问答数据集。这些数据集在问题广度和评估指标上存在局限性,无法全面衡量 GraphRAG 模型所带来的推理能力提升。 为弥补这一不足,我们提出了 GraphRAG-Bench,这是...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS关闭SELinux安全模块
- CentOS8安装Docker,最新的服务器搭配容器使用
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池