CM

cnych/mcp-sse-demo

Developer tools

이 페이지는 AI로 자동 번역되었습니다. 기술적인 세부 사항은 원문을 확인하세요. 원문 보기

96 stars 31 forks 품질 57 트렌드 15

cnych/mcp-sse-demo는 https://github.com/cnych/mcp-sse-demo.에서 가져온 MCP 서버 후보입니다.

개요

cnych/mcp-sse-demo는 https://github.com/cnych/mcp-sse-demo.에서 가져온 MCP 서버 후보입니다.

개요(AI 번역)

MCP 지지两种通信传输方法:STDIO(标准输入/输出)或 SSE(服务器推送事件),两者都使用 JSON-RPC 2.0 进行消息格式化。 STDIO 用于本地集成,而 SSE 用于基于网络的通信。

예를 들어, 우리는 직접 在명령행中使用 MCP 서비스,那么我们可以使用 STDIO 传输방법,如果我们要在 Web 页面中使用 MCP 서비스,那么我们可以使用 SSE 传输方法。

다음我们将为大家开发一个基于 MCP 的智能商城服务助手,使用 SSE 类型的 MCP 服务,具备以下核心功能:

  • 实时访问产品信息和库存水平,支持定制订单。
  • 根据客户偏好和可用库存推荐产品。
  • 使用 MCP 工具服务器与微服务进行实时交互.
  • 在回答产品询问时检查实时库存水平。
  • 사용제품: ID 和数量促进产品购买.
  • 实时更新库存水平。
  • 通过自然语言查询提供订单交易的临时分析。

여기서 우리는 Anthropic Claude 3.5 Sonnet 模型作为 MCP 서비스的 AI 助手,当然也可以选择其他支持工具调用的模型。

首先需要一个产品微服务,用于暴露一个产品列表的 API 接口. 然后再提供一个订单微服务,用于暴露一个订单创建、库存信息等 API 接口。

다음的核心就是核心的 MCP SSE 服务器,用于向 LLM 暴露产品微服务和订单微服务数据,作为使用 SSE 协议的工具.

最后就是使用 MCP 客户端,通过 SSE 协议连接到 MCP SSE 服务器,并使用 LLM 进行交互.

微服务

다음부터 우리는 개발제품微服务和订单微服务,并暴露 API 接口.

首先定义产品、库存和订单的类型。

然后我们可以用 Express 来暴露产品微服务和订单微服务,并提供 API 接口. 由于是模拟数据,所以我们这里用更简单的内存数据来模拟,直接把数据通过下面的这些函数暴露出去。 (生产环境中,还是需要使用微服务加数据库的方式来实现)

然后我们可以通过 MCP 的工具来将这些 API 接口暴露出去,如下所示:

这里我们一共定义了 4 个工具,分别是:

  • getProducts:获取所有产品信息
  • getInventory:获取所有产品的库存信息
  • getOrders:获取所有订单信息
  • purchase:구매 상품

만약 是 Stdio 유형의 MCP 서비스,那么我们就可以直接在명령행中使用这些工具了,但是我们现在需要使用 SSE 유형의 MCP 서비스,그래서 우리는 一个 MCP SSE 服务器来暴露这些工具。

MCP SSE 서버

다음에 우리는 개발하기 시작해 MCP SSE 서버,用于暴露产品微服务和订单微服务数据,作为使用 SSE 协议的工具.

이 페이지는 AI로 자동 번역되었습니다. 기술적인 세부 사항은 원문을 확인하세요.

README

원문 README의 일부입니다. 원문 보기.

开发 SSE 类型的 MCP 服务

MCP 支持两种通信传输方法:STDIO(标准输入/输出)或 SSE(服务器推送事件),两者都使用 JSON-RPC 2.0 进行消息格式化。STDIO 用于本地集成,而 SSE 用于基于网络的通信。

比如我们想直接在命令行中使用 MCP 服务,那么我们可以使用 STDIO 传输方法,如果我们要在 Web 页面中使用 MCP 服务,那么我们可以使用 SSE 传输方法。

