Skip to main content
Glama

reference-search-mcp

개인용 도구: 화가가 그림 참고 자료를 찾는 도구. AI 코딩 에이전트는 먼저 AGENTS.md를 읽어 주세요.

AI용 참고 이미지 검색 MCP 서버입니다. 자연어 쿼리를 받아 → 키워드로 파싱 → 여러 이미지 소스를 병렬 검색 → 썸네일 중복 제거 → 번호가 매겨진 콜라주로 구성 → 도구 호출로 멀티모달 모델이 필터링(일반 JSON 출력이 아닌) → 클라이언트 주도의 반복(a, b, c… 라운드, 라운드 간 중복 제거) → ID별로 원본 이미지를 다운로드해 파일 경로를 반환합니다.

调用方 AI (MCP 客户端)
   │  image_search_start("找适合播客封面的太空插画素材")
   ▼
[reference-search-mcp]                        ┌──────────────────────┐
  ├─ LLM 层 (pi)  NL → 关键词 (submit_keywords 工具)          │ 搜索适配器(并行)    │
  ├─ providers    DDG / Bing / Wikimedia / Openverse / Serper │  ddg ─┐             │
  ├─ 去重         pHash(跨轮 seen 集合)                      │  bing ─┤ 结果合并    │
  ├─ 拼图         sharp 编号拼图 round-a.png(a1..aN)         │  wikimedia ─┘       │
  ├─ 视觉筛选     pi vision 模型看拼图,调用 select_images /   └──────────────────────┘
  │               reject_images / refine_search 工具
  ▼
{ round:"a", gridPath, selectedIds:["a3","a17"], metadata:[...] }
   │  image_search_iterate("不要 a3,多找像 b7 的") → round b(重复图自动剔除)
   │  image_search_collect(session, ["b1","c12"]) → 本地文件路径 + manifest.json

왜 결과를 '도구 호출'로 전달하고, 구조화된 JSON으로는 전달하지 않나요?

필터 모델이 콜라주에 대한 선택을 하는 방식은 select_images / reject_images / refine_search 같은 함수 호출로 표현됩니다.

  • 파라미터 스키마는 모델 제공자가 강제로 검증하므로 원래부터 유효한 JSON이며, markdown 펜스, 산문에 끼어든 출력, 키 이름이 어긋나는 문제가 없습니다.

  • 여러 의도를 한 번에 표현합니다(선택 + 거부 + 다음 라운드 키워드 제안).

  • 유효하지 않은 ID(예: a99)를 전달하면 실행기가 오류를 돌려주고 모델은 다음 라운드에서 스스로 수정합니다.

  • MCP 바깥 계층과 같은 구조입니다. 바깥은 호출 AI가 도구를 통해 우리를 사용하고, 안쪽은 우리가 도구를 통해 모델을 사용합니다.

LLM 계층은 pi@earendil-works/pi-ai, MIT)를 기반으로 하며, 여러 공급업체 API를 통합합니다(Anthropic / OpenAI / DeepSeek / Gemini / 通义 / Kimi / MiniMax…). 인증을 자동으로 해석하고, 모델 카탈로그를 내장하며, 재시도와 JSON 복구 도구를 포함합니다. 무거운 agent 프레임워크는 도입하지 않습니다. 서버 측 LLM은 세 개의 역할이한정된 함수(키워드 파싱 / 피드백 해석 / 콜라주 필터링)에 불과하며, 실제 반복 루프는 호출하는 AI가 주도합니다.

빠른 시작

요구 사항: Node ≥ 22.19.

npm install --ignore-scripts
npm run build

1. LLM 설정(pi 인증, 둘 중 하나)

# 方式 A:环境变量(任意 pi 支持的提供商)
export DEEPSEEK_API_KEY=sk-...          # 文本解析(便宜)
export ANTHROPIC_API_KEY=sk-ant-...     # 视觉筛选
# 或 OPENAI_API_KEY / GEMINI_API_KEY / OPENROUTER_API_KEY ...

# 方式 B:pi 的登录体系(支持订阅制)
npx @earendil-works/pi-coding-agent /login   # 或直接 pi /login

