Pilldoc User MCP
Provides access to pharmaceutical management system APIs including user authentication, pharmacy account management, and advertising campaign controls. Enables querying pharmacy information, updating account details, and managing ad blocking through natural language interactions.
README
Pilldoc User MCP (Local MCP Server)
이 프로젝트는 MCP 호환 클라이언트에서 사용할 수 있는 로컬 MCP 서버를 제공합니다. 로그인 토큰 발급과 주성분 목록 조회 기능을 도구(tool)로 노출합니다.
요구 사항
- Python 3.9+
설치
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
환경 변수 설정
.env.example를 참고해 .env.local을 생성하세요.
cp .env.example .env.local
vi .env.local
- 필수
EDB_BASE_URL(예: https://dev-adminapi.edbintra.co.kr)EDB_LOGIN_URL(예: https://dev-adminapi.edbintra.co.kr/v1/auth/login)
- 선택
EDB_USER_ID,EDB_PASSWORD(로그인 시 기본값)EDB_FORCE_LOGIN(true/false)
환경 변수 예시
개발 서버 예시
export EDB_BASE_URL="https://dev-adminapi.edbintra.co.kr"
export EDB_LOGIN_URL="https://dev-adminapi.edbintra.co.kr/v1/auth/login"
export EDB_USER_ID="YOUR_ID"
export EDB_PASSWORD="YOUR_PASSWORD"
실서버 예시
export EDB_BASE_URL="https://webconsole-api.edbintra.co.kr"
export EDB_LOGIN_URL="https://webconsole-api.edbintra.co.kr/v1/auth/login"
export EDB_USER_ID="YOUR_ID"
export EDB_PASSWORD="YOUR_PASSWORD"
서버 환경
- 개발 서버:
https://dev-adminapi.edbintra.co.kr - 실서버:
https://webconsole-api.edbintra.co.kr/
서버 실행
- 단독 실행
python -m src.mcp_server
- 매니페스트 (MCP 클라이언트용)
{
"name": "pharminfo-mcp",
"version": "0.1.0",
"entry": "python -m src.mcp_server"
}
MCP 호환 클라이언트(예: IDE/Agent)에서 이 디렉토리를 로컬 서버로 등록하세요.
제공 도구 (Tools)
login(userId?, password?, force?, loginUrl?, timeout?) -> token- 미지정 시 환경변수 사용:
EDB_USER_ID,EDB_PASSWORD,EDB_LOGIN_URL
- 미지정 시 환경변수 사용:
pilldoc_accounts(token? | userId/password, baseUrl?, accept?, timeout?, pageSize?, page?, sortBy?, erpKind?, isAdDisplay?, adBlocked?, salesChannel?, pharmChain?, currentSearchType?, searchKeyword?, accountType?) -> JSONpilldoc_user(token, baseUrl, id, accept?, timeout?) -> JSONpilldoc_pharm(token, baseUrl, bizno, accept?, timeout?) -> JSONpilldoc_adps_rejects(bizNo, token? | userId/password, baseUrl?, accept?, timeout?) -> JSONpilldoc_adps_reject(bizNo, campaignId, comment, token? | userId/password, baseUrl?, accept?, timeout?) -> JSONpilldoc_user_from_accounts(accountField?, accountValue?, index?, token? | userId/password, baseUrl?, accept?, timeout?, pageSize?, page?, sortBy?, erpKind?, isAdDisplay?, adBlocked?, salesChannel?, pharmChain?, currentSearchType?, searchKeyword?, accountType?) -> JSONpilldoc_accounts_stats(token? | userId/password, baseUrl?, accept?, timeout?, pageSize?, maxPages?, sortBy?, erpKind?, isAdDisplay?, adBlocked?, salesChannel?, pharmChain?, currentSearchType?, searchKeyword?, accountType?) -> JSON- 계정 목록을 페이지네이션으로 수집하여 통계를 집계합니다.
- 반환:
totalCountReported,pagesFetched,period.from/to,stats.monthly/region/erpCode/adBlocked
pilldoc_update_account(id, body, token? | userId/password, baseUrl?, accept?, timeout?, contentType?) -> JSON/v1/pilldoc/account/{id}로 PATCH 호출하여 약국/계정 정보를 수정
pilldoc_update_account_by_search(body, pharmName?, bizNo?, exact?, index?, accountType?, currentSearchType?, maxPages?, pageSize?, salesChannel?, erpKind?, pharmChain?, token? | userId/password, baseUrl?, accept?, timeout?, contentType?) -> JSON/v1/pilldoc/accounts에서 약국명/사업자번호로 id를 찾은 뒤/v1/pilldoc/account/{id}PATCH 수행pharmChain배열 필터 지원: 지정 시 체인 소속으로 추가 필터링salesChannel/erpKind배열 필터 지원maxPages: 검색 페이지 수 제한(0이면 전체), 대량 데이터에서 유용contentType: PATCH 요청 Content-Type 지정(기본application/json)bizNo는 하이픈 포함 형태(317-87-01363)로 입력해도 자동 정규화되어 조회됩니다./v1/pilldoc/accounts에서 계정을 골라 ID를 얻은 뒤/v1/pilldoc/user/{id}상세를 반환
간단 호출 예 (개념)
- 토큰 발급:
login({ userId, password, force: true }) - pilldoc 계정:
pilldoc_accounts({ token, baseUrl }) - 광고 차단된 약국만:
pilldoc_accounts({ adBlocked: true })// 내부적으로isAdDisplay: 0으로 매핑 - 광고 차단되지 않은 약국만:
pilldoc_accounts({ adBlocked: false })// 내부적으로isAdDisplay: 1으로 매핑 - 월별/지역별 등 통계:
pilldoc_accounts_stats({ pageSize: 200, maxPages: 0 }) - pilldoc 사용자:
pilldoc_user({ token, baseUrl, id: "USER_ID" }) - pilldoc 계정 검색:
pilldoc_accounts({ pageSize: 20, page: 1, erpKind: ["iT3000"], accountType: "일반" }) - pilldoc 사용자(계정에서 선택):
pilldoc_user_from_accounts({ searchKeyword: "홍길동", currentSearchType: ["s"], index: 0 }) - pilldoc 약국:
pilldoc_pharm({ token, baseUrl, bizno: "사업자번호" }) - 차단 캠페인:
pilldoc_adps_rejects({ token, baseUrl, bizNo: "사업자번호" })- 차단 등록:
pilldoc_adps_reject({ token, baseUrl, bizNo: "사업자번호", campaignId: 123, comment: "사유" })
- 차단 등록:
약국 정보 업데이트 예시
// 호출 예 (개념)
{
"id": "d596dbdb-5a96-4970-8fd9-08bae9021e05",
"body": {
"userType": "pharm",
"displayName": "string",
"email": "user@example.com",
"memberShipType": "basic",
"isDisable": true,
"lockoutEnabled": true,
"unLockAccount": true,
"약국명": "string",
"accountType": "일반",
"관리자승인여부": true,
"요양기관번호": "string",
"약국전화번호": "string",
"휴대전화번호": "string",
"pharAddress": "string",
"pharAddressDetail": "string",
"latitude": 0,
"longitude": 0,
"bcode": "string",
"pharmChain": "string",
"erpCode": 0,
"영업채널Code": 0,
"salesManagerId": 0,
"필첵QR표기": "표시",
"약국광고표기": "표시"
}
}
검색 후 약국 정보 업데이트 예시 (adpsRejects 포함)
// 호출 예 (개념)
{
"pharmName": "OOO약국",
"pharmChain": ["온누리약국"],
"salesChannel": [5],
"erpKind": ["IT3000", "EPHARM"],
"maxPages": 0,
"contentType": "application/json",
"body": {
"약국명": "OOO약국",
"약국전화번호": "02-000-0000",
"휴대전화번호": "010-0000-0000"
}
}
참고: pilldoc_find_pharm 결과의 matches[*]에는 account, user, pharm에 더해 adpsRejects가 포함됩니다.
pharmChain 허용 값
- 온누리약국
- 옵티마케어
- 더블유스토어
- 휴베이스
- 리드팜
- 메디팜
- 데이팜
- 위드팜
- 참약사
salesChannel 코드
- 1: 약학정보원
- 2: 비트
- 3: 한미
- 0: 터울
- 4: 팜플
- 5: 이디비
erpKind 코드
- IT3000: [약학정보원] PharmIT3000
- BIZPHARM: [비트컴퓨터] BizPharm-C
- DAYPHARM: [데이팜] DayPharm
- WITHPHARM: [위드팜] WithPharmErp
- EPHARM: [이디비] EPharm
- EGHIS: [이지스헬스케어] 이지스팜
디렉토리
src/mcp_server.py: MCP 서버 엔트리src/auth.py: 로그인/토큰 유틸
Claude Desktop 설정
macOS(로컬)에서 Claude Desktop과 연동하려면 아래 설정 파일을 생성하세요.
- 가상환경과 의존성 준비
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
- 설정 파일 생성 (macOS)
- 경로:
~/Library/Application Support/Claude/claude_desktop_config.json - 예시 내용(경로를 사용자의 실제 경로로 변경하세요).
-c실행 방식:
{
"mcpServers": {
"pharminfo-mcp": {
"command": "/ABSOLUTE/PROJECT/PATH/.venv/bin/python",
"args": [
"-c",
"import sys; sys.path.insert(0, '/ABSOLUTE/PROJECT/PATH'); from src.mcp_server import create_server; create_server().run()"
],
"env": {
"PYTHONUNBUFFERED": "1",
"PYTHONPATH": "/ABSOLUTE/PROJECT/PATH",
"EDB_BASE_URL": "https://dev-adminapi.edbintra.co.kr",
"EDB_LOGIN_URL": "https://dev-adminapi.edbintra.co.kr/v1/auth/login",
"EDB_USER_ID": "EMAIL",
"EDB_PASSWORD": "PASSWORD"
}
}
}
}
실서버 예시
{
"mcpServers": {
"pharminfo-mcp": {
"command": "/ABSOLUTE/PROJECT/PATH/.venv/bin/python",
"args": [
"-c",
"import sys; sys.path.insert(0, '/ABSOLUTE/PROJECT/PATH'); from src.mcp_server import create_server; create_server().run()"
],
"env": {
"PYTHONUNBUFFERED": "1",
"PYTHONPATH": "/ABSOLUTE/PROJECT/PATH",
"EDB_BASE_URL": "https://webconsole-api.edbintra.co.kr",
"EDB_LOGIN_URL": "https://webconsole-api.edbintra.co.kr/v1/auth/login",
"EDB_USER_ID": "EMAIL",
"EDB_PASSWORD": "PASSWORD"
}
}
}
}
참고: Claude Desktop은 cwd를 무시할 수 있습니다. 위 예시처럼 sys.path.insert(0, PROJECT_PATH) 또는 env.PYTHONPATH에 프로젝트 경로를 추가해야 import src...가 정상 동작합니다. 로그에 ModuleNotFoundError: No module named 'src'가 보이면 이 설정을 확인하세요.
- Claude Desktop 재시작 후 사용
- Claude 대화 입력창에서 등록된 MCP 도구들을 사용할 수 있습니다.
- 환경변수는 프로젝트 루트의
.env.local를 활용하세요.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.