【MCP】同时支持stdio,streamableHttpless和sse三种协议的MCP服务框架

京东云开发者
• 阅读 16

作者:蔡欣彤

项目说明

这是一个同时支持stdio,streamableHttpless和sse三种协议的MCP-Server的框架(ts语言)。

为什么我想做这个框架呢?因为随着AI发展,现在越来越多业务需要和AI相结合。而我在做AI应用中发现,MCP服务在AI方向的业务使用频率很高,但随着业务的加深,发现存在以下痛点:

1.针对不同业务,对于mcp-server需要的类型不同,有的就需要stdio,有的需要网络请求

2.不同平台对MCP服务协议要求不同,有支持streamableHttp,有仅支持sse的。

这两种情况,会出现相同功能重复开发,重复造轮子,浪费时间成本

  1. 此外,有些研发人员目前并不了解MCP,在业务开发时候需要现学

而这会让研发周期加长,时间成本耗费过多

所以为了解决以上痛点,我从0-1搭建了这个框架。这个框架特点

1.同时支持stdio,streamableHttpless和sse三种模式,实现一次开发支持三种模式

2.所有功能都拆分为独立模块。这样即使不懂的人,只要在指定的文件里面编写业务逻辑,就可以创造自己的mcp服务

3.支持环境变量,可通过环境变量配置域名,服务地址,端口和host,真正适用于生产使用

4.切换模式也很简单,只要在启动脚本根据需要,切换启动命令即可,改动成本近乎无

5.添加日志模块,方便查阅启动和服务调用情况

6.同时添加行云脚本,支持行云部署

github地址:https://github.com/XingtongCai/mcp-server-ts

coding地址: http://xingyun.jd.com/codingRoot/jdcloud-fe/mcp-server/tree/main/demo

内容介绍

整个框架的结构很简单,就如下这些:

## 目录结构
- build: 编译之后的文件
- src
 -- router: 配置streamableHttp和sse协议的路由
   -- index.ts: 注册streamableHttp路由入口
   -- mcp.ts: streamableHttp的配置路径,具体为`process.env.MCP_BASE_PATH`的路径请求,如果没有配置,默认/mcp。如果有需要添加二级路径,例如 /mcp/event,需要在这里面添加一下/event,如果一级不用动
   -- sse.ts: sse的配置路径,具体为`process.env.MCP_BASE_PATH`的路径请求,如果没有配置,默认/mcp。如果有需要添加二级路径,例如 /mcp/event,需要在这里面添加一下/event,如果一级不用动
 -- tools: mcp的工具 
   -- index.ts: 注册工具
   -- mockFunc.ts: 模拟一个工具写法 - 这部分需要根据业务开发
 -- cli.ts: 命令行解析工具
 -- index.ts: 总入口
 -- server.ts: 创建Mcp服务
 -- sse.ts: 运行sse模式
 -- stdio.ts: 运行stdio模式
 -- streamableHttp.ts: 运行streamableHttp模式
- xingyun/bin : 是根据我们业务使用的部署工具开发的部署脚本 - 这部分需要根据实际部署平台更改,我这个支持行云部署
- build_xingyun.sh: 是根据我们业务使用的部署工具开发的部署脚本 - 这部分需要根据实际部署平台更改,我这个支持行云部署

启动服务方式

a.本地启动

1.启动stdio: npm run start 是默认启动stdio

2.启动StreamableHttp: npm run start:http 是默认启动端口3001

3.更改端口启动StreamableHttp: npm run dev:http 或者 npm run start -- -t http -p 3001

-t httt: 代表启动StreamableHttp

-p 3001: 代表启动端口3001

4.启动sse: npm run start:sse 是默认启动端口3001



b.部署启动

我在 xingyun/bin/control.sh中写的启动脚本,这段代码是启动streamableHttpless的,如果需要启动sse,需要改为 npm run start:sse

start(){
    npm run start:http
    sleep 3
    status
}

生产环境配置