모델 선택(선택 사항):

export PI_TEXT_MODEL=deepseek/deepseek-chat
export PI_VISION_MODEL=anthropic/claude-sonnet-4-5
export PI_THINKING=off            # off|minimal|low|medium|high

사용자 지정 OpenAI 호환 엔드포인트(Qwen-VL / GLM-4V / Ollama 등):

export PI_CUSTOM_PROVIDER_API=openai-completions
export PI_CUSTOM_PROVIDER_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
export PI_CUSTOM_PROVIDER_MODELS=qwen-vl-max,qwen-turbo
export PI_CUSTOM_PROVIDER_API_KEY=sk-...

DeepSeek 시각 모델(deepseek-v4-flash-vision-exp는 pi 내장 모델 카탈로그에 없으므로 사용자 지정 엔드포인트를 거칩니다):

export DEEPSEEK_API_KEY=sk-...
export PI_TEXT_MODEL=deepseek/deepseek-v4-flash
export PI_VISION_MODEL=deepseek-vision/deepseek-v4-flash-vision-exp
export PI_CUSTOM_PROVIDER_ID=deepseek-vision
export PI_CUSTOM_PROVIDER_API=openai-completions
export PI_CUSTOM_PROVIDER_BASE_URL=https://api.deepseek.com
export PI_CUSTOM_PROVIDER_MODELS=deepseek-v4-flash-vision-exp
export PI_CUSTOM_PROVIDER_API_KEY_ENV=DEEPSEEK_API_KEY

LLM 자격 증명이 없어도 사용 가능(폴백 모드): start/iterate 실행 시 keywords를 명시적으로 넘기면 자동 파싱과 필터링을 건너뛰고 전체 후보를 돌려줍니다.

2. 이미지 소스 설정

export PROVIDERS=ddg,bing,wikimedia          # 默认;并行查询
export OPENVERSE_TOKEN=...                   # 启用 openverse(CC 图库)
export SERPER_API_KEY=...                    # 启用 serper(Google 图搜)
export SAFE_SEARCH=true

3. MCP 클라이언트 연동

Claude Code:

{
  "mcpServers": {
    "reference-search": {
      "command": "node",
      "args": ["D:/path/to/reference-search-mcp/dist/index.js"],
      "env": { "DEEPSEEK_API_KEY": "...", "ANTHROPIC_API_KEY": "..." }
    }
  }
}

자체 개발한 stdio 클라이언트: node dist/index.js로 실행하는 표준 MCP 프로토콜이며, 도구가 JSON 텍스트 블록을 반환합니다.

이중 모드: 이 MCP는 '시각 능력 아웃소싱'입니다

이 MCP의 본질은 텍스트 전용 모델에 눈을 달아 주는 것입니다. 검색, 콜라주 생성, 이미지 연결은 기계적인 부분이고, 시각적 필터링(콜라주를 보고 그리드 선택)은 "아웃소싱된 시각 능력"입니다. 호출하는 쪽이 멀티모달인지에 따라 서버가 시각 판단을 대신할지가 결정됩니다.

모드

사용 호출자

서버 동작

반환

serverFILTER_MODE=server

텍스트 전용 모델

텍스트로 키워드 파싱 + 시각 필터

selectedIds + reasons 반환(비전 모델의 "이미지 보고")

clientFILTER_MODE=clientfilter:false

멀티모달 모델

기계적 처리만 함. 비전 모델 무호출(비전 API 1회 절약)

콜라주 경로와 후보ID 전체를 반환하고, 직접 눈으로 보며 선택

auto(기본)

임의 모델

시각 모델을 구성하면 판별하고, 없으면 폴백

server/client와 동일

collect는 원래 모든 유효한 ID를 허용하므로, 모멀티모달 호출자는 selectedIds를 무시하고 개별적인 ID를 골라 낱개로 가질 수 있습니다. 개별 호출마다 filter: false로 전역 설정을 덮어쓸 수도 있습니다.

함수 목록

함수

입력 파라미터

반환 요약

image_search_start

query, keywords?, criteria?, count?, safe_search?, filter?

