PubTator MCP ์๋ฒ
๐ PubTator3 ๊ธฐ๋ฐ์ ์๋ฌผ์ํ ๋ฌธํ ์ฃผ์ ๋ฐ ๊ด๊ณ ๋ง์ด๋ ์๋ฒ๋ก, MCP ์ธํฐํ์ด์ค๋ฅผ ํตํด ํธ๋ฆฌํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
PubTator MCP ์๋ฒ๋ AI ์ด์์คํดํธ์๊ฒ ๋ชจ๋ธ ์ปจํ ์คํธ ํ๋กํ ์ฝ(MCP)์ ํตํด PubTator3 ์๋ฌผ์ํ ๋ฌธํ ์ฃผ์ ์์คํ ์ ๋ํ ์ ๊ทผ ๊ถํ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด AI ๋ชจ๋ธ์ ๊ณผํ ๋ฌธํ์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๊ฒ์ํ๊ณ , ์ฃผ์ ์ ๋ณด๋ฅผ ์ป๊ณ , ๊ฐ์ฒด ๊ด๊ณ๋ฅผ ๋ถ์ํ ์ ์์ต๋๋ค.
๐ค ๊ธฐ์ฌ โข ๐ ๋ฌธ์ ๋ณด๊ณ
โจ ํต์ฌ ๊ธฐ๋ฅ
๐ ๋ฌธํ ์ฃผ์ ๋ด๋ณด๋ด๊ธฐ: PubTator ์ฃผ์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ๋ฌ ํ์์ผ๋ก ๋ด๋ณด๋ด๊ธฐ ์ง์ โ
๐ ์ํฐํฐ ID ์กฐํ: ์์ ํ ์คํธ๋ฅผ ํตํด ์๋ฌผํ์ ๊ฐ๋ ์ ๋ํ ํ์ค ์๋ณ์๋ฅผ ์ฟผ๋ฆฌํฉ๋๋ค. โ
๐ ๊ด๊ณ ๋ง์ด๋: ๊ฐ์ฒด ๊ฐ ์๋ฌผํ์ ๊ด๊ณ๋ฅผ ๋ฐ๊ฒฌํ์ธ์ โ
๐ ๋ฌธํ ๊ฒ์: ํค์๋ ๋ฐ ์ํฐํฐ ID๋ก ๋ฌธํ ๊ฒ์ ์ง์ โ
๐ง ์ผ๊ด ์ฒ๋ฆฌ: ๊ฒ์ ๊ฒฐ๊ณผ์์ ์ฃผ์ ์ ๋ณด์ ์ผ๊ด ๋ด๋ณด๋ด๊ธฐ ์ง์ โ
Related MCP server: PubMed MCP Server
๐ ๋น ๋ฅธ ์์
์๊ตฌ ์ฌํญ
ํ์ด์ฌ 3.10+
FastMCP ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ค์น
์ค๋ฏธ์๋ฆฌ๋ฅผ ํตํด
Smithery๋ฅผ ์ฌ์ฉํ์ฌ PubTator Server๋ฅผ ์๋์ผ๋ก ์ค์นํ์ธ์.
ํด๋ก๋
์ง์์คํผ1
์ปค์
์ค์ โ ์ปค์ ์ค์ โ MCP โ ์ ์๋ฒ ์ถ๊ฐ์ ๋ถ์ฌ๋ฃ๊ธฐ:
๋งฅ/๋ฆฌ๋ ์ค
npx -y @smithery/cli@latest run @JackKuo666/pubtator-mcp-server --client cursor --config "{}" ์๋์ํ
npx -y @smithery/cli@latest install @JackKuo666/pubtator-mcp-server --client windsurf --config "{}"C๋ผ์ธ
npx -y @smithery/cli@latest install @JackKuo666/pubtator-mcp-server --client cline --config "{}"์๋ ์ค์น
์ ์ฅ์๋ฅผ ๋ณต์ ํฉ๋๋ค.
git clone https://github.com/JackKuo666/PubTator-MCP-Server.git cd PubTator-MCP-Server์ข ์์ฑ ์ค์น:
pip install -r requirements.txt
๐ ์ฌ์ฉ๋ฒ
์๋ฒ๋ฅผ ์ง์ ์คํ
MCP ์๋ฒ๋ฅผ ์์ํฉ๋๋ค.
python pubtator_server.py์ด์ ์๋ฒ๋ stdio์ TCP ์ ์ก์ ๋ชจ๋ ์ง์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก TCP ์ ์ก์ ์ฌ์ฉํฉ๋๋ค. ๋ค์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
MCP_TRANSPORT: TCP ์ ์ก์ ๊ฒฝ์ฐ "tcp"๋ก ์ค์ ํ๊ณ stdio ์ ์ก์ ๊ฒฝ์ฐ "stdio"๋ก ์ค์ ํฉ๋๋ค(๊ธฐ๋ณธ๊ฐ์ "tcp").MCP_HOST: ๋ฐ์ธ๋ฉํ ํธ์คํธ(๊ธฐ๋ณธ๊ฐ์ "0.0.0.0")MCP_PORT: ์์ ํ ํฌํธ(๊ธฐ๋ณธ๊ฐ์ 8080)
์ฌ์ฉ์ ์ ์ ์ค์ ์ผ๋ก ์๋ฒ๋ฅผ ์์ํ๋ ์:
MCP_TRANSPORT=tcp MCP_HOST=127.0.0.1 MCP_PORT=8888 python pubtator_server.py์๋ฒ๋ ์ง์ฐ ์ด๊ธฐํ์ ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํฉ๋๋ค. ์ข ๋ฃ ์ ํธ(SIGINT ๋ฐ SIGTERM)๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์์ ๋๋ ์๋ ์ค ๋ฐ์ํ๋ ๋ชจ๋ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
Docker ์ฌ์ฉ
๊ฐํธํ ๋ฐฐํฌ๋ฅผ ์ํด Dockerfile์ ์ ๊ณตํฉ๋๋ค. Docker ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋ํฉ๋๋ค.
docker build -t pubtator-mcp-server .Docker ์ปจํ ์ด๋๋ฅผ ์คํํฉ๋๋ค.
docker run -p 8080:8080 pubtator-mcp-server
์ด๋ ๊ฒ ํ๋ฉด Docker ์ปจํ ์ด๋ ๋ด๋ถ์์ PubTator MCP ์๋ฒ๊ฐ ์์๋์ด ํฌํธ 8080์ ๋ ธ์ถ๋ฉ๋๋ค.
๋ฌธ์ ํด๊ฒฐ
์๋ฒ๋ฅผ ์์ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ:
์ฝ์ ์ถ๋ ฅ์์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ธํ์ธ์.
๋ชจ๋ ํ์ ์ข ์์ฑ์ด ์ค์น๋์๋์ง ํ์ธํ์ธ์(์๊ตฌ ์ฌํญ ์น์ ์ฐธ์กฐ).
ํ๊ฒฝ ๋ณ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์๋์ง ํ์ธํ์ธ์.
์๋ฒ๊ฐ ์์๋์ง ์์ผ๋ฉด ์์ธํ ์ ๋ณด๋ฅผ ์ถ๊ฐํ์ฌ ์คํํด๋ณด์ธ์.
python -v pubtator_server.py์ด๋ฅผ ํตํด ๋ฌธ์ ์ ๊ทผ์์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋๋ ๋์ฑ ์์ธํ ๋ก๊น ์ ๋ณด๊ฐ ์ ๊ณต๋ฉ๋๋ค.
Docker๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์์ ํตํด ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
docker logs <container_id>๊ตฌ์ฑ
ํด๋ก๋ ๋ฐ์คํฌํฑ ๊ตฌ์ฑ
claude_desktop_config.json ์ ์ถ๊ฐ:
(๋งฅ OS)
{
"mcpServers": {
"pubtator": {
"command": "python",
"args": ["-m", "pubtator-mcp-server"]
}
}
}(์๋์ฐ)
{
"mcpServers": {
"pubtator": {
"command": "C:\\Users\\YOUR\\PATH\\miniconda3\\envs\\mcp_server\\python.exe",
"args": [
"D:\\code\\YOUR\\PATH\\PubTator-MCP-Server\\pubtator_server.py"
],
"env": {},
"disabled": false,
"autoApprove": []
}
}
}CLine ๊ตฌ์ฑ
{
"mcpServers": {
"pubtator": {
"command": "bash",
"args": [
"-c",
"source /home/YOUR/PATH/mcp-server-pubtator/.venv/bin/activate && python /home/YOUR/PATH/pubtator_server.py"
],
"env": {
"MCP_TRANSPORT": "stdio"
},
"disabled": false,
"autoApprove": []
}
}
}TCP ์ ์ก์ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ์ ์์ ํ์ธ์.
{
"mcpServers": {
"pubtator": {
"command": "bash",
"args": [
"-c",
"source /home/YOUR/PATH/mcp-server-pubtator/.venv/bin/activate && python /home/YOUR/PATH/pubtator_server.py"
],
"env": {
"MCP_TRANSPORT": "tcp",
"MCP_HOST": "127.0.0.1",
"MCP_PORT": "8888"
},
"disabled": false,
"autoApprove": []
}
}
}๐ API ๊ธฐ๋ฅ
PubTator MCP ์๋ฒ๋ ๋ค์๊ณผ ๊ฐ์ ํต์ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
1. ์ถํ๋ฌผ ๋ด๋ณด๋ด๊ธฐ(export_publications)
์ง์ ๋ PMID ๋ฌธํ์ ๋ํ PubTator ์ฃผ์ ๊ฒฐ๊ณผ ๋ด๋ณด๋ด๊ธฐ:
result = await export_publications(
ids=["32133824", "34170578"],
id_type="pmid",
format="biocjson", # Supported: pubtator, biocxml, biocjson
full_text=False # Whether to include full text
)2. ์ํฐํฐ ID ์กฐํ(find_entity_id)
์์ ํ ์คํธ๋ฅผ ํตํด ์๋ฌผํ์ ๊ฐ๋ ์ ๋ํ ํ์ค ์๋ณ์๋ฅผ ์ฟผ๋ฆฌํฉ๋๋ค.
result = await find_entity_id(
query="COVID-19",
concept="disease", # Optional: gene, disease, chemical, species, mutation
limit=5 # Optional: limit number of results
)3. ๊ด๊ณ ์ฟผ๋ฆฌ(find_related_entities)
์ง์ ๋ ์ํฐํฐ์ ๊ด๋ จ๋ ๋ค๋ฅธ ์ํฐํฐ ์ฐพ๊ธฐ:
result = await find_related_entities(
entity_id="@DISEASE_COVID_19",
relation_type="treat", # Optional: treat, cause, interact, etc.
target_entity_type="chemical", # Optional: gene, disease, chemical
max_results=5 # Optional: limit number of results
)4. ๋ฌธํ ๊ฒ์(search_pubtator)
PubTator ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฒ์:
results = await search_pubtator(
query="COVID-19",
max_pages=1 # Optional: maximum number of pages to retrieve
)5. ์ผ๊ด ๋ด๋ณด๋ด๊ธฐ(batch_export_from_search)
๋ฌธํ ์ฃผ์ ๊ฒ์ ๋ฐ ์ผ๊ด ๋ด๋ณด๋ด๊ธฐ:
results = await batch_export_from_search(
query="COVID-19",
format="biocjson",
max_pages=1,
full_text=False,
batch_size=5
)์ฐธ๊ณ : ์ค์ ํจ์ ํธ์ถ์ ๊ตฌํ ๋ฐฉ์์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ด ์์๋ ์ต๊ทผ ํ ์คํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, ์ค์ API์ ๋ง๊ฒ ์กฐ์ ํด์ผ ํ ์๋ ์์ต๋๋ค.
โ ๏ธ ์ฌ์ฉ ์ ํ
API ์์ฒญ ์๋ ์ ํ: ์ด๋น ์ต๋ 3๊ฐ ์์ฒญ
์ผ๊ด ๋ด๋ณด๋ด๊ธฐ ์ ์์ฒญ ์๊ฐ ์ด๊ณผ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ ํ batch_size๋ฅผ ์ฌ์ฉํ์ธ์.
๊ด๊ณ ์ฟผ๋ฆฌ์ ๊ฒฝ์ฐ ์ํฐํฐ ID๋ "@"๋ก ์์ํด์ผ ํฉ๋๋ค(์: "@DISEASE_COVID-19").
๐ ๋ผ์ด์ผ์ค
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค์ ๋ฐ๋ผ ๋ผ์ด์ ์ค๊ฐ ๋ถ์ฌ๋์์ต๋๋ค.
โ ๏ธ ๋ฉด์ฑ ์กฐํญ
์ด ๋๊ตฌ๋ ์ฐ๊ตฌ ๋ชฉ์ ์ผ๋ก๋ง ์ฌ์ฉ๋ฉ๋๋ค. PubTator์ ์๋น์ค ์ฝ๊ด์ ์ค์ํ๊ณ ์ฑ ์๊ฐ ์๊ฒ ์ฌ์ฉํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.