项目简介

'mcp-security' 是一个专门为Spring AI生态系统中的Model Context Protocol (MCP) 服务器和客户端提供安全功能的项目。它实现了MCP规范中定义的授权机制,使得MCP服务器能够通过OAuth2协议保护其资源和工具,并允许MCP客户端安全地访问这些受保护的功能。该项目本身是一个安全库,但通过其示例项目,清晰地展示了如何构建一个功能完善且集成了OAuth2安全机制的MCP服务器。

主要功能点

  • OAuth2授权服务器集成: 允许MCP服务器作为OAuth2资源服务器,与OAuth2授权服务器集成,处理客户端注册和令牌验证。
  • 资源服务器安全配置: 提供易于使用的配置选项,以保护MCP服务器的工具和API端点,支持JWT(JSON Web Token)令牌验证。
  • 动态客户端注册支持: 实现OAuth2动态客户端注册协议(RFC 7591),允许MCP客户端在运行时向授权服务器注册自身,简化了客户端管理。
  • 资源元数据端点: 公开MCP服务器的受保护资源元数据,例如支持的授权服务器、范围、认证方法等,便于客户端发现和配置。
  • 客户端安全支持: 提供MCP客户端库,使其能够通过OAuth2授权码(Authorization Code)或客户端凭证(Client Credentials)流程安全地获取访问令牌并访问受保护的MCP服务器。

安装步骤

由于 'mcp-security' 是一个Spring Boot库,您可以在您的Spring Boot MCP服务器项目中将其作为Maven或Gradle依赖添加。

如果您使用Maven,可以在您的 'pom.xml' 中添加以下依赖(请替换为实际版本,通常为'1.1.0-SNAPSHOT'或更高版本):

<dependency>
    <groupId>org.springaicommunity</groupId>
    <artifactId>mcp-server-security</artifactId>
    <version>1.1.0-SNAPSHOT</version> <!-- 请替换为Maven Central或Spring Snapshot仓库中的最新版本 -->
</dependency>
<!-- 如果您的项目也扮演MCP客户端角色,并需要安全功能,可添加此依赖 -->
<dependency>
    <groupId>org.springaicommunity</groupId>
    <artifactId>mcp-client-security</artifactId>
    <version>1.1.0-SNAPSHOT</version> <!-- 请替换为Maven Central或Spring Snapshot仓库中的最新版本 -->
</dependency>

如果您是首次构建MCP服务器并希望集成安全功能,我们建议您从项目的示例开始:

  1. 克隆仓库: 'git clone https://github.com/spring-ai-community/mcp-security.git' 'cd mcp-security'
  2. 构建项目: './mvnw clean install' (或者使用您的Gradle命令)
  3. 导航到示例:
    • 对于带安全工具的MCP服务器示例:'cd samples/sample-mcp-server-secured-tools'
    • 对于授权服务器示例:'cd samples/sample-authorization-server'
    • 对于带安全客户端的MCP客户端示例:'cd samples/sample-mcp-client' 或 'samples/sample-mcp-client-webflux'

服务器配置

MCP服务器需要与OAuth2授权服务器集成以实现安全功能。MCP客户端通常不直接负责启动MCP服务器进程,而是通过网络地址(URL)与其建立连接。因此,MCP客户端主要需要以下配置信息才能与受保护的MCP服务器通信:

  • MCP服务器名称 (serverName): 客户端给服务器起的一个友好名称,例如 "天气历史数据服务"。
  • MCP服务器 URL (baseUrl): MCP服务器的网络地址,例如 "http://localhost:8092"。这是MCP服务器对外提供服务的根地址。
  • OAuth2客户端ID (clientId): 您的MCP客户端在OAuth2授权服务器上注册后获得的唯一标识符。
  • OAuth2客户端密钥 (clientSecret): 客户端用于向OAuth2授权服务器进行身份验证的密钥。
  • OAuth2授权服务器URL (issuerUri): 您的OAuth2授权服务器的基地址,例如 "http://localhost:9000"。客户端将从这里获取令牌。
  • 授权范围 (scopes): 您的MCP客户端请求MCP服务器资源所需的权限列表,例如 "openid", "profile", "weather.read"。
  • 授权类型 (grantTypes): 您的MCP客户端支持的OAuth2授权流程,例如 "authorization_code" (需要用户交互) 或 "client_credentials" (无需用户交互)。

这些信息通常以JSON对象的形式提供给MCP客户端进行配置。例如:

{
  "serverName": "天气历史数据服务",
  "baseUrl": "http://localhost:8092",
  "oauth2": {
    "clientRegistrationId": "authserver", // 客户端在授权服务器的内部注册ID
    "clientId": "your-client-id-from-authserver", // 授权服务器生成的客户端ID
    "clientSecret": "your-client-secret-from-authserver", // 授权服务器生成的客户端密钥
    "issuerUri": "http://localhost:9000", // 授权服务器的URL
    "scopes": ["openid", "weather.read"], // 客户端请求的权限范围
    "grantTypes": ["authorization_code"] // 客户端使用的授权流程
  }
}

关于 "command" 和 "args" 的说明: 在标准的MCP客户端与服务器交互中,客户端通过网络连接(如HTTP/JSON-RPC)与已运行的MCP服务器通信,因此不需要配置服务器的 'command' (启动命令) 和 'args' (启动参数)。这些通常是部署环境或自动化脚本用于启动服务器进程时所需的信息。MCP客户端的重点在于如何通过网络安全地连接到服务器并使用其功能。

基本使用方法

  1. 启动授权服务器: 首先,运行 'samples/sample-authorization-server' 示例。这会启动一个OAuth2授权服务器,监听在配置的端口(例如'8080'或'9000')。它将处理用户身份验证、客户端注册和令牌发放。

  2. 启动MCP服务器: 接着,运行 'samples/sample-mcp-server-secured-tools' 或 'samples/sample-mcp-server' 示例。这些是集成了'mcp-server-security'的MCP服务器,它们会监听在一个端口(例如'8092'),并配置为从之前启动的授权服务器获取令牌。这些服务器包含定义好的工具(例如'WeatherService'),并通过OAuth2进行保护。

  3. 配置并启动MCP客户端: 最后,运行 'samples/sample-mcp-client' 或 'samples/sample-mcp-client-webflux' 示例。此客户端应用程序会配置为连接到MCP服务器,并使用'mcp-client-security'模块通过授权服务器获取必要的访问令牌。当用户通过客户端请求调用MCP服务器上的工具时,客户端将自动处理OAuth2授权流程,安全地访问受保护的工具。

    例如,在'sample-mcp-client'的网页界面上,您可以输入一个城市名称,客户端将调用受保护的MCP服务器上的天气工具获取信息。如果未授权,客户端会引导用户进行授权登录。

信息

分类

开发者工具