听说 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 的鉴权?好简单的啦的更多相关文章

  1. SpringBoot使用token简单鉴权

    本文使用SpringBoot结合Redis进行简单的token鉴权. 1.简介 刚刚换了公司,所以最近有些忙碌,所以一直没有什么产出,最近朋友问我登录相关的,所以这里先写一篇简单使用token鉴权的文 ...

  2. PHP SoapClient 调用与鉴权,以及对Java和C# 的webservice的兼容处理

    SoapClient使用注意事项: 第一要加上 cache_wsdl参数,以防服务器调用的是缓存的wsdl文件 然后是参数传递,如果是使用PHP自己写的WebService,参数传递按正常方式即可 1 ...

  3. ASP.NET Core 项目简单实现身份验证及鉴权

    ASP.NET Core 身份验证及鉴权 目录 项目准备 身份验证 定义基本类型和接口 编写验证处理器 实现用户身份验证 权限鉴定 思路 编写过滤器类及相关接口 实现属性注入 实现用户权限鉴定 测试 ...

  4. 阿里云直播鉴权java代码示例

    段时间公司需要做直播服务,所以就研究了一下阿里云的直播,在直播里面,最重要的就是url的鉴权操作(验证推流或者拉流的有效性),在网上找了很多代码,都没有发现java的demo,所以就写篇播客记录一下, ...

  5. apigw鉴权分析(1-4)新浪微博开放平台 - 鉴权分析

    一.访问入口 http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E 微博开放接口的调用,如 ...

  6. apigw鉴权分析(1-1)阿里数加 - 鉴权方式分析

    一.访问方式 1.访问阿里云首页 https://www.aliyun.com/?utm_medium=text&utm_source=bdbrand&utm_campaign=bdb ...

  7. 基于Springboot集成security、oauth2实现认证鉴权、资源管理

    1.Oauth2简介 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAu ...

  8. shiro jwt 构建无状态分布式鉴权体系

    一:JWT 1.令牌构造 JWT(json web token)是可在网络上传输的用于声明某种主张的令牌(token),以JSON 对象为载体的轻量级开放标准(RFC 7519). 一个JWT令牌的定 ...

  9. ref:Java安全之反序列化漏洞分析(简单-朴实)

    ref:https://mp.weixin.qq.com/s?__biz=MzIzMzgxOTQ5NA==&mid=2247484200&idx=1&sn=8f3201f44e ...

  10. Shiro的鉴权方式

    一. 怎么用 Shiro 支持三种方式的授权 编程式:通过写 if/else 授权代码块完成: Subject subject = SecurityUtils.getSubject(); if(sub ...

随机推荐

  1. 在Linux下使用wxWidgets进行跨平台GUI开发

    在Linux下使用wxWidgets进行跨平台GUI开发 wxWidgets是一个功能强大的跨平台C++ GUI框架,支持Windows.Linux和macOS等多种平台.本文将详细介绍在Linux系 ...

  2. DotTrace系列:2. 理解四大经典的诊断类型(下)

    一:背景 1. 讲故事 前面我们已经聊过四大诊断类型中的前三个 Sampling,Tracine,Line-by-Line,这篇补上最后一个诊断类型 Timeline,这也是真实场景中使用最多的,它能 ...

  3. 20w奖金池!魔乐社区国产算力应用创新大赛正式启程

    本文分享自魔乐社区公众号<​​20w奖金池!魔乐社区国产算力应用创新大赛正式启程​​> 当国产算力崛起成为 AI 发展新引擎,你是否渴望用创新方案解锁无限可能?魔乐社区国产算力应用创新大赛 ...

  4. Java源码分析系列笔记-10.CopyOnWriteArrayList

    目录 1. 是什么 2. 如何使用 3. 原理 3.1. 构造方法 3.2. add方法 3.2.1. 先加锁 3.2.2. 复制数组并在这份数组上操作 3.2.3. 将复制的数组set回属性 3.3 ...

  5. C# 文件正由另一进程使用,该进程无法访问该文件

    OpenFileDialog控件,而使用该控件时若没有将条件设置好,很容易出现以下提示: 打开一个文件后,尝试重新打开一次该文件,或者打开该文件后想对该文件进行其他操作的时候,就容易出现这个错误提示, ...

  6. java--Struts拦截器、国际化、标签

    拦截器 Intercetor, 即为拦截器. 1) 在Struts2中,把每一个功能都用一个个的拦截器实现:用户想用struts的哪个功能的时候,可以自由组装使用. 2)Struts2中,为了方法用户 ...

  7. java--jdbc加强

    事务 事务使指一组最小逻辑操作单元,里面有多个操作组成. 组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚. 事务ACID特性  原子性(Atomicity) 原子性是指事务 ...

  8. vmware workstation 安装 Debian

    下载安装 vmware workstation 本文中用的是 VMware Workstation Pro v17. 点击这里,跳转至下载页. 下载 debian 点击这里跳转官网下载. 创建一个虚拟 ...

  9. CF1809D Binary String Sorting 题解

    CF1809D Binary String Sorting 贪心.由于每次操作的代价都很大,所以需要优先减少操作次数,然后尽量多使用交换操作. 易得交换操作最多只会发生一次,因为每次交换操作只能消除一 ...

  10. Android List数组列表自定义排序

    自定义排序 例如:根据文件的最后修改时间进行排序,最新文件在前 Collections.sort(lstFiles, new Comparator<FileListData>() { @O ...