
Apify MCP 서버를 사용하여 Claude에 FDA 약물 라벨 도구 제공하는 방법
요약
Claude와 Apify MCP 서버를 연결하여 openFDA의 실시간 약물 라벨 데이터를 조회하는 방법을 설명합니다. AI 에이전트의 환각 문제를 해결하기 위해 MCP 표준을 활용하여 구조화된 외부 데이터를 도구로 호출하는 가이드를 제공합니다.
핵심 포인트
- MCP를 통해 Claude가 스스로 필요한 외부 도구를 호출하도록 설정
- openFDA 데이터를 활용하여 약물 라벨에 대한 실시간 조회 구현
- API 하드코딩 없이 Apify Actor를 에이전트 도구로 활용
- 구조화된 입출력을 통해 AI의 답변 정확도와 신뢰성 향상
AI 에이전트(AI agents)는 추론에는 능숙하지만 사실 관계에는 매우 취약합니다. Claude에게 처방용 이부프로펜(ibuprofen)에 경고 문구(boxed warning)가 있는지, 어떤 경우에 금기(contraindicated)되는지, 그리고 특정 버전은 어느 회사가 만드는지 물어본다면, Claude는 자신의 학습 데이터로부터 매우 확신에 찬 답변을 내놓겠지만, 그 정보는 구식(outdated)이거나, 여러 제품이 뒤섞여 있거나, 혹은 단순히 틀렸을 수도 있습니다. 헬스 테크(health tech), 제약(pharma), 임상(clinical) 환경에서 약물 라벨에 대해 "아마도 맞을 것"이라는 식의 답변은 결코 용납될 수 없는 영역입니다.
이 가이드에서 우리는 이 문제를 해결합니다. 우리는 Claude를 공식 Apify MCP 서버에 연결하고, openFDA로부터 구조화된 미국 약물 라벨링을 읽어오는 단일 Actor를 노출하여, "라벨에 뭐라고 적혀 있나요?"라는 질문을 추측이 아닌 실제 FDA 승인 라벨에 대한 실시간 조회(live lookup)로 전환합니다. 이 가이드를 마칠 때쯤이면 여러분은 Claude, Cursor, 또는 어떤 MCP 클라이언트라도 대화 도중에 호출할 수 있는 작동 가능한 약물 라벨 도구를 갖게 될 것이며, 실행 과정 중 어느 시점에 도구가 실행되고 무엇을 반환하는지 정확히 이해하게 될 것입니다.
아래의 모든 내용은 실제 출력값이 포함된 실제 설정입니다. 모의 응답(mocked responses)은 없습니다.
Apify MCP 서버란 무엇인가?
Model Context Protocol (MCP)는 AI 클라이언트가 외부 도구를 호출할 수 있게 해주는 개방형 표준입니다. Apify MCP 서버(https://mcp.apify.com)는 Apify 플랫폼 위에서 해당 표준을 구현하며, 이는 Apify Store에 있는 수천 개의 Actor 각각이 에이전트가 호출할 수 있는 도구가 된다는 것을 의미합니다.
왜 API 호출을 하드코딩(hard-coding)하는 대신 MCP를 통해 Actor를 라우팅할까요?
- 에이전트가 호출 시점을 결정합니다. Claude는 대화를 읽다가 자신이 가지고 있지 않은 사실이 필요함을 인지하고, 스스로 도구를 호출합니다. 모든 질문에 대해 별도의 글루 코드 (glue code)를 작성할 필요가 없습니다.
- 구조화된 입출력. MCP 서버가 Claude에게 Actor의 입력 스키마 (input schema)를 전달하므로, 모델은 파라미터 (parameters)를 정확하게 채울 수 있으며, 추론 가능한 깨끗한 데이터셋을 반환합니다.
- 하나의 연결로 여러 도구 사용. 동일한 MCP 엔드포인트 (endpoint)가
search-actors,fetch-actor-details,call-actor를 노출하므로, 에이전트는 새로운 설정 없이도 어떤 Actor든 탐색하고 실행할 수 있습니다. - 인프라 구축 불필요. 서버는 호스팅되어 있습니다. 설정 파일에 몇 줄만 추가하면 끝납니다.
사용할 Actor
우리는 openFDA Drug Labels & Ingredients Scraper를 노출할 것입니다. 약물 이름을 입력하면, 해당 제품에 대한 구조화된 FDA 라벨을 반환합니다: 브랜드 및 제네릭 명칭, 제조사, 제품 유형 (OTC 또는 처방약), 투여 경로, 활성 및 비활성 성분, NDC 및 신청 번호, 약리학적 분류, 그리고 임상의가 읽는 전체 라벨 섹션(적응증, 용법/용량, 박스 경고 (boxed warning), 금기 사항, 경고, 이상 반응, 약물 상호작용 포함)이 포함됩니다.
이러한 데이터 세트는 약물 안전 점검, 처방집 (formulary) 도구, 또는 임상 의사 결정 지원 (clinical decision-support) 프로토타입에 정확히 필요한 정보입니다. FDA 라벨링은 공개되어 있고, 권위가 있으며, 미국 내에서 약물이 승인된 용도에 대한 단일 진실 공급원 (single source of truth)이기 때문에 유용한 첫 번째 데이터 소스가 됩니다.
[
1단계: Apify API 토큰 가져오기
Apify Console에 로그인하여 Settings → Integrations를 열고 개인 API 토큰을 복사하세요. MCP 서버는 인증을 수행하고 Actor 실행 비용을 귀하의 계정으로 청구하는 데 이 토큰을 사용합니다.
📌 참고: 이 토큰은 비밀 정보입니다. 클라이언트 설정(client config)에만 보관하고, 프롬프트에 입력하거나 커밋된 파일에 절대 포함하지 마세요.
2단계: Claude Desktop을 Apify MCP 서버로 지정하기
Claude Desktop의 설정 파일(Settings → Developer → Edit Config, 또는 macOS의 경우 ~/Library/Application Support/Claude/claude_desktop_config.json)을 열고 Apify 서버를 추가하세요. tools 쿼리 파라미터(query parameter)가 중요한 부분입니다. 이 파라미터는 서버에 어떤 Actor를 노출할지 알려주어, Claude가 전체 Store 대신 하나의 특정 도구에 집중할 수 있게 합니다.
{
"mcpServers": {
"apify": {
...
Cursor는 .cursor/mcp.json에서 동일한 JSON을 사용합니다. 호스팅된 엔드포인트(hosted endpoint) 대신 stdio를 통해 로컬에서 실행하는 것을 선호한다면 다음과 같이 작성합니다:
{
"mcpServers": {
"apify": {
...
새로운 서버를 인식할 수 있도록 Claude Desktop을 재시작하세요.
3단계: 도구가 로드되었는지 확인하기
재시작 후, Actor가 호출 가능한 도구(callable tool)로 나타납니다. Apify 서버가 노출하는 도구 목록을 확인하면, 스토리지 헬퍼(storage helpers)와 함께 Store 핸들(handle) 이름으로 명명된 Actor 자체를 볼 수 있습니다:
get-actor-run, get-dataset-items, get-key-value-store-record,
abort-actor-run, scrapers_lat--openfda-drug-labels-scraper
마지막 항목인 scrapers_lat--openfda-drug-labels-scraper가 바로 우리의 약물 라벨(drug-label) 도구입니다. 이제 Claude는 이 도구가 존재한다는 것과, 그것이 무엇을 하는지(Actor의 README를 통해), 그리고 어떤 입력값(서버가 함께 전달하는 입력 스키마(input schema)를 통해)을 받는지 알고 있습니다.
4단계: Claude에게 약물 라벨에 대해 질문하기
이제 결과물을 확인할 차례입니다. 일반적인 채팅에서 근거 데이터(ground truth)가 필요한 질문을 던져보세요:
"처방용 이부프로펜(ibuprofen)에 대해, FDA 라벨은 경고 문구(boxed warning)와 금기 사항(contraindications)에 대해 무엇이라고 말하며, 제조사는 어디인가요?"
Claude는 자신의 기억만으로는 이 질문에 신뢰할 수 있게 답변할 수 없음을 인지하고, 약물 라벨 도구를 선택한 뒤 귀하의 질문에서 입력값을 채웁니다. 내부적으로 클라이언트는 Actor의 파라미터(parameters)를 포함한 tools/call을 전송합니다:
{
"name": "scrapers_lat--openfda-drug-labels-scraper",
"arguments": {
...
Apify MCP 서버는 Actor를 시작하고, 완료될 때까지 기다린 후 데이터셋 (dataset)을 반환합니다. 생성된 실제 실행 메타데이터 (run metadata)는 다음과 같습니다:
{
"runId": "H0JcoVdo3IP456L6o",
"actorName": "scrapers_lat/openfda-drug-labels-scraper",
...
FDA 라벨 세트를 대상으로 4초 이내에 실시간으로 수행되었습니다.
5단계: 실제 출력 결과 읽기
도구가 반환하는 데이터셋은 제품당 하나의 레코드로 구성된 구조화된 라벨링 데이터입니다. "ibuprofen"에 대한 쿼리는 일반 의약품 (OTC) 스토어 브랜드 정제부터 처방약 제형에 이르기까지 여러 제품을 반환합니다. 안전 점검 측면에서 흥미로운 것은 처방약 레코드입니다. 다음은 실행에서 추출한 실제 레코드입니다 (중요한 필드만 남기고 생략):
{
"brandName": ["Ibuprofen"],
"genericName": ["IBUPROFEN"],
...

Claude는 이를 읽고 쉬운 언어로 답변합니다: 이 처방용 ibuprofen (Aurobindo Pharma, ANDA213794)은 심혈관 혈전 이벤트 및 위장관 (GI) 출혈에 대한 **박스 경고 (boxed warning)**를 포함하고 있으며, 관상동맥 우회술 (CABG) 수술 상황 및 아스피린 또는 비스테로이드성 항염증제 (NSAID)로 유발된 천식이나 두드러기가 있는 환자에게는 금기 (contraindicated) 사항이며, 류마티스 관절염 및 골관절염에 적응증이 있습니다. 이 모든 사실은 모델의 기억이 아니라 2025-02-14부터 유효한 라벨에서 추적 가능한 정보입니다.
제품 간의 구분 또한 매우 중요합니다. 동일한 쿼리에 대해 전국 약국 체인의 자체 브랜드 200mg 정제와 같이, 박스 경고(boxed warning)가 없고 단순히 "일시적인 가벼운 통증 및 불편함 완화"라는 적응증을 가진 일반 의약품 (OTC) 기록도 반환됩니다. 안전 도구는 일반 의약품 (OTC) 정제와 처방용 제제의 차이를 반드시 알고 있어야 합니다. 왜냐하면 경고 사항, 용법 (dosing), 그리고 승인된 용도가 서로 다르기 때문입니다. Actor는 productType, applicationNumber 및 라벨 섹션을 함께 제공하여 두 가지 모두를 노출하므로, 에이전트가 올바른 것을 선택할 수 있습니다.
실제 사용 사례: 약물 안전 에이전트
맥락을 살펴보겠습니다. 한 헬스 테크 (health-tech) 팀이 환자의 현재 복용 약물을 새로운 처방전과 대조하는 접수 보조 도구 (intake assistant)를 구축하고 있습니다. 무언가를 플래그(flag)하기 전에, 이 도구는 암기된 근사치가 아닌 권위 있는 라벨로부터 다음 사항을 확인해야 합니다:
- 해당 약물이 실제로 인용된 경고 사항을 포함하고 있는지,
- 환자의 상태가 금기 사항 (contraindications)에 나열되어 있지 않은지,
- 제품 유형과 함량이 처방된 내용과 일치하는지.
도구가 없다면, 분석가는 FDA 라벨 조회 서비스를 열고, 약물을 검색하고, 박스 경고 및 금기 사항 섹션을 읽은 다음, 약물당 한 번씩 관련 문구를 기록에 복사해야 합니다. Claude에 도구가 연결되어 있다면, 분석가는 약물 목록을 채팅창에 붙여넣고 에이전트에게 각 라벨을 가져오라고 요청하기만 하면 됩니다. Claude는 약물별로 Actor를 호출하여 boxedWarning, contraindications, drugInteractions 섹션을 추출하고, 이를 환자 맥락과 비교한 뒤, NDC 및 신청 번호 (application number)를 증거로 포함하는 짧은 구조화된 노트를 생성합니다. 기계적인 조회 작업은 사라지고, 임상적 판단은 인간의 몫으로 남습니다.
이것이 모든 훌륭한 에이전트 도구의 형태입니다. 즉, 결정이 아닌 데이터 가져오기 (fetch)를 제거하는 것입니다.
더 나아가기: 두 번째 도구 체이닝 (chaining)
라벨은 약물이 무엇을 하도록 승인되었는지, 그리고 무엇을 경고하는지를 알려줍니다. 하지만 사람들이 약을 복용한 후 실제로 무엇을 보고했는지는 알려주지 않습니다. 동일한 MCP 연결을 통해 tools 파라미터를 확장함으로써 더 많은 Actor를 노출할 수 있습니다:
이제 에이전트는 한 번의 대화 내에서 공식 라벨을 읽는 동시에 FDA 보고 시스템으로부터 동일한 약물에 대한 실제 이상 사례 (adverse-event) 보고를 가져올 수 있으며, 이를 하나의 안전 요약본으로 결합할 수 있습니다. 즉, 라벨이 경고하는 내용과 환자 및 임상의가 실제로 보고한 내용을 하나로 합치는 것입니다. 각 Actor는 별개의 도구이므로, 에이전트는 각 단계에 맞는 적절한 도구를 스스로 선택합니다.
🏹 문제 해결 (Troubleshooting): 만약 Claude에 도구가 나타나지 않는다면, 일반적인 두 가지 원인은 tools 파라미터에 Actor 핸들 (handle)이 누락되었거나 잘못 입력된 경우(Store URL에 있는 username/actor-name과 정확히 일치해야 함), 그리고 Claude가 실행 중인 동안 설정을 수정했을 경우입니다. 핸들을 수정하고 저장한 뒤, 클라이언트를 완전히 재시작하세요.
📌 참고: 각 도구 호출은 귀하의 Apify 계정으로 비용이 청구되는 실제 Actor 실행입니다 (이 Actor는 결과당 과금 방식입니다). 일회성 조회 시 비용은 1센트의 아주 적은 부분입니다. 만약 정기적으로 수천 개의 라벨을 가져올 계획이라면, 채팅 메시지당 한 번씩 호출하는 대신 Apify API 또는 예약된 작업을 통해 Actor를 직접 실행하세요. "ibuprofen"과 같은 약물 이름은 수십 개의 제품과 일치할 수 있으므로, 특정 라벨이 필요한 경우 maxLabels를 타이트하게 유지하고 productType, route 또는 manufacturer를 활용하여 결과 집합을 좁히십시오.
마무리
이제 귀하는 미국 의약품에 대한 실제 FDA 라벨을 요청 시 대화 도중에 읽을 수 있으며, 임상 또는 제약 검토에 실제로 필요한 주의 사항 (boxed warning), 금기 사항 (contraindication), 성분 및 식별자 상세 정보를 확인할 수 있는 AI 에이전트를 갖추게 되었습니다. 이 패턴은 재사용 가능합니다. 권위 있는 구조화된 데이터 (structured data)를 반환하는 Actor를 선택하고, tools 파라미터를 통해 Apify MCP 서버로 노출한 다음, 에이전트가 언제 호출할지 결정하도록 하면 됩니다.
더 나아가려면:
productType,route, 및manufacturer입력을 사용하여 검색 범위를 좁혀(Narrow queries) 전체 약물군 대신 특정 라벨을 지정할 수 있습니다.- '라벨이 무엇에 대해 경고하는지'에서 '실제로 보고된 것은 무엇인지'로 이동하기 위해 adverse-events Actor를 추가합니다.
- OAuth 설정, 리소스 읽기, 그리고 에이전트가 사전에 구성되지 않은 Actor를 발견할 수 있게 해주는
search-actors/call-actor도구에 대해서는 Apify MCP 서버 문서를 참조하십시오.
본 가이드에서 사용된 Actor: openFDA Drug Labels & Ingredients Scraper.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기