🔥 Java MCP 的鉴权?好简单的啦
听说 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:每个工具各自鉴权(适合 stdio,sse,streamable 三种传输方式)
在 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 传输的所有工具集中鉴权(适合 sse,streamable 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); } }
关注公众号 低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
陈天桥联手清华教授代季峰发布开源 AI“深度研究”项目:MiroMind ODR
国内 AI 领域科学家、清华大学电子工程系副教授代季峰,与创新企业家、慈善家、天桥脑科学研究院创始人陈天桥联手筹备一家致力于打造通用人工智能(AGI)新公司一事,引发广泛关注。 如今,代季峰带来了技术“首秀”。 代季峰领衔的MiroMind AI团队日前公布了一个高性能、完全开源、开放协作的深度研究项目:MiroMind Open Deep Research(Miro ODR),其V0.1版本的GAIA测试达82.4分,性能超越OpenAI的DeepResearch、Manus等一众开源和闭源AI深度研究模型,从而成为当前开源最强Deep Research模型。 与现有的深度研究方法相比,MiroMind ODR项目开放了深度研究的各个阶段,包括四个子项目:MiroFlow(Agent框架)、MiroThinker(模型)、MiroVerse(数据)和MiroTrain(训练基础设施)。 MiroFlow,支持多种主流工具调用,扩展大语言模型,支持工具辅助的深度研究推理。它的亮点在于可以稳定复现最强性能,也就是GAIA上82.4的成绩。 MiroThinker,原生支持工具辅助推理的大...
- 下一篇
🔥 Java MCP 的鉴权?好简单的啦
听说 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"} } } } ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Mario游戏-低调大师作品

微信收款码
支付宝收款码