超越Cursor?最强编辑器重大更新!带你动手体验VSCode MCP Streamable HTTP传输!


2025 年 5 月 9 日凌晨,Visual Studio Code(VSCode)发布了全新的 1.100 版本[1]。本次更新亮点颇多,尤其是 AI 编程方面。其中最重大的更新就是 Copilot 支持了 Streamable HTTP 传输方式的 MCP server 的接入。

本篇文章将通过实现一个简单的、能够获取实时天气的示例 streamable HTTP MCP server,带你动手体验 VSCode 这次重大更新!

Streamable HTTP

在最新的 Model Context Protocol(MCP,模型上下文协议)版本(2025-03-26)[2]中引入了 Streamable HTTP 的通信方式,正式取代了旧版本中的 SSE 通信方式,成为了新的远程 MCP 交互标准。

Streamable HTTP 通信方式下的 MCP server 只需要暴露一个同时支持 POST/GET 的端点(之前 SSE 需要两个端点):

  • MCP client 向 server 发送消息时,必须使用 POST 方法,server 根据消息类型进行 SSE 或 JSON 响应;
  • MCP client 向 server 发送 GET 请求时,server 会初始化一个单独的 SSE 连接用于 server 向 client 发送请求消息与通知消息。

关于 Streamable HTTP 的更多实现细节,在本人之前的文章有讨论过,感兴趣的朋友可以详细了解下。

Copilot MCP

VSCode Copilot 从 2025 年 3 月的更新(version 1.99)开始支持了 Agent Mode,自然也支持了模型上下文协议(Model Context Protocol,MCP),全面对标 Cursor、Windsurf 等一众明星 AI 编辑器。

彼时的 Copilot 和 Cursor 等一样,只支持 MCP 的 Stdio 和 SSE 通信方式。而本次更新 VSCode 弯道超车,让 Copilot MCP 支持了最新的 Streamable HTTP 通信协议,在 AI 编辑器圈子里有着里程碑的意义。

如何配置 MCP server

我们来实际体验一下 VSCode 通过 Streamable HTTP 接入 MCP server。

写一个简单的 weather-mcp

为了演示方便,我这里使用 MCP 官方的 Typescript SDK[3] 简单实现了一个能获取指定城市实时天气的 MCP server,通信方式为 Streamable HTTP。

获取城市实时天气的能力是基于高德地图的天气 API[4],想使用该 API 需要去申请开发者 key。

代码具体实现比较简单:按照 Streamable HTTP 的规范,基于 express Web 框架[5] 对 MCP server 端点(这里是 /mcp) 的 POST 请求进行了处理(GET 用于 server notification/request 的高级特性,暂时先忽略):

const app = express();
app.use(express.json());
// 处理端点的 POST 请求
app.post('/mcp'async (req, res) => {
console.log('Received request:', req.body);
try {
    const server = getServer(); // 获取 server 实例,具体实现请见下文
    // 初始化 Streamable HTTP 传输实例
    const transport = new StreamableHTTPServerTransport({
      sessionIdGenerator: undefined// 不使用 session
      enableJsonResponse: true// server 使用 JSON 进行响应
    });
    await server.connect(transport); // transport 与 server 实例绑定
    await transport.handleRequest(req, res, req.body); // 具体处理请求
  } catch (error) {
    // 异常捕获与处理
    console.error('Error handling MCP request:', error);
    if (!res.headersSent) {
      res.status(500).json({
        jsonrpc: '2.0',
        error: {
          code: -32603,
          message: 'Internal server error',
        },
        id: null,
      });
    }
  }
});
// 启动 MCP server 服务
app.listen(3000() => {
console.log('Server is running on port 3000');
});

MCP server 的实例通过 getServer 函数获得。这里我们定义了一个 get-current-weather 的 tool,用于获取指定城市的当前天气,大模型需要传入的只有指定城市名称 city 这个参数:

const getServer = (): McpServer => {
const server = new McpServer({
    name: 'weather-mcp-server',
    version: '1.0.0',
  });
// 定义 get-current-weather 这个 tool
  server.tool(
    'get-current-weather',
    '获取指定城市的当前天气',
    {
      city: z
        .enum(['北京''上海''广州''深圳'])
        .describe('可供查询天气的城市名称'),
    },
    async ({ city }): Promise<CallToolResult> => {
     // get-current-weather 具体实现逻辑
      return await getCurrentWeatherHandler(city);
    }
  );

    return server;
};