session_id, round:"a", grid_path, filtered, selected_ids, metadata(ID→title/도메인/license/크기/URL), keywords_used, warnings

image_search_iterate

session_id, feedback(a3/b12 등을 참조할 수 있음), keywords?, filter?

다음 라운드 round:"b" …;라운드 코드 간 pHash 중복 제거(dedupe_skipped); LLM refine_search로 키워드 질의 조정

image_search_collect

session_id, ids:["b1","c12"]

files(로컬 경로/URL/license/ic 크기), manifest_path, failures(ID별)

image_search_status

session_id

각 라운드의 선택/거부, 현재 키워드, 수집 상황

ID 규칙: 라운드 문자 + 그리드 인덱스입니다. a3 = 1라운드 3번째 칸, b12 = 2라운드 12번째 칸입니다. 모든 참조와 collect의 하한 이 규칙을 공유합니다.

설정 자세히 보기

변수

기본값

설명

PROVIDERS

ddg,bing,wikimedia

사용할 이미지 소스, 쉼표로 구분

OPENVERSE_TOKEN / SERPER_API_KEY

소스별 API 키

GRID_COLUMNS / GRID_ROWS

6 / 8

라운드당 48칸. GRID_CELL_SIZE 기본 256px

SESSION_TTL_MINUTES

120

세션과 임시 콜라주 자동 정리

DATA_DIR / OUT_DIR

시스템 temp / ./out

데이터와 생성물 위치

HTTP_TIMEOUT_MS

15000

가져오기 타임아웃

LLM_MAX_TURNS

3

내부 도구 루프 최대 라운드

FILTER_MODE

auto

auto | server | client("이중 모드" 참고)

PI_TEXT_MODEL / PI_VISION_MODEL / PI_THINKING

자동 선택

LLM 모델 선택

구성

src/
  mcp/        # MCP server(stdio)与 4 个工具注册
  llm/        # pi-ai 之上的工具调用循环:parseKeywords / interpretFeedback / filterGrid
  providers/  # SearchProvider 接口 + ddg/bing/wikimedia/openverse/serper 适配器,并行容错
  grid/       # sharp 拼图构建(编号徽章/占位格)、pHash 去重
  session/    # 会话状态机(轮次 a/b/c、seen 哈希、TTL 清理)
  collect/    # 整图下载(UA/Referer/重试/校验)、manifest 生成
  service.ts  # 编排:search → dedupe → grid → filter → round state

테스트와 스크립트

npm test                              # 34 个测试:单测 + 真实 MCP stdio 集成测试
npm run smoke -- --query "space nebula" --keywords "nebula,art" --collect "a1,a2" [--iterate "更多星球"]
npm run handshake -- --query "cat" --keywords "cat"     # MCP stdio 握手冒烟(先 build)
npx tsx scripts/debug-pi.ts           # 诊断:pi 层工具调用(DeepSeek 文本)
npx tsx scripts/debug-vision.ts       # 诊断:视觉模型对最近一轮拼图的原始响应

주의할 점

  • 저작권: metadata/manifest는 라이선스 정보을 그대로 전달하며(Wikimedia/Openverse 소스 등), 상업 소재는 반드시 출처의 이용 허락을 직접 확인하세요.

  • 핫링크 보호: Etsy 등 일부 사이트는 제3자 다운로드를 거부합니다. collect는 ID별로 실패를 따로 보고하며, 403이 사이트르 브라우저에서 직접 열 수 있습니다.

  • 스트래핑 방지: 소스 어댑터가 UA, 요청 간격, 재시도 백오프를 두기 때문에 단일 소스 실패해도 전체에 지장을 주지 않습니다.

  • 폴백 모드: LLM 자격 증명이 없으면 keywords를 명시해야 하며, 자동 필르가 되지 않습니다(반환 전 후보).

-
license - not tested
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • A design-style library for AI agents: search real styles, fetch a ready-to-apply design spec.

  • Generate images, GIFs, and PDFs from HTML, URLs, or templates — from your AI agent.

  • AI visual generation agent: multi-pipeline rendering, prompt crafting, and image composition.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/naer-lily/reference-search-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server