Java MCP 的鉴权深度解析

 更新时间:2025年08月21日 08:48:21   作者:带刺的坐椅  
文章介绍Java MCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权,使用solon-ai-mcp等工具可简化流程,整体配置较为便捷,感兴趣的朋友跟随小编一起看看吧

听说 mcp 的鉴权,是件很麻烦的事情?估计是没选好工具。

MCP (Model Context Protocol) 旨在为大语言模型(LLM)与外部数据源、工具和服务提供标准化、安全的集成方式(相当于一种专用的 RPC 协议)。广泛应用于 AI 开发中的工具服务(Tool)、提示语服务(Prompt)和资源服务(Resource)。在实际应用中,确保 MCP 服务的安全性至关重要,因此需要合理的鉴权机制。

一、MCP Client 侧(负责传递,比较简单)

在客户端,一般是使用 queryString 或者 header 或者 env(stdio 方式用) 传递鉴权信息,比如变量:token(名字随便取)

(1)常见的 mcpServers json 配置方式

不同服务平台,mcpServers json 的配置格式可能会略有不同。具体需要按服务平台要求配置。

  • 使用 queryString 传递(http 类传输方式)
{
    "mcpServers": {
        "demo": {
            "type":"sse"
            "url": "https://localhost:8080/mcp?token=xxxx"
        }
    }
}
  • 使用 header 传递(http 类传输方式)
{
    "mcpServers": {
        "demo": {
            "type":"streamable",
            "url": "https://localhost:8080/mcp",
            "headers": {"token":"xxx"}
        }
    }
}
  • 使用 env 传递(stdio 传输方式)
{
    "mcpServers": {
        "demo": {
            "type":"stdio",
            "command":"java",
            "args": ["-jar", "/data/demo/target/demo-mcp-stdio.jar"]
            "env": {"token": "xxx"}
        }
    }
}

(2)使用 solon-ai-mcp 作为客户端

solon-ai-mcp 是比较简洁的 mcp java client 框架。它的体验与 mcpServers json 配置相差不大。

  • 使用 queryString 传递(http 类传输方式)
import org.noear.solon.ai.mcp.client.McpClientProvider;
McpClientProvider mcpClient =  McpClientProvider.builder()
                .channel(McpChannel.SSE) //表示使用 sse 传输方式
                .apiUrl("https://localhost:8080/mcp?token=xxxx")
                .build();
//mcpClient.getTools();
  • 使用 header 传递(http 类传输方式)
import org.noear.solon.ai.mcp.client.McpClientProvider;
McpClientProvider mcpClient =  McpClientProvider.builder()
                .channel(McpChannel.STREAMABLE) //表示使用 streamable 传输方式
                .apiUrl("https://localhost:8080/mcp")
                .headerSet("token", "xxxx")
                .build(); 
//mcpClient.getTools();
  • 使用 env 传递(stdio 传输方式)
import org.noear.solon.ai.mcp.client.McpClientProvider;
McpClientProvider mcpClient = McpClientProvider.builder()
                .channel(McpChannel.STDIO) //表示使用 stdio 传输方式
                .serverParameters(McpServerParameters.builder("java")
                        .args("-jar", "/data/demo/target/demo-mcp-stdio.jar")
                        .addEnvVar("token","xxx")
                        .build())
                .build();
//mcpClient.getTools();
  • 与 chatModel 结合使用示例:
import org.noear.solon.ai.chat.ChatModel;
import org.noear.solon.ai.chat.ChatResponse;
ChatModel chatModel = ChatModel.of(apiUrl).provider(provider).model(model)
                .defaultToolsAdd(mcpClient) //重点是这一行
                .build();
ChatResponse resp = chatModel
        .prompt("今天杭州的天气情况?")
        .call();

二、MCP Server 侧(也好简单的)

(1)方式1:每个工具各自鉴权(适合 stdiossestreamable 三种传输方式)

在 solon-ai-mcp 里,可以使用 @Header 注解,获取 mcp 连接的元信息(比如 queryString、header、env)

