{"name":"io.github.JaviMaligno/vitamind","slug":"javimaligno-vitamind","title":null,"description":"Know when the sun can make vitamin D where you are, for your skin type. Live UV data.","url":"https://mcp.market/server/javimaligno-vitamind","rating":null,"grade":"A","score":97,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":26,"stars":1,"forks":0,"downloads_week":null,"last_push_at":"2026-10-27T08:48:36.000Z","license":null},"uptime":{"percent":79,"checks":28,"ok":22,"last_checked_at":"2026-11-04T05:25:28.616Z","last_ok_at":"2026-11-04T05:25:28.616Z","latency_ms":290},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/JaviMaligno/vitamind","website":"https://getvitamind.app/connect","version":"1.0.0","remotes":[{"type":"streamable-http","url":"https://getvitamind.app/api/mcp/mcp"},{"type":"streamable-http","url":"https://getvitamind.app/api/mcp-auth/mcp"}],"packages":[],"tools":[{"name":"compare_vitamin_d_year","description":"Compare the vitamin D year of 2 to 5 places side by side in ONE call — 'Madrid vs Berlin vs Oslo, where do I actually get winter sun?'. Returns each place's months with sun, exact season span and viable days per year, plus rankedByViableDays. Use this instead of calling get_vitamin_d_year once per city: only this tool can draw the years on a shared axis.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"places":{"minItems":2,"maxItems":5,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60,"description":"How to label this place in the comparison"},"lat":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees"},"lon":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees"},"timezone":{"description":"IANA timezone like 'Europe/Madrid'. Strongly recommended — without it all times are UTC","type":"string","maxLength":64},"elevationM":{"description":"Ground elevation in metres (UV rises ~8%/km); default sea level","type":"number","minimum":-100,"maximum":6000}},"required":["name","lat","lon"]},"description":"The places to compare, 2 to 5"},"skinType":{"description":"Fitzpatrick skin type 1 (very fair) to 6 (very dark); default 3","type":"integer","minimum":1,"maximum":6},"exposedSkinFraction":{"description":"Skin exposed: 0.10 face+hands, 0.18 face+arms, 0.25 t-shirt+shorts (default), 0.40 swimsuit","type":"number","minimum":0.05,"maximum":1},"age":{"description":"Age in years (synthesis declines with age); omit for adult baseline","type":"number","minimum":0,"maximum":120},"targetIU":{"description":"Vitamin D target per session in IU; default 1000","type":"number","minimum":100,"maximum":10000}},"required":["places"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"configure_sun_profile","description":"Show the user an interactive form for the four values every other tool assumes — Fitzpatrick skin type, fraction of skin exposed, age and target IU — with the minutes they need updating live. Use this when those values are unknown, when the user wants to change them, or instead of asking for them one at a time in conversation. Whatever the user picks comes back into the conversation; pass those values explicitly to the other tools afterwards.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"lat":{"description":"Latitude of the place being discussed, so the live estimate uses today's real UV there","type":"number","minimum":-90,"maximum":90},"lon":{"description":"Longitude, paired with lat","type":"number","minimum":-180,"maximum":180},"timezone":{"description":"IANA timezone like 'Europe/Madrid'. Strongly recommended — without it all times are UTC","type":"string","maxLength":64},"placeName":{"description":"How to label that place in the widget","type":"string","minLength":1,"maxLength":60},"skinType":{"description":"Fitzpatrick skin type 1 (very fair) to 6 (very dark); default 3","type":"integer","minimum":1,"maximum":6},"exposedSkinFraction":{"description":"Skin exposed: 0.10 face+hands, 0.18 face+arms, 0.25 t-shirt+shorts (default), 0.40 swimsuit","type":"number","minimum":0.05,"maximum":1},"age":{"description":"Age in years (synthesis declines with age); omit for adult baseline","type":"number","minimum":0,"maximum":120},"targetIU":{"description":"Vitamin D target per session in IU; default 1000","type":"number","minimum":100,"maximum":10000}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"estimate_sun_session","description":"Estimate a sun session's outcome: 'I was (or will be) out N minutes — how much vitamin D did I make?' plus 'how long before I'd burn?' for the profile. Takes a start time (defaults to the day's best hour) and session minutes; returns estimated IU (with the physiological cap), average UV and clear-sky minutes-to-sunburn. Use for any 'how much did I get / can I get in X minutes' or 'how long without burning' question.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees"},"lon":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees"},"date":{"description":"Date as YYYY-MM-DD; defaults to today","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"timezone":{"description":"IANA timezone like 'Europe/Madrid'. Strongly recommended — without it all times are UTC","type":"string","maxLength":64},"skinType":{"description":"Fitzpatrick skin type 1 (very fair) to 6 (very dark); default 3","type":"integer","minimum":1,"maximum":6},"exposedSkinFraction":{"description":"Skin exposed: 0.10 face+hands, 0.18 face+arms, 0.25 t-shirt+shorts (default), 0.40 swimsuit","type":"number","minimum":0.05,"maximum":1},"age":{"description":"Age in years (synthesis declines with age); omit for adult baseline","type":"number","minimum":0,"maximum":120},"elevationM":{"description":"Ground elevation in metres (UV rises ~8%/km); default sea level","type":"number","minimum":-100,"maximum":6000},"startTime":{"description":"Local HH:MM the session starts; defaults to the day's best hour","type":"string","pattern":"^\\d{1,2}:\\d{2}$"},"minutes":{"type":"number","minimum":1,"maximum":600,"description":"Session length in minutes"}},"required":["lat","lon","minutes"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"get_current_status","description":"Whether RIGHT NOW is a good moment for vitamin D synthesis at a location, using live Open-Meteo UV/cloud data when reachable (clear-sky model otherwise): current UV index, minutes needed now, and when today's window opens or closes.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees"},"lon":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees"},"timezone":{"description":"IANA timezone like 'Europe/Madrid'. Strongly recommended — without it all times are UTC","type":"string","maxLength":64},"skinType":{"description":"Fitzpatrick skin type 1 (very fair) to 6 (very dark); default 3","type":"integer","minimum":1,"maximum":6},"exposedSkinFraction":{"description":"Skin exposed: 0.10 face+hands, 0.18 face+arms, 0.25 t-shirt+shorts (default), 0.40 swimsuit","type":"number","minimum":0.05,"maximum":1},"age":{"description":"Age in years (synthesis declines with age); omit for adult baseline","type":"number","minimum":0,"maximum":120},"targetIU":{"description":"Vitamin D target per session in IU; default 1000","type":"number","minimum":100,"maximum":10000},"elevationM":{"description":"Ground elevation in metres (UV rises ~8%/km); default sea level","type":"number","minimum":-100,"maximum":6000}},"required":["lat","lon"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"get_my_cities","description":"The signed-in user's current city and favorite cities with coordinates and timezones, ready to feed into the public tools. Requires OAuth (scope profile:read).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"get_my_history","description":"The signed-in user's sun history from the app's calendar: which recent days had viable sun, which they confirmed going outside, and their current streak. Covers the calendar days from `from` to `to`; records exist only for days the app was open, so a date missing from `records` means nothing was measured, not that the sun was insufficient. Requires OAuth (scope history:read). Renders as a calendar the user can tap to confirm a day.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"days":{"description":"How many recent days to return; default 30","type":"integer","minimum":1,"maximum":365}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"get_my_profile","description":"The signed-in user's saved Vitamin D profile: skin type, exposed-skin default, age, target IU and their current city. Requires connecting with OAuth (scope profile:read). Call this FIRST for any personal question, then pass its values to the public tools instead of asking the user.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"get_sun_forecast","description":"The NEXT FEW DAYS of vitamin D sun at a location, using the live Open-Meteo forecast: per day the peak UV, average cloud cover, the synthesis window and the minutes needed, plus bestDay. Use this for any question spanning several days — 'which day this week should I go out', 'will it be better tomorrow', 'when's my next chance' — instead of calling get_vitamin_d_window once per date.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees"},"lon":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees"},"timezone":{"description":"IANA timezone like 'Europe/Madrid'. Strongly recommended — without it all times are UTC","type":"string","maxLength":64},"skinType":{"description":"Fitzpatrick skin type 1 (very fair) to 6 (very dark); default 3","type":"integer","minimum":1,"maximum":6},"exposedSkinFraction":{"description":"Skin exposed: 0.10 face+hands, 0.18 face+arms, 0.25 t-shirt+shorts (default), 0.40 swimsuit","type":"number","minimum":0.05,"maximum":1},"age":{"description":"Age in years (synthesis declines with age); omit for adult baseline","type":"number","minimum":0,"maximum":120},"targetIU":{"description":"Vitamin D target per session in IU; default 1000","type":"number","minimum":100,"maximum":10000},"elevationM":{"description":"Ground elevation in metres (UV rises ~8%/km); default sea level","type":"number","minimum":-100,"maximum":6000},"days":{"description":"How many days ahead, 2 to 7; default 5","type":"integer","minimum":2,"maximum":7}},"required":["lat","lon"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"get_sun_times","description":"Sunrise, sunset, solar noon, civil dawn/dusk, morning AND evening golden hour, and day length (with day-over-day trend) for a location and date. Handles midnight sun and polar night. Pure sun times — for vitamin D questions use the vitamin_d tools instead.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees"},"lon":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees"},"date":{"description":"Date as YYYY-MM-DD; defaults to today","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"timezone":{"description":"IANA timezone like 'Europe/Madrid'. Strongly recommended — without it all times are UTC","type":"string","maxLength":64}},"required":["lat","lon"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"get_vitamin_d_window","description":"The solar vitamin D synthesis window for ONE specific day at a location, for a personal profile: when UV is strong enough (index ≥ 3), the best hour, the clear-sky minutes needed to reach the target IU, and (with atTime) the minutes at the specific hour the user plans to go out. Returns synthesisPossible=false when the sun never gets high enough that day. Only for single-day questions — for months, seasons or 'when during the year', call get_vitamin_d_year instead of calling this once per date.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees"},"lon":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees"},"date":{"description":"Date as YYYY-MM-DD; defaults to today","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"timezone":{"description":"IANA timezone like 'Europe/Madrid'. Strongly recommended — without it all times are UTC","type":"string","maxLength":64},"skinType":{"description":"Fitzpatrick skin type 1 (very fair) to 6 (very dark); default 3","type":"integer","minimum":1,"maximum":6},"exposedSkinFraction":{"description":"Skin exposed: 0.10 face+hands, 0.18 face+arms, 0.25 t-shirt+shorts (default), 0.40 swimsuit","type":"number","minimum":0.05,"maximum":1},"age":{"description":"Age in years (synthesis declines with age); omit for adult baseline","type":"number","minimum":0,"maximum":120},"targetIU":{"description":"Vitamin D target per session in IU; default 1000","type":"number","minimum":100,"maximum":10000},"elevationM":{"description":"Ground elevation in metres (UV rises ~8%/km); default sea level","type":"number","minimum":-100,"maximum":6000},"atTime":{"description":"Local HH:MM the user plans to go out — adds minutesNeeded and UV at that exact time","type":"string","pattern":"^\\d{1,2}:\\d{2}$"}},"required":["lat","lon"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"get_vitamin_d_year","description":"The WHOLE YEAR of solar vitamin D for a location in a single call. monthsWithSun lists every month with at least one viable day (season edges count as partial months, see byMonth[].viableDays); solidMonths lists months where most days work; exactViableSpan gives the exact season boundaries; summary carries per-year aggregates for comparing places. Use this for any question about months, seasons, winter/summer or 'when during the year can I…' — never probe individual dates with get_vitamin_d_window for that.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees"},"lon":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees"},"timezone":{"description":"IANA timezone like 'Europe/Madrid'. Strongly recommended — without it all times are UTC","type":"string","maxLength":64},"skinType":{"description":"Fitzpatrick skin type 1 (very fair) to 6 (very dark); default 3","type":"integer","minimum":1,"maximum":6},"exposedSkinFraction":{"description":"Skin exposed: 0.10 face+hands, 0.18 face+arms, 0.25 t-shirt+shorts (default), 0.40 swimsuit","type":"number","minimum":0.05,"maximum":1},"age":{"description":"Age in years (synthesis declines with age); omit for adult baseline","type":"number","minimum":0,"maximum":120},"targetIU":{"description":"Vitamin D target per session in IU; default 1000","type":"number","minimum":100,"maximum":10000},"elevationM":{"description":"Ground elevation in metres (UV rises ~8%/km); default sea level","type":"number","minimum":-100,"maximum":6000},"placeName":{"description":"The place's name as the user said it — used to caption the chart","type":"string","minLength":1,"maxLength":60}},"required":["lat","lon"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"log_sun_session","description":"Sets a day's answer in the signed-in user's history calendar. Three values: confirmed=true (went out, the default), confirmed=false (had usable sun but stayed in), confirmed=null (clear the answer). Defaults to today. Requires OAuth (scope history:write).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"date":{"description":"Day to set, YYYY-MM-DD; defaults to today","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"minutes":{"description":"Minutes the user reports having spent in the sun (acknowledged, not stored)","type":"number","minimum":1,"maximum":600},"confirmed":{"description":"true (default) the user went out; false they had sun but stayed in; null clears the answer","type":["boolean","null"]}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"search_city","description":"Find a city in the app's database by name (any of the app's six languages works) and get its coordinates, IANA timezone and elevation — feed those into the other tools.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":80,"description":"City name, e.g. 'Madrid', 'London', 'Nueva York'"}},"required":["query"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"set_history_location","description":"Records where the signed-in user was over a range of past days, so their history stops assuming. Use it when the user corrects a stretch — get_my_history marks inherited days with `locationAssumed`, and the history calendar offers those stretches for correction. Pass a cityId from search_city, or lat/lon. Changes only the location: whether they went outside that day is untouched. Requires OAuth (scope history:write).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"First day of the stretch, YYYY-MM-DD"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Last day of the stretch, YYYY-MM-DD; same as `from` for one day"},"cityId":{"description":"City id from search_city, e.g. 'builtin:londres'","type":"string","maxLength":80},"lat":{"description":"Latitude, for a place not in the database","type":"number","minimum":-90,"maximum":90},"lon":{"description":"Longitude, paired with lat","type":"number","minimum":-180,"maximum":180}},"required":["from","to"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"update_my_profile","description":"Save the signed-in user's synthesis profile — skin type, exposed-skin fraction, age and target IU — to their account, so the app and every later call use them. Requires OAuth (scope profile:write). Only these four values are writable; favourites, cities and history are not.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"skinType":{"description":"Fitzpatrick skin type 1 (very fair) to 6 (very dark); default 3","type":"integer","minimum":1,"maximum":6},"exposedSkinFraction":{"description":"Skin exposed: 0.10 face+hands, 0.18 face+arms, 0.25 t-shirt+shorts (default), 0.40 swimsuit","type":"number","minimum":0.05,"maximum":1},"age":{"description":"Age in years, or null for the adult baseline","anyOf":[{"type":"number","minimum":0,"maximum":120},{"type":"null"}]},"targetIU":{"description":"Vitamin D target per session in IU; default 1000","type":"number","minimum":100,"maximum":10000}},"$schema":"https://json-schema.org/draft/2020-12/schema"}}],"scan":{"score":97,"grade":"A","scanned_at":"2026-10-27T18:15:31.113Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-27T18:15:30.970Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1381ms"]},"poisoning":{"score":15,"max":15,"notes":["15 tool descriptions checked"]},"auth":{"score":15,"max":15,"notes":["OAuth resource metadata advertised on 401"]},"maintenance":{"score":15,"max":15,"notes":["last push 0 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"probes":[{"url":"https://getvitamind.app/api/mcp/mcp","reachable":true,"authRequired":false,"latencyMs":1381,"serverInfo":{"name":"vitamind-explorer","version":"1.0.0"}},{"url":"https://getvitamind.app/api/mcp-auth/mcp","reachable":true,"authRequired":true,"latencyMs":116,"authScheme":"oauth"}],"packages":[],"repo":{"found":true,"owner":"JaviMaligno","repo":"vitamind","archived":false,"pushedAt":"2026-10-27T08:48:36Z","stars":1,"forks":0,"openIssues":6,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/25660622?v=4","ownerCreatedAt":"2017-02-09T10:22:43Z"},"icon":{"url":"https://getvitamind.app/icons/apple-touch-icon.png","source":"registry","width":180,"height":180},"presence":{"stars":1,"forks":0,"downloadsWeek":null,"license":null,"lastPushAt":"2026-10-27T08:48:36.000Z","score":26}}}},"grade_history":[],"reviews":[]}