A Python library and self-hosted MCP server that exposes Eka.care's healthcare APIs to LLM applications. Use it as an importable library in your own projects, or run it directly as a standalone MCP server.
- Developer Guides - Comprehensive guides for developers
- Architecture & Setup (CLAUDE.md)
- Logging Guide (LOGGING.md)
- Testing Guide (TESTING_GUIDE.md)
- Tool Selection Guide (TOOL_SELECTION_GUIDE.md)
- Importable Library: Use services and clients directly in your Python applications
- Self-Hosted MCP Server: Run as stdio or HTTP for Claude Desktop and other MCP clients
- Modular Architecture: Easy to extend with additional API modules
- Simple Authentication: Client ID/Secret + optional API key authentication
- Comprehensive Error Handling: Direct forwarding of Eka.care API errors for transparency
- LLM-Optimized Responses: Structured data formats optimized for LLM consumption
- Multi-Tenant Workspace Routing: Route requests to different client implementations
- Appointment Management: Create, update, and retrieve appointments
- Digital Prescriptions: Generate and manage digital prescriptions
- Patient Records: Access and manage patient medical records
- Prescription History: Retrieve patient prescription history
You can easily add more API modules like:
- ABDM Connector: Health ID creation, consent management, health record sharing
- Self Assessment: Health surveys, symptom checking, record analysis
- Custom Modules: Build your own using the base client architecture
# Latest from main
pip install git+https://github.com/eka-care/eka-mcp-sdk.git@main
# Or pin to a specific release tag
pip install git+https://github.com/eka-care/eka-mcp-sdk.git@v0.1.0With uv:
uv add "eka-mcp-sdk @ git+https://github.com/eka-care/eka-mcp-sdk.git@main"git clone https://github.com/eka-care/eka-mcp-sdk.git
cd eka-mcp-sdk
# Install with UV (recommended)
uv sync
# Or with pip
pip install -e .Create a .env file:
# API Configuration
EKA_API_BASE_URL=https://api.eka.care
# Authentication (get from ekaconnect@eka.care)
EKA_CLIENT_ID=your_client_id
EKA_CLIENT_SECRET=your_client_secret
EKA_API_KEY=your_api_key # Optional
# Server configuration
EKA_MCP_SERVER_HOST=localhost
EKA_MCP_SERVER_PORT=8000
EKA_LOG_LEVEL=INFOfrom eka_mcp_sdk.services import PatientService, AppointmentService
from eka_mcp_sdk.clients.eka_emr_client import EkaEMRClient
client = EkaEMRClient()
patient_service = PatientService(client)
result = await patient_service.search_patients("john")For sync contexts (e.g. CrewAI):
from eka_mcp_sdk.lib import search_patients_sync, get_appointments_enriched_sync
patients = search_patients_sync("john", limit=10)source .venv/bin/activate # On macOS/Linux
# stdio (for Claude Desktop)
eka-mcp-server
# HTTP mode
eka-mcp-server --transport http --host 0.0.0.0 --port 8000
# Or alternatively
python -m eka_mcp_sdk.serverAdd to your Claude Desktop MCP configuration. Important: Use the full path to the virtual environment's Python executable:
{
"mcpServers": {
"eka-care": {
"command": "/absolute/path/to/eka-mcp-sdk/.venv/bin/python",
"args": ["-m", "eka_mcp_sdk.server"],
"env": {
"EKA_CLIENT_ID": "your_client_id",
"EKA_CLIENT_SECRET": "your_client_secret",
"EKA_API_KEY": "your_api_key"
}
}
}
}If you installed the package globally or added the virtual environment to your PATH:
{
"mcpServers": {
"eka-care": {
"command": "eka-mcp-server",
"env": {
"EKA_CLIENT_ID": "your_client_id",
"EKA_CLIENT_SECRET": "your_client_secret",
"EKA_API_KEY": "your_api_key"
}
}
}
}# Create an appointment
create_appointment(
doctor_id="doc-456",
patient_id="patient-789",
appointment_date="2024-01-15",
appointment_time="10:30",
appointment_type="consultation"
)
# Generate a prescription
generate_prescription(
patient_id="patient-789",
doctor_id="doc-456",
medications=[
{
"name": "Amoxicillin",
"dosage": "500mg",
"frequency": "3 times daily",
"duration": "7 days"
}
],
diagnosis="Upper respiratory infection",
instructions="Take with food. Complete the full course."
)
# Get patient records
get_patient_records(
patient_id="patient-789",
record_type="lab_reports"
)This SDK supports multi-tenant workspace routing where different clients (Eka, Moolchand, etc.) can use the same tools with their own API implementations.
Tools (client-agnostic) → Services → Client (all orchestration + API calls)
↑
ClientFactory.create_client(workspace_id)
1. Implement BaseEMRClient:
# eka_mcp_sdk/clients/moolchand_client.py
from .base_emr_client import BaseEMRClient
class MoolchandClient(BaseEMRClient):
def get_workspace_name(self) -> str:
return "moolchand"
# Implement all abstract methods with your API logic
async def doctor_availability_elicitation(self, ...): ...
async def book_appointment_with_validation(self, ...): ...2. Configure via environment:
# Map workspace IDs to client classes (JSON format)
WORKSPACE_CLIENT_DICT={"moolchand": "eka_mcp_sdk.clients.moolchand_client.MoolchandClient"}
# Default workspace when no header present
EKA_WORKSPACE_CLIENT_TYPE=ekaemr3. Workspace routing happens automatically via x-eka-jwt-payload header containing w-id.
git clone https://github.com/eka-care/eka-mcp-sdk.git
cd eka-mcp-sdk
# Install with development dependencies
uv sync --extra dev
# Run tests
uv run pytest
# Format code
uv run black .
uv run isort .
# Type checking
uv run mypy .- Create client in
eka_mcp_sdk/clients/ - Implement MCP tools in
eka_mcp_sdk/tools/ - Register tools in
server.py - Update documentation
python examples/direct_usage.py
python examples/crewai_usage.py # Requires: uv add crewai
cat examples/MCP_USAGE.md| Environment Variable | Description | Default |
|---|---|---|
EKA_API_BASE_URL |
Eka.care API base URL | https://api.eka.care |
EKA_CLIENT_ID |
Client ID from Eka.care | Required |
EKA_CLIENT_SECRET |
Client secret from Eka.care | Required |
EKA_API_KEY |
API key for additional auth | Optional |
EKA_MCP_SERVER_HOST |
MCP server host | localhost |
EKA_MCP_SERVER_PORT |
MCP server port | 8000 |
EKA_LOG_LEVEL |
Logging level | INFO |
Git tag versioning (hatch-vcs)
- Tags must follow PEP 440:
v0.2.0a1,v0.2.0rc1,v0.2.0.dev1— notv0.1.0-test - If an invalid tag exists alongside a valid one on the same commit,
setuptools_scmmay pick the invalid one → delete the bad tag:git push origin --delete <bad-tag> - After fixing tags, clear uv's build cache:
uv cache clean
- Documentation: developer.eka.care
- Email: ekaconnect@eka.care
- Issues: GitHub Issues
MIT License - see LICENSE file for details.