# 监听特定内网IP(例如:192.168.1.100)
export MCP_HOST=192.168.1.100
export MCP_PORT=3001

# 使用内网域名(可选)
export MCP_DOMAIN=mcp-server.internal.com

# 修改基础路径(可选,默认是 /mcp)
export MCP_BASE_PATH=/api/mcp
### 端口配置优先级
1. 环境变量 `MCP_PORT`(最高优先级)
2. 命令行参数 `--port` 
3. 默认值:3001端口

### 访问地址优先级
1. 环境变量 `MCP_DOMAIN`(最高优先级)
2. 环境变量 `MCP_HOST`
3. 默认: localhost
### 内网访问方式
假设你的内网服务器IP是 `192.168.1.100`,端口是 `3001`:

**基础访问:**
```
http://192.168.1.100:3001/sales
```

**带域名的访问:**
```
http://mcp-server.internal.com/sales
```

**自定义路径:**
```
http://192.168.1.100:3001/api/mcp



项目关键代码说明

这个是package.json文件,也是我们一开始要看的,cli.js这个文件是我们启动文件,也是解析命令行的工具,真实区分的地方在index.ts文件中

"scripts": {
    "build": "tsc && chmod 755 build/src/index.js  build/src/cli.js",
    "start": "node ./build/src/cli.js",
    "start:http": "node ./build/src/cli.js --transport http",
    "start:sse": "node ./build/src/cli.js --transport sse",
    "dev:http": "node ./build/src/cli.js  --transport http --port 3002",
    "stop": "pkill -f "demo" || true",
    "restart": "npm run stop && npm run start:http",
    "inspector": "npx @modelcontextprotocol/inspector"
  },

index.ts 的关键代码,在这区分不同模式,然后进入到各自的处理模块。各自模块就是调用sdk,配置域名等操作,代码过长,不展示了,但是这几个文件不用动。

【MCP】同时支持stdio,streamableHttpless和sse三种协议的MCP服务框架 

StreamableHttp.ts我支持的是less,就是我不需要sessionId,如果有需要的,这块需要再自己改一下!!

【MCP】同时支持stdio,streamableHttpless和sse三种协议的MCP服务框架



server.ts 是创建mcp服务,同时注册tools工具,三个模式都需要使用的公共文件

【MCP】同时支持stdio,streamableHttpless和sse三种协议的MCP服务框架

tools/index.ts, 作为工具入口,一个工具一个注册

【MCP】同时支持stdio,streamableHttpless和sse三种协议的MCP服务框架

router文件夹下路由注册,是为了sse和streamableless的路由。

【MCP】同时支持stdio,streamableHttpless和sse三种协议的MCP服务框架

其中streamable的index.ts文件里面关键内容,其中basePath就是你的基础路径,通过定义指定访问路径。

【MCP】同时支持stdio,streamableHttpless和sse三种协议的MCP服务框架



sse的在sse.ts文件中,定义了get和post的方法

【MCP】同时支持stdio,streamableHttpless和sse三种协议的MCP服务框架



其实整个框架到这关键的代码就说完了。剩下xingyun的就是在行云平台部署和启动需要的脚本,这里就不介绍了



成果展示

1.stdio - 发布了依赖包,并用joycode成功联通

https://npm.m.jd.com/package/@jd/demo-mcp-server

【MCP】同时支持stdio,streamableHttpless和sse三种协议的MCP服务框架



2.streamableHttp - joycode成功联通并且可以运行

 【MCP】同时支持stdio,streamableHttpless和sse三种协议的MCP服务框架

【MCP】同时支持stdio,streamableHttpless和sse三种协议的MCP服务框架

3.sse - autobots支持sse模式,用这个框架开发了在业务中使用的 权限拦截MCP,并成功在autobots引入

 【MCP】同时支持stdio,streamableHttpless和sse三种协议的MCP服务框架 【MCP】同时支持stdio,streamableHttpless和sse三种协议的MCP服务框架

点赞
收藏
评论区
推荐文章
威尔we 威尔we
4年前
Netty 高性能网络协议服务器开发
本文通过一个实例来讲解如何使用框架来开发网络协议服务器,项目使用工具来构建和运行,并且支持部署。项目代码已在GitHub开源,。Netty简介Netty是一个异步、事件驱动的网络应用框架,使用它可以快速开发出可维护良好的、高性能的网络协议服务器。它大幅简化和流程化了网络编程,比如TCP和UDP套接字服务器开发。难能
Easter79 Easter79
4年前
Tengine成功打通RISC
RISCV产业生态已经进入快速发展期,随着大量的公司加入到RISCV研究和生产,基于RISCV架构的芯片也如雨后春笋般涌入市场。可以预见的是,RISCV的时代正在到来。在AI热潮的推动下,RISCV上面部署AI的需求也越发凸显。但是目前在RISCV基金会标准协议上还没有统一的AI标准,也没有对应的加速库和推理框架,面对此种越发强烈的需求和困境
京东云开发者 京东云开发者
11个月前
DeepSeek的开源之路:一文读懂从V1-R1的技术发展,见证从开源新秀到推理革命的领跑者
作者:京东科技蔡欣彤一、引言:AI时代的挑战与DeepSeek的崛起在大模型时代,AI技术的飞速发展带来了前所未有的机遇,但也伴随着巨大的挑战。随着模型规模的不断扩大,算力需求呈指数级增长,训练成本飙升,而性能提升的边际收益却逐渐递减,形成了所谓的“Sca
京东云开发者 京东云开发者
10个月前
DeepSeek的开源之路:一文读懂从V1-R1的技术发展,见证从开源新秀到推理革命的领跑者
作者:京东科技蔡欣彤一、引言:AI时代的挑战与DeepSeek的崛起在大模型时代,AI技术的飞速发展带来了前所未有的机遇,但也伴随着巨大的挑战。随着模型规模的不断扩大,算力需求呈指数级增长,训练成本飙升,而性能提升的边际收益却逐渐递减,形成了所谓的“Sca
京东云开发者 京东云开发者
8个月前
财务合同MCP实践
作者:CHO李航一、背景:随着MCP的普及,能否从业务角度,以MCP化的交互方式让业务简单通过自然语言描述进行对系统的操作,从而带来成本更低更便捷更快的体验。二、实现功能:1.根据合同状态或编号查询合同信息:i.question:请帮我查询待签署的合同ii
京东云开发者 京东云开发者
8个月前
EI与MCP的故事
作者:CHO孔令晗EIFuture,AINow!🎉🎉🎉MCP能做什么?先简单唠叨几句,试想一下,在MCP在之前,如果我们模型的产出更符合我们的预期,我们可能会将所需的数据上下文贴到Prompt中,但随着我们对产出的要求越来越高,CV大法的方式将信息添
京东云开发者 京东云开发者
7个月前
一分钟入门mcp开发
作者:京东物流张华给自己几分钟时间,快速了解一下mcp技术\01分钟时间入门👉Python实现一个基于sse通信的完整mcpdemo0.1环境依赖Python3.10PackageVersionannotatedtypes0.7.0anyio4.9.0c
京东云开发者 京东云开发者
6个月前
开源 Ai Agent 智能体,能用、能改、能学,美滋滋!
作者:福禄娃🧨25年以来,先是RAG知识库,再到MCP服务,越来越多的互联网公司掀起了Ai智能体的设计和落地。作为程序员👨🏻‍💻,我们是最早一波接触和使用了各类的AiAgent产品的暖水鸭🦆,包括;Coze、Dify、Claude,以及编程类软件
京东云开发者 京东云开发者
2个月前
最新MCP规范解读,看这篇就够了!
一、MCP是什么?为什么需要它?想象一下,你正在开发一个AI编程助手,它需要:读取和修改项目文件查询数据库Schema搜索代码仓库执行Git操作传统做法是为每个数据源写一套专用代码,不同团队重复造轮子。ModelContextProtocol(MCP)就是