开发者社区 > 博文 > 【MCP】同时支持stdio,streamableHttpless和sse三种协议的MCP服务框架
分享
  • 打开微信扫码分享

  • 点击前往QQ分享

  • 点击前往微博分享

  • 点击复制链接

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

  • jd****
  • 2026-01-13
  • IP归属:北京
  • 60浏览

    项目说明

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

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

    1. 针对不同业务,对于mcp-server需要的类型不同,有的就需要stdio,有的需要网络请求
    2. 不同平台对MCP服务协议要求不同,有支持streamableHttp,有仅支持sse的。

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

    3. 此外,有些研发人员目前并不了解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,配置域名等操作,代码过长,不展示了,但是这几个文件不用动。

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

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

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

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

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

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

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


    成果展示

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

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


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


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


    😊作者其他文章推荐

    作者本人最近利用JoyAgent 平台构建了一款AI应用小助手;文章地址: 【JoyAgent】利用多智能体模式打造一款全功能的销售助手

    【特点】:

    1.这个是我结合业务需求,设计的一款全能销售助手。里面包含了总体方案设计,以及详细介绍目前第一阶段的详细结构设计

    2.整体流程设计全部采用工作流模式,并用多Agent模式来根据功能分开管理。

    3.文章里面除了描述架构设计,还有详细的工作流的设计图

    大家有兴趣的,可以欢迎查阅


    文章数
    1
    阅读量
    60

    作者其他文章