usage_examples.py•8.55 kB
"""
台灣FDA藥品查詢MCP服務器使用示例
本文件展示了如何使用台灣FDA藥品查詢MCP服務器的各項功能
"""
import asyncio
import json
from typing import List, Dict
from fastmcp import Client
import tempfile
import os
async def basic_search_example():
"""基本查詢示例:搜索阿斯匹林"""
print("=== 基本查詢示例:搜索阿斯匹林 ===\n")
# 這個示例需要與實際的MCP服務器配合使用
# 實際使用時需要先獲取驗證碼
# 步驟1: 獲取驗證碼
print("步驟1: 獲取驗證碼")
print("需要先調用 get_captcha_image 工具獲取驗證碼圖片")
print("並手動識別圖片中的4位數字\n")
# 步驟2: 查詢藥品
print("步驟2: 查詢藥品")
search_query = {
"english_name": "aspirin",
"captcha": "1234" # 這裡需要替換為實際識別的驗證碼
}
print(f"查詢參數: {json.dumps(search_query, ensure_ascii=False, indent=2)}\n")
# 步驟3: 下載仿單
print("步驟3: 下載仿單(如果查詢成功並獲得GUID)")
print("需要從查詢結果中提取GUID,然後調用download_insert工具\n")
async def advanced_search_example():
"""進階查詢示例"""
print("=== 進階查詢示例 ===\n")
# 進階查詢示例:組合多個條件
advanced_query = {
"license_no": "", # 許可證號(可選)
"cname": "", # 中文品名(可選)
"ename": "metformin", # 英文品名
"agent_name": "默沙東", # 申請商名稱(可選)
"ingredient": "", # 有效成分(可選)
"captcha": "5678" # 驗證碼
}
print("進階查詢參數:")
print(json.dumps(advanced_query, ensure_ascii=False, indent=2))
print("\n此查詢會搜索英文品名包含'metformin'且申請商為'默沙東'的藥品\n")
async def batch_download_example():
"""批量下載示例"""
print("=== 批量下載示例 ===\n")
# 假設從多次查詢中獲得了多個GUID
guids = [
"guid1-abc123-def456",
"guid2-xyz789-uvw012",
"guid3-mno345-pqr678"
]
# 批量下載參數
batch_params = {
"guids": guids,
"output_dir": "/tmp/drug_inserts"
}
print("批量下載參數:")
print(json.dumps(batch_params, ensure_ascii=False, indent=2))
print(f"\n將下載 {len(guids)} 個仿單到 {batch_params['output_dir']}\n")
async def complete_workflow_example():
"""完整工作流程示例"""
print("=== 完整工作流程示例 ===\n")
# 模擬完整的工作流程
workflow_steps = [
"1. 調用 get_captcha_image() 獲取驗證碼",
"2. 人工識別驗證碼圖片中的數字",
"3. 調用 search_drugs_by_english_name() 進行查詢",
"4. 從查詢結果中提取GUID",
"5. 調用 download_insert() 下載仿單",
"6. (可選)批量下載更多仿單"
]
print("完整工作流程:")
for step in workflow_steps:
print(f" {step}")
print("\n示例代碼序列:")
print("""
# 1. 獲取驗證碼
captcha_result = await client.call_tool("get_captcha_image", {})
# 2. 查詢藥品(假設驗證碼為"4321")
search_result = await client.call_tool("search_drugs_by_english_name", {
"english_name": "aspirin",
"captcha": "4321"
})
# 3. 從結果中提取GUID並下載
# (需要根據實際返回格式解析GUID)
guid = "extracted_guid_from_search_results"
download_result = await client.call_tool("download_insert", {
"guid": guid,
"output_path": "/tmp/aspirin_insert.pdf"
})
""")
async def error_handling_example():
"""錯誤處理示例"""
print("=== 錯誤處理示例 ===\n")
# 常見錯誤情況和解決方案
error_scenarios = [
{
"錯誤": "驗證碼格式錯誤",
"輸入": {"captcha": "12"}, # 少於4位
"錯誤訊息": "驗證碼必須是4位數字",
"解決": "重新獲取驗證碼並輸入完整的4位數字"
},
{
"錯誤": "英文品名為空",
"輸入": {"english_name": "", "captcha": "1234"},
"錯誤訊息": "英文品名不能為空",
"解決": "提供有效的英文品名關鍵字"
},
{
"錯誤": "查無結果",
"輸入": {"english_name": "nonexistent_drug", "captcha": "1234"},
"錯誤訊息": "未找到符合條件的藥品資訊",
"解決": "檢查英文品名是否正確,嘗試使用更常見的藥品名稱"
},
{
"錯誤": "GUID無效",
"輸入": {"guid": "invalid_guid", "output_path": "/tmp/test.pdf"},
"錯誤訊息": "下載仿單時發生錯誤",
"解決": "檢查GUID是否從查詢結果中正確提取"
}
]
for i, scenario in enumerate(error_scenarios, 1):
print(f"{i}. {scenario['錯誤']}")
print(f" 輸入: {json.dumps(scenario['輸入'], ensure_ascii=False)}")
print(f" 錯誤: {scenario['錯誤訊息']}")
print(f" 解決: {scenario['解決']}\n")
async def best_practices_example():
"""最佳實踐示例"""
print("=== 最佳實踐 ===\n")
best_practices = [
{
"類別": "驗證碼處理",
"建議": [
"每次查詢前都重新獲取驗證碼",
"仔細識別驗證碼,避免輸入錯誤",
"如果驗證碼不清楚,使用重新獲取功能"
]
},
{
"類別": "查詢優化",
"建議": [
"使用常見的英文藥品名稱進行查詢",
"對於中成藥,可以嘗試中文品名查詢",
"組合多個查詢條件提高精確度"
]
},
{
"類別": "批量處理",
"建議": [
"大量查詢時使用進階查詢功能",
"批量下載時設置適當的延遲",
"為批量操作準備足夠的磁盤空間"
]
},
{
"類別": "錯誤恢復",
"建議": [
"實現重試機制處理網路錯誤",
"保存查詢結果避免重複查詢",
"為關鍵操作實現備份方案"
]
}
]
for practice in best_practices:
print(f"【{practice['類別']}】")
for suggestion in practice['建議']:
print(f" • {suggestion}")
print()
async def performance_tips():
"""性能優化建議"""
print("=== 性能優化建議 ===\n")
tips = [
"1. 查詢策略",
" • 使用精確的查詢條件減少返回結果",
" • 優先使用英文品名進行查詢(通常更準確)",
" • 避免過於寬泛的關鍵字",
"",
"2. 批量操作",
" • 集中處理相似的查詢請求",
" • 合理設置批量下載的間隔時間",
" • 監控磁盤使用情況",
"",
"3. 錯誤處理",
" • 實現智能重試機制",
" • 分類處理不同類型的錯誤",
" • 記錄失敗的操作用於後續分析",
"",
"4. 資源管理",
" • 及時清理臨時文件",
" • 避免同時進行過多的並發操作",
" • 合理使用緩存減少重複查詢"
]
for tip in tips:
print(tip)
print()
def main():
"""主函數:運行所有示例"""
print("台灣FDA藥品查詢MCP服務器 - 使用示例\n")
print("=" * 50)
# 運行異步示例
async def run_examples():
await basic_search_example()
await advanced_search_example()
await batch_download_example()
await complete_workflow_example()
await error_handling_example()
await best_practices_example()
await performance_tips()
# 運行示例
asyncio.run(run_examples())
print("=" * 50)
print("示例展示完畢!")
print("\n注意:這些是概念性示例,實際使用時需要:")
print("1. 與MCP服務器建立連接")
print("2. 替換示例中的參數值")
print("3. 處理實際的返回結果")
if __name__ == "__main__":
main()