import org.noear.solon.ai.annotation.ToolMapping;
import org.noear.solon.ai.mcp.McpChannel;
import org.noear.solon.ai.mcp.server.annotation.McpServerEndpoint;
import org.noear.solon.annotation.Header;
import org.noear.solon.annotation.Param;
@McpServerEndpoint(channel = McpChannel.STREAMABLE, mcpEndpoint = "/mcp")
public class McpServerTool {
    @ToolMapping(description = "你好世界")
    public String hello(@Param(name="name", description = "名字") String name, @Header("token") String token) {
        if(token == null) {
            throw new IllegalArgumentException("你没有权限哦!");
        }
        return "你好," + name;
    }
}

(2)方式2:为 http 传输的所有工具集中鉴权(适合 ssestreamable http类的传输方式)

solon-ai-mcp 也可以通过过滤器(Filter),实现单点鉴权。

@Managed
public class McpServerTool implements Filter {
    @Override
    public void doFilter(Context ctx, FilterChain chain) throws Throwable {
        if (ctx.pathNew().equals("/mcp")) {
            String token = ctx.header("token"); //支持从 header 取
            if (token == null) {
                token = ctx.param("token"); //支持从 queryString 取
            }
            if (token == null) {
                ctx.status(401, "你没有权限哦!");
                return;
            }
        }
        chain.doFilter(ctx);
    }
}

(3)方式3:程序启动时鉴权(适合 stdio 传输方式)

@SolonMain
public class McpApp {
    public static void main(String[] args) {
        String token = System.getenv("token");
        if (Utils.isEmpty(token)) {
            throw new RuntimeException("你没有权限哦");
        }
        Solon.start(McpApp.class, args);
    }
}

到此这篇关于Java MCP 的鉴权?好简单的啦的文章就介绍到这了,更多相关Java MCP 鉴权内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Cloud Stream分区分组原理图解

    Spring Cloud Stream分区分组原理图解

    这篇文章主要介绍了Spring Cloud Stream的分区和分组,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 解决Nacos集群启动失败:java版本问题

    解决Nacos集群启动失败:java版本问题

    这篇文章主要介绍了解决Nacos集群启动失败:java版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • java实现希尔排序算法

    java实现希尔排序算法

    希尔排序(Shell Sort)是插入排序的一种,是针对直接插入排序算法的改进,是将整个无序列分割成若干小的子序列分别进行插入排序,希尔排序并不稳定。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。
    2015-04-04
  • java有序二叉树的删除节点方式

    java有序二叉树的删除节点方式

    文章描述了在二叉树中删除节点的三种情况及其对应的操作步骤,通过递归找到节点及其父节点,并根据节点的子树情况(无子树、单子树、双子树)进行相应的删除操作,文章还提供了一个测试类来验证删除操作的正确性
    2024-12-12
  • 解决Spring使用@MapperScan问题

    解决Spring使用@MapperScan问题

    这篇文章主要介绍了解决Spring使用@MapperScan问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java使用POI解析带图片的excel文件(简洁好用!)

    Java使用POI解析带图片的excel文件(简洁好用!)

    这篇文章主要给大家介绍了关于Java如何使用POI解析带图片的excel文件的相关资料,最近项目需要读取excel中的信息,带图片,所以这里给大家总结下,需要的朋友可以参考下
    2023-08-08
  • 详解如何使用MyBatis简化JDBC开发

    详解如何使用MyBatis简化JDBC开发

    JavaEE 企业级 Java 项目中的经典三层架构为表现层,业务层和持久层.MyBatis 对 JDBC 代码进行了封装,作为一款优秀的持久层框架,专门用于简化JDBC开发.本文主要介绍一下如何使用MyBatis简化JDBC开发,需要的可以参考一下
    2023-01-01
  • 在Spring Boot中处理文件上传功能实现

    在Spring Boot中处理文件上传功能实现

    这篇文章主要介绍了如何在Spring Boot中处理文件上传,通过配置文件上传属性、创建控制器来处理上传的文件,并通过异常处理器来管理错误情况,可以快速实现文件上传功能,需要的朋友可以参考下
    2024-06-06
  • Java线程的创建介绍及实现方式示例

    Java线程的创建介绍及实现方式示例

    这篇文章主要为大家介绍了Java线程的创建介绍及实现方式示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • SpringBoot如何读取resources目录下的文件

    SpringBoot如何读取resources目录下的文件

    这篇文章主要介绍了SpringBoot如何读取resources目录下的文件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07

最新评论