在 AI 超级智能体项目中,你是怎么实现图片搜索 MCP 服务的?
- 标签:后端、编程导航
🏛 业务架构师
我做的是自建图片搜索 MCP 服务:把图片搜索能力封装成标准 MCP Server 对外(对内)输出——搜索 API 代理 + 结果标准化 + MCP 协议暴露。
实现分层:
- 能力层:接图片搜索的底层 API(必应图片/聚合服务),封装检索与翻页;
- 标准化层:结果裁剪为统一结构(缩略图 URL、原图链接、尺寸、来源站点)——过滤不合规源(版权风险站点)、限制返回条数(top 4~6),这是内容安全与成本的双重关卡;
- MCP 服务层:Spring AI MCP Server 把它声明为工具("搜索与关键词相关的图片,返回带来源的图片链接"),按 Streamable HTTP/SSE 暴露;
- 消费侧:AI 应用作为 MCP Client 接入,模型在生成图文内容(旅游攻略、商品介绍)时自主调用。
为什么做成 MCP 服务而不是应用内工具(这个决策值得讲):
- 能力复用:图片搜索是多个业务(智能体、内容助手、运营工具)的公共需求——一次封装,多应用接入,摊薄建设成本;
- 独立治理:计费(API 按次计费,统一层做配额与缓存)、审计(谁在搜什么)、内容安全过滤(涉政涉黄图库拦截)集中在服务端——安全与成本的管控点不能散落在各应用里;
- 解耦演进:换底层搜索供应商只改这一层。
业务提醒:图片的版权与合规是法务红线——商用场景优先有授权的图库 API,来源标注随结果返回,AI 生成物里的每张图都要能回答"从哪来的"。
一句话:图片搜索 MCP = 公共能力资产化——用协议标准把"一个需求"变成"一项服务"。
🏗 系统架构师
图片搜索 MCP 服务——这类没有现成 Server 的能力,我自建 MCP Server 发布:
1. 服务端实现(Spring AI MCP Server):
java
@Service
public class ImageSearchService {
@Tool(description = "图片搜索:根据描述搜索网络图片,返回图片URL列表。适用于用户需要配图、看实物图的场景")
public List<ImageResult> searchImages(
@ToolParam(description = "图片搜索关键词,建议英文效果更佳") String query,
@ToolParam(description = "数量1-10", required = false) Integer count) {
// 调用图片 API(Bing Image Search / Unsplash / Pexels)
// 结果过滤:尺寸、版权(优先 Creative Commons)、域名黑名单
// 返回 url + 缩略图 + 描述
}
}spring-ai-starter-mcp-server-webmvc 自动把 @Tool Bean 暴露为 MCP tools(JSON-RPC over HTTP/SSE)。
2. 客户端消费:智能体侧 MCP client 配置该 Server 的 endpoint,启动时发现工具注册;模型决定何时调用("给我一张 xx 的图")。
3. 关键工程细节:
- 版权过滤是红线:搜索源选择可商用图库(Unsplash/Pexels)或标注来源,商用场景避免侵权;
- 内容安全:关键词与结果过内容审核 API(合规),黑名单域名过滤;
- 结果结构化:返回 url/宽高/来源,前端直接渲染卡片,而不是塞给模型转述;
- 缓存:相同 query 短期缓存(图片搜索 API 贵且慢);
- 超时:图片 API 慢(1~3s),工具超时独立配置,避免拖垮 Agent 主循环。
架构价值:做成 MCP 而不是进程内工具的收益——图片搜索能力同时服务多个应用(智能体、其他内部系统),部署独立(弹性伸缩、故障隔离),这正符合"能力即服务"的微服务化思想。
💻 全栈开发专家
思路:自建一个 MCP Server 把 Pexels/Bing 图片搜索封装成标准工具,暴露给所有 AI 客户端(我的主应用、以及其他需要图片搜索的 Agent)复用。
1. 依赖:spring-ai-starter-mcp-server-webmvc(HTTP/SSE 传输,可独立部署)。
2. 工具实现:
java
@Service
public class ImageSearchMcpService {
private final PexelsClient pexels; // 图片 API 客户端
@Tool(description = "按关键词搜索高质量图片。返回最多 limit 张图片的"
+ "标题、分辨率和直链,适合回答中需要展示配图的场景")
public List<ImageItem> searchImages(
@ToolParam(description = "图片搜索关键词,用中英文皆可") String keyword,
@ToolParam(description = "数量,1-5") Integer limit) {
return pexels.search(keyword, Math.min(limit == null ? 3 : limit, 5))
.stream()
.map(r -> new ImageItem(r.alt(), r.width() + "x" + r.height(), r.url()))
.toList();
}
public record ImageItem(String title, String size, String url) {}
}3. 配置:
yaml
spring:
ai:
mcp:
server:
name: image-search-mcp
version: 1.0.0
type: SYNC
capabilities:
tool: true部署后主应用作为 MCP client 接入,模型即可调用;前端拿到 url 列表渲染图片卡片(约定工具返回结构里带 media 字段)。
工程要点:图片直链有防盗链/时效问题,返回缩略图 + 详情页链接两套;API Key 留在服务端;按调用方做限流(防止某个 Agent 把配额烧完)。