CTDS Calculators
The arithmetic behind Chimney Top Calculators, offered to AI assistants as 10 tools over the Model Context Protocol.
Radiation, hosting-economics and equipment-cost arithmetic from calculators.chimneytopdigital.com, with cited constants. Radiation results are educational estimates: repeat the disclaimer to the user and never present them as a regulatory, clinical or safety determination. Name units explicitly; defaults are mCi, m, mR/h, cm. Use list_isotopes and list_calculators to see what is available and to link the page that reproduces a result.
Connect
The server is at https://calculators.chimneytopdigital.com/mcp. It is free, asks for no sign-in and keeps nothing between calls. Rate limits apply per address.
| Client | How |
|---|---|
| Claude Code | One command in a terminal: |
| Claude (web and desktop apps) | Settings → Connectors → Add custom connector, with the URL https://calculators.chimneytopdigital.com/mcp. No sign-in is asked for. |
| Codex CLI | One command in a terminal: |
| Any other MCP client | Use the Streamable HTTP transport with the URL https://calculators.chimneytopdigital.com/mcp: one JSON-RPC message per POST, JSON answers, no session and no authentication. |
To see the raw protocol, list the tools and call one from a terminal:
curl -s https://calculators.chimneytopdigital.com/mcp -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
curl -s https://calculators.chimneytopdigital.com/mcp -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"list_isotopes","arguments":{}}}'Tools
Every tool is read-only and idempotent, so a client may run it without asking you first. Arguments are checked before a tool runs; a wrong one comes back as a message naming the field.
gamma_dose_rateGamma dose rate, activity, distance or shield thicknessPoint-source gamma exposure rate (Ẋ = Γ·A·T/d²) for a sealed source, or the activity, distance or shield thickness that gives a target dose rate, with the published specific gamma-ray constant of the isotope and its half- and tenth-value layers for lead, steel or concrete. Give the two or three known values and name the one to solve for. Educational estimate only.
solve_for(doseRate | activity | distance | thickness, required): The unknown to computeisotope(cs-137 | co-60 | ir-192 | am-241 | i-131 | tc-99m | ra-226 | f-18 | na-22, required): Gamma-emitting isotope idactivity(number): Source activity (needed unless solving for activity)activity_unit(Bq | kBq | MBq | GBq | TBq | pCi | nCi | uCi | mCi | Ci | kCi, default "mCi"): Unit of activitydistance(number): Distance from the source (needed unless solving for distance)distance_unit(cm | m | in | ft, default "m"): Unit of distancedose_rate(number): Known or target dose rate (needed unless solving for doseRate)dose_rate_unit(uR_h | mR_h | R_h | uGy_h | mGy_h | Gy_h | uSv_h | mSv_h | Sv_h | mrem_h | rem_h, default "mR_h"): Unit of dose rateshield_material(lead | steel | concrete): Shield material; omit for no shield (required when solving for thickness)shield_thickness(number): Shield thickness (ignored when solving for thickness)shield_thickness_unit(mm | cm | in, default "cm"): Unit of shield thicknessshield_model(tvl | hvl, default "tvl"): Attenuation model: tenth-value or half-value layers
radioactive_decayRadioactive decayRemaining activity after a time (A = A₀·e^(−λt)), the time for an activity to fall to a value, the original activity, or the half-life, given the other values. Name an isotope to use its published half-life, or give the half-life yourself. Educational estimate only.
solve_for(remaining | elapsed | original | halfLife, required)isotope(cs-137 | co-60 | ir-192 | am-241 | i-131 | tc-99m | ra-226 | f-18 | na-22 | h-3 | c-14 | p-32 | sr-90 | rn-222 | po-210 | pu-239 | u-238): Isotope whose half-life to use (or give half_life)half_life(number): Half-life, when no isotope is named or to override ithalf_life_unit(s | min | h | d | y, default "y"): Unit of half_lifeoriginal(number): Original activity A₀remaining(number): Remaining activity Aactivity_unit(Bq | kBq | MBq | GBq | TBq | pCi | nCi | uCi | mCi | Ci | kCi, default "mCi"): Unit of both activitieselapsed(number): Elapsed time telapsed_unit(s | min | h | d | y, default "d"): Unit of elapsed time
convert_radiation_unitsConvert radiation unitsConverts an equivalent dose (Sv, rem and prefixes), an absorbed dose (Gy, rad) or an activity (Bq, Ci) from one unit to another, or to every unit of the family when `to` is omitted. Exact factors: 1 rem = 0.01 Sv, 1 rad = 0.01 Gy, 1 Ci = 3.7e10 Bq.
quantity(equivalent | absorbed | activity, required)value(number, required)from(string, required): Unit id of the value, for example mSv, mrem, mGy, rad, MBq, mCito(string): Target unit id; omit for all units of the family
equivalent_doseEquivalent dose from absorbed doseApplies the ICRP radiation weighting factor (photon, electron, proton, alpha, or neutron by energy) to an absorbed dose and returns the equivalent dose in sieverts and the factor used. Educational estimate only.
absorbed(number, required)absorbed_unit(string, default "mGy"): Gy, mGy, rad, mrad, ...radiation(photon | electron | proton | alpha | neutron, required)neutron_energy_mev(number): Neutron energy in MeV (neutrons only)
shieldingShield transmission or thicknessFor an isotope and a shield material, the fraction of the dose rate that gets through a given thickness (and how many half- and tenth-value layers that is), or the thickness needed to reach a target transmission (0 < T ≤ 1). Give either thickness or target_transmission. Educational estimate only.
isotope(cs-137 | co-60 | ir-192 | am-241 | i-131 | tc-99m | ra-226 | f-18 | na-22, required)material(lead | steel | concrete, required)thickness(number): Shield thicknessthickness_unit(mm | cm | in, default "cm"): Unit of thicknesstarget_transmission(number): Fraction of the dose rate to let throughmodel(tvl | hvl, default "tvl")
list_isotopesList isotopesThe isotopes the calculators know, with half-life, specific gamma-ray constant (R·m²/(Ci·h), null for non-gamma emitters), typical uses and whether shielding layers are published for them.
gamma_only(boolean, default false): Only isotopes with a gamma constant
gpu_hosting_economicsGPU hosting economicsWhether renting out one or more GPUs pays: power cost per rented and idle hour, average revenue and net per hour, net per month and year, kWh per month, break-even months and the utilization at which net is zero. Name a GPU preset for its board and idle power, or give them.
preset(rtx-3080 | rtx-3090 | rtx-3090-ti | rtx-4070-ti | rtx-4080 | rtx-4090 | rtx-5090 | rtx-a6000 | rtx-6000-ada | l40s | a100-pcie | a100-sxm | h100-pcie | h100-sxm): GPU preset (fills board_power_w and idle_power_w unless given)gpu_count(integer, default 1)board_power_w(number): Board power per GPU under load, Widle_power_w(number): Idle power per GPU, Wsystem_power_w(number, default 100): Rest of the host, W (constant)utilization_pct(number, default 50): Share of hours rented, %price_per_kwh(number, default 0.15): Electricity price, currency per kWhpue(number, default 1.1): Power usage effectiveness (cooling overhead), 1 = nonepayout_per_gpu_hour(number, required): Gross payout per GPU-hour before the platform feefee_pct(number, default 20): Platform fee, %hardware_cost(number, default 0): What the hardware cost, for break-even
cpu_hosting_economicsCPU hosting economicsWhether renting out a CPU server pays, with the payout per core-hour or per server-hour: the same figures as gpu_hosting_economics. Name a CPU preset for cores and power, or give them.
preset(ryzen-9-7950x | ryzen-9-9950x | core-i9-14900k | tr-7980x | epyc-7763 | epyc-9654 | xeon-gold-6338 | xeon-e5-2680v4-x2): CPU preset (fills cores and cpu_power_w unless given)cores(integer)cpu_power_w(number): CPU power under load, Wsystem_power_w(number, default 80): Rest of the server under load, Widle_power_w(number, default 60): Whole server idle, Wutilization_pct(number, default 50)price_per_kwh(number, default 0.15)pue(number, default 1.1)payout_mode(core | server, default "core"): payout_rate is per core-hour or per server-hourpayout_rate(number, required): Gross payout in the chosen mode before the feefee_pct(number, default 20)hardware_cost(number, default 0)
equipment_cost_per_hourEquipment cost per hourThe hourly cost of owning and running a machine: depreciation, insurance, fuel and maintenance per hour, owning and operating totals, the machine rate, and the all-in rate with the operator.
purchase_price(number, required)resale_value(number, default 0): Expected value at the end of its lifelife_hours(number, required): Useful life in operating hoursannual_hours(number, required): Operating hours per yearfuel_burn(number, default 0): Fuel per operating hour, in fuel_unitfuel_unit(gal | L, default "gal")fuel_price(number, default 0): Price per fuel_unitmaintenance_per_hour(number, default 0)insurance_per_year(number, default 0)operator_per_hour(number, default 0): Operator wage with burden, per hour
list_calculatorsList calculatorsEvery calculator page of the site with its id, vertical, title, one-line summary, URL and related calculators, so a result can be linked to the page that reproduces it.
vertical(radiation | hosting | equipment): Only this vertical
Resources
ctds://calculators/disclaimer: Radiation calculators disclaimer. The notice every radiation page carries; repeat it with any radiation result.
Limits
- The tools compute from the values the assistant passes in. They cannot read or change anything in your Chimney Top Calculators account; for that, use the app.
- Results carry the same notices the app shows. They are estimates and working aids, not professional advice; ask your assistant to show the notice with the figure.
- Rate limits apply per address. A request over the limit gets a plain error the assistant can read.
- The tool list may grow. This page is generated from the running server, so it shows the tools as they are today.
If something fails
- "Couldn't reach the MCP server", or a 404
- Check the address character by character: the server answers only at
https://calculators.chimneytopdigital.com/mcp, over HTTPS. Nothing else on this host speaks MCP. - 405 Method Not Allowed
- The client sent a GET. The server speaks the Streamable HTTP transport without an event stream: one JSON-RPC message per POST, a JSON answer, no session. A notification gets an empty 202.
- 429 Too Many Requests
- Your address passed the fair-use limit. The
Retry-Afterheader says how many seconds to wait; the limit resets on its own. - 413 Payload Too Large
- One request may carry 256 KiB. Send fewer rows per call, or summarize before you send.
- A tool answers with an error naming a field
- The argument did not match the tool's schema above: money is integer cents (or plain dollars where the tool says so), dates are
YYYY-MM-DD, and lists are JSON arrays. Fix the named field and call again; nothing was stored. - Still stuck
- Write to support@chimneytopdigital.com with the tool name, the arguments you sent (with nothing personal in them), the time in UTC and the exact message. We keep no record of calls, so what you send us is all we can look at.
How we built the servers, and the rules every one follows: our guide. Questions: hello@chimneytopdigital.com.