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"}
}
}
}
```
1
0
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
