
bckenstler/py-huckleberry-mcp
Developer toolsModel Context Protocol (MCP) server for Huckleberry baby tracking API
Overview
: This is an unofficial, community-built project. It is not sponsored, endorsed, or supported by Huckleberry. Use at your own risk. A Model Context Protocol (MCP) server built with FastMCP that interfaces with the Huckleberry baby tracking API, enabling Claude to help you track your baby's sleep, feeding, diaper changes, and growth measurements through natural conversation. - : List and manage multiple child profiles - : Start, pause, resume, complete, and cancel sleep sessions with automatic history tracking - : Track breastfeeding sessions with side switching - : Record diaper changes with type, amount, color, and consistency details - : Log and retrieve weight, height, and head circumference measurements - Python 3.10 or higher - A Huckleberry account with valid credentials - Claude Desktop application (for integration) - uv package manager (recommended) or pip This server uses the FastMCP framework for rapid MCP server development.
README
Huckleberry MCP Server
Disclaimer: This is an unofficial, community-built project. It is not sponsored, endorsed, or supported by Huckleberry. Use at your own risk.
A Model Context Protocol (MCP) server built with FastMCP that interfaces with the Huckleberry baby tracking API, enabling Claude to help you track your baby’s sleep, feeding, diaper changes, and growth measurements through natural conversation.
Features
- Child Management: List and manage multiple child profiles
- Sleep Tracking: Start, pause, resume, complete, and cancel sleep sessions with automatic history tracking
- Feeding Tracking: Track breastfeeding sessions with side switching
- Diaper Logging: Record diaper changes with type, amount, color, and consistency details
- Growth Tracking: Log and retrieve weight, height, and head circumference measurements
Prerequisites
- Python 3.10 or higher
- A Huckleberry account with valid credentials
- Claude Desktop application (for integration)
uvpackage manager (recommended) orpip
Installation
Using uv (Recommended)
# Clone or navigate to the project directory
cd /path/to/huckleberry-mcp
uv sync
Using pip
cd /path/to/huckleberry-mcp
pip install -e .
Architecture
This server uses the FastMCP framework for rapid MCP server development. FastMCP provides:
- Automatic tool registration via decorators
- Schema generation from type hints and docstrings
- Built-in error handling and protocol compliance
- Support for multiple transport types (STDIO, HTTP)
The server implements 22 tools across 5 categories:
- Child Management (2 tools)
- Sleep Tracking (7 tools)
- Feeding Tracking (8 tools)
- Diaper Tracking (2 tools)
- Growth Tracking (3 tools)
All tools use lazy authentication - credentials are validated on first tool use rather than at server startup.
Authentication Setup
The server requires your Huckleberry credentials to be configured as environment variables.
Claude Desktop Configuration (Recommended)
Add the server to your Claude Desktop configuration file with your credentials:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Linux: ~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"huckleberry": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/huckleberry-mcp",
"run",
"huckleberry-mcp"
],
"env": {
"HUCKLEBERRY_EMAIL": "[email protected]",
"HUCKLEBERRY_PASSWORD": "your-password",
"HUCKLEBERRY_TIMEZONE": "America/New_York"
}
}
}
}
Important:
- Replace
/absolute/path/to/huckleberry-mcpwith the actual absolute path to this project - On macOS, if using Anaconda, specify the full path to
uv:/Users/your-username/anaconda3/bin/uv - Ensure
uvis in your PATH or use the full path to theuvexecutable
Available Tools
Child Management
list_children
List all child profiles with their UID, name, and birth date.
Example: “List my children”
Sleep Tracking
log_sleep
Directly log a completed sleep session without using the timer. Useful for retroactive logging or importing past sleep data.
Parameters:
child_uid(string, required): The child’s unique identifierstart_time(string, required): Sleep start time in ISO format. If no timezone specified (e.g., “2026-01-30T14:30:00”), interpreted as your configured timezone. For UTC, use “2026-01-30T14:30:00Z”.end_time(string, optional): Sleep end time in ISO format (provide this OR duration_minutes). Same timezone handling as start_time.duration_minutes(integer, optional): Sleep duration in minutes (provide this OR end_time)
Timezone Note: Times without timezone info are interpreted using your HUCKLEBERRY_TIMEZONE setting (e.g., “America/New_York”). This ensures times appear correctly in the Huckleberry app.
Example: “Log a sleep session from 2pm to 4pm yesterday”
start_sleep
Begin a sleep tracking session for a child using real-time timer.
Parameters:
child_uid(string, required): The child’s unique identifier
Example: “Start a sleep session for Alice”
pause_sleep
Pause an active sleep tracking session.
Parameters:
child_uid(string, required): The child’s unique identifier
Example: “Pause the sleep session”
resume_sleep
Resume a paused sleep tracking session.
Parameters:
child_uid(string, required): The child’s unique identifier
Example: “Resume the sleep session”
complete_sleep
Complete and save a sleep tracking session.
Parameters:
child_uid(string, required): The child’s unique identifier
Example: “Complete the sleep session”
cancel_sleep
Cancel and discard a sleep tracking session.
Parameters:
child_uid(string, required): The child’s unique identifier
Example: “Cancel the sleep session”
get_sleep_history
Get sleep history for a child within a date range (defaults to last 7 days).
Parameters:
child_uid(string, required): The child’s unique identifierstart_date(string, optional): Start date in ISO format (YYYY-MM-DD), inclusiveend_date(string, optional): End date in ISO format (YYYY-MM-DD), exclusive (data up to but not including this date)
Important: The end_date is exclusive. To get data for a single day (e.g., Jan 30), set start_date='2026-01-30' and end_date='2026-01-31'.
Example: “Show me sleep history for the last week”
Feeding Tracking
log_breastfeeding
Directly log a completed breastfeeding session without using the timer. Useful for retroactive logging or importing past feeding data.
Parameters:
child_uid(string, required): The child’s unique identifierstart_time(string, required): Feeding start time in ISO format. If no timezone specified, interpreted as your configured timezone.left_duration_minutes(integer, optional): Duration on left breast in minutesright_duration_minutes(integer, optional): Duration on right breast in minutesend_time(string, optional): Feeding end time in ISO format (provide this OR durations)last_side(string, optional): Which side finished on (“left” or “right”). Required if using end_time.
Usage patterns:
- With durations: Provide
left_duration_minutesand/orright_duration_minutes - With end time: Provide
end_timeandlast_side(calculates duration automatically)
Timezone Note: Times without timezone info are interpreted using your HUCKLEBERRY_TIMEZONE setting.
Examples:
- “Log a breastfeeding session from 2pm to 2:30pm yesterday on the left”
- “Log breastfeeding: 10 minutes left, 15 minutes right, starting at 3pm today”
start_breastfeeding
Begin a breastfeeding tracking session using real-time timer.
Parameters:
child_uid(string, required): The child’s unique identifierside(string, required): Which side to start on (“left” or “right”)
Example: “Start breastfeeding on the left side”
pause_feeding
Pause an active feeding tracking session.
Parameters:
child_uid(string, required): The child’s unique identifier
Example: “Pause feeding”
resume_feeding
Resume a paused feeding tracking session.
Parameters:
child_uid(string, required): The child’s unique identifier
Example: “Resume feeding”
switch_feeding_side
Switch between left and right breast during breastfeeding.
Parameters:
child_uid(string, required): The child’s unique identifier
Example: “Switch to the other side”
complete_feeding
Complete and save a feeding tracking session.
Parameters:
child_uid(string, required): The child’s unique identifier
Example: “Complete feeding”
cancel_feeding
Cancel and discard a feeding tracking session.
Parameters:
child_uid(string, required): The child’s unique identifier
Example: “Cancel feeding”
get_feeding_history
Get feeding history for a child within a date range (defaults to last 7 days).
Parameters:
child_uid(string, required): The child’s unique identifierstart_date(string, optional): Start date in ISO format (YYYY-MM-DD), inclusiveend_date(string, optional): End date in ISO format (YYYY-MM-DD), exclusive (data up to but not including this date)
Important: The end_date is exclusive. To get data for a single day (e.g., Jan 30), set start_date='2026-01-30' and end_date='2026-01-31'.
Example: “Show me today’s feedings”
Diaper Tracking
log_diaper
Log a diaper change with details. Supports retroactive logging with optional timestamp.
Parameters:
child_uid(string, required): The child’s unique identifiermode(string, optional): Diaper mode (“pee”, “poo”, “both”, “dry”), default: “both”pee_amount(string, optional): Pee amount (“little”, “medium”, “big”)poo_amount(string, optional): Poo amount (“little”, “medium”, “big”)color(string, optional): Poo color if present (“yellow”, “brown”, “black”, “green”, “red”, “gray”)consistency(string, optional): Poo consistency if present (“solid”, “loose”, “runny”, “mucousy”, “hard”, “pebbles”, “diarrhea”)diaper_rash(boolean, optional): Whether baby has diaper rash, default: falsenotes(string, optional): Optional notes about the diaper changetimestamp(string, optional): Timestamp in ISO format for retroactive logging. If not provided, uses current time.
Timezone Note: Times without timezone info are interpreted using your HUCKLEBERRY_TIMEZONE setting.
Examples:
- “Log a diaper change with pee and poo”
- “Log a wet diaper from 2 hours ago” (with retroactive timestamp)
get_diaper_history
Get diaper change history for a child within a date range (defaults to last 7 days).
Parameters:
child_uid(string, required): The child’s unique identifierstart_date(string, optional): Start date in ISO format (YYYY-MM-DD), inclusiveend_date(string, optional): End date in ISO format (YYYY-MM-DD), exclusive (data up to but not including this date)
Important: The end_date is exclusive. To get data for a single day (e.g., Jan 30), set start_date='2026-01-30' and end_date='2026-01-31'.
Example: “Show me today’s diaper changes”
Growth Tracking
log_growth
Log growth measurements (weight, height, head circumference). Supports retroactive logging with optional timestamp.
Parameters:
child_uid(string, required): The child’s unique identifierweight(number, optional): Weight (lbs if imperial, kg if metric)height(number, optional): Height (inches if imperial, cm if metric)head(number, optional): Head circumference (inches if imperial, cm if metric)units(string, optional): Measurement system (“imperial” or “metric”), default: “imperial”timestamp(string, optional): Timestamp in ISO format for retroactive logging. If not provided, uses current time.
Timezone Note: Times without timezone info are interpreted using your HUCKLEBERRY_TIMEZONE setting.
Examples:
- “Log weight of 12.5 lbs and height of 24 inches”
- “Log weight measurement from yesterday’s doctor visit” (with retroactive timestamp)
get_latest_growth
Get the latest growth measurements for a child.
Parameters:
child_uid(string, required): The child’s unique identifier
Example: “What are the latest growth measurements?”
get_growth_history
Get growth measurement history for a child within a date range (defaults to last 30 days).
Parameters:
child_uid(string, required): The child’s unique identifierstart_date(string, optional): Start date in ISO format (YYYY-MM-DD), inclusiveend_date(string, optional): End date in ISO format (YYYY-MM-DD), exclusive (data up to but not including this date)
Important: The end_date is exclusive. To get data for a single day (e.g., Jan 30), set start_date='2026-01-30' and end_date='2026-01-31'.
Example: “Show me growth history for the last month”
Usage Examples
Once configured in Claude Desktop, you can interact with the server through natural conversation:
-
List your children:
- “List my children”
- “Show me all my kids”
-
Track sleep:
- “Log a sleep session from 2pm to 4pm yesterday” (direct logging)
- “Log that Alice slept for 90 minutes starting at 1pm today” (direct logging)
- “Start a sleep session for Alice” (real-time timer)
- “Alice is sleeping”
- “Pause the sleep timer”
- “Alice woke up, complete the sleep session”
- “Show me sleep history for the last week”
-
Track feeding:
- “Log a breastfeeding session from 2pm to 2:30pm on the left” (direct logging)
- “Log breastfeeding: 10 minutes left, 15 minutes right, starting at 3pm” (direct logging)
- “Start breastfeeding on the left side” (real-time timer)
- “Switch to the right breast”
- “Complete the feeding session”
- “Show me today’s feedings”
-
Log diaper changes:
- “Log a diaper change with pee and poo”
- “Log a wet diaper”
- “Log a poopy diaper with loose yellow poo”
- “Log a diaper change with medium poo and diaper rash”
-
Track growth:
- “Log weight of 12.5 lbs”
- “Log weight 12.5 lbs, height 24 inches, and head 16 inches”
- “What are the latest growth measurements?”
- “Show me growth history for the last month”
-
View history:
- “Show me sleep history for last week”
- “How many diaper changes today?”
- “Show me all feedings from yesterday”
Development
Project Structure
src/huckleberry_mcp/
├── server.py # FastMCP server instance and tool registration
├── auth.py # Authentication handling (lazy singleton pattern)
├── utils.py # Shared utilities (ISO timestamp conversion)
└── tools/ # Tool implementations
├── children.py # Child management tools
├── sleep.py # Sleep tracking tools
├── feeding.py # Feeding/breastfeeding tools
├── diaper.py # Diaper logging tools
└── growth.py # Growth measurement tools
Adding New Tools
To add a new tool:
- Add the function to the appropriate module in
tools/ - Decorate with
@mcp.tool() - Add comprehensive docstring (used for schema generation)
- Use type hints for parameter validation
- Register in
server.pyif creating new module
Example:
@mcp.tool()
async def my_new_tool(child_uid: str, data: str) -> Dict[str, Any]:
"""Tool description here.
Args:
child_uid: The child's unique identifier
data: Some data parameter
Returns:
Status message and data
"""
api = await get_authenticated_api()
# Implementation...
return {"success": True, "message": "Done"}
Running Tests
# Run all tests
uv run pytest tests/ -v
# Run specific test file
uv run pytest tests/test_sleep.py -v
# Run with coverage
uv run pytest tests/ --cov=huckleberry_mcp --cov-report=html
Dependencies
fastmcp>=2.0.0,<3.0.0- FastMCP framework for MCP server implementationhuckleberry-api>=0.1.0- Huckleberry API client librarypython-dotenv>=1.0.0- Environment variable management
Implementation Notes
This server is fully refactored to match the actual py-huckleberry-api library interface:
- All history methods use Unix timestamps internally and convert to/from ISO dates
- Timer operations (sleep/feeding) directly call API methods without status pre-checks
- Growth tracking uses
headparameter instead ofhead_circumference - Diaper logging includes amount fields (
pee_amount,poo_amount) and usescolorinstead ofpoo_color - The server starts successfully even with invalid credentials, returning helpful errors when tools are called
Troubleshooting
Authentication Errors
If you see authentication errors when calling tools:
- Verify your credentials are correct in the Claude Desktop config
- Ensure your Huckleberry account is active and you can log in via the app
- Check that the timezone is valid (e.g., “America/New_York”, “Europe/London”)
- The server will start successfully but authentication happens when you call a tool
Server Not Appearing in Claude Desktop
- Verify the configuration file path is correct for your OS
- Check that the
--directorypath is absolute and correct - On macOS with Anaconda, use full path to uv:
/Users/your-username/anaconda3/bin/uv - Restart Claude Desktop after making config changes
- Check the Claude Desktop logs for error messages
- Ensure
uvis installed and accessible
Server Fails to Start
If you see “Failed to spawn process: No such file or directory”:
- The
uvcommand is not found - specify the full path to theuvexecutable - On macOS, find uv with:
which uvor check/Users/your-username/anaconda3/bin/uv - Update the
commandfield in your config to use the absolute path
Tools Not Working
- Make sure you’ve listed children first to get valid child UIDs
- Verify the child UID is correct when using tools
- Timer sessions can be started/stopped without checking status first
- Review error messages for specific validation issues (invalid colors, amounts, etc.)
Security Considerations
- Never commit your
.envfile or credentials to version control - Store credentials only in environment variables or Claude Desktop config
- The
.gitignorefile excludes.envfiles by default - Credentials are never logged by the server
- All API communication uses HTTPS
Contributing
This is a personal project, but suggestions and bug reports are welcome!
License
MIT License - See LICENSE file for details
Acknowledgments
- Built with the Model Context Protocol
- Uses the py-huckleberry-api Python library
- Powered by Claude from Anthropic
Migration History
v0.2.0 - FastMCP Migration (2026-01-31)
Migrated from raw MCP SDK to FastMCP framework:
- Reduced server.py from 442 to 47 lines
- Eliminated manual schema definitions (270+ lines)
- Consolidated duplicated timestamp utilities
- Preserved lazy authentication pattern
- Maintained all existing functionality
All existing tools and features remain unchanged for end users.
Support
For issues with:
- This MCP server: Open an issue in this repository
- The Huckleberry API library: See py-huckleberry-api
- Huckleberry app: Contact Huckleberry support
- Claude Desktop: See Anthropic documentation
Install
This server does not publish a one-line install command.
Open the repository installation guide New to MCP? Start with the mcpskill.org guide →Configuration
{
"mcpServers": {
"huckleberry": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/huckleberry-mcp",
"run",
"huckleberry-mcp"
],
"env": {
"HUCKLEBERRY_EMAIL": "[email protected]",
"HUCKLEBERRY_PASSWORD": "your-password",
"HUCKLEBERRY_TIMEZONE": "America/New_York"
}
}
}
}