Vitamin D synthesis calculator: sun position, UV, IU/min, time to dose, sunburn risk, daily window.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Calculate vitamin D synthesis at a given location and time. Returns sun position, UV index, IU/min, minutes to reach the target dose, MED (sunburn threshold), the peak window, and optional 15-min day / monthly year curves. UV index uses a live satellite-driven forecast where available, with a clear-sky fallback.
Latitude in degrees.
Longitude in degrees.
Age in years (used for the age factor).
Include 15-min samples through the local day.
Exposed body fraction. 0.10 face+hands, 0.25 arms+face, 0.40 t-shirt+shorts, 0.85 near-full body.
ISO 8601 timestamp or epoch ms. Defaults to now.
Fitzpatrick skin type 1–6. Use describe_skin_types if unknown.
Include monthly solar-noon samples with cloud climatology.
Scalp coverage. "bald" adds ~3.5% BSA.
Daily vitamin D target in IU.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Calculate vitamin D synthesis at a given location and time. Returns sun position, UV index, IU/min, minutes to reach the target dose, MED (sunburn threshold), the peak window, and optional 15-min day / monthly year curves. UV index uses a live satellite-driven forecast where available, with a clear-sky fallback.
| Argument | Type | Description |
|---|---|---|
| age | integer | Age in years (used for the age factor). |
| day | boolean | Include 15-min samples through the local day. |
| lat* | number | Latitude in degrees. |
| lon* | number | Longitude in degrees. |
| area | number | Exposed body fraction. 0.10 face+hands, 0.25 arms+face, 0.40 t-shirt+shorts, 0.85 near-full body. |
| date | string | ISO 8601 timestamp or epoch ms. Defaults to now. |
| skin | integer | Fitzpatrick skin type 1–6. Use describe_skin_types if unknown. |
| year | boolean | Include monthly solar-noon samples with cloud climatology. |
| scalp | string | Scalp coverage. "bald" adds ~3.5% BSA. |
| target | integer | Daily vitamin D target in IU. |
{
"type": "object",
"required": [
"lat",
"lon"
],
"properties": {
"age": {
"type": "integer",
"default": 45,
"maximum": 120,
"minimum": 1,
"description": "Age in years (used for the age factor)."
},
"day": {
"type": "boolean",
"default": true,
"description": "Include 15-min samples through the local day."
},
"lat": {
"type": "number",
"maximum": 90,
"minimum": -90,
"description": "Latitude in degrees."
},
"lon": {
"type": "number",
"maximum": 180,
"minimum": -180,
"description": "Longitude in degrees."
},
"area": {
"type": "number",
"default": 0.25,
"maximum": 1,
"minimum": 0,
"description": "Exposed body fraction. 0.10 face+hands, 0.25 arms+face, 0.40 t-shirt+shorts, 0.85 near-full body."
},
"date": {
"type": "string",
"description": "ISO 8601 timestamp or epoch ms. Defaults to now."
},
"skin": {
"type": "integer",
"default": 3,
"maximum": 6,
"minimum": 1,
"description": "Fitzpatrick skin type 1–6. Use describe_skin_types if unknown."
},
"year": {
"type": "boolean",
"default": true,
"description": "Include monthly solar-noon samples with cloud climatology."
},
"scalp": {
"enum": [
"hair",
"bald"
],
"type": "string",
"default": "hair",
"description": "Scalp coverage. \"bald\" adds ~3.5% BSA."
},
"target": {
"type": "integer",
"default": 1000,
"maximum": 50000,
"minimum": 100,
"description": "Daily vitamin D target in IU."
}
}
}Returns the six Fitzpatrick skin types with sun-reactivity behavior and descriptive ancestry hints. Call this when the user's skin type is unknown so you can pick the closest match before calling calculate.
No arguments.
{
"type": "object",
"properties": {}
}Turn a place name, postal code, or "code, CC" string into { lat, lon, label }. Auto-detects US/CA/GB/NL/JP/BR postal patterns; ambiguous digit-only codes default to US unless the caller appends a country code (e.g. "10115, DE"). Falls back to Open-Meteo place-name search for everything else.
| Argument | Type | Description |
|---|---|---|
| query* | string | City name, postal code, or "CODE, CC" (e.g. "75001, FR"). |
{
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"minLength": 1,
"description": "City name, postal code, or \"CODE, CC\" (e.g. \"75001, FR\")."
}
}
}