pubmed-search-mcp
PubMed Search MCP
AI 에이전트를 위한 전문 문헌 연구 어시스턴트 - 단순한 API 래퍼 그 이상
DDD(Domain-Driven Design) 기반의 MCP 서버로, AI 에이전트를 위한 지능형 연구 어시스턴트 역할을 하며 작업 지향적인 문헌 검색 및 분석 기능을 제공합니다.
✨ 포함 기능:
🔧 45가지 MCP 도구 - 간소화된 PubMed, Europe PMC, CORE, NCBI 데이터베이스 접근 및 Research Chronicle / Context Graph
🛡️ Multi-Agent Service Mode - 한 번 배포로 여러 에이전트에 서비스: 테넌트별 세션, 캐시, 아티팩트, bearer-token 인증, 테넌트별 공정 사용 한도. DEPLOYMENT.md 참조
🖼️ OA Figure Extraction - PMC 오픈 액세스 논문에서 그림 캡션, 직접 이미지 URL, PDF 링크 추출
📘 문서 사이트 - 언어 전환이 가능한 완전한 핸드북 탐색: 사용자 워크플로, 아키텍처, 45개 도구 참조, 파이프라인 튜토리얼, 소스/브로커 계약, 통합 및 운영, 보안, 배포 - u9401066.github.io/pubmed-search-mcp
📖 GitHub Wiki - 동일한 표준 문서의 GitHub 기본 미러 - github.com/u9401066/pubmed-search-mcp/wiki
📚 26가지 Claude Skills - AI 에이전트용 즉시 사용 가능한 워크플로 가이드(Claude Code 전용)
📖 Copilot Instructions - VS Code GitHub Copilot 통합 가이드
🌐 언어: English | 繁體中文
📘 문서 지도: README는 빠른 프로젝트 진입점입니다. 최상의 읽기 경험은 문서 사이트를, GitHub 기본 탐색은 GitHub Wiki를, 편집용 소스 문서는 다음을 사용하세요: 사용자 가이드 | 고급 워크플로 | 기능 우선 가이드 | 공급자 데이터 플레인 | BioMCP 아키텍처 분석 | 개발자 가이드 | 전체 색인
🚀 빠른 설치
사전 요구 사항
Python 3.10+ — 다운로드
uv (권장) — uv 설치
# macOS / Linux curl -LsSf https://astral.sh/uv/install.sh | sh # Windows powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"NCBI 이메일 — NCBI API 정책에 따라 필수입니다. 유효한 이메일 주소면 됩니다.
NCBI API 키 (선택 사항) — 더 높은 요청 한도(10 req/s 대 3 req/s)를 위해 여기서 발급받으세요.
OpenAlex API 키 (선택 사항) —
OPENALEX_API_KEY를 설정하면 인증된 크레딧 할당을 사용할 수 있습니다. 설정하지 않으면 OpenAlex의 현재 익명 임시 사용 예산으로 요청이 처리됩니다.mailto는 연락처 메타데이터일 뿐 인증이 아닙니다. 소스별 이메일이 없으면 서버는 OpenAlex, CrossRef, Unpaywall에 대해 구성된 런타임 연락처 이메일을 재사용합니다.
설치 및 실행
# Option 1: Zero-install with uvx (recommended for trying out)
uvx pubmed-search-mcp
# Option 2: Add as project dependency
uv add pubmed-search-mcp
# Option 3: pip install
pip install pubmed-search-mcpPython SDK 퍼사드
프로세스 내 Python 통합의 경우 MCP 도구 모듈을 import하는 대신 안정적인 SDK 퍼사드를 사용하세요:
from pubmed_search.api import PubMedSearchClient, PubMedSearchConfig
client = PubMedSearchClient(PubMedSearchConfig(email="your@email.com"))
result = await client.unified_search("remimazolam ICU sedation", limit=20)
print(result.articles)
print(result.source_counts)
print(result.artifact) # artifact locator when persistence is enableduvx pubmed-search-mcp 또는 /mcp를 에이전트 도구 검색에 사용하세요. Python 패키지/노트북 호출에서는 MCP 응답 문자열을 파싱하는 것보다 타입이 지정된 객체가 더 쉬우므로 SDK를 사용하세요.
런타임 계약 선택
계약 | 명령 | 네트워크 및 신뢰 경계 |
로컬 stdio |
| 단일 로컬 AI 클라이언트에 권장. 수신 대기 MCP 포트 없음 |
로컬 루프백 HTTP |
| 신뢰할 수 있는 단일 사용자 통합. MCP 요청은 영구 |
다중 사용자 서비스 |
| HTTPS 뒤의 원격/팀 사용. bearer 인증, 허용 호스트/오리진, 주체별 저장소 필수 |
로컬 배포와 서비스 배포는 의도적으로 별개의 계약입니다. 바인드 주소만 변경하여 로컬 HTTP 명령을 공용 서비스로 전환하지 마세요. 명시적 로컬 프로필은 MCP 요청 및 재연결 전반에 걸쳐 pmids="last", 세션, 캐시, 내보내기를 영구 default 테넌트에 유지합니다. 이는 강제된 루프백/Host/Origin 경계 안에서만 안전합니다. 서비스 모드는 해당 신뢰를 절대 상속하지 않으며, bearer 주체가 없으면 실패 시 폐쇄(fail closed)됩니다. 서비스 환경 및 Compose 프로필은 DEPLOYMENT.md를 사용하세요. 현재 서비스 프로필은 단일 서버 프로세스에서 여러 인증된 주체를 지원합니다. 세션, 잠금, 아티팩트, 구독이 공유 백엔드를 가질 때까지 복제본을 하나로 유지하세요.
프로토콜 기준은 MCP SDK v2(mcp>=2.0,<3)입니다. 최신 2026-07-28 클라이언트는 initialize 핸드셰이크나 Mcp-Session-Id 없이 tools/list와 tools/call을 직접 보냅니다. 로컬 모드는 파일시스템 기능을 유지합니다. 인증된 서비스 호출자는 file: 파이프라인을 로드하거나, 노트 output_dir/template_file을 선택하거나, 프로세스 전체 파이프라인 작업 영역을 상속할 수 없습니다. 서비스 Compose 스케줄러는 비활성화됩니다. 기능 매트릭스는 통합 및 운영 가이드를 참조하세요.
Related MCP server: ScholarMCP
⚙️ 구성
이 MCP 서버는 MCP 호환 AI 도구와 함께 작동합니다. 원하는 클라이언트를 선택하세요:
VS Code / Cursor (.vscode/mcp.json)
{
"servers": {
"pubmed-search": {
"type": "stdio",
"command": "uvx",
"args": ["pubmed-search-mcp"],
"env": {
"NCBI_EMAIL": "your@email.com"
}
}
}
}선택 사항: 브라우저 세션 PDF 폴백을 한 번 활성화하면 도구가 자동으로 사용합니다:
{
"servers": {
"pubmed-search": {
"type": "stdio",
"command": "uvx",
"args": ["pubmed-search-mcp"],
"env": {
"NCBI_EMAIL": "your@email.com",
"BROWSER_FETCH_CONFIG": "{\"enabled\":true,\"auto_enabled\":true,\"broker_url\":\"http://127.0.0.1:8766/fetch\",\"token\":\"<random-32-byte-token>\",\"allowed_hosts\":[\"jamanetwork.com\",\"*.jamanetwork.com\",\"nejm.org\",\"*.nejm.org\"]}"
}
}
}
}이 설정을 사용하면 get_fulltext는 기관 또는 출판사 랜딩 페이지에 대해 자동으로 로컬 브로커를 시도합니다. 특정 호출에서 이를 억제하려는 경우에만 allow_browser_session=false를 전달하세요.
다운로드 가로채기가 포함된 로컬 브로커를 실행하세요:
uv sync --extra browser-broker
uv run playwright install chromium
uv run python -c "import secrets; print(secrets.token_urlsafe(32))"
uv run pubmed-browser-fetch-broker --token "<same-random-32-byte-token>"생성된 값을 두 명령/구성에 모두 복사하세요. 공개된 예제 토큰을 재사용하지 마세요. --token을 생략하면 브로커가 고엔트로피 런타임 토큰을 생성하여 출력합니다. 브로커는 다운로드 가로채기가 활성화된 영구 브라우저 프로필을 시작합니다. 해당 브로커 제어 브라우저 창에서 한 번 로그인하면 이후 PDF 다운로드는 기본 "Save As" 대화상자 없이 자동으로 캡처됩니다.
Claude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"pubmed-search": {
"command": "uvx",
"args": ["pubmed-search-mcp"],
"env": {
"NCBI_EMAIL": "your@email.com"
}
}
}
}구성 파일 위치:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Claude Code
claude mcp add pubmed-search -- uvx pubmed-search-mcp또는 프로젝트 루트의 .mcp.json에 추가하세요:
{
"mcpServers": {
"pubmed-search": {
"command": "uvx",
"args": ["pubmed-search-mcp"],
"env": {
"NCBI_EMAIL": "your@email.com"
}
}
}
}Zed AI (settings.json)
Zed 편집기(z.ai)는 MCP 서버를 기본 지원합니다. Zed settings.json에 추가하세요:
{
"context_servers": {
"pubmed-search": {
"command": "uvx",
"args": ["pubmed-search-mcp"],
"env": {
"NCBI_EMAIL": "your@email.com"
}
}
}
}팁: 편집하려면 명령 팔레트를 열고
zed: open settings를 실행하거나, 에이전트 패널 → 설정 → "Add Custom Server"로 이동하세요.
OpenClaw 🦞 (~/.openclaw/openclaw.json)
OpenClaw는 mcp-adapter 플러그인을 통해 MCP 서버를 사용합니다. 먼저 어댑터를 설치하세요:
openclaw plugins install mcp-adapter그런 다음 ~/.openclaw/openclaw.json에 추가하세요:
{
"plugins": {
"entries": {
"mcp-adapter": {
"enabled": true,
"config": {
"servers": [
{
"name": "pubmed-search",
"transport": "stdio",
"command": "uvx",
"args": ["pubmed-search-mcp"],
"env": {
"NCBI_EMAIL": "your@email.com"
}
}
]
}
}
}
}
}구성 후 게이트웨이를 재시작하세요:
openclaw gateway restart
openclaw plugins list # Should show: mcp-adapter | loadedCline (cline_mcp_settings.json)
{
"mcpServers": {
"pubmed-search": {
"command": "uvx",
"args": ["pubmed-search-mcp"],
"env": {
"NCBI_EMAIL": "your@email.com",
"S2_API_KEY": "your_semantic_scholar_key",
"PUBMED_SEARCH_DISABLED_SOURCES": ""
},
"alwaysAllow": [],
"disabled": false
}
}
}기타 MCP 클라이언트
MCP 호환 클라이언트라면 stdio 전송으로 이 서버를 사용할 수 있습니다:
# Command
uvx pubmed-search-mcp
# With environment variable
NCBI_EMAIL=your@email.com uvx pubmed-search-mcp참고:
NCBI_EMAIL은 NCBI API 정책에 따라 필수입니다. 더 높은 요청 한도(10 req/s 대 3 req/s)를 위해 선택적으로NCBI_API_KEY를 설정하세요. 📖 상세 통합 가이드: 모든 환경 변수, Copilot Studio 설정, Docker 배포, 프록시 구성, 문제 해결은 docs/INTEGRATIONS.md를 참조하세요.
🎯 디자인 철학
핵심 포지셔닝: AI 에이전트와 학술 검색 엔진 사이의 지능형 미들웨어입니다.
이 서버가 필요한 이유?
다른 도구는 원시 API 접근만 제공합니다. 우리는 어휘 번역 + 지능형 라우팅 + 연구 분석을 제공합니다:
문제 | 우리의 해결책 |
에이전트는 ICD 코드를 사용하는데 PubMed는 MeSH가 필요함 | ✅ Auto ICD→MeSH conversion |
여러 데이터베이스, 서로 다른 API | ✅ Unified Search 단일 진입점 |
임상 질문에는 구조화된 검색이 필요함 | ✅ PICO handoff + pipeline ( |
의학 용어 오타 | ✅ ESpell auto-correction |
단일 소스에서 너무 많은 결과 | ✅ Parallel multi-source 중복 제거 포함 |
연구 변화를 추적해야 함 | ✅ Research Chronicle & Tree 랜드마크 감지, 진단, 하위 주제 분기, 버전 관리된 개정 지원 |
인용 맥락이 불명확함 | ✅ Citation Tree 정방향/역방향/네트워크 |
원문(full text)에 접근할 수 없음 | ✅ Multi-source fulltext (Europe PMC XML, Unpaywall OA 위치, 기관 직접/EZproxy, CORE 및 다운로더 폴백) |
유전자/약물 정보가 여러 DB에 분산됨 | ✅ NCBI Extended (Gene, PubChem, ClinVar) |
최신 프리프린트가 필요함 | ✅ Preprint search (arXiv, medRxiv, bioRxiv) 동료 검토 필터링 포함 |
참고문헌 관리자로 내보내기 | ✅ One-click export (공식 RIS/MEDLINE/CSL JSON, 로컬 RIS/BibTeX/CSV/MEDLINE/JSON) |
주요 차별점
어휘 변환 레이어 - 에이전트가 자연스럽게 말하면, 각 데이터베이스의 용어(MeSH, ICD-10, 텍스트 마이닝 엔티티)로 번역합니다.
통합 검색 게이트웨이 - 하나의
unified_search()호출로 PubMed, Europe PMC, CORE, OpenAlex, Semantic Scholar 및 활성화된 preprint/상용 소스에 걸쳐 기능 인식 디스패치를 수행합니다.PICO 핸드오프 + 파이프라인 - 에이전트가 P/I/C/O를 추출하고,
parse_pico()가 구조화된 핸드오프를 검증하며, 백엔드template: pico파이프라인이 O-인지 정밀도/재현율 검색을 실행합니다.연구 연대기 및 계보 트리 - 정책 기반 휴리스틱으로 이정표를 감지하고, 다중 신호 점수로 랜드마크 논문을 식별하며, 진단 정보를 표시하고, diff 가능한 버전별 개정을 저장하고, 하위 주제별 분기 트리로 연구 진화를 시각화합니다.
인용 네트워크 분석 - 단일 논문에서 전체 연구 지형을 매핑하기 위해 다중 수준 인용 트리를 구축합니다.
전체 연구 수명주기 - 검색 → 발견 → 전문 → 분석 → 내보내기까지 모든 것을 하나의 서버에서 처리합니다.
에이전트 우선 설계 - 인간이 읽기 위한 것이 아닌 기계 의사결정에 최적화된 출력.
📡 외부 API 및 데이터 소스
이 MCP 서버는 여러 학술 데이터베이스 및 API와 통합됩니다:
핵심 데이터 소스
소스 | 범위 | 어휘 | 자동 변환 | 설명 |
NCBI PubMed | 3,600만+ 논문 | MeSH | ✅ 네이티브 | 일차 생의학 문헌 |
NCBI Entrez | 다중 DB | MeSH | ✅ 네이티브 | 유전자, PubChem, ClinVar |
Europe PMC | 3,300만+ | 텍스트 마이닝 | ✅ 추출 | 전문 XML 접근 |
CORE | 2억+ | 없음 | ➡️ 자유 텍스트 | 오픈 액세스 애그리게이터 |
Semantic Scholar | 진화하는 그래프 + 운영자 데이터셋 | S2 필드 / 벌크 구문 | ✅ 브로커 컴파일 모드 | 관련성, 제한된 벌크, 배치, 인용 그래프 및 메타데이터 전용 릴리스/diff 평면; 파티션 다운로드 없음 |
OpenAlex | 진화하는 오픈 리서치 그래프 | 토픽 / 키워드 | ✅ 키워드 + 제한된 네이티브 시맨틱 | 커서, 비용 출처, 엔티티 그래프 및 선언된 운영자 스냅샷 경로; 아직 로컬 인덱스 없음 |
NIH iCite | PubMed | N/A | N/A | 인용 지표 (RCR) |
🔑 키: ✅ = 전체 어휘 지원 | ➡️ = 쿼리 직접 전달 (통제 어휘 없음)
ICD 코드: PubMed 검색 전에 자동 감지되어 MeSH로 변환됩니다.
환경 변수
# Required
NCBI_EMAIL=your@email.com # Required by NCBI policy
# Optional - For higher rate limits
NCBI_API_KEY=your_ncbi_api_key # Get from: https://www.ncbi.nlm.nih.gov/account/settings/
CORE_API_KEY=your_core_api_key # Get from: https://core.ac.uk/services/api
CROSSREF_EMAIL=your@email.com # Optional override; defaults to server/NCBI email
UNPAYWALL_EMAIL=your@email.com # Optional override; defaults to server/NCBI email
S2_API_KEY=your_s2_api_key # Alias: SEMANTIC_SCHOLAR_API_KEY
OPENALEX_API_KEY=your_openalex_key # Raises the OpenAlex credit budget; actual grant is response-driven
PUBMED_SEARCH_DISABLED_SOURCES= # Example: semantic_scholar
# Optional - Network settings
HTTP_PROXY=http://proxy:8080 # HTTP proxy for API requests
HTTPS_PROXY=https://proxy:8080 # HTTPS proxy for API requests
# Optional - Institutional fulltext access
INSTITUTIONAL_DIRECT_FETCH=true # Try DOI publisher pages before CORE fallback
EZPROXY_ENABLED=false # Enable only after configuring EZPROXY_HOST + cookie
EZPROXY_HOST=ezproxy.example.edu
EZPROXY_COOKIE_FILE=/path/to/cookies.json
# Optional - Local note export
PUBMED_NOTES_DIR=/path/to/wiki/references # save_literature_notes target folder
PUBMED_WORKSPACE_DIR=/path/to/project # fallback: references/ under this workspace
PUBMED_DATA_DIR=~/.pubmed-search-mcp # fallback: references/ under this data dirCrossRef와 Unpaywall은 소스별 이메일이 구성되지 않은 경우 런타임 서버 연락 이메일(NCBI_EMAIL, CLI --email 또는 감지된 git 이메일)을 재사용합니다. OpenAlex는 비공식 익명 사용과 선택적 API 키를 허용합니다. 브로커는 영구적인 "폴라이트 풀" 할당량을 가정하는 대신 응답의 크레딧/비율 메타데이터를 읽습니다.
로컬 노트 내보내기는 다음 순서로 디렉터리를 확인합니다: output_dir 인자, PUBMED_NOTES_DIR, PUBMED_WORKSPACE_DIR/references, PUBMED_DATA_DIR/references, 그 다음 ~/.pubmed-search-mcp/references.
이 경로/템플릿 선택은 신뢰할 수 있는 로컬 모드에만 적용됩니다. 인증된 서비스 노트는 항상 현재 테넌트의 격리된 references/ 디렉터리 아래에서 내장 형식을 사용합니다.
LLM 위키 호환성을 위해 wiki 및 foam 내보내기는 PMID, DOI, PMCID 또는 대체 식별자를 기반으로 안정적인 링크 대상을 사용합니다. 제목은 별칭/표시 레이블로 유지되며, 응답에는 확인되지 않은 위키링크 검사를 위한 wiki_validation이 포함됩니다.
🔄 작동 방식: 미들웨어 아키텍처
┌─────────────────────────────────────────────────────────────────────────────┐
│ AI AGENT │
│ │
│ "Find papers about I10 hypertension treatment in diabetic patients" │
│ │
└─────────────────────────────────┬───────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ 🔄 PUBMED SEARCH MCP (MIDDLEWARE) │
│ ┌─────────────────────────────────────────────────────────────────────────┐│
│ │ 1️⃣ VOCABULARY TRANSLATION ││
│ │ • ICD-10 "I10" → MeSH "Hypertension" ││
│ │ • "diabetic" → MeSH "Diabetes Mellitus" ││
│ │ • ESpell: "hypertention" → "hypertension" ││
│ └─────────────────────────────────────────────────────────────────────────┘│
│ ┌─────────────────────────────────────────────────────────────────────────┐│
│ │ 2️⃣ INTELLIGENT ROUTING ││
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ││
│ │ │ PubMed │ │Europe PMC│ │ CORE │ │ OpenAlex │ ││
│ │ │ 36M+ │ │ 33M+ │ │ 200M+ │ │ 250M+ │ ││
│ │ │ (MeSH) │ │(fulltext)│ │ (OA) │ │(metadata)│ ││
│ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ ││
│ │ └──────────────┴──────────────┴──────────────┘ ││
│ │ ▼ ││
│ │ 3️⃣ RESULT AGGREGATION: Dedupe + Rank + Enrich ││
│ └─────────────────────────────────────────────────────────────────────────┘│
└─────────────────────────────────┬───────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ UNIFIED RESULTS │
│ • 150 unique papers (deduplicated from 4 sources) │
│ • Ranked by relevance + citation impact (RCR) │
│ • Full text links enriched from Europe PMC │
└─────────────────────────────────────────────────────────────────────────────┘🛠️ MCP 도구 개요
도구 표면을 사용 가능한 시스템으로 이해하려면 45개의 도구 이름을 외우는 것부터 시작하지 마세요.
도구 사용 가이드부터 시작하세요: 현재 45개의 도구를 8가지 기능 계열로 압축하고, 이론적 하한을 설명하며, 인간과 에이전트 모두를 위한 의도 기반 라우팅을 제공합니다.
🔍 검색 및 쿼리 인텔리전스
┌─────────────────────────────────────────────────────────────────┐
│ SEARCH ENTRY POINT │
├─────────────────────────────────────────────────────────────────┤
│ │
│ unified_search() ← 🌟 Single entry for all sources │
│ │ │
│ ├── Quick search → Direct multi-source query │
│ ├── Native semantic → Bounded OpenAlex semantic mode │
│ ├── Systematic → Bounded provider bulk/cursor mode │
│ ├── PICO hints → Detects comparison, shows P/I/C/O │
│ └── ICD expansion → Auto ICD→MeSH conversion │
│ │
│ Sources: PubMed · Europe PMC · CORE · OpenAlex · S2 │
│ Auto: Deduplicate → Rank → Enrich full-text links │
│ │
├─────────────────────────────────────────────────────────────────┤
│ QUERY INTELLIGENCE │
│ │
│ generate_search_queries() → MeSH expansion + synonym discovery │
│ parse_pico() → Agent-provided PICO handoff │
│ analyze_search_query() → Query analysis without execution │
│ │
└─────────────────────────────────────────────────────────────────┘하나의 검색 진입점, 세 가지 검색 정책
일반 문헌 검색은 의도적으로 정확히 하나의 MCP 도구(unified_search)를 통해서만 노출됩니다. 공급자별 API는 내부 브로커 기능으로 유지됩니다:
# Default relevance/keyword routing across enabled sources
unified_search(query="treatment resistance")
# OpenAlex native semantic search (provider maximum 50 results)
unified_search(
query="mechanisms of treatment resistance",
sources="openalex",
options="native_semantic",
)
# Deterministic/bounded retrieval: OpenAlex cursor and S2 bulk where selected
unified_search(
query="melanoma AND immunotherapy",
sources="pubmed,openalex,semantic_scholar",
options="systematic",
)native_semantic 및 systematic은 상호 배타적이며 다중 전략 딥서치 확장을 비활성화합니다. 요청된 검색 모드가 지원되지 않으면 명시적 소스 선택은 네트워크 호출 전에 실패합니다. 자동 소스 선택은 가능한 공급자만 유지합니다. limit는 소스당 최대 100으로 유지되므로 systematic은 결정적이고 제한된 공급자 실행을 의미하며, 완전한 체계적 검토 보장이 아닙니다. 구조화된 출력과 아티팩트는 retrieval_mode와 소스별 source_metadata(요청/공급자 모드, 표준 또는 컴파일된 쿼리, 연속 가용성, 비용/비율 메타데이터, 가능한 경우 경고)를 기록합니다.
공개 요청 경계는 실패 시 폐쇄(fail-closed)입니다. limit는 1부터 100까지의 정수여야 하며, 알 수 없거나 잘못된 filters / options, 역전되었거나 범위를 벗어난 연도, 지원되지 않는 순위 또는 출력 모드는 공급자 I/O 전에 검증 오류를 반환합니다. 기본 딥서치 정책에서 limit는 소스의 쿼리 전략에 분배되는 소스당 총 예산이며, 모든 전략에 대한 limit 결과가 아닙니다. 전략 호출은 제한된 전역/소스별 동시성과 타임아웃을 사용하며, 다른 소스가 타임아웃되거나 속도 제한에 걸리거나 실패해도 성공한 소스는 계속 사용할 수 있습니다.
Europe PMC, Scopus 및 Web of Science는 이번 릴리스에서 키워드 전용으로 유지됩니다. 해당 소스에 대한 명시적 체계적 요청은 단일 페이지를 체계적 범위로 잘못 표시하는 대신 I/O 전에 실패합니다.
공급자 제한 및 운영자 데이터 플레인 경계에 대해서는 소스 계약, Semantic Scholar, OpenAlex를 참조하세요.
🔬 발견 도구 (핵심 논문 발견 후)
Found important paper (PMID)
│
┌───────────────────────┼───────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ BACKWARD │ │ SIMILAR │ │ FORWARD │
│ ◀────── │ │ ≈≈≈≈≈≈ │ │ ──────▶ │
│ │ │ │ │ │
│ get_article │ │find_related │ │find_citing │
│ _references │ │ _articles │ │ _articles │
│ │ │ │ │ │
│ Foundation │ │ Similar │ │ Follow-up │
│ papers │ │ topic │ │ research │
└─────────────┘ └─────────────┘ └─────────────┘
fetch_article_details() → Detailed article metadata
get_citation_metrics() → iCite RCR, citation percentile
build_citation_tree() → Full network visualization (6 formats)
📚 전문, 그림 추출 및 내보내기
카테고리 | 도구 |
전문 |
|
그림 |
|
그림 인식 전문 |
|
텍스트 마이닝 |
|
내보내기 |
|
🖼️ OA 그림 우선 탐색
에이전트가 기사 텍스트뿐만 아니라 증거 그림이 필요할 때 PMC 오픈 액세스 경로를 사용하세요:
get_article_figures(identifier="PMC12086443")→ 그림 레이블, 캡션, 이미지 URL 및 PDF/기사 링크get_fulltext(pmcid="PMC7096777", include_figures=True)→ 그림이 인라인으로 포함된 구조화된 전문그림 출력은 기사 컨텍스트를 보존하므로 에이전트는 각 그림을 언급된 섹션에 다시 연결할 수 있습니다.
🧬 NCBI 확장 데이터베이스
도구 | 설명 |
| NCBI Gene 데이터베이스 검색 |
| NCBI Gene ID로 유전자 세부 정보 조회 |
| 유전자에 연결된 PubMed 논문 |
| PubChem 화합물 검색 |
| PubChem CID로 화합물 세부 정보 조회 |
| 화합물에 연결된 PubMed 논문 |
| ClinVar 임상 변이 검색 |
🕰️ 연구 연대기 및 계보 트리
도구 | 설명 |
| 랜드마크 감지를 포함한 영구적이고 버전 관리되는 연대기를 구축합니다. 출력: summary, chronicle_map, timeline, tree, graph, evidence, milestones, mermaid, timeline_mermaid, mindmap, narrative, json |
| 개정판 로드, 목록, diff, 인용과 함께 서술, 이정표 분포 분석, 최대 5개 주제 비교 수행 |
mermaid는 표준 결합 보기입니다: 가로 연도 축에서 각 관찰된 연구 라인이 검색된 범위 내에서 가장 이른 날짜의 논문에서 분기됩니다. 이는 설명 가능한 그룹화이지 인과적 계보나 해당 분야의 진정한 최초 논문에 대한 주장이 아닙니다. 계보는 여러 논문이 공유하는 MeSH 설명자와 저자 키워드를 선호합니다. 단일 논문에만 의존하거나 신호가 불충분하면 경고가 포함된 연구 단계 폴백이 트리거됩니다. 같은 연도 내 표시 순서는 안정적이지만, 출판 정밀도가 이를 증명할 수 없을 때 우선순위를 주장하지 않습니다. timeline_mermaid는 이전의 평평한 타임라인 보기를 유지합니다. 구현된 계약은 docs/RESEARCH_CHRONICLE_REFACTOR_SPEC.md에서 확인하세요.
Chronicle Mermaid 출력은 구조화된 노드와 엣지로 구성되며, 안전한 라벨 이스케이프, 사이클/고아 노드 복구, 충돌에 강한 ID, 그리고 제한된 그래프 크기를 갖습니다. 전체 chronicle을 실패시키는 대신 풍부한 구문에서 안전한 구문, 최소 구문 순으로 폴백합니다. mermaid_validation.json은 모든 수정, 폴백, 생략된 시각 항목을 기록합니다. chronicle.mmd는 순수 Mermaid 소스로 유지됩니다.
Chronicle 리비전은 불변하며 원자적으로 추가됩니다. 세션 아티팩트 지속성이 활성화되면 아티팩트 실패가 명시적으로 표시되는 동안 저장된 Chronicle 리비전은 계속 사용할 수 있습니다.
Topic 빌드는 제한된 검색 전에 연도 제한을 PubMed에 보내고, 처음과 마지막으로 관찰된 논문을 보존하면서 상한을 랜드마크와 시간적 분포로 채웁니다. 감사는 PubMed returned / available 수를 기록하고, 가용성을 알 수 없거나 검색/선택 상한으로 인해 뷰가 완전하지 않은 경우 경고합니다. PubMed 오류 또는 문서 증거가 없는 범위는 빈 리비전을 게시하지 않습니다.
명시적 PMID 입력은 엄격합니다(12345678 또는 PMID:12345678, 양의 ASCII 숫자, 최대 20자리). DOI 또는 혼합 텍스트는 강제 변환되지 않고 거부됩니다. 신뢰할 수 있는 발행일이 없는 레코드는 날짜가 있는 항목 뒤에 Undated로 표시되며 표시되는 연도 범위에서 제외됩니다. 항목 ID는 날짜 또는 분류자 수정에도 PMID/DOI 증거 정체성을 따르며, 주제 연속성은 하나의 유니코드/대소문자/공백 정규화 키를 사용합니다. 다중 신호 논문은 하나의 기본 브랜치와 명시적 교차 링크를 유지합니다. 20% 이상의 중복은 경고로 감사됩니다. 리비전 diff에서 부재는 not_observed_in_revision / removed_from_view를 의미하며, 결론적인 폐기를 의미하지 않습니다.
🏥 기관 액세스 및 ICD 변환
도구 | 설명 |
| 기관의 링크 리졸버 구성 |
| OpenURL 액세스 링크 생성 |
| 리졸버 프리셋 나열 |
| 리졸버 구성 테스트 |
| 직접 DOI, EZproxy, OpenURL 핸드오프 경로 진단 |
| ICD 코드와 MeSH 용어 간 변환(양방향) |
| 쿼리에서 ICD 코드 자동 감지 및 MeSH로 확장 |
💾 세션 관리
도구 | 설명 |
| 캐시된 PMID 목록 검색 |
| 세션 캐시에서 기사 가져오기(API 비용 없음) |
| 세션 상태 개요 |
| PMID, 캐시된 기사, 지속적 검색 실행, 재생 인수, 기록, 영구 아티팩트를 위한 퍼사드 |
동적 MCP 리소스는 리소스를 직접 읽을 수 있는 에이전트를 위해 제공됩니다:
session://context— 활성 세션 상태session://last-search— 최신 검색 메타데이터session://last-search/pmids— 최신 PMID 목록 + CSV 형식session://last-search/results— 최신 검색에 대한 캐시된 기사 페이로드
영구 아티팩트
세션 지속성이 구성되면 재사용 가능한 unified_search 및 get_fulltext 응답을 위해 영구 MCP 출력 아티팩트가 저장됩니다. 도구 응답은 색인 카드처럼 작동합니다. 에이전트가 즉시 답변할 수 있는 충분한 수, 소스 경고, 아티팩트 힌트를 포함하며, 전체 증거 페이로드는 반복적으로 읽을 수 있는 파일에 유지됩니다. 컴팩트한 artifact 로케이터에는 artifact_id, artifact_uri, primary_file, summary, 파일 인벤토리, read_order, 감사 상태, 정확한 read_session(...) 검색 힌트가 포함됩니다. 로컬 MCP 클라이언트가 local_path 및 manifest_path도 직접 받아야 하는 경우에만 PUBMED_ARTIFACT_INCLUDE_LOCAL_PATHS=true를 설정하세요.
서버 파일시스템을 읽을 수 없는 원격 클라이언트는 세션 퍼사드를 통해 동일한 콘텐츠를 검색할 수 있습니다:
read_session(action="list_artifacts")
read_session(action="artifact", artifact_id="...")
read_session(action="artifact", artifact_uri="artifact://...")
read_session(action="artifact", artifact_uri="artifact://...", artifact_file="audit.json")
read_session(action="artifact", artifact_uri="artifact://...", artifact_file="query_strategy.json")
read_session(action="artifact", artifact_uri="artifact://...", artifact_file="results.json", offset=0, max_chars=200000)
read_session(action="list_artifacts", include_local_paths=true)복구 가능한 검색 실행
세션 관리가 활성화되면 모든 unified_search 호출은 안정적인 실행 ID를 받습니다. 여기에는 일반 검색, 검증/계획 실패, 인라인, saved:<name> 또는 dry_run=true 파이프라인 실행이 포함됩니다. 구조화된 결과와 오류는 search_run 핸드오프를 첨부합니다. Markdown은 동일한 실행 ID를 컴팩트한 복구 노트로 반환합니다. 일반 문헌 결과 봉투는 두 가지 별도의 기계 계약을 노출합니다:
search_status는 제한된 검색 결과를 설명합니다:state(completed,empty,partial또는failed),bounded=true,exhaustive=false, 반환된 수, 시도/성공/실패/재시도 가능한 소스, 계속/알 수 없는 완전성 소스 목록.search_run은 복구 핸드오프입니다: 안정적인run_id, 저널 상태,recoverable, 정확한read_session검사/재생 인수, 커밋된 경우 아티팩트 URI.
테넌트 범위의 search-run/v1 저널은 공급자 I/O 또는 최종 검증 응답 전에 게시되며, 정리된 요청, 계획, 소스별 또는 파이프라인 단계별 물리적 시도, 횟수, 안전한 실패, 결과 참조, 해당되는 경우 아티팩트 로케이터를 기록합니다. 최종 completed, partial, failed 또는 cancelled 상태에 도달합니다. 유효한 결과 0개 검색은 search_status.state가 empty인 completed 실행입니다. 다시 시작하면 완료되지 않은 started / planned / running 항목은 사라지는 대신 한 번 interrupted로 복구됩니다. dry-run이 아닌 저장된 파이프라인은 또한 PipelineStore 보고서/실행 기록을 유지합니다. 이는 호출 수준 검색 저널을 보완하는 것이지 대체하는 것이 아닙니다.
파이프라인 재생은 원래 인라인 또는 saved:<name> 인수와 dry_run / stop_at을 보존합니다. 키, 토큰, 쿠키, 비밀번호 또는 기타 자격 증명 자료를 포함하는 파이프라인 텍스트는 거부되고 실패한 실행으로 기록됩니다. 공급자 자격 증명은 서버 환경/구성에 있어야 하며 파이프라인 YAML 또는 JSON에는 절대 넣지 않아야 합니다.
read_session(action="search_runs")
read_session(action="search_runs", run_status="partial")
read_session(action="search_run", run_id="...")
read_session(action="replay_search", run_id="...")replay_search는 원래의 자격 증명 없는 unified_search kwargs만 반환합니다. 자동으로 네트워크 호출을 실행하지 않습니다. 에이전트나 사용자가 검토하고 명시적으로 제출해야 합니다. 공급자 커서/토큰 값은 source_metadata 및 query_strategy.json에서 불투명한 출처로 유지되지만, 공개 커서 재개 매개변수는 아직 없으므로 재생은 새로운 제한 검색을 시작합니다.
최종 저널 쓰기를 복구할 수 없는 경우, 응답은 search_run.status="history_unavailable", history_available=false, 의도된 최종 상태, 경고를 보고합니다. 지속적 복구가 보장되지 않으므로 검사/재생 작업을 의도적으로 생략합니다. 검색 결과 자체는 여전히 사용할 수 있습니다.
unified_search 아티팩트는 연구 봉투를 사용합니다. 소스 수 및 완전성 경고는 audit.json에서, 정확히 실행된 계획은 query_strategy.json에서, 전체 기사 목록은 마지막으로 results.json / results.toon에서 확인하세요. 이렇게 하면 학술적 추적성을 잃지 않으면서 MCP 응답 토큰을 작게 유지합니다.
아티팩트는 이미 계산된 결과 객체에서 생성되므로 아티팩트를 읽어도 검색이나 전문 검색이 다시 실행되지 않습니다.
아티팩트 디렉터리가 원자적으로 게시된 후 세션 인덱스가 업데이트되기 전에 크래시가 발생하면, 세션 재로드는 완전한 체크섬 인덱스 매니페스트만 발견하고 고아 아티팩트를 search_run_id로 검색 실행에 다시 연결합니다(이전 아티팩트의 경우 보수적 쿼리 매칭 사용). read_session은 기본적으로 로컬 파일시스템 경로를 편집합니다. local_path 및 manifest_path는 서버 로컬 경로이지 이식 가능한 클라이언트 경로가 아닙니다. get_fulltext의 아티팩트에는 구독 또는 기관 액세스 콘텐츠를 포함한 기사 본문 텍스트가 포함될 수 있습니다. 게시자, 라이선스 및 기관 액세스 약관에 따라 저장하고 공유하세요.
대용량 get_fulltext 응답은 아티팩트를 사용할 수 있을 때 미리보기로 인라인 반환됩니다. 아티팩트 로케이터를 사용하여 저장된 전체 콘텐츠를 검색하세요.
하나의 소스가 실패해도 전체 검색이 계속될 수 있으면 JSON 응답에 source_errors가 포함될 수 있습니다. markdown 응답에는 Source warnings 줄이 표시됩니다. Semantic Scholar HTTP 429의 경우 S2_API_KEY / SEMANTIC_SCHOLAR_API_KEY를 설정하고, 나중에 재시도하거나, sources="auto,-semantic_scholar" 또는 PUBMED_SEARCH_DISABLED_SOURCES=semantic_scholar로 일시적으로 제외하세요.
파이프라인 관리
manage_pipeline은 파이프라인 CRUD, 기록, 스케줄링을 위한 기본 퍼사드입니다. 보다 구체적인 파이프라인 도구는 호환성 래퍼로 계속 사용할 수 있습니다.
도구 | 설명 |
| 저장, 목록, 로드, 삭제, 기록, 스케줄 작업을 위한 기본 퍼사드 |
| 나중에 재사용할 파이프라인 구성 저장 (YAML/JSON, 자동 검증) |
| 저장된 파이프라인 나열 (태그/범위로 필터) |
| 저장된 이름으로 로드, 신뢰할 수 있는 로컬 호출자는 파일도 로드 가능 |
| 파이프라인 및 실행 기록 삭제 |
| 기사 diff 분석과 함께 실행 기록 보기 |
| 반복 파이프라인 일정 생성, 업데이트 또는 제거 |
인증된 서비스 호출자는 테넌트 파생 저장소에서 명명된 파이프라인을 사용합니다. workspace 및 file: 액세스는 로컬 전용입니다. 서비스 Compose 프로필은 별도로 설계된 단일 리더 없이는 일정을 실행하지 않습니다.
단계별 튜토리얼:
👁️ 비전 및 이미지 검색
도구 | 설명 |
| 업로드된 이미지, 이미지 URL 또는 데이터 URI를 에이전트 비전에 넘겨 검색어 추출 |
| Open-i에서 생물의학 이미지 검색 (X-ray, 현미경, 사진, 도표) |
사용자가 이미지를 제공하고 에이전트가 먼저 의미를 해석해야 하는 경우 analyze_figure_for_search를 사용하세요. 이 도구는 MCP ImageContent와 LLM 에이전트가 영어 생물의학 용어를 추출하라는 지침을 반환한 다음, 유사한 Open-i 이미지를 위해 search_biomedical_images를 계속하거나 관련 논문을 위해 unified_search를 계속합니다.
📄 프리프린트 검색
arXiv, medRxiv, bioRxiv 프리프린트 서버를 unified_search options 플래그를 통해 검색하세요:
preprints: 프리프린트 서버를 검색하고article_type=PREPRINT로 프리프린트를 기본 집계 결과 세트에 병합합니다.all_types: 프리프린트 서버 크롤링 없이도 선택한 학술 소스가 이미 반환한 비-동료검토 콘텐츠를 유지합니다.
권장 조합:
빈
options: 동료검토 결과만; 프리프린트 유사 레코드는 필터링됩니다.options="preprints": arXiv, medRxiv, bioRxiv를 검색한 다음 해당 프리프린트를 기본 결과와 함께 순위를 매기고 중복을 제거합니다.options="preprints, all_types": 동일한 프리프린트 서버 크롤링을 수행하고, 선택한 소스에서 반환된 기타 비-동료검토 레코드도 유지합니다.options="all_types": 프리프린트 서버 크롤링은 없지만, 검색된 소스의 비-동료검토 항목은 유지합니다.
프리프린트 감지 — 다음을 기준으로 기사가 프리프린트로 식별됩니다:
소스 API(OpenAlex, CrossRef, Semantic Scholar)의 기사 유형
PubMed ID 없이 존재하는 arXiv ID
알려진 프리프린트 서버 소스 또는 저널 이름
프리프린트 서버와 일치하는 DOI 접두사 (예:
10.1101/→ bioRxiv/medRxiv,10.48550/→ arXiv)
🌳 Research Context Graph
unified_search는 PMID 기반 순위 결과 세트에서 구축된 가벼운 연구 계보 뷰를 추가할 수 있습니다:
옵션 플래그 | 설명 |
| 현재 PMID 기반 순위 세트에서 가벼운 Research Context Graph 미리보기를 Markdown 출력에 추가하고 JSON 출력에 |
이 기능은 에이전트가 두 번째 build_research_chronicle 호출 없이 빠른 주제 분기를 원할 때 유용합니다.
🧪 임상시험 레지스트리 부가 기능
ClinicalTrials.gov는 암시적으로 쿼리되지 않습니다. 제한된 레지스트리 부가 기능이 유용한 경우 Markdown 검색에 options="trials"를 추가하세요. 이는 문헌 소스 계획 및 소스 수와는 별개로 유지됩니다. 내구성 있는 아티팩트는 잘린 실제 쿼리와 결과를 adjunct_queries 아래에 기록합니다. 구조화된 JSON/TOON 검색은 이 표시 전용 부가 기능을 실행하지 않습니다.
unified_search(query="remimazolam ICU sedation", options="trials")📊 카운트 우선 오리엔테이션
unified_search는 또한 순위 목록을 읽기 전에 라우팅 도움을 원하는 에이전트를 위해 기존 소스 적용 범위와 결정 힌트를 먼저 제공할 수 있습니다:
옵션 플래그 | 설명 |
| 응답에 소스 수 테이블, 적용 범위 요약, 다음 도구 권장 사항을 추가합니다. |
예시:
unified_search(query="remimazolam ICU sedation", options="counts_first")이 모드는 에이전트가 소스 확장, 주요 PMID 검사, 전문(fulltext) 가져오기, 그림 추출, 또는 타임라인 탐색으로 전환할지 결정해야 할 때 유용합니다.
⏱️ MCP 진행 보고
MCP 클라이언트가 진행 토큰을 제공하면 unified_search, build_research_chronicle, get_fulltext, get_text_mined_terms가 주요 단계에 대한 진행 업데이트를 내보냅니다. 이는 긴 검색 중 에이전트의 "블랙박스" 대기 시간을 줄여줍니다. 진행 콜백은 최선형(best-effort)이며 도구 호출이 활성화된 동안 서버에 의해 취소되지 않으므로, 진행 알림 역압으로 인한 호스트 측 Canceled: Canceled 메시지를 방지합니다.
📋 에이전트 사용 예시
1️⃣ 빠른 검색 (가장 간단함)
# Agent just asks naturally - middleware handles everything
unified_search(query="remimazolam ICU sedation", limit=20)
# Or with clinical codes - auto-converted to MeSH
unified_search(query="I10 treatment in E11.9 patients")
# ↑ ICD-10 ↑ ICD-10
# Hypertension Type 2 Diabetes2️⃣ PICO 임상 질문
간단한 경로 — unified_search는 직접 검색할 수 있습니다 (PICO 분해 없음):
# unified_search searches as-is; detects "A vs B" pattern and shows PICO hints in metadata
unified_search(query="Is remimazolam better than propofol for ICU sedation?")
# → Multi-source keyword search + PICO hint metadata in output
# ⚠️ This does NOT auto-decompose PICO or expand MeSH!
# For structured PICO search, use the Agent workflow below에이전트 워크플로 — 에이전트가 제공한 PICO + 백엔드 파이프라인 검색 (임상 질문에 권장):
┌─────────────────────────────────────────────────────────────────────────┐
│ "Is remimazolam better than propofol for ICU sedation?" │
└─────────────────────────────────┬───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ parse_pico() │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ P │ │ I │ │ C │ │ O │ │
│ │ ICU │ │remimaz- │ │propofol │ │sedation │ │
│ │patients │ │ olam │ │ │ │outcomes │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
└───────┼────────────┼────────────┼────────────┼──────────────────────────┘
│ │ │ │
▼ ▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────────────┐
│ generate_search_queries() × 4 (parallel) │
│ │
│ P → "Intensive Care Units"[MeSH] │
│ I → "remimazolam" [Supplementary Concept], "CNS 7056" │
│ C → "Propofol"[MeSH], "Diprivan" │
│ O → "Conscious Sedation"[MeSH], "Deep Sedation"[MeSH] │
└─────────────────────────────────┬───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ Agent combines with Boolean logic │
│ │
│ (P) AND (I) AND (C) AND (O) ← High precision │
│ (P) AND (I OR C) AND (O) ← High recall │
└─────────────────────────────────┬───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ unified_search() (auto multi-source + dedup) │
│ │
│ PubMed + Europe PMC + CORE + OpenAlex → Auto deduplicate & rank │
└─────────────────────────────────────────────────────────────────────────┘# Step 1: Agent extracts P/I/C/O, then validates the structured handoff
pico = parse_pico(
description="Is remimazolam better than propofol for ICU sedation?",
p="ICU patients requiring sedation",
i="remimazolam",
c="propofol",
o="sedation efficacy, delirium, hypotension"
)
# Returns validation plus a ready-to-run `template: pico` pipeline.
# Step 2: Get MeSH for each element (parallel!)
generate_search_queries(topic="ICU patients") # P
generate_search_queries(topic="remimazolam") # I
generate_search_queries(topic="propofol") # C
generate_search_queries(topic="sedation") # O
# Step 3: Either pass expanded fragments back as p_query/i_query/c_query/o_query
# or let the backend pipeline use the structured P/I/C/O labels.
# Step 4: Search (backend runs O-aware precision/recall searches, dedup, rank)
unified_search(
query="Is remimazolam better than propofol for ICU sedation?",
pipeline=pico["pipeline"]
)3️⃣ 핵심 논문에서 탐색
# Found landmark paper PMID: 33475315
find_related_articles(pmid="33475315") # Similar methodology
find_citing_articles(pmid="33475315") # Who built on this?
get_article_references(pmid="33475315") # What's the foundation?
# Build complete research map
build_citation_tree(pmid="33475315", depth=2, output_format="mermaid")4️⃣ 유전자/약물 연구
# Research a gene
search_gene(query="BRCA1", organism="human")
get_gene_literature(gene_id="672", limit=20)
# Research a drug compound
search_compound(query="propofol")
get_compound_literature(cid="4943", limit=20)5️⃣ 결과 내보내기
# Export last search results
prepare_export(pmids="last", format="ris") # → EndNote/Zotero
prepare_export(pmids="last", format="bibtex", source="local") # → LaTeX
prepare_export(pmids="last", format="csl") # → CSL JSON from the official NCBI Citation API
save_literature_notes(pmids="last") # → local wiki note + Foam-compatible wikilinks + CSL JSON
save_literature_notes(pmids="last", note_format="medpaper", output_dir="./references")
save_literature_notes(pmids="last", template_file="./reference-template.md")
# Retrieve full text for a selected paper from the last search
get_fulltext(pmid="12345678", extended_sources=True)6️⃣ 프리프린트 검색
# Include preprints alongside peer-reviewed results
unified_search(query="COVID-19 vaccine efficacy", options="preprints")
# → Main aggregated results include labelled arXiv, medRxiv, and bioRxiv preprints
# Include preprints and retain non-peer-reviewed items in main results
unified_search(query="CRISPR gene therapy", options="preprints, all_types")
# → Preprint-server crawl + non-peer-reviewed items retained in main results
# Only peer-reviewed (default behavior)
unified_search("diabetes treatment")
# → Preprints from any source automatically filtered out
# Add a research context graph preview to the same search response
unified_search("remimazolam ICU sedation", options="context_graph")7️⃣ 파이프라인 (재사용 가능한 검색 계획)
# Save a template-based pipeline through the primary facade
manage_pipeline(
action="save",
name="icu_sedation_weekly",
config="template: pico\nparams:\n P: ICU patients\n I: remimazolam\n C: propofol\n O: delirium",
tags="anesthesia,sedation",
description="Weekly ICU sedation monitoring"
)
# Save a custom DAG pipeline
manage_pipeline(
action="save",
name="brca1_comprehensive",
config="""
steps:
- id: expand
action: expand
params: { topic: BRCA1 breast cancer }
- id: pubmed
action: search
params: { query: BRCA1, sources: pubmed, limit: 50 }
- id: expanded
action: search
inputs: [expand]
params: { strategy: mesh, sources: pubmed,openalex, limit: 50 }
- id: merged
action: merge
inputs: [pubmed, expanded]
params: { method: rrf }
- id: enriched
action: metrics
inputs: [merged]
output:
limit: 30
ranking: quality
"""
)
# Execute a saved pipeline
unified_search(pipeline="saved:icu_sedation_weekly")
# List & manage
manage_pipeline(action="list", tag="anesthesia")
manage_pipeline(action="load", source="brca1_comprehensive") # Review YAML
manage_pipeline(action="history", name="icu_sedation_weekly") # View past runs🔍 검색 모드 비교
┌─────────────────────────────────────────────────────────────────────────┐
│ SEARCH MODE DECISION TREE │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ "What kind of search do I need?" │
│ │ │
│ ├── Know exactly what to search? │
│ │ └── unified_search(query="topic keywords") │
│ │ → Quick, auto-routing to best sources │
│ │ │
│ ├── Have a clinical question (A vs B)? │
│ │ └── Agent P/I/C/O → parse_pico() handoff │
│ │ → unified_search(template:pico) or expanded Boolean │
│ │ │
│ ├── Need comprehensive systematic coverage? │
│ │ └── generate_search_queries() → parallel search │
│ │ → MeSH expansion, multiple strategies, merge │
│ │ │
│ └── Exploring from a key paper? │
│ └── find_related/citing/references → build_citation_tree │
│ → Citation network, research context │
│ │
└─────────────────────────────────────────────────────────────────────────┘모드 | 진입점 | 가장 적합한 용도 | 자동 기능 |
빠른 검색 |
| 빠른 주제 검색 | ICD→MeSH, 다중 소스, 중복 제거 |
PICO | 에이전트 P/I/C/O -> | 임상 질문 | 핸드오프 검증 -> |
체계적 검토 |
| 재현 가능한 리뷰 시드 | MeSH/동의어 + 제한된 벌크/커서 실행; 완전성 주장은 아님 |
네이티브 시맨틱 |
| 제목/초록 공간의 개념적 유사성 | 기능 검증; OpenAlex 시맨틱 모드, 최대 50 |
탐색 |
| 핵심 논문에서 시작 | 인용 네트워크, 관련 논문 |
🤖 Claude Skills (AI 에이전트 워크플로)
.claude/skills/에 사전 구축된 워크플로 가이드가 있으며, 사용 스킬(MCP 서버 사용용)과 개발 스킬(프로젝트 유지보수용)로 나뉩니다:
📚 사용 스킬 (11) — 이 MCP 서버를 사용하는 AI 에이전트용
스킬 | 설명 |
| 필터를 사용한 기본 검색 |
| MeSH 확장, 포괄적 |
| 임상 질문 분해 |
| 인용 트리, 관련 논문 |
| 지속적이고 버전 관리되는 연구 진화 |
| 유전자/PubChem/ClinVar |
| Europe PMC, CORE 전문(full text) |
| RIS/BibTeX/CSV/CSL 내보내기 가이드 |
| 교차 데이터베이스 통합 검색 |
| 전체 도구 참조 가이드 |
| 검색 계획 저장, 로드, 재사용 |
🔧 개발 스킬 (15) — 프로젝트 기여자용
스킬 | 설명 |
| CHANGELOG.md 자동 업데이트 |
| DDD 아키텍처 리팩토링 |
| 코드 품질 및 보안 검토 |
| 새 기능을 위한 DDD 스캐폴드 |
| 커밋 전 문서 동기화 |
| 커밋 전 워크플로 오케스트레이션 |
| 컨텍스트를 Memory Bank에 저장 |
| Memory Bank 파일 업데이트 |
| 인용 준비가 된 PDF 자산 추출 및 인벤토리 작성 |
| 새 프로젝트 초기화 |
| 다국어 README 동기화 |
| 코드 변경 사항과 README 동기화 |
| ROADMAP.md 상태 업데이트 |
| 테스트 스위트 생성 |
| MCP 레지스트리와 생성된 도구 문서를 일치하게 유지 |
📁 위치:
.claude/skills/*/SKILL.md(Claude Code 전용이며, 저장소 스킬의 단일 진실 공급원) 저장소 스킬을.github/skills/로 미러링하거나 분할하지 마세요. 이 저장소 스킬은 프로젝트 범위로 지정되며 버전 관리 상태로 유지되어야 합니다. 개인적인 프로젝트 간 스킬은 이 저장소가 아닌~/.copilot/skills/또는~/.claude/skills/같은 사용자 디렉터리에 있어야 합니다.
🏗️ 아키텍처 (DDD)
이 프로젝트는 문헌 연구 도메인 지식을 핵심 모델로 하는 도메인 주도 설계(DDD) 아키텍처를 사용합니다.
src/pubmed_search/
├── domain/ # Core business logic
│ └── entities/article.py # UnifiedArticle, Author, etc.
├── application/ # Use cases
│ ├── search/ # QueryAnalyzer, ResultAggregator
│ ├── export/ # Citation export (RIS, BibTeX...)
│ └── session/ # SessionManager
├── infrastructure/ # External systems
│ ├── ncbi/ # Entrez, iCite, Citation Exporter
│ ├── sources/ # Europe PMC, CORE, CrossRef...
│ └── http/ # HTTP clients
├── presentation/ # User interfaces
│ ├── mcp_server/ # MCP tools, prompts, resources
│ │ └── tools/ # discovery, strategy, pico, export...
│ └── api/ # Auxiliary HTTP API routes (not pubmed_search.api)
└── shared/ # Cross-cutting concerns
├── exceptions.py # Unified error handling
└── async_utils.py # Rate limiter, retry, circuit breaker내부 메커니즘 (에이전트에 투명)
메커니즘 | 설명 |
세션 | 자동 생성, 자동 전환 |
캐시 | 검색 결과 자동 캐시, 중복 API 호출 방지 |
속도 제한 | NCBI API 제한을 자동 준수 (0.34s/0.1s) |
MeSH 조회 |
|
ESpell | 자동 맞춤법 교정 ( |
쿼리 분석 | 각 제안된 쿼리가 PubMed가 실제로 해석하는 방식을 표시 |
어휘 변환 계층 (핵심 기능)
우리의 핵심 가치: 우리는 에이전트와 검색 엔진 사이의 지능형 미들웨어로, 에이전트가 각 데이터베이스의 용어를 알 필요 없도록 어휘 표준화를 자동 처리합니다.
서로 다른 데이터 소스는 서로 다른 통제 어휘 시스템을 사용합니다. 이 서버는 자동 변환을 제공합니다:
API / 데이터베이스 | 어휘 시스템 | 자동 변환 |
PubMed / NCBI | MeSH (Medical Subject Headings) | ✅ |
ICD 코드 | ICD-10-CM / ICD-9-CM | ✅ 자동 감지 및 MeSH로 변환 |
Europe PMC | 텍스트 마이닝 엔티티 (유전자, 질병, 화학물질) | ✅ |
OpenAlex | 토픽 / 키워드 (모델 추론) | ✅ 브로커 키워드 모드; 선택 시 제한된 네이티브 시맨틱 모드 |
Semantic Scholar | S2 필드 / 벌크 쿼리 구문 | ✅ 브로커가 관련성 또는 제한된 벌크 모드를 선택; 제공자 주석이 출처를 보존 |
CORE | 없음 | ❌ 자유 텍스트만 |
CrossRef | 없음 | ❌ 자유 텍스트만 |
자동 ICD → MeSH 변환
ICD 코드(예: 고혈압의 I10)로 검색할 때 unified_search()는 자동으로:
detect_and_expand_icd_codes()를 통해 ICD-10/ICD-9 패턴을 감지합니다.내부 매핑(
ICD10_TO_MESH,ICD9_TO_MESH)에서 해당 MeSH 용어를 조회합니다.포괄적 검색을 위해 MeSH 동의어로 쿼리를 확장합니다.
# Agent calls unified_search with clinical terminology
unified_search(query="I10 treatment outcomes")
# Server auto-expands to PubMed-compatible query
"(I10 OR Hypertension[MeSH]) treatment outcomes"📖 전체 아키텍처 문서: ARCHITECTURE.md
MeSH 자동 확장 + 쿼리 분석
generate_search_queries("remimazolam sedation") 호출 시 내부적으로 다음을 수행합니다:
ESpell 교정 - 철자 오류를 수정합니다
MeSH 질의 -
Entrez.esearch(db="mesh")를 사용하여 표준 용어를 가져옵니다동의어 추출 - MeSH Entry Terms에서 동의어를 가져옵니다
쿼리 분석 - PubMed가 각 쿼리를 어떻게 해석하는지 분석합니다
{
"mesh_terms": [
{
"input": "remimazolam",
"preferred": "remimazolam [Supplementary Concept]",
"synonyms": ["CNS 7056", "ONO 2745"]
}
],
"all_synonyms": ["CNS 7056", "ONO 2745", ...],
"suggested_queries": [
{
"id": "q1_title",
"query": "(remimazolam sedation)[Title]",
"purpose": "Exact title match - highest precision",
"estimated_count": 8,
"pubmed_translation": "\"remimazolam sedation\"[Title]"
},
{
"id": "q3_and",
"query": "(remimazolam AND sedation)",
"purpose": "All keywords required",
"estimated_count": 561,
"pubmed_translation": "(\"remimazolam\"[Supplementary Concept] OR \"remimazolam\"[All Fields]) AND (\"sedate\"[All Fields] OR ...)"
}
]
}쿼리 분석의 가치: Agent는
remimazolam AND sedation이 두 단어만 검색한다고 생각하지만, PubMed는 실제로 Supplementary Concept + 동의어로 확장하여 결과가 8개에서 561개로 늘어납니다. 이는 Agent가 의도와 실제 검색의 차이를 이해하는 데 도움이 됩니다.
🔒 로컬 HTTPS 데모 및 서비스 배포
번들로 제공되는 자체 서명 인증서와 curl -k 흐름은 로컬 TLS 데모이며,
프로덕션 보안 프로필이 아닙니다. 공유 서비스의 경우 DEPLOYMENT.md에 설명된 대로
인증된 서비스 Compose 파일과 신뢰할 수 있는 인증서를 사용하세요.
로컬 HTTPS 스모크 테스트
# Step 1: Generate SSL certificates
./scripts/generate-ssl-certs.sh
# Step 2: Start HTTPS service (Docker)
./scripts/start-https-docker.sh up
# Verify deployment
curl -k https://localhost/HTTPS 엔드포인트
서비스 | URL | 설명 |
MCP |
| Streamable HTTP MCP 엔드포인트 |
Health |
| 상태 확인 |
Ready |
| 준비 상태 확인 |
Info |
| 런타임 전송 및 엔드포인트 메타데이터 |
Exports |
| 로컬 준비 내보내기 목록; 서비스 모드에서는 Bearer 인증 및 테넌트 범위 필요 |
원격 MCP 클라이언트 구성
{
"mcpServers": {
"pubmed-search": {
"url": "https://localhost/mcp"
}
}
}🏢 Microsoft Copilot Studio 통합
PubMed Search MCP를 Microsoft 365 Copilot (Word, Teams, Outlook)과 통합하세요!
빠른 시작
# Unpublished local schema/protocol smoke only; never tunnel local mode
pubmed-search-mcp-http --mode local --transport streamable-http \
--copilot-compatible --host 127.0.0.1 --port 8765
# Public Copilot endpoint: authenticated service mode is mandatory
export PUBMED_AUTH_TOKENS="copilot:$(openssl rand -hex 32)"
export NGROK_DOMAIN="your-assigned-domain.ngrok.dev"
./scripts/start-copilot-studio.sh --with-ngrokCopilot Studio 구성
필드 | 값 |
서버 이름 |
|
서버 URL |
|
인증 | 서비스 모드용 Bearer 토큰; |
📖 전체 문서: copilot-studio/README.md
pubmed-search-mcp-http --copilot-compatible를 사용하여 패키지된 Copilot HTTP 의미 체계를 지원합니다.run_server.py는 소스 트리 개발 래퍼로 남아 있습니다.run_copilot.py는 루프백 전용 12툴 프리미티브 스키마 스모크 테스트에만 사용하십시오. 그 단순화된 표면은 여전히unified_search(query, limit, min_year, max_year, sources, options)를 통해 공유 러너를 호출하고, 검색 실행, 재생 인수, 아티팩트 복구를 위한 프리미티브 스키마read_session을 노출합니다. PubMed 전용 일반 검색 별칭은 노출하지 않습니다. 터널 스크립트는 할당된NGROK_DOMAIN이 필요하며, 점유된 백엔드 포트를 거부하고,--mode service가 준비 상태 및 미인증 거부 검사를 통과한 후에만 게시합니다.⚠️ 참고: SSE 전송은 2025년 8월부터 더 이상 사용되지 않습니다.
streamable-http를 사용하세요.
📖 추가 문서:
아키텍처 → ARCHITECTURE.md
파이프라인 튜토리얼 (영어) → docs/PIPELINE_MODE_TUTORIAL.en.md
파이프라인 튜토리얼 (zh-TW) → docs/PIPELINE_MODE_TUTORIAL.md
배포 가이드 → DEPLOYMENT.md
Copilot Studio → copilot-studio/README.md
🔐 보안
보안 기능
레이어 | 기능 | 설명 |
HTTPS | TLS 종료 | 원격 자격 증명에 필요합니다. 번들로 제공되는 자체 서명 프로필은 로컬 전용입니다. |
Bearer 인증 | 안정적 주체 | 서비스 모드에서 필수이며 테넌트 인가에 사용됩니다. |
테넌트 저장소 | 파일시스템 격리 | 세션, 아티팩트, 내보내기, 연대기, 파이프라인은 인증된 주체 하위에 저장됩니다. |
공정성 및 요율 정책 | 테넌트 동시성 + 공유 업스트림 예산 | 한 호출자가 업스트림 API 허용량을 배가시키는 것을 방지합니다. |
보안 헤더 | 클릭재킹/MIME 강화 | 리버스 프록시 헤더는 인증을 보완할 뿐 CSRF 인가는 아닙니다. |
비밀 처리 | 런타임 비밀 주입 | API 키와 Bearer 토큰은 배포 시크릿/환경 변수에서 가져와야 하며 커밋되거나 로그에 기록되어서는 안 됩니다. |
자세한 배포 지침은 DEPLOYMENT.md를 참조하세요.
📤 내보내기 형식
주요 참고문헌 관리 도구와 호환되는 형식으로 검색 결과를 내보내세요:
형식 | 출처 | 호환 대상 | 사용 사례 |
RIS | 공식 또는 로컬 | EndNote, Zotero, Mendeley | 범용 가져오기 |
MEDLINE | 공식 또는 로컬 | PubMed tools | PubMed 스타일 네이티브 아카이빙 |
CSL JSON | 공식 | Citation processors | 프로그래밍 방식 인용 스타일링 |
BibTeX | 로컬 | LaTeX, Overleaf, JabRef | 학술 작성 |
CSV | 로컬 | Excel, Google Sheets | 데이터 분석 |
JSON | 로컬 | 프로그래밍 방식 액세스 | 사용자 지정 처리 |
내보내기 필드
핵심: PMID, Title, Authors, Journal, Year, Volume, Issue, Pages
식별자: DOI, PMC ID, ISSN
내용: Abstract (HTML 태그 정리됨)
메타데이터: Language, Publication Type, Keywords
접근: DOI URL, PMC URL, Full-text availability
특수 문자 처리
BibTeX 내보내기는 올바른 LaTeX 인코딩을 위해 pylatexenc를 사용합니다
북유럽 문자(ø, æ, å), 움라우트(ü, ö, ä), 악센트가 올바르게 변환됩니다
예:
Søren Hansen→S{\o}ren Hansen
📚 인용
GitHub는 CITATION.cff에서 이 저장소 인용을 표시합니다. 연구, 방법론 섹션 또는 내부 기술 보고서에서 PubMed Search MCP를 사용하는 경우 GitHub에서 생성된 인용을 사용하거나 저장소 메타데이터를 직접 재사용하는 것이 좋습니다.
@software{pubmed_search_mcp,
title = {PubMed Search MCP},
author = {u9401066},
url = {https://github.com/u9401066/pubmed-search-mcp}
}📄 라이선스
Apache License 2.0 - LICENSE 참조
🔗 링크
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server enabling AI agents to search and retrieve scientific papers, citations, and author profiles from Crossref, OpenAlex, and Semantic Scholar with no API keys required.53MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that enables coding agents to search academic papers, ingest full-text PDFs, extract structured details, and manage citations in literature research workflows.23MIT
- FlicenseAqualityBmaintenanceAI-powered research assistant MCP server for searching academic papers and answering research questions with DOI citations.3
- FlicenseNot gradedqualityDmaintenanceAn advanced scholarly research MCP server that enables AI assistants to discover, fetch, process, and manage academic papers across multiple sources like arXiv, PubMed, and Semantic Scholar, with capabilities for summarization, citation analysis, and concept relationship extraction.1
Related MCP Connectors
Academic research MCP server for paper search, citation checks, graphs, and deep research.
Open scientific and engineering knowledge for AI agents: search, evidence, document publishing.
Read-only MCP over an agentic SLR workspace with per-claim citation verification
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/u9401066/pubmed-search-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server