INDIAN MEDICINES (MCP SERVER) について
INDIAN MEDICINESは、指定されたデータベースの医薬品情報を検索・分析するMCPサーバーです。名称の完全一致・あいまい検索、成分や価格による絞り込み、成分分析、代替薬の提案に対応します。
主な機能
- 01医薬品名の完全一致・あいまい検索
- 02有効成分による検索
- 03価格、メーカー、処方要件による絞り込み
- 04成分分析と類似薬の比較
- 05代替薬の提案とデータベース統計
活用シーン
- 01正確な名称や誤記から医薬品を探す
- 02成分が似た医薬品の価格を比較する
- 03メーカーや処方要件で記録を絞り込む
MCP 対応
MCPを通じて、医薬品の検索、絞り込み、分析、ユーティリティに関する15のエンドポイントをクライアントに提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
インドの医薬品(MCP SERVER)
医薬品情報の検索、代替品の提案、組成の分析を行う包括的なAPIサーバーです。このサーバーは、ファジーマッチングや価格比較などの高度な機能を備え、医薬品データの検索、絞り込み、分析を行う複数のエンドポイントを提供します。
📖 目次
📋 はじめに
MedicineDB API Serverは、医薬品情報への包括的なアクセスを提供するために設計された高性能ツールです。基本的な医薬品検索から、高度な組成分析や代替医薬品の提案まで、幅広い機能を提供します。このサーバーは、正確で関連性の高い結果を提供しながら、大規模なデータセットを効率的に処理できるように構築されています。
✨ 機能
-
高度な検索機能
- 医薬品名の完全一致およびファジーマッチング
- 組成・成分に基づく検索
- ページネーション付きの複数条件による絞り込み
- 製造元および価格帯による絞り込み
-
分析ツール
- 組成文字列の解析および分析
- データベースの統計分析
- 成分の分類
-
医療上の意思決定支援
- 代替医薬品の提案
- 類似する医薬品間の価格比較
- 処方箋が必要かどうかによる絞り込み
-
パフォーマンスの最適化
- 高速な検索を実現する複数のインデックス
- 効率的な類似度計算
- 抽出済み成分の事前計算
🛠️ 技術スタック
| 技術 | 用途 |
|---|---|
| 中核となるプログラミング言語 | |
| サーバーフレームワーク | |
| データ保存形式 |
ライブラリ:
difflib:ファジーな文字列照合と医薬品名の類似度判定に使用re:組成文字列の解析と成分の抽出に使用collections:最適化されたデータ構造(defaultdict、Counter)に使用math:価格の分類とページネーションの計算に使用typing:型ヒントに使用dataclasses:構造化データに使用
🚀 インストール
- リポジトリをクローンします:
git clone https://github.com/yourusername/medicines-db.git
cd medicines-db
- 依存関係をインストールします:
pip install -r requirements.txt
- 医薬品データベースを準備します:
# Ensure your JSON data file is at the correct path
# Default path: /Users/siddharthbajpai/Downloads/MCP_SERVER/medicines.json
# Update DATA_PATH in the code if needed
- サーバーを実行します:
python medicines_server.py
📘 使い方
このサーバーは、MCP(Model Context Protocol)アーキテクチャを通じて複数のAPIエンドポイントを公開します。任意のMCPクライアントを使用してサーバーとやり取りできます。
基本的な例:
from mcp.client import MCPClient
# Connect to the server
client = MCPClient("medicines-db")
# Search for a medicine
result = client.search_medicines("paracetamol", max_results=5)
print(result)
# Get alternatives to a specific medicine
alternatives = client.suggest_alternatives("Dolo 650")
print(alternatives)
📚 API リファレンス
このサーバーは、MCPフレームワークを通じて15個のAPIエンドポイントを提供します:
検索エンドポイント
1. get_medicine_by_name
GET /get_medicine_by_name
正確なNameに基づいて医薬品レコードを取得します。より安価な代替品も任意で含められます。
パラメーター:
name(文字列、必須):医薬品のNameフィールドと完全に一致する値include_alternatives(ブール値、任意、デフォルト=true):より安価な代替品を結果に含めるかどうか
レスポンス:
{
"medicine": {
"Name": "Dolo 650",
"Manufacturer": "Micro Labs Ltd",
"Composition": "Paracetamol (650mg)",
"MRP": "30.29",
"Prescription": "No",
"Price_INR": "₹30.29",
"Price_Category": "Low",
"Active_Ingredients": ["Paracetamol"],
"Ingredient_Count": 1,
"Is_Combination": false,
"Requires_Prescription": false,
"Prescription_Type": "Over-the-Counter"
},
"cheaper_alternatives": [
{
"medicine": {...},
"price_savings": "₹10.30",
"savings_percentage": "34.0%",
"similarity_score": "1.00"
}
]
}
2. search_medicines
GET /search_medicines
すべての医薬品フィールドを対象とした全文検索です。
パラメーター:
query(文字列、必須):検索する部分文字列(大文字と小文字を区別しません)max_results(整数、任意、デフォルト=10):返す一致レコードの最大数
レスポンス:
[
{
"Name": "Dolo 650",
"Manufacturer": "Micro Labs Ltd",
"Composition": "Paracetamol (650mg)",
"MRP": "30.29",
"Price_INR": "₹30.29",
...
},
...
]
3. fuzzy_search_by_name
GET /fuzzy_search_by_name
ファジーマッチングを使用して、指定した部分的な名前に類似する名前の医薬品を検索します。
パラメーター:
partial_name(文字列、必須):検索する医薬品名の一部、または誤記された医薬品名similarity_threshold(数値、任意、デフォルト=0.6):結果に含める最低類似度スコア(0.0~1.0)max_results(整数、任意、デフォルト=10):返す一致レコードの最大数
レスポンス:
[
{
"similarity_score": "0.92",
"medicine": {
"Name": "Dolo 650",
...
}
},
...
]
4. search_by_composition
GET /search_by_composition
特定の有効成分を含む医薬品を検索します。
パラメーター:
ingredient(文字列、必須):検索する有効成分の名前max_results(整数、任意、デフォルト=10):返す一致レコードの最大数
レスポンス:
[
{
"Name": "Dolo 650",
"Composition": "Paracetamol (650mg)",
...
},
...
]
フィルターエンドポイント
5. filter_by_price_range
GET /filter_by_price_range
価格帯で医薬品を絞り込みます。
パラメーター:
min_price(数値、任意、デフォルト=0):最低価格(INR)max_price(数値、任意、デフォルト=null):最高価格(INR)max_results(整数、任意、デフォルト=20):返す一致レコードの最大数
レスポンス:
[
{
"Name": "Crocin Pain Relief",
"MRP": "49.43",
"Price_INR": "₹49.43",
...
},
...
]
6. filter_by_manufacturer
GET /filter_by_manufacturer
製造元で医薬品を絞り込みます。
パラメーター:
manufacturer(文字列、必須):製造元の正式名称またはその一部max_results(整数、任意、デフォルト=20):返す一致レコードの最大数
レスポンス:
[
{
"Name": "Dolo 650",
"Manufacturer": "Micro Labs Ltd",
...
},
...
]
7. filter_by_prescription_requirement
GET /filter_by_prescription_requirement
処方箋の要否で医薬品を絞り込みます。
パラメーター:
prescription_required(ブール値、必須):処方薬の場合はTrue、市販薬の場合はFalsemax_results(整数、任意、デフォルト=20):返す一致レコードの最大数
レスポンス:
[
{
"Name": "Dolo 650",
"Prescription": "No",
"Requires_Prescription": false,
"Prescription_Type": "Over-the-Counter",
...
},
...
]
8. paginated_search
GET /paginated_search
ページネーションと複数のフィルターを使用した高度な検索です。
パラメーター:
query(文字列、任意、デフォルト=""):一般的な検索語(すべてのフィールドを検索)page(整数、任意、デフォルト=1):ページ番号(1から開始)page_size(整数、任意、デフォルト=10):1ページあたりの結果数manufacturer(文字列、任意、デフォルト=""):製造元で絞り込み(正式名称またはその一部)min_price(数値、任意、デフォルト=0):最低価格のフィルターmax_price(数値、任意、デフォルト=null):最高価格のフィルターprescription_required(ブール値またはnull、任意、デフォルト=null):処方箋の要否で絞り込み(任意の場合はnull)ingredient(文字列、任意、デフォルト=""):有効成分で絞り込み
レスポンス:
{
"meta": {
"total_results": 150,
"page": 1,
"page_size": 10,
"total_pages": 15
},
"results": [
{
"Name": "Dolo 650",
...
},
...
]
}
分析エンドポイント
9. find_similar_medicines
GET /find_similar_medicines
指定した医薬品と組成が類似する医薬品を検索します。
パラメーター:
medicine_name(文字列、必須):参照する医薬品の名前max_results(整数、任意、デフォルト=5):返す類似医薬品の最大数
レスポンス:
{
"reference_medicine": {
"Name": "Dolo 650",
...
},
"similar_medicines": [
{
"similarity_score": "1.00",
"medicine": {
"Name": "Crocin Pain Relief",
...
}
},
...
]
}
10. analyze_composition
GET /analyze_composition
医薬品の組成文字列を分析し、成分を抽出して構造化します。
パラメーター:
composition(文字列、必須):組成文字列(例:"Ambroxol (30mg/5ml) + Levosalbutamol (1mg/5ml)")
レスポンス:
{
"raw_composition": "Ambroxol (30mg/5ml) + Levosalbutamol (1mg/5ml)",
"ingredients": [
{
"raw_text": "Ambroxol (30mg/5ml)",
"name": "Ambroxol",
"dosage": "30mg/5ml",
"dosage_value": "30",
"dosage_unit": "mg"
},
{
"raw_text": "Levosalbutamol (1mg/5ml)",
"name": "Levosalbutamol",
"dosage": "1mg/5ml",
"dosage_value": "1",
"dosage_unit": "mg"
}
],
"medicines_with_this_composition": [
{
"Name": "Ascoril LS Syrup",
...
},
...
]
}
11. count_medicines_by_composition
GET /count_medicines_by_composition
特定の組成を持つ、または特定の成分を含む医薬品をすべて数え、一覧表示します。
パラメーター:
composition(文字列、必須):検索する組成または成分exact_match(ブール値、任意、デフォルト=false):Trueの場合、組成が完全に一致する医薬品のみを検索します。Falseの場合、この成分を含む医薬品を検索します。
レスポンス:
{
"query": "Paracetamol",
"exact_match": false,
"total_medicines_found": 500,
"total_manufacturers": 25,
"price_statistics": {
"min_price": "₹10.50",
"max_price": "₹150.75",
"avg_price": "₹45.30",
"total_medicines_with_price": 490
},
"medicines": [...],
"by_manufacturer": {
"Cipla": {
"count": 50,
"medicines": [...]
},
...
}
}
12. categorize_medicines
GET /categorize_medicines
有効成分に基づいて医薬品を分類し、最も一般的なカテゴリーを返します。
パラメーター:
max_categories(整数、任意、デフォルト=10):返すカテゴリーの最大数
レスポンス:
[
{
"category": "Paracetamol",
"medicine_count": 500,
"example_medicines": [...]
},
{
"category": "Amoxicillin",
"medicine_count": 300,
"example_medicines": [...]
},
...
]
ユーティリティエンドポイント
13. get_medicine_statistics
GET /get_medicine_statistics
医薬品データベースの統計概要を取得します。
パラメーター: なし
レスポンス:
{
"total_medicines": 15000,
"prescription_count": 7500,
"otc_count": 7000,
"unknown_prescription_status": 500,
"manufacturer_counts": {
"Sun Pharma": 1200,
"Cipla": 900,
...
},
"price_distribution": {
"min_price": "₹1.50",
"max_price": "₹2500.00",
"avg_price": "₹125.45",
"price_ranges": {
"₹0 - ₹99.99": 5000,
"₹100 - ₹199.99": 4000,
...
}
},
"common_ingredients": {
"Paracetamol": 500,
"Amoxicillin": 300,
...
}
}
14. get_all_manufacturers
GET /get_all_manufacturers
データベース内のすべての製造元の一覧を取得します。
パラメーター: なし
レスポンス:
[
{
"name": "Sun Pharma",
"medicine_count": 1200
},
{
"name": "Cipla",
"medicine_count": 900
},
...
]
15. suggest_alternatives
GET /suggest_alternatives
成分の類似性と価格に基づいて、代替医薬品を提案します。
パラメーター:
medicine_name(string, required):基準となる医薬品の名前max_suggestions(integer, optional, default=5):提案する代替品の最大数
レスポンス:
{
"reference_medicine": {
"Name": "Dolo 650",
"MRP": "30.29",
...
},
"alternatives": [
{
"medicine": {
"Name": "Calpol 650",
"MRP": "26.50",
...
},
"ingredient_similarity": 1.0,
"price_difference_percentage": -12.5,
"price_comparison": "cheaper",
"absolute_price_difference": 3.79
},
...
]
}
📊 データ構造
システムでは、以下の構造を持つ医薬品オブジェクトの JSON 配列を想定しています。
[
{
"Name": "Medicine Name",
"Manufacturer": "Company Name",
"Composition": "Ingredient1 (10mg) + Ingredient2 (20mg)",
"MRP": "123.45",
"Prescription": "Yes"
},
...
]
システムは、このデータに以下の計算フィールドを追加します。
Price_INR:通貨記号付きの書式設定済み価格Price_Category:低・中・高・プレミアムの分類Active_Ingredients:抽出された成分の一覧Ingredient_Count:有効成分の数Is_Combination:医薬品に複数の成分が含まれているかどうかRequires_Prescription:処方箋が必要かどうかを示すブール値Prescription_Type:処方箋の要否を人が読みやすい形式で示したもの
⚡ パフォーマンスの最適化
サーバーでは、いくつかの最適化を実装しています。
-
高速な検索のための複数のインデックス:
- 名前インデックス
- 製造元インデックス
- 組成インデックス
- 価格インデックス
- 処方箋インデックス
-
繰り返しの解析を避けるため、成分の抽出は起動時に一度だけ行います。
-
類似度の計算には、効率的なアルゴリズムを使用します。
- 文字列の類似度には SequenceMatcher
- 成分の類似度にはジャッカード指数
-
範囲検索を高速化するための価格の分類
🤝 コントリビューション
コントリビューションを歓迎します。以下の方法でご協力いただけます。
- リポジトリをフォークします
- 機能ブランチを作成します(
git checkout -b feature/amazing-feature) - 変更をコミットします(
git commit -m 'Add some amazing feature') - ブランチにプッシュします(
git push origin feature/amazing-feature) - プルリクエストを作成します
適宜、テストも更新してください。
📄 ライセンス
このプロジェクトは MIT License の下でライセンスされています。詳細は LICENSE ファイルをご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。