This project is currently in development and is not ready for production. The purpose is to document possibly sensitive medical information and provide a platform for analysis. There should be absolutely NO assumption of data privacy or security in this demonstration. Advice or instructions given by the server or the LLM should be taken with a grain of salt. This application demo and proof of concept is not intended for medical use and should not be used as a substitute for professional medical advice.
A FastMCP server for recording symptoms and related environmental/body information, storing it in Elasticsearch, and integrating with Claude Desktop for intelligent data entry and retrieval.
Now more than ever, people are empowering themselves with tools to better understand their health and well-being. With the rise of AI and machine learning, we can use these tools to better understand our individual health through data collection and analysis.
Sickness and wellness are complex, and we can't always know what the big picture is. By recording and analyzing our symptoms and related information, we can better understand our health and make informed decisions about our care. We all know at least three people who have a "silent" condition that may not have an outward appearance, but may be causing them significant discomfort, pain, or disability. By creating and maintaining a record of their physical experience, we hope to provide documentation and support for their care.
- Review-Confirm-Save Pattern: Validate entries before saving
- Multi-Model LLM Jury: Quality assurance using multiple Claude models
- Flexible Search: Date ranges, symptoms, medications, semantic notes search
- Follow-up Tracking: Track incomplete symptoms and gather updates
- Elasticsearch Storage: Powerful querying and data persistence
- Claude Desktop Integration: Natural language symptom entry
- Docker and Docker Compose installed
- Anthropic API key
- Elasticsearch instance (or use included local setup)
Copy the example environment file and configure your credentials:
cp .env.example .envEdit .env and set your credentials (no spaces around =):
# Required
ANTHROPIC_API_KEY=your-anthropic-api-key-here
ES_ENDPOINT=https://your-elasticsearch-endpoint:443
ES_API_KEY=your-elasticsearch-api-key-here
# Optional (defaults provided)
ES_INDEX=symptom_entries
JURY_SUMMARY_INDEX=event_summaries
JURY_COUNTER_INDEX=jury_counter
JURY_MODE=every_1For local Elasticsearch (no cloud):
ANTHROPIC_API_KEY=your-anthropic-api-key-here
ES_ENDPOINT=http://elasticsearch:9200
# Leave ES_API_KEY empty for local setup
ES_INDEX=symptom_entries# Start Elasticsearch and SymptomMinder
docker-compose up -d
# View logs
docker-compose logs -f symptom-minder
# Stop services
docker-compose down
# Reset all data (removes Elasticsearch volumes)
docker-compose down -vAccess Points:
- Elasticsearch:
http://localhost:9200 - Health check:
curl http://localhost:9200/_cluster/health
Add the following to your Claude Desktop MCP settings file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Configuration:
{
"mcpServers": {
"symptom-minder": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--env-file",
"/absolute/path/to/SymptomMinder/.env",
"symptom-minder"
]
}
}
}Important: Replace /absolute/path/to/SymptomMinder/ with the actual path to your SymptomMinder directory.
Find your absolute path:
# macOS/Linux
cd /path/to/SymptomMinder
pwd
# Windows (PowerShell)
cd C:\path\to\SymptomMinder
(Get-Location).PathAfter adding the configuration:
- Quit Claude Desktop completely
- Restart Claude Desktop
- Look for the π¨ hammer icon indicating MCP servers are connected
- Start using SymptomMinder by describing your symptoms naturally!
# Build the Docker image first
docker build -t symptom-minder .
# Run in interactive mode for testing
docker run -i --rm --env-file .env symptom-minderIf you want to test without Docker:
# Install dependencies
pip install -r requirements.txt
# Run development server with inspector
fastmcp dev server.pyThe inspector will start on http://localhost:6274 with an auth link in the terminal output.
review_symptom_entry: Reviews a symptom entry before saving, generates human-readable summaryconfirm_and_save_symptom_entry: Saves confirmed entry to Elasticsearch, triggers jury review
flexible_search: Flexible search with filters (date range, symptom, medications, notes)- Use simple key-value pairs:
{"start_time": "2025-08-01", "end_time": "2025-08-31"} - NOT raw Elasticsearch queries
- Use simple key-value pairs:
get_incomplete_symptoms: Find symptoms marked as incomplete for follow-upupdate_symptom_entry: Update existing entries with resolution notes
list_symptom_entries: Retrieves recent symptom entries (default: 20)
symptom_followup_guidance: Guides Claude on natural follow-up behavior
# Generate gluten intolerance symptom dataset
python data/generate_gluten_symptoms.py
# Load demo data into Elasticsearch
python data/reset_and_load_gluten_data.pyThis creates a realistic 3-month dataset showing gradual discovery of gluten intolerance through weekly symptom patterns.
# Clear all data and reset counters
python data/reset_and_load_gluten_data.py
# Or with Docker Compose
docker-compose down -v # Removes all Elasticsearch data
docker-compose up -d- User Input β Claude Desktop natural language
- Review Phase β
review_symptom_entrygenerates summary - User Confirmation β Validates entry accuracy
- Save Phase β
confirm_and_save_symptom_entrysaves to Elasticsearch - Jury Review (conditional) β Multi-model LLM validation
- Query/Retrieval β
flexible_searchor resource access - Follow-up (optional) β Track incomplete symptoms over time
server.py: FastMCP server with tool/resource definitionssymptom_schema.py: Pydantic models for data validationjury_tools.py: Multi-model LLM quality assurance systemtools/: Tool implementations (search, update, entry)resources/: Resource implementations (list entries)utils/: Shared utilities (ES client, data cleaning)
The LLM jury validates structured entries against raw notes using 3 Claude models in parallel:
claude-3-5-sonnet-latestclaude-3-7-sonnet-latestclaude-sonnet-4-20250514
Trigger frequency configured via JURY_MODE (e.g., every_5 = runs on entries 5, 10, 15...).
Record a symptom:
"I have a severe headache that started 2 hours ago. I took Advil but it hasn't helped yet."
Search symptoms:
"Show me all my headaches from last month"
Update a symptom:
"That headache from earlier resolved after I drank more water"
Find patterns:
"Are there any patterns in my symptoms related to what I eat?"
Container won't start:
# Check logs
docker-compose logs symptom-minder
# Verify .env file is loaded
docker run -i --rm --env-file .env symptom-minder python -c "import os; print('ES_ENDPOINT:', os.environ.get('ES_ENDPOINT'))"Elasticsearch connection fails:
- Verify
ES_ENDPOINTandES_API_KEYin.env - Check Elasticsearch is running:
curl $ES_ENDPOINT - For local ES, ensure no
ES_API_KEYis set
MCP server not appearing:
- Verify JSON syntax in
claude_desktop_config.json - Use absolute paths (not relative like
./) - Restart Claude Desktop completely
- Check Docker image exists:
docker images | grep symptom-minder
Authentication errors:
- Ensure
.envfile has correct credentials - Check
--env-filepath is absolute in config - Verify API keys are valid (no
< >placeholders)
| Variable | Required | Default | Description |
|---|---|---|---|
ANTHROPIC_API_KEY |
Yes | - | Your Anthropic API key |
ES_ENDPOINT |
Yes | http://localhost:9200 |
Elasticsearch endpoint URL |
ES_API_KEY |
No | - | Elasticsearch API key (omit for local) |
ES_INDEX |
No | symptom_entries |
Main symptom entries index |
JURY_SUMMARY_INDEX |
No | event_summaries |
Jury review summaries index |
JURY_COUNTER_INDEX |
No | jury_counter |
Jury trigger counter index |
JURY_MODE |
No | every_1 |
Jury trigger: none, every_1, every_5, etc. |
This is a demonstration project with NO security guarantees.
- Data privacy is not enforced
- Do not store real protected health information (PHI)
- Not HIPAA compliant
- Not intended for medical diagnosis or treatment
- Always consult healthcare professionals for medical advice
For detailed development information, see CLAUDE.md.
- Python 3.12+
- Docker & Docker Compose
- Elasticsearch 8.x+
- Anthropic API access
fastmcp>=2.0.0- FastMCP frameworkelasticsearch>=9.1.0- Async Elasticsearch clientanthropic>=0.61.0- Anthropic APIpydantic- Data validation
This is a demonstration project. Use at your own risk.
This is a personal demonstration project. Feel free to fork and adapt for your own use.