路哲萧笑
Java后端
·2025-10-15
求助:MCP - 使用过sse传递环境变量,显示无法调用搜图。但 stdio模式下已验证可行…… ```java package com.lzxx.lzxximagesearchmcpserver.tools; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ai.tool.annotation.Tool; import org.springframework.ai.tool.annotation.ToolParam; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Service public class ImageSearchTool { // 替换为你的 Pexels API 密钥(需从官网申请) private static final String API_KEY = "dsd"; // Pexels 常规搜索接口(请以文档为准) private static final String API_URL = "https://api.pexels.com/v1/search"; // 从环境变量读取图片数量限制,默认返回5张 private static final int DEFAULT_LIMIT = 5; // Pexels API 最大支持80张/页 private static final int MAX_LIMIT = 80; @Tool(description = "search image from web, return specified number of images controlled by environment variable IMAGE_SEARCH_LIMIT") public String searchImage(@ToolParam(description = "Search query keyword") String query) { try { int finalLimit = determineFinalLimit(); return String.join(",", searchMediumImages(query, finalLimit)); } catch (Exception e) { return "Error search image: " + e.getMessage(); } } // 确定最终使用的数量(优先级处理) private int determineFinalLimit() { // 1. 读取环境变量(区分大小写,Linux/macOS 环境变量通常为大写) String limitStr = System.getenv("IMAGE_SEARCH_LIMIT"); int limit = Integer.parseInt(limitStr); // 2. 完整的校验逻辑 if (StrUtil.isBlank(limitStr)) { limit = DEFAULT_LIMIT; } else if (!limitStr.matches("\\d+")) { limit = DEFAULT_LIMIT; } else if (limit <= 0 || limit > MAX_LIMIT) { limit = DEFAULT_LIMIT; } return limit; } /** * 搜索中等尺寸的图片列表 * * @param query * @return */ public List<String> searchMediumImages(String query, int limit) { // 设置请求头(包含API密钥) Map<String, String> headers = new HashMap<>(); headers.put("Authorization", API_KEY); // 设置请求参数(仅包含query,可根据文档补充page、per_page等参数) Map<String, Object> params = new HashMap<>(); params.put("query", query); params.put("per_page", limit); // 添加数量控制参数:从环境变量读取的限制值 // 发送 GET 请求 String response = HttpUtil.createGet(API_URL) .addHeaders(headers) .form(params) .execute() .body(); // 解析响应JSON(假设响应结构包含"photos"数组,每个元素包含"medium"字段) return JSONUtil.parseObj(response) .getJSONArray("photos") .stream() .map(photoObj -> (JSONObject) photoObj) .map(photoObj -> photoObj.getJSONObject("src")) .map(photo -> photo.getStr("medium")) .filter(StrUtil::isNotBlank) .collect(Collectors.toList()); } } ``` ```json { "mcpServers": { " lzxx-image-search-mcp-server": { "command": "java", "args": [ "-Dspring.ai.mcp.server.stdio=true", "-Dspring.main.web-application-type=none", "-Dlogging.pattern.console=", "-jar", "lzxx-image-search-mcp-server/target/lzxx-image-search-mcp-server-0.0.1-SNAPSHOT.jar" ], "env": {"IMAGE_SEARCH_LIMIT": "3"} } } } ```
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP