MCP服务器

使用Vercel MCP Handler和Descope Node SDK构建的MCP服务器,提供简单的echo工具并集成Descope认证。

  • by prashasth
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 prashasth/mcp-with-next-js-and-descope

使用说明

使用Vercel MCP处理程序和Descope Node SDK的Next.js MCP服务器

引言

这个示例展示了如何使用Vercel构建一个MCP服务器 MCP 处理器/处理器(根据上下文,“Handler”在这里可能指的是负责处理MCP(可能指某种特定任务或数据)的组件或模块,因此“MCP 处理器/处理器”是一个较为通用的翻译,具体含义需结合上下文确定) 使用Descope的Node SDK进行会话验证。服务器提供了一个简单的回显工具,并展示了如何使用Vercel的无服务器函数将Descope认证与模型上下文协议(MCP)集成。

关键组件

  • **Vercel's(的) MCP处理器(或MCP处理程序)**处理MCP协议通信和无服务器函数部署
  • **Descope Node SDK(中文可译为“Descope节点软件开发工具包”)**验证用户会话并提供身份验证上下文
  • 回声工具一个简单的示例工具,返回“Hello, world!”消息

部署

您可以使用以下方式连接到服务器 MCP 检测器(或 MCP 检查器,具体翻译可能根据上下文调整) 或任何其他MCP客户端。请务必包含 /api/mcp 连接URL中的路径。

要求

在继续之前,请确保您已具备以下内容:

  • Node.js (版本20或更高)
  • 一个有效的权限缩减(或范围缩减) 项目编号

运行服务器

首先,在(某个地方)添加环境变量 .env 在根目录下的文件:

NEXT_PUBLIC_DESCOPE_PROJECT_ID=      # Your Descope project ID
NEXT_PUBLIC_DESCOPE_BASE_URL=        # Your Descope base URL (optional, defaults to https://api.descope.com)

然后,安装依赖项:

npm i

最后,运行服务器:

npm run dev

服务器将在端口3000(或您环境变量中指定的端口)上启动。

API 端点

  • GET/POST /api/[transport]处理传入的MCP协议消息(支持SSE和HTTP传输)

认证

服务器使用Descope的Node SDK进行会话验证 verifyToken 功能:

  1. 从请求中提取承载令牌
  2. 使用Descope节点SDK验证会话
  3. 返回包含用户范围和客户端ID的身份验证上下文
  4. 所有MCP终端点均需要有效的承载令牌

管理工具的API密钥和OAuth令牌

如果你希望 Descope 管理你的 MCP 的 API 密钥或 OAuth 令牌,你可以使用 Node SDK 中的函数来在用户或租户级别获取出站应用程序令牌:

// Fetch user token with specific scopes
const userToken =
  await descopeClient.management.outboundApplication.fetchTokenByScopes(
    "my-app-id",
    "user-id",
    ["read", "write"],
    { withRefreshToken: false },
    "tenant-id"
  );

// Fetch latest user token
const latestUserToken =
  await descopeClient.management.outboundApplication.fetchToken(
    "my-app-id",
    "user-id",
    "tenant-id",
    { forceRefresh: false }
  );

// Fetch tenant token with specific scopes
const tenantToken =
  await descopeClient.management.outboundApplication.fetchTenantTokenByScopes(
    "my-app-id",
    "tenant-id",
    ["read", "write"],
    { withRefreshToken: false }
  );

// Fetch latest tenant token
const latestTenantToken =
  await descopeClient.management.outboundApplication.fetchTenantToken(
    "my-app-id",
    "tenant-id",
    { forceRefresh: false }
  );

可用工具

  • **echo(回声)**返回一个简单的“Hello, world!”消息