返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

自主构建MCP,轻松实现云端部署!

[复制链接]
链载Ai 显示全部楼层 发表于 昨天 13:12 |阅读模式 打印 上一主题 下一主题

本文以阿里云百炼上的工作流为例,将其封装成MCP服务并部署到阿里云百炼,随后引入智能体中,从而可以在智能体内使用自定义的MCP服务。今天我们先介绍其中一种方式。

1. 编写代码封装MCP服务。

2. 将封装后的服务发布到npm官方平台。

3. 在阿里云百炼平台中创建自定义的MCP服务。

4. 在智能体中引用自定义的MCP服务。

一、搭建MCP服务

通过Nodejs+TypeScript实现

1、创建Nodejs项目

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;background-color: rgb(255, 255, 255);">

在创建Node.js项目之前,请确保你已安装Node.js,如果尚未安装,可以访问以下链接进行下载:https://nodejs.org

在电脑上创建一个文件夹,名称可自定义。例如,我将其命名为bailian-mcp-workflow-server。

你可以使用VSCode打开该文件夹,或者直接通过命令行进入此文件夹进行操作。

1.1、在命令行当中运行

初始化Nodejs项目
npminit-y

执行成功后自动创建package.json,修改package.json当中的内容:

package.json
{"name":"bailian-mcp-workflow-server","version":"0.0.1","description":"BailianMCPserver","license":"MIT","author":"Anthropic,PBC(https://anthropic.com)","homepage":"https://modelcontextprotocol.io","bugs":"https://github.com/modelcontextprotocol/servers/issues","type":"module","bin":{"mcp-server-brave-search":"dist/index.js"},"files":["dist"],"scripts":{"build":"tsc&&shxchmod+xdist/*.js","prepare":"npmrunbuild","watch":"tsc--watch"},"dependencies":{"@modelcontextprotocol/sdk":"1.0.1"},"devDependencies":{"@types/node":"^22","shx":"^0.3.4","typescript":"^5.6.2"}}

1.2、在package.json的同级下创建tsconfig.json

{"compilerOptions":{"target":"ES2022","module":"Node16","moduleResolution":"Node16","strict":true,"esModuleInterop":true,"skipLibCheck":true,"forceConsistentCasingInFileNames":true,"resolveJsonModule":true,"outDir":"./dist","rootDir":"."},"include":["./**/*.ts"],"exclude":["node_modules"]}

1.3、同级目录下创建index.ts,内容为空就行。

1.4、设置好上述内容之后我们安装一下对应的依赖。

npminstall

2、将百炼的智能体应用API封装为MCP

1.1、在官方文档中,查看应用调用的API

查看应用调用API参考文档:https://bailian.console.aliyun.com/?tab=api#/api/?type=app,官方API实现对百炼应用的调用如下:

curl-XPOSThttps://dashscope.aliyuncs.com/api/v1/apps/YOUR_APP_ID/completion\--header"Authorization:Bearer$DASHSCOPE_API_KEY"\--header'Content-Type:application/json'\--data'{"input":{"prompt":"你是谁?"},"parameters":{},"debug":{}}'

我们只需要将上述的API封装为MCP即可。

1.2、将应用的API封装为MCP应用,参考如下代码

在index.ts当中写入如下内容