这里给大家看一下 get-current-weather 具体实现逻辑,即 getCurrentWeatherHandler 函数,相关注释也比较详细:

const getCurrentWeatherHandler = async (
  city: '北京' | '上海' | '广州' | '深圳'
): Promise<CallToolResult> => {
// 城市名与城市代码映射关系,为了演示方便只提供北上广深
const cityAdCodeMap = {
   北京: '110000',
   上海: '310000',
   广州: '440100',
   深圳: '440300',
 };
const adcode = cityAdCodeMap[city];
if (!adcode) {
    return {
      content: [
        {
          type'text',
          text: `Error: Unsupported city name "${city}"`,
        },
      ],
      isError: true,
    };
  }
// 拼接高德天气 API 的请求 URL
const url = `https://restapi.amap.com/v3/weather/weatherInfo?key=${apiKey.default}&city=${adcode}`;
try {
    const response = await fetch(url);
    if (!response.ok) {
      return {
        content: [
          {
            type'text',
            text: `Error: ${response.status} ${response.statusText}`,
          },
        ],
        isError: true,
      };
    }
    // 处理高德天气 API 返回的结果,lives 为天气数据的数组,因为每次只查一个城市所以就取第一个
    const { lives: currentWeather } = (await response.json()) as {
      lives: unknown[];
    };
    return {
      content: [
        {
          type'text',
          text: JSON.stringify(currentWeather.at(0), null2),
        },
      ],
    };
  } catch (error) {
    return {
      content: [
        {
          type'text',
          text: `Error: ${error}`,
        },
      ],
      isError: true,
    };
  }
};

由于高德天气 API 需要将指定城市的文本名称转换为代码(adcode),这里为了演示方便,就强制改工具只支持 “北上广深” 的天气获取。

添加 weather-mcp

点开 activity bar 里的 Copilot Chat,然后和 stdio、SSE 通信方式下的 MCP server 一样,首先将 copilot 模式切换为 agent(方可支持 MCP):

超越Cursor?最强编辑器重大更新!带你动手体验VSCode MCP Streamable HTTP传输!

然后在下方输入框内会出现一个工具样式的图标,点击一下就会展示出当前可供 agent 使用的 tools 列表,以及添加 MCP server 的选项:

超越Cursor?最强编辑器重大更新!带你动手体验VSCode MCP Streamable HTTP传输!

点击 Add MCP Server 之后,就会出现让你选择 stdio、SSE 或 streamable HTTP 通信方式的 MCP server,这里我们选择 streamable HTTP:

超越Cursor?最强编辑器重大更新!带你动手体验VSCode MCP Streamable HTTP传输!

