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 참조
🔗 링크
Available Tools
41 toolsanalyze_search_queryARead-onlyIdempotent
Analyze a search query without executing the search.
Useful for understanding how unified_search will process your query before actually running it.
Args: query: The search query to analyze
Returns: Analysis including: - Complexity level (SIMPLE/MODERATE/COMPLEX/AMBIGUOUS) - Intent (LOOKUP/EXPLORATION/COMPARISON/SYSTEMATIC) - PICO elements (if detected) - Recommended sources - Recommended strategies
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds the key behavioral fact that no search is executed and enumerates the analysis output (complexity, intent, PICO, recommendations), which is genuine value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and constraint in the first sentence, then efficiently documents args and returns. The Returns list is a bit verbose but each line conveys distinct return fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the analysis return fields. For a single-param read-only tool whose annotations cover safety, this is nearly complete; only deeper query-format guidance is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and there is one parameter, so the description must carry the meaning. It only restates 'query: The search query to analyze' with no added syntax, format, or length guidance beyond the schema's minLength/maxLength constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Analyze a search query') and immediately scopes it with the constraint 'without executing the search', which cleanly distinguishes it from the sibling unified_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames usage as a pre-flight step to unified_search ('understanding how unified_search will process your query before actually running it'), naming the alternative and the condition that selects this tool. It does not state when not to use it, but the routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_citation_treeARead-onlyIdempotent
Build a citation tree (network) from a single article.
🌳 Creates a visual citation network showing research lineage:
Forward (citing): Who cites this paper? (newer research)
Backward (references): What does this paper cite? (foundational work)
⚠️ IMPORTANT: Only accepts ONE PMID at a time to control API load. For multiple papers, call this tool separately for each.
📊 Output Formats (output_format parameter):
"cytoscape": Cytoscape.js format (default, academic standard)
"g6": AntV G6 format (modern, high-performance)
"d3": D3.js force graph format (flexible, Observable)
"vis": vis-network format (simple, quick prototypes)
"graphml": GraphML XML (desktop tools: Gephi, yEd, VOSviewer)
"mermaid": Mermaid diagram (VS Code preview, Markdown)
Args: pmid: Single PubMed ID (e.g., "12345678"). Only ONE PMID accepted - do NOT pass multiple. depth: How many levels to traverse (1-3, default 2). - depth=1: Direct citations/references only - depth=2: Also get citations of citations (recommended) - depth=3: Maximum depth (can be slow, ~100+ API calls) direction: Which direction to build the tree: - "forward": Only citing articles (who cites this) - "backward": Only references (what this cites) - "both": Both directions (default, recommended) limit_per_level: Max articles to fetch per node per level (default 5) output_format: Graph format for visualization (default "cytoscape") - "cytoscape": Cytoscape.js (academic standard, bioinformatics) - "g6": AntV G6 (modern, TypeScript, great for large graphs) - "d3": D3.js force layout (most flexible, Observable notebooks) - "vis": vis-network (simple and easy) - "graphml": GraphML XML (Gephi, VOSviewer, yEd, Pajek) - "mermaid": Mermaid diagram (preview in VS Code Markdown)
Returns: Markdown summary followed by JSON with graph data in the requested format. Includes metadata and statistics regardless of format.
Example usage: # Build 2-level tree for a paper (default Cytoscape.js format) build_citation_tree(pmid="33475315", depth=2, direction="both")
# Use AntV G6 format for modern web visualization
build_citation_tree(pmid="33475315", depth=2, output_format="g6")
# Export GraphML for Gephi analysis
build_citation_tree(pmid="33475315", depth=2, output_format="graphml")
| Name | Required | Description | Default |
|---|---|---|---|
| pmid | Yes | Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers. | |
| depth | No | ||
| direction | No | both | |
| output_format | No | cytoscape | |
| limit_per_level | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: the one-PMID API-load constraint, that depth=3 can trigger ~100+ API calls and be slow, and that depth controls traversal cost.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is well structured with headers, bullets and an example block, and the critical one-PMID warning is front-loaded. However, the output_format enum is fully documented twice (once in the 'Output Formats' section and again under Args), which is redundant padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the Returns section describes the response shape (Markdown summary plus JSON graph data with metadata and statistics) and the examples cover the main call patterns, leaving nothing essential missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20%, so the description must carry the load, and it does: it documents pmid (single value, example format), depth (range 1-3 with per-level meaning), direction (forward/backward/both), limit_per_level (default 5), and every output_format enum value with its intended consumer.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (build) and resource (citation tree/network) and clearly defines the two axes of the tree (forward/citing vs backward/references), which lets an agent distinguish it from the single-direction siblings find_citing_articles and get_article_references without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete usage conditions: only ONE PMID per call with an explicit instruction to call separately for multiple papers, plus recommendations for depth and direction defaults. It never names a sibling tool as an alternative, so the routing guidance is implicit rather than exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_research_chronicleA
Build a persisted, versioned, evidence-backed Research Chronicle.
A chronicle is the durable record of how a research topic evolved, and the single entry point for research-evolution work (it replaces the older one-shot timeline tools). It is stored with a monotonic revision number, so re-running it later produces revision N+1 and you can diff revisions to see exactly what changed.
The primary axis is chronological; research branches are a secondary
organizing dimension. Both come from the same stored snapshot, and
preserve shared provenance in output="timeline" and output="tree".
Agreement between projections is not independent evidence verification.
Every entry carries:
a one-sentence claim with inline citations
supporting / contradicting / updating evidence articles
a research branch (lineage) assignment
provenance and a confidence score
The typed provenance graph links Topic → Branch → Entry → EvidenceArticle and is validated against edge invariants. The audit reports evidence coverage, identifier coverage, branch coverage, graph integrity, and chronology gaps, so you always know how complete the picture is.
Args:
topic: Research topic (drug, gene, disease, intervention).
Required unless pmids or a stored chronicle_id is supplied.
pmids: Delimited PMIDs, a string array or JSON array string, or "last" to chronicle the previous
search results instead of running a new search.
max_events: Maximum timeline events to consider (topic mode).
Omit to inherit the continued revision's value, else 30.
min_year: Earliest publication year to include (topic mode).
max_year: Latest publication year to include (topic mode).
chronicle_id: Continue an existing chronicle (creates revision N+1)
instead of deriving the ID from the topic. Passing it
alone re-runs the stored scope, so the resulting diff
shows research movement rather than a changed window.
output: "summary" (default compact Markdown with the chronological
spine), "json", "chronicle_map", "timeline", "tree",
"graph", "evidence", "milestones", "mermaid" (horizontal
time spine with lineage branches), or "narrative".
"json", "chronicle_map", "timeline", "tree", "graph",
"evidence", and "milestones" return JSON; the rest return
Markdown.
Returns:
The requested rendering plus an artifact locator when durable
artifact persistence is enabled and succeeds. The artifact contains
the full snapshot, projections, evidence table, milestone analysis,
and audit regardless of output. Artifact failure is reported but
does not roll back the already saved Chronicle revision.
Examples: build_research_chronicle(topic="remimazolam") build_research_chronicle(pmids="last", topic="My Reading List") build_research_chronicle(topic="CAR-T therapy", output="mermaid") build_research_chronicle(chronicle_id="remimazolam-9f2b1c4d")
| Name | Required | Description | Default |
|---|---|---|---|
| pmids | No | ||
| topic | No | ||
| output | No | summary | |
| max_year | No | ||
| min_year | No | ||
| max_events | No | ||
| chronicle_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, and the description adds substantial side-effect context beyond them: the chronicle is persisted with a monotonic revision number, re-runs create revision N+1, and artifact persistence failure 'is reported but does not roll back the already saved Chronicle revision'. That is exactly the write/persistence semantics an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then organized into description, Args, Returns, and Examples – a clean structure where each section is useful. It is longer than strictly necessary; lines like 'Agreement between projections is not independent evidence verification' and the Topic → Branch → Entry → EvidenceArticle walkthrough are informative but add bulk for an agent that mainly needs mode and output selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, zero-required tool with no output schema, the description covers everything needed: entry conditions, parameter interactions, the artifact-plus-locator return shape, what the audit reports, and four concrete invocation examples. Nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage reported at 0%, the description carries the full burden and does so thoroughly: it explains the topic/pmids/chronicle_id mutual fallbacks, the max_events inheritance rule and default of 30, min/max_year scoping to topic mode, and enumerates all ten output values, noting which return JSON vs Markdown. This meaningfully exceeds anything the schema conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and artifact ('Build a persisted, versioned, evidence-backed Research Chronicle') and defines what a chronicle is (durable record of how a topic evolved). It explicitly positions itself against siblings, noting it 'replaces the older one-shot timeline tools' and is 'the single entry point for research-evolution work', so an agent can distinguish it from read_research_chronicle and build_citation_tree.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for each mode: topic mode for new searches, pmids='last' to reuse prior search results, and chronicle_id to 're-run the stored scope' as revision N+1 so the diff shows research movement. It does not explicitly state when NOT to use the tool or name read_research_chronicle as the read-only alternative, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_institutional_accessADestructiveIdempotent
Configure your institution's link resolver for full-text access.
═══════════════════════════════════════════════════════════════════════════════ 🏛️ INSTITUTIONAL ACCESS CONFIGURATION ═══════════════════════════════════════════════════════════════════════════════
This tool configures OpenURL link resolver integration, allowing you to access paywalled articles through your institution's library subscription.
Remote service callers may call this tool with no configuration arguments to inspect the operator-installed configuration, but cannot mutate the server-owned, deployment-wide OpenURL settings. Configure those at deployment time or from a trusted local server instead.
═══════════════════════════════════════════════════════════════════════════════ HOW IT WORKS: ═══════════════════════════════════════════════════════════════════════════════
Your library subscribes to journals through publishers
Library provides a "Link Resolver" service (SFX, 360 Link, Primo, etc.)
OpenURL passes article metadata to the resolver
Resolver checks your subscriptions and provides full-text access
═══════════════════════════════════════════════════════════════════════════════ USAGE: ═══════════════════════════════════════════════════════════════════════════════
Option 1: Use a preset (easiest) ───────────────────────────────── configure_institutional_access(preset="ntu")
Available presets:
台灣: "ntu" (台大), "ncku" (成大), "nthu" (清大), "nycu" (陽明交大)
美國: "harvard", "stanford", "mit", "yale"
英國: "oxford", "cambridge"
通用: "sfx", "360link", "primo" (需要 resolver_url)
Option 2: Custom URL ───────────────────── configure_institutional_access( resolver_url="https://your.library.edu/openurl" )
Option 3: Disable ───────────────────── configure_institutional_access(enable=False)
═══════════════════════════════════════════════════════════════════════════════ FINDING YOUR RESOLVER URL: ═══════════════════════════════════════════════════════════════════════════════
Go to your library's website
Look for "Find Full Text", "Link Resolver", or "OpenURL"
Or search: "[Your University] link resolver"
The URL usually looks like:
Args: resolver_url: Your institution's link resolver URL preset: Use a known institution's preset configuration enable: Whether to enable OpenURL links (default: True) Returns: Configuration status message
| Name | Required | Description | Default |
|---|---|---|---|
| enable | No | ||
| preset | No | ||
| resolver_url | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond annotations: remote service callers may call with no arguments to inspect operator-installed config but cannot mutate server-owned deployment-wide OpenURL settings, and enable defaults to True. It also discloses idempotence implicitly via the preset/config model. It doesn't spell out the full destructive implications for existing config, keeping it at 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the body is padded with ASCII-art banners and a multi-step 'how link resolvers work' explanation that an agent doesn't need to select or invoke the tool. Several sentences could be cut without losing invocation-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter mutation tool with no output schema, the description covers the key risks (server-owned settings, remote vs local mutation), the option space, and default behavior. It leaves the exact returned configuration status format vague, but the rest is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: the Args section plus usage examples explain resolver_url, preset (with the full preset list), and enable/disable semantics. It's strong compensation, though it doesn't note the enum values embedded in the schema pattern or URL length limit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (configure) and resource (institution's OpenURL link resolver for full-text access), and immediately clarifies the integration type and its purpose. An agent can distinguish this from siblings like diagnose_institutional_access or test_institutional_access.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly lays out three usage modes (preset, custom URL, disable) with example invocations, and notes that remote callers can inspect but not mutate deployment-wide settings. It doesn't explicitly name sibling alternatives such as list_resolver_presets or diagnose_institutional_access for related tasks, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_icd_meshARead-onlyIdempotent
Query the curated ICD/MeSH crosswalk in one explicit direction.
Use icd_to_mesh with one complete ICD-9-CM or ICD-10-CM code, or
mesh_to_icd with a MeSH term. The returned mapping is a limited
convenience crosswalk, not a substitute for a current licensed UMLS
terminology service.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | ||
| direction | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world). The description adds genuinely new context by disclosing the mapping's reliability limits — a "limited convenience crosswalk, not a substitute for a current licensed UMLS terminology service." Useful, though it says nothing about return shape or handling of unmapped codes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the purpose, then usage per direction, then the reliability caveat. No filler; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter conversion tool with no output schema, the description covers purpose, per-direction input semantics, and data limitations. It leaves the return format only loosely implied ("the returned mapping"), which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it does: it explains what ``value`` must contain for each ``direction`` (a complete ICD code vs. a MeSH term) and names both direction literals. It could add format examples, but it meaningfully compensates for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Query the curated ICD/MeSH crosswalk in one explicit direction." This is unambiguous and, since no sibling tool performs code/terminology conversion, an agent can immediately identify its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent per mode: use ``icd_to_mesh`` with a complete ICD-9-CM/ICD-10-CM code, or ``mesh_to_icd`` with a MeSH term. It stops short of a when-not to use the tool (beyond the UMLS caveat), so it falls just short of the top tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_pipelineADestructiveIdempotent
Permanently delete a saved pipeline configuration and execution history.
For the default tenant, any process-level schedule is removed only after the stored pipeline deletion succeeds. Isolated tenants never mutate the shared process scheduler.
Args: name: Name of the saved pipeline to delete.
Returns: Confirmation of deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds genuinely useful context beyond them: that execution history is destroyed (not just the config) and that process-level schedules are removed only after the deletion succeeds, with isolated tenants exempt from scheduler mutation. That is real side-effect disclosure the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the destructive action in the first sentence, then adds the tenant/scheduler caveat, then Args/Returns. Efficient and well-organized, though the tenant-scheduler sentence is somewhat more detailed than most callers need.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description covers the return ('Confirmation of deletion'), the scope of destruction, and the scheduler side effect. It is nearly complete for a single-parameter destructive tool; only name-discovery and irreversibility recovery guidance are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description only restates the obvious ('name: Name of the saved pipeline to delete'). It does not explain the naming constraints already implied by the schema (lowercase, pattern, 64-char limit) or how to discover valid names, so it adds little beyond a bare restatement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently delete a saved pipeline configuration and execution history'), which is enough to separate it from save_pipeline, list_pipelines, and load_pipeline. It does not explicitly contrast itself with the very similar unschedule_pipeline sibling, which also touches scheduling, so sibling differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the word 'Permanently' hints this is the irreversible removal path, but there is no explicit when-to-use/when-not guidance and no pointer to unschedule_pipeline for the case where the user only wants to cancel scheduling. The agent must infer the boundary between delete and unschedule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagnose_institutional_accessARead-onlyIdempotent
Diagnose why institutional fulltext access succeeds or fails for an article.
Runs up to three probes and reports each path's outcome:
Direct fetch (Phase 1, IP-aware) — follows
https://doi.org/<doi>and classifies whether the publisher served fulltext, a paywall, or a login page. Works automatically when your network IP is on the publisher's institutional allow-list (campus / VPN).EZproxy fetch (Phase 2, BYO-cookie) — rewrites the publisher hostname to your library's EZproxy host and replays your exported browser session cookie. Configured via env vars:
EZPROXY_HOST(e.g.ezproxy.lib.ntu.edu.tw)EZPROXY_COOKIE_FILE(path to browser-exported cookies.json)EZPROXY_ENABLED=1
OpenURL handoff — generated for you to open manually in a browser when the automated paths fail.
Usage: diagnose_institutional_access( source={"kind": "doi", "value": "10.1097/ALN.0000000000003599"} )
diagnose_institutional_access(
source={"kind": "pmid", "value": "38353755"},
try_ezproxy=False
)Args: source: Exactly one PMID or DOI. A PMID is resolved to a DOI when possible so direct and EZproxy probes can run. try_direct: Run the Phase 1 direct probe (default True). try_ezproxy: Run the Phase 2 EZproxy probe (default True).
Returns: Markdown report listing every probe's status, classification, and advice on the next action to take.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | ||
| try_direct | No | ||
| try_ezproxy | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/openWorld/non-destructive, and the description adds substantial behavior beyond them: the three probe phases, what each probe does with the DOI, that EZproxy requires exported browser cookies and specific env vars, and that it probes live external hosts. Auth and network prerequisites are disclosed, which is exactly the added value expected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose and organized into numbered phases plus a Usage block, so it is easy to scan. It is somewhat long and the docstring-style Args/Returns sections partly restate the schema, but each section contributes usable detail rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter diagnostic tool with no output schema, the description covers purpose, all probe phases, configuration prerequisites, and the markdown report it returns. The only notable gap is the absence of any pointer to the overlapping institutional-access siblings, which leaves an agent unsure of routing between them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the top-level parameters, so the description must carry the burden, and it does: it defines source (exactly one PMID or DOI, with the PMID-to-DOI resolution behavior explained), try_direct (Phase 1 toggle, default True), and try_ezproxy (Phase 2 toggle, default True). This adds real meaning — the resolution side effect — beyond the schema's bare booleans.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource ("Diagnose why institutional fulltext access succeeds or fails for an article") and enumerates the three probes it runs, so the agent knows exactly what it does. However, it never differentiates itself from closely related siblings such as test_institutional_access, configure_institutional_access, or get_institutional_link, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is well conveyed through two concrete invocation examples and clear preconditions (campus/VPN IP for Phase 1; EZPROXY_HOST/COOKIE_FILE/ENABLED for Phase 2; manual OpenURL when automated paths fail). There is no explicit when-not-to-use guidance or routing to the sibling tools that overlap this space, so it is clear context without alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_article_detailsBRead-onlyIdempotent
Fetch detailed information for one or more PubMed articles.
Args: pmids: PubMed IDs - accepts multiple formats: - "12345678" (single) - "12345678,87654321" (comma-separated) - "PMID:12345678" (with prefix) - ["12345678", "87654321"] (list) - '["12345678", "87654321"]' (JSON array string) - Newlines, semicolons, pipes, and Chinese separators are also accepted. Inputs are string-only and fail as a complete batch when any PMID is invalid.
Returns: Detailed information for each article.
| Name | Required | Description | Default |
|---|---|---|---|
| pmids | Yes | Explicit PMIDs; last is not supported. | |
| output_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so safety is covered. The description nonetheless adds a real behavioral trait beyond them: inputs are string-only and the whole batch fails if any single PMID is invalid — an all-or-nothing failure mode an agent must plan around.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The Args block is well organized and front-loads the key batch-failure constraint, but the long format enumeration partially duplicates the schema examples, and the 'Returns: Detailed information for each article' line is nearly tautological and adds little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the return value is described only as 'detailed information for each article', leaving the agent unsure what fields come back. Combined with no usage guidance, the definition is adequate for calling but thin on what to expect and when to choose it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at 50%, the description compensates well for the pmids parameter, enumerating single, comma-separated, prefixed, list, JSON-array-string forms plus newlines, semicolons, pipes and Chinese separators — more than the schema examples convey. It says nothing about output_format, which the schema's enum/default already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Fetch detailed information for one or more PubMed articles.' This is clear enough to distinguish from lookup-style siblings like get_fulltext or get_citation_metrics, though it never explicitly names what it is not versus those tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus alternatives such as get_fulltext (full text), get_citation_metrics (metrics), or get_article_figures. The description assumes the agent already knows it wants article metadata; there are no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_citing_articlesARead-onlyIdempotent
Find articles that cite a given PubMed article. Uses PubMed Central's citation data to find papers that reference this article.
═══════════════════════════════════════════════════════════════ 📈 FORWARD CITATION SEARCH (Impact Tracking) ═══════════════════════════════════════════════════════════════
Direction: Source Paper → Papers that cite it (FORWARD in time)
USE CASES: ──────────
🔬 Track research impact: Who built on this work?
📊 Find follow-up studies: What happened after this discovery?
🔄 Identify controversies: Papers that challenge or refute findings
📚 Literature review: Ensure you have the latest developments
COMPLEMENTARY TOOLS: ────────────────────
get_article_references(): BACKWARD search (what this paper cited)
find_related_articles(): Similar papers (topic-based, not citation-based)
═══════════════════════════════════════════════════════════════ EXAMPLE: ═══════════════════════════════════════════════════════════════
Find papers that cite a landmark CRISPR paper
find_citing_articles(pmid="23287718", limit=20) → Returns papers published AFTER 2012 that reference this work
Then analyze citation metrics
get_citation_metrics(pmids="last") → See which citing papers are most influential
Args: pmid: PubMed ID of the source article ("12345678" or "PMID:12345678"). limit: Maximum number of citing articles to return (1-100, default: 10).
Returns: List of citing articles with details.
| Name | Required | Description | Default |
|---|---|---|---|
| pmid | Yes | Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers. | |
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the safety profile is fully covered by structured data. The description reinforces the forward-in-time direction and notes the PubMed Central data source, which is mild added context. It does not add behavioral detail beyond annotations (no coverage notes, ordering, or pagination), so a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose well, but the heavy ASCII-banner formatting, emoji, and an EXAMPLE block that largely restates the usage section consume substantial space beyond the essential two-sentence purpose. Helpful but not tight; every line does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only lookup with no output schema, the description covers when to use it, the direction of the search, the data source, and both parameters. It lacks detail on result ordering/return fields, but annotations and the schema carry most remaining burden. Nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%. The description documents pmid (accepting '12345678' or 'PMID:12345678') and the limit range/default (1-100, default 10), which matches the schema even though the schema actually supports more formats (URLs, backticks). The description adds no syntax beyond the schema's own pmid description, so baseline 3 is right.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find articles that cite a given PubMed article') and explains the data source. It explicitly distinguishes itself from citation-based backward search (get_article_references) and topic-based search (find_related_articles), so an agent can route correctly among the many siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit use cases (impact tracking, follow-up studies, controversies, literature review) and a COMPLEMENTARY TOOLS section naming both alternatives with the condition that selects each. 'Direction: Source Paper → Papers that cite it (FORWARD in time)' unambiguously frames when to use this versus backward search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_search_queriesARead-onlyIdempotent
Gather search intelligence for a topic - returns RAW MATERIALS for Agent to decide.
This tool provides the BUILDING BLOCKS for search, not finished queries. The Agent decides how to use them.
══════════════════════════════════════════════════════════════════════ TWO USAGE MODES: ══════════════════════════════════════════════════════════════════════
MODE 1: KEYWORD SEARCH (single topic) ───────────────────────────────────── User: "搜尋 remimazolam 的文獻"
Step 1: generate_search_queries("remimazolam") Step 2: Build a Boolean query from returned materials Step 3: analyze_search_query(query="") Step 4: unified_search(query="")
══════════════════════════════════════════════════════════════════════
MODE 2: PICO SEARCH (clinical question) ─────────────────────────────────────── User: "remimazolam 在 ICU 鎮靜比 propofol 好嗎?會減少 delirium 嗎?"
Step 1: Agent extracts P/I/C/O from the clinical question, then calls validate_pico_plan(description=..., p=..., i=..., c=..., o=...) to validate the structured handoff and get a runnable PICO pipeline.
Step 2: For EACH PICO element, call generate_search_queries() IN PARALLEL: - generate_search_queries("ICU patients") → P materials - generate_search_queries("remimazolam") → I materials - generate_search_queries("propofol") → C materials - generate_search_queries("delirium") → O materials
Step 3: Combine materials using Boolean logic: High precision: (P_terms) AND (I_terms) AND (C_terms) AND (O_terms) Recall-oriented: (P_terms) AND (I_terms OR C_terms); validate against eligible seed papers
Step 4: Add Clinical Query filter if appropriate: - filters="clinical_query:therapy" → 治療效果比較 - filters="clinical_query:diagnosis" → 診斷相關 - filters="clinical_query:prognosis" → 預後相關 - filters="clinical_query:etiology" → 病因相關
Step 5: Validate the final query with analyze_search_query()
Step 6: Execute unified_search() with the final Boolean query══════════════════════════════════════════════════════════════════════
Features:
Spelling correction via NCBI ESpell
MeSH term lookup for standardized vocabulary
Synonym expansion from MeSH database
Query analysis: Shows how PubMed actually interprets each query (Agent's understanding vs PubMed's actual interpretation)
Args: topic: Search topic - can be a single keyword or PICO element strategy: Affects suggested_queries (if included) - "comprehensive": Multiple angles, includes reviews (default) - "focused": Adds RCT publication-type filter; study quality still requires appraisal - "exploratory": Broader search with more synonyms check_spelling: Whether to check/correct spelling (default: True) include_suggestions: Include pre-built query suggestions (default: True)
Returns: JSON with RAW MATERIALS: - corrected_topic: Spell-checked topic - keywords: Extracted significant keywords - mesh_terms: MeSH data with preferred terms and synonyms - all_synonyms: Flattened list of all synonyms - suggested_queries: Optional pre-built queries with: - estimated_count: How many results PubMed would return - pubmed_translation: How PubMed actually interprets the query
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | ||
| strategy | No | comprehensive | |
| check_spelling | No | ||
| include_suggestions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety and idempotency are covered. The description adds real behavioral context: reliance on external NCBI ESpell and MeSH services, the note that 'focused' adds an RCT publication-type filter but 'study quality still requires appraisal', and a detailed Returns breakdown. It stops short of stating rate limits or failure modes, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the Args/Returns blocks earn their place, but the two MODE walkthroughs are very long and largely re-document orchestration that overlaps the sibling tools' own descriptions (e.g. detailed PICO steps and filter syntax). The box-drawing formatting pads length without adding call-time clarity, so it is over-sized relative to the marginal value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 0% parameter description coverage, the description supplies everything needed: purpose, the two invocation patterns, full parameter semantics, and the exact JSON return fields including estimated_count and pubmed_translation. An agent can call this correctly and interpret the result without consulting other sources.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden, and it does: 'topic' is explained as 'a single keyword or PICO element', each 'strategy' enum value is given distinct meaning including the caveat that focused adds an RCT filter without guaranteeing quality, and check_spelling/include_suggestions are explained with their defaults. This fully compensates for the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening lines state a specific purpose — 'Gather search intelligence for a topic - returns RAW MATERIALS' and 'BUILDING BLOCKS for search, not finished queries' — and it expands this into concrete outputs (corrected_topic, keywords, mesh_terms, all_synonyms, suggested_queries). This clearly distinguishes it from siblings like unified_search (executes) and analyze_search_query (interprets), and even resolves the naming tension between 'generate_search_queries' and 'not finished queries'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It spells out two distinct usage modes with user-intent examples and explicit step-by-step routing to sibling tools (validate_pico_plan, analyze_search_query, unified_search), plus when to apply each clinical_query filter. An agent knows exactly when to pick keyword mode vs PICO mode and what to call next, so nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_article_figuresARead-onlyIdempotent
Get structured figure metadata (label, caption, image URL) and PDF links from a PMC Open Access article.
Returns all figures with their captions and direct image URLs, plus PDF download links for the complete article.
source is a discriminated identifier object, so the schema itself
requires exactly one explicit PMID or PMCID.
Args: source: {"kind":"pmcid","value":"PMC12086443"} or {"kind":"pmid","value":"40384072"}. include_subfigures: Parse sub-figures (e.g., Figure 3A, 3B) as separate entries. include_tables: Also extract tables rendered as images.
Returns: Structured figure data with image URLs, captions, and PDF links.
Example: get_article_figures(source={"kind":"pmcid","value":"PMC12086443"})
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | ||
| output_format | No | markdown | |
| include_tables | No | ||
| include_subfigures | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so safety and repeatability are covered. The description adds real value beyond that by disclosing the return contents (figure labels, captions, image URLs, PDF links) and the open-access-only limitation, though it says nothing about failure modes for non-OA articles or result limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in sentence one, then the Args/Returns/Example blocks are scannable and each line is actionable. There is minor duplication between the prose return sentence and the 'Returns:' block, but the structure is efficient for the amount of parameter complexity it must carry.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a small read-only tool with no output schema, the description covers the identifier format, the two optional extraction flags, and the shape of the result, which is what an agent needs to call it. The unmentioned output_format parameter and the absence of any behavior note for non-open-access input are the only remaining gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With top-level schema coverage at 0%, the description carries the load and does so for three of four parameters: it explains the discriminated source object with concrete PMID/PMCID examples, and clarifies include_subfigures and include_tables. The gap is output_format (markdown/json/toon, default markdown), which is never mentioned in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb, resource, and scope: structured figure metadata (label, caption, image URL) plus PDF links from a PMC Open Access article. That scope cleanly separates it from siblings like get_fulltext, search_biomedical_images, and prepare_figure_search without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied through the 'PMC Open Access article' constraint, which tells the agent this won't work for closed-access papers. There is no explicit statement of when to choose this over get_fulltext or prepare_figure_search, and no stated preconditions such as whether a prior resolve/lookup step is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_article_referencesARead-onlyIdempotent
Get the references (bibliography) of a PubMed article.
Returns the list of articles that this paper cites in its bibliography. This is the OPPOSITE of find_citing_articles:
get_article_references: Papers THIS article cites (backward in time)
find_citing_articles: Papers that cite THIS article (forward in time)
═══════════════════════════════════════════════════════════════ 📚 BACKWARD CITATION SEARCH (Foundation Discovery) ═══════════════════════════════════════════════════════════════
Direction: Source Paper → Papers it cited (BACKWARD in time)
USE CASES: ──────────
🏛️ Find foundational papers: Core works the field builds on
⚗️ Methodology sources: Papers describing techniques used
📖 Background reading: Build understanding of a topic
🔍 Verify claims: Check sources for specific assertions
═══════════════════════════════════════════════════════════════ EXAMPLE WORKFLOW: ═══════════════════════════════════════════════════════════════
Start with a recent review article
get_article_references(pmid="38123456", limit=50) → Get the bibliography of this review
Find most-cited foundational papers
get_citation_metrics(pmids="last", sort_by="citation_count") → Identify which references are the most influential
Read a foundational paper
fetch_article_details(pmids="12345678") → Get full details of an important reference
Args: pmid: PubMed ID of the source article ("12345678" or "PMID:12345678"). limit: Maximum number of references to return (1-100, default: 20).
Returns: List of referenced articles with details.
| Name | Required | Description | Default |
|---|---|---|---|
| pmid | Yes | Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers. | |
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered by structured data. The description adds directional semantics and a worked multi-tool workflow, but says nothing about error behavior for an invalid/unknown pmid, whether missing references yield an empty list, or pagination beyond the limit cap. With annotations carrying the behavioral load, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core statement is front-loaded and the example workflow genuinely helps an agent chain calls, but the ASCII banner blocks, emoji headings and repeated direction framing consume a large fraction of the text without adding decision-relevant content. Information is real but over-formatted for its size.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description gives only a thin return statement ('List of referenced articles with details'), but the direction, scoping, example chaining and error-free happy path make the tool callable correctly. A short note on return fields or empty-result behavior would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: pmid is richly documented in the schema (prefixes, URL form, backticks, rejection rules), while limit carries only bounds. The description restates pmid formats ('12345678' or 'PMID:12345678') and the limit range/default, both of which already appear in the schema, so it adds no meaning beyond the structured fields. Baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get the references (bibliography) of a PubMed article') and immediately positions it against a named sibling: 'This is the OPPOSITE of find_citing_articles'. The backward-vs-forward citation contrast lets an agent pick the right tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use categories (foundational papers, methodology sources, background reading, verifying claims) and an explicit alternative with the selecting condition (get_article_references = papers this article cites; find_citing_articles = papers that cite it). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_citation_metricsARead-onlyIdempotent
Get citation metrics from NIH iCite for articles.
Returns field-normalized citation data including:
citation_count: Total number of citations
relative_citation_ratio (RCR): Field-normalized metric (1.0 = average)
nih_percentile: Percentile ranking (0-100)
citations_per_year: Citation velocity
apt: Approximate Potential to Translate (clinical relevance 0-1)
Can sort and filter results by citation metrics.
Args: pmids: PubMed IDs - accepts multiple formats: - "12345678,87654321" (comma-separated) - ["12345678", "87654321"] (list) - '["12345678", "87654321"]' (JSON array string) - "PMID:12345678" (with prefix) - "last" to use PMIDs from the last search Batches are fail-closed and limited to 1,000 items before deduplication. sort_by: Metric to sort by: - "citation_count": Raw citation count (default) - "relative_citation_ratio": Field-normalized (recommended) - "nih_percentile": Percentile ranking - "citations_per_year": Citation velocity min_citations: Filter out articles with fewer citations min_rcr: Filter out articles with RCR below threshold (e.g., 1.0 = average) min_percentile: Filter out articles below percentile (e.g., 50 = top half)
Returns: Articles with citation metrics, sorted and filtered as requested. iCite transport or response failures return an explicit retryable error and are never rendered as an empty/unindexed result.
| Name | Required | Description | Default |
|---|---|---|---|
| pmids | Yes | ||
| min_rcr | No | ||
| sort_by | No | citation_count | |
| min_citations | No | ||
| output_format | No | markdown | |
| min_percentile | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered. The description adds real behavior beyond that: batching is fail-closed and capped at 1,000 items before deduplication, and iCite transport/response failures surface as an explicit retryable error rather than an empty result. Rate limits and auth requirements are not mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool returns, then Args, then Returns, using headers and bullets so an agent can scan it. The metric glossary earns its space because those fields are non-obvious, but the duplicated sort_by listing (once under returns, once under args) adds some redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly spends space explaining the return fields and their normalization, and it also covers batch limits and failure behavior for a 6-parameter, open-world tool. The omission of output_format and of any statement about ordering direction or result caps keeps it short of fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported as 0%, so the description carries the burden and mostly does: it documents the multiple PMID input formats (comma-separated, list, JSON array string, 'PMID:' prefix, 'last'), the batch cap, every sort_by enum value with meaning, and the semantics of min_citations/min_rcr/min_percentile with example thresholds. The one gap is output_format, which is never mentioned in the prose despite being a real enum parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get citation metrics from NIH iCite for articles') and enumerates exactly which metrics come back, including the meaning of each (RCR, nih_percentile, apt). It is clear what the tool does, but it never names or contrasts itself against plausible siblings such as find_citing_articles or build_citation_tree, leaving the agent to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: sorting/filtering is described, 'relative_citation_ratio' is marked recommended, and 'last' is noted as reusing PMIDs from the previous search. There is no explicit when-to-use/when-not guidance or named alternative for retrieving citation data by other means, so the agent must infer the context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_compound_detailsBRead-onlyIdempotent
Get detailed information about a compound by PubChem CID.
Args: cid: PubChem Compound ID
Returns: JSON with compound details including formula, SMILES, properties
| Name | Required | Description | Default |
|---|---|---|---|
| cid | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds value by stating the return payload contents (formula, SMILES, properties), but says nothing about error behavior for invalid CIDs or rate limits on the external PubChem service.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose followed by short Args/Returns blocks. No filler, though the Args/Returns labels are slightly heavy for a single-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read tool with no output schema, the description supplies enough: purpose, the parameter's meaning, and the shape of the return. The missing piece is routing guidance relative to search_compound.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load. It expands 'cid' into 'PubChem Compound ID', which is more than the bare string-typed schema property, but it omits the numeric-string format constraint captured only by the schema pattern.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get detailed information about a compound') and names the identifying key (PubChem CID). It does not distinguish itself from the sibling search_compound, but an agent can still tell what this tool does from the name and description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this over search_compound or get_compound_literature, nor any prerequisite or CID-acquisition note (e.g., you must first call search_compound). The agent is left to infer the workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_compound_literatureARead-onlyIdempotent
Get PubMed articles linked to a compound.
Uses NCBI's curated compound-to-publication links.
Args: cid: PubChem Compound ID limit: Maximum PubMed IDs to return (1-100)
Returns: JSON with linked PubMed IDs
| Name | Required | Description | Default |
|---|---|---|---|
| cid | Yes | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety and idempotence profile is covered. The description adds useful provenance (data comes from NCBI curated links, not free-text mining) but says nothing about pagination, behavior on zero results, or rate limits, so it is a modest addition rather than rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose in one sentence, then adds a provenance line and Args/Returns sections that each carry information not present in the 0%-coverage schema. Structure is clear, though the Args/Returns block is formulaic rather than tightly integrated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, explaining the return value ('JSON with linked PubMed IDs') is genuinely necessary and present, as is the data source and both parameter meanings. For a simple two-parameter lookup this is close to complete; only edge-case behavior (no links found, ordering) is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden, and it does: it identifies 'cid' as a PubChem Compound ID (the schema only gives a string pattern) and gives the 'limit' range of 1-100. It omits the default of 20 and any format/ordering semantics for the returned IDs, keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get PubMed articles linked to a compound') plus the mechanism ('NCBI's curated compound-to-publication links'). An agent can distinguish this from the analogous get_gene_literature and from general search tools like unified_search without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, when-not-to-use, or alternative tool guidance. It never clarifies the relationship to siblings like find_related_articles, get_compound_details, or search_compound, leaving the agent to infer the boundary from purpose alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fulltextA
🔥 Enhanced multi-source fulltext retrieval.
Automatically tries multiple sources to find the best fulltext:
Europe PMC (if PMC ID available)
Unpaywall (finds OA versions via DOI)
Institutional direct/EZproxy fetch (when DOI-backed and enabled)
CORE (open-access repository metadata and available text)
With extended_sources=True, also searches: 5. CrossRef (publisher links) 6. DOAJ (Gold OA journals) 7. Zenodo (research repository) 8. PubMed LinkOut (external providers) 9. Semantic Scholar, OpenAlex, arXiv, bioRxiv, medRxiv
source is a discriminated identifier object, so the schema itself
requires exactly one explicit PMID, PMCID, or DOI kind.
Args: source: One object such as {"kind":"pmid","value":"12345678"}, {"kind":"pmcid","value":"PMC7096777"}, or {"kind":"doi","value":"10.1001/jama.2024.1234"}. sections: Filter body sections (e.g., "introduction,methods,results"). Missing titles are reported with available sections; abstracts are never substituted for missing body evidence. include_pdf_links: Include PDF download links (default: True). False skips link enrichment when structured fulltext is already available. include_figures: Include figure metadata with image URLs (default: False) extended_sources: Search the extended downloader chain after the standard policy (default: False) output_format: Response format - "markdown" (default), "json", or "toon" allow_browser_session: Control browser-session fallback. - True: force broker fallback when configured - False: disable broker fallback - None: use auto mode from broker configuration
Returns: Fulltext content with PDF links from all available sources.
Example: get_fulltext(source={"kind":"pmcid","value":"PMC7096777"}) get_fulltext(source={"kind":"doi","value":"10.1038/s41586-021-03819-2"})
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | ||
| sections | No | ||
| output_format | No | markdown | |
| include_figures | No | ||
| extended_sources | No | ||
| include_pdf_links | No | ||
| allow_browser_session | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare openWorldHint=true, readOnlyHint=false and non-idempotent, and the description adds real behavioral context beyond them: the source fallback chain, the tri-state semantics of allow_browser_session, and the guarantee that abstracts are never substituted for missing body evidence. It omits rate limits, permissions, or failure behavior, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a one-line purpose, then a numbered source chain, then Args and examples. Slightly long because the extended source list and two near-duplicate examples consume space, but every section is scannable and earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with no output schema and no annotation-specified return format, the description covers inputs thoroughly and briefly states the return (fulltext content with PDF links). A short note on failure modes when no source yields fulltext would complete it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does so: it defines the discriminated source object with three concrete examples, explains sections filtering and its missing-title reporting, and gives the default plus purpose of include_pdf_links, include_figures, extended_sources, output_format, and the allow_browser_session tri-state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (multi-source fulltext retrieval) and distinguishes itself from siblings like fetch_article_details or get_article_figures by describing the retrieval/fallback chain rather than metadata lookup. An agent can tell what it returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the standard retrieval order and exactly when to enable extended_sources (searching the extended downloader chain after standard policy) and when to disable include_pdf_links. It does not explicitly name sibling alternatives such as fetch_article_details, so routing between tools is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gene_detailsARead-onlyIdempotent
Get detailed information about a gene by NCBI Gene ID.
Args: gene_id: NCBI Gene ID (from search results or known)
Returns: JSON with gene details including symbol, name, summary, location
| Name | Required | Description | Default |
|---|---|---|---|
| gene_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered without the text. The description adds the return shape (symbol, name, summary, location), but says nothing about behavior for invalid/unknown gene IDs, rate limits, or external NCBI dependency despite openWorldHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose followed by Args and Returns sections; every line earns its place with no filler or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the Returns block usefully enumerates the JSON fields an agent can expect. Minor gap: no mention of error/missing-gene behavior, which matters for a single-required-param lookup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the schema only conveys the type and a regex pattern, not meaning. The description compensates by defining gene_id as an NCBI Gene ID and indicating where to obtain it, which is more than the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get detailed information') and resource ('a gene') keyed by NCBI Gene ID. It is clearly distinguishable from the search_gene sibling by the 'details vs search' distinction, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(from search results or known)' implies the ID comes from a prior search, which is a useful workflow hint. However, it does not state when to use this over search_gene or get_gene_literature, nor any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gene_literatureARead-onlyIdempotent
Get PubMed articles linked to a gene.
This uses NCBI's curated gene-to-publication links, which are more precise than keyword searches.
Args: gene_id: NCBI Gene ID limit: Maximum PubMed IDs to return (1-100)
Returns: JSON with linked PubMed IDs
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| gene_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld). The description adds the data provenance (NCBI curated links over keyword search), which is useful for interpreting result trust, but says nothing about auth, rate limits, or truncation behavior. With annotations doing the heavy lifting, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose, then concise provenance note, then Args/Returns blocks. Every line earns its place and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly states the return shape ('JSON with linked PubMed IDs'), and annotations cover safety. Both parameters are documented, so an agent has what it needs; only edge-case behaviors remain unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and mostly does: it clarifies gene_id is an NCBI Gene ID (not a symbol) and gives limit's meaning and 1-100 bound. It still doesn't explain the format constraint on gene_id beyond the schema pattern, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get PubMed articles linked to a gene') and explicitly contrasts itself with keyword-based retrieval, so an agent can separate it from unified_search. It does not name or distinguish itself from other article-linking siblings like find_related_articles, so it falls just short of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when this tool is the right choice: when you want curated gene-to-publication links rather than keyword matches. No explicit when-not conditions or prerequisites are stated, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_institutional_linkARead-onlyIdempotent
Generate institutional access link (OpenURL) for an article.
═══════════════════════════════════════════════════════════════════════════════ 🔗 GET LIBRARY ACCESS LINK ═══════════════════════════════════════════════════════════════════════════════
Generate an OpenURL that will take you through your library's link resolver to access the full text of an article.
PREREQUISITES: ───────────────── Must first call configure_institutional_access() to set up your resolver.
USAGE: ─────────────────
With PMID (easiest): get_institutional_link( source={"kind": "pmid", "value": "38353755"} )
With DOI: get_institutional_link( source={"kind": "doi", "value": "10.1001/jama.2024.1234"} )
With full metadata (most reliable): get_institutional_link( source={ "kind": "metadata", "title": "Some Article Title", "journal": "JAMA", "year": 2024, "volume": "331", "issue": "1", "pages": "45-52" } )
Args: source: Exactly one explicit PMID, DOI, or bounded metadata object.
Returns: OpenURL link or error message
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false. The description adds the prerequisite dependency on configure_institutional_access, which is useful behavioral context beyond annotations. It also notes the return is a link or error message.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections, but it includes decorative ASCII art and emojis that add length without informational value. The core content is efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the parameter (a discriminated union with multiple formats) and the lack of schema descriptions, the description provides complete information needed to call the tool correctly, including prerequisites, formats, and return type.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must clarify the parameter. It does so thoroughly by showing three different formats for the 'source' parameter with concrete examples, explaining that exactly one explicit PMID, DOI, or bounded metadata object is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: generating an OpenURL institutional access link for an article. It clearly distinguishes itself from siblings like configure_institutional_access or test_institutional_access by focusing on link generation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It includes a PREREQUISITES section requiring configure_institutional_access(), and provides concrete usage examples for PMID, DOI, and metadata. It doesn't explicitly state when not to use it, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pipeline_historyARead-onlyIdempotent
Get execution history for a saved pipeline.
Shows past execution results with diff analysis: which articles are new compared to the previous run.
Args: name: Name of the saved pipeline. limit: Maximum number of history entries to return (default: 5).
Returns: Execution history with date, article count, new/removed articles, status.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds genuine behavioral value beyond that: it explains the diff-analysis semantics (new/removed articles vs. the previous run) and the shape of returned data, which is not derivable from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a one-line purpose, then Args and Returns sections. Every element earns its place; the only minor overhead is the conventional docstring scaffolding, which is still efficient and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fills the gap by describing the return contents (date, article count, new/removed articles, status). Annotations cover the safety profile and both parameters are addressed, making it largely complete, though the name-pattern constraint and absence of pagination guidance are minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load. It documents both parameters, including the limit default of 5, which the schema also encodes. However, it does not explain the name pattern (lowercase slug, max 64 chars) or the limit bounds (1-100), leaving format constraints undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Get execution history for a saved pipeline') and clarifies scope ('for a saved pipeline'), which distinguishes it from pipeline-management siblings like save_pipeline, list_pipelines, and delete_pipeline. It does not explicitly name any sibling, but the read-only history focus is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use guidance or alternatives are given. The phrase 'for a saved pipeline' implies the pipeline must already exist, but the description never says to use list_pipelines first, nor when this is preferred over any other tool. Usage is only weakly inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_text_mined_termsBRead-onlyIdempotent
Get text-mined annotations from Europe PMC.
Returns entities extracted from the article text including genes, diseases,
chemicals, organisms, and more. source is exactly one PMID or PMCID.
Args: source: {"kind":"pmid","value":"12345678"} or {"kind":"pmcid","value":"PMC7096777"}. semantic_type: Filter by entity type. Options: - "GENE_PROTEIN": Genes and proteins - "DISEASE": Diseases and conditions - "CHEMICAL": Drugs and chemicals - "ORGANISM": Species and organisms - "GO_TERM": Gene Ontology terms - None: Return all types (default)
Returns: List of text-mined entities with counts and sections.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | ||
| output_format | No | markdown | |
| semantic_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered. The description adds the useful constraint that source is 'exactly one PMID or PMCID' and sketches the return content ('counts and sections'), but says nothing about rate limits, coverage gaps, or failure behavior for non-indexed articles.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: the core purpose is the first sentence, followed by cleanly separated Args and Returns blocks. Slight redundancy between the prose list of entity types and the bulleted semantic_type options, but nothing egregious.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does sketch the return ('List of text-mined entities with counts and sections'), and annotations cover safety. However, one of three parameters (output_format) is undocumented and the semantic_type list is incomplete, leaving gaps an agent must guess at.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the parameter burden. It documents the source discriminator shape and gives human-readable labels for semantic_type values, but it omits the enum member 'EFO' present in the schema and never mentions the output_format parameter (markdown/json/toon) at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get text-mined annotations from Europe PMC') plus the scope of what is extracted (genes, diseases, chemicals, organisms). An agent can distinguish it from general article tools like fetch_article_details, though it never names a sibling alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the mechanics of the call (one PMID or PMCID, optional semantic_type filter) but never says when to reach for this tool versus fetch_article_details, search_gene, or get_gene_literature. No exclusions or prerequisites for the operation itself are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pipelinesARead-onlyIdempotent
List all saved pipeline configurations.
Args: tag: Filter by tag (e.g., "sedation"). Empty = show all. scope: Filter by scope: "workspace", "global", or "" (show all).
Returns: Table of saved pipelines with name, scope, description, tags.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| scope | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so safety is covered. The description adds the return shape (table with name, scope, description, tags), which is useful behavioral context, but says nothing about ordering, pagination, or limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose followed by a compact Args/Returns block. Every line earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape, and both param semantics are documented. Only minor gaps remain (no ordering/pagination/limits, no sibling routing).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the params—and it does: tag (filter, empty=show all) and scope ('workspace'/'global'/''=show all). This fully maps to both parameters and clarifies the empty-string sentinel semantics the schema only implies via defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear specific verb+resource: 'List all saved pipeline configurations.' An agent immediately knows this is a read/list operation. However it does not distinguish itself from siblings like get_pipeline_history, load_pipeline, or list_resolver_presets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the filtering args (tag/scope) but there is no explicit statement of when to use this vs load_pipeline, get_pipeline_history, or save_pipeline. No prerequisites noted (e.g., workspace context).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_resolver_presetsARead-onlyIdempotent
List available institutional link resolver presets.
═══════════════════════════════════════════════════════════════════════════════ 📚 AVAILABLE RESOLVER PRESETS ═══════════════════════════════════════════════════════════════════════════════
These presets contain pre-configured URLs for common institutions. Use them with configure_institutional_access(preset="name").
Returns: List of available presets with URLs
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, idempotent, non-destructive, closed-world listing tool. The description adds useful context about what the presets are and that the return value includes preset URLs, which matters because there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The substantive content is short and front-loaded, but the large ASCII banner and emoji add visual noise without conveying additional information. The core sentences earn their place, while the decorative formatting does not.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool with annotations covering safety and no output schema, the description adequately says what is returned: available presets with URLs. It could be slightly more precise about return structure, but it is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
This tool takes zero parameters, so the baseline is 4. The description does not need to explain parameter semantics, and it does not introduce any confusion about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List available institutional link resolver presets.' It also names the related sibling configure_institutional_access, which helps an agent distinguish listing presets from configuring access.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by saying presets should be used with configure_institutional_access(preset="name"), but it does not explicitly say when to call this tool versus alternatives or when not to use it. The intended follow-up workflow is clear, but direct invocation guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_pipelineARead-onlyIdempotent
Load a pipeline configuration for review or editing.
Loads from either source:
Saved name: "weekly_remimazolam" or "saved:weekly_remimazolam"
Local-only file: "file:path/to/pipeline.yaml" (disabled for authenticated service callers)
The returned YAML can be reviewed, modified, and then:
Executed directly: unified_search(pipeline="")
Saved with changes: save_pipeline(name="...", config="")
Args: source: Pipeline source identifier (see above).
Returns: Full pipeline YAML content + metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as readOnly, idempotent, and non-destructive. The description adds useful behavioral details beyond those annotations, including the two supported source formats, the restriction on local-only files for authenticated service callers, and the fact that the returned YAML can be passed onward to unified_search or save_pipeline. This gives agents a clearer model of what happens after load.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core purpose, followed by source formats, usage examples, and return behavior. It is slightly longer than strictly necessary because the Args/Returns formatting partially duplicates information already in the schema, but every section adds practical value for correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (one parameter), the description is nearly complete: it covers source variants, an important auth-related limitation, and the return value. It could arguably mention that list_pipelines can be used to discover valid saved names, but this is not essential for calling the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema only defines 'source' as a string with length constraints. The description fully compensates by explaining the accepted source formats with examples ('saved:weekly_remimazolam' and 'file:path/to/pipeline.yaml') and by clarifying the authentication restriction on file paths. This adds substantial meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Load a pipeline configuration for review or editing.' It clearly differentiates the load action from sibling tools like save_pipeline, delete_pipeline, and list_pipelines, and explains the two source types. The purpose is immediately understandable and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when this tool is appropriate: when a pipeline configuration needs to be reviewed, edited, or prepared for execution or saving. It also provides an explicit exclusion: local-only file sources are disabled for authenticated service callers. It does not explicitly name alternatives to avoid, but the workflow notes referencing unified_search and save_pipeline provide strong situational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_exportA
Export citations to reference manager formats.
╔═══════════════════════════════════════════════════════════════════╗ ║ RECOMMENDED: Use source="official" (default) for best quality ║ ╚═══════════════════════════════════════════════════════════════════╝
When to Use
Exporting references to EndNote, Zotero, Mendeley
Creating BibTeX for LaTeX documents
Generating citation lists for manuscripts
Source Options
Source | Formats | Quality | Speed |
official | ris, medline, csl | ★★★★★ | Fast |
local | ris, bibtex, csv, medline, json | ★★★★ | Fast |
Format Selection Guide
ris: EndNote, Zotero, Mendeley (official recommended)
medline: NBIB format for PubMed tools
csl: JSON for programmatic citation styling
bibtex: LaTeX documents (local only)
csv: Data analysis, Excel (local only)
Args: pmids: Articles to export. Accepts: - "last" → results from previous search - "12345678,87654321" → comma-separated PMIDs - ["12345678", "87654321"] → list of PMIDs - '["12345678", "87654321"]' → JSON array string - "PMID:12345678" → with prefix format: Export format (default: "ris") - official API: ris, medline, csl - local only: bibtex, csv, json include_abstract: Include abstracts in output (default: True). False requires source="local"; official payloads are returned unmodified. source: Citation source (default: "official") - "official": NCBI Citation API (recommended, best quality) - "local": Local formatting (more formats, offline capable)
Returns: JSON with status and export_text containing formatted citations.
Examples: # Export last search results (recommended) prepare_export(pmids="last", format="ris")
# Export specific PMIDs to BibTeX
prepare_export(pmids="12345678,87654321", format="bibtex", source="local")
# Get CSL-JSON for programmatic use
prepare_export(pmids="last", format="csl", source="official")
| Name | Required | Description | Default |
|---|---|---|---|
| pmids | Yes | ||
| format | No | ris | |
| source | No | official | |
| include_abstract | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, open-world, non-idempotent operation, and the description adds real behavioral context beyond them: include_abstract=False requires source='local' because official payloads are returned unmodified, local is offline capable, and the return shape is status + export_text. It stops short of explaining latency, rate limits, or side effects that justify readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded with the recommended-default callout, then organized into scannable sections (When to Use, Source Options, Format Selection) and ended with runnable examples. It is long, and the box-drawing banner is decorative overhead, but nearly every line carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with no output schema, the description covers input formats, defaults, valid parameter combinations, offline vs API behavior, and the return payload shape. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported as 0%, so the description carries the full burden and does so thoroughly: accepted pmids encodings (last, comma-separated, list, JSON array string, PMID: prefix), the meaning of each format enum value, the include_abstract default and its source constraint, and the source trade-offs. This is exactly the compensation the low schema coverage requires.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Export citations to reference manager formats') up front, and the format/source tables make clear it produces formatted citation text rather than fetching or analyzing records. An agent can distinguish it from get_citation_metrics or fetch_article_details without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to Use' list names the concrete scenarios (EndNote/Zotero/Mendeley, BibTeX for LaTeX, manuscript citation lists), and the source/format tables give guidance on which option to pick and when. It also flags a hard constraint (bibtex/csv/json require source='local') so the agent can avoid invalid combinations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_figure_searchARead-onlyIdempotent
Analyze a scientific figure or image for literature search.
═══════════════════════════════════════════════════════════════════════ 🔬 VISION-TO-LITERATURE SEARCH (Experimental) ═══════════════════════════════════════════════════════════════════════
This tool enables searching for scientific literature based on images.
WORKFLOW (the host agent performs the analysis and search): ─────────────────────────────────────────────────────────
Provide an image (URL or base64-encoded)
This tool returns the image using MCP ImageContent protocol
YOU (the Agent) analyze the image using your vision capabilities
Extract relevant ENGLISH search terms from the image
Call
search_biomedical_images()orunified_search()with extracted terms when literature retrieval is within the user-requested scopeReturn both the analysis and search results to the user
⚠️ IMPORTANT RULES: ────────────────
ALL search queries must be in ENGLISH (Open-i requirement)
This tool returns an image and guidance; it does not invoke a vision model
The host agent controls any subsequent search within its permissions
If the image shows a medical condition, extract the medical term in English
SEARCH TYPES: ─────────────
"comprehensive": General analysis, extract all relevant terms (default)
"methodology": Focus on methods, equipment, techniques shown
"results": Focus on data, graphs, statistical findings
"structure": Focus on molecular/chemical structures
"medical": Focus on clinical/medical imaging findings
USE CASES: ──────────
📊 Scientific figures → Find papers with similar data/charts
🔬 Microscopy images → Find related research
🧬 Molecular structures → Find papers about the compound
📈 Graphs/plots → Find papers with similar analyses
🏥 Medical images → Find case reports or clinical studies
⚗️ Lab equipment → Find methodology papers
IMPORTANT: ────────── Image observations are search hypotheses that require source verification. Follow the user-requested scope and the host agent's execution rules. Use English medical terminology in all search queries.
Args: source: Exactly one typed image source: {"kind": "base64", "data": "data:image/png;base64,..."} or {"kind": "url", "url": "https://example.org/figure.png"}. context: Optional context about what to look for in the image search_type: Type of analysis focus (comprehensive/methodology/results/structure/medical)
Returns: List containing: - ImageContent: The image for you to analyze - TextContent: Instructions for next steps
Example: prepare_figure_search(source={"kind": "url", "url": "https://example.com/figure1.png"}) prepare_figure_search( source={"kind": "base64", "data": "data:image/png;base64,iVBORw0..."} )
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | ||
| context | No | ||
| search_type | No | comprehensive |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, but the description adds substantial behavior beyond that: it returns ImageContent plus TextContent, does NOT invoke a vision model, imposes an English-only query constraint (Open-i requirement), and notes the host agent controls any subsequent search within its permissions. These are exactly the behavioral facts an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The workflow is well front-loaded and scannable, but the block is heavy with ASCII rules and emoji, and several points are restated — the English-only requirement appears in both IMPORTANT RULES and IMPORTANT, and the 'follow user-requested scope' idea is repeated. Some USE CASES bullets duplicate the SEARCH TYPES section, so not every line earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description fully explains the return payload (ImageContent + TextContent) and the post-call workflow, and it documents all three parameters. An agent has everything needed to call it and to interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it does: it shows concrete source shapes for both base64 and URL kinds, describes context as 'what to look for in the image', and enumerates the meaning of each search_type value. It stops short of syntax-level detail (URL bounds, base64 size limits) but covers the semantic intent of all three parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Analyze a scientific figure or image for literature search') and immediately clarifies the actual mechanism — it returns the image via MCP ImageContent rather than performing the search itself. This distinguishes it cleanly from siblings like search_biomedical_images and unified_search, which it names explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit numbered workflow, states when to invoke (image provided, literature retrieval in scope), names the exact follow-up tools (search_biomedical_images(), unified_search()), and even gives the condition for the next step. Nothing about when/when-not to use it is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_research_chronicleARead-onlyIdempotent
Read stored Research Chronicles: load, list, diff, narrate, analyze, compare.
This is the read facade over chronicles created by
build_research_chronicle. Chronicles persist across sessions, so you
can revisit a topic weeks later and see precisely what moved. Because the
evidence is already stored, analysis and comparison are instant and do
not re-run any search.
Actions:
"load": read one revision (defaults to latest) in any output format
"list": list stored chronicles, most recently updated first
"diff": compare two revisions — added, not observed/removed from the later view, and updated entries, plus evidence churn, branch churn, and the audit status transition. Absence does not prove retirement.
"narrate": render evidence-backed Markdown where every claim carries its entry ID and article identifiers
"milestones": entry-type and status distribution, per-year activity, evidence quality, and landmark entries for one chronicle
"compare": compare 2-5 chronicles side by side, including the evidence articles they share
The required request discriminator makes invalid field combinations
unrepresentable. compare takes one typed selection containing
either 2-5 topic strings or 2-5 Chronicle IDs.
Returns: Markdown or JSON text depending on the action and output format.
Examples: read_research_chronicle(request={"action":"list"}) read_research_chronicle(request={"action":"load","chronicle_id":"remimazolam-9f2b1c4d","output":"tree"}) read_research_chronicle(request={"action":"diff","chronicle_id":"remimazolam-9f2b1c4d","from_revision":1}) read_research_chronicle(request={"action":"narrate","chronicle_id":"remimazolam-9f2b1c4d","mode":"full"}) read_research_chronicle(request={"action":"milestones","chronicle_id":"remimazolam-9f2b1c4d"}) read_research_chronicle(request={"action":"compare","selection":{"kind":"topics","values":["remimazolam","propofol"]}})
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds genuine context beyond that: chronicles persist across sessions, analysis/comparison are instant and re-run no search, and the diff caveat 'Absence does not prove retirement' warns against over-reading removal results. It omits any pagination or sizing detail for large chronicles.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then a scannable per-action list, then interface notes and examples — well organized and mostly waste-free. Minor deduction: the lead sentence advertises an 'analyze' action that does not exist in the discriminator (the real actions are load/list/diff/narrate/milestones/compare), a small internal inconsistency in an otherwise tight layout.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-action, heavily nested discriminated-union tool with no output schema, the description covers every action, the selection shape, the return medium ('Markdown or JSON text depending on the action and output format'), and provides a call example per action. Nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is effectively 0% at the wrapper level (only fragments like 'Positive Chronicle revision' exist), so the description must compensate. It explains that the `request` discriminator makes invalid field combinations unrepresentable, that `compare` takes a typed `selection` of either 2-5 topics or 2-5 Chronicle IDs, and it points at output formats and narrate modes — meaningful semantics the schema alone does not spell out.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line names a specific verb (read) and resource (stored Research Chronicles) and enumerates the six actions, then names the sibling that creates them (`build_research_chronicle`). An agent can distinguish this read facade from the build tool and from the other read tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each action is paired with a condition that selects it (load = one revision, list = stored chronicles, diff = compare two revisions, compare = 2-5 chronicles side by side), and the text routes creation to `build_research_chronicle`. It stops short of explicit 'use X instead of Y' exclusions or prerequisites, but the per-action framing gives clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_sessionARead-onlyIdempotent
Read session data through one schema-exact discriminated request.
Actions:
pmids: return PMIDs for one recorded search
article: return one cached article payload
summary: return current session summary and optional history
list_artifacts: list persistent MCP output artifact manifests
artifact: read one persistent artifact by artifact_id or artifact_uri
search_runs: list durable unified_search run envelopes
search_run: read one run by stable run_id
replay_search: return credential-free unified_search replay arguments
Each action accepts only its own fields. For remote artifact reads, select an artifact_id or artifact_uri locator and use artifact_file plus offset/max_chars to page through large files. Local paths remain redacted unless both include_local_paths and the server setting allow them.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/non-destructive, so the bar is lower; the description still adds genuine value by disclosing the redaction policy for local paths (requires include_local_paths plus a server setting) and that replay_search returns credential-free arguments. It omits return-shape and pagination-bound behavior, but the security disclosure is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose in one sentence, then a tight bulleted action index, then a short paragraph of edge-case rules. The bullets partly restate schema discriminants, but for a 9-way union the index earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, so the description carries return-shape burden, and it never says what each action returns beyond a phrase. Most critically, it omits the schema's 'log' action, leaving an agent that reads only the description blind to one valid mode of a highly complex discriminated union.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% at the top level, so the description must compensate — it does for only a handful of fields (locator, artifact_file, offset/max_chars, include_local_paths). Many discriminants (event_limit, history_limit, query_filter, search_index, status, run_id, kind, tool) get no semantic gloss.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The lead sentence names a specific verb+resource ('Read session data') and the bulleted action list concretely enumerates the read modes (pmids, article, summary, artifacts, search runs, replay). However the enumeration is incomplete — the schema's 'log' action is never mentioned — and nothing distinguishes this from siblings like read_research_chronicle or fetch_article_details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is implied usage ('Each action accepts only its own fields') and a conditional instruction for artifact reads (choose artifact_id vs artifact_uri, page with artifact_file/offset/max_chars), but no explicit statement of when to call read_session versus unified_search, fetch_article_details, or read_research_chronicle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_literature_notesADestructive
Save searched articles as guided local wiki/Foam/Markdown notes.
When to Use
After unified_search, persist the selected literature into a local note library.
Give agents a structured alternative to generic write_file calls.
Create wiki notes with Foam-compatible wikilinks, MedPaper-like reference notes, and frontmatter.
Use stable wiki/Foam link targets and return wiki_validation for unresolved-link checks.
Local Directory Resolution
output_dir argument, if provided
PUBMED_NOTES_DIR environment variable
PUBMED_WORKSPACE_DIR/references
PUBMED_DATA_DIR/references
Authenticated Service Boundary
Remote authenticated callers cannot choose output_dir or template_file. Their notes always go to references/ under the current tenant's installed SessionManager data root; process-wide notes/workspace environment paths are intentionally ignored.
Args: pmids: Articles to save. Accepts "last", delimited PMID text, a string array, or a JSON array string. output_dir: Optional target folder for notes. note_format: "wiki" (default, Foam-compatible), "foam", "markdown", or "medpaper". include_abstract: Include abstracts in article notes. overwrite: Overwrite existing per-article notes when filenames collide. create_index: Create a collection index note linking saved articles. collection_name: Optional title/file stem for the index note. template_file: Optional Markdown template with placeholders like {title}, {pmid}, {citation_key}. include_csl_json: Write references.csl.json beside notes for citation-manager handoff.
Returns: JSON with written/skipped files, index information, and wiki_validation. Local callers receive filesystem paths. Authenticated callers receive tenant-relative logical locators and never receive server host paths.
Examples: save_literature_notes(pmids="last") save_literature_notes(pmids="last", note_format="medpaper", output_dir="./references") save_literature_notes(pmids="12345678,87654321", template_file="./ref-template.md")
| Name | Required | Description | Default |
|---|---|---|---|
| pmids | No | last | |
| overwrite | No | ||
| output_dir | No | ||
| note_format | No | wiki | |
| create_index | No | ||
| template_file | No | ||
| collection_name | No | ||
| include_abstract | No | ||
| include_csl_json | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and openWorldHint=true, and the description goes well beyond that: it discloses the four-step directory resolution order, the authenticated-service boundary where remote callers cannot set output_dir/template_file and env paths are ignored, and the filename-collision overwrite semantics. These are non-obvious behaviors an agent could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Headings (When to Use, Local Directory Resolution, Authenticated Service Boundary, Args, Returns, Examples) make it easy to scan and the critical scoping info is front-loaded. It runs somewhat long and repeats the format list in both prose and Args, but nearly every line carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation tool with no output schema, the description covers destination resolution, tenant/auth constraints, overwrite behavior, and even the return shape (written/skipped files, index info, wiki_validation, path vs. logical locator). An agent has everything needed to call it correctly in both local and authenticated contexts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and largely does: the Args block defines all nine parameters, explains note_format semantics ('wiki' default, Foam-compatible), and gives template placeholder examples ({title}, {pmid}, {citation_key}). A few entries remain thin (output_dir is only 'Optional target folder'), but overall it compensates well for the empty schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+output artifact: 'Save searched articles as guided local wiki/Foam/Markdown notes.' It immediately distinguishes itself from siblings like prepare_export and generic write_file, and the note_format vocabulary (wiki/foam/markdown/medpaper) tells an agent exactly what this produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to Use' block gives explicit sequencing ('After unified_search, persist the selected literature') and names the alternative it replaces ('a structured alternative to generic write_file calls'). It also states the specific capability (Foam wikilinks, wiki_validation) that selects this tool over a plain file write.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_pipelineADestructive
Save a pipeline configuration for later reuse.
The config format is identical to unified_search's pipeline parameter (YAML or JSON). Saved pipelines can be loaded later by name: unified_search(pipeline="saved:weekly_remimazolam")
Args: name: Unique identifier (alphanumeric + hyphens/underscores, max 64 chars). Overwrites if name already exists (upsert semantics). config: Pipeline YAML/JSON string. Same format as unified_search pipeline param. tags: Bounded array of canonical tags (e.g., ["anesthesia", "sedation"]). description: Human-readable description of the pipeline's purpose. scope: Storage scope - "workspace" (project-level, git-trackable), "global" (user-level, cross-project), or "auto" (workspace if available, otherwise global). Default: "auto".
Returns: Confirmation with pipeline metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| tags | No | ||
| scope | No | auto | |
| config | Yes | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=true), the description explains that saving overwrites an existing name (upsert semantics) and details storage scope semantics — workspace is git-trackable, global is cross-project, auto resolves at runtime. It does not cover permissions/errors, and the upsert language sits in mild tension with idempotentHint=false, but the destructive behavior itself is disclosed clearly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-line purpose, then uses Args/Returns structure with a compact usage example. Mostly efficient; the inline example and the repeated 'same format as unified_search pipeline param' remark cost a little redundancy but each earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the 'Returns: Confirmation with pipeline metadata' line is a reasonable (if thin) return note, and the description covers format, naming, tags, scope, and overwrite behavior for a 5-parameter mutation tool. Only operational details like permission requirements or failure modes are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry all parameter meaning, and it does: name format/limits plus overwrite behavior, config format equivalence, tags as a bounded array of canonical tags with examples, description purpose, and all three scope values with defaults. This is a strong compensation for an undocumented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Save a pipeline configuration') plus scope ('for later reuse'), and it distinguishes itself from siblings by naming the load path (unified_search(pipeline="saved:...")) and implying the inverse of load_pipeline/delete_pipeline. An agent can tell instantly what this does and how saved data flows back into unified_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: the config format matches unified_search's pipeline parameter, pipelines are reusable by name, and the example shows the round trip. It stops short of explicit when-to-use/when-not rules against neighbors such as schedule_pipeline or list_pipelines, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_pipelineBDestructive
Schedule a saved pipeline for periodic execution.
Args: name: Saved pipeline name. cron: Required 5-field cron expression. Example: "0 9 * * 1" (Mon 9am). diff_mode: When True, store diff-mode preference with the schedule. notify: When True, store notify preference with the schedule.
Returns: Schedule confirmation or removal result.
| Name | Required | Description | Default |
|---|---|---|---|
| cron | Yes | ||
| name | Yes | ||
| notify | No | ||
| diff_mode | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, openWorldHint=true, and idempotentHint=false, so the safety profile is largely covered. The description adds useful behavioral detail about storing diff-mode and notify preferences and returning a confirmation, but it does not explain authorization needs, what exactly is destroyed or replaced, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a one-line summary followed by structured Args and Returns sections, with no wasted prose. The vague 'removal result' clause slightly weakens an otherwise efficient structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive scheduling tool with four parameters and no output schema, the description covers parameter meanings and a basic return type, and the annotations supply safety hints. However, it omits when to choose this tool over unschedule_pipeline and leaves the 'removal result' ambiguous, so an agent still lacks some routing and outcome clarity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden of explaining parameters. It successfully documents all four parameters, including a concrete cron example and the meaning of diff_mode/notify preference storage, though it does not elaborate on the name pattern or boolean-string nuance already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Schedule') and resource ('saved pipeline') with the scope 'periodic execution,' making the core action clear. However, the later phrase 'removal result' introduces ambiguity with the sibling tool unschedule_pipeline, preventing perfect clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by saying it schedules a saved pipeline, but it offers no explicit when-to-use guidance, no exclusions, and no mention of the alternative unschedule_pipeline for removing schedules. An agent must infer the routing from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_biomedical_imagesARead-onlyIdempotent
🖼️ Search biomedical images from NLM Open-i.
Searches medical/scientific images from Open-i and returns image URLs with metadata (caption, article info, MeSH terms).
═══════════════════════════════════════════════════════════════ ⚠️ CRITICAL - LANGUAGE REQUIREMENT: ═══════════════════════════════════════════════════════════ Open-i ONLY supports English queries. If the user queries in non-English (Chinese, Japanese, Korean, etc.), you MUST:
Translate the query to English medical terminology first
Then call this tool with the English query Example: "喉頭水腫" → "laryngeal edema" "胸部X光肺炎" → "chest X-ray pneumonia"
The tool has built-in translation hints for common CJK medical terms, but YOU should always verify the translation is correct.
═══════════════════════════════════════════════════════════ SOURCES: ═══════════════════════════════════════════════════════════════
Open-i (NLM): X-ray, microscopy, clinical images
═══════════════════════════════════════════════════════════════ EXAMPLES: ═══════════════════════════════════════════════════════════════
General image search: search_biomedical_images("chest pneumonia CT scan")
X-ray only: search_biomedical_images("fracture", image_type="x")
Microscopy images: search_biomedical_images("histology liver", image_type="mc")
Clinical teaching images (MedPix): search_biomedical_images("pneumothorax", collection="mpx")
Case reports with CC-BY license, sorted by date: search_biomedical_images( "lung cancer", article_type="cr", license_type="by", sort_by="d" )
Cardiology specialty images: search_biomedical_images("echocardiogram", specialty="c")
Video content only: search_biomedical_images("surgery technique", video_only=True)
═══════════════════════════════════════════════════════════════
Args: query: Search query (e.g., "chest X-ray pneumonia") image_type: Filter by image type (Open-i only): Positive filters: - "c": CT scan images - "g": Graphics / line art / diagrams - "m": MRI images - "mc": Microscopy / histology images - "p": PET scan images - "ph": Photographs / clinical photos - "u": Ultrasound images - "x": X-ray images Exclusion filters: - "xg": Exclude Graphics (removes graphic images from results) - "xm": Exclude Multipanel (removes multipanel images) - None: All types (default) collection: Filter by collection (Open-i only): - "pmc": PubMed Central articles - "mpx": MedPix clinical teaching images (high quality) - "cxr": Chest X-ray collection - "hmd": History of Medicine - "usc": USC collection - None: All collections (default) limit: Maximum number of images to return (default 10, max 50) sort_by: Sort results by (Open-i only): - "r": Relevance (default) - "d": Date (newest first) - "o": Oldest first - "t": Title - "e": Education relevance - "g": Graphics priority article_type: Filter by article type (Open-i only): - "cr": Case Report - "or": Original Research - "re": Review - "sr": Systematic Review - "ra": Research Article - "ed": Editorial - "lt": Letter - "bk": Book - and more... (see API docs) specialty: Filter by medical specialty (Open-i only): - "r": Radiology - "c": Cardiology - "ne": Neurology - "pu": Pulmonology - "d": Dermatology - "g": Gastroenterology - "or": Orthopedics - "o": Ophthalmology - "s": Surgery - "p": Pediatrics - "id": Infectious Disease - "i": Immunology - and more... (see API docs) license_type: Filter by Creative Commons license (Open-i only): - "by": CC-BY (Attribution) - "bync": CC-BY-NC (Attribution-NonCommercial) - "byncnd": CC-BY-NC-ND (Attribution-NonCommercial-NoDerivs) - "byncsa": CC-BY-NC-SA (Attribution-NonCommercial-ShareAlike) subset: Filter by subject subset (Open-i only): - "b": Behavioral Sciences - "c": Cancer - "e": Ethics - "s": Surgery - "x": Toxicology search_fields: Search in specific fields (Open-i only): - "t": Title only - "m": MeSH terms only - "ab": Abstract only - "msh": MeSH heading only - "c": Caption only - "a": Author only video_only: If True, only return video content (default False) hmp_type: History of Medicine publication type. Requires collection="hmd".
Returns: Formatted image results with URLs, captions, and article metadata
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| subset | No | ||
| sort_by | No | ||
| hmp_type | No | ||
| specialty | No | ||
| collection | No | ||
| image_type | No | ||
| video_only | No | ||
| article_type | No | ||
| license_type | No | ||
| search_fields | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, and the description adds genuine operational context on top: Open-i accepts English only, built-in CJK translation hints exist but must be verified, limit defaults to 10 with a max of 50, and hmp_type requires collection='hmd'. It does not cover rate limits or result pagination, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the critical language rule are front-loaded, which is good, but the repeated full-width ASCII rule lines and emoji consume substantial tokens without adding information, and the source list restates the opening sentence. The enum documentation earns its space; the decorative separators do not.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with no schema descriptions and no output schema, the description supplies nearly everything needed to call it correctly, including filter semantics and the return shape in prose. Gaps remain around pagination and behavior when zero images match.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden, and it does: every parameter's enum codes are decoded (image_type, collection, sort_by, specialty, license_type, subset, search_fields), inclusion vs exclusion filters are separated, and the cross-parameter dependency on collection='hmd' is stated. Only a few enum members are deferred to "see API docs".
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line names the exact verb, resource, and source ("Search biomedical images from NLM Open-i") and the second states the return content (image URLs with caption, article info, MeSH terms). It is unambiguously distinguishable from article-oriented siblings like unified_search and fetch_article_details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides rich context for use: the mandatory English-query rule, a translation workflow, and seven worked examples mapping intent to filters (collection='mpx' for MedPix, video_only for video). However, it never routes the agent away from or toward the closest siblings such as get_article_figures or prepare_figure_search, so the when-not half is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_clinvarARead-onlyIdempotent
Search ClinVar for clinical variants.
═══════════════════════════════════════════════════════════════ USE CASES: ═══════════════════════════════════════════════════════════════
Look up clinical significance of genetic variants
Find variants associated with diseases
Research gene-disease associations
Get variant pathogenicity classifications
Args: query: Gene name, variant, or disease condition limit: Maximum results (1-50)
Returns: JSON with variant records including significance and conditions
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered. The description adds value beyond that by stating the return shape ('JSON with variant records including significance and conditions'), which is useful given there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is short and front-loaded: purpose first, then use cases, args, and returns. The heavy '═' divider lines are decorative noise, but they do not meaningfully bloat the semantic content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only search with no output schema, the description covers purpose, invocation contexts, both parameters, and the general return shape. Pagination or ranking details are absent, but they are not essential for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden. It explains that 'query' accepts a gene name, variant, or disease condition, and that 'limit' is a 1–50 maximum-result count, which meaningfully supplements the bare schema constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Search ClinVar for clinical variants') and the use cases make the domain explicit. It does not, however, distinguish itself from sibling tools such as search_gene, search_compound, or unified_search, so an agent cannot route between them from this text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The USE CASES section gives clear contexts for when to call it (looking up clinical significance, disease associations, pathogenicity classifications). There are no explicit exclusions or alternatives named, but the positive guidance is strong enough to be actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_compoundBRead-onlyIdempotent
Search PubChem for chemical compounds.
═══════════════════════════════════════════════════════════════ USE CASES: ═══════════════════════════════════════════════════════════════
Look up drug/compound information
Find molecular formula and structure
Get compound synonyms and identifiers
Research chemical properties
Args: query: Compound name or description limit: Maximum results (1-50)
Returns: JSON with compound records including names, formulas, properties
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered by structured data. The description adds only the return shape (JSON records with names, formulas, properties) and the 1-50 limit; nothing about upstream rate limits, match behavior (fuzzy vs. exact), or empty-result handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and use cases are front-loaded correctly, but the heavy box-drawing separator banners add visual noise without information, and the Args/Returns restatement pads the entry beyond what a two-parameter tool needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does supply a brief Returns line, and both parameters are named, so nothing critical is missing. It stops short of describing result ordering, result count behavior when limit is hit, or how queries are matched, which matters for an external open-world search.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden. It documents both parameters — query as 'compound name or description' and limit as 'maximum results (1-50)' — but the query hint is thin (no format/synonym guidance) and the limit note merely restates the schema bounds, leaving the default of 10 unmentioned.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states a specific verb and resource: search PubChem for chemical compounds, which is unambiguous on its own. It does not, however, distinguish itself from nearby siblings such as get_compound_details or get_compound_literature, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The USE CASES block enumerates good reasons to call it (drug lookups, molecular formula, synonyms, properties), which implies usage. But there is no when-not guidance and no explicit routing to get_compound_details (fetch details for a known compound) or get_compound_literature, which are the obvious alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_geneARead-onlyIdempotent
Search NCBI Gene database for gene information.
═══════════════════════════════════════════════════════════════ USE CASES: ═══════════════════════════════════════════════════════════════
Look up gene function and description
Find gene aliases and official symbols
Get chromosome location
Find genes by name or function
Args: query: Gene name, symbol, or function keyword organism: Filter by organism (e.g., "human", "Homo sapiens", "mouse") limit: Maximum results (1-50)
Returns: JSON with gene records including symbols, names, locations
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| organism | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds value beyond that by disclosing the return shape ('JSON with gene records including symbols, names, locations') and the result-count range, which the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded (purpose first, then use cases, args, returns) and each content line is short and useful. The triple-line box-drawing banners are pure decoration that consume tokens without adding information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies a brief return summary, and annotations cover behavior for this read-only search. The remaining gap is routing relative to get_gene_details and get_gene_literature, plus any note on result ordering or pagination.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the param burden and largely does: query is described as 'Gene name, symbol, or function keyword', and organism includes concrete accepted values ('human', 'Homo sapiens', 'mouse'), which is genuinely useful for a taxonomy-filtered API. The limit line only restates the schema's 1-50 bound and adds no ranking or sorting semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb and resource: 'Search NCBI Gene database for gene information,' with a use-case list that scopes what it retrieves (function, aliases, symbols, location). It does not distinguish itself from siblings like get_gene_details or get_gene_literature, so an agent must infer search-vs-fetch from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The USE CASES block gives concrete retrieval scenarios (look up gene function, find aliases/symbols, get chromosome location, search by name or function keyword), which is clear usage context. It stops short of exclusions or naming the alternative tools to use when you already have a gene ID or want literature about a gene.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_institutional_accessARead-onlyIdempotent
Test your institutional link resolver configuration.
═══════════════════════════════════════════════════════════════════════════════ 🧪 TEST INSTITUTIONAL ACCESS ═══════════════════════════════════════════════════════════════════════════════
Tests if your configured link resolver is:
Properly configured
Reachable (network connection)
Returns a valid response
NOTE: This only tests if the resolver endpoint is reachable. Actual full-text access depends on your institution's subscriptions.
═══════════════════════════════════════════════════════════════════════════════ FREE TEST OPTIONS: ═══════════════════════════════════════════════════════════════════════════════
If you don't have institutional access, you can test with:
Use "test_free" preset (EBSCO public resolver): configure_institutional_access(preset="test_free") test_institutional_access()
Most university resolvers will respond even without VPN, they just won't provide full-text (shows "Access options" page)
Args: pmid: PMID to use for testing (default: 38353755)
Returns: Test results including: - Configuration status - Network reachability - Generated OpenURL - Link to test manually
| Name | Required | Description | Default |
|---|---|---|---|
| pmid | No | Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers. | 38353755 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful scope-limiting context beyond that: it only tests endpoint reachability, actual full-text depends on subscriptions, and a resolver may respond without VPN while still not serving full text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is useful, but it is wrapped in large ASCII banner blocks with repeated separators, producing substantial visual noise for what amounts to a few sentences. Front-loading is fine, but the decoration is not earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only test tool, the definition supplies purpose, scope caveats, a return-value outline, and setup guidance. That is complete enough for correct invocation; the only real omission is how it relates to the sibling diagnostic tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema description coverage is 100%, so the schema carries the semantic load (format, examples, length limits). The description merely restates the pmid default (38353755), adding essentially nothing beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (test) and resource (institutional link resolver configuration) and enumerates what is being checked: configuration, reachability, and response validity. It does not, however, distinguish itself from the sibling diagnose_institutional_access, which appears to cover very similar ground.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The FREE TEST OPTIONS section gives clear situational guidance: if you lack institutional access, call configure_institutional_access(preset="test_free") first, and it notes most university resolvers respond without VPN. That is real when-to-use context, though it never contrasts with the sibling diagnose_institutional_access tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unified_searchA
🔍 Unified Search - Single entry point for multi-source academic search.
Automatically analyzes your query and searches the best sources. No need to choose between PubMed, OpenAlex, CrossRef, etc.
═══════════════════════════════════════════════════════════════════ WHAT IT DOES: ═══════════════════════════════════════════════════════════════════
Analyzes your query (complexity, intent, PICO elements)
Automatically selects best sources based on query type
Searches multiple sources in parallel
Deduplicates and merges results
Ranks by configurable criteria
Enriches with OA links (Unpaywall)
Auto-detects ICD-9/10 codes and expands to MeSH terms
Optionally searches preprints (arXiv, medRxiv, bioRxiv)
═══════════════════════════════════════════════════════════════════ EXAMPLES (most calls only need 1-2 params): ═══════════════════════════════════════════════════════════════════
Simple (1 param): unified_search("remimazolam ICU sedation")
With limit (2 params): unified_search("machine learning in anesthesia", limit=20)
Specify sources: unified_search("CRISPR gene therapy", sources="pubmed,openalex")
Auto minus one source: unified_search("sepsis biomarkers", sources="auto,-semantic_scholar")
Search all enabled sources except enrichment-only CrossRef: unified_search("icu sedation", sources="all,-crossref")
Clinical filters: unified_search("diabetes treatment", filters="year:2020-2025,age_group:aged,clinical_query:therapy")
Include preprints + shallow search: unified_search("COVID-19 vaccine", options="preprints,shallow")
Provider-native semantic retrieval (OpenAlex capability): unified_search("mechanisms of treatment resistance", sources="openalex", options="native_semantic")
Reproducible systematic retrieval (bulk/cursor where supported): unified_search("melanoma AND immunotherapy", sources="openalex,semantic_scholar", options="systematic")
Full control: unified_search("propofol vs remimazolam", sources="pubmed,semantic_scholar,europe_pmc", ranking="impact", filters="year:2020-,sex:female,species:humans", options="preprints,no_relax")
ICD Code Auto-Detection: unified_search("E11 complications") → Auto-expands E11 to "Diabetes Mellitus, Type 2"[MeSH]
Args:
query: Search query (natural language, ICD codes, or structured).
Required unless pipeline is provided.
limit: Maximum results per source (default 10, max 100)
sources: Comma-separated list of sources to search.
Available: "pubmed", "openalex", "semantic_scholar",
"europe_pmc", "crossref", "core".
Commercial connectors may also appear when enabled via env,
e.g. "scopus" when SCOPUS_ENABLED=true and
SCOPUS_API_KEY are configured, or "web_of_science"
when WEB_OF_SCIENCE_ENABLED=true and
WEB_OF_SCIENCE_API_KEY are configured.
Default: auto-select based on query complexity.
Supports "auto" and "all" with exclusions.
Source keys are exact and canonical; legacy hyphenated,
spaced, abbreviated, or case-folded aliases are rejected.
Examples: "pubmed,openalex", "auto,-semantic_scholar",
or "all,-crossref"
Global disable env: PUBMED_SEARCH_DISABLED_SOURCES
Example: PUBMED_SEARCH_DISABLED_SOURCES=semantic_scholar,core
ranking: Ranking strategy:
- "balanced": Default, considers all factors
- "impact": Prioritize high-citation papers
- "recency": Prioritize recent publications
- "quality": Prioritize publication-type heuristics (RCTs, meta-analyses); not a quality assessment
output_format: "markdown" (human-readable), "json", or "toon" (programmatic)
fulltext: "off" (default) or "prefetch" for normal searches. Prefetch
prepares open-access XML for up to three top-ranked articles
with known PMCIDs in the background. Search does not wait.
Later get_fulltext calls reuse ready or in-flight XML; no polling
is needed. No speculative PDF, browser or institutional access.
Not supported with pipeline; use "off" for pipeline calls.
filters: Comma-separated key:value pairs for filtering results.
Supported keys:
year:2020-2025 → publication year range
year:2020- → from 2020 onwards
year:-2025 → up to 2025
year:2024 → from 2024 onwards
age_group: → age group filter (PubMed).
Values: newborn, infant, preschool, child,
adolescent, young_adult, adult, middle_aged,
aged, aged_80
sex: → sex filter: male, female
species: → species filter: humans, animals
language: → language filter: english, chinese, etc.
clinical_query:
→ clinical query filter (PubMed EBM).
Values: therapy, therapy_narrow, diagnosis,
diagnosis_narrow, prognosis, prognosis_narrow,
etiology, etiology_narrow,
clinical_prediction, clinical_prediction_narrow
Tokens, keys, and values use exact canonical spelling with
no surrounding whitespace.
Example: "year:2020-2025,age_group:aged,sex:female,clinical_query:therapy"
options: Comma-separated flags to toggle behaviors.
Supported flags:
preprints → also search arXiv, medRxiv, bioRxiv
include_detected_preprints
→ retain records identified by the preprint
heuristic in otherwise selected sources;
this does not establish peer-review status
clinical_trials → add a bounded ClinicalTrials.gov adjunct
section to Markdown output (explicit opt-in)
no_oa → skip Unpaywall OA link enrichment
no_analysis → hide query analysis section in output
no_scores → hide ranking scores and rank percentiles
compact → compact structured JSON/TOON output
no_next → hide next-tool suggestions in structured output
no_provenance → hide section provenance in structured output
no_relax → disable auto-relaxation on 0 results
native_semantic → use provider-native semantic retrieval;
currently OpenAlex, max 50 results
systematic → use deterministic bulk/cursor retrieval where
supported (for example S2 and OpenAlex)
shallow → disable deep search (faster, keyword-only)
native_semantic and systematic are mutually exclusive
Option tokens use exact canonical spelling with no
surrounding whitespace.
and automatically disable multi-strategy query expansion.
Tokens use exact canonical spelling without surrounding
whitespace or duplicates.
Example: "preprints,shallow" or "no_analysis,no_scores"
pipeline: YAML/JSON string defining a multi-step search pipeline.
When provided, other parameters (except output_format) are
ignored and the pipeline DAG is executed instead.
Accepts **YAML** (recommended, human-friendly) or **JSON** format.
**Template mode — YAML** (shortcut for common workflows):
template: pico
template_params:
P: ICU patients
I: remimazolam
C: propofol
O: sedation
Other templates:
template: comprehensive
template_params:
query: CRISPR gene therapy
template: exploration
template_params:
pmid: "12345678"
template: gene_drug
template_params:
term: BRCA1
**Custom pipeline — YAML** (full DAG control, max 20 steps):
name: My Custom Search
steps:
- id: s1
action: search
params:
query: remimazolam ICU
sources: [pubmed, europe_pmc]
limit: 50
- id: s2
action: search
params:
query: propofol ICU
sources: [pubmed]
limit: 50
- id: merged
action: merge
inputs: [s1, s2]
params:
method: rrf
- id: enriched
action: metrics
inputs: [merged]
output:
format: markdown
limit: 20
ranking: impact
Shared params:
globals: default params inherited only by actions that
declare the same canonical parameter key
variables: typed values available as ${name} placeholders;
embedded replacements must be strings
Debugging controls:
dry_run: validate/preview the pipeline without searches
stop_at: execute through one step id, e.g. "merged"
**JSON also supported** (for programmatic use):
{"template": "pico", "template_params": {"P": "ICU patients", "I": "remimazolam"}}
Available actions:
search — literature search (params: query, sources, limit, min_year, max_year)
pico — PICO elements (params: P, I, C, O)
expand — MeSH/synonym expansion (params: topic)
details — fetch article details (params: pmids)
related — find related articles (params: pmid, limit)
citing — find citing articles (params: pmid, limit)
references — get article references (params: pmid, limit)
metrics — enrich with iCite citation metrics (inputs only)
merge — combine results (params: method=union|intersection|rrf)
filter — post-filter (params: min_year, max_year, article_types, min_citations, has_abstract)Returns: Formatted search results with: - Query analysis (complexity, intent, PICO) - ICD code expansions (if detected) - Search statistics (sources, dedup count) - Ranked articles with metadata - Open access links where available - Preprints (if options includes "preprints") - Relaxation info (if auto_relax triggered) - Pipeline step summary (if pipeline mode)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| dry_run | No | ||
| filters | No | ||
| options | No | ||
| ranking | No | balanced | |
| sources | No | ||
| stop_at | No | ||
| fulltext | No | off | |
| pipeline | No | ||
| output_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (openWorldHint, readOnlyHint=false), the description discloses substantial behavioral detail: parallel multi-source search, dedup/merge, auto-relaxation on zero results, background fulltext prefetch that requires no polling, and env-gated commercial connectors (SCOPUS_API_KEY, etc.). This is far more than the structured annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Headers and front-loading make it navigable despite its length, and the length is defensible for an 11-parameter tool with a pipeline DSL. However, there is visible redundancy (the 'exact canonical spelling' rule is repeated) and at least one garbled sentence around the native_semantic/systematic flags, plus decorative box-drawing that adds noise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly supplies a Returns section covering query analysis, ICD expansions, statistics, ranked articles, OA links, preprints, relaxation info, and pipeline summaries. Combined with full parameter documentation, nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden, and it does so thoroughly: every parameter (query, limit, sources, ranking, output_format, fulltext, filters, options, pipeline, dry_run, stop_at) is documented with accepted values, defaults, syntax rules, and interactions (e.g. native_semantic/systematic mutual exclusivity, canonical-token requirement).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title line plus the numbered WHAT IT DOES list state a specific verb (search) and resource (multi-source academic literature), and the framing as the 'single entry point' distinguishes it from sibling helpers like find_related_articles or analyze_search_query. An agent can immediately tell this is the primary retrieval tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context ('no need to choose between PubMed, OpenAlex, CrossRef') and a rich set of worked examples showing when to add sources, filters, options, or a pipeline. It stops short of explicitly naming sibling alternatives or stating when NOT to use this tool, so it is strong but not fully routing-aware.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unschedule_pipelineADestructiveIdempotent
Remove the active schedule for a saved pipeline.
Args: name: Saved pipeline name whose schedule will be removed.
Returns: Removed schedule metadata, or a native MCP error when none exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description adds one useful behavioral detail beyond that: the response is removed schedule metadata, or an MCP error when no schedule exists (consistent with idempotentHint). It does not state auth/permission needs or whether other schedule config is affected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, followed by concise Args/Returns sections. No filler; the one-line summary plus parameter and return notes earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation with no output schema, the description covers the action, the parameter's meaning, and the return/error behavior, while annotations cover the safety profile. Only permission requirements and interaction with other schedule state are unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the schema's 'name' property carries no prose. The description compensates by clarifying the parameter means the 'Saved pipeline name whose schedule will be removed,' disambiguating it from a schedule ID or arbitrary string.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource: 'Remove the active schedule for a saved pipeline.' It is clearly distinct from delete_pipeline (removes the pipeline) and schedule_pipeline (adds a schedule), though it does not name those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb and the pipeline-scheduling sibling set, but the description never states when to use this versus schedule_pipeline, delete_pipeline, or what state the pipeline must be in. No alternatives or exclusions are offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_pico_planARead-onlyIdempotent
Validate agent-provided P/I/C/O and return a runnable PICO pipeline.
question_type and profile are closed enums. sources is an
explicit array of supported unified-search providers; malformed values
fail instead of being silently replaced. When question_type is
omitted, the application service infers it from the clinical question.
| Name | Required | Description | Default |
|---|---|---|---|
| c | No | ||
| i | No | ||
| o | No | ||
| p | No | ||
| limit | No | ||
| c_query | No | ||
| i_query | No | ||
| o_query | No | ||
| p_query | No | ||
| profile | No | balanced | |
| sources | No | ||
| description | No | ||
| question_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive/closed-world, so the bar is lower. The description adds real traits beyond them: malformed enum/array values fail hard rather than being silently replaced, and the service infers question_type on omission. Return-pipeline shape is still undefined, keeping it short of 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and output in one sentence, then adds enum/failure semantics tersely. Dense but every sentence carries information; no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the enum and sources semantics, but for a 13-parameter tool with no output schema the description never explains which parameters are required together, what the returned pipeline looks like, or how the *_query fields relate to the P/I/C/O fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 13 parameters, so the description must carry the load. It clarifies only three fields (closed enums for question_type/profile, explicit sources array) and leaves limit, description, and the *_query fields to name inference, well short of compensating for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('validate agent-provided P/I/C/O') plus the output ('return a runnable PICO pipeline'). This is clearly distinguishable from siblings like unified_search or generate_search_queries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this vs. alternatives, and no prerequisites stated. The only usage-adjacent statement is the fallback when question_type is omitted, which is behavioral rather than when-to-use advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_reference_listARead-onlyIdempotent
Verify a plain-text reference list against PubMed evidence.
First version scope: - Reference-list verification only - Client supplies the extracted reference list text - Backend parses entries and resolves them via PMID / DOI / ECitMatch
Second version scope:
- Adds unresolved review workflow for partial_match and unresolved rows
- Returns a manual-review queue with retry queries and review checklist
- Supports human-in-the-loop acceptance/rejection in client-side workflows
Args: reference_text: Plain-text references, ideally one per line or a numbered reference list extracted from a file. Limited to 200,000 characters / 400,000 UTF-8 bytes; each entry is limited to 4,000 characters / 8,000 UTF-8 bytes. source_name: Optional single-line file label for reporting (up to 255 characters / 512 UTF-8 bytes). max_references: Hard input-entry limit from 1 through 200. Inputs above the selected limit are rejected instead of truncated.
Returns:
JSON verification report with parsed fields, matched PubMed evidence,
per-reference verification status, and explicit
source_unavailable / not_checked rows when evidence could
not be assessed.
| Name | Required | Description | Default |
|---|---|---|---|
| source_name | No | ||
| max_references | No | ||
| reference_text | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a read-only, idempotent, open-world, non-destructive operation, so the safety bar is low. The description still adds real behavioral content: hard size/entry limits, that over-limit input is rejected rather than truncated, and that unresolved evidence surfaces as explicit source_unavailable / not_checked rows. It stops short of describing performance or retry behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The Args/Returns structure is clear and front-loaded, but the "Second version scope" block describes future behavior that is not invocable today, consuming roughly a third of the text without helping an agent call the tool now. That section is the main argument for a mid score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly takes on return-value explanation (parsed fields, matched evidence, per-reference status, explicit unavailable rows), and it covers all limits and required inputs. Complete enough to invoke correctly; only the ambiguity about whether v2 behavior is currently active leaves a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load and it does: reference_text limits (200,000 chars / 400,000 bytes, 4,000 per entry), source_name as an optional single-line reporting label with a stated length cap, and max_references bounds (1-200) plus the rejection-instead-of-truncation rule. All three parameters gain meaning the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: "Verify a plain-text reference list against PubMed evidence." No sibling performs reference-list verification, so an agent can route to it without ambiguity. The resolution mechanisms (PMID / DOI / ECitMatch) further pin down what the tool actually does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It establishes that the client must supply already-extracted reference text, which is useful pre-condition context, but it never states when to pick this over sibling tools that also surface references (e.g. get_article_references, build_citation_tree) or what inputs are unsuitable. The v1/v2 scope split is informative about roadmap rather than about invocation choices.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
34 tool updates
v0.7.7- Changed
build_citation_tree18 fields changed- added
Input schema / properties / depth / anyOfAdded value: +[ + { + "default": 2, + "maximum": 3, + "minimum": 1, + "title": "Depth", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / depth / maximumRemoved value: -3 - removed
Input schema / properties / depth / minimumRemoved value: -1 - removed
Input schema / properties / depth / typeRemoved value: -"integer" - added
Input schema / properties / direction / anyOfAdded value: +[ + { + "default": "both", + "enum": [ + "forward", + "backward", + "both" + ], + "title": "Direction", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[fF][oO][rR][wW][aA][rR][dD]|[bB][aA][cC][kK][wW][aA][rR][dD]|[bB][oO][tT][hH])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / direction / enumRemoved value: -[ - "forward", - "backward", - "both" -] - removed
Input schema / properties / direction / typeRemoved value: -"string" - added
Input schema / properties / limit_per_level / anyOfAdded value: +[ + { + "default": 5, + "maximum": 20, + "minimum": 1, + "title": "Limit Per Level", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / limit_per_level / maximumRemoved value: -20 - removed
Input schema / properties / limit_per_level / minimumRemoved value: -1 - removed
Input schema / properties / limit_per_level / typeRemoved value: -"integer" - added
Input schema / properties / output_format / anyOfAdded value: +[ + { + "default": "cytoscape", + "enum": [ + "cytoscape", + "g6", + "d3", + "vis", + "graphml", + "mermaid" + ], + "title": "Output Format", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[cC][yY][tT][oO][sS][cC][aA][pP][eE]|[gG]6|[dD]3|[vV][iI][sS]|[gG][rR][aA][pP][hH][mM][lL]|[mM][eE][rR][mM][aA][iI][dD])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / output_format / enumRemoved value: -[ - "cytoscape", - "g6", - "d3", - "vis", - "graphml", - "mermaid" -] - removed
Input schema / properties / output_format / typeRemoved value: -"string" - added
Input schema / properties / pmid / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / properties / pmid / examplesAdded value: +[ + "33053718", + "PMID:33053718", + "https://pubmed.ncbi.nlm.nih.gov/33053718/" +] - added
Input schema / properties / pmid / formatAdded value: +"pubmed-pmid" - added
Input schema / properties / pmid / x-pubmed-inputAdded value: +"pmid"
- Changed
build_research_chronicle7 fields changed- changed
Input schema / properties / max_events / anyOfPrevious value: -[ - { - "description": "Maximum Chronicle events", - "maximum": 200, - "minimum": 1, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Maximum Chronicle events", + "maximum": 200, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - changed
Input schema / properties / max_year / anyOfPrevious value: -[ - { - "description": "Four-digit publication year", - "maximum": 2100, - "minimum": 1000, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Four-digit publication year", + "maximum": 2100, + "minimum": 1000, + "type": "integer" + }, + { + "type": "null" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - changed
Input schema / properties / min_year / anyOfPrevious value: -[ - { - "description": "Four-digit publication year", - "maximum": 2100, - "minimum": 1000, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Four-digit publication year", + "maximum": 2100, + "minimum": 1000, + "type": "integer" + }, + { + "type": "null" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - added
Input schema / properties / output / anyOfAdded value: +[ + { + "default": "summary", + "enum": [ + "summary", + "json", + "chronicle_map", + "timeline", + "tree", + "graph", + "evidence", + "milestones", + "mermaid", + "narrative" + ], + "title": "Output", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[sS][uU][mM][mM][aA][rR][yY]|[jJ][sS][oO][nN]|[cC][hH][rR][oO][nN][iI][cC][lL][eE]_[mM][aA][pP]|[tT][iI][mM][eE][lL][iI][nN][eE]|[tT][rR][eE][eE]|[gG][rR][aA][pP][hH]|[eE][vV][iI][dD][eE][nN][cC][eE]|[mM][iI][lL][eE][sS][tT][oO][nN][eE][sS]|[mM][eE][rR][mM][aA][iI][dD]|[nN][aA][rR][rR][aA][tT][iI][vV][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / output / enumRemoved value: -[ - "summary", - "json", - "chronicle_map", - "timeline", - "tree", - "graph", - "evidence", - "milestones", - "mermaid", - "narrative" -] - removed
Input schema / properties / output / typeRemoved value: -"string" - changed
Input schema / properties / pmids / anyOfPrevious value: -[ - { - "maxLength": 10000, - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "description": "Complete PMID(s): delimited text, JSON string array, or Markdown list; optional JSON code fence. last only where supported.", + "examples": [ + "33053718,36170657", + "[\"33053718\",\"36170657\"]", + "- 33053718\n- 36170657" + ], + "format": "pubmed-pmid-batch", + "maxLength": 100000, + "minLength": 1, + "type": "string" + }, + { + "items": { + "description": "One PMID string, or last as the sole batch item for tools supporting session reuse.", + "examples": [ + "33053718" + ], + "format": "pubmed-pmid", + "maxLength": 512, + "minLength": 1, + "type": "string", + "x-pubmed-input": "pmid" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + } + ], + "x-pubmed-input": "pmid_batch" + }, + { + "type": "null" + } +]
- Changed
configure_institutional_access3 fields changed- added
Input schema / properties / enable / anyOfAdded value: +[ + { + "default": true, + "title": "Enable", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / enable / typeRemoved value: -"boolean" - changed
Input schema / properties / preset / anyOfPrevious value: -[ - { - "enum": [ - "ntu", - "ncku", - "nthu", - "nycu", - "harvard", - "stanford", - "mit", - "yale", - "oxford", - "cambridge", - "sfx", - "360link", - "primo", - "test_free" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "enum": [ + "ntu", + "ncku", + "nthu", + "nycu", + "harvard", + "stanford", + "mit", + "yale", + "oxford", + "cambridge", + "sfx", + "360link", + "primo", + "test_free" + ], + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[nN][tT][uU]|[nN][cC][kK][uU]|[nN][tT][hH][uU]|[nN][yY][cC][uU]|[hH][aA][rR][vV][aA][rR][dD]|[sS][tT][aA][nN][fF][oO][rR][dD]|[mM][iI][tT]|[yY][aA][lL][eE]|[oO][xX][fF][oO][rR][dD]|[cC][aA][mM][bB][rR][iI][dD][gG][eE]|[sS][fF][xX]|360[lL][iI][nN][kK]|[pP][rR][iI][mM][oO]|[tT][eE][sS][tT]_[fF][rR][eE][eE])[ \\t\\r\\n]*$", + "type": "string" + } + ] + }, + { + "type": "null" + } +]
- Changed
convert_icd_mesh3 fields changed- added
Input schema / properties / direction / anyOfAdded value: +[ + { + "enum": [ + "icd_to_mesh", + "mesh_to_icd" + ], + "title": "Direction", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[iI][cC][dD]_[tT][oO]_[mM][eE][sS][hH]|[mM][eE][sS][hH]_[tT][oO]_[iI][cC][dD])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / direction / enumRemoved value: -[ - "icd_to_mesh", - "mesh_to_icd" -] - removed
Input schema / properties / direction / typeRemoved value: -"string"
- Changed
diagnose_institutional_access26 fields changed- added
Input schema / $defs / DOISource / properties / kind / anyOfAdded value: +[ + { + "const": "doi", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[dD][oO][iI])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / DOISource / properties / kind / constRemoved value: -"doi" - removed
Input schema / $defs / DOISource / properties / kind / typeRemoved value: -"string" - added
Input schema / $defs / DOISource / properties / value / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / $defs / DOISource / properties / value / examplesAdded value: +[ + "10.1000/example", + "doi:10.1000/example", + "https://doi.org/10.1000/example" +] - added
Input schema / $defs / DOISource / properties / value / formatAdded value: +"pubmed-doi" - changed
Input schema / $defs / DOISource / properties / value / minLengthPrevious value: -7New value: +1 - removed
Input schema / $defs / DOISource / properties / value / patternRemoved value: -"^10\\.[0-9]{4,9}/" - added
Input schema / $defs / DOISource / properties / value / x-pubmed-inputAdded value: +"doi" - added
Input schema / $defs / PMIDSource / properties / kind / anyOfAdded value: +[ + { + "const": "pmid", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[pP][mM][iI][dD])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / PMIDSource / properties / kind / constRemoved value: -"pmid" - removed
Input schema / $defs / PMIDSource / properties / kind / typeRemoved value: -"string" - added
Input schema / $defs / PMIDSource / properties / value / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / $defs / PMIDSource / properties / value / examplesAdded value: +[ + "33053718", + "PMID:33053718", + "https://pubmed.ncbi.nlm.nih.gov/33053718/" +] - added
Input schema / $defs / PMIDSource / properties / value / formatAdded value: +"pubmed-pmid" - changed
Input schema / $defs / PMIDSource / properties / value / maxLengthPrevious value: -20New value: +512 - added
Input schema / $defs / PMIDSource / properties / value / minLengthAdded value: +1 - removed
Input schema / $defs / PMIDSource / properties / value / patternRemoved value: -"^[1-9][0-9]{0,19}$" - added
Input schema / $defs / PMIDSource / properties / value / x-pubmed-inputAdded value: +"pmid" - added
Input schema / properties / source / anyOfAdded value: +[ + { + "discriminator": { + "mapping": { + "doi": "#/$defs/DOISource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/DOISource" + } + ], + "title": "Source" + }, + { + "contentMediaType": "application/json", + "contentSchema": { + "discriminator": { + "mapping": { + "doi": "#/$defs/DOISource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/DOISource" + } + ], + "title": "Source" + }, + "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.", + "maxLength": 1000000, + "type": "string" + }, + { + "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.", + "maxLength": 1000000, + "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$", + "type": "string", + "x-pubmed-decodedSchema": { + "discriminator": { + "mapping": { + "doi": "#/$defs/DOISource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/DOISource" + } + ], + "title": "Source" + }, + "x-pubmed-encoding": "fenced-json" + } +] - removed
Input schema / properties / source / discriminatorRemoved value: -{ - "mapping": { - "doi": "#/$defs/DOISource", - "pmid": "#/$defs/PMIDSource" - }, - "propertyName": "kind" -} - removed
Input schema / properties / source / oneOfRemoved value: -[ - { - "$ref": "#/$defs/PMIDSource" - }, - { - "$ref": "#/$defs/DOISource" - } -] - added
Input schema / properties / try_direct / anyOfAdded value: +[ + { + "default": true, + "title": "Try Direct", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / try_direct / typeRemoved value: -"boolean" - added
Input schema / properties / try_ezproxy / anyOfAdded value: +[ + { + "default": true, + "title": "Try Ezproxy", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / try_ezproxy / typeRemoved value: -"boolean"
- Changed
fetch_article_details6 fields changed- added
Input schema / properties / output_format / anyOfAdded value: +[ + { + "default": "markdown", + "enum": [ + "markdown", + "json", + "toon" + ], + "title": "Output Format", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[mM][aA][rR][kK][dD][oO][wW][nN]|[jJ][sS][oO][nN]|[tT][oO][oO][nN])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / output_format / enumRemoved value: -[ - "markdown", - "json", - "toon" -] - removed
Input schema / properties / output_format / typeRemoved value: -"string" - changed
Input schema / properties / pmids / anyOfPrevious value: -[ - { - "maxLength": 100000, - "minLength": 1, - "type": "string" - }, - { - "items": { - "maxLength": 512, - "minLength": 1, - "type": "string" - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - } -]New value: +[ + { + "description": "Complete PMID(s): delimited text, JSON string array, or Markdown list; optional JSON code fence. last only where supported.", + "examples": [ + "33053718,36170657", + "[\"33053718\",\"36170657\"]", + "- 33053718\n- 36170657" + ], + "format": "pubmed-pmid-batch", + "maxLength": 100000, + "minLength": 1, + "type": "string" + }, + { + "items": { + "description": "Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers.", + "examples": [ + "33053718", + "PMID:33053718", + "https://pubmed.ncbi.nlm.nih.gov/33053718/" + ], + "format": "pubmed-pmid", + "maxLength": 512, + "minLength": 1, + "type": "string", + "x-pubmed-input": "pmid" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + } +] - added
Input schema / properties / pmids / descriptionAdded value: +"Explicit PMIDs; last is not supported." - added
Input schema / properties / pmids / x-pubmed-inputAdded value: +"pmid_batch"
- Changed
find_citing_articles8 fields changed- added
Input schema / properties / limit / anyOfAdded value: +[ + { + "default": 10, + "maximum": 100, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / limit / maximumRemoved value: -100 - removed
Input schema / properties / limit / minimumRemoved value: -1 - removed
Input schema / properties / limit / typeRemoved value: -"integer" - added
Input schema / properties / pmid / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / properties / pmid / examplesAdded value: +[ + "33053718", + "PMID:33053718", + "https://pubmed.ncbi.nlm.nih.gov/33053718/" +] - added
Input schema / properties / pmid / formatAdded value: +"pubmed-pmid" - added
Input schema / properties / pmid / x-pubmed-inputAdded value: +"pmid"
- Changed
find_related_articles8 fields changed- added
Input schema / properties / limit / anyOfAdded value: +[ + { + "default": 5, + "maximum": 50, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / limit / maximumRemoved value: -50 - removed
Input schema / properties / limit / minimumRemoved value: -1 - removed
Input schema / properties / limit / typeRemoved value: -"integer" - added
Input schema / properties / pmid / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / properties / pmid / examplesAdded value: +[ + "33053718", + "PMID:33053718", + "https://pubmed.ncbi.nlm.nih.gov/33053718/" +] - added
Input schema / properties / pmid / formatAdded value: +"pubmed-pmid" - added
Input schema / properties / pmid / x-pubmed-inputAdded value: +"pmid"
- Changed
generate_search_queries7 fields changed- added
Input schema / properties / check_spelling / anyOfAdded value: +[ + { + "default": true, + "title": "Check Spelling", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / check_spelling / typeRemoved value: -"boolean" - added
Input schema / properties / include_suggestions / anyOfAdded value: +[ + { + "default": true, + "title": "Include Suggestions", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / include_suggestions / typeRemoved value: -"boolean" - added
Input schema / properties / strategy / anyOfAdded value: +[ + { + "default": "comprehensive", + "enum": [ + "comprehensive", + "focused", + "exploratory" + ], + "title": "Strategy", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[cC][oO][mM][pP][rR][eE][hH][eE][nN][sS][iI][vV][eE]|[fF][oO][cC][uU][sS][eE][dD]|[eE][xX][pP][lL][oO][rR][aA][tT][oO][rR][yY])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / strategy / enumRemoved value: -[ - "comprehensive", - "focused", - "exploratory" -] - removed
Input schema / properties / strategy / typeRemoved value: -"string"
- Changed
get_article_figures30 fields changed- added
Input schema / $defs / PMCIDSource / properties / kind / anyOfAdded value: +[ + { + "const": "pmcid", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[pP][mM][cC][iI][dD])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / PMCIDSource / properties / kind / constRemoved value: -"pmcid" - removed
Input schema / $defs / PMCIDSource / properties / kind / typeRemoved value: -"string" - added
Input schema / $defs / PMCIDSource / properties / value / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / $defs / PMCIDSource / properties / value / examplesAdded value: +[ + "PMC12345", + "https://pmc.ncbi.nlm.nih.gov/articles/PMC12345/" +] - added
Input schema / $defs / PMCIDSource / properties / value / formatAdded value: +"pubmed-pmcid" - changed
Input schema / $defs / PMCIDSource / properties / value / maxLengthPrevious value: -23New value: +512 - added
Input schema / $defs / PMCIDSource / properties / value / minLengthAdded value: +1 - removed
Input schema / $defs / PMCIDSource / properties / value / patternRemoved value: -"^PMC[1-9][0-9]{0,19}$" - added
Input schema / $defs / PMCIDSource / properties / value / x-pubmed-inputAdded value: +"pmcid" - added
Input schema / $defs / PMIDSource / properties / kind / anyOfAdded value: +[ + { + "const": "pmid", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[pP][mM][iI][dD])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / PMIDSource / properties / kind / constRemoved value: -"pmid" - removed
Input schema / $defs / PMIDSource / properties / kind / typeRemoved value: -"string" - added
Input schema / $defs / PMIDSource / properties / value / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / $defs / PMIDSource / properties / value / examplesAdded value: +[ + "33053718", + "PMID:33053718", + "https://pubmed.ncbi.nlm.nih.gov/33053718/" +] - added
Input schema / $defs / PMIDSource / properties / value / formatAdded value: +"pubmed-pmid" - changed
Input schema / $defs / PMIDSource / properties / value / maxLengthPrevious value: -20New value: +512 - added
Input schema / $defs / PMIDSource / properties / value / minLengthAdded value: +1 - removed
Input schema / $defs / PMIDSource / properties / value / patternRemoved value: -"^[1-9][0-9]{0,19}$" - added
Input schema / $defs / PMIDSource / properties / value / x-pubmed-inputAdded value: +"pmid" - added
Input schema / properties / include_subfigures / anyOfAdded value: +[ + { + "default": false, + "title": "Include Subfigures", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / include_subfigures / typeRemoved value: -"boolean" - added
Input schema / properties / include_tables / anyOfAdded value: +[ + { + "default": false, + "title": "Include Tables", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / include_tables / typeRemoved value: -"boolean" - added
Input schema / properties / output_format / anyOfAdded value: +[ + { + "default": "markdown", + "enum": [ + "markdown", + "json", + "toon" + ], + "title": "Output Format", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[mM][aA][rR][kK][dD][oO][wW][nN]|[jJ][sS][oO][nN]|[tT][oO][oO][nN])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / output_format / enumRemoved value: -[ - "markdown", - "json", - "toon" -] - removed
Input schema / properties / output_format / typeRemoved value: -"string" - added
Input schema / properties / source / anyOfAdded value: +[ + { + "discriminator": { + "mapping": { + "pmcid": "#/$defs/PMCIDSource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/PMCIDSource" + } + ], + "title": "Source" + }, + { + "contentMediaType": "application/json", + "contentSchema": { + "discriminator": { + "mapping": { + "pmcid": "#/$defs/PMCIDSource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/PMCIDSource" + } + ], + "title": "Source" + }, + "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.", + "maxLength": 1000000, + "type": "string" + }, + { + "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.", + "maxLength": 1000000, + "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$", + "type": "string", + "x-pubmed-decodedSchema": { + "discriminator": { + "mapping": { + "pmcid": "#/$defs/PMCIDSource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/PMCIDSource" + } + ], + "title": "Source" + }, + "x-pubmed-encoding": "fenced-json" + } +] - removed
Input schema / properties / source / discriminatorRemoved value: -{ - "mapping": { - "pmcid": "#/$defs/PMCIDSource", - "pmid": "#/$defs/PMIDSource" - }, - "propertyName": "kind" -} - removed
Input schema / properties / source / oneOfRemoved value: -[ - { - "$ref": "#/$defs/PMIDSource" - }, - { - "$ref": "#/$defs/PMCIDSource" - } -]
- Changed
get_article_references8 fields changed- added
Input schema / properties / limit / anyOfAdded value: +[ + { + "default": 20, + "maximum": 100, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / limit / maximumRemoved value: -100 - removed
Input schema / properties / limit / minimumRemoved value: -1 - removed
Input schema / properties / limit / typeRemoved value: -"integer" - added
Input schema / properties / pmid / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / properties / pmid / examplesAdded value: +[ + "33053718", + "PMID:33053718", + "https://pubmed.ncbi.nlm.nih.gov/33053718/" +] - added
Input schema / properties / pmid / formatAdded value: +"pubmed-pmid" - added
Input schema / properties / pmid / x-pubmed-inputAdded value: +"pmid"
- Changed
get_citation_metrics11 fields changed- changed
Input schema / properties / min_citations / anyOfPrevious value: -[ - { - "maximum": 2000000000, - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 2000000000, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - changed
Input schema / properties / min_percentile / anyOfPrevious value: -[ - { - "maximum": 100, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + }, + { + "description": "Finite decimal number; the numeric branch's bounds apply after conversion.", + "maxLength": 64, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?[ \\t\\r\\n]*$", + "type": "string" + } +] - changed
Input schema / properties / min_rcr / anyOfPrevious value: -[ - { - "maximum": 1000000, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 1000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + }, + { + "description": "Finite decimal number; the numeric branch's bounds apply after conversion.", + "maxLength": 64, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?[ \\t\\r\\n]*$", + "type": "string" + } +] - added
Input schema / properties / output_format / anyOfAdded value: +[ + { + "default": "markdown", + "enum": [ + "markdown", + "json", + "toon" + ], + "title": "Output Format", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[mM][aA][rR][kK][dD][oO][wW][nN]|[jJ][sS][oO][nN]|[tT][oO][oO][nN])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / output_format / enumRemoved value: -[ - "markdown", - "json", - "toon" -] - removed
Input schema / properties / output_format / typeRemoved value: -"string" - changed
Input schema / properties / pmids / anyOfPrevious value: -[ - { - "maxLength": 100000, - "minLength": 1, - "type": "string" - }, - { - "items": { - "maxLength": 512, - "minLength": 1, - "type": "string" - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - } -]New value: +[ + { + "description": "Complete PMID(s): delimited text, JSON string array, or Markdown list; optional JSON code fence. last only where supported.", + "examples": [ + "33053718,36170657", + "[\"33053718\",\"36170657\"]", + "- 33053718\n- 36170657" + ], + "format": "pubmed-pmid-batch", + "maxLength": 100000, + "minLength": 1, + "type": "string" + }, + { + "items": { + "description": "One PMID string, or last as the sole batch item for tools supporting session reuse.", + "examples": [ + "33053718" + ], + "format": "pubmed-pmid", + "maxLength": 512, + "minLength": 1, + "type": "string", + "x-pubmed-input": "pmid" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + } +] - added
Input schema / properties / pmids / x-pubmed-inputAdded value: +"pmid_batch" - added
Input schema / properties / sort_by / anyOfAdded value: +[ + { + "default": "citation_count", + "enum": [ + "citation_count", + "relative_citation_ratio", + "nih_percentile", + "citations_per_year" + ], + "title": "Sort By", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[cC][iI][tT][aA][tT][iI][oO][nN]_[cC][oO][uU][nN][tT]|[rR][eE][lL][aA][tT][iI][vV][eE]_[cC][iI][tT][aA][tT][iI][oO][nN]_[rR][aA][tT][iI][oO]|[nN][iI][hH]_[pP][eE][rR][cC][eE][nN][tT][iI][lL][eE]|[cC][iI][tT][aA][tT][iI][oO][nN][sS]_[pP][eE][rR]_[yY][eE][aA][rR])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / sort_by / enumRemoved value: -[ - "citation_count", - "relative_citation_ratio", - "nih_percentile", - "citations_per_year" -] - removed
Input schema / properties / sort_by / typeRemoved value: -"string"
- Changed
get_compound_literature4 fields changed- added
Input schema / properties / limit / anyOfAdded value: +[ + { + "default": 20, + "maximum": 100, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / limit / maximumRemoved value: -100 - removed
Input schema / properties / limit / minimumRemoved value: -1 - removed
Input schema / properties / limit / typeRemoved value: -"integer"
- Changed
get_fulltext42 fields changed- added
Input schema / $defs / DOISource / properties / kind / anyOfAdded value: +[ + { + "const": "doi", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[dD][oO][iI])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / DOISource / properties / kind / constRemoved value: -"doi" - removed
Input schema / $defs / DOISource / properties / kind / typeRemoved value: -"string" - added
Input schema / $defs / DOISource / properties / value / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / $defs / DOISource / properties / value / examplesAdded value: +[ + "10.1000/example", + "doi:10.1000/example", + "https://doi.org/10.1000/example" +] - added
Input schema / $defs / DOISource / properties / value / formatAdded value: +"pubmed-doi" - changed
Input schema / $defs / DOISource / properties / value / minLengthPrevious value: -7New value: +1 - removed
Input schema / $defs / DOISource / properties / value / patternRemoved value: -"^10\\.[0-9]{4,9}/" - added
Input schema / $defs / DOISource / properties / value / x-pubmed-inputAdded value: +"doi" - added
Input schema / $defs / PMCIDSource / properties / kind / anyOfAdded value: +[ + { + "const": "pmcid", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[pP][mM][cC][iI][dD])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / PMCIDSource / properties / kind / constRemoved value: -"pmcid" - removed
Input schema / $defs / PMCIDSource / properties / kind / typeRemoved value: -"string" - added
Input schema / $defs / PMCIDSource / properties / value / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / $defs / PMCIDSource / properties / value / examplesAdded value: +[ + "PMC12345", + "https://pmc.ncbi.nlm.nih.gov/articles/PMC12345/" +] - added
Input schema / $defs / PMCIDSource / properties / value / formatAdded value: +"pubmed-pmcid" - changed
Input schema / $defs / PMCIDSource / properties / value / maxLengthPrevious value: -23New value: +512 - added
Input schema / $defs / PMCIDSource / properties / value / minLengthAdded value: +1 - removed
Input schema / $defs / PMCIDSource / properties / value / patternRemoved value: -"^PMC[1-9][0-9]{0,19}$" - added
Input schema / $defs / PMCIDSource / properties / value / x-pubmed-inputAdded value: +"pmcid" - added
Input schema / $defs / PMIDSource / properties / kind / anyOfAdded value: +[ + { + "const": "pmid", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[pP][mM][iI][dD])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / PMIDSource / properties / kind / constRemoved value: -"pmid" - removed
Input schema / $defs / PMIDSource / properties / kind / typeRemoved value: -"string" - added
Input schema / $defs / PMIDSource / properties / value / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / $defs / PMIDSource / properties / value / examplesAdded value: +[ + "33053718", + "PMID:33053718", + "https://pubmed.ncbi.nlm.nih.gov/33053718/" +] - added
Input schema / $defs / PMIDSource / properties / value / formatAdded value: +"pubmed-pmid" - changed
Input schema / $defs / PMIDSource / properties / value / maxLengthPrevious value: -20New value: +512 - added
Input schema / $defs / PMIDSource / properties / value / minLengthAdded value: +1 - removed
Input schema / $defs / PMIDSource / properties / value / patternRemoved value: -"^[1-9][0-9]{0,19}$" - added
Input schema / $defs / PMIDSource / properties / value / x-pubmed-inputAdded value: +"pmid" - changed
Input schema / properties / allow_browser_session / anyOfPrevious value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "boolean" + }, + { + "type": "null" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - added
Input schema / properties / extended_sources / anyOfAdded value: +[ + { + "default": false, + "title": "Extended Sources", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / extended_sources / typeRemoved value: -"boolean" - added
Input schema / properties / include_figures / anyOfAdded value: +[ + { + "default": false, + "title": "Include Figures", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / include_figures / typeRemoved value: -"boolean" - added
Input schema / properties / include_pdf_links / anyOfAdded value: +[ + { + "default": true, + "title": "Include Pdf Links", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / include_pdf_links / typeRemoved value: -"boolean" - added
Input schema / properties / output_format / anyOfAdded value: +[ + { + "default": "markdown", + "enum": [ + "markdown", + "json", + "toon" + ], + "title": "Output Format", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[mM][aA][rR][kK][dD][oO][wW][nN]|[jJ][sS][oO][nN]|[tT][oO][oO][nN])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / output_format / enumRemoved value: -[ - "markdown", - "json", - "toon" -] - removed
Input schema / properties / output_format / typeRemoved value: -"string" - added
Input schema / properties / source / anyOfAdded value: +[ + { + "discriminator": { + "mapping": { + "doi": "#/$defs/DOISource", + "pmcid": "#/$defs/PMCIDSource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/PMCIDSource" + }, + { + "$ref": "#/$defs/DOISource" + } + ], + "title": "Source" + }, + { + "contentMediaType": "application/json", + "contentSchema": { + "discriminator": { + "mapping": { + "doi": "#/$defs/DOISource", + "pmcid": "#/$defs/PMCIDSource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/PMCIDSource" + }, + { + "$ref": "#/$defs/DOISource" + } + ], + "title": "Source" + }, + "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.", + "maxLength": 1000000, + "type": "string" + }, + { + "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.", + "maxLength": 1000000, + "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$", + "type": "string", + "x-pubmed-decodedSchema": { + "discriminator": { + "mapping": { + "doi": "#/$defs/DOISource", + "pmcid": "#/$defs/PMCIDSource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/PMCIDSource" + }, + { + "$ref": "#/$defs/DOISource" + } + ], + "title": "Source" + }, + "x-pubmed-encoding": "fenced-json" + } +] - removed
Input schema / properties / source / discriminatorRemoved value: -{ - "mapping": { - "doi": "#/$defs/DOISource", - "pmcid": "#/$defs/PMCIDSource", - "pmid": "#/$defs/PMIDSource" - }, - "propertyName": "kind" -} - removed
Input schema / properties / source / oneOfRemoved value: -[ - { - "$ref": "#/$defs/PMIDSource" - }, - { - "$ref": "#/$defs/PMCIDSource" - }, - { - "$ref": "#/$defs/DOISource" - } -]
- Changed
get_gene_literature4 fields changed- added
Input schema / properties / limit / anyOfAdded value: +[ + { + "default": 20, + "maximum": 100, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / limit / maximumRemoved value: -100 - removed
Input schema / properties / limit / minimumRemoved value: -1 - removed
Input schema / properties / limit / typeRemoved value: -"integer"
- Changed
get_institutional_link26 fields changed- added
Input schema / $defs / DOISource / properties / kind / anyOfAdded value: +[ + { + "const": "doi", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[dD][oO][iI])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / DOISource / properties / kind / constRemoved value: -"doi" - removed
Input schema / $defs / DOISource / properties / kind / typeRemoved value: -"string" - added
Input schema / $defs / DOISource / properties / value / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / $defs / DOISource / properties / value / examplesAdded value: +[ + "10.1000/example", + "doi:10.1000/example", + "https://doi.org/10.1000/example" +] - added
Input schema / $defs / DOISource / properties / value / formatAdded value: +"pubmed-doi" - changed
Input schema / $defs / DOISource / properties / value / minLengthPrevious value: -7New value: +1 - removed
Input schema / $defs / DOISource / properties / value / patternRemoved value: -"^10\\.[0-9]{4,9}/" - added
Input schema / $defs / DOISource / properties / value / x-pubmed-inputAdded value: +"doi" - added
Input schema / $defs / InstitutionalMetadataSource / properties / kind / anyOfAdded value: +[ + { + "const": "metadata", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[mM][eE][tT][aA][dD][aA][tT][aA])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / InstitutionalMetadataSource / properties / kind / constRemoved value: -"metadata" - removed
Input schema / $defs / InstitutionalMetadataSource / properties / kind / typeRemoved value: -"string" - changed
Input schema / $defs / InstitutionalMetadataSource / properties / year / anyOfPrevious value: -[ - { - "maximum": 9999, - "minimum": 1000, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 9999, + "minimum": 1000, + "type": "integer" + }, + { + "type": "null" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - added
Input schema / $defs / PMIDSource / properties / kind / anyOfAdded value: +[ + { + "const": "pmid", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[pP][mM][iI][dD])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / PMIDSource / properties / kind / constRemoved value: -"pmid" - removed
Input schema / $defs / PMIDSource / properties / kind / typeRemoved value: -"string" - added
Input schema / $defs / PMIDSource / properties / value / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / $defs / PMIDSource / properties / value / examplesAdded value: +[ + "33053718", + "PMID:33053718", + "https://pubmed.ncbi.nlm.nih.gov/33053718/" +] - added
Input schema / $defs / PMIDSource / properties / value / formatAdded value: +"pubmed-pmid" - changed
Input schema / $defs / PMIDSource / properties / value / maxLengthPrevious value: -20New value: +512 - added
Input schema / $defs / PMIDSource / properties / value / minLengthAdded value: +1 - removed
Input schema / $defs / PMIDSource / properties / value / patternRemoved value: -"^[1-9][0-9]{0,19}$" - added
Input schema / $defs / PMIDSource / properties / value / x-pubmed-inputAdded value: +"pmid" - added
Input schema / properties / source / anyOfAdded value: +[ + { + "discriminator": { + "mapping": { + "doi": "#/$defs/DOISource", + "metadata": "#/$defs/InstitutionalMetadataSource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/DOISource" + }, + { + "$ref": "#/$defs/InstitutionalMetadataSource" + } + ], + "title": "Source" + }, + { + "contentMediaType": "application/json", + "contentSchema": { + "discriminator": { + "mapping": { + "doi": "#/$defs/DOISource", + "metadata": "#/$defs/InstitutionalMetadataSource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/DOISource" + }, + { + "$ref": "#/$defs/InstitutionalMetadataSource" + } + ], + "title": "Source" + }, + "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.", + "maxLength": 1000000, + "type": "string" + }, + { + "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.", + "maxLength": 1000000, + "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$", + "type": "string", + "x-pubmed-decodedSchema": { + "discriminator": { + "mapping": { + "doi": "#/$defs/DOISource", + "metadata": "#/$defs/InstitutionalMetadataSource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/DOISource" + }, + { + "$ref": "#/$defs/InstitutionalMetadataSource" + } + ], + "title": "Source" + }, + "x-pubmed-encoding": "fenced-json" + } +] - removed
Input schema / properties / source / discriminatorRemoved value: -{ - "mapping": { - "doi": "#/$defs/DOISource", - "metadata": "#/$defs/InstitutionalMetadataSource", - "pmid": "#/$defs/PMIDSource" - }, - "propertyName": "kind" -} - removed
Input schema / properties / source / oneOfRemoved value: -[ - { - "$ref": "#/$defs/PMIDSource" - }, - { - "$ref": "#/$defs/DOISource" - }, - { - "$ref": "#/$defs/InstitutionalMetadataSource" - } -]
- Changed
get_pipeline_history4 fields changed- added
Input schema / properties / limit / anyOfAdded value: +[ + { + "default": 5, + "maximum": 100, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / limit / maximumRemoved value: -100 - removed
Input schema / properties / limit / minimumRemoved value: -1 - removed
Input schema / properties / limit / typeRemoved value: -"integer"
- Changed
get_text_mined_terms27 fields changed- added
Input schema / $defs / PMCIDSource / properties / kind / anyOfAdded value: +[ + { + "const": "pmcid", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[pP][mM][cC][iI][dD])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / PMCIDSource / properties / kind / constRemoved value: -"pmcid" - removed
Input schema / $defs / PMCIDSource / properties / kind / typeRemoved value: -"string" - added
Input schema / $defs / PMCIDSource / properties / value / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / $defs / PMCIDSource / properties / value / examplesAdded value: +[ + "PMC12345", + "https://pmc.ncbi.nlm.nih.gov/articles/PMC12345/" +] - added
Input schema / $defs / PMCIDSource / properties / value / formatAdded value: +"pubmed-pmcid" - changed
Input schema / $defs / PMCIDSource / properties / value / maxLengthPrevious value: -23New value: +512 - added
Input schema / $defs / PMCIDSource / properties / value / minLengthAdded value: +1 - removed
Input schema / $defs / PMCIDSource / properties / value / patternRemoved value: -"^PMC[1-9][0-9]{0,19}$" - added
Input schema / $defs / PMCIDSource / properties / value / x-pubmed-inputAdded value: +"pmcid" - added
Input schema / $defs / PMIDSource / properties / kind / anyOfAdded value: +[ + { + "const": "pmid", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[pP][mM][iI][dD])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / PMIDSource / properties / kind / constRemoved value: -"pmid" - removed
Input schema / $defs / PMIDSource / properties / kind / typeRemoved value: -"string" - added
Input schema / $defs / PMIDSource / properties / value / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / $defs / PMIDSource / properties / value / examplesAdded value: +[ + "33053718", + "PMID:33053718", + "https://pubmed.ncbi.nlm.nih.gov/33053718/" +] - added
Input schema / $defs / PMIDSource / properties / value / formatAdded value: +"pubmed-pmid" - changed
Input schema / $defs / PMIDSource / properties / value / maxLengthPrevious value: -20New value: +512 - added
Input schema / $defs / PMIDSource / properties / value / minLengthAdded value: +1 - removed
Input schema / $defs / PMIDSource / properties / value / patternRemoved value: -"^[1-9][0-9]{0,19}$" - added
Input schema / $defs / PMIDSource / properties / value / x-pubmed-inputAdded value: +"pmid" - added
Input schema / properties / output_format / anyOfAdded value: +[ + { + "default": "markdown", + "enum": [ + "markdown", + "json", + "toon" + ], + "title": "Output Format", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[mM][aA][rR][kK][dD][oO][wW][nN]|[jJ][sS][oO][nN]|[tT][oO][oO][nN])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / output_format / enumRemoved value: -[ - "markdown", - "json", - "toon" -] - removed
Input schema / properties / output_format / typeRemoved value: -"string" - changed
Input schema / properties / semantic_type / anyOfPrevious value: -[ - { - "enum": [ - "GENE_PROTEIN", - "DISEASE", - "CHEMICAL", - "ORGANISM", - "GO_TERM", - "EFO" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "enum": [ + "GENE_PROTEIN", + "DISEASE", + "CHEMICAL", + "ORGANISM", + "GO_TERM", + "EFO" + ], + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[gG][eE][nN][eE]_[pP][rR][oO][tT][eE][iI][nN]|[dD][iI][sS][eE][aA][sS][eE]|[cC][hH][eE][mM][iI][cC][aA][lL]|[oO][rR][gG][aA][nN][iI][sS][mM]|[gG][oO]_[tT][eE][rR][mM]|[eE][fF][oO])[ \\t\\r\\n]*$", + "type": "string" + } + ] + }, + { + "type": "null" + } +] - added
Input schema / properties / source / anyOfAdded value: +[ + { + "discriminator": { + "mapping": { + "pmcid": "#/$defs/PMCIDSource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/PMCIDSource" + } + ], + "title": "Source" + }, + { + "contentMediaType": "application/json", + "contentSchema": { + "discriminator": { + "mapping": { + "pmcid": "#/$defs/PMCIDSource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/PMCIDSource" + } + ], + "title": "Source" + }, + "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.", + "maxLength": 1000000, + "type": "string" + }, + { + "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.", + "maxLength": 1000000, + "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$", + "type": "string", + "x-pubmed-decodedSchema": { + "discriminator": { + "mapping": { + "pmcid": "#/$defs/PMCIDSource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/PMCIDSource" + } + ], + "title": "Source" + }, + "x-pubmed-encoding": "fenced-json" + } +] - removed
Input schema / properties / source / discriminatorRemoved value: -{ - "mapping": { - "pmcid": "#/$defs/PMCIDSource", - "pmid": "#/$defs/PMIDSource" - }, - "propertyName": "kind" -} - removed
Input schema / properties / source / oneOfRemoved value: -[ - { - "$ref": "#/$defs/PMIDSource" - }, - { - "$ref": "#/$defs/PMCIDSource" - } -]
- Changed
list_pipelines3 fields changed- added
Input schema / properties / scope / anyOfAdded value: +[ + { + "default": "", + "enum": [ + "", + "workspace", + "global" + ], + "title": "Scope", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:|[wW][oO][rR][kK][sS][pP][aA][cC][eE]|[gG][lL][oO][bB][aA][lL])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / scope / enumRemoved value: -[ - "", - "workspace", - "global" -] - removed
Input schema / properties / scope / typeRemoved value: -"string"
- Changed
prepare_export10 fields changed- added
Input schema / properties / format / anyOfAdded value: +[ + { + "default": "ris", + "enum": [ + "ris", + "medline", + "csl", + "bibtex", + "csv", + "json" + ], + "title": "Format", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[rR][iI][sS]|[mM][eE][dD][lL][iI][nN][eE]|[cC][sS][lL]|[bB][iI][bB][tT][eE][xX]|[cC][sS][vV]|[jJ][sS][oO][nN])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / format / enumRemoved value: -[ - "ris", - "medline", - "csl", - "bibtex", - "csv", - "json" -] - removed
Input schema / properties / format / typeRemoved value: -"string" - added
Input schema / properties / include_abstract / anyOfAdded value: +[ + { + "default": true, + "title": "Include Abstract", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / include_abstract / typeRemoved value: -"boolean" - changed
Input schema / properties / pmids / anyOfPrevious value: -[ - { - "maxLength": 100000, - "minLength": 1, - "type": "string" - }, - { - "items": { - "maxLength": 512, - "minLength": 1, - "type": "string" - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - } -]New value: +[ + { + "description": "Complete PMID(s): delimited text, JSON string array, or Markdown list; optional JSON code fence. last only where supported.", + "examples": [ + "33053718,36170657", + "[\"33053718\",\"36170657\"]", + "- 33053718\n- 36170657" + ], + "format": "pubmed-pmid-batch", + "maxLength": 100000, + "minLength": 1, + "type": "string" + }, + { + "items": { + "description": "One PMID string, or last as the sole batch item for tools supporting session reuse.", + "examples": [ + "33053718" + ], + "format": "pubmed-pmid", + "maxLength": 512, + "minLength": 1, + "type": "string", + "x-pubmed-input": "pmid" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + } +] - added
Input schema / properties / pmids / x-pubmed-inputAdded value: +"pmid_batch" - added
Input schema / properties / source / anyOfAdded value: +[ + { + "default": "official", + "enum": [ + "official", + "local" + ], + "title": "Source", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[oO][fF][fF][iI][cC][iI][aA][lL]|[lL][oO][cC][aA][lL])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / source / enumRemoved value: -[ - "official", - "local" -] - removed
Input schema / properties / source / typeRemoved value: -"string"
- Changed
prepare_figure_search12 fields changed- added
Input schema / $defs / InlineImageSource / properties / kind / anyOfAdded value: +[ + { + "const": "base64", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[bB][aA][sS][eE]64)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / InlineImageSource / properties / kind / constRemoved value: -"base64" - removed
Input schema / $defs / InlineImageSource / properties / kind / typeRemoved value: -"string" - added
Input schema / $defs / URLImageSource / properties / kind / anyOfAdded value: +[ + { + "const": "url", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[uU][rR][lL])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / URLImageSource / properties / kind / constRemoved value: -"url" - removed
Input schema / $defs / URLImageSource / properties / kind / typeRemoved value: -"string" - added
Input schema / properties / search_type / anyOfAdded value: +[ + { + "default": "comprehensive", + "enum": [ + "comprehensive", + "methodology", + "results", + "structure", + "medical" + ], + "title": "Search Type", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[cC][oO][mM][pP][rR][eE][hH][eE][nN][sS][iI][vV][eE]|[mM][eE][tT][hH][oO][dD][oO][lL][oO][gG][yY]|[rR][eE][sS][uU][lL][tT][sS]|[sS][tT][rR][uU][cC][tT][uU][rR][eE]|[mM][eE][dD][iI][cC][aA][lL])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / search_type / enumRemoved value: -[ - "comprehensive", - "methodology", - "results", - "structure", - "medical" -] - removed
Input schema / properties / search_type / typeRemoved value: -"string" - added
Input schema / properties / source / anyOfAdded value: +[ + { + "discriminator": { + "mapping": { + "base64": "#/$defs/InlineImageSource", + "url": "#/$defs/URLImageSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/InlineImageSource" + }, + { + "$ref": "#/$defs/URLImageSource" + } + ], + "title": "Source" + }, + { + "contentMediaType": "application/json", + "contentSchema": { + "discriminator": { + "mapping": { + "base64": "#/$defs/InlineImageSource", + "url": "#/$defs/URLImageSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/InlineImageSource" + }, + { + "$ref": "#/$defs/URLImageSource" + } + ], + "title": "Source" + }, + "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.", + "maxLength": 1000000, + "type": "string" + }, + { + "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.", + "maxLength": 1000000, + "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$", + "type": "string", + "x-pubmed-decodedSchema": { + "discriminator": { + "mapping": { + "base64": "#/$defs/InlineImageSource", + "url": "#/$defs/URLImageSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/InlineImageSource" + }, + { + "$ref": "#/$defs/URLImageSource" + } + ], + "title": "Source" + }, + "x-pubmed-encoding": "fenced-json" + } +] - removed
Input schema / properties / source / discriminatorRemoved value: -{ - "mapping": { - "base64": "#/$defs/InlineImageSource", - "url": "#/$defs/URLImageSource" - }, - "propertyName": "kind" -} - removed
Input schema / properties / source / oneOfRemoved value: -[ - { - "$ref": "#/$defs/InlineImageSource" - }, - { - "$ref": "#/$defs/URLImageSource" - } -]
- Changed
read_research_chronicle58 fields changed- added
Input schema / $defs / ChronicleCompareRequest / properties / action / anyOfAdded value: +[ + { + "const": "compare", + "title": "Action", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[cC][oO][mM][pP][aA][rR][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / ChronicleCompareRequest / properties / action / constRemoved value: -"compare" - removed
Input schema / $defs / ChronicleCompareRequest / properties / action / typeRemoved value: -"string" - added
Input schema / $defs / ChronicleCompareRequest / properties / selection / anyOfAdded value: +[ + { + "discriminator": { + "mapping": { + "chronicle_ids": "#/$defs/ChronicleIdsSelection", + "topics": "#/$defs/ChronicleTopicsSelection" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/ChronicleTopicsSelection" + }, + { + "$ref": "#/$defs/ChronicleIdsSelection" + } + ], + "title": "Selection" + }, + { + "contentMediaType": "application/json", + "contentSchema": { + "discriminator": { + "mapping": { + "chronicle_ids": "#/$defs/ChronicleIdsSelection", + "topics": "#/$defs/ChronicleTopicsSelection" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/ChronicleTopicsSelection" + }, + { + "$ref": "#/$defs/ChronicleIdsSelection" + } + ], + "title": "Selection" + }, + "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.", + "maxLength": 1000000, + "type": "string" + }, + { + "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.", + "maxLength": 1000000, + "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$", + "type": "string", + "x-pubmed-decodedSchema": { + "discriminator": { + "mapping": { + "chronicle_ids": "#/$defs/ChronicleIdsSelection", + "topics": "#/$defs/ChronicleTopicsSelection" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/ChronicleTopicsSelection" + }, + { + "$ref": "#/$defs/ChronicleIdsSelection" + } + ], + "title": "Selection" + }, + "x-pubmed-encoding": "fenced-json" + } +] - removed
Input schema / $defs / ChronicleCompareRequest / properties / selection / discriminatorRemoved value: -{ - "mapping": { - "chronicle_ids": "#/$defs/ChronicleIdsSelection", - "topics": "#/$defs/ChronicleTopicsSelection" - }, - "propertyName": "kind" -} - removed
Input schema / $defs / ChronicleCompareRequest / properties / selection / oneOfRemoved value: -[ - { - "$ref": "#/$defs/ChronicleTopicsSelection" - }, - { - "$ref": "#/$defs/ChronicleIdsSelection" - } -] - added
Input schema / $defs / ChronicleDiffRequest / properties / action / anyOfAdded value: +[ + { + "const": "diff", + "title": "Action", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[dD][iI][fF][fF])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / ChronicleDiffRequest / properties / action / constRemoved value: -"diff" - removed
Input schema / $defs / ChronicleDiffRequest / properties / action / typeRemoved value: -"string" - added
Input schema / $defs / ChronicleDiffRequest / properties / from_revision / anyOfAdded value: +[ + { + "description": "Positive Chronicle revision", + "maximum": 2000000000, + "minimum": 1, + "title": "From Revision", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / ChronicleDiffRequest / properties / from_revision / maximumRemoved value: -2000000000 - removed
Input schema / $defs / ChronicleDiffRequest / properties / from_revision / minimumRemoved value: -1 - removed
Input schema / $defs / ChronicleDiffRequest / properties / from_revision / typeRemoved value: -"integer" - changed
Input schema / $defs / ChronicleDiffRequest / properties / to_revision / anyOfPrevious value: -[ - { - "description": "Positive Chronicle revision", - "maximum": 2000000000, - "minimum": 1, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Positive Chronicle revision", + "maximum": 2000000000, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - added
Input schema / $defs / ChronicleIdsSelection / properties / kind / anyOfAdded value: +[ + { + "const": "chronicle_ids", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[cC][hH][rR][oO][nN][iI][cC][lL][eE]_[iI][dD][sS])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / ChronicleIdsSelection / properties / kind / constRemoved value: -"chronicle_ids" - removed
Input schema / $defs / ChronicleIdsSelection / properties / kind / typeRemoved value: -"string" - added
Input schema / $defs / ChronicleIdsSelection / properties / values / anyOfAdded value: +[ + { + "items": { + "maxLength": 200, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]*$", + "type": "string" + }, + "maxItems": 5, + "minItems": 2, + "title": "Values", + "type": "array" + }, + { + "contentMediaType": "application/json", + "contentSchema": { + "items": { + "maxLength": 200, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]*$", + "type": "string" + }, + "maxItems": 5, + "minItems": 2, + "title": "Values", + "type": "array" + }, + "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.", + "maxLength": 1000000, + "type": "string" + }, + { + "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.", + "maxLength": 1000000, + "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$", + "type": "string", + "x-pubmed-decodedSchema": { + "items": { + "maxLength": 200, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]*$", + "type": "string" + }, + "maxItems": 5, + "minItems": 2, + "title": "Values", + "type": "array" + }, + "x-pubmed-encoding": "fenced-json" + } +] - removed
Input schema / $defs / ChronicleIdsSelection / properties / values / itemsRemoved value: -{ - "maxLength": 200, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]*$", - "type": "string" -} - removed
Input schema / $defs / ChronicleIdsSelection / properties / values / maxItemsRemoved value: -5 - removed
Input schema / $defs / ChronicleIdsSelection / properties / values / minItemsRemoved value: -2 - removed
Input schema / $defs / ChronicleIdsSelection / properties / values / typeRemoved value: -"array" - added
Input schema / $defs / ChronicleListRequest / properties / action / anyOfAdded value: +[ + { + "const": "list", + "title": "Action", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[lL][iI][sS][tT])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / ChronicleListRequest / properties / action / constRemoved value: -"list" - removed
Input schema / $defs / ChronicleListRequest / properties / action / typeRemoved value: -"string" - added
Input schema / $defs / ChronicleListRequest / properties / limit / anyOfAdded value: +[ + { + "default": 20, + "description": "Maximum Chronicle records", + "maximum": 100, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / ChronicleListRequest / properties / limit / maximumRemoved value: -100 - removed
Input schema / $defs / ChronicleListRequest / properties / limit / minimumRemoved value: -1 - removed
Input schema / $defs / ChronicleListRequest / properties / limit / typeRemoved value: -"integer" - added
Input schema / $defs / ChronicleLoadRequest / properties / action / anyOfAdded value: +[ + { + "const": "load", + "title": "Action", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[lL][oO][aA][dD])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / ChronicleLoadRequest / properties / action / constRemoved value: -"load" - removed
Input schema / $defs / ChronicleLoadRequest / properties / action / typeRemoved value: -"string" - added
Input schema / $defs / ChronicleLoadRequest / properties / output / anyOfAdded value: +[ + { + "default": "summary", + "enum": [ + "summary", + "json", + "chronicle_map", + "timeline", + "tree", + "graph", + "evidence", + "milestones", + "mermaid", + "narrative" + ], + "title": "Output", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[sS][uU][mM][mM][aA][rR][yY]|[jJ][sS][oO][nN]|[cC][hH][rR][oO][nN][iI][cC][lL][eE]_[mM][aA][pP]|[tT][iI][mM][eE][lL][iI][nN][eE]|[tT][rR][eE][eE]|[gG][rR][aA][pP][hH]|[eE][vV][iI][dD][eE][nN][cC][eE]|[mM][iI][lL][eE][sS][tT][oO][nN][eE][sS]|[mM][eE][rR][mM][aA][iI][dD]|[nN][aA][rR][rR][aA][tT][iI][vV][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / ChronicleLoadRequest / properties / output / enumRemoved value: -[ - "summary", - "json", - "chronicle_map", - "timeline", - "tree", - "graph", - "evidence", - "milestones", - "mermaid", - "narrative" -] - removed
Input schema / $defs / ChronicleLoadRequest / properties / output / typeRemoved value: -"string" - changed
Input schema / $defs / ChronicleLoadRequest / properties / revision / anyOfPrevious value: -[ - { - "description": "Positive Chronicle revision", - "maximum": 2000000000, - "minimum": 1, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Positive Chronicle revision", + "maximum": 2000000000, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - added
Input schema / $defs / ChronicleMilestonesRequest / properties / action / anyOfAdded value: +[ + { + "const": "milestones", + "title": "Action", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[mM][iI][lL][eE][sS][tT][oO][nN][eE][sS])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / ChronicleMilestonesRequest / properties / action / constRemoved value: -"milestones" - removed
Input schema / $defs / ChronicleMilestonesRequest / properties / action / typeRemoved value: -"string" - changed
Input schema / $defs / ChronicleMilestonesRequest / properties / revision / anyOfPrevious value: -[ - { - "description": "Positive Chronicle revision", - "maximum": 2000000000, - "minimum": 1, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Positive Chronicle revision", + "maximum": 2000000000, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - added
Input schema / $defs / ChronicleNarrateRequest / properties / action / anyOfAdded value: +[ + { + "const": "narrate", + "title": "Action", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[nN][aA][rR][rR][aA][tT][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / ChronicleNarrateRequest / properties / action / constRemoved value: -"narrate" - removed
Input schema / $defs / ChronicleNarrateRequest / properties / action / typeRemoved value: -"string" - added
Input schema / $defs / ChronicleNarrateRequest / properties / mode / anyOfAdded value: +[ + { + "default": "brief", + "enum": [ + "brief", + "full" + ], + "title": "Mode", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[bB][rR][iI][eE][fF]|[fF][uU][lL][lL])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / ChronicleNarrateRequest / properties / mode / enumRemoved value: -[ - "brief", - "full" -] - removed
Input schema / $defs / ChronicleNarrateRequest / properties / mode / typeRemoved value: -"string" - changed
Input schema / $defs / ChronicleNarrateRequest / properties / revision / anyOfPrevious value: -[ - { - "description": "Positive Chronicle revision", - "maximum": 2000000000, - "minimum": 1, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Positive Chronicle revision", + "maximum": 2000000000, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - added
Input schema / $defs / ChronicleTopicsSelection / properties / kind / anyOfAdded value: +[ + { + "const": "topics", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[tT][oO][pP][iI][cC][sS])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / ChronicleTopicsSelection / properties / kind / constRemoved value: -"topics" - removed
Input schema / $defs / ChronicleTopicsSelection / properties / kind / typeRemoved value: -"string" - added
Input schema / $defs / ChronicleTopicsSelection / properties / values / anyOfAdded value: +[ + { + "items": { + "maxLength": 500, + "minLength": 1, + "pattern": ".*\\S.*", + "type": "string" + }, + "maxItems": 5, + "minItems": 2, + "title": "Values", + "type": "array" + }, + { + "contentMediaType": "application/json", + "contentSchema": { + "items": { + "maxLength": 500, + "minLength": 1, + "pattern": ".*\\S.*", + "type": "string" + }, + "maxItems": 5, + "minItems": 2, + "title": "Values", + "type": "array" + }, + "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.", + "maxLength": 1000000, + "type": "string" + }, + { + "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.", + "maxLength": 1000000, + "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$", + "type": "string", + "x-pubmed-decodedSchema": { + "items": { + "maxLength": 500, + "minLength": 1, + "pattern": ".*\\S.*", + "type": "string" + }, + "maxItems": 5, + "minItems": 2, + "title": "Values", + "type": "array" + }, + "x-pubmed-encoding": "fenced-json" + } +] - removed
Input schema / $defs / ChronicleTopicsSelection / properties / values / itemsRemoved value: -{ - "maxLength": 500, - "minLength": 1, - "pattern": ".*\\S.*", - "type": "string" -} - removed
Input schema / $defs / ChronicleTopicsSelection / properties / values / maxItemsRemoved value: -5 - removed
Input schema / $defs / ChronicleTopicsSelection / properties / values / minItemsRemoved value: -2 - removed
Input schema / $defs / ChronicleTopicsSelection / properties / values / typeRemoved value: -"array" - added
Input schema / properties / request / anyOfAdded value: +[ + { + "discriminator": { + "mapping": { + "compare": "#/$defs/ChronicleCompareRequest", + "diff": "#/$defs/ChronicleDiffRequest", + "list": "#/$defs/ChronicleListRequest", + "load": "#/$defs/ChronicleLoadRequest", + "milestones": "#/$defs/ChronicleMilestonesRequest", + "narrate": "#/$defs/ChronicleNarrateRequest" + }, + "propertyName": "action" + }, + "oneOf": [ + { + "$ref": "#/$defs/ChronicleLoadRequest" + }, + { + "$ref": "#/$defs/ChronicleListRequest" + }, + { + "$ref": "#/$defs/ChronicleDiffRequest" + }, + { + "$ref": "#/$defs/ChronicleNarrateRequest" + }, + { + "$ref": "#/$defs/ChronicleMilestonesRequest" + }, + { + "$ref": "#/$defs/ChronicleCompareRequest" + } + ], + "title": "Request" + }, + { + "contentMediaType": "application/json", + "contentSchema": { + "discriminator": { + "mapping": { + "compare": "#/$defs/ChronicleCompareRequest", + "diff": "#/$defs/ChronicleDiffRequest", + "list": "#/$defs/ChronicleListRequest", + "load": "#/$defs/ChronicleLoadRequest", + "milestones": "#/$defs/ChronicleMilestonesRequest", + "narrate": "#/$defs/ChronicleNarrateRequest" + }, + "propertyName": "action" + }, + "oneOf": [ + { + "$ref": "#/$defs/ChronicleLoadRequest" + }, + { + "$ref": "#/$defs/ChronicleListRequest" + }, + { + "$ref": "#/$defs/ChronicleDiffRequest" + }, + { + "$ref": "#/$defs/ChronicleNarrateRequest" + }, + { + "$ref": "#/$defs/ChronicleMilestonesRequest" + }, + { + "$ref": "#/$defs/ChronicleCompareRequest" + } + ], + "title": "Request" + }, + "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.", + "maxLength": 1000000, + "type": "string" + }, + { + "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.", + "maxLength": 1000000, + "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$", + "type": "string", + "x-pubmed-decodedSchema": { + "discriminator": { + "mapping": { + "compare": "#/$defs/ChronicleCompareRequest", + "diff": "#/$defs/ChronicleDiffRequest", + "list": "#/$defs/ChronicleListRequest", + "load": "#/$defs/ChronicleLoadRequest", + "milestones": "#/$defs/ChronicleMilestonesRequest", + "narrate": "#/$defs/ChronicleNarrateRequest" + }, + "propertyName": "action" + }, + "oneOf": [ + { + "$ref": "#/$defs/ChronicleLoadRequest" + }, + { + "$ref": "#/$defs/ChronicleListRequest" + }, + { + "$ref": "#/$defs/ChronicleDiffRequest" + }, + { + "$ref": "#/$defs/ChronicleNarrateRequest" + }, + { + "$ref": "#/$defs/ChronicleMilestonesRequest" + }, + { + "$ref": "#/$defs/ChronicleCompareRequest" + } + ], + "title": "Request" + }, + "x-pubmed-encoding": "fenced-json" + } +] - removed
Input schema / properties / request / discriminatorRemoved value: -{ - "mapping": { - "compare": "#/$defs/ChronicleCompareRequest", - "diff": "#/$defs/ChronicleDiffRequest", - "list": "#/$defs/ChronicleListRequest", - "load": "#/$defs/ChronicleLoadRequest", - "milestones": "#/$defs/ChronicleMilestonesRequest", - "narrate": "#/$defs/ChronicleNarrateRequest" - }, - "propertyName": "action" -} - removed
Input schema / properties / request / oneOfRemoved value: -[ - { - "$ref": "#/$defs/ChronicleLoadRequest" - }, - { - "$ref": "#/$defs/ChronicleListRequest" - }, - { - "$ref": "#/$defs/ChronicleDiffRequest" - }, - { - "$ref": "#/$defs/ChronicleNarrateRequest" - }, - { - "$ref": "#/$defs/ChronicleMilestonesRequest" - }, - { - "$ref": "#/$defs/ChronicleCompareRequest" - } -]
- Changed
read_session87 fields changed- added
Input schema / $defs / ArtifactIdLocator / properties / kind / anyOfAdded value: +[ + { + "const": "artifact_id", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[aA][rR][tT][iI][fF][aA][cC][tT]_[iI][dD])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / ArtifactIdLocator / properties / kind / constRemoved value: -"artifact_id" - removed
Input schema / $defs / ArtifactIdLocator / properties / kind / typeRemoved value: -"string" - added
Input schema / $defs / ArtifactUriLocator / properties / kind / anyOfAdded value: +[ + { + "const": "artifact_uri", + "title": "Kind", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[aA][rR][tT][iI][fF][aA][cC][tT]_[uU][rR][iI])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / ArtifactUriLocator / properties / kind / constRemoved value: -"artifact_uri" - removed
Input schema / $defs / ArtifactUriLocator / properties / kind / typeRemoved value: -"string" - added
Input schema / $defs / SessionArticleRequest / properties / action / anyOfAdded value: +[ + { + "const": "article", + "title": "Action", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[aA][rR][tT][iI][cC][lL][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionArticleRequest / properties / action / constRemoved value: -"article" - removed
Input schema / $defs / SessionArticleRequest / properties / action / typeRemoved value: -"string" - added
Input schema / $defs / SessionArticleRequest / properties / pmid / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / $defs / SessionArticleRequest / properties / pmid / examplesAdded value: +[ + "33053718", + "PMID:33053718", + "https://pubmed.ncbi.nlm.nih.gov/33053718/" +] - added
Input schema / $defs / SessionArticleRequest / properties / pmid / formatAdded value: +"pubmed-pmid" - changed
Input schema / $defs / SessionArticleRequest / properties / pmid / maxLengthPrevious value: -20New value: +512 - added
Input schema / $defs / SessionArticleRequest / properties / pmid / minLengthAdded value: +1 - removed
Input schema / $defs / SessionArticleRequest / properties / pmid / patternRemoved value: -"^[1-9][0-9]{0,19}$" - added
Input schema / $defs / SessionArticleRequest / properties / pmid / x-pubmed-inputAdded value: +"pmid" - added
Input schema / $defs / SessionArtifactRequest / properties / action / anyOfAdded value: +[ + { + "const": "artifact", + "title": "Action", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[aA][rR][tT][iI][fF][aA][cC][tT])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionArtifactRequest / properties / action / constRemoved value: -"artifact" - removed
Input schema / $defs / SessionArtifactRequest / properties / action / typeRemoved value: -"string" - added
Input schema / $defs / SessionArtifactRequest / properties / include_local_paths / anyOfAdded value: +[ + { + "default": false, + "title": "Include Local Paths", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionArtifactRequest / properties / include_local_paths / typeRemoved value: -"boolean" - added
Input schema / $defs / SessionArtifactRequest / properties / locator / anyOfAdded value: +[ + { + "discriminator": { + "mapping": { + "artifact_id": "#/$defs/ArtifactIdLocator", + "artifact_uri": "#/$defs/ArtifactUriLocator" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/ArtifactIdLocator" + }, + { + "$ref": "#/$defs/ArtifactUriLocator" + } + ], + "title": "Locator" + }, + { + "contentMediaType": "application/json", + "contentSchema": { + "discriminator": { + "mapping": { + "artifact_id": "#/$defs/ArtifactIdLocator", + "artifact_uri": "#/$defs/ArtifactUriLocator" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/ArtifactIdLocator" + }, + { + "$ref": "#/$defs/ArtifactUriLocator" + } + ], + "title": "Locator" + }, + "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.", + "maxLength": 1000000, + "type": "string" + }, + { + "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.", + "maxLength": 1000000, + "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$", + "type": "string", + "x-pubmed-decodedSchema": { + "discriminator": { + "mapping": { + "artifact_id": "#/$defs/ArtifactIdLocator", + "artifact_uri": "#/$defs/ArtifactUriLocator" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/ArtifactIdLocator" + }, + { + "$ref": "#/$defs/ArtifactUriLocator" + } + ], + "title": "Locator" + }, + "x-pubmed-encoding": "fenced-json" + } +] - removed
Input schema / $defs / SessionArtifactRequest / properties / locator / discriminatorRemoved value: -{ - "mapping": { - "artifact_id": "#/$defs/ArtifactIdLocator", - "artifact_uri": "#/$defs/ArtifactUriLocator" - }, - "propertyName": "kind" -} - removed
Input schema / $defs / SessionArtifactRequest / properties / locator / oneOfRemoved value: -[ - { - "$ref": "#/$defs/ArtifactIdLocator" - }, - { - "$ref": "#/$defs/ArtifactUriLocator" - } -] - added
Input schema / $defs / SessionArtifactRequest / properties / max_chars / anyOfAdded value: +[ + { + "default": 200000, + "maximum": 200000, + "minimum": 1, + "title": "Max Chars", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionArtifactRequest / properties / max_chars / maximumRemoved value: -200000 - removed
Input schema / $defs / SessionArtifactRequest / properties / max_chars / minimumRemoved value: -1 - removed
Input schema / $defs / SessionArtifactRequest / properties / max_chars / typeRemoved value: -"integer" - added
Input schema / $defs / SessionArtifactRequest / properties / offset / anyOfAdded value: +[ + { + "default": 0, + "maximum": 2000000000, + "minimum": 0, + "title": "Offset", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionArtifactRequest / properties / offset / maximumRemoved value: -2000000000 - removed
Input schema / $defs / SessionArtifactRequest / properties / offset / minimumRemoved value: -0 - removed
Input schema / $defs / SessionArtifactRequest / properties / offset / typeRemoved value: -"integer" - added
Input schema / $defs / SessionListArtifactsRequest / properties / action / anyOfAdded value: +[ + { + "const": "list_artifacts", + "title": "Action", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[lL][iI][sS][tT]_[aA][rR][tT][iI][fF][aA][cC][tT][sS])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionListArtifactsRequest / properties / action / constRemoved value: -"list_artifacts" - removed
Input schema / $defs / SessionListArtifactsRequest / properties / action / typeRemoved value: -"string" - added
Input schema / $defs / SessionListArtifactsRequest / properties / include_local_paths / anyOfAdded value: +[ + { + "default": false, + "title": "Include Local Paths", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionListArtifactsRequest / properties / include_local_paths / typeRemoved value: -"boolean" - added
Input schema / $defs / SessionListArtifactsRequest / properties / limit / anyOfAdded value: +[ + { + "default": 10, + "maximum": 100, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionListArtifactsRequest / properties / limit / maximumRemoved value: -100 - removed
Input schema / $defs / SessionListArtifactsRequest / properties / limit / minimumRemoved value: -1 - removed
Input schema / $defs / SessionListArtifactsRequest / properties / limit / typeRemoved value: -"integer" - added
Input schema / $defs / SessionLogRequest / properties / action / anyOfAdded value: +[ + { + "const": "log", + "title": "Action", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[lL][oO][gG])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionLogRequest / properties / action / constRemoved value: -"log" - removed
Input schema / $defs / SessionLogRequest / properties / action / typeRemoved value: -"string" - added
Input schema / $defs / SessionLogRequest / properties / event_limit / anyOfAdded value: +[ + { + "default": 50, + "maximum": 500, + "minimum": 1, + "title": "Event Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionLogRequest / properties / event_limit / maximumRemoved value: -500 - removed
Input schema / $defs / SessionLogRequest / properties / event_limit / minimumRemoved value: -1 - removed
Input schema / $defs / SessionLogRequest / properties / event_limit / typeRemoved value: -"integer" - added
Input schema / $defs / SessionLogRequest / properties / history_limit / anyOfAdded value: +[ + { + "default": 10, + "maximum": 100, + "minimum": 1, + "title": "History Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionLogRequest / properties / history_limit / maximumRemoved value: -100 - removed
Input schema / $defs / SessionLogRequest / properties / history_limit / minimumRemoved value: -1 - removed
Input schema / $defs / SessionLogRequest / properties / history_limit / typeRemoved value: -"integer" - added
Input schema / $defs / SessionLogRequest / properties / include_history / anyOfAdded value: +[ + { + "default": true, + "title": "Include History", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionLogRequest / properties / include_history / typeRemoved value: -"boolean" - added
Input schema / $defs / SessionPmidsRequest / properties / action / anyOfAdded value: +[ + { + "const": "pmids", + "title": "Action", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[pP][mM][iI][dD][sS])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionPmidsRequest / properties / action / constRemoved value: -"pmids" - removed
Input schema / $defs / SessionPmidsRequest / properties / action / typeRemoved value: -"string" - added
Input schema / $defs / SessionPmidsRequest / properties / search_index / anyOfAdded value: +[ + { + "default": -1, + "maximum": 100000, + "minimum": -100000, + "title": "Search Index", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionPmidsRequest / properties / search_index / maximumRemoved value: -100000 - removed
Input schema / $defs / SessionPmidsRequest / properties / search_index / minimumRemoved value: --100000 - removed
Input schema / $defs / SessionPmidsRequest / properties / search_index / typeRemoved value: -"integer" - added
Input schema / $defs / SessionReplaySearchRequest / properties / action / anyOfAdded value: +[ + { + "const": "replay_search", + "title": "Action", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[rR][eE][pP][lL][aA][yY]_[sS][eE][aA][rR][cC][hH])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionReplaySearchRequest / properties / action / constRemoved value: -"replay_search" - removed
Input schema / $defs / SessionReplaySearchRequest / properties / action / typeRemoved value: -"string" - added
Input schema / $defs / SessionSearchRunRequest / properties / action / anyOfAdded value: +[ + { + "const": "search_run", + "title": "Action", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[sS][eE][aA][rR][cC][hH]_[rR][uU][nN])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionSearchRunRequest / properties / action / constRemoved value: -"search_run" - removed
Input schema / $defs / SessionSearchRunRequest / properties / action / typeRemoved value: -"string" - added
Input schema / $defs / SessionSearchRunsRequest / properties / action / anyOfAdded value: +[ + { + "const": "search_runs", + "title": "Action", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[sS][eE][aA][rR][cC][hH]_[rR][uU][nN][sS])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionSearchRunsRequest / properties / action / constRemoved value: -"search_runs" - removed
Input schema / $defs / SessionSearchRunsRequest / properties / action / typeRemoved value: -"string" - added
Input schema / $defs / SessionSearchRunsRequest / properties / limit / anyOfAdded value: +[ + { + "default": 10, + "maximum": 100, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionSearchRunsRequest / properties / limit / maximumRemoved value: -100 - removed
Input schema / $defs / SessionSearchRunsRequest / properties / limit / minimumRemoved value: -1 - removed
Input schema / $defs / SessionSearchRunsRequest / properties / limit / typeRemoved value: -"integer" - changed
Input schema / $defs / SessionSearchRunsRequest / properties / status / anyOfPrevious value: -[ - { - "enum": [ - "started", - "planned", - "running", - "completed", - "partial", - "failed", - "cancelled", - "interrupted" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "enum": [ + "started", + "planned", + "running", + "completed", + "partial", + "failed", + "cancelled", + "interrupted" + ], + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[sS][tT][aA][rR][tT][eE][dD]|[pP][lL][aA][nN][nN][eE][dD]|[rR][uU][nN][nN][iI][nN][gG]|[cC][oO][mM][pP][lL][eE][tT][eE][dD]|[pP][aA][rR][tT][iI][aA][lL]|[fF][aA][iI][lL][eE][dD]|[cC][aA][nN][cC][eE][lL][lL][eE][dD]|[iI][nN][tT][eE][rR][rR][uU][pP][tT][eE][dD])[ \\t\\r\\n]*$", + "type": "string" + } + ] + }, + { + "type": "null" + } +] - added
Input schema / $defs / SessionSummaryRequest / properties / action / anyOfAdded value: +[ + { + "const": "summary", + "title": "Action", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[sS][uU][mM][mM][aA][rR][yY])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionSummaryRequest / properties / action / constRemoved value: -"summary" - removed
Input schema / $defs / SessionSummaryRequest / properties / action / typeRemoved value: -"string" - added
Input schema / $defs / SessionSummaryRequest / properties / history_limit / anyOfAdded value: +[ + { + "default": 10, + "maximum": 100, + "minimum": 1, + "title": "History Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionSummaryRequest / properties / history_limit / maximumRemoved value: -100 - removed
Input schema / $defs / SessionSummaryRequest / properties / history_limit / minimumRemoved value: -1 - removed
Input schema / $defs / SessionSummaryRequest / properties / history_limit / typeRemoved value: -"integer" - added
Input schema / $defs / SessionSummaryRequest / properties / include_history / anyOfAdded value: +[ + { + "default": false, + "title": "Include History", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / $defs / SessionSummaryRequest / properties / include_history / typeRemoved value: -"boolean" - added
Input schema / properties / request / anyOfAdded value: +[ + { + "discriminator": { + "mapping": { + "article": "#/$defs/SessionArticleRequest", + "artifact": "#/$defs/SessionArtifactRequest", + "list_artifacts": "#/$defs/SessionListArtifactsRequest", + "log": "#/$defs/SessionLogRequest", + "pmids": "#/$defs/SessionPmidsRequest", + "replay_search": "#/$defs/SessionReplaySearchRequest", + "search_run": "#/$defs/SessionSearchRunRequest", + "search_runs": "#/$defs/SessionSearchRunsRequest", + "summary": "#/$defs/SessionSummaryRequest" + }, + "propertyName": "action" + }, + "oneOf": [ + { + "$ref": "#/$defs/SessionPmidsRequest" + }, + { + "$ref": "#/$defs/SessionArticleRequest" + }, + { + "$ref": "#/$defs/SessionSummaryRequest" + }, + { + "$ref": "#/$defs/SessionLogRequest" + }, + { + "$ref": "#/$defs/SessionListArtifactsRequest" + }, + { + "$ref": "#/$defs/SessionArtifactRequest" + }, + { + "$ref": "#/$defs/SessionSearchRunsRequest" + }, + { + "$ref": "#/$defs/SessionSearchRunRequest" + }, + { + "$ref": "#/$defs/SessionReplaySearchRequest" + } + ], + "title": "Request" + }, + { + "contentMediaType": "application/json", + "contentSchema": { + "discriminator": { + "mapping": { + "article": "#/$defs/SessionArticleRequest", + "artifact": "#/$defs/SessionArtifactRequest", + "list_artifacts": "#/$defs/SessionListArtifactsRequest", + "log": "#/$defs/SessionLogRequest", + "pmids": "#/$defs/SessionPmidsRequest", + "replay_search": "#/$defs/SessionReplaySearchRequest", + "search_run": "#/$defs/SessionSearchRunRequest", + "search_runs": "#/$defs/SessionSearchRunsRequest", + "summary": "#/$defs/SessionSummaryRequest" + }, + "propertyName": "action" + }, + "oneOf": [ + { + "$ref": "#/$defs/SessionPmidsRequest" + }, + { + "$ref": "#/$defs/SessionArticleRequest" + }, + { + "$ref": "#/$defs/SessionSummaryRequest" + }, + { + "$ref": "#/$defs/SessionLogRequest" + }, + { + "$ref": "#/$defs/SessionListArtifactsRequest" + }, + { + "$ref": "#/$defs/SessionArtifactRequest" + }, + { + "$ref": "#/$defs/SessionSearchRunsRequest" + }, + { + "$ref": "#/$defs/SessionSearchRunRequest" + }, + { + "$ref": "#/$defs/SessionReplaySearchRequest" + } + ], + "title": "Request" + }, + "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.", + "maxLength": 1000000, + "type": "string" + }, + { + "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.", + "maxLength": 1000000, + "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$", + "type": "string", + "x-pubmed-decodedSchema": { + "discriminator": { + "mapping": { + "article": "#/$defs/SessionArticleRequest", + "artifact": "#/$defs/SessionArtifactRequest", + "list_artifacts": "#/$defs/SessionListArtifactsRequest", + "log": "#/$defs/SessionLogRequest", + "pmids": "#/$defs/SessionPmidsRequest", + "replay_search": "#/$defs/SessionReplaySearchRequest", + "search_run": "#/$defs/SessionSearchRunRequest", + "search_runs": "#/$defs/SessionSearchRunsRequest", + "summary": "#/$defs/SessionSummaryRequest" + }, + "propertyName": "action" + }, + "oneOf": [ + { + "$ref": "#/$defs/SessionPmidsRequest" + }, + { + "$ref": "#/$defs/SessionArticleRequest" + }, + { + "$ref": "#/$defs/SessionSummaryRequest" + }, + { + "$ref": "#/$defs/SessionLogRequest" + }, + { + "$ref": "#/$defs/SessionListArtifactsRequest" + }, + { + "$ref": "#/$defs/SessionArtifactRequest" + }, + { + "$ref": "#/$defs/SessionSearchRunsRequest" + }, + { + "$ref": "#/$defs/SessionSearchRunRequest" + }, + { + "$ref": "#/$defs/SessionReplaySearchRequest" + } + ], + "title": "Request" + }, + "x-pubmed-encoding": "fenced-json" + } +] - removed
Input schema / properties / request / discriminatorRemoved value: -{ - "mapping": { - "article": "#/$defs/SessionArticleRequest", - "artifact": "#/$defs/SessionArtifactRequest", - "list_artifacts": "#/$defs/SessionListArtifactsRequest", - "log": "#/$defs/SessionLogRequest", - "pmids": "#/$defs/SessionPmidsRequest", - "replay_search": "#/$defs/SessionReplaySearchRequest", - "search_run": "#/$defs/SessionSearchRunRequest", - "search_runs": "#/$defs/SessionSearchRunsRequest", - "summary": "#/$defs/SessionSummaryRequest" - }, - "propertyName": "action" -} - removed
Input schema / properties / request / oneOfRemoved value: -[ - { - "$ref": "#/$defs/SessionPmidsRequest" - }, - { - "$ref": "#/$defs/SessionArticleRequest" - }, - { - "$ref": "#/$defs/SessionSummaryRequest" - }, - { - "$ref": "#/$defs/SessionLogRequest" - }, - { - "$ref": "#/$defs/SessionListArtifactsRequest" - }, - { - "$ref": "#/$defs/SessionArtifactRequest" - }, - { - "$ref": "#/$defs/SessionSearchRunsRequest" - }, - { - "$ref": "#/$defs/SessionSearchRunRequest" - }, - { - "$ref": "#/$defs/SessionReplaySearchRequest" - } -]
- Changed
save_literature_notes13 fields changed- added
Input schema / properties / create_index / anyOfAdded value: +[ + { + "default": true, + "title": "Create Index", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / create_index / typeRemoved value: -"boolean" - added
Input schema / properties / include_abstract / anyOfAdded value: +[ + { + "default": true, + "title": "Include Abstract", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / include_abstract / typeRemoved value: -"boolean" - added
Input schema / properties / include_csl_json / anyOfAdded value: +[ + { + "default": true, + "title": "Include Csl Json", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / include_csl_json / typeRemoved value: -"boolean" - added
Input schema / properties / note_format / anyOfAdded value: +[ + { + "default": "wiki", + "enum": [ + "wiki", + "foam", + "markdown", + "medpaper" + ], + "title": "Note Format", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[wW][iI][kK][iI]|[fF][oO][aA][mM]|[mM][aA][rR][kK][dD][oO][wW][nN]|[mM][eE][dD][pP][aA][pP][eE][rR])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / note_format / enumRemoved value: -[ - "wiki", - "foam", - "markdown", - "medpaper" -] - removed
Input schema / properties / note_format / typeRemoved value: -"string" - added
Input schema / properties / overwrite / anyOfAdded value: +[ + { + "default": false, + "title": "Overwrite", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / overwrite / typeRemoved value: -"boolean" - changed
Input schema / properties / pmids / anyOfPrevious value: -[ - { - "maxLength": 100000, - "minLength": 1, - "type": "string" - }, - { - "items": { - "maxLength": 512, - "minLength": 1, - "type": "string" - }, - "maxItems": 1000, - "minItems": 1, - "type": "array" - } -]New value: +[ + { + "description": "Complete PMID(s): delimited text, JSON string array, or Markdown list; optional JSON code fence. last only where supported.", + "examples": [ + "33053718,36170657", + "[\"33053718\",\"36170657\"]", + "- 33053718\n- 36170657" + ], + "format": "pubmed-pmid-batch", + "maxLength": 100000, + "minLength": 1, + "type": "string" + }, + { + "items": { + "description": "One PMID string, or last as the sole batch item for tools supporting session reuse.", + "examples": [ + "33053718" + ], + "format": "pubmed-pmid", + "maxLength": 512, + "minLength": 1, + "type": "string", + "x-pubmed-input": "pmid" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + } +] - added
Input schema / properties / pmids / x-pubmed-inputAdded value: +"pmid_batch"
- Changed
save_pipeline4 fields changed- added
Input schema / properties / scope / anyOfAdded value: +[ + { + "default": "auto", + "enum": [ + "auto", + "workspace", + "global" + ], + "title": "Scope", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[aA][uU][tT][oO]|[wW][oO][rR][kK][sS][pP][aA][cC][eE]|[gG][lL][oO][bB][aA][lL])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / scope / enumRemoved value: -[ - "auto", - "workspace", - "global" -] - removed
Input schema / properties / scope / typeRemoved value: -"string" - changed
Input schema / properties / tags / anyOfPrevious value: -[ - { - "items": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9_.-]{0,63})$", - "type": "string" - }, - "maxItems": 20, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9_.-]{0,63})$", + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + { + "type": "null" + }, + { + "contentMediaType": "application/json", + "contentSchema": { + "anyOf": [ + { + "items": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9_.-]{0,63})$", + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Tags" + }, + "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.", + "maxLength": 1000000, + "type": "string" + }, + { + "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.", + "maxLength": 1000000, + "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$", + "type": "string", + "x-pubmed-decodedSchema": { + "anyOf": [ + { + "items": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9_.-]{0,63})$", + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Tags" + }, + "x-pubmed-encoding": "fenced-json" + } +]
- Changed
schedule_pipeline4 fields changed- added
Input schema / properties / diff_mode / anyOfAdded value: +[ + { + "default": true, + "title": "Diff Mode", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / diff_mode / typeRemoved value: -"boolean" - added
Input schema / properties / notify / anyOfAdded value: +[ + { + "default": true, + "title": "Notify", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / notify / typeRemoved value: -"boolean"
- Changed
search_biomedical_images15 fields changed- changed
Input schema / properties / article_type / anyOfPrevious value: -[ - { - "enum": [ - "ab", - "bk", - "bf", - "cr", - "dp", - "di", - "ed", - "ib", - "in", - "lt", - "mr", - "ma", - "ne", - "ob", - "pr", - "or", - "re", - "ra", - "rw", - "sr", - "rr", - "os", - "hs", - "ot" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "enum": [ + "ab", + "bk", + "bf", + "cr", + "dp", + "di", + "ed", + "ib", + "in", + "lt", + "mr", + "ma", + "ne", + "ob", + "pr", + "or", + "re", + "ra", + "rw", + "sr", + "rr", + "os", + "hs", + "ot" + ], + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[aA][bB]|[bB][kK]|[bB][fF]|[cC][rR]|[dD][pP]|[dD][iI]|[eE][dD]|[iI][bB]|[iI][nN]|[lL][tT]|[mM][rR]|[mM][aA]|[nN][eE]|[oO][bB]|[pP][rR]|[oO][rR]|[rR][eE]|[rR][aA]|[rR][wW]|[sS][rR]|[rR][rR]|[oO][sS]|[hH][sS]|[oO][tT])[ \\t\\r\\n]*$", + "type": "string" + } + ] + }, + { + "type": "null" + } +] - changed
Input schema / properties / collection / anyOfPrevious value: -[ - { - "enum": [ - "pmc", - "cxr", - "usc", - "hmd", - "mpx" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "enum": [ + "pmc", + "cxr", + "usc", + "hmd", + "mpx" + ], + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[pP][mM][cC]|[cC][xX][rR]|[uU][sS][cC]|[hH][mM][dD]|[mM][pP][xX])[ \\t\\r\\n]*$", + "type": "string" + } + ] + }, + { + "type": "null" + } +] - changed
Input schema / properties / hmp_type / anyOfPrevious value: -[ - { - "enum": [ - "ad", - "ar", - "at", - "bi", - "br", - "cr", - "ca", - "ch", - "cg", - "cd", - "dr", - "ep", - "ex", - "hr", - "hu", - "lt", - "mp", - "nw", - "pn", - "ph", - "pi", - "po", - "pt", - "pc", - "ps" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "enum": [ + "ad", + "ar", + "at", + "bi", + "br", + "cr", + "ca", + "ch", + "cg", + "cd", + "dr", + "ep", + "ex", + "hr", + "hu", + "lt", + "mp", + "nw", + "pn", + "ph", + "pi", + "po", + "pt", + "pc", + "ps" + ], + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[aA][dD]|[aA][rR]|[aA][tT]|[bB][iI]|[bB][rR]|[cC][rR]|[cC][aA]|[cC][hH]|[cC][gG]|[cC][dD]|[dD][rR]|[eE][pP]|[eE][xX]|[hH][rR]|[hH][uU]|[lL][tT]|[mM][pP]|[nN][wW]|[pP][nN]|[pP][hH]|[pP][iI]|[pP][oO]|[pP][tT]|[pP][cC]|[pP][sS])[ \\t\\r\\n]*$", + "type": "string" + } + ] + }, + { + "type": "null" + } +] - changed
Input schema / properties / image_type / anyOfPrevious value: -[ - { - "enum": [ - "xg", - "xm", - "x", - "u", - "ph", - "p", - "mc", - "m", - "g", - "c" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "enum": [ + "xg", + "xm", + "x", + "u", + "ph", + "p", + "mc", + "m", + "g", + "c" + ], + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[xX][gG]|[xX][mM]|[xX]|[uU]|[pP][hH]|[pP]|[mM][cC]|[mM]|[gG]|[cC])[ \\t\\r\\n]*$", + "type": "string" + } + ] + }, + { + "type": "null" + } +] - changed
Input schema / properties / license_type / anyOfPrevious value: -[ - { - "enum": [ - "by", - "bync", - "byncnd", - "byncsa" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "enum": [ + "by", + "bync", + "byncnd", + "byncsa" + ], + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[bB][yY]|[bB][yY][nN][cC]|[bB][yY][nN][cC][nN][dD]|[bB][yY][nN][cC][sS][aA])[ \\t\\r\\n]*$", + "type": "string" + } + ] + }, + { + "type": "null" + } +] - added
Input schema / properties / limit / anyOfAdded value: +[ + { + "default": 10, + "maximum": 50, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / limit / maximumRemoved value: -50 - removed
Input schema / properties / limit / minimumRemoved value: -1 - removed
Input schema / properties / limit / typeRemoved value: -"integer" - changed
Input schema / properties / search_fields / anyOfPrevious value: -[ - { - "enum": [ - "t", - "m", - "ab", - "msh", - "c", - "a" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "enum": [ + "t", + "m", + "ab", + "msh", + "c", + "a" + ], + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[tT]|[mM]|[aA][bB]|[mM][sS][hH]|[cC]|[aA])[ \\t\\r\\n]*$", + "type": "string" + } + ] + }, + { + "type": "null" + } +] - changed
Input schema / properties / sort_by / anyOfPrevious value: -[ - { - "enum": [ - "r", - "o", - "d", - "e", - "g", - "oc", - "pr", - "pg", - "t" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "enum": [ + "r", + "o", + "d", + "e", + "g", + "oc", + "pr", + "pg", + "t" + ], + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[rR]|[oO]|[dD]|[eE]|[gG]|[oO][cC]|[pP][rR]|[pP][gG]|[tT])[ \\t\\r\\n]*$", + "type": "string" + } + ] + }, + { + "type": "null" + } +] - changed
Input schema / properties / specialty / anyOfPrevious value: -[ - { - "enum": [ - "b", - "bc", - "c", - "ca", - "cc", - "d", - "de", - "dt", - "e", - "en", - "f", - "eh", - "g", - "ge", - "gr", - "gy", - "h", - "i", - "id", - "im", - "n", - "ne", - "nu", - "o", - "or", - "ot", - "p", - "py", - "pu", - "r", - "s", - "t", - "u", - "v", - "vi" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "enum": [ + "b", + "bc", + "c", + "ca", + "cc", + "d", + "de", + "dt", + "e", + "en", + "f", + "eh", + "g", + "ge", + "gr", + "gy", + "h", + "i", + "id", + "im", + "n", + "ne", + "nu", + "o", + "or", + "ot", + "p", + "py", + "pu", + "r", + "s", + "t", + "u", + "v", + "vi" + ], + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[bB]|[bB][cC]|[cC]|[cC][aA]|[cC][cC]|[dD]|[dD][eE]|[dD][tT]|[eE]|[eE][nN]|[fF]|[eE][hH]|[gG]|[gG][eE]|[gG][rR]|[gG][yY]|[hH]|[iI]|[iI][dD]|[iI][mM]|[nN]|[nN][eE]|[nN][uU]|[oO]|[oO][rR]|[oO][tT]|[pP]|[pP][yY]|[pP][uU]|[rR]|[sS]|[tT]|[uU]|[vV]|[vV][iI])[ \\t\\r\\n]*$", + "type": "string" + } + ] + }, + { + "type": "null" + } +] - changed
Input schema / properties / subset / anyOfPrevious value: -[ - { - "enum": [ - "b", - "c", - "e", - "s", - "x" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "enum": [ + "b", + "c", + "e", + "s", + "x" + ], + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[bB]|[cC]|[eE]|[sS]|[xX])[ \\t\\r\\n]*$", + "type": "string" + } + ] + }, + { + "type": "null" + } +] - added
Input schema / properties / video_only / anyOfAdded value: +[ + { + "default": false, + "title": "Video Only", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / video_only / typeRemoved value: -"boolean"
- Changed
search_clinvar4 fields changed- added
Input schema / properties / limit / anyOfAdded value: +[ + { + "default": 10, + "maximum": 50, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / limit / maximumRemoved value: -50 - removed
Input schema / properties / limit / minimumRemoved value: -1 - removed
Input schema / properties / limit / typeRemoved value: -"integer"
- Changed
search_compound4 fields changed- added
Input schema / properties / limit / anyOfAdded value: +[ + { + "default": 10, + "maximum": 50, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / limit / maximumRemoved value: -50 - removed
Input schema / properties / limit / minimumRemoved value: -1 - removed
Input schema / properties / limit / typeRemoved value: -"integer"
- Changed
search_gene4 fields changed- added
Input schema / properties / limit / anyOfAdded value: +[ + { + "default": 10, + "maximum": 50, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / limit / maximumRemoved value: -50 - removed
Input schema / properties / limit / minimumRemoved value: -1 - removed
Input schema / properties / limit / typeRemoved value: -"integer"
- Changed
test_institutional_access5 fields changed- added
Input schema / properties / pmid / descriptionAdded value: +"Complete identifier string; optional identifier prefix, official article URL, or inline backticks. No numbers, foreign hosts, URL queries/fragments or partial identifiers." - added
Input schema / properties / pmid / examplesAdded value: +[ + "33053718", + "PMID:33053718", + "https://pubmed.ncbi.nlm.nih.gov/33053718/" +] - added
Input schema / properties / pmid / formatAdded value: +"pubmed-pmid" - changed
Input schema / properties / pmid / maxLengthPrevious value: -32New value: +512 - added
Input schema / properties / pmid / x-pubmed-inputAdded value: +"pmid"
- Changed
unified_search13 fields changed- added
Input schema / properties / dry_run / anyOfAdded value: +[ + { + "default": false, + "title": "Dry Run", + "type": "boolean" + }, + { + "description": "Explicit true/false text, ignoring ASCII case and surrounding whitespace.", + "pattern": "^[ \\t\\r\\n]*(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / dry_run / typeRemoved value: -"boolean" - added
Input schema / properties / fulltextAdded value: +{ + "anyOf": [ + { + "default": "off", + "enum": [ + "off", + "prefetch" + ], + "title": "Fulltext", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[oO][fF][fF]|[pP][rR][eE][fF][eE][tT][cC][hH])[ \\t\\r\\n]*$", + "type": "string" + } + ], + "default": "off", + "title": "Fulltext" +} - added
Input schema / properties / limit / anyOfAdded value: +[ + { + "default": 10, + "maximum": 100, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / limit / maximumRemoved value: -100 - removed
Input schema / properties / limit / minimumRemoved value: -1 - removed
Input schema / properties / limit / typeRemoved value: -"integer" - added
Input schema / properties / output_format / anyOfAdded value: +[ + { + "default": "markdown", + "enum": [ + "markdown", + "json", + "toon" + ], + "title": "Output Format", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[mM][aA][rR][kK][dD][oO][wW][nN]|[jJ][sS][oO][nN]|[tT][oO][oO][nN])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / output_format / enumRemoved value: -[ - "markdown", - "json", - "toon" -] - removed
Input schema / properties / output_format / typeRemoved value: -"string" - added
Input schema / properties / ranking / anyOfAdded value: +[ + { + "default": "balanced", + "enum": [ + "balanced", + "impact", + "recency", + "quality" + ], + "title": "Ranking", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[bB][aA][lL][aA][nN][cC][eE][dD]|[iI][mM][pP][aA][cC][tT]|[rR][eE][cC][eE][nN][cC][yY]|[qQ][uU][aA][lL][iI][tT][yY])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / ranking / enumRemoved value: -[ - "balanced", - "impact", - "recency", - "quality" -] - removed
Input schema / properties / ranking / typeRemoved value: -"string"
- Changed
validate_pico_plan9 fields changed- added
Input schema / properties / limit / anyOfAdded value: +[ + { + "default": 20, + "maximum": 33, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / limit / maximumRemoved value: -33 - removed
Input schema / properties / limit / minimumRemoved value: -1 - removed
Input schema / properties / limit / typeRemoved value: -"integer" - added
Input schema / properties / profile / anyOfAdded value: +[ + { + "default": "balanced", + "enum": [ + "precision", + "balanced", + "recall" + ], + "title": "Profile", + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[pP][rR][eE][cC][iI][sS][iI][oO][nN]|[bB][aA][lL][aA][nN][cC][eE][dD]|[rR][eE][cC][aA][lL][lL])[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / profile / enumRemoved value: -[ - "precision", - "balanced", - "recall" -] - removed
Input schema / properties / profile / typeRemoved value: -"string" - changed
Input schema / properties / question_type / anyOfPrevious value: -[ - { - "enum": [ - "therapy", - "diagnosis", - "prognosis", - "etiology" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "enum": [ + "therapy", + "diagnosis", + "prognosis", + "etiology" + ], + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[tT][hH][eE][rR][aA][pP][yY]|[dD][iI][aA][gG][nN][oO][sS][iI][sS]|[pP][rR][oO][gG][nN][oO][sS][iI][sS]|[eE][tT][iI][oO][lL][oO][gG][yY])[ \\t\\r\\n]*$", + "type": "string" + } + ] + }, + { + "type": "null" + } +] - changed
Input schema / properties / sources / anyOfPrevious value: -[ - { - "items": { - "enum": [ - "pubmed", - "europe_pmc", - "openalex", - "semantic_scholar", - "core" - ], - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "anyOf": [ + { + "enum": [ + "pubmed", + "europe_pmc", + "openalex", + "semantic_scholar", + "core" + ], + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[pP][uU][bB][mM][eE][dD]|[eE][uU][rR][oO][pP][eE]_[pP][mM][cC]|[oO][pP][eE][nN][aA][lL][eE][xX]|[sS][eE][mM][aA][nN][tT][iI][cC]_[sS][cC][hH][oO][lL][aA][rR]|[cC][oO][rR][eE])[ \\t\\r\\n]*$", + "type": "string" + } + ] + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + }, + { + "contentMediaType": "application/json", + "contentSchema": { + "anyOf": [ + { + "items": { + "anyOf": [ + { + "enum": [ + "pubmed", + "europe_pmc", + "openalex", + "semantic_scholar", + "core" + ], + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[pP][uU][bB][mM][eE][dD]|[eE][uU][rR][oO][pP][eE]_[pP][mM][cC]|[oO][pP][eE][nN][aA][lL][eE][xX]|[sS][eE][mM][aA][nN][tT][iI][cC]_[sS][cC][hH][oO][lL][aA][rR]|[cC][oO][rR][eE])[ \\t\\r\\n]*$", + "type": "string" + } + ] + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Sources" + }, + "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.", + "maxLength": 1000000, + "type": "string" + }, + { + "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.", + "maxLength": 1000000, + "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$", + "type": "string", + "x-pubmed-decodedSchema": { + "anyOf": [ + { + "items": { + "anyOf": [ + { + "enum": [ + "pubmed", + "europe_pmc", + "openalex", + "semantic_scholar", + "core" + ], + "type": "string" + }, + { + "pattern": "^[ \\t\\r\\n]*(?:[pP][uU][bB][mM][eE][dD]|[eE][uU][rR][oO][pP][eE]_[pP][mM][cC]|[oO][pP][eE][nN][aA][lL][eE][xX]|[sS][eE][mM][aA][nN][tT][iI][cC]_[sS][cC][hH][oO][lL][aA][rR]|[cC][oO][rR][eE])[ \\t\\r\\n]*$", + "type": "string" + } + ] + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Sources" + }, + "x-pubmed-encoding": "fenced-json" + } +]
- Changed
verify_reference_list4 fields changed- added
Input schema / properties / max_references / anyOfAdded value: +[ + { + "default": 100, + "maximum": 200, + "minimum": 1, + "title": "Max References", + "type": "integer" + }, + { + "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.", + "maxLength": 32, + "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$", + "type": "string" + } +] - removed
Input schema / properties / max_references / maximumRemoved value: -200 - removed
Input schema / properties / max_references / minimumRemoved value: -1 - removed
Input schema / properties / max_references / typeRemoved value: -"integer"
1 tool update
v0.7.3- Changed
fetch_article_details1 field changed- changed
Input schema / properties / output_format / enumPrevious value: -[ - "markdown", - "json" -]New value: +[ + "markdown", + "json", + "toon" +]
51 tool updates
v0.7.2- Removed
analyze_figure_for_search - Changed
analyze_search_query4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / query / maxLengthAdded value: +4096 - added
Input schema / properties / query / minLengthAdded value: +1 - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "analyze_search_queryOutput", - "type": "object" -}New value: +null
- Removed
analyze_timeline_milestones - Changed
build_citation_tree17 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / depth / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -] - added
Input schema / properties / depth / maximumAdded value: +3 - added
Input schema / properties / depth / minimumAdded value: +1 - added
Input schema / properties / depth / typeAdded value: +"integer" - added
Input schema / properties / direction / enumAdded value: +[ + "forward", + "backward", + "both" +] - removed
Input schema / properties / include_detailsRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "string" - } - ], - "default": true, - "title": "Include Details" -} - removed
Input schema / properties / limit_per_level / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -] - added
Input schema / properties / limit_per_level / maximumAdded value: +20 - added
Input schema / properties / limit_per_level / minimumAdded value: +1 - added
Input schema / properties / limit_per_level / typeAdded value: +"integer" - added
Input schema / properties / output_format / enumAdded value: +[ + "cytoscape", + "g6", + "d3", + "vis", + "graphml", + "mermaid" +] - removed
Input schema / properties / pmid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "integer" - } -] - added
Input schema / properties / pmid / maxLengthAdded value: +512 - added
Input schema / properties / pmid / minLengthAdded value: +1 - added
Input schema / properties / pmid / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "build_citation_treeOutput", - "type": "object" -}New value: +null
- Added
build_research_chronicle - Removed
build_research_timeline - Removed
compare_timelines - Changed
configure_institutional_access5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / preset / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "ntu", + "ncku", + "nthu", + "nycu", + "harvard", + "stanford", + "mit", + "yale", + "oxford", + "cambridge", + "sfx", + "360link", + "primo", + "test_free" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / resolver_url / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 8192, + "type": "string" + }, + { + "type": "null" + } +] - removed
Input schema / properties / testRemoved value: -{ - "default": true, - "title": "Test", - "type": "boolean" -} - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "configure_institutional_accessOutput", - "type": "object" -}New value: +null
- Changed
convert_icd_mesh7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / codeRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Code" -} - added
Input schema / properties / directionAdded value: +{ + "enum": [ + "icd_to_mesh", + "mesh_to_icd" + ], + "title": "Direction", + "type": "string" +} - removed
Input schema / properties / mesh_termRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Mesh Term" -} - added
Input schema / properties / valueAdded value: +{ + "maxLength": 500, + "minLength": 1, + "title": "Value", + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "direction", + "value" +] - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "convert_icd_meshOutput", - "type": "object" -}New value: +null
- Changed
delete_pipeline5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / name / maxLengthAdded value: +64 - added
Input schema / properties / name / minLengthAdded value: +1 - added
Input schema / properties / name / patternAdded value: +"^[a-z0-9](?:[a-z0-9_-]{0,63})$" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "delete_pipelineOutput", - "type": "object" -}New value: +null
- Changed
diagnose_institutional_access7 fields changed- added
Input schema / $defsAdded value: +{ + "DOISource": { + "additionalProperties": false, + "description": "An explicit DOI.", + "properties": { + "kind": { + "const": "doi", + "title": "Kind", + "type": "string" + }, + "value": { + "maxLength": 512, + "minLength": 7, + "pattern": "^10\\.[0-9]{4,9}/", + "title": "Value", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "title": "DOISource", + "type": "object" + }, + "PMIDSource": { + "additionalProperties": false, + "description": "An explicit PubMed identifier.", + "properties": { + "kind": { + "const": "pmid", + "title": "Kind", + "type": "string" + }, + "value": { + "maxLength": 20, + "pattern": "^[1-9][0-9]{0,19}$", + "title": "Value", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "title": "PMIDSource", + "type": "object" + } +} - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / doiRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Doi" -} - removed
Input schema / properties / pmidRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Pmid" -} - added
Input schema / properties / sourceAdded value: +{ + "discriminator": { + "mapping": { + "doi": "#/$defs/DOISource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/DOISource" + } + ], + "title": "Source" +} - added
Input schema / requiredAdded value: +[ + "source" +] - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "diagnose_institutional_accessOutput", - "type": "object" -}New value: +null
- Changed
fetch_article_details3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / pmids / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "integer" - } -]New value: +[ + { + "maxLength": 100000, + "minLength": 1, + "type": "string" + }, + { + "items": { + "maxLength": 512, + "minLength": 1, + "type": "string" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + } +] - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "fetch_article_detailsOutput", - "type": "object" -}New value: +null
- Changed
find_citing_articles8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / maximumAdded value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - removed
Input schema / properties / pmid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "integer" - } -] - added
Input schema / properties / pmid / maxLengthAdded value: +512 - added
Input schema / properties / pmid / minLengthAdded value: +1 - added
Input schema / properties / pmid / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "find_citing_articlesOutput", - "type": "object" -}New value: +null
- Changed
find_related_articles8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / maximumAdded value: +50 - added
Input schema / properties / limit / minimumAdded value: +1 - removed
Input schema / properties / pmid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "integer" - } -] - added
Input schema / properties / pmid / maxLengthAdded value: +512 - added
Input schema / properties / pmid / minLengthAdded value: +1 - added
Input schema / properties / pmid / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "find_related_articlesOutput", - "type": "object" -}New value: +null
- Changed
generate_search_queries9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / check_spelling / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - } -] - added
Input schema / properties / check_spelling / typeAdded value: +"boolean" - removed
Input schema / properties / include_suggestions / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - } -] - added
Input schema / properties / include_suggestions / typeAdded value: +"boolean" - added
Input schema / properties / strategy / enumAdded value: +[ + "comprehensive", + "focused", + "exploratory" +] - added
Input schema / properties / topic / maxLengthAdded value: +2000 - added
Input schema / properties / topic / minLengthAdded value: +1 - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "generate_search_queriesOutput", - "type": "object" -}New value: +null
- Changed
get_article_figures8 fields changed- added
Input schema / $defsAdded value: +{ + "PMCIDSource": { + "additionalProperties": false, + "description": "An explicit PubMed Central identifier.", + "properties": { + "kind": { + "const": "pmcid", + "title": "Kind", + "type": "string" + }, + "value": { + "maxLength": 23, + "pattern": "^PMC[1-9][0-9]{0,19}$", + "title": "Value", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "title": "PMCIDSource", + "type": "object" + }, + "PMIDSource": { + "additionalProperties": false, + "description": "An explicit PubMed identifier.", + "properties": { + "kind": { + "const": "pmid", + "title": "Kind", + "type": "string" + }, + "value": { + "maxLength": 20, + "pattern": "^[1-9][0-9]{0,19}$", + "title": "Value", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "title": "PMIDSource", + "type": "object" + } +} - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / identifierRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Identifier" -} - removed
Input schema / properties / pmcidRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Pmcid" -} - removed
Input schema / properties / pmidRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Pmid" -} - added
Input schema / properties / sourceAdded value: +{ + "discriminator": { + "mapping": { + "pmcid": "#/$defs/PMCIDSource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/PMCIDSource" + } + ], + "title": "Source" +} - added
Input schema / requiredAdded value: +[ + "source" +] - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "get_article_figuresOutput", - "type": "object" -}New value: +null
- Changed
get_article_references8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / maximumAdded value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - removed
Input schema / properties / pmid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "integer" - } -] - added
Input schema / properties / pmid / maxLengthAdded value: +512 - added
Input schema / properties / pmid / minLengthAdded value: +1 - added
Input schema / properties / pmid / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "get_article_referencesOutput", - "type": "object" -}New value: +null
- Removed
get_cached_article - Changed
get_citation_metrics7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / min_citations / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 2000000000, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / min_percentile / anyOfPrevious value: -[ - { - "type": "number" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - changed
Input schema / properties / min_rcr / anyOfPrevious value: -[ - { - "type": "number" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 1000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - changed
Input schema / properties / pmids / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "integer" - } -]New value: +[ + { + "maxLength": 100000, + "minLength": 1, + "type": "string" + }, + { + "items": { + "maxLength": 512, + "minLength": 1, + "type": "string" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + } +] - added
Input schema / properties / sort_by / enumAdded value: +[ + "citation_count", + "relative_citation_ratio", + "nih_percentile", + "citations_per_year" +] - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "get_citation_metricsOutput", - "type": "object" -}New value: +null
- Changed
get_compound_details7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / cid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "integer" - } -] - added
Input schema / properties / cid / maxLengthAdded value: +20 - added
Input schema / properties / cid / minLengthAdded value: +1 - added
Input schema / properties / cid / patternAdded value: +"^[1-9][0-9]{0,19}$" - added
Input schema / properties / cid / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "get_compound_detailsOutput", - "type": "object" -}New value: +null
- Changed
get_compound_literature11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / cid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "integer" - } -] - added
Input schema / properties / cid / maxLengthAdded value: +20 - added
Input schema / properties / cid / minLengthAdded value: +1 - added
Input schema / properties / cid / patternAdded value: +"^[1-9][0-9]{0,19}$" - added
Input schema / properties / cid / typeAdded value: +"string" - removed
Input schema / properties / limit / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -] - added
Input schema / properties / limit / maximumAdded value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / limit / typeAdded value: +"integer" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "get_compound_literatureOutput", - "type": "object" -}New value: +null
- Changed
get_fulltext10 fields changed- added
Input schema / $defsAdded value: +{ + "DOISource": { + "additionalProperties": false, + "description": "An explicit DOI.", + "properties": { + "kind": { + "const": "doi", + "title": "Kind", + "type": "string" + }, + "value": { + "maxLength": 512, + "minLength": 7, + "pattern": "^10\\.[0-9]{4,9}/", + "title": "Value", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "title": "DOISource", + "type": "object" + }, + "PMCIDSource": { + "additionalProperties": false, + "description": "An explicit PubMed Central identifier.", + "properties": { + "kind": { + "const": "pmcid", + "title": "Kind", + "type": "string" + }, + "value": { + "maxLength": 23, + "pattern": "^PMC[1-9][0-9]{0,19}$", + "title": "Value", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "title": "PMCIDSource", + "type": "object" + }, + "PMIDSource": { + "additionalProperties": false, + "description": "An explicit PubMed identifier.", + "properties": { + "kind": { + "const": "pmid", + "title": "Kind", + "type": "string" + }, + "value": { + "maxLength": 20, + "pattern": "^[1-9][0-9]{0,19}$", + "title": "Value", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "title": "PMIDSource", + "type": "object" + } +} - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / doiRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Doi" -} - removed
Input schema / properties / identifierRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Identifier" -} - removed
Input schema / properties / pmcidRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Pmcid" -} - removed
Input schema / properties / pmidRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Pmid" -} - changed
Input schema / properties / sections / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / sourceAdded value: +{ + "discriminator": { + "mapping": { + "doi": "#/$defs/DOISource", + "pmcid": "#/$defs/PMCIDSource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/PMCIDSource" + }, + { + "$ref": "#/$defs/DOISource" + } + ], + "title": "Source" +} - added
Input schema / requiredAdded value: +[ + "source" +] - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "get_fulltextOutput", - "type": "object" -}New value: +null
- Changed
get_gene_details7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / gene_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "integer" - } -] - added
Input schema / properties / gene_id / maxLengthAdded value: +20 - added
Input schema / properties / gene_id / minLengthAdded value: +1 - added
Input schema / properties / gene_id / patternAdded value: +"^[1-9][0-9]{0,19}$" - added
Input schema / properties / gene_id / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "get_gene_detailsOutput", - "type": "object" -}New value: +null
- Changed
get_gene_literature11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / gene_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "integer" - } -] - added
Input schema / properties / gene_id / maxLengthAdded value: +20 - added
Input schema / properties / gene_id / minLengthAdded value: +1 - added
Input schema / properties / gene_id / patternAdded value: +"^[1-9][0-9]{0,19}$" - added
Input schema / properties / gene_id / typeAdded value: +"string" - removed
Input schema / properties / limit / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -] - added
Input schema / properties / limit / maximumAdded value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / limit / typeAdded value: +"integer" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "get_gene_literatureOutput", - "type": "object" -}New value: +null
- Changed
get_institutional_link13 fields changed- added
Input schema / $defsAdded value: +{ + "DOISource": { + "additionalProperties": false, + "description": "An explicit DOI.", + "properties": { + "kind": { + "const": "doi", + "title": "Kind", + "type": "string" + }, + "value": { + "maxLength": 512, + "minLength": 7, + "pattern": "^10\\.[0-9]{4,9}/", + "title": "Value", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "title": "DOISource", + "type": "object" + }, + "InstitutionalMetadataSource": { + "additionalProperties": false, + "description": "Bounded journal metadata used to construct an OpenURL.", + "properties": { + "issue": { + "anyOf": [ + { + "maxLength": 50, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Issue" + }, + "journal": { + "anyOf": [ + { + "maxLength": 300, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Journal" + }, + "kind": { + "const": "metadata", + "title": "Kind", + "type": "string" + }, + "pages": { + "anyOf": [ + { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Pages" + }, + "title": { + "maxLength": 1000, + "minLength": 1, + "title": "Title", + "type": "string" + }, + "volume": { + "anyOf": [ + { + "maxLength": 50, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Volume" + }, + "year": { + "anyOf": [ + { + "maximum": 9999, + "minimum": 1000, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Year" + } + }, + "required": [ + "kind", + "title" + ], + "title": "InstitutionalMetadataSource", + "type": "object" + }, + "PMIDSource": { + "additionalProperties": false, + "description": "An explicit PubMed identifier.", + "properties": { + "kind": { + "const": "pmid", + "title": "Kind", + "type": "string" + }, + "value": { + "maxLength": 20, + "pattern": "^[1-9][0-9]{0,19}$", + "title": "Value", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "title": "PMIDSource", + "type": "object" + } +} - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / doiRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Doi" -} - removed
Input schema / properties / issueRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Issue" -} - removed
Input schema / properties / journalRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Journal" -} - removed
Input schema / properties / pagesRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Pages" -} - removed
Input schema / properties / pmidRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Pmid" -} - added
Input schema / properties / sourceAdded value: +{ + "discriminator": { + "mapping": { + "doi": "#/$defs/DOISource", + "metadata": "#/$defs/InstitutionalMetadataSource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/DOISource" + }, + { + "$ref": "#/$defs/InstitutionalMetadataSource" + } + ], + "title": "Source" +} - removed
Input schema / properties / titleRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Title" -} - removed
Input schema / properties / volumeRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Volume" -} - removed
Input schema / properties / yearRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Year" -} - added
Input schema / requiredAdded value: +[ + "source" +] - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "get_institutional_linkOutput", - "type": "object" -}New value: +null
- Changed
get_pipeline_history7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / maximumAdded value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / name / maxLengthAdded value: +64 - added
Input schema / properties / name / minLengthAdded value: +1 - added
Input schema / properties / name / patternAdded value: +"^[a-z0-9](?:[a-z0-9_-]{0,63})$" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "get_pipeline_historyOutput", - "type": "object" -}New value: +null
- Removed
get_session_log - Removed
get_session_pmids - Removed
get_session_summary - Changed
get_text_mined_terms8 fields changed- added
Input schema / $defsAdded value: +{ + "PMCIDSource": { + "additionalProperties": false, + "description": "An explicit PubMed Central identifier.", + "properties": { + "kind": { + "const": "pmcid", + "title": "Kind", + "type": "string" + }, + "value": { + "maxLength": 23, + "pattern": "^PMC[1-9][0-9]{0,19}$", + "title": "Value", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "title": "PMCIDSource", + "type": "object" + }, + "PMIDSource": { + "additionalProperties": false, + "description": "An explicit PubMed identifier.", + "properties": { + "kind": { + "const": "pmid", + "title": "Kind", + "type": "string" + }, + "value": { + "maxLength": 20, + "pattern": "^[1-9][0-9]{0,19}$", + "title": "Value", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "title": "PMIDSource", + "type": "object" + } +} - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / pmcidRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Pmcid" -} - removed
Input schema / properties / pmidRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Pmid" -} - changed
Input schema / properties / semantic_type / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "GENE_PROTEIN", + "DISEASE", + "CHEMICAL", + "ORGANISM", + "GO_TERM", + "EFO" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / sourceAdded value: +{ + "discriminator": { + "mapping": { + "pmcid": "#/$defs/PMCIDSource", + "pmid": "#/$defs/PMIDSource" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/PMIDSource" + }, + { + "$ref": "#/$defs/PMCIDSource" + } + ], + "title": "Source" +} - added
Input schema / requiredAdded value: +[ + "source" +] - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "get_text_mined_termsOutput", - "type": "object" -}New value: +null
- Changed
list_pipelines4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / scope / enumAdded value: +[ + "", + "workspace", + "global" +] - added
Input schema / properties / tag / maxLengthAdded value: +100 - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "list_pipelinesOutput", - "type": "object" -}New value: +null
- Changed
list_resolver_presets2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "list_resolver_presetsOutput", - "type": "object" -}New value: +null
- Changed
load_pipeline4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / source / maxLengthAdded value: +4096 - added
Input schema / properties / source / minLengthAdded value: +1 - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "load_pipelineOutput", - "type": "object" -}New value: +null
- Removed
manage_pipeline - Removed
parse_pico - Changed
prepare_export5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / format / enumAdded value: +[ + "ris", + "medline", + "csl", + "bibtex", + "csv", + "json" +] - changed
Input schema / properties / pmids / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "integer" - } -]New value: +[ + { + "maxLength": 100000, + "minLength": 1, + "type": "string" + }, + { + "items": { + "maxLength": 512, + "minLength": 1, + "type": "string" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + } +] - added
Input schema / properties / source / enumAdded value: +[ + "official", + "local" +] - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "prepare_exportOutput", - "type": "object" -}New value: +null
- Added
prepare_figure_search - Added
read_research_chronicle - Changed
read_session21 fields changed- added
Input schema / $defsAdded value: +{ + "ArtifactIdLocator": { + "additionalProperties": false, + "properties": { + "kind": { + "const": "artifact_id", + "title": "Kind", + "type": "string" + }, + "session_id": { + "anyOf": [ + { + "maxLength": 80, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,79}$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Session Id" + }, + "value": { + "maxLength": 512, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,511}$", + "title": "Value", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "title": "ArtifactIdLocator", + "type": "object" + }, + "ArtifactUriLocator": { + "additionalProperties": false, + "properties": { + "kind": { + "const": "artifact_uri", + "title": "Kind", + "type": "string" + }, + "value": { + "maxLength": 605, + "minLength": 13, + "pattern": "^artifact://[A-Za-z0-9][A-Za-z0-9_.-]{0,79}/[A-Za-z0-9][A-Za-z0-9_.-]{0,511}$", + "title": "Value", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "title": "ArtifactUriLocator", + "type": "object" + }, + "SessionArticleRequest": { + "additionalProperties": false, + "properties": { + "action": { + "const": "article", + "title": "Action", + "type": "string" + }, + "pmid": { + "maxLength": 20, + "pattern": "^[1-9][0-9]{0,19}$", + "title": "Pmid", + "type": "string" + } + }, + "required": [ + "action", + "pmid" + ], + "title": "SessionArticleRequest", + "type": "object" + }, + "SessionArtifactRequest": { + "additionalProperties": false, + "properties": { + "action": { + "const": "artifact", + "title": "Action", + "type": "string" + }, + "artifact_file": { + "anyOf": [ + { + "maxLength": 512, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,511}$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Artifact File" + }, + "include_local_paths": { + "default": false, + "title": "Include Local Paths", + "type": "boolean" + }, + "locator": { + "discriminator": { + "mapping": { + "artifact_id": "#/$defs/ArtifactIdLocator", + "artifact_uri": "#/$defs/ArtifactUriLocator" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/ArtifactIdLocator" + }, + { + "$ref": "#/$defs/ArtifactUriLocator" + } + ], + "title": "Locator" + }, + "max_chars": { + "default": 200000, + "maximum": 200000, + "minimum": 1, + "title": "Max Chars", + "type": "integer" + }, + "offset": { + "default": 0, + "maximum": 2000000000, + "minimum": 0, + "title": "Offset", + "type": "integer" + } + }, + "required": [ + "action", + "locator" + ], + "title": "SessionArtifactRequest", + "type": "object" + }, + "SessionListArtifactsRequest": { + "additionalProperties": false, + "properties": { + "action": { + "const": "list_artifacts", + "title": "Action", + "type": "string" + }, + "include_local_paths": { + "default": false, + "title": "Include Local Paths", + "type": "boolean" + }, + "kind": { + "anyOf": [ + { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Kind" + }, + "limit": { + "default": 10, + "maximum": 100, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + "session_id": { + "anyOf": [ + { + "maxLength": 80, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,79}$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Session Id" + }, + "tool": { + "anyOf": [ + { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Tool" + } + }, + "required": [ + "action" + ], + "title": "SessionListArtifactsRequest", + "type": "object" + }, + "SessionLogRequest": { + "additionalProperties": false, + "properties": { + "action": { + "const": "log", + "title": "Action", + "type": "string" + }, + "event_limit": { + "default": 50, + "maximum": 500, + "minimum": 1, + "title": "Event Limit", + "type": "integer" + }, + "history_limit": { + "default": 10, + "maximum": 100, + "minimum": 1, + "title": "History Limit", + "type": "integer" + }, + "include_history": { + "default": true, + "title": "Include History", + "type": "boolean" + }, + "kind": { + "anyOf": [ + { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Kind" + } + }, + "required": [ + "action" + ], + "title": "SessionLogRequest", + "type": "object" + }, + "SessionPmidsRequest": { + "additionalProperties": false, + "properties": { + "action": { + "const": "pmids", + "title": "Action", + "type": "string" + }, + "query_filter": { + "anyOf": [ + { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Query Filter" + }, + "search_index": { + "default": -1, + "maximum": 100000, + "minimum": -100000, + "title": "Search Index", + "type": "integer" + } + }, + "required": [ + "action" + ], + "title": "SessionPmidsRequest", + "type": "object" + }, + "SessionReplaySearchRequest": { + "additionalProperties": false, + "properties": { + "action": { + "const": "replay_search", + "title": "Action", + "type": "string" + }, + "run_id": { + "maxLength": 512, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,511}$", + "title": "Run Id", + "type": "string" + }, + "session_id": { + "anyOf": [ + { + "maxLength": 80, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,79}$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Session Id" + } + }, + "required": [ + "action", + "run_id" + ], + "title": "SessionReplaySearchRequest", + "type": "object" + }, + "SessionSearchRunRequest": { + "additionalProperties": false, + "properties": { + "action": { + "const": "search_run", + "title": "Action", + "type": "string" + }, + "run_id": { + "maxLength": 512, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,511}$", + "title": "Run Id", + "type": "string" + }, + "session_id": { + "anyOf": [ + { + "maxLength": 80, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,79}$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Session Id" + } + }, + "required": [ + "action", + "run_id" + ], + "title": "SessionSearchRunRequest", + "type": "object" + }, + "SessionSearchRunsRequest": { + "additionalProperties": false, + "properties": { + "action": { + "const": "search_runs", + "title": "Action", + "type": "string" + }, + "limit": { + "default": 10, + "maximum": 100, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + "session_id": { + "anyOf": [ + { + "maxLength": 80, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,79}$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Session Id" + }, + "status": { + "anyOf": [ + { + "enum": [ + "started", + "planned", + "running", + "completed", + "partial", + "failed", + "cancelled", + "interrupted" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Status" + } + }, + "required": [ + "action" + ], + "title": "SessionSearchRunsRequest", + "type": "object" + }, + "SessionSummaryRequest": { + "additionalProperties": false, + "properties": { + "action": { + "const": "summary", + "title": "Action", + "type": "string" + }, + "history_limit": { + "default": 10, + "maximum": 100, + "minimum": 1, + "title": "History Limit", + "type": "integer" + }, + "include_history": { + "default": false, + "title": "Include History", + "type": "boolean" + } + }, + "required": [ + "action" + ], + "title": "SessionSummaryRequest", + "type": "object" + } +} - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / actionRemoved value: -{ - "default": "summary", - "title": "Action", - "type": "string" -} - removed
Input schema / properties / artifact_fileRemoved value: -{ - "default": "", - "title": "Artifact File", - "type": "string" -} - removed
Input schema / properties / artifact_idRemoved value: -{ - "default": "", - "title": "Artifact Id", - "type": "string" -} - removed
Input schema / properties / artifact_kindRemoved value: -{ - "default": "", - "title": "Artifact Kind", - "type": "string" -} - removed
Input schema / properties / artifact_toolRemoved value: -{ - "default": "", - "title": "Artifact Tool", - "type": "string" -} - removed
Input schema / properties / artifact_uriRemoved value: -{ - "default": "", - "title": "Artifact Uri", - "type": "string" -} - removed
Input schema / properties / event_limitRemoved value: -{ - "default": 50, - "title": "Event Limit", - "type": "integer" -} - removed
Input schema / properties / history_limitRemoved value: -{ - "default": 10, - "title": "History Limit", - "type": "integer" -} - removed
Input schema / properties / include_historyRemoved value: -{ - "default": false, - "title": "Include History", - "type": "boolean" -} - removed
Input schema / properties / include_local_pathsRemoved value: -{ - "default": false, - "title": "Include Local Paths", - "type": "boolean" -} - removed
Input schema / properties / max_charsRemoved value: -{ - "default": 200000, - "title": "Max Chars", - "type": "integer" -} - removed
Input schema / properties / offsetRemoved value: -{ - "default": 0, - "title": "Offset", - "type": "integer" -} - removed
Input schema / properties / pmidRemoved value: -{ - "default": "", - "title": "Pmid", - "type": "string" -} - removed
Input schema / properties / query_filterRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Query Filter" -} - added
Input schema / properties / requestAdded value: +{ + "discriminator": { + "mapping": { + "article": "#/$defs/SessionArticleRequest", + "artifact": "#/$defs/SessionArtifactRequest", + "list_artifacts": "#/$defs/SessionListArtifactsRequest", + "log": "#/$defs/SessionLogRequest", + "pmids": "#/$defs/SessionPmidsRequest", + "replay_search": "#/$defs/SessionReplaySearchRequest", + "search_run": "#/$defs/SessionSearchRunRequest", + "search_runs": "#/$defs/SessionSearchRunsRequest", + "summary": "#/$defs/SessionSummaryRequest" + }, + "propertyName": "action" + }, + "oneOf": [ + { + "$ref": "#/$defs/SessionPmidsRequest" + }, + { + "$ref": "#/$defs/SessionArticleRequest" + }, + { + "$ref": "#/$defs/SessionSummaryRequest" + }, + { + "$ref": "#/$defs/SessionLogRequest" + }, + { + "$ref": "#/$defs/SessionListArtifactsRequest" + }, + { + "$ref": "#/$defs/SessionArtifactRequest" + }, + { + "$ref": "#/$defs/SessionSearchRunsRequest" + }, + { + "$ref": "#/$defs/SessionSearchRunRequest" + }, + { + "$ref": "#/$defs/SessionReplaySearchRequest" + } + ], + "title": "Request" +} - removed
Input schema / properties / search_indexRemoved value: -{ - "default": -1, - "title": "Search Index", - "type": "integer" -} - removed
Input schema / properties / session_idRemoved value: -{ - "default": "", - "title": "Session Id", - "type": "string" -} - added
Input schema / requiredAdded value: +[ + "request" +] - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "read_sessionOutput", - "type": "object" -}New value: +null
- Changed
save_literature_notes7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / collection_name / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / note_format / enumAdded value: +[ + "wiki", + "foam", + "markdown", + "medpaper" +] - changed
Input schema / properties / output_dir / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 4096, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / pmids / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "integer" - } -]New value: +[ + { + "maxLength": 100000, + "minLength": 1, + "type": "string" + }, + { + "items": { + "maxLength": 512, + "minLength": 1, + "type": "string" + }, + "maxItems": 1000, + "minItems": 1, + "type": "array" + } +] - changed
Input schema / properties / template_file / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 4096, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "save_literature_notesOutput", - "type": "object" -}New value: +null
- Changed
save_pipeline12 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / config / maxLengthAdded value: +100000 - added
Input schema / properties / config / minLengthAdded value: +1 - added
Input schema / properties / description / maxLengthAdded value: +2000 - added
Input schema / properties / name / maxLengthAdded value: +64 - added
Input schema / properties / name / minLengthAdded value: +1 - added
Input schema / properties / name / patternAdded value: +"^[a-z0-9](?:[a-z0-9_-]{0,63})$" - added
Input schema / properties / scope / enumAdded value: +[ + "auto", + "workspace", + "global" +] - added
Input schema / properties / tags / anyOfAdded value: +[ + { + "items": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9_.-]{0,63})$", + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + { + "type": "null" + } +] - changed
Input schema / properties / tags / defaultPrevious value: -""New value: +null - removed
Input schema / properties / tags / typeRemoved value: -"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "save_pipelineOutput", - "type": "object" -}New value: +null
- Changed
schedule_pipeline9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / cron / defaultRemoved value: -"" - added
Input schema / properties / cron / maxLengthAdded value: +200 - added
Input schema / properties / cron / minLengthAdded value: +1 - added
Input schema / properties / name / maxLengthAdded value: +64 - added
Input schema / properties / name / minLengthAdded value: +1 - added
Input schema / properties / name / patternAdded value: +"^[a-z0-9](?:[a-z0-9_-]{0,63})$" - changed
Input schema / requiredPrevious value: -[ - "name" -]New value: +[ + "name", + "cron" +] - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "schedule_pipelineOutput", - "type": "object" -}New value: +null
- Changed
search_biomedical_images21 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / article_type / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "ab", + "bk", + "bf", + "cr", + "dp", + "di", + "ed", + "ib", + "in", + "lt", + "mr", + "ma", + "ne", + "ob", + "pr", + "or", + "re", + "ra", + "rw", + "sr", + "rr", + "os", + "hs", + "ot" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / collection / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "pmc", + "cxr", + "usc", + "hmd", + "mpx" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / hmp_typeAdded value: +{ + "anyOf": [ + { + "enum": [ + "ad", + "ar", + "at", + "bi", + "br", + "cr", + "ca", + "ch", + "cg", + "cd", + "dr", + "ep", + "ex", + "hr", + "hu", + "lt", + "mp", + "nw", + "pn", + "ph", + "pi", + "po", + "pt", + "pc", + "ps" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Hmp Type" +} - changed
Input schema / properties / image_type / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "xg", + "xm", + "x", + "u", + "ph", + "p", + "mc", + "m", + "g", + "c" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / license_type / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "by", + "bync", + "byncnd", + "byncsa" + ], + "type": "string" + }, + { + "type": "null" + } +] - removed
Input schema / properties / limit / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -] - added
Input schema / properties / limit / maximumAdded value: +50 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / limit / typeAdded value: +"integer" - removed
Input schema / properties / open_access_onlyRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "string" - } - ], - "default": true, - "title": "Open Access Only" -} - added
Input schema / properties / query / maxLengthAdded value: +500 - added
Input schema / properties / query / minLengthAdded value: +1 - changed
Input schema / properties / search_fields / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "t", + "m", + "ab", + "msh", + "c", + "a" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / sort_by / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "r", + "o", + "d", + "e", + "g", + "oc", + "pr", + "pg", + "t" + ], + "type": "string" + }, + { + "type": "null" + } +] - removed
Input schema / properties / sourcesRemoved value: -{ - "default": "auto", - "title": "Sources", - "type": "string" -} - changed
Input schema / properties / specialty / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "b", + "bc", + "c", + "ca", + "cc", + "d", + "de", + "dt", + "e", + "en", + "f", + "eh", + "g", + "ge", + "gr", + "gy", + "h", + "i", + "id", + "im", + "n", + "ne", + "nu", + "o", + "or", + "ot", + "p", + "py", + "pu", + "r", + "s", + "t", + "u", + "v", + "vi" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / subset / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "b", + "c", + "e", + "s", + "x" + ], + "type": "string" + }, + { + "type": "null" + } +] - removed
Input schema / properties / video_only / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - } -] - added
Input schema / properties / video_only / typeAdded value: +"boolean" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "search_biomedical_imagesOutput", - "type": "object" -}New value: +null
- Changed
search_clinvar8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / limit / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -] - added
Input schema / properties / limit / maximumAdded value: +50 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / limit / typeAdded value: +"integer" - added
Input schema / properties / query / maxLengthAdded value: +500 - added
Input schema / properties / query / minLengthAdded value: +1 - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "search_clinvarOutput", - "type": "object" -}New value: +null
- Changed
search_compound8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / limit / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -] - added
Input schema / properties / limit / maximumAdded value: +50 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / limit / typeAdded value: +"integer" - added
Input schema / properties / query / maxLengthAdded value: +500 - added
Input schema / properties / query / minLengthAdded value: +1 - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "search_compoundOutput", - "type": "object" -}New value: +null
- Changed
search_gene9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / limit / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -] - added
Input schema / properties / limit / maximumAdded value: +50 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / limit / typeAdded value: +"integer" - changed
Input schema / properties / organism / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / query / maxLengthAdded value: +500 - added
Input schema / properties / query / minLengthAdded value: +1 - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "search_geneOutput", - "type": "object" -}New value: +null
- Changed
test_institutional_access4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / pmid / maxLengthAdded value: +32 - added
Input schema / properties / pmid / minLengthAdded value: +1 - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "test_institutional_accessOutput", - "type": "object" -}New value: +null
- Changed
unified_search14 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / filters / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 4096, + "type": "string" + }, + { + "type": "null" + } +] - removed
Input schema / properties / limit / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "string" - } -] - added
Input schema / properties / limit / maximumAdded value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / limit / typeAdded value: +"integer" - changed
Input schema / properties / options / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2048, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / pipeline / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 100000, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / query / defaultAdded value: +"" - added
Input schema / properties / query / maxLengthAdded value: +4096 - changed
Input schema / properties / sources / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 1024, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / stop_at / maxLengthAdded value: +200 - removed
Input schema / requiredRemoved value: -[ - "query" -] - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "unified_searchOutput", - "type": "object" -}New value: +null
- Added
unschedule_pipeline - Added
validate_pico_plan - Changed
verify_reference_list7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / max_references / maximumAdded value: +200 - added
Input schema / properties / max_references / minimumAdded value: +1 - added
Input schema / properties / reference_text / maxLengthAdded value: +200000 - added
Input schema / properties / reference_text / minLengthAdded value: +1 - added
Input schema / properties / source_name / maxLengthAdded value: +255 - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "verify_reference_listOutput", - "type": "object" -}New value: +null
46 tool updates
v0.5.16- First observed
analyze_figure_for_search - First observed
analyze_search_query - First observed
analyze_timeline_milestones - First observed
build_citation_tree - First observed
build_research_timeline - First observed
compare_timelines - First observed
configure_institutional_access - First observed
convert_icd_mesh - First observed
delete_pipeline - First observed
diagnose_institutional_access - First observed
fetch_article_details - First observed
find_citing_articles - First observed
find_related_articles - First observed
generate_search_queries - First observed
get_article_figures - First observed
get_article_references - First observed
get_cached_article - First observed
get_citation_metrics - First observed
get_compound_details - First observed
get_compound_literature - First observed
get_fulltext - First observed
get_gene_details - First observed
get_gene_literature - First observed
get_institutional_link - First observed
get_pipeline_history - First observed
get_session_log - First observed
get_session_pmids - First observed
get_session_summary - First observed
get_text_mined_terms - First observed
list_pipelines - First observed
list_resolver_presets - First observed
load_pipeline - First observed
manage_pipeline - First observed
parse_pico - First observed
prepare_export - First observed
read_session - First observed
save_literature_notes - First observed
save_pipeline - First observed
schedule_pipeline - First observed
search_biomedical_images - First observed
search_clinvar - First observed
search_compound - First observed
search_gene - First observed
test_institutional_access - First observed
unified_search - First observed
verify_reference_list
TDQS
Scored across 41 tools
The set contains several overlapping clusters: unified_search vs generate_search_queries/analyze_search_query, four citation-exploration tools (find_related_articles, find_citing_articles, get_article_references, build_citation_tree), and multiple fulltext/institutional-access tools (get_fulltext, diagnose_institutional_access, get_institutional_link, configure_institutional_access, test_institutional_access). Descriptions are unusually detailed and cross-reference each other, which mitigates confusion, but an agent must still inspect descriptions carefully to avoid misselection.
All 41 tools use snake_case with a consistent verb_noun or verb_phrase pattern (search_gene, get_fulltext, build_citation_tree, save_literature_notes, etc.). There is no camelCase or mixed casing, and the single adjective-first tool unified_search does not meaningfully break the predictable convention.
With 41 tools, this server is far beyond the 3-15 sweet spot and includes many specialized helpers (seven pipeline tools, five institutional-access tools, three gene tools, three compound tools, session/artifact readers, and image/chronicle tools). Each may have a distinct purpose, but the sheer count makes the surface heavy and raises selection cost for an agent.
The surface covers search and discovery, citation networks, fulltext retrieval, export, note-saving, pipeline lifecycle (save/list/load/delete/schedule/unschedule/history), persistent research chronicles, gene/compound lookup, biomedical image search, and institutional access. No obvious lifecycle gaps are present, and overwrite/upsert semantics handle missing update operations.
Maintenance
Related MCP Connectors
Academic research MCP server for paper search, citation checks, graphs, and deep research.
Research paper search with real citations and reference formatting for AI assistants
MCP server for building and testing AI agents with multi-model experimentation and insights.
Open scientific and engineering knowledge for AI agents: search, evidence, document publishing.
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.519 PyPI3MIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server that enables coding agents to search academic papers, ingest full-text PDFs, extract structured details, and manage citations in literature research workflows.31MIT
- FlicenseAqualityDmaintenanceAI-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.2-