接下来我们将为大家开发一个基于 MCP 的智能商城服务助手,使用 SSE 类型的 MCP 服务,具备以下核心功能:

  • 实时访问产品信息和库存水平,支持定制订单。
  • 根据客户偏好和可用库存推荐产品。
  • 使用 MCP 工具服务器与微服务进行实时交互。
  • 在回答产品询问时检查实时库存水平。
  • 使用产品 ID 和数量促进产品购买。
  • 实时更新库存水平。
  • 通过自然语言查询提供订单交易的临时分析。

这里我们使用 Anthropic Claude 3.5 Sonnet 模型作为 MCP 服务的 AI 助手,当然也可以选择其他支持工具调用的模型。

首先需要一个产品微服务,用于暴露一个产品列表的 API 接口。然后再提供一个订单微服务,用于暴露一个订单创建、库存信息等 API 接口。

接下来的核心就是核心的 MCP SSE 服务器,用于向 LLM 暴露产品微服务和订单微服务数据,作为使用 SSE 协议的工具。

最后就是使用 MCP 客户端,通过 SSE 协议连接到 MCP SSE 服务器,并使用 LLM 进行交互。

微服务

接下来我们开始开发产品微服务和订单微服务,并暴露 API 接口。

首先定义产品、库存和订单的类型。

// types/index.ts
export interface Product {
  id: number;
  name: string;
  price: number;
  description: string;
}

export interface Inventory {
  productId: number;
  quantity: number;
  product?: Product;
}

export interface Order {
  id: number;
  customerName: string;
  items: Array;
  totalAmount: number;
  orderDate: string;
}

然后我们可以用 Express 来暴露产品微服务和订单微服务,并提供 API 接口。由于是模拟数据,所以我们这里用更简单的内存数据来模拟,直接把数据通过下面的这些函数暴露出去。(生产环境中,还是需要使用微服务加数据库的方式来实现)

// services/product-service.ts
import { Product, Inventory, Order } from "../types/index.js";

// 模拟数据存储
let products: Product[] = [
  {
    id: 1,
    name: "智能手表Galaxy",
    price: 1299,
    description: "健康监测,运动追踪,支持多种应用",
  },
  {
    id: 2,
    name: "无线蓝牙耳机Pro",
    price: 899,
    description: "主动降噪,30小时续航,IPX7防水",
  },
  {
    id: 3,
    name: "便携式移动电源",
    price: 299,
    description: "20000mAh大容量,支持快充,轻薄设计",
  },
  {
    id: 4,
    name: "华为MateBook X Pro",
    price: 1599,
    description: "14.2英寸全面屏,3:2比例,100% sRGB色域",
  },
];

// 模拟库存数据
let inventory: Inventory[] = [
  { productId: 1, quantity: 100 },
  { productId: 2, quantity: 50 },
  { productId: 3, quantity: 200 },
  { productId: 4, quantity: 150 },
];

let orders: Order[] = [];

export async function getProducts(): Promise {
  return products;
}

export async function getInventory(): Promise {
  return inventory.map((item) => {
    const product = products.find((p) => p.id === item.productId);
    return {
      ...item,
      product,
    };
  });
}

export async function getOrders(): Promise {
  return [...orders].sort(
    (a, b) => new Date(b.orderDate).getTime() - new Date(a.orderDate).getTime()
  );
}

export async function createPurchase(
  customerName: string,
  items: { productId: number; quantity: number }[]
): Promise {
  if (!customerName || !items || items.length === 0) {
    throw new Error("请求无效:缺少客户名称或商品");
  }

  let totalAmount = 0;
GitHub에서 전체 README 보기

설치

npx -y @modelcontextprotocol/server-filesystem /tmp
MCP 초보자라면? mcpskill.org 가이드부터 시작하세요 →

설정

{ "mcpServers": { "products-sse": { "url": "http://localhost:8083/sse" } } }