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를 활용하세요.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。