然后会让我们分别填写 MCP server 的 HTTP 端点(我们示例的 weather-mcp 是 http://localhost:3000/mcp),以及 MCP server 在配置中的唯一 ID,这里我起名 weather-mcp-server :

超越Cursor?最强编辑器重大更新!带你动手体验VSCode MCP Streamable HTTP传输!
超越Cursor?最强编辑器重大更新!带你动手体验VSCode MCP Streamable HTTP传输!

随后会询问我们该 MCP server 是添加到 workspace(只对当前 workspace 生效)还是添加到用户配置(全局生效),这个根据实际需求选择就可以:

超越Cursor?最强编辑器重大更新!带你动手体验VSCode MCP Streamable HTTP传输!

根据上一步选择的配置生效范围,创建配置的位置会有所不同:

  • Workspace 生效:会在当前项目下的 .vscode 目录下生成一个 mcp.json 文件;
  • 全局配置生效:会在全局配置的 settings.json 中增加 mcp 字段,用于配置 MCP。

至此,如果嫌以上过程比较繁琐,还可以通过两种方法达到同样目的,以上的方法只是更加直观,对初学者友好:

  1. 调出 VSCode 控制面板(Command Palette),快捷键一般是 ctrl+shift+P 或者 ⌘+shift+P(MacOS),输入 MCP: Add Server,之后步骤与以上类似;
超越Cursor?最强编辑器重大更新!带你动手体验VSCode MCP Streamable HTTP传输!
  1. 也可以直接在对应位置添加配置 JSON 就好:如果当前 workspace 生效,则创建 .vscode/mcp;全局配置生效,则在全局 settings.json 中增加 mcp 字段。

最终,生成的 MCP server 配置如下,区别于 stdio 和 SSE 的就是这里的 type 需要配置为 http

{
    "servers": {
        "weather-mcp-server": {
            "type""http",
            "url""http://localhost:3000/mcp"
        }
    }
}

运行起来!

首先,我们需要将 weather-mcp-server 启动。对于我们的 weather-mcp-server,需要使用 tsc 命令构建项目然后通过 node 运行(提前配置好 NodeJS 运行环境):

超越Cursor?最强编辑器重大更新!带你动手体验VSCode MCP Streamable HTTP传输!

然后我们在 VSCode MCP server 配置这里,能看到 code lens 区域显示启动 weather-mcp-server。对于 streamable HTTP 的通信方式,这里 Start 的意思就是让 VSCode 作为 MCP client 去连接 weather-mcp-server:

超越Cursor?最强编辑器重大更新!带你动手体验VSCode MCP Streamable HTTP传输!

在 VSCode 输出控制台能看到连接 weather-mcp-server 成功:

超越Cursor?最强编辑器重大更新!带你动手体验VSCode MCP Streamable HTTP传输!

下面我们再回到 copilot 界面,确保在 agent 模式下,我们来验证下 weather-mcp-server 的功能。

这里我提出了以下问题:“如果我现在穿着始祖鸟羽绒服去广州 city walk 会发生什么?可以使用 tools 去获取最新的天气。”

可以看到大模型(这里用的 OpenAI GPT-4.1)选择去使用我们 weather-mcp-server 的 get-current-weather 工具,并看到输入为 { "city": "广州"}

超越Cursor?最强编辑器重大更新!带你动手体验VSCode MCP Streamable HTTP传输!

点击 continue 以确认使用 MCP,大模型会结合 MCP server 返回的结果,给出精准的回答(Output 就是我们 weather-mcp-server 的 get-current-weather 工具返回的 MCP response):

超越Cursor?最强编辑器重大更新!带你动手体验VSCode MCP Streamable HTTP传输!

VSCode 和 Cursor 一众编辑器的大战在所难免

在近两月,AI 编程赛道的竞争与融资甚是激烈:

  • Cursor:AI 编辑器界长期以来的老大,其母公司 Anysphere 近期完成了新一轮融资,使得公司估值达到了近 90 亿美元,约合人民币 650 亿,较年初增长近三倍;
  • Windsurf:长期以来与 Cursor 对标,Agent 模式开拓者,很多用户觉得 Windsurf 的 Cascade 模式要更加丝滑。近期如愿以偿地被 OpenAI(ChatGPT 的母公司,不用多说了吧)收购,抱紧大腿。

此外,Google、Anthropic 等公司也都在自己的 AI 编程领域中做了许多更新迭代,如 Gemini 2.5、Cline 等。

如此竞争激烈下手握 VSCode 的微软,这样的 AI 大佬级公司也是不甘示弱的,尤其是面对 Cursor、Windsurf 这种 VSCode Fork 产品,一直以来在 AI 编程被他们吊打是很憋屈的(近日微软封禁了 Cursor 工具中 C/C++/C#等语言的支持就是急了的表现 ?)。VSCode 其实纸面实力优势明显,有着雄厚的技术资源、庞大的用户基数。近期关于 AI 功能的几次更新,也有赶超 Cursor 的趋势。

总结

本文介绍了 VSCode 1.100 版本的更新亮点,特别是 Copilot 对 Streamable HTTP 传输方式的支持。文章通过一个示例项目 weather-mcp,展示了如何基于 Streamable HTTP 构建 MCP server 并与 VSCode 集成。

此外,文章还对比了 VSCode 与 Cursor、Windsurf 等 AI 编辑器的竞争态势。尽管 Cursor 和 Windsurf 在 AI 编程领域表现强劲,但 VSCode 凭借其技术资源和用户基础,正逐步缩小差距,并在 AI 功能上展现出赶超趋势。

前沿技术大模型技术新闻资讯

🧠 解码大语言模型的记忆力:上下文长度的前世今生

2025-5-21 15:14:22

前沿技术大模型技术新闻资讯

一文读懂:2025 Google I/O 开发者大会

2025-5-21 17:05:52

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
购物车
优惠劵
搜索