#!/usr/bin/env node
import{Server}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema,ListToolsRequestSchema,}from"@modelcontextprotocol/sdk/types.js";constMARKET_RESEARCH_ASSISTANT= {name:"market_research_tool",description: "This is an intelligent market research report generation assistant, specifically designed to efficiently and professionally build research plans.",inputSchema: { type:"object", properties: { query: { type:"string", description:"Search query (max 400 chars, 50 words)" } }, required: ["query"], },};// Server implementationconstserver =newServer( { name:"bailian-mcp-workflow-server", version:"0.1.0", }, { capabilities: { tools: {}, }, });// Check for API keyconstDASHSCOPE_API_KEY= process.env.DASHSCOPE_API_KEY!;if(!DASHSCOPE_API_KEY) {console.error("Error: DASHSCOPE_API_KEY environment variable is required"); process.exit(1);}constAPP_ID= process.env.APP_ID!;if(!APP_ID) {console.error("Error: APP_ID environment variable is required"); process.exit(1);}asyncfunctionperformWebMarketResearch(query: any){consturl ='https://dashscope.aliyuncs.com/api/v1/apps/'+APP_ID+'/completion';// 构造请求体x`x`x`x`constrequestBody = { "input": { "prompt": query }, "parameters": {}, "debug": {} };constresponse =awaitfetch(url, { method:'OST',// 修改为 POST 请求 headers: { 'Content-Type':'application/json',// 指定请求体为 JSON 格式 'Authorization':"Bearer "+DASHSCOPE_API_KEY }, body:JSON.stringify(requestBody)// 将请求体序列化为 JSON 字符串 });
if(!response.ok) { thrownewError(`Bailian API error{response.status}${response.statusText}\n${awaitresponse.text()}`); }constdescriptionsData =awaitresponse.json();// 解析响应 JSON 数据conststrjson =JSON.stringify(descriptionsData)returnstrjson;}// Tool handlersserver.setRequestHandler(ListToolsRequestSchema,async() => ({tools: [MARKET_RESEARCH_ASSISTANT],}));server.setRequestHandler(CallToolRequestSchema,async(request) => {try{ const{ name,arguments: args } = request.params; if(!args) { thrownewError("No arguments provided"); } switch(name) { case"market_research_tool": { const{ query } = args; constresults =awaitperformWebMarketResearch(query); return{ content: [{type:"text",text: results }], isError:false, }; } default: return{ content: [{type:"text",text:`Unknown tool{name}`}], isError:true, }; } }catch(error) { return{ content: [ { type:"text", text:`Error{errorinstanceofError? error.message :String(error)}`, }, ], isError:true, }; }});asyncfunctionrunServer(){consttransport =newStdioServerTransport();awaitserver.connect(transport);console.error("Bailian Mcp Workflow Server running on stdio");}runServer().catch((error) =>{console.error("Fatal error running server:", error); process.exit(1);});

1.3、解释一下上述代码

核心功能

  • 提供一个名为market_research_tool的市场研究工具。

  • 支持通过 API 调用执行市场研究任务。

  • 基于用户输入的查询(Query),调用阿里云 DashScope API 获取市场研究结果。

  • 以 JSON 格式返回研究结果,便于后续处理。

初始化 Server

代码首先创建了一个Server实例,该实例基于@modelcontextprotocol/sdk/server模块。服务器的配置如下:

constserver=newServer({name:"bailian-mcp-workflow-server",version:"0.1.0",},{capabilities:{tools:{},},});
  • nameingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.034em;font-style: normal;font-weight: normal;">version定义了服务器的基本信息。

  • ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.034em;font-style: normal;font-weight: normal;">capabilities.tools表示服务器支持的工具集合(目前为空,后续会动态注册)。

环境变量检查

为了确保服务器能够正常运行,代码检查了两个关键环境变量:

  • DASHSCOPE_API_KEY: 用于调用阿里云 DashScope API 的密钥。

  • ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.034em;font-style: normal;font-weight: normal;">APP_ID: 用于标识具体的应用程序。

如果这些变量缺失,服务器将报错并退出。

constDASHSCOPE_API_KEY=process.env.DASHSCOPE_API_KEY!;if(!DASHSCOPE_API_KEY){console.error("ErrorASHSCOPE_API_KEYenvironmentvariableisrequired");process.exit(1);}constAPP_ID=process.env.APP_ID!;if(!APP_ID){console.error("Error:APP_IDenvironmentvariableisrequired");process.exit(1);}

定义市场研究工具

MARKET_RESEARCH_ASSISTANT是一个描述市场研究工具的对象,包含以下内容:

  • name: 工具名称,固定为market_research_tool

  • description: 工具的功能说明。

  • inputSchema: 输入参数的 JSON Schema,定义了用户需要提供的查询字段query,并限制其长度为最多 400 个字符或 50 个单词。

注册工具列表

通过

server.setRequestHandler(ListToolsRequestSchema, ...)方法,服务器向客户端提供支持的工具列表:

server.setRequestHandler(ListToolsRequestSchema,async()=>({tools:[MARKET_RESEARCH_ASSISTANT],}));

当客户端请求工具列表时,服务器会返回MARKET_RESEARCH_ASSISTANT的定义。

API封装为MCP服务

利用fetch发起POST请求,调用百炼API接口并获取相应返回数据。若想将其他API接口封装为MCP,可参考代码中的requestBody,于此设置自定义请求参数。获取到返回数据后,可进行处理,亦可直接返回,因为在百炼中会自动处理返回的JSON,将其转化为便于用户阅读的Markdown格式。

consturl='https://dashscope.aliyuncs.com/api/v1/apps/'+APP_ID+'/completion';//构造请求体x`x`x`x`constrequestBody={"input":{"prompt":query},"parameters":{},"debug":{}};constresponse=awaitfetch(url,{method:'OST',//修改为POST请求headers:{'Content-Type':'application/json',//指定请求体为JSON格式'Authorization':"Bearer"+DASHSCOPE_API_KEY},body:JSON.stringify(requestBody)//将请求体序列化为JSON字符串});

1.4、本机通过Cline联调测试

{"mcpServers":{"bailian-mcp-workflow-server":{"disabled":false,"timeout":300000,"command":"cmd","args":["/c","node","D:\\ProgramData\\bailian-mcp-workflow-server\\index.ts"],"env":{"DASHSCOPE_API_KEY":"sk-212aeb2121213232","APP_ID":"3621da212127b272343411337e7"},"transportType":"stdio"}}}

DASHSCOPE_API_KEY为百炼的API-KEY,去百炼官网上申请

APP_ID 百炼的工作流应用ID,具体工作流是做什么的您可以自定义。

配置好上述内容以后,再次测试提问。

二、将项目打包并发布到npm上


1、首先我们需要注册npm账号

https://www.npmjs.com

2、在本机的npm当中登录刚刚注册的账号

登录到 npm,在项目的终端当中运行以下命令登录到 npm

npmlogin

系统会提示你输入用户名、密码和邮箱地址。如果登录成功,你会看到类似以下的输出。

Loggedinas<your-username>onhttps://registry.npmjs.org/.

3、检查包名是否唯一

在发布之前,建议检查你选择的包名是否已经被占用。你可以访问 npmjs.com 并搜索你的包名,或者直接尝试发布。

如果包名已被占用,你需要更改 package.json 中的 name 字段为一个唯一的名称。

4、项目打包

在项目的终端当中运行以下命令打包:

npmrunbuild

如果一切正常,你会看到类似以下的输出

运行成功后,项目中会自动创建dist目录,这意味着打包成功

5、发布包

在项目根目录下运行以下命令发布包:

npmpublish

如果一切正常,你会看到类似以下的输出:

此时,你的包就已经成功发布到 npm 上了!

https://www.npmjs.com/package/bailian-mcp-workflow-server

6、通过发布的npm包在Cline当中引入测试

本机再次测试一下

Windows配置

{"mcpServers":{"bailian-mcp-workflow-server":{"disabled":false,"timeout":300000,"command":"cmd","args":["/c","npx","-y","bailian-mcp-workflow-server"],"env":{"DASHSCOPE_API_KEY":"sk-212aeb2121213232","APP_ID":"3621da212127b272343411337e7"},"transportType":"stdio"}}}

MacOS/Linux 配置

{"mcpServers":{"bailian-mcp-workflow-server":{"disabled":false,"timeout":300000,"command":"npx","args":["-y","bailian-mcp-workflow-server"],"env":{"DASHSCOPE_API_KEY":"sk-212aeb2121213232","APP_ID":"3621da212127b272343411337e7"},"transportType":"stdio"}}}

三、将刚发布的项目集成到阿里云百炼的自定义MCP中

1、创建自定义MCP

MCP服务配置

{"mcpServers":{"bailian-mcp-workflow-server":{"disabled":false,"timeout":300000,"command":"npx","args":["-y","bailian-mcp-workflow-server"],"env":{"DASHSCOPE_API_KEY":"sk-212aeb2121213232","APP_ID":"3621da212127b272343411337e7"},"transportType":"stdio"}}}

点击提交部署


2、部署成功以后我们找到对应的工具测试一下

选择【工具】进行测试,如下结果则表示测试成功

3、创建智能体,添加MCP服务

4、运行测试

百炼未来将集成工作流的MCP服务,用户只需在平台中进行简单配置,即可将工作流转化为MCP服务,并引入智能体。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