Calcgrid
Server Details
Pinned IANA time-zone tools plus China working-day data and official UK bank holidays.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 53 tools
Most tools have clearly distinct purposes, and the extensive 'Do not use this when...' guidance makes selection fairly reliable. The main ambiguity is between convert_units and convert_temperature, since convert_units explicitly includes temperature conversions. A few related finance/statistics tools are close but well-enough separated by their descriptions.
All tool names follow a lowercase snake_case verb_noun convention, which is good. However, the verb prefix varies considerably across similar domains (calculate_, convert_, add_/check_/count_, solve_, estimate_, find_, lookup_, cast_, price_, resolve_), and singular/plural object forms are inconsistent, making exact tool names less predictable.
With 53 tools, the server is far beyond the suggested 3-15 well-scoped range. Many dedicated calculators overlap with the generic run_calculator and search_calculators layer, so the curated surface feels bloated even though the underlying 538-calculator catalog is broad.
The server covers the deterministic-calculation domain very thoroughly: a large set of dedicated calculators plus search_calculators, get_calculator_schema, and run_calculator provide access to 538 calculators. Discovery, schema lookup, and execution form a complete workflow with no obvious dead ends.
Available Tools
53 toolsadd_china_working_daysAdd Mainland China Working DaysARead-onlyIdempotentInspect
Use this when you need a deadline or settlement date a stated number of mainland China national working days before or after a 2024-2026 date. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need calendar days, a sector-specific settlement calendar, a local holiday calendar, or a result outside the 2024-2026 coverage. What it computes: Adds or subtracts official mainland China working days, skipping holiday periods and ordinary weekends while counting State Council-designated weekend makeup workdays. Example user requests: What date is 5 China working days after 2026-09-24, accounting for Mid-Autumn and National Day? | 从2026年9月18日起往后数5个中国工作日是哪天? | Subtract 10 official mainland China business days from 2026-03-02. Inputs: start_date (date); working_days (integer, working days). Complete JSON argument examples: {"start_date":"2026-09-24","working_days":5} | {"start_date":"2026-09-18","working_days":5} Outputs: start_date, result_date, result_weekday, result_is_working_day, working_days_added [working days], calendar_days_elapsed [days], non_working_days_skipped [days], adjusted_workdays_counted, source_document_ids, dataset_version, coverage_start, coverage_end. Formula: move one calendar day at a time in sign(working_days); decrement the remaining count only when is_working_day(date) is true Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/china-add-working-days with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/everyday/china-add-working-days.md
| Name | Required | Description | Default |
|---|---|---|---|
| start_date | Yes | Starting mainland China civil date (YYYY-MM-DD), within 2024-2026. | |
| working_days | Yes | Signed number of official working days to add; the start date is excluded when non-zero. Negative values move backward. Unit: working days. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive hints; the description goes well beyond them by explaining that weekends and holidays are skipped, State Council weekend makeup workdays count, the sign of working_days controls direction, the start date is excluded, and coverage is 2024-2026. This gives an agent a precise behavioral model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but clearly structured with headers and front-loads the core purpose and usage guidance. There is some redundancy with the schema, such as inputs and complete JSON examples being repeated, but every other section adds material information like outputs, formula, REST fallback, and docs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description covers why to use it, when not to, exact computation rules, input examples, output fields, a REST fallback, and a documentation URL. An agent has everything needed to invoke it correctly, including coverage limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds semantic value in the formula and computation notes: unary movement, decrement only on working days, and start-date exclusion. This is useful but mostly complements rather than replaces the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource: it adds or subtracts Mainland China official working days to a date within 2024-2026, with explicit computation details and examples. The description also tells the agent what the tool is not for (calendar days, sector-specific settlement calendars, local holiday calendars), differentiating it from sibling tools like check/count China working days and add_uk_working_days.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions (deadline or settlement date in China working days) and when-not-to-use conditions (calendar days, sector-specific settlement, local holiday calendar, outside 2024-2026). It also instructs the agent to call the tool directly rather than compute from memory, providing clear decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_uk_working_daysAdd UK Working DaysARead-onlyIdempotentInspect
Use this when you need a deadline a stated number of UK working days before or after a 2024-2028 date and the correct division's bank holidays matter. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need calendar days, a local/employer/market calendar, a non-UK jurisdiction or a result outside 2024-2028. What it computes: Adds or subtracts working days for England and Wales, Scotland or Northern Ireland, skipping weekends and the selected division's official bank holidays. Example user requests: What date is five England and Wales working days after 23 December 2026? | Add two Scottish working days to 12 June 2026, accounting for the official bank holiday. | Subtract ten Northern Ireland business days from 20 July 2027. Inputs: start_date (date); working_days (integer, working days); division (enum, optional). Complete JSON argument examples: {"start_date":"2026-12-23","working_days":5,"division":"england-and-wales"} | {"start_date":"2026-06-12","working_days":2,"division":"scotland"} Outputs: division, division_name, start_date, result_date, result_weekday, result_is_working_day, working_days_added [working days], calendar_days_elapsed [days], non_working_days_skipped [days], bank_holidays_skipped, dataset_version, coverage_start, coverage_end, source_snapshot_sha256. Formula: move one calendar day at a time in sign(working_days); decrement only when the selected UK division reports is_working_day=true Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/uk-add-working-days with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/everyday/uk-add-working-days.md
| Name | Required | Description | Default |
|---|---|---|---|
| division | No | GOV.UK bank-holiday division. England and Wales share one official list; Scotland and Northern Ireland have separate lists. | england-and-wales |
| start_date | Yes | Starting UK civil date in YYYY-MM-DD format, within 2024-2028. | |
| working_days | Yes | Signed working-day offset. The start date is excluded when non-zero; negative values move backward. Unit: working days. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations: the exact day-by-day formula, the fact that the start date is excluded, the output fields, and a direct REST fallback with a warning not to guess another API path. This is strong but not exhaustive; it does not discuss failure modes or edge cases like invalid dates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but well-structured with clear sections: usage, exclusions, computation, examples, outputs, formula, REST fallback, and docs. It front-loads the most important decision information. Some redundancy with the schema exists, but the added examples and formula justify the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is highly complete for a tool of this complexity. It covers when to use it, when not to use it, the exact computation method, input examples, output fields, a REST fallback, and documentation links. With an output schema present, the listed outputs are a bonus rather than a necessity. Nothing an agent needs to invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description repeats the parameter names and types and provides complete JSON examples, but it does not add significant semantic detail beyond what the schema already documents. The examples are useful but not transformative.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it 'adds or subtracts working days' for UK divisions, with a defined date range and bank-holiday scope. It clearly distinguishes itself from sibling tools like add_china_working_days, check_uk_working_day, and count_uk_working_days by focusing on UK working-day arithmetic for deadlines.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('Use this when you need a deadline a stated number of UK working days...') and explicit when-not-to-use exclusions ('Do not use this when you need calendar days, a local/employer/market calendar, a non-UK jurisdiction or a result outside 2024-2028'). It does not name specific alternative sibling tools, but the exclusions are clear enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_ab_test_significanceA/B Test Significance CalculatorARead-onlyIdempotentInspect
Use this when you have visitors and conversions for a control and a variant (A/B test, split test, email test) and need to know whether the difference is statistically significant. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when the metric is a mean (revenue per user, time on page) rather than a conversion proportion, or there are more than two variants (use a chi-square or multiple-comparison procedure). What it computes: Tests whether a variant's conversion rate differs from the control's using the pooled two-proportion z-test, and reports both rates, absolute and relative lift, z-score, two-sided p-value, a confidence interval for the difference and the sample size needed per variant to detect the observed lift with 80 % power. Inputs: control_visitors (integer); control_conversions (integer); variant_visitors (integer); variant_conversions (integer); confidence_level_percent (number, %, optional). Complete JSON argument examples: {"control_visitors":1000,"control_conversions":50,"variant_visitors":1000,"variant_conversions":70} | {"control_visitors":5000,"control_conversions":200,"variant_visitors":5000,"variant_conversions":260} Outputs: control_rate_percent [%], variant_rate_percent [%], absolute_lift_percentage_points [pp], relative_lift_percent [%], standard_error_percentage_points [pp], z_score, p_value, significant, ci_lower_percentage_points [pp], ci_upper_percentage_points [pp], required_visitors_per_variant, verdict. Formula: p1 = x1/n1, p2 = x2/n2, p̄ = (x1 + x2)/(n1 + n2); z = (p2 − p1) / √(p̄(1 − p̄)(1/n1 + 1/n2)); p_value = 2·(1 − Φ(|z|)); CI = (p2 − p1) ± z_crit·√(p1(1 − p1)/n1 + p2(1 − p2)/n2); n per variant = (z_crit·√(2·p̄(1 − p̄)) + z_0.80·√(p1(1 − p1) + p2(1 − p2)))² / (p2 − p1)² Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/ab-test-significance with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/business/ab-test-significance.md
| Name | Required | Description | Default |
|---|---|---|---|
| control_visitors | Yes | Number of users exposed to the control (A). | |
| variant_visitors | Yes | Number of users exposed to the variant (B). | |
| control_conversions | Yes | Conversions in the control group. | |
| variant_conversions | Yes | Conversions in the variant group. | |
| confidence_level_percent | No | Confidence level for the significance decision and interval (95 → α = 0.05, two-sided). Unit: %. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/non-destructive annotations, the description discloses the exact test method, the full set of computed outputs, the underlying formulas, and a REST fallback URL. It also tells the agent to return the calculation rather than answer from memory, which is a behavioral instruction not present in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the use case and exclusions, and it is organized into labeled sections. It is long, and the full formula block is arguably more than an agent needs to invoke the tool, but most content serves either routing, input validation, or transparency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter statistical tool, the description covers when to use it, what it computes, all inputs with examples, all outputs, the formula, and a fallback endpoint. With a rich output schema and annotations present, nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter is already described, so the baseline is 3. The description adds value with complete JSON examples and formula notation mapping parameters to p1, p2, and z, which helps an agent construct valid inputs even if the schema were incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens by specifying exactly when to use the tool: when a user has visitors and conversions for a control and variant and needs a statistical significance decision. It also names the computation (pooled two-proportion z-test) and lists outputs, clearly distinguishing this proportion-based calculator from sibling calculators that handle means.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit go conditions ('Use this when...'), explicit exclusions ('Do not use this when the metric is a mean...or there are more than two variants'), and points to chi-square/multiple-comparison procedures as alternatives. This is direct routing guidance with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_ageAge CalculatorARead-onlyIdempotentInspect
Use this when you need someone's exact age on a date, the total number of days lived, the weekday they were born on, or how many days remain until their next birthday. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need the difference between two arbitrary dates with a business-day count (use date-difference) or a countdown to an event (use days-until). What it computes: Computes the exact age on a given date as years, months and days by Gregorian calendar arithmetic, plus total days and weeks, the weekday of birth, and the date of and days until the next birthday. Inputs: birth_date (date); as_of_date (date, optional). Complete JSON argument examples: {"birth_date":"1990-05-17","as_of_date":"2026-09-23"} | {"birth_date":"1985-12-25","as_of_date":"2026-01-10"} Outputs: years, months, days, age_text, total_days [days], total_weeks [weeks], age_decimal_years [years], next_birthday_date, days_until_next_birthday [days], day_of_week_born. Formula: years, months, days = calendar difference birth_date → as_of_date (when the day-of-month is smaller, days are borrowed from the month before as_of_date); total_days = as_of_date − birth_date; total_weeks = total_days / 7; age_decimal_years = total_days / 365.2425; next_birthday = first (month, day) of birth on or after as_of_date Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/age with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/everyday/age.md
| Name | Required | Description | Default |
|---|---|---|---|
| as_of_date | No | Date on which to evaluate the age; defaults to the current UTC date. | today |
| birth_date | Yes | Date of birth (ISO 8601, YYYY-MM-DD). |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and idempotent, and the description adds rich behavioral detail: the Gregorian calendar arithmetic, weekday-of-birth computation, next-birthday logic, the formula used, and even the REST fallback path. It clearly explains what the tool computes and how.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than necessary for a two-parameter tool, but it is well-structured, front-loaded with the primary use case, and every section adds practical value such as output fields, formula, and fallback. It is thorough rather than wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple schema and available output schema, this description is complete: it covers what the tool returns, how the formula works, when the optional parameter defaults, how to call it directly, and where to find documentation. No critical context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters with formats, defaults, and examples, so the description's mention of 'birth_date (date); as_of_date (date, optional)' adds little beyond the schema. The formula does clarify how the parameters interact, but it is more about behavior than parameter-specific semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: computing a person's exact age on a date, along with related calendar facts. It clearly differentiates itself from sibling date tools by listing the exact conditions under which this tool is appropriate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage guidance is explicit: it says when to call this tool ('when you need someone's exact age on a date') and when not to, naming alternatives like date-difference and days-until. This leaves no ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_amortization_scheduleAmortization Schedule CalculatorARead-onlyIdempotentInspect
Use this when you need to see how each payment splits into principal and interest over the life of a mortgage or loan, the balance at the end of each year, or the effect of paying extra every month. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you only need the payment amount (use loan-payment or mortgage-payment), or you know the payment and want the payoff time of a revolving balance (use debt-payoff). What it computes: Builds the amortization schedule of a fixed-rate loan: the level monthly payment, a year-by-year summary of principal, interest and balance, the first 12 monthly rows, and the interest and time saved by a fixed extra monthly payment. Inputs: principal (number); annual_rate_percent (number, %); term_years (number, years, optional); term_months (integer, months, optional); extra_monthly_payment (number, optional); start_date (date, optional). Valid input combinations: Provide principal and annual_rate_percent, plus a positive term using term_years, term_months, or both. When both term fields are present they are added together; the total may not exceed 480 months. Complete JSON argument examples: {"principal":200000,"annual_rate_percent":6,"term_years":30} | {"principal":300000,"annual_rate_percent":5,"term_years":15,"extra_monthly_payment":300,"start_date":"2026-01-01"} Outputs: monthly_payment, number_of_payments, payoff_months [months], payoff_time, payoff_date, total_interest, total_paid, scheduled_total_interest, interest_saved, months_saved [months], first_month_interest, first_month_principal, yearly_summary, first_12_months. Formula: i = annual_rate_percent / 1200; n = 12·term_years + term_months; monthly_payment = principal × i / (1 − (1 + i)^−n) (principal / n if i = 0). Each month: interest = balance × i; principal_paid = monthly_payment + extra_monthly_payment − interest (capped at the balance); balance −= principal_paid, until the balance is 0. Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/amortization-schedule with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/finance/amortization-schedule.md
| Name | Required | Description | Default |
|---|---|---|---|
| principal | Yes | Amount borrowed. | |
| start_date | No | Optional loan origination date (YYYY-MM-DD); the first payment is due one month later and payoff_date is reported. | |
| term_years | No | Loan term in years; added to term_months when both are given. Total term is limited to 40 years. Unit: years. | |
| term_months | No | Additional months of term (e.g. term_months=60 alone for a five-year loan). Unit: months. | |
| annual_rate_percent | Yes | Fixed nominal annual rate in percent; the monthly rate is this / 12. Unit: %. | |
| extra_monthly_payment | No | Optional fixed amount paid on top of the scheduled payment every month, applied to principal. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds rich behavioral context: it explains the formula, how term_years and term_months are added together with a 480-month cap, that extra_monthly_payment is applied to principal, and it lists all output fields. It also provides a direct REST fallback endpoint, ensuring the agent knows the exact call mechanism.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
While lengthy, every section earns its place: usage guidance, inputs, valid combinations, examples, outputs, formula, and fallback. It is front-loaded with the primary use case and explicit alternatives, making it scannable despite its length. The structure is well-organized and avoids redundancy—each sentence contributes actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 parameters, conditional term fields, multiple outputs, and a formula), the description is thorough. It covers valid input combinations, output fields, the calculation formula, a REST fallback, and a documentation link. Nothing an agent needs to invoke it correctly is missing, especially with an output schema present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema covers 100% of parameters with descriptions, the tool description adds critical semantics: it clarifies the additive relationship between term_years and term_months with a total cap, that extra_monthly_payment is a fixed monthly principal prepayment, and it gives concrete JSON examples for two common scenarios. This substantially extends the schema's value and reduces ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what it computes: an amortization schedule showing principal/interest split per payment, year-by-year balance, and the effect of extra payments. It explicitly distinguishes this from siblings like 'loan-payment' and 'mortgage-payment' by naming them, and from 'debt-payoff' for revolving balances, making the tool's scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance (when you need the full schedule, year-end balances, or extra-payment effect) and when-not-to-use guidance with named alternatives (use loan-payment or mortgage-payment for only the payment amount, use debt-payoff for revolving balance payoff time). It also instructs the agent to call the tool directly rather than compute from memory, clarifying its role as a definitive calculator.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_bazi_four_pillarsBazi Four Pillars (八字)ARead-onlyIdempotentInspect
Use this when you need the four stem-branch pillars (年柱 月柱 日柱 时柱) of a birth moment, the day master and its ten-god relations, element balance, or the start age and sequence of the 大运 luck pillars. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you only need the lunar date or zodiac of a date (use lunar-calendar-converter or chinese-zodiac), the stem-branch of a single date without an hour (use sexagenary-cycle), or an interpretation of the chart — this tool computes the traditional chart only and gives no predictions. What it computes: Builds the Bazi (八字, Bāzì) / Four Pillars (四柱) chart of a birth date and time: year pillar by 立春 (Lìchūn), month pillar by the 节 (jié) solar terms, day pillar from the sexagenary day count, hour pillar by the 五鼠遁 (Wǔshǔdùn) rule, plus day master, five-element counts, ten gods (十神), hidden stems (藏干), 纳音 (nàyīn), void branches (空亡) and the ten-year luck pillars (大运). Inputs: birth_date (date); birth_time (string); sex (enum); utc_offset_hours (number, h, optional); longitude_degrees (number, °, optional); late_zi_next_day (boolean, optional); include_hidden_stems (boolean, optional). Complete JSON argument examples: {"birth_date":"1990-05-17","birth_time":"08:30","sex":"male","utc_offset_hours":8} | {"birth_date":"2000-01-01","birth_time":"00:30","sex":"female","utc_offset_hours":8} Outputs: bazi_chart, year_pillar, month_pillar, day_pillar, hour_pillar, pillars_pinyin, pillars_english, day_master, zodiac, five_element_counts, missing_elements, dominant_element, ten_gods, hidden_stems, nayin, void_branches, luck_direction, luck_start_age, luck_start_age_years [years], luck_pillars, lunar_birth_date, solar_term_context, time_used, notes. Formula: year = solarYearAtLichun(birth instant); month stem = ((year stem mod 5) × 2 + 2 + months since 寅) mod 10; day index = (JDN + 49) mod 60; hour stem = ((day stem mod 5) × 2 + hour branch) mod 10; hour branch = floor(((hour + 1) mod 24) / 2); true solar time = clock + (longitude − 15 × utc_offset) × 4 min + equation of time; 起运 years = days to 节 / 3 Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/bazi-four-pillars with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/lunar/bazi-four-pillars.md
| Name | Required | Description | Default |
|---|---|---|---|
| sex | Yes | Sex, used only for the direction of the luck pillars (阳年男/阴年女 forward, 阴年男/阳年女 backward). | |
| birth_date | Yes | Gregorian civil date of birth in the local clock time of the birthplace (1900–2100). | |
| birth_time | Yes | Local clock time of birth, 24-hour HH:MM. 23:00–00:59 is 子时 (Zǐ hour). | |
| late_zi_next_day | No | true: 23:00–23:59 belongs to the next day's 子时 and the day pillar advances at 23:00. false: 晚子时 convention — the day pillar stays, only the hour stem is taken from the next day. | |
| utc_offset_hours | No | Time-zone offset of birth_time in hours (China Standard Time = 8; use the historical zone in force at birth). Unit: h. | |
| longitude_degrees | No | Optional east-positive longitude. When given, the clock time is converted to true solar time: correction = (longitude − 15 × utc_offset_hours) × 4 min + equation of time. Unit: °. | |
| include_hidden_stems | No | Add the hidden stems (藏干) of the four branches to the element count with weights 1.0 (main), 0.5 (middle) and 0.3 (residual). |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses that the tool 'computes the traditional chart only and gives no predictions,' and provides exact formulas for true solar time and start-age calculation. It also explains conventions like late-zi behavior and hidden-stem weights, giving the agent a precise model of what will happen.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured into labeled sections: use, don't-use, what it computes, inputs, examples, outputs, formula, REST fallback. Core purpose is front-loaded. Some redundancy exists (e.g., the output list could arguably be shortened given the output schema exists), but every section serves an operational purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 7 parameterscm an output schema, and multiple conventions, the description is exceptionally complete. It covers inputs, outputs, formula, examples, REST fallback, and when to avoid the tool. An agent has everything needed to invoke it correctly without external knowledge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already describes each parameter. The description's added value comes from the formula that connects parameters (e.g., true solar time = clock + (longitude − 15 × utc_offset) × 4 min + equation of time) and the complete JSON examples showing how inputs are combined. This goes beyond the schema without repeating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states specifically that the tool computes the four stem-branch pillars, day master, element balance, ten gods, hidden stems, and luck pillars. It also explicitly differentiates from sibling tools like lunar-calendar-converter, chinese-zodiac, and sexagenary-cycle, so an agent can tell exactly what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance: 'Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.' It also lists concrete 'Do not use this when...' cases with named alternatives (lunar-calendar-converter, chinese-zodiac, sexagenary-cycle, and chart interpretation tools), leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_bmiBMI CalculatorARead-onlyIdempotentInspect
Use this when you need an adult's BMI, its WHO/CDC weight category, or the weight range that corresponds to a normal BMI (18.5–24.9) for a given height. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when the person is under 20 years old (children need age- and sex-specific BMI percentiles), or you need body-fat percentage (use body-fat) or calorie needs (use bmr / tdee). What it computes: Computes body mass index (BMI) from weight and height and classifies it with the WHO adult categories, plus the healthy weight range for that height. Inputs: weight_kg (number, kg); height_cm (number, cm). Complete JSON argument examples: {"weight_kg":70,"height_cm":175} | {"weight_kg":95,"height_cm":180} Outputs: bmi [kg/m²], category, healthy_weight_min_kg [kg], healthy_weight_max_kg [kg], prime. Formula: BMI = weight_kg / (height_cm / 100)² Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/bmi with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/health/bmi.md
| Name | Required | Description | Default |
|---|---|---|---|
| height_cm | Yes | Standing height in centimetres. Unit: cm. | |
| weight_kg | Yes | Body weight in kilograms. Unit: kg. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and idempotentHint=true annotations already covering the safety profile, the description adds meaningful behavioral context: it restricts the tool to adults, confirms it computes rather than looks up values, and documents the output fields and formula. It does not mention auth or rate limits, but those are not critical for a pure calculation API, and it does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although the description is longer than many tool definitions, every block earns its place: usage, exclusions, computation summary, inputs, outputs, formula, REST fallback, and docs link. It is front-loaded with the most decision-critical information (when to use and when not to use) and then systematically provides call details. No word is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward calculation tool with only two required parameters and an existing output schema, the description covers every facet an agent needs: precise use cases, age restriction, alternatives, input examples, output field names, the underlying formula, and even a REST fallback endpoint. There is no ambiguity about when or how to invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already provides full descriptions, units, examples, and value bounds for weight_kg and height_cm. The description's 'Inputs' line only repeats the parameter names and units, adding no meaningful semantic depth. The complete JSON examples provide mild format guidance, but this does not elevate the score above the baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource list: 'an adult's BMI, its WHO/CDC weight category, or the weight range that corresponds to a normal BMI'. It clearly differentiates itself from siblings like calculate_bmr and calculate_tdee by explicitly naming them as alternatives for calorie needs, and it excludes children under 20. An agent can immediately tell what this tool does and what it is not for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description contains an explicit 'Use this when...' phrase followed by a 'Do not use this when...' section that lists concrete exclusions (under-20 age, body-fat percentage, calorie needs) and names the sibling tools to use instead. This is the gold standard for usage guidance; nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_bmrBMR CalculatorARead-onlyIdempotentInspect
Use this when you need resting daily calorie needs for an adult from sex, weight, height and age, as a base for diet or TDEE calculations. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need total daily calories including activity (use tdee), the person is a child, pregnant, or has very high muscle mass (use a body-fat based equation such as Katch-McArdle instead). What it computes: Estimates basal metabolic rate (calories burned at complete rest per day) with the Mifflin-St Jeor equation, and also reports the revised Harris-Benedict estimate. Inputs: sex (enum); weight_kg (number, kg); height_cm (number, cm); age_years (number, years). Complete JSON argument examples: {"sex":"male","weight_kg":70,"height_cm":175,"age_years":30} | {"sex":"female","weight_kg":60,"height_cm":165,"age_years":40} Outputs: bmr_kcal_per_day [kcal/day], harris_benedict_kcal_per_day [kcal/day], bmr_kj_per_day [kJ/day]. Formula: Mifflin-St Jeor: BMR = 10·weight_kg + 6.25·height_cm − 5·age_years + 5 (male) or − 161 (female). Harris-Benedict (1984): male 88.362 + 13.397·W + 4.799·H − 5.677·A; female 447.593 + 9.247·W + 3.098·H − 4.330·A. Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/bmr with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/health/bmr.md
| Name | Required | Description | Default |
|---|---|---|---|
| sex | Yes | Biological sex used to select the formula coefficients. | |
| age_years | Yes | Age in years (adults only). Unit: years. | |
| height_cm | Yes | Height in centimetres. Unit: cm. | |
| weight_kg | Yes | Body weight in kilograms. Unit: kg. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, non-destructive traits. The description adds significant behavioral detail: the exact equations used (Mifflin-St Jeor and revised Harris-Benedict), the output fields, and even a fallback REST endpoint with explicit instructions not to guess other paths. This far exceeds what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with clear section headings (Inputs, Outputs, Formula, Direct REST fallback). Every sentence adds value, though it could be trimmed slightly by omitting the full formulas, which are unlikely to be needed by an agent for calling the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema and output schema, the description provides everything an agent needs: exact inputs, outputs, examples, a fallback path, and documentation link. No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all parameters with descriptions and units, but the description adds a compact parameter list with types and units, plus two complete JSON examples. This reinforces and clarifies the schema without redundancy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear, specific purpose: estimating resting daily calorie needs for adults from sex, weight, height, and age. It explicitly contrasts with sibling tools like calculate_tdee, making its scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use (base for diet or TDEE) and when-not-to-use guidance (children, pregnancy, high muscle mass) with named alternatives (tdee, Katch-McArdle). This is exemplary routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_circle_propertiesCircle CalculatorARead-onlyIdempotentInspect
Use this when you know a circle's radius or diameter and need its area, circumference or the other dimension. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when the shape is an ellipse (use ellipse), a solid ball (use sphere) or a disc with thickness (use cylinder). What it computes: Computes the area, circumference, diameter and radius of a circle from either its radius or its diameter. Lengths are unit-agnostic: the area is in the square of the input unit. Example user requests: Calculate the area and circumference of a circle with radius 3. | A circle has diameter 10; return its radius, circumference and area. Inputs: radius (number, units, optional); diameter (number, units, optional). Valid input combinations: Provide at least one of radius or diameter. You may provide both when diameter equals 2 × radius; conflicting values are rejected. Complete JSON argument examples: {"radius":3} | {"diameter":10} Outputs: radius [units], diameter [units], circumference [units], area [units²]. Formula: r = radius (or diameter / 2); diameter = 2·r; circumference = 2·π·r; area = π·r² Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/circle with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/geometry/circle.md
| Name | Required | Description | Default |
|---|---|---|---|
| radius | No | Radius of the circle. Give either radius or diameter. Unit: units. | |
| diameter | No | Diameter of the circle (2 × radius). Used when radius is not given. Unit: units. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive; the description adds meaningful behavioral detail: unit-agnostic lengths, area in square units, rejection of conflicting radius/diameter values, the formula, and a REST fallback. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but tightly organized with labeled sections: use case, exclusions, inputs, examples, outputs, formula, and fallback. Every section earns its place and the most important guidance is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given only two parameters and the presence of an output schema, the description is complete: it covers input requirements, valid combinations, outputs, the formula, exclusions, and even documentation and fallback URLs. Nothing needed to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the input schema already covers both parameters (100% coverage), the description adds meaning beyond the schema: valid input combinations, the requirement that both values be consistent, unit-agnostic behavior, and output units. These details help the agent construct correct calls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it computes area, circumference, diameter, and radius from either radius or diameter. It also explicitly positions itself among many calculate_* siblings by naming the circle case and giving example user requests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It opens with an explicit 'Use this when...' condition and gives clear exclusions with alternatives: 'Do not use this when the shape is an ellipse (use ellipse), a solid ball (use sphere) or a disc with thickness (use cylinder).' This gives the agent both inclusion and exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_compound_interestCompound Interest CalculatorARead-onlyIdempotentInspect
Use this when you need to project a savings account, certificate of deposit or investment balance from a starting amount, an annual rate, a term and optional monthly deposits. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when interest is not reinvested (use simple-interest), you need the deposit required to hit a target (use savings-goal), or you are repaying a loan (use loan-payment). What it computes: Computes the future balance of a principal earning compound interest at a chosen compounding frequency, optionally with a fixed deposit at the end of every month, and splits the result into contributions and interest. Inputs: principal (number); annual_rate_percent (number, %); years (number, years); compounding_frequency (enum, optional); monthly_contribution (number, optional). Complete JSON argument examples: {"principal":10000,"annual_rate_percent":5,"years":10,"compounding_frequency":"monthly"} | {"principal":5000,"annual_rate_percent":6,"years":20,"compounding_frequency":"monthly","monthly_contribution":100} Outputs: final_balance, total_contributions, total_interest, effective_annual_rate_percent [%], growth_multiple. Formula: A = principal × (1 + r/n)^(n·years) with r = annual_rate_percent/100 and n periods per year. Contributions: i_m = (1 + r/n)^(n/12) − 1, m = 12·years, FV_contrib = monthly_contribution × ((1 + i_m)^m − 1) / i_m (m × contribution when r = 0). final_balance = A + FV_contrib. Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/compound-interest with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/finance/compound-interest.md
| Name | Required | Description | Default |
|---|---|---|---|
| years | Yes | Length of the investment in years; fractional years allowed (2.5 = 30 months). Unit: years. | |
| principal | Yes | Starting amount deposited or invested, in any currency. | |
| annual_rate_percent | Yes | Nominal annual rate (APR) in percent; 5 means 5 %. Unit: %. | |
| monthly_contribution | No | Optional fixed deposit made at the end of every month, compounded at the effective monthly rate implied by compounding_frequency. | |
| compounding_frequency | No | How often interest is credited: n = 1, 2, 4, 12, 52 or 365 periods per year. | monthly |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/destructive annotations, the description discloses the exact formula, the treatment of monthly contributions (including zero-rate edge case), the effective annual rate and growth multiple outputs, and a direct REST fallback path. This is rich behavioral context with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but well-structured with labeled sections and front-loaded usage guidance. The formula, examples, and REST fallback each earn their place, though the output/input lists mildly duplicate schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter calculator with rich annotations, output schema, and sibling tools, the description fully equips an agent: usage rules, parameter semantics, formula, examples, output names, REST fallback, and doc link. Nothing essential for correct selection or invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds value by explaining the contribution formula, defining i_m, clarifying compounding_frequency maps to n values, and providing complete JSON examples. This goes beyond the schema's per-field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with a specific verb-plus-resource: projecting a savings account, certificate of deposit, or investment balance from principal, annual rate, term, and optional monthly deposits. It also names sibling alternatives (simple-interest, savings-goal, loan-payment) and states what the tool computes, including the contribution/interest split, clearly distinguishing it from other calculators.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains explicit when-to-use guidance ('Use this when you need to project...'), a direct call instruction, and explicit when-not-to-use exclusions with named alternatives for non-reinvested interest, savings-goal planning, and loan repayment. This leaves no ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_date_differenceDate Difference CalculatorARead-onlyIdempotentInspect
Use this when you need the number of days, weeks or working days between two dates, or a calendar-style 'x years y months z days' difference. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you want to add or subtract a number of days from a date (use add-days), or you need an age with the next birthday (use age). What it computes: Counts the days between two ISO dates and expresses the gap as weeks and days, as a calendar breakdown in years, months and days, and as business days (Monday–Friday, public holidays not excluded). Inputs: start_date (date); end_date (date); include_end_date (boolean, optional). Complete JSON argument examples: {"start_date":"2026-01-01","end_date":"2026-12-25"} | {"start_date":"2025-11-05","end_date":"2026-03-15","include_end_date":true} Outputs: days [days], weeks [weeks], remaining_days [days], weeks_and_days, calendar_years, calendar_months, calendar_days, calendar_text, business_days [days]. Formula: days = end_date − start_date (+1 if include_end_date); weeks = floor(days / 7); remaining_days = days mod 7; business_days = number of Mon–Fri dates in [start_date, end_date) or [start_date, end_date] when inclusive; calendar breakdown = whole years, months, then days borrowed from the month before end_date Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/date-difference with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/everyday/date-difference.md
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | Yes | Second date (YYYY-MM-DD). If it is earlier than start_date the dates are swapped and a note is returned. | |
| start_date | Yes | First date (ISO 8601, YYYY-MM-DD). | |
| include_end_date | No | true counts both endpoints (adds one day to days, weeks/days and business_days), e.g. for inclusive rental or leave periods. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and idempotent, and the description adds meaningful behavioral detail beyond that: date swapping when end_date is earlier, business days being Monday–Friday with public holidays not excluded, and the exact formula including the inclusive-endpoint effect. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with clear sections: usage, exclusion, computation, inputs, examples, outputs, formula, fallback, and docs. The most decision-relevant guidance is front-loaded, and each section earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with rich annotations, a complete input schema, and an output schema, the description is exceptionally complete. It covers edge cases, formula, examples, output fields, and even a REST fallback, so an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by spelling out the calculation formula, clarifying how include_end_date changes results, and providing complete JSON examples. Most of the parameter meaning is in the schema, but the formula and business-day definition go beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement of what the tool computes: number of days, weeks, working days, or calendar-style differences between two dates. It also distinguishes itself from nearby concepts like adding/subtracting days and calculating age.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use the tool ('Use this when you need...') and when not to use it, naming alternatives: 'Do not use this when you want to add or subtract a number of days from a date (use add-days), or you need an age with the next birthday (use age).' This is model behavior for routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_depth_of_fieldDepth of Field CalculatorARead-onlyIdempotentInspect
Use this when you need to know how much of a scene is acceptably sharp for given camera settings, or how far sharpness extends in front of and behind the focused subject. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you only need the focus distance that maximises depth of field (use hyperfocal-distance), or you shoot macro above about 0.2× magnification where lens extension and pupil magnification make the thin-lens equations inaccurate. What it computes: Computes the near and far limits of acceptable sharpness, the total depth of field and the hyperfocal distance from focal length, f-number, focus distance and the sensor's circle of confusion, using the standard thin-lens depth-of-field equations. Inputs: focal_length_mm (number, mm); aperture_f (number); focus_distance_m (number, m); sensor (enum, optional); coc_mm (number, mm, optional). Complete JSON argument examples: {"focal_length_mm":50,"aperture_f":2.8,"focus_distance_m":3,"sensor":"full_frame"} | {"focal_length_mm":24,"aperture_f":8,"focus_distance_m":5,"sensor":"full_frame"} Outputs: hyperfocal_m [m], near_limit_m [m], far_limit_m [m], far_limit_text, total_dof_m [m], in_front_of_subject_m [m], behind_subject_m [m], coc_used_mm [mm]. Formula: H = f² / (N·c) + f; near = s·(H − f) / (H + s − 2f); far = s·(H − f) / (H − s) when s < H, otherwise infinity (f = focal_length_mm, N = aperture_f, c = coc_mm, s = focus_distance_m × 1000, all in mm) Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/depth-of-field with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/photography/depth-of-field.md
| Name | Required | Description | Default |
|---|---|---|---|
| coc_mm | No | Optional acceptable circle-of-confusion diameter; overrides the preset value (full frame 0.030, APS-C 0.020, Micro Four Thirds 0.015, 1-inch 0.011 mm). Unit: mm. | |
| sensor | No | Sensor format; selects the circle of confusion (0.030 mm full frame, 0.020 mm APS-C, 0.015 mm Micro Four Thirds ...). | full_frame |
| aperture_f | Yes | Lens f-number, e.g. 2.8 for f/2.8. | |
| focal_length_mm | Yes | Actual (not equivalent) focal length of the lens in millimetres. Unit: mm. | |
| focus_distance_m | Yes | Distance from the camera's sensor plane to the focused subject in metres. Unit: m. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive behavior. The description adds useful behavioral context: it uses standard thin-lens equations, gives the formula, and notes the macro regime where results become inaccurate. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but it is well structured and front-loaded with the primary use case. Each section—usage, exclusions, inputs, outputs, formula, fallback—serves a real purpose, though a few details like the docs URL are borderline redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a single-purpose calculator with an output schema, the description is complete: required inputs, optional parameters, units, examples, exclusions, formula, and REST fallback path are all present. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by providing complete JSON examples, stating units inline, and explaining the unit conversion in the formula. This makes correct argument construction more certain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a precise resource and outcome: the near/far limits of acceptable sharpness, total depth of field, and hyperfocal distance. It distinguishes itself from the hyperfocal-distance tool and is clearly not generic.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool, when not to use it, and names the alternative (hyperfocal-distance) plus the macro magnification cutoff. It also instructs the agent to call the tool directly rather than compute from memory, which is strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_descriptive_statisticsDescriptive Statistics CalculatorARead-onlyIdempotentInspect
Use this when you have a set of numeric observations and need its central tendency, spread or quartiles, e.g. the standard deviation of a data set. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need a single percentile or the percentile rank of one value (use percentile), a standardised score (use z-score), or statistics of two paired variables (use correlation or linear-regression). What it computes: Computes summary statistics for a list of numbers: count, sum, mean, median, mode, range, sample and population variance and standard deviation, standard error, coefficient of variation, quartiles (linear interpolation) and skewness. Inputs: values (number_list). Complete JSON argument examples: {"values":[2,4,4,4,5,5,7,9]} | {"values":[4,8,15,16,23,42]} Outputs: count, sum, mean, median, mode, mode_count, min, max, range, sample_variance, sample_std_dev, population_variance, population_std_dev, standard_error, coefficient_of_variation_percent [%], q1, q3, iqr, skewness. Formula: mean = Σx / n; sample_variance = Σ(x − mean)² / (n − 1); population_variance = Σ(x − mean)² / n; standard_error = s / √n; CV% = 100·s / mean; quartile at p: rank = p·(n − 1), value = x(⌊rank⌋) + (rank − ⌊rank⌋)·(x(⌊rank⌋+1) − x(⌊rank⌋)) on sorted data; skewness G1 = n / ((n − 1)(n − 2)) · Σ((x − mean) / s)³ Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/descriptive-statistics with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/statistics/descriptive-statistics.md
| Name | Required | Description | Default |
|---|---|---|---|
| values | Yes | The data set, as a list of numbers (comma-separated or JSON array). At least 2 values are needed for sample statistics. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only and idempotent annotations, the description discloses the full set of computed statistics, the quartile interpolation convention, sample vs population variance formulas, standard error, coefficient of variation, and skewness method. This precisely characterizes the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but it is structured into labeled sections and front-loaded with usage guidance, making the detail scannable. The formula block and REST fallback add value, though a slightly shorter version would still be clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one simple parameter, a detailed output list, and safety annotations, the description covers use cases, exclusions, calculation methods, outputs, and a fallback endpoint. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents values with type, examples, and the minimum two-value requirement, so the description adds little parameter-level meaning. The JSON examples are useful but largely duplicate what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource scope: use when numeric observations need central tendency, spread, or quartiles. It lists exactly what is computed and explicitly differentiates itself from percentile, z-score, correlation, and linear-regression siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use and when-not-to-use conditions, naming precise alternative tools for percentiles, z-scores, and paired-variable statistics. It also instructs the agent to call the tool directly and return its calculation rather than deriving it from memory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_fraction_arithmeticFraction CalculatorARead-onlyIdempotentInspect
Use this when you need an exact result of an operation on two fractions (e.g. 3/4 + 1/6), including mixed numbers such as 1 1/2, rather than a rounded decimal. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you only want to reduce a single fraction or convert it to a decimal or percent (use fraction-simplifier), or you need the least common denominator of several denominators (use gcd-lcm). What it computes: Adds, subtracts, multiplies or divides two fractions, mixed numbers, whole numbers or decimals with exact integer arithmetic, returning the result in lowest terms, as a mixed number and as a decimal, with the intermediate steps. Inputs: fraction_a (string); fraction_b (string); operation (enum, optional). Complete JSON argument examples: {"fraction_a":"3/4","fraction_b":"1/6","operation":"add"} | {"fraction_a":"2 1/3","fraction_b":"5/6","operation":"subtract"} Outputs: result, mixed_number, numerator, denominator, decimal, working. Formula: a/b + c/d = (a·(L/b) + c·(L/d)) / L with L = lcm(b, d), a/b − c/d likewise; a/b × c/d = (a·c) / (b·d); a/b ÷ c/d = (a·d) / (b·c); the result is divided by gcd(numerator, denominator) Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/fraction-arithmetic with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/math/fraction-arithmetic.md
| Name | Required | Description | Default |
|---|---|---|---|
| operation | No | Operation applied as fraction_a (operation) fraction_b. | add |
| fraction_a | Yes | First operand: a fraction '3/4', a mixed number '1 1/2' or '-1 1/2', a whole number '5' or a decimal '0.75'. | |
| fraction_b | Yes | Second operand in the same formats. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses exact integer arithmetic, lowest-term reduction, mixed-number and decimal outputs, intermediate steps, and a REST fallback. This materially helps the agent predict behavior and result format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and organized into labeled sections. It is slightly long because the formula and REST fallback go beyond what is required for basic invocation, though they are not irrelevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description still covers usage boundaries, accepted operand forms, JSON examples, output fields, and a fallback path. No critical information needed to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% description coverage for all three parameters, including examples, defaults, and accepted formats. The description mostly restates the parameter names and adds a formula, which is useful context but not essential parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a precise use case: exact arithmetic on two fractions or mixed numbers instead of a rounded decimal, and the description clarifies the four supported operations. This clearly distinguishes it from the many sibling calculator tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit 'use this when' and 'do not use this when' conditions with named alternatives (fraction-simplifier, gcd-lcm) and instructs the agent to call the tool directly rather than compute from memory. This leaves little ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_haversine_distanceHaversine Distance CalculatorARead-onlyIdempotentInspect
Use this when you need the straight-line distance between two GPS coordinates or cities, e.g. for flight distance, range checks or geofencing. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need road distance, or ellipsoidal accuracy better than about 0.5 % (use a geodesic method such as Vincenty or Karney on WGS-84); for bearings and compass points use compass-bearing. What it computes: Computes the great-circle (as-the-crow-flies) distance between two points on a spherical Earth with the haversine formula, in kilometres, miles and nautical miles, together with the initial bearing, compass direction and the midpoint of the route. Inputs: lat1 (number, °); lon1 (number, °); lat2 (number, °); lon2 (number, °). Complete JSON argument examples: {"lat1":-33.8688,"lon1":151.2093,"lat2":35.6762,"lon2":139.6503} | {"lat1":50.06639,"lon1":-5.71472,"lat2":58.64389,"lon2":-3.07} Outputs: distance_km [km], distance_miles [mi], distance_nautical_miles [nmi], central_angle_degrees [°], initial_bearing_degrees [°], compass_direction, midpoint_lat [°], midpoint_lon [°]. Formula: a = sin²(Δφ/2) + cos φ1 · cos φ2 · sin²(Δλ/2); c = 2 · atan2(√a, √(1−a)); d = R · c with R = 6371.0088 km; θ = atan2(sin Δλ · cos φ2, cos φ1 · sin φ2 − sin φ1 · cos φ2 · cos Δλ) Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/haversine-distance with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/time/haversine-distance.md
| Name | Required | Description | Default |
|---|---|---|---|
| lat1 | Yes | Latitude of point 1 in decimal degrees (north positive, south negative). Unit: °. | |
| lat2 | Yes | Latitude of point 2 in decimal degrees (north positive, south negative). Unit: °. | |
| lon1 | Yes | Longitude of point 1 in decimal degrees (east positive, west negative). Unit: °. | |
| lon2 | Yes | Longitude of point 2 in decimal degrees (east positive, west negative). Unit: °. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond that: it uses a spherical-Earth approximation, outputs the initial bearing and midpoint in addition to distance, lists exact output units, and gives a clear accuracy caveat of roughly 0.5%.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with use guidance and is well-structured with clear sections for inputs, outputs, formula, REST fallback, and docs. It is longer than strictly necessary because of the formula block and documentation links, but each section serves a practical purpose and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a pure calculation tool with strong annotations, four well-documented parameters, and an output schema, the description covers everything an agent needs to invoke it correctly: when to use it, when not to, input examples, full output semantics, the computational model, and even a REST fallback path. No meaningful gap is apparent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers all four parameters in detail with units, ranges, and examples, so the baseline is 3. The description restates the parameters and units and provides complete JSON examples, but these largely duplicate what the schema already offers rather than adding new semantic information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that this tool computes the straight-line (great-circle) distance between two GPS coordinates or cities, with examples of use cases like flight distance and geofencing. It also distinguishes itself from road distance, geodesic methods, and bearing-only tools, making its purpose unambiguous relative to alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit 'Use this when...' and 'Do not use this when...' guidance, including concrete alternatives such as Vincenty/Karney on WGS-84 for ellipsoidal accuracy and compass-bearing for bearing-only needs. It even instructs the agent to call the tool directly rather than answering from memory or stopping at discovery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_kinetic_energyKinetic Energy CalculatorARead-onlyIdempotentInspect
Use this when you need the energy of motion of an object of known mass and speed (vehicle, projectile, ball), for example to compare impact or braking energies. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when rotation contributes significantly (rotational energy ½·I·ω² is not included), speeds approach the speed of light (relativistic formula needed), or you need energy from height (use potential-energy). What it computes: Computes the translational kinetic energy of a moving mass from KE = ½·m·v², reported in joules, kilojoules, kilowatt-hours and kilocalories. Inputs: mass_kg (number, kg); velocity_m_s (number, m/s). Complete JSON argument examples: {"mass_kg":1200,"velocity_m_s":25} | {"mass_kg":0.145,"velocity_m_s":40} Outputs: kinetic_energy_j [J], kinetic_energy_kj [kJ], kinetic_energy_kwh [kWh], kinetic_energy_kcal [kcal], velocity_km_h [km/h]. Formula: KE = ½ × mass_kg × velocity_m_s²; kJ = J / 1000; kWh = J / 3,600,000; kcal = J / 4184 Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/kinetic-energy with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/physics/kinetic-energy.md
| Name | Required | Description | Default |
|---|---|---|---|
| mass_kg | Yes | Mass of the moving object in kilograms. Unit: kg. | |
| velocity_m_s | Yes | Speed in metres per second (km/h ÷ 3.6, mph × 0.44704). Limited to 10 % of the speed of light, below which the classical formula is accurate to within 1 %. Unit: m/s. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: it reports results in multiple units (J, kJ, kWh, kcal), includes a velocity conversion output (velocity_km_h), and provides a direct REST fallback path. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (when to use, when not to use, what it computes, inputs, outputs, formula, REST fallback). It is longer than minimal, but every section adds practical information for an agent. The front-loaded usage guidance is the most important part and appears first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a calculation tool: it covers the formula, input units, output units, example JSON, and even a REST fallback. The output schema exists, so return values are already structured. The only minor gap is that it doesn't explicitly state the precision/rounding behavior, but that is not essential for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters well. The description adds value by restating the formula, giving complete JSON examples, and clarifying the velocity conversion (km/h ÷ 3.6, mph × 0.44704) in the schema. The description also reinforces the physical meaning of each parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('compute'), a specific resource ('translational kinetic energy of a moving mass'), and the formula (KE = ½·m·v²). It also distinguishes itself from potential-energy and rotational-energy cases, making it easy for an agent to select this tool over siblings like calculate_bmi or calculate_compound_interest.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool ('when you need the energy of motion of an object of known mass and speed'), and when not to use it (rotation, relativistic speeds, height/potential energy). It even names the alternative concept (potential-energy) and instructs the agent to call the tool directly rather than answering from memory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_loan_paymentLoan Payment CalculatorARead-onlyIdempotentInspect
Use this when you need the monthly payment or total interest cost of an auto, personal, student or other fixed-rate installment loan given its amount, APR and term. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need property tax, insurance and HOA in the payment (use mortgage-payment), or you know the payment and want the payoff time (use debt-payoff). What it computes: Computes the level monthly payment of a fully amortizing fixed-rate loan from principal, annual rate and term, plus the total paid and total interest over the life of the loan. Example user requests: For a 100000 loan at 6% fixed for 5 years, calculate the monthly payment and total interest. | What will I pay each month on a 420000 loan at 6.15% for 25 years? | 6000 元零利率分 12 个月偿还,每月和总计是多少? Inputs: principal (number); annual_rate_percent (number, %); term_years (number, years, optional); term_months (integer, months, optional). Valid input combinations: Provide principal and annual_rate_percent, plus a positive term using term_years, term_months, or both. When both term fields are present they are added together. Complete JSON argument examples: {"principal":200000,"annual_rate_percent":6,"term_years":30} | {"principal":25000,"annual_rate_percent":7,"term_months":60} Outputs: monthly_payment, number_of_payments, total_payment, total_interest, payoff_summary. Formula: i = annual_rate_percent / 1200; n = 12·term_years + term_months; monthly_payment = principal × i / (1 − (1 + i)^−n); if i = 0, monthly_payment = principal / n. total_payment = monthly_payment × n; total_interest = total_payment − principal. Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/loan-payment with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/finance/loan-payment.md
| Name | Required | Description | Default |
|---|---|---|---|
| principal | Yes | Amount borrowed. | |
| term_years | No | Loan term in years; fractional values allowed. Added to term_months when both are given. Unit: years. | |
| term_months | No | Additional months of term (e.g. term_months=60 alone for a 5-year auto loan). Unit: months. | |
| annual_rate_percent | Yes | Nominal annual rate in percent; the monthly rate is this / 12. 0 is allowed for interest-free loans. Unit: %. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey readOnlyHint and idempotentHint, and the description adds substantial behavioral context: the fully amortizing level-payment method, zero-rate interest handling, the exact formula, and that term_years and term_months are additive. No contradiction exists between the description and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: usage routing, computation summary, examples, input combination rules, JSON examples, output fields, formula, and REST fallback. It is front-loaded with the most critical selection guidance and structured with clear labels, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite the presence of an output schema, the description still lists outputs and gives the formula for all edge cases (including zero annual rate). It also provides a direct REST fallback and documentation link biscuits. An agent has everything needed to invoke the tool correctly across all valid input scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers all parameters at 100% with descriptions, so the baseline is 3. The description adds value by stating valid input combinations (term_years, term_months, or both summed) and providing two complete JSON examples, going beyond the individual parameter descriptions but not dramatically.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('compute the monthly payment or total interest cost') and a clear resource ('auto, personal, student or other fixed-rate installment loan'). It differentiates itself from siblings by explicitly naming mortgage-payment and debt-payoff, so an agent can select it correctly without inspecting other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('Use this when you need...'), when-not-to-use ('Do not use this when you need property tax...'), and direct alternative routing ('use mortgage-payment', 'use debt-payoff'). This leaves no ambiguity about tool selection for amortizing fixed-rate loans.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_molar_massMolar Mass CalculatorARead-onlyIdempotentInspect
Use this when you have a chemical formula and need its molar mass (molecular weight), the number of atoms of each element, or its elemental mass-percent composition. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you already know the molar mass and want to convert between grams and moles (use moles-mass) or need a solution concentration (use molarity). What it computes: Parses a chemical formula (including brackets, nested groups and hydrates) and sums IUPAC 2021 standard atomic weights to give the molar mass in g/mol, plus the atom count and mass-percent composition of each element. Inputs: formula (string). Complete JSON argument examples: {"formula":"C6H12O6"} | {"formula":"CuSO4·5H2O"} Outputs: molar_mass_g_mol [g/mol], molecular_mass_da [Da], atom_count, element_count, composition. Formula: molar_mass = Σ (atomic_weight_i × count_i); mass_fraction_percent_i = 100 × atomic_weight_i × count_i / molar_mass Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/molar-mass with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/chemistry/molar-mass.md
| Name | Required | Description | Default |
|---|---|---|---|
| formula | Yes | Chemical formula with case-sensitive element symbols, integer subscripts, brackets and optional hydrate dot, e.g. C6H12O6, Ca(OH)2, Fe2(SO4)3, CuSO4·5H2O. A trailing charge (NH4+, SO4^2-) or state (aq) is ignored. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior. The description adds concrete behavioral context: parsing rules (brackets, nested groups, hydrates), use of IUPAC 2021 atomic weights, and the full list of computed outputs. It exceeds what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: usage conditions, computation behavior, input, examples, outputs, formula, REST fallback, and docs. It is front-loaded with the use case and structured with clear labels. Some redundancy exists (examples appear in both description and schema), but overall it is efficiently organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter calculator with an output schema and safety annotations, the description covers all necessary context: when to use, what it computes, how inputs are interpreted, what outputs to expect, and even a fallback REST call. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description restates the input as 'formula (string)' and gives examples that duplicate the schema's examples, but it does add minor context about brackets, nested groups, and hydrates parsing. This is helpful but not substantial beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the exact trigger condition: having a chemical formula and needing molar mass, atom counts, or mass-percent composition. The verb 'calculate' and resource 'chemical formula' are explicit, and the description distinguishes this from other calculators.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear 'Use this when' and 'Do not use this when' guidance, naming alternative tools (moles-mass, molarity) and even instructing the agent to return the calculation rather than answering from memory. This leaves no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_mortgage_paymentMortgage Payment CalculatorARead-onlyIdempotentInspect
Use this when you want the monthly cost of buying a home with a fixed-rate mortgage, including escrowed taxes and insurance, or the total interest over the loan. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when the loan is adjustable-rate or interest-only, or you only need the payment on a plain loan amount (use loan-payment). What it computes: Computes the monthly principal-and-interest payment of a fixed-rate mortgage from home price, down payment, rate and term, then adds property tax, home insurance and HOA dues to give the full monthly housing payment and lifetime interest. Inputs: home_price (number); down_payment (number, optional); annual_rate_percent (number, %); term_years (number, years, optional); annual_property_tax (number, optional); annual_home_insurance (number, optional); monthly_hoa (number, optional). Complete JSON argument examples: {"home_price":250000,"down_payment":50000,"annual_rate_percent":6,"term_years":30,"annual_property_tax":3000,"annual_home_insurance":1200} | {"home_price":400000,"down_payment":80000,"annual_rate_percent":6.5,"term_years":30} Outputs: loan_amount, loan_to_value_percent [%], monthly_principal_and_interest, monthly_property_tax, monthly_insurance, monthly_hoa_fee, total_monthly_payment, number_of_payments, total_interest, total_of_payments, payoff_summary. Formula: loan_amount = home_price − down_payment; i = annual_rate_percent / 1200; n = 12·term_years; P&I = loan_amount × i / (1 − (1 + i)^−n) (loan_amount / n if i = 0); total_monthly_payment = P&I + annual_property_tax/12 + annual_home_insurance/12 + monthly_hoa. Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/mortgage-payment with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/finance/mortgage-payment.md
| Name | Required | Description | Default |
|---|---|---|---|
| home_price | Yes | Purchase price of the property. | |
| term_years | No | Loan term in years (30 and 15 are the common US terms). Unit: years. | |
| monthly_hoa | No | Monthly homeowners-association or condo fee. | |
| down_payment | No | Cash paid up front; loan_amount = home_price − down_payment. For 20 % of a 250,000 home enter 50000. | |
| annual_property_tax | No | Yearly property tax; one twelfth is added to the monthly payment. | |
| annual_rate_percent | Yes | Fixed note rate in percent; the monthly rate is this / 12. Unit: %. | |
| annual_home_insurance | No | Yearly homeowners insurance premium; one twelfth is added monthly. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds behavioral context by specifying what it computes (P&I, taxes, insurance, HOA, total interest) and provides the formula, without contradicting any annotation. It does not describe side effects (none exist) but goes beyond the annotations by detailing the computation scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long (multiple sections) but well-structured and front-loaded with purpose and usage. It includes inputs, examples, outputs, formula, REST fallback, and docs link. Each section serves a purpose; while it could be tightened, the organization makes it easy to scan and extract key facts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a calculator tool with 7 parameters and a full output schema, the description is exceptionally complete. It covers the computation formula, lists all outputs (matching the schema), gives two complete example JSON payloads, and includes a REST fallback endpoint and documentation link. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema fully describes each parameter. The description lists inputs with units and optionality and provides two complete JSON examples, but this is largely redundant with the schema. It adds the formula relationship (e.g., loan_amount = home_price − down_payment) which is helpful, but since the schema already covers semantics, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it calculates the monthly cost of a fixed-rate mortgage including escrowed taxes/insurance, and the total interest. It explicitly excludes adjustable-rate and interest-only loans, distinguishing itself from the sibling calculate_loan_payment. The scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use (fixed-rate mortgage with escrow) and when-not-to-use conditions (adjustable-rate, interest-only, or plain loan amount, for which it names the alternative calculate_loan_payment). Also instructs the agent to call the tool directly rather than compute manually, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_percentagePercentage CalculatorARead-onlyIdempotentInspect
Use this when you need a percentage of a value, the percentage one value represents of another, or the base value that a part and its percentage imply. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need the percentage change between two values (use percentage-change), a price after a percentage discount (use discount) or a tax amount (use sales-tax). What it computes: Solves the three basic percentage questions (a percentage of a number, what percentage one number is of another, and the whole behind a known part and percentage). Always returns the part, the whole and the percent. Inputs: mode (enum, optional); x (number); y (number). Complete JSON argument examples: {"mode":"percent_of","x":15,"y":240} | {"mode":"is_what_percent","x":30,"y":120} Outputs: result, sentence, part, whole, percent [%]. Formula: percent_of: result = x / 100 × y. is_what_percent: result = x / y × 100. percent_of_what: result = x / (y / 100). In every mode part = percent × whole / 100. Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/percentage with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/math/percentage.md
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | First number: the percent (percent_of) or the part (is_what_percent, percent_of_what). Percents are plain numbers, 15 means 15%. | |
| y | Yes | Second number: the whole (percent_of, is_what_percent) or the percent (percent_of_what). | |
| mode | No | Which percentage question to solve; x and y take the meaning shown in the label of the chosen mode. | percent_of |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds valuable behavioral context: it always returns part, whole, and percent; it instructs the agent to call directly and return the calculation rather than stopping at discovery; and it provides a direct REST fallback with a warning not to guess other paths.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but well-organized: usage guidance first, exclusions second, then computation details, examples, output, formulas, and REST fallback. Some redundancy exists (Inputs/Outputs repeat schema fields), but every section earns its place and the critical routing information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's three-mode complexity, the description covers everything an agent needs: when to use it, what it computes, formulas, examples, output shape, REST fallback, and documentation link. The output schema exists, so return values are further specified. No critical gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by giving complete JSON examples and explicit formulas for each mode, clarifying exactly how x and y are interpreted in each mode. This is more than the schema alone provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('calculate percentage') and enumerates the three distinct percentage questions it solves. It explicitly differentiates from sibling tools like percentage-change, discount, and sales-tax, so an agent can disambiguate without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit 'Use this when' conditions and explicit 'Do not use this when' exclusions that name the correct sibling alternatives (percentage-change, discount, sales-tax). This is textbook usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_percentage_changePercentage Change CalculatorARead-onlyIdempotentInspect
Use this when you have a starting and an ending value and need the percentage increase or decrease, or a symmetric percent difference between two comparable values. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need a percentage of a number (use percentage), an annualised growth rate over several years (use cagr) or an investment return (use roi). What it computes: Computes the relative change from an old value to a new value as a percentage, the signed absolute change, the new/old ratio and the symmetric percent difference. Inputs: old_value (number); new_value (number). Complete JSON argument examples: {"old_value":50,"new_value":65} | {"old_value":80,"new_value":60} Outputs: change_percent [%], absolute_change, direction, ratio, percent_difference [%]. Formula: change_percent = (new_value − old_value) / |old_value| × 100; percent_difference = |new_value − old_value| / ((|new_value| + |old_value|) / 2) × 100 Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/percentage-change with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/math/percentage-change.md
| Name | Required | Description | Default |
|---|---|---|---|
| new_value | Yes | Ending value. | |
| old_value | Yes | Starting (reference) value. Must not be 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint and idempotentHint annotations, the description adds substantial behavioral detail: the exact formulas, the list of computed outputs, the requirement that old_value not be zero, and the REST fallback behavior. It fully discloses what the tool returns and how it calculates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: usage guidance, exclusions, computed outputs, formulas, examples, and REST fallback. It is front-loaded with the most important when-to-use information and uses clear labels for quick scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the schema richness, annotations, and output schema, the description is fully complete. It provides the formula, expected outputs, edge-case constraint for old_value, direct REST endpoint, and documentation link, so an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes both parameters completely, so the baseline is 3. The description adds value with complete JSON examples and the formula expressions that clarify how each parameter is used, though it mostly confirms rather than extends the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool computes: percentage increase/decrease and symmetric percent difference between two values. It also names sibling alternatives like percentage, cagr, and roi, so an agent can distinguish this tool from them immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('when you have a starting and an ending value') and explicit when-not-to-use guidance with named alternatives. It even instructs the agent to call the tool directly rather than answering from memory, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_running_paceRunning Pace CalculatorARead-onlyIdempotentInspect
Use this when you know a distance and the time it took (or a target time) and need the pace, the equivalent speed, or the time that pace gives over standard race distances. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you want a realistic prediction of a longer race from a shorter one (pace slows with distance; use race-time-predictor), or you only need to convert between pace and speed units (use pace-converter). What it computes: Computes running pace in min/km and min/mile and speed in km/h and mph from a distance and elapsed time, and projects the finish time for 5 km, 10 km, half marathon and marathon at that constant pace. Inputs: distance (number); distance_unit (enum, optional); time (string). Complete JSON argument examples: {"distance":10,"distance_unit":"km","time":"50:00"} | {"distance":5,"distance_unit":"mi","time":"45:00"} Outputs: pace_min_per_km [min:sec/km], pace_min_per_mile [min:sec/mi], pace_seconds_per_km [s/km], speed_kmh [km/h], speed_mph [mph], distance_km [km], time_5k [h:mm:ss], time_10k [h:mm:ss], time_half_marathon [h:mm:ss], time_marathon [h:mm:ss]. Formula: pace_s_per_km = time_seconds / distance_km; pace_s_per_mile = pace_s_per_km × 1.609344; speed_kmh = 3600 / pace_s_per_km; speed_mph = speed_kmh / 1.609344; time(D) = pace_s_per_km × D for D = 5, 10, 21.0975, 42.195 km Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/running-pace with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/fitness/running-pace.md
| Name | Required | Description | Default |
|---|---|---|---|
| time | Yes | Elapsed time as h:mm:ss (1:45:00), mm:ss (50:00) or plain minutes (50). | |
| distance | Yes | Distance covered, in the unit given by distance_unit. | |
| distance_unit | No | Unit of the distance input. | km |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds substantial context beyond that: the exact formula, the full output list, the REST fallback path, and the instruction to call the tool directly instead of computing from memory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but exceptionally well structured with bold section labels: inputs, outputs, formula, REST fallback, and docs. Every section earns its place, and the intended use case is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations cover the side-effect profile, the description is complete: it covers when to use it, when not to, all inputs, output fields, the underlying formula, and a fallback endpoint. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value with complete JSON argument examples, the formula relating parameters to outputs, and clarification of time format variants, going slightly beyond what the schema alone provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it 'computes running pace in min/km and min/mile and speed in km/h and mph' and projects finish times. It also clearly distinguishes this tool from siblings race-time-predictor and pace-converter, so an agent can select it confidently.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('Use this when you know a distance and the time...') and explicit when-not-to-use exclusions with named alternatives ('use race-time-predictor', 'use pace-converter'). This leaves no ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_subnetIP Subnet CalculatorARead-onlyIdempotentInspect
Use this when you need to know which subnet an IPv4 address belongs to, the host range and count of a /prefix, or the mask equivalent of a prefix length. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when the address is IPv6, you want to split a block into several subnets (VLSM planning), or you only need a number in binary or hex (use base-converter). What it computes: Computes the network and broadcast addresses, subnet and wildcard masks, first and last host, usable and total addresses, address class and RFC 1918 private status for an IPv4 address in CIDR notation or with a dotted subnet mask, using 32-bit unsigned arithmetic. Inputs: cidr (string). Complete JSON argument examples: {"cidr":"192.168.1.10/26"} | {"cidr":"10.0.0.0 255.0.0.0"} Outputs: ip_address, cidr_notation, network_address, broadcast_address, subnet_mask, wildcard_mask, prefix_length [bits], host_bits [bits], first_host, last_host, usable_hosts, total_addresses, ip_class, is_private, address_scope, binary_mask, binary_address, ip_integer. Formula: mask = 2^32 − 2^(32 − prefix); network = ip AND mask; broadcast = network OR NOT mask; total = 2^(32 − prefix); usable = total − 2 (prefix ≤ 30), 2 (prefix 31), 1 (prefix 32) Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/subnet-calculator with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/developer/subnet-calculator.md
| Name | Required | Description | Default |
|---|---|---|---|
| cidr | Yes | IPv4 address followed by /prefix (0–32) or by a dotted subnet mask separated by a space or slash, e.g. 192.168.1.10/26 or 192.168.1.10 255.255.255.192. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses the exact computation performed (network, broadcast, masks, host ranges), the arithmetic approach (32-bit unsigned), and the formula used. This is rich behavioral context that lets the agent predict results and trust the tool as a non-destructive calculation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with labeled sections (What it computes, Inputs, Outputs, Formula, REST fallback) and front-loaded usage guidance. It is longer than necessary, but every major section contributes useful context such as output fields, computation formula, and API fallback, so the length is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a calculation tool with rich output schema and annotations, the description covers all essential decision points: when to use it, what inputs it accepts, what outputs it returns, how the calculation works, and even a direct REST fallback. Nothing critical is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already explains the cidr parameter's formats and examples in detail. The description reinforces the accepted input forms (CIDR or dotted mask) and the JSON examples, but adds little semantic meaning beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement of what the tool does: determining subnet membership, host range/count, and mask equivalents for IPv4 addresses. It differentiates from the many sibling calculate_* tools by explicitly scoping to IPv4 subnet calculations and naming excluded cases (IPv6, VLSM planning, base conversion).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides an explicit 'Use this when' list and an even more explicit 'Do not use this when' list with alternatives such as base-converter and VLSM planning. It also tells the agent to call the tool directly instead of answering from memory, removing ambiguity about tool orchestration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_tdeeTDEE CalculatorARead-onlyIdempotentInspect
Use this when you need daily maintenance calories for an adult, or calorie targets for a mild/standard deficit or surplus. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when the person is a child, pregnant or breastfeeding, or you only need the resting rate (use bmr). What it computes: Estimates total daily energy expenditure from Mifflin-St Jeor BMR and an activity level, and derives calorie targets for maintaining, losing or gaining weight. Inputs: sex (enum); weight_kg (number, kg); height_cm (number, cm); age_years (number, years); activity_level (enum, optional). Complete JSON argument examples: {"sex":"male","weight_kg":70,"height_cm":175,"age_years":30,"activity_level":"moderate"} Outputs: bmr_kcal_per_day [kcal/day], activity_multiplier, tdee_kcal_per_day [kcal/day], mild_loss_kcal_per_day [kcal/day], loss_kcal_per_day [kcal/day], mild_gain_kcal_per_day [kcal/day], gain_kcal_per_day [kcal/day]. Formula: TDEE = BMR(Mifflin-St Jeor) × activity_multiplier; targets = TDEE ± 250 or ± 500 kcal/day Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/tdee with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/health/tdee.md
| Name | Required | Description | Default |
|---|---|---|---|
| sex | Yes | Biological sex used to select the formula coefficients. | |
| age_years | Yes | Age in years. Unit: years. | |
| height_cm | Yes | Height in centimetres. Unit: cm. | |
| weight_kg | Yes | Body weight in kilograms. Unit: kg. | |
| activity_level | No | Weekly exercise level; maps to the standard activity multipliers 1.2 / 1.375 / 1.55 / 1.725 / 1.9. | moderate |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, idempotent, and non-destructive; the description adds the exact formula, the Mifflin-St Jeor basis, the activity multipliers, and the ±250/±500 derivation of targets. No side effects or edge behaviors are hidden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with usage, then exclusions, computation summary, input list, worked example, output list, formula, and fallback. Each section is short and earns its place, making it scannable despite the amount of information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter calculator with an output schema, the description answers what, when, when-not, inputs, outputs, formula, and provides both REST and docs fallbacks. Nothing an agent needs to select and invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and includes enums, units, bounds, examples, and defaults, so the baseline is 3. The description repeats input names and units and provides a complete JSON example, but adds little parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact resource (TDEE from Mifflin-St Jeor BMR plus activity level) and the supported goals (maintenance, mild/standard deficit/surplus). It also distinguishes the tool from calculate_bmr by explicitly reserving calculate_bmr for resting-rate needs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use ('need daily maintenance calories...' / 'calorie targets for a mild/standard deficit or surplus') and when-not-to-use conditions, including an explicit alternative ('use bmr') and exclusions for children and pregnancy/breastfeeding.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_tipTip CalculatorARead-onlyIdempotentInspect
Use this when you need to add a gratuity to a restaurant, delivery or service bill and optionally divide the total among several people. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when people pay for different items or unequal shares (use bill-split), or you need to add sales tax rather than a tip (use sales-tax). What it computes: Computes the tip from a bill amount and tip percentage, the total including tip, and the per-person share when the bill is split evenly. Inputs: bill_amount (number); tip_percent (number, %, optional); split_between (integer, optional). Complete JSON argument examples: {"bill_amount":85.5,"tip_percent":18,"split_between":3} | {"bill_amount":42,"tip_percent":20} Outputs: tip_amount, total_amount, total_per_person, tip_per_person, bill_per_person. Formula: tip_amount = bill_amount × tip_percent / 100; total_amount = bill_amount + tip_amount; per person = value / split_between Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/tip with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/finance/tip.md
| Name | Required | Description | Default |
|---|---|---|---|
| bill_amount | Yes | Amount on the bill before tip (pre- or post-tax, as you prefer to tip). | |
| tip_percent | No | Gratuity as a percent of bill_amount. US restaurant custom is 15–20 %. Unit: %. | |
| split_between | No | How many people share the bill equally. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), and the description adds beyond that: the exact formula, the computed output fields, and direct REST fallback instructions. This gives the agent a clear model of what the tool computes and returns without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the primary use case and contains several useful sections: exclusions, inputs, outputs, formula, and fallback URL. It is slightly redundant with the schema, especially the repeated JSON examples, but every section still serves a purpose and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, and the description still supplies everything needed for correct invocation: when to call it, when not to, parameter semantics, expected outputs, the formula, and a REST fallback. Nothing an agent needs to select or call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter's type, constraints, defaults, and examples. The description adds only light value by restating the inputs as a compact list and clarifying optionality and the even-split meaning of split_between. This matches the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'add a gratuity to a restaurant, delivery or service bill' and 'divide the total among several people.' It clearly distinguishes the tool from relatives like bill-split and sales-tax, so an agent can identify what this calculator does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool, when not to use it, and names the alternatives: 'Do not use this when people pay for different items or unequal shares (use bill-split), or you need to add sales tax rather than a tip (use sales-tax).' This leaves no ambiguity about routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_t_testT-Test CalculatorARead-onlyIdempotentInspect
Use this when you want to test whether a sample mean differs from a hypothesised value, whether two independent groups have different means, or whether paired before/after measurements changed. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when the data are proportions or counts (use proportion-z-test or chi-square-test), you have three or more groups (ANOVA), or you already have t and df and only need the p-value (use p-value). What it computes: Runs a one-sample, Welch two-sample (unequal variances) or paired Student t-test from raw samples or summary statistics (mean, SD, n), returning t, degrees of freedom, two- and one-sided p-values, the confidence interval and the decision at the chosen alpha. Example user requests: Run a one-sample t-test for [102, 98, 105, 101, 104] against a mean of 100. | Compare two independent samples with Welch's t-test from their means, sample SDs and sample sizes. | Run a paired t-test on these before and after measurements in matching order. Inputs: mode (enum, optional); sample_a (number_list, optional); sample_b (number_list, optional); mean_a (number, optional); sd_a (number, optional); n_a (integer, optional); mean_b (number, optional); sd_b (number, optional); n_b (integer, optional); hypothesized_mean (number, optional); alpha (number, optional). Valid input combinations: one_sample: sample_a, or all of mean_a + sd_a + n_a. two_sample (also the default when mode is omitted): one complete raw-or-summary input for A and one for B. paired: both sample_a + sample_b, or paired-difference summary mean_a + sd_a + n_a. Do not mix a raw sample with its summary fields. Complete JSON argument examples: {"mode":"two_sample","sample_a":[5.1,4.9,5.6,5.8,6],"sample_b":[4.2,4.8,4.4,4.6,4.5]} | {"mode":"two_sample","mean_a":5.48,"sd_a":0.47117,"n_a":5,"mean_b":4.5,"sd_b":0.23452,"n_b":5} | {"mode":"one_sample","sample_a":[102,98,105,101,104],"hypothesized_mean":100} | {"mode":"paired","sample_a":[1.9,0.8,1.1,0.1,-0.1,4.4,5.5,1.6,4.6,3.4],"sample_b":[0.7,-1.6,-0.2,-1.2,-0.1,3.4,3.7,0.8,0,2]} | {"mode":"paired","mean_a":1.58,"sd_a":1.23042,"n_a":10} Outputs: test, mean_a, mean_b, mean_difference, standard_error, t_statistic, degrees_of_freedom, p_value_two_sided, p_value_one_sided, t_critical, ci_lower, ci_upper, significant, decision. Formula: one_sample: t = (x̄ − μ0) / (s / √n), df = n − 1. paired: same on the differences d = a − b. two_sample (Welch): t = (x̄a − x̄b − μ0) / √(sa²/na + sb²/nb), df = (sa²/na + sb²/nb)² / ((sa²/na)²/(na − 1) + (sb²/nb)²/(nb − 1)). p = P(|T_df| ≥ |t|); CI = estimate ± t(1 − alpha/2, df) × SE Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/t-test with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/statistics/t-test.md
| Name | Required | Description | Default |
|---|---|---|---|
| n_a | No | Number of observations in A, or number of pairs. | |
| n_b | No | Number of observations in B. | |
| mode | No | Which t-test to run. | two_sample |
| sd_a | No | Sample standard deviation (n − 1) of A, or of the paired differences. | |
| sd_b | No | Sample standard deviation (n − 1) of B. | |
| alpha | No | Significance level as a probability (0.05 = 5 %), not a percentage. Confidence intervals and critical values use level 1 − alpha. | |
| mean_a | No | Summary alternative to sample_a: sample mean of A (in paired mode: mean of the differences a − b). | |
| mean_b | No | Summary alternative to sample_b (two_sample only): sample mean of B. | |
| sample_a | No | Raw observations of the first (or only) sample. Alternatively give mean_a, sd_a and n_a. | |
| sample_b | No | Raw observations of the second sample (two_sample) or the paired partner values in the same order (paired). Alternatively give mean_b, sd_b and n_b. | |
| hypothesized_mean | No | Null-hypothesis value: the population mean (one_sample) or the mean difference (two_sample, paired). Usually 0 for differences. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds behavioral detail: it specifies Welch's correction for unequal variances, describes the output fields (t, df, p-values, CI, decision), and notes the fallback REST endpoint and docs. This goes beyond annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with clear sections: usage, exclusions, what it computes, example requests, inputs, valid combinations, examples, outputs, formula, fallback. The core usage is front-loaded. Some redundancy with schema examples exists, but each section serves a purpose and the length is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter tool with three modes and conditional requirements, the description is exceptionally complete. It covers valid combinations, provides examples for every mode, gives the formulas, lists output fields, and even includes a REST fallback and documentation link. An agent has everything needed to call it correctly without external lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptive parameter docs, so baseline is 3. The description adds meaningful semantics: it enumerates valid input combinations for each mode, clarifies that two_sample is the default, warns against mixing raw and summary fields, and provides complete JSON examples. This genuinely helps an agent construct valid calls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement of what the tool does: testing sample mean vs hypothesised value, two independent groups, or paired before/after measurements. It names the three t-test variants and clearly separates this from sibling calculators. Even without naming siblings, the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool (the three scenarios) and when not to, naming specific alternatives: proportion-z-test, chi-square-test, ANOVA, and p-value for existing t/df. This gives an agent clear routing logic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cast_plum_blossom_hexagramPlum Blossom Numerology (梅花易数)ARead-onlyIdempotentInspect
Use this when you need a Plum Blossom hexagram cast for a moment or from numbers, with the upper/lower trigram arithmetic, the moving line and the 体/用 five-element reading laid out step by step. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you already have six lines from coins or yarrow (use liuyao for a 六爻 chart or hexagram-change for plain line changes), or you only want a hexagram's text and structure (use hexagram-lookup). What it computes: Casts an I Ching hexagram by the Plum Blossom (Meihua Yishu) method of Shao Yong from the lunar year, month, day and hour (年月日时起卦) or from two or three given numbers, then derives the moving line, changed hexagram (之卦), nuclear hexagram (互卦), the 体 (Ti, self) and 用 (Yong, matter) trigrams and their five-element relations. Inputs: method (enum, optional); date (date, optional); time (string, optional); number_1 (integer, optional); number_2 (integer, optional); number_3 (integer, optional); add_hour_to_moving_line (boolean, optional). Valid input combinations: time_method needs date/time only; two_numbers requires number_1 + number_2; three_numbers requires number_1 + number_2 + number_3. Complete JSON argument examples: {"method":"time_method","date":"2026-09-24","time":"14:30"} | {"method":"two_numbers","number_1":3,"number_2":7,"date":"2026-09-24","time":"12:00"} Outputs: method_used, lunar_date, upper_trigram, lower_trigram, original_hexagram, original_lines, moving_line, moving_line_name, changed_hexagram, nuclear_hexagram, ti_trigram, yong_trigram, ti_element, yong_element, yong_ti_relation, nuclear_relations, changed_relation, ti_seasonal_strength, calculation_trace, reading_hint, disclaimer. Formula: Time method: year = branch number of the lunar year (子 = 1 … 亥 = 12), month = lunar month, day = lunar day, hour = 时辰 number (子 = 1 … 亥 = 12); upper = (year + month + day) mod 8, lower = (year + month + day + hour) mod 8, moving line = (year + month + day + hour) mod 6 (remainder 0 → 8 or 6); trigram numbers in earlier-heaven order 乾1 兑2 离3 震4 巽5 坎6 艮7 坤8. Two numbers: upper = number_1 mod 8, lower = number_2 mod 8, moving = (number_1 + number_2 [+ hour]) mod 6. Three numbers: moving = number_3 mod 6. 体 = trigram without the moving line, 用 = trigram with it; relations by the five-element generating (木→火→土→金→水) and controlling (木→土→水→火→金) cycles. Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/meihua-yishu with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/yijing/meihua-yishu.md
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Civil date in China Standard Time (UTC+8), 1900–2100; defaults to today. | today |
| time | No | Clock time HH:MM (China Standard Time) that fixes the 时辰 (double hour) for the time method or the optional hour addition. | 12:00 |
| method | No | How the trigrams and the moving line are derived. | time_method |
| number_1 | No | First number for the number methods; mod 8 gives the upper trigram (0 counts as 8). | |
| number_2 | No | Second number for the number methods; mod 8 gives the lower trigram. | |
| number_3 | No | Third number for the three-number method; mod 6 gives the moving line (0 counts as 6). | |
| add_hour_to_moving_line | No | Two-number method only: some schools add the 时辰 number (子 = 1 … 亥 = 12) of the given time before taking mod 6. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and idempotent, and the description does not contradict them. It adds substantial behavior beyond annotations: the exact modulo formulas for upper/lower trigrams and moving line, the handling of remainder 0, and the full output field list including 体/用 five-element relations. Providing the REST fallback path also removes ambiguity about how the computation is reached.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long, but sectioned and front-loaded with the use/when-not guidance before any technical detail. The formula, output list, valid combinations, JSON examples, REST fallback, and docs link each serve a distinct purpose, so the length is justified by the tool's multi-method complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given seven parameters, three method variants, an output schema, and annotations, the description covers method selection, input constraints, computation formula, output fields, and a fallback REST endpoint. Little remains for the agent to infer; the output schema covers return values, and the formula section covers what happens inside the calculation. This is complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already has a description, so the baseline is met. The description adds value by explaining valid input combinations and how each parameter feeds the arithmetic (number_1 mod 8, number_2 mod 8, number_3 mod 6, add_hour_to_moving_line in the two-number method). It does not fully restate constraints, but the schema and description together are strong.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and object: 'cast a Plum Blossom hexagram' from a moment or from numbers, then lists exactly what it computes (moving line, changed/nuclear hexagrams, 体/用 relation). It also separates itself from hexagram text/structure retrieval by naming hexagram-lookup for that case. This is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit trigger condition ('Use this when you need a Plum Blossom hexagram cast for a moment or from numbers') and an explicit exclusion ('Do not use when you already have six lines...'). It names alternatives for the excluded cases, though some names are conceptual rather than matching the sibling list exactly, so the agent has to map them; the yes/no boundary itself is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_china_working_dayMainland China Working Day CheckerARead-onlyIdempotentInspect
Use this when you need to know whether a specific 2024-2026 date is a working day in mainland China, especially around Spring Festival, National Day or another adjusted holiday. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need a Hong Kong, Macao, Taiwan, local minority, school, employer, bank-settlement or stock-exchange calendar, or a year outside 2024-2026. What it computes: Checks whether a date is an official national working day in mainland China, including weekend makeup workdays (调休上班) and multi-day holiday periods from State Council notices. Example user requests: Is Sunday 2026-01-04 an official working day in mainland China? | 2026年9月20日是休息日还是调休上班? | Will mainland China offices normally work on 2026-02-18? Inputs: date (date). Complete JSON argument examples: {"date":"2026-01-04"} | {"date":"2026-02-18"} Outputs: date, weekday, is_working_day, day_type, holiday_name, holiday_name_zh, status_basis, jurisdiction, source_document_id, source_published_at, source_url, dataset_version, coverage_start, coverage_end. Formula: adjusted weekend workday override → working; else official holiday-period override → non-working; else Monday-Friday → working; Saturday-Sunday → non-working Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/china-working-day with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/everyday/china-working-day.md
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Mainland China civil date (YYYY-MM-DD), within 2024-2026. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is known. The description adds valuable context: it computes official national working days from State Council notices, includes weekend makeup workdays (调休上班), and provides the override formula. It also lists output fields. This goes beyond annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with clear sections (use when, do not use, what it computes, examples, inputs, outputs, formula, REST fallback). Every sentence serves a purpose, especially the formula and REST fallback, which are non-obvious. It is front-loaded with the primary directive. Slightly verbose but justified given the domain complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the Chinese holiday calendar, the description covers scope, inputs, outputs, calculation logic, examples, and even a REST fallback and documentation link. An agent has everything needed to call it correctly. The output schema exists (listed fields) and the description complements it comprehensively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema description for 'date' already specifies 'Mainland China civil date (YYYY-MM-DD), within 2024-2026.' The description reinforces the range and format but adds little beyond that (e.g., example JSON). With complete schema coverage, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('checks whether') and resource ('a specific 2024-2026 date is a working day in mainland China'). It explicitly differentiates itself from sibling tools like add_china_working_days, count_china_working_days, and check_uk_working_day by focusing on a single-date check. The purpose is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use (need to know if a 2024-2026 date is a working day in mainland China, especially around Spring Festival/National Day) and when-not-to-use (HK/Macao/Taiwan, local minority, school, employer, bank-settlement, stock-exchange calendars, or years outside 2024-2026). It also instructs to call directly rather than answer from memory, clearly steering the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_uk_working_dayUK Working Day CheckerARead-onlyIdempotentInspect
Use this when you need to know whether a 2024-2028 UK date is a Monday-Friday working day after applying the official bank holidays for the selected division. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need a local council, school, employer, financial-market, emergency-closure or non-UK calendar, or a date outside 2024-2028. What it computes: Checks whether a date is a normal working day in England and Wales, Scotland or Northern Ireland using a pinned snapshot of the official GOV.UK bank-holiday feed. Example user requests: Is 28 December 2026 a working day in England and Wales, or the Boxing Day substitute holiday? | Is Scotland working on 15 June 2026? | Check whether 13 July 2026 is a working day in Northern Ireland. Inputs: date (date); division (enum, optional). Complete JSON argument examples: {"date":"2026-12-28","division":"england-and-wales"} | {"date":"2026-06-15","division":"scotland"} Outputs: date, weekday, division, division_name, is_working_day, day_type, bank_holiday_name, bank_holiday_notes, status_basis, source_url, licence, dataset_version, coverage_start, coverage_end, source_snapshot_sha256. Formula: official bank-holiday event → non-working; else Saturday/Sunday → non-working; else Monday-Friday → working Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/uk-working-day with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/everyday/uk-working-day.md
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | UK civil date in YYYY-MM-DD format, within 2024-2028. | |
| division | No | GOV.UK bank-holiday division. England and Wales share one official list; Scotland and Northern Ireland have separate lists. | england-and-wales |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: it uses a pinned snapshot of the official GOV.UK bank-holiday feed, it computes based on a specific formula (bank holiday → non-working, weekend → non-working, else working), and it returns a status_basis and source_url. It also discloses the date-range constraint (2024-2028) and the division-specific behavior. It doesn't describe pagination or error behavior, but for a read-only calculator that's not a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections: when to use, when not to use, what it computes, example requests, inputs, outputs, formula, and REST fallback. It's longer than average, but every section earns its place by providing actionable guidance. The front-loaded 'Use this when' sentence is the most important information and appears first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only calculator with a rich output schema, the description is complete. It covers the date range, division semantics, the formula, the output fields, the REST fallback, and documentation link. An agent has everything needed to select and invoke this tool correctly, including how to handle the substitute holiday example.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters well. The description adds meaning by explaining the division enum values ('England and Wales share one official list; Scotland and Northern Ireland have separate lists') and by giving complete JSON argument examples. It also clarifies the date format and range. This goes beyond the schema's basic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('check'), a specific resource (UK working day), and the exact scope (2024-2028, Monday-Friday after official bank holidays for the selected division). It also distinguishes itself from sibling tools like check_china_working_day and count_uk_working_days by naming the division-specific behavior and the pinned GOV.UK feed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool ('Use this when you need to know whether a 2024-2028 UK date is a Monday-Friday working day...'), and explicitly says when not to use it ('Do not use this when you need a local council, school, employer, financial-market, emergency-closure or non-UK calendar, or a date outside 2024-2028'). It also provides example user requests and a direct REST fallback, which is strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_loansLoan Comparison CalculatorARead-onlyIdempotentInspect
Use this when you have two loan or mortgage quotes with different rates, terms or fees for the same amount and want the payments and lifetime costs side by side. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you are replacing an existing loan (use refinance-break-even), only need one loan's payment (use loan-payment), or will sell or repay early (this compares full-term costs and ignores the time value of money). Informational; not financial advice. What it computes: Compares two fixed-rate, fully amortizing loan offers for the same amount: the level monthly payment, total interest, up-front fees and total cost (interest + fees) of each, and which offer costs less over its full term. Example user requests: Compare a 300000 loan at 6% for 30 years with 3000 in fees against 5.5% for 15 years with 5000 in fees. | Which of these two fixed-rate offers has the lower lifetime interest and fees? | 同样贷款30万元,方案A年利率6%期限30年,方案B年利率5.5%期限15年,比较月供和总成本。 Inputs: loan_amount (number); rate_a_percent (number, %); term_a_years (number, years); fees_a (number, optional); rate_b_percent (number, %); term_b_years (number, years); fees_b (number, optional). Complete JSON argument examples: {"loan_amount":300000,"rate_a_percent":6,"term_a_years":30,"fees_a":3000,"rate_b_percent":5.5,"term_b_years":15,"fees_b":5000} | {"loan_amount":25000,"rate_a_percent":7,"term_a_years":5,"rate_b_percent":6,"term_b_years":6,"fees_b":500} Outputs: payment_a, payment_b, total_interest_a, total_interest_b, total_cost_a, total_cost_b, cheaper_loan, monthly_payment_difference, total_cost_difference, comparison, summary. Formula: For each loan: i = rate/1200, n = 12 × term_years, payment = loan_amount × i / (1 − (1 + i)^−n) (loan_amount / n if i = 0); total_interest = payment × n − loan_amount; total_cost = total_interest + fees. cheaper_loan = the loan with the lower total_cost; monthly_payment_difference = payment_a − payment_b; total_cost_difference = total_cost_a − total_cost_b Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/loan-comparison with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/finance/loan-comparison.md
| Name | Required | Description | Default |
|---|---|---|---|
| fees_a | No | Up-front fees of loan A (origination, points, closing costs), paid separately rather than financed. | |
| fees_b | No | Up-front fees of loan B. | |
| loan_amount | Yes | Amount borrowed under both offers. | |
| term_a_years | Yes | Term of loan A in years (fractions allowed; rounded to whole months). Unit: years. | |
| term_b_years | Yes | Term of loan B in years. Unit: years. | |
| rate_a_percent | Yes | Annual nominal rate of loan A in percent; the monthly rate is this / 12. Unit: %. | |
| rate_b_percent | Yes | Annual nominal rate of loan B in percent. Unit: %. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds meaningful behavioral context: it computes full-term costs only, ignores the time value of money, assumes fixed-rate fully amortizing loans, and is informational rather than financial advice. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but well-structured and front-loaded with the core use case and exclusions. Every major section (what it computes, examples, inputs, outputs, formula, REST fallback) earns its place for a complex calculator. Minor redundancy exists with the schema examples and output list, so it is not perfectly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter calculator with an output schema and full schema documentation, the description is exceptionally complete: it includes use cases, exclusions, formulas, output names, example JSON, a REST fallback, and docs URL. An agent has everything needed to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's 'Inputs' section restates parameter names and adds example JSON, but it does not add semantic detail beyond what the schema already provides for each parameter. This is adequate but not an extra source of parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('compares two fixed-rate, fully amortizing loan offers') and clearly defines the scope: two loan quotes for the same amount with different rates, terms, or fees. It also distinguishes itself from nearby siblings by stating it covers payments, interest, fees, and total cost side by side.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool ('when you have two loan or mortgage quotes...') and gives explicit when-not-to-use conditions with named alternatives (refinance-break-even, loan-payment) and a behavioral caveat (early sale/repayment). This leaves no ambiguity about routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_betting_oddsOdds ConverterARead-onlyIdempotentInspect
Use this when you have odds in one format and need the other two, the implied probability of a price, or the payout of a stake at those odds. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need the combined price of several selections (use parlay-odds), the value of a bet given your own probability estimate (use bet-expected-value), or a bookmaker's margin across a whole market (use arbitrage-bet). Mathematics only; not gambling advice. What it computes: Converts betting odds between American (moneyline), decimal (European) and fractional (UK) formats, auto-detecting the input format, and reports the implied probability, profit and total return for a stake. Inputs: odds (string); format (enum, optional); stake (number, optional). Complete JSON argument examples: {"odds":"+150"} | {"odds":"-200","format":"auto","stake":100} Outputs: american, decimal, fractional, implied_probability_percent [%], profit_on_stake, total_return, detected_format. Formula: decimal = 1 + american/100 (american > 0) or 1 + 100/|american| (american < 0); decimal = 1 + a/b (fractional a/b); american = +100·(decimal − 1) if decimal ≥ 2, else −100/(decimal − 1); fractional = (decimal − 1) reduced with the GCD; implied_probability_percent = 100/decimal; total_return = stake × decimal Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/odds-converter with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/gaming/odds-converter.md
| Name | Required | Description | Default |
|---|---|---|---|
| odds | Yes | Odds in any format: American +150 or -200, decimal 2.50, fractional 3/2 or 3-2, or evens. | |
| stake | No | Stake used for the profit and return outputs (any currency). | |
| format | No | Format of the odds input. Auto: a/b or a-b with digits on both sides is fractional, a sign or an integer of 100 or more is American, anything else is decimal. | auto |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds behavioral context beyond that: it auto-detects the input format, reports detected_format, includes a direct REST fallback path, and explicitly notes 'Mathematics only; not gambling advice.' No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with clear sections (when to use, when not, what it computes, inputs, examples, outputs, formula, fallback). It is front-loaded with usage context. The formulas and REST fallback are arguably beyond minimum needs but serve to eliminate ambiguity for a complex calculator with multiple outputs and auto-detection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all essential aspects for correct invocation: exact input formats, auto-detection rules, output fields, a direct REST fallback, and alternative tool routing. Given the tool's complexity and presence of an output schema, the description fully equips an agent to call it correctly without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are fully documented with types, defaults, and format auto-detection rules. The description adds value by providing two complete JSON argument examples and mapping each parameter to its role, plus formulas that connect parameters to outputs. This exceeds the baseline 3 for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: converts betting odds between American, decimal, and fractional formats, and computes implied probability and payout. It explicitly names three sibling tools it is not (parlay-odds, bet-expected-value, arbitrage-bet), clearly distinguishing it from related calculators.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use ('when you have odds in one format and need the other two...') and when not to use, listing the alternative tool for each exclusion. It also instructs the agent to call the tool directly rather than deriving the answer from memory, leaving no ambiguity about invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_lunar_to_solarLunar to Solar Date ConverterARead-onlyIdempotentInspect
Use this when you know a lunar date such as 八月十五 or 闰六月初一 of a given lunar year and need the Gregorian date (e.g. for a lunar birthday or festival). Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you start from a Gregorian date (use lunar-calendar-converter), or you want every festival of a year at once (use chinese-festivals). What it computes: Converts a Chinese lunar calendar date (year, month, leap-month flag, day) to the Gregorian date, reporting the weekday, the day's ganzhi (干支) and the length of that lunar month, and validating that the leap month and day exist in that year. Example user requests: What Gregorian date is lunar 2026 month 8 day 15? | 2025 年农历闰六月初一对应公历哪一天? | Convert a Chinese lunar birthday to its Gregorian date and verify the leap-month flag. Inputs: lunar_year (integer); lunar_month (integer); is_leap_month (boolean, optional); lunar_day (integer). Complete JSON argument examples: {"lunar_year":2026,"lunar_month":8,"is_leap_month":false,"lunar_day":15} | {"lunar_year":2025,"lunar_month":6,"is_leap_month":true,"lunar_day":1} Outputs: gregorian_date, weekday, day_ganzhi, month_days, lunar_date_chinese, month_name, year_ganzhi, zodiac, julian_day_number, leap_month_note. Formula: JDN = start of the lunar month (new-moon day at UTC+8) + lunar_day − 1; month numbering per GB/T 33661-2017 (month 11 contains the winter solstice; leap month = first month without a 中气) Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/lunar-to-solar with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/lunar/lunar-to-solar.md
| Name | Required | Description | Default |
|---|---|---|---|
| lunar_day | Yes | Day of the lunar month, 1–30 (day 30 exists only in 30-day months). | |
| lunar_year | Yes | Lunar year number (the year that starts at that year's Chinese New Year), 1900–2100. | |
| lunar_month | Yes | Lunar month number 1 (正月) to 12 (腊月). | |
| is_leap_month | No | true when the date is in the intercalary month of that number (only valid in years that have that leap month). |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations that already mark this as read-only and idempotent, the description adds rich behavioral context: it validates leap-month/day existence, explains the formula (JDN = start of month + day − 1), references the GB/T standard, and instructs the agent to call the tool instead of answering from memory. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is clearly sectioned with headers, front-loads the use case, and every section earns its place: examples, inputs, outputs, formula, fallback, docs. It is long but not bloated; the structure makes it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool of this complexity, the description is complete: it covers when to use, what it computes, all inputs with examples, output fields, the underlying formula, a REST fallback, and documentation. Even with the output schema present, the description leaves no meaningful gap for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all four parameters with descriptions and examples, so the baseline is 3. The description adds value by pairing Chinese examples (八月十五, 闰六月初一) with complete JSON argument examples, and by clarifying is_leap_month as 'optional' with a true/false usage. It reinforces the schema without being the only source of meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Converts') and resource ('Chinese lunar calendar date... to the Gregorian date'), and enumerates the computed outputs. It also explicitly distinguishes itself from reverse conversion ('Do not use this when you start from a Gregorian date') and from mass festival lookups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is an explicit 'Use this when...' condition with concrete example requests, and a 'Do not use this when...' section naming two alternative categories. This gives an agent clear selection criteria without needing to inspect sibling schemas.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_solar_to_lunarLunar Calendar Converter (农历)ARead-onlyIdempotentInspect
Use this when you need the Chinese lunar date, ganzhi day/month/year, zodiac year or current solar term for a given Gregorian date (defaults to today). Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you start from a lunar date and need the Gregorian date (use lunar-to-solar), need a person's zodiac with the 立春 boundary option (use chinese-zodiac), or need the astronomical moon phase (use moon-phase). What it computes: Converts a Gregorian date to the Chinese lunisolar calendar (农历 nongli): lunar year, month (with leap-month flag), day, the sexagenary stems and branches (干支 ganzhi) of year, month and day, zodiac animal, nayin (纳音), the current 24-solar-term period and any traditional festival on that day. Example user requests: Convert 2026-09-25 to the Chinese lunar calendar and say whether it is a leap month. | 把 2025-07-25 换成农历,并给出干支和节气。 | Which Chinese lunar festival falls on this Gregorian date? Inputs: date (date, optional). Complete JSON argument examples: {"date":"2026-09-24"} | {"date":"2025-07-25"} Outputs: lunar_year, lunar_month, is_leap_month, lunar_day, lunar_date_chinese, lunar_date_text, month_name, day_name, month_days, leap_month_this_year, year_ganzhi, year_ganzhi_pinyin, year_english, zodiac, nayin_year, month_ganzhi, month_ganzhi_pinyin, day_ganzhi, day_ganzhi_pinyin, weekday, current_solar_term, next_solar_term, days_to_next_term [days], is_solar_term_day, festival, julian_day_number. Formula: lunar month = interval between successive new moons (instants at 120° E, UTC+8); month 11 contains the winter solstice; a leap month is the first month without a major solar term (中气) in a 13-month solstice-to-solstice suite; year_ganzhi index = (lunar_year − 4) mod 60; day_ganzhi index = (JDN + 49) mod 60; month branch = 寅 from 立春, one branch per odd solar term Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/lunar-calendar-converter with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/lunar/lunar-calendar-converter.md
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Civil date in China Standard Time (UTC+8), 1900–2100; defaults to the current UTC date. | today |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds substantial context beyond these: default to today's date, full output field list, leap-month and ganzhi calculation formulas, and a direct REST fallback. This gives the agent a clear model of what happens when the tool is invoked.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-organized with clear sections: usage, exclusions, computed fields, examples, inputs, outputs, formula, and fallback. While the formula section is more detailed than strictly necessary for invocation, the structure makes it digestible and every section serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex lunisolar conversion tool, the description provides everything needed: when to use, what it returns (with output schema present), how it computes leap months and ganzhi, and a REST fallback URL with a warning not to guess other paths. Combined with annotations and schema, the usage context is fully covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and already documents the single 'date' parameter, including its UTC+8 timezone, 1900–2100 range, and default of today. The description only repeats 'date (date, optional)' and 'defaults to today' without introducing new semantic detail, so it adds no value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: converts a Gregorian date to the Chinese lunisolar calendar and enumerates the exact computed values (lunar date, ganzhi, zodiac, solar terms). It distinguishes itself from convert_lunar_to_solar, find_chinese_zodiac, and astronomical moon-phase tools, leaving no doubt about this tool's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 'use this when' section (need lunar date, ganzhi, zodiac, or solar term from a Gregorian date) and a 'do not use this when' section that names the exact alternative tools (lunar-to-solar, chinese-zodiac, moon-phase). It also instructs the agent to call the tool directly rather than deriving from memory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_temperatureTemperature ConverterARead-onlyIdempotentInspect
Use this when you need a weather, cooking, body or laboratory temperature in another scale, e.g. Fahrenheit to Celsius or Celsius to Kelvin. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need to convert a temperature difference (a change of 10 °C is 18 °F, not 50 °F: multiply by 9/5 without the offset) or heat energy (use energy). What it computes: Converts temperatures between Celsius, Fahrenheit, Kelvin and Rankine with the exact defining relations (°F = °C × 9/5 + 32, K = °C + 273.15, °R = °F + 459.67) and rejects values below absolute zero. Inputs: value (number); from_unit (enum); to_unit (enum). Complete JSON argument examples: {"value":100,"from_unit":"F","to_unit":"C"} | {"value":25,"from_unit":"C","to_unit":"F"} Outputs: result, result_text, formula, factor, conversion_table. Formula: °F = °C × 9/5 + 32; °C = (°F − 32) × 5/9; K = °C + 273.15; °R = °F + 459.67 = K × 9/5 Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/temperature with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/conversion/temperature.md
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | Amount to convert, expressed in from_unit. | |
| to_unit | Yes | Unit to convert into (same symbols as from_unit). | |
| from_unit | Yes | Unit of the input value. Accepted symbols: C, F, K, R; spelled-out names and common abbreviations are accepted too. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds meaningful behavioral context: exact conversion formulas, rejection of values below absolute zero, output fields, and a direct REST fallback. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but well-structured with labeled sections: use cases, exclusions, computation details, inputs, examples, outputs, formula, fallback, and docs. There is minor redundancy in repeating formulas, but most content earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deterministic 3-parameter converter with full schema coverage, an output schema, and read-only annotations, the description supplies everything an agent needs: formulas, invalid-input rejection, complete JSON examples, fallback endpoint, and documentation link.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents value, from_unit, and to_unit clearly. The description adds useful formula context and examples, but does not materially expand parameter meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with concrete use cases (weather, cooking, body, laboratory) and names the exact operation: converting between Celsius, Fahrenheit, Kelvin, and Rankine. This clearly distinguishes it from generic convert_units and other calculator siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool, instructs the agent to call it directly rather than computing from memory, and gives clear do-not-use conditions for temperature differences and heat energy. The reference to an energy alternative satisfies the when-not/alternatives requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_time_zoneTime Zone ConverterARead-onlyIdempotentInspect
Use this when you need to know what time an event scheduled in one city corresponds to in another city or in UTC on a specific date. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need the same instant in many zones at once (use world-clock), an epoch value (use unix-timestamp), or the elapsed time between two clock times (use time-duration). What it computes: Converts a wall-clock date and time between IANA zones using pinned tzdb 2026d. It reports both offsets, the UTC instant, date changes, the source-time status and every candidate UTC instant when the input falls in a repeated hour. Example user requests: Convert 2027-01-15 09:00 America/New_York to Australia/Adelaide and show both dates. | 把 2026-07-15 09:00 纽约时间换成阿德莱德时间。 | What UTC instant corresponds to 2026-10-04 01:45 in Australia/Adelaide? Inputs: date (date, optional); time (string); from_zone (string); to_zone (string); resolution_policy (enum, optional). Complete JSON argument examples: {"date":"2026-09-23","time":"09:00","from_zone":"Australia/Adelaide","to_zone":"America/New_York"} | {"date":"2026-07-04","time":"12:00","from_zone":"America/Los_Angeles","to_zone":"Asia/Kolkata"} Outputs: converted_date, converted_time, converted_datetime, converted_weekday, from_utc_offset, to_utc_offset, from_abbreviation, to_abbreviation, utc_datetime, day_difference [days], time_difference_hours [h], source_time_status, source_candidate_utc_datetimes, applied_resolution_policy, tzdb_version, dataset_version, source_url, source_sha256. Formula: utc = date + time − offset_from(date, time); converted = utc + offset_to(utc); time_difference_hours = (offset_to − offset_from) / 60 Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/time-zone-converter with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/time/time-zone-converter.md
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Calendar date of the source time in from_zone (YYYY-MM-DD); defaults to the current UTC date. | today |
| time | Yes | Wall-clock time in from_zone, 24-hour HH:MM (seconds optional). | |
| to_zone | Yes | IANA time zone to convert to, e.g. America/New_York or Asia/Tokyo. | |
| from_zone | Yes | IANA time zone of the source time, e.g. Australia/Adelaide, Europe/Berlin or UTC. | |
| resolution_policy | No | How to handle a repeated or nonexistent source wall time. reject is safest; earlier/later choose a repeated-time candidate; shift_forward moves a skipped time by the DST gap. | reject |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, idempotentHint, destructiveHint all true/false appropriately), the description discloses pinned tzdb version (2026d), reporting of both offsets, UTC instant, date changes, source-time status, and candidate UTC instants for repeated hours. It also provides the exact formula and resolution policy handling, which adds significant behavioral context beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is comprehensive but well-structured with clear sections (when to use, when not, what it computes, examples, inputs, outputs, formula, fallback). It front-loads the core usage instruction and uses bullet-like formatting for clarity. There is some redundancy (examples repeated in prose and JSON), but overall it is efficient and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all necessary aspects: purpose, usage conditions, behavior, parameters (with examples), outputs (enumerated), the underlying formula, and even a direct REST fallback for verification. It is complete for an agent to invoke the tool correctly without needing additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions for every parameter. The description adds value through complete JSON examples and clarifies the resolution_policy in the context of repeated hours (via behavioral description and formula). It doesn't repeat schema details but supplements with usage context, justifying a score above the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool converts wall-clock date/time between IANA zones on a specific date, with a clear verb ('converts') and resource ('time between zones'). It distinguishes from siblings by naming alternatives (world-clock, unix-timestamp, time-duration) and instructs the agent to call the tool directly rather than computing manually.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('when you need to know what time an event scheduled in one city corresponds to in another') and when-not-to-use conditions with named alternatives ('Do not use this when you need the same instant in many zones at once (use world-clock)...'). Also instructs to call the tool directly and return its calculation, which is a clear directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_unitsConvert unitsARead-onlyIdempotentInspect
Use this when the user asks to convert a numeric value between units of the same physical quantity: length, mass, temperature, area, volume, speed, time, data, energy, pressure, power, angle, fuel economy, force, frequency, density or torque. Unit symbols and common names are accepted. Do not use this for currency, live exchange rates or cross-quantity conversions that require density. Returns the converted value, detected quantity, exact factor and a conversion table.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | Value to convert. | |
| to_unit | Yes | Target unit symbol or name, e.g. 'km'. | |
| from_unit | Yes | Source unit symbol or name, e.g. 'mi', 'miles', '°C'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile with readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds useful behavioral detail beyond those: accepted unit symbols/common names, the return contents (converted value, detected quantity, exact factor, conversion table), and the same-quantity constraint. This is meaningful but not exhaustive, e.g., no error behavior for unsupported units.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the trigger appears first, followed by explicit exclusions and return behavior. Every sentence adds distinct information, and there is no filler or redundant restating of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a stateless, read-only conversion tool with full parameter schema coverage and an output schema, the description is complete. It specifies supported quantity classes, when not to use the tool, accepted input forms, and return contents. No critical selection or invocation information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the parameter descriptions already include examples like 'mi', 'miles', and '°C'. The description adds a general 'same physical quantity' constraint and notes that symbols/common names are accepted, but these are supplementary rather than essential given the schema already documents all three parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('convert a numeric value between units of the same physical quantity') and explicitly enumerates the supported quantity types. It also distinguishes itself from other converters by excluding currency, live exchange rates, and density-dependent cross-quantity conversions, so an agent can tell when this tool applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear trigger condition ('Use this when the user asks to convert a numeric value between units of the same physical quantity') and explicit negative instructions ('Do not use this for currency, live exchange rates or cross-quantity conversions that require density'). It does not name sibling alternatives directly, but the when/when-not guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
count_china_working_daysMainland China Working Days Between DatesARead-onlyIdempotentInspect
Use this when you need the number of official mainland China working days in a 2024-2026 date range for an SLA, payroll, project or delivery estimate. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need only elapsed calendar days, another jurisdiction, an industry-specific settlement calendar, or dates outside 2024-2026. What it computes: Counts official mainland China working and non-working days in a date range using State Council holiday periods and weekend makeup workdays rather than a simple Monday-Friday rule. Example user requests: How many official China working days are there from 2026-09-18 through 2026-09-25, inclusive? | 计算2026年国庆节前后这段日期中实际需要上班的天数,要包含调休周末。 | Count mainland China business days between 2025-01-24 and 2025-02-10. Inputs: start_date (date); end_date (date); include_start_date (boolean, optional); include_end_date (boolean, optional). Complete JSON argument examples: {"start_date":"2026-09-18","end_date":"2026-09-25","include_start_date":true,"include_end_date":true} Outputs: normalized_start_date, normalized_end_date, working_days [working days], non_working_days [days], calendar_days_counted [days], adjusted_workdays_counted, holiday_dates_counted [days], source_document_ids, dataset_version, coverage_start, coverage_end. Formula: for each included date: working_days += is_working_day(date); non_working_days += not is_working_day(date) Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/china-working-days-between with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/everyday/china-working-days-between.md
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | Yes | Last date of the range (YYYY-MM-DD), within 2024-2026. Earlier dates are normalized and reported in a note. | |
| start_date | Yes | First date of the range (YYYY-MM-DD), within 2024-2026. | |
| include_end_date | No | Whether end_date participates in the count. | |
| include_start_date | No | Whether start_date participates in the count. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive. The description goes beyond this by disclosing the actual computation model: it uses 'State Council holiday periods and weekend makeup workdays rather than a simple Monday-Friday rule.' It also exposes the formula and notes that dates outside the coverage window are normalized and reported, giving the agent an accurate mental model of the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the most decision-relevant information: when to use it and when not to. It is longer than average because it includes examples, an output list, a formula, and a REST fallback, but each section has a clear purpose. The input and output lists are somewhat redundant with the schema and output schema, which keeps it from a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (date range, holiday calendar, inclusive boundaries), the description is remarkably complete: it gives realistic user example requests, a full JSON invocation example, the output field names, the computation formula, a direct REST fallback URL, and a docs link. The presence of an output schema means the detailed output list is bonus rather than necessary, and nothing essential for selecting or invoking the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters. The description's 'Inputs' line largely repeats what the schema says, but it does add a complete JSON example and ties the parameters to an inclusive-date semantics. That is helpful, but not a significant semantic gain over an already fully documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the exact purpose: 'number of official mainland China working days in a 2024-2026 date range.' It names the specific output resource and scope, and the geographic qualifier clearly separates it from siblings like count_uk_working_days and check_uk_working_day. It also tells the agent to 'call this tool directly and return its calculation,' which eliminates ambiguity about what action to take.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('for an SLA, payroll, project or delivery estimate') and explicit when-not-to-use guidance ('Do not use this when you need only elapsed calendar days, another jurisdiction, an industry-specific settlement calendar, or dates outside 2024-2026'). This directly orients the agent toward the correct tool and steers it away from common confusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
count_uk_working_daysUK Working Days Between DatesARead-onlyIdempotentInspect
Use this when you need a 2024-2028 UK SLA, payroll, project or delivery-day count and the selected division's bank holidays must be excluded. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need only elapsed calendar days, a local/employer/market calendar, another jurisdiction or dates outside 2024-2028. What it computes: Counts working and non-working dates in England and Wales, Scotland or Northern Ireland using the official GOV.UK bank-holiday list instead of a weekday-only approximation. Example user requests: How many England and Wales working days are there from 24 December 2026 through 4 January 2027? | Count Northern Ireland business days from 10 to 14 July 2026 inclusive. | How many Scottish working days fall between 1 and 20 June 2026? Inputs: start_date (date); end_date (date); include_start_date (boolean, optional); include_end_date (boolean, optional); division (enum, optional). Complete JSON argument examples: {"start_date":"2026-12-24","end_date":"2027-01-04","include_start_date":true,"include_end_date":true,"division":"england-and-wales"} | {"start_date":"2026-07-10","end_date":"2026-07-14","include_start_date":true,"include_end_date":true,"division":"northern-ireland"} Outputs: division, division_name, normalized_start_date, normalized_end_date, working_days [working days], non_working_days [days], calendar_days_counted [days], bank_holidays_counted, dataset_version, coverage_start, coverage_end, source_snapshot_sha256. Formula: for each included date: working_days += is_working_day(date); non_working_days += not is_working_day(date) Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/uk-working-days-between with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/everyday/uk-working-days-between.md
| Name | Required | Description | Default |
|---|---|---|---|
| division | No | GOV.UK bank-holiday division. England and Wales share one official list; Scotland and Northern Ireland have separate lists. | england-and-wales |
| end_date | Yes | Second range endpoint in YYYY-MM-DD format, within 2024-2028. | |
| start_date | Yes | First range endpoint in YYYY-MM-DD format, within 2024-2028. | |
| include_end_date | No | Whether the normalized later endpoint participates in the count. | |
| include_start_date | No | Whether the normalized earlier endpoint participates in the count. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only, idempotent, and non-destructive. The description adds valuable behavior: it uses the official GOV.UK holiday list rather than a weekday-only approximation, normalizes endpoints, counts working/non-working days, and exposes dataset metadata. There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with front-loaded usage conditions and clear labeled sections. There is some redundancy with the schema and repetition of the core computation, but the structure makes it scannable and the extra detail is purposeful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers use cases, exclusions, inputs, complete JSON examples, output fields, the computation formula, a direct REST fallback, and documentation. Given the rich schema, annotations, and output schema, nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description's Inputs section largely restates the schema. The JSON examples are helpful but mostly duplicate examples already present in the schema, so the description adds little semantic meaning beyond the structured parameter definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: counting UK working days between dates using the official GOV.UK bank-holiday list, with division support for England and Wales, Scotland, or Northern Ireland. It also clearly differentiates this from single-date checkers and calendar-day tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance for UK SLA, payroll, project, or delivery-day counts and explicit when-not-to-use guidance for elapsed calendar days, non-UK jurisdictions, employer-specific calendars, and dates outside 2024-2028. It also tells the agent to call the tool directly instead of computing from memory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_ev_charging_timeEV Charging Time CalculatorARead-onlyIdempotentInspect
Use this when you want to know how long an EV needs on a home wallbox, a public AC post or a DC fast charger to reach a target charge, or what the session costs at a given electricity price. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need a battery's charge time from ampere-hours and charger current (use battery-charge-time) or the driving range the added energy gives (use ev-range-efficiency); DC fast charging above about 80 % tapers strongly and takes longer than this constant-power estimate. What it computes: Estimates how long an electric vehicle takes to charge between two states of charge from its battery capacity, the charger power (capped by the onboard charger for AC charging) and the charging efficiency, plus the energy drawn from the grid and its cost. Inputs: battery_capacity_kwh (number, kWh); start_percent (number, %, optional); target_percent (number, %, optional); charger_power_kw (number, kW); max_onboard_charger_kw (number, kW, optional); charging_efficiency_percent (number, %, optional); electricity_price_per_kwh (number, per kWh, optional). Complete JSON argument examples: {"battery_capacity_kwh":75,"start_percent":20,"target_percent":80,"charger_power_kw":7,"charging_efficiency_percent":90,"electricity_price_per_kwh":0.3} | {"battery_capacity_kwh":60,"start_percent":10,"target_percent":100,"charger_power_kw":11,"max_onboard_charger_kw":7.4} Outputs: energy_added_kwh [kWh], energy_from_grid_kwh [kWh], effective_power_kw [kW], charging_time_hours [h], charging_time_text, cost, range_note. Formula: energy_added_kwh = battery_capacity_kwh × (target_percent − start_percent) / 100; energy_from_grid_kwh = energy_added_kwh / (charging_efficiency_percent / 100); effective_power_kw = min(charger_power_kw, max_onboard_charger_kw); charging_time_hours = energy_from_grid_kwh / effective_power_kw; cost = energy_from_grid_kwh × electricity_price_per_kwh Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/ev-charging-time with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/energy/ev-charging-time.md
| Name | Required | Description | Default |
|---|---|---|---|
| start_percent | No | State of charge at the start of the session. Unit: %. | |
| target_percent | No | State of charge to reach; must be higher than start_percent. Unit: %. | |
| charger_power_kw | Yes | Power the charging point delivers: 1.4–2.3 kW household socket (Level 1), 7–22 kW wallbox / AC post (Level 2), 50–350 kW DC fast charger. Unit: kW. | |
| battery_capacity_kwh | Yes | Usable battery capacity in kilowatt-hours (e.g. 40, 60, 75, 100). Unit: kWh. | |
| max_onboard_charger_kw | No | Optional maximum AC charging power of the car's onboard charger (commonly 7.4 or 11 kW); the effective power is the lower of the two. Omit for DC charging. Unit: kW. | |
| electricity_price_per_kwh | No | Optional price per kWh in your currency for the cost of the session (grid energy × price). Unit: per kWh. | |
| charging_efficiency_percent | No | Share of grid energy stored in the battery; 85–92 % is typical for AC charging (onboard charger and battery losses). Unit: %. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive hints. The description adds behavioral context beyond annotations: it is a constant-power estimate, mentions DC fast charging taper, and discloses the cost calculation. It does not contradict any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but organized into clear sections: usage, exclusions, computed values, inputs, examples, outputs, formula, and REST fallback. The inputs list is redundant with the schema, but the rest earns its place. Front-loading the usage conditions is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 7-parameter calculator with an output schema, the description covers everything an agent needs: when to use, what it computes, all parameters, example JSON, output names, the exact formula, a REST fallback, and a docs link. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter is already well-described. The description adds value by explaining the relationships between parameters (e.g., effective_power = min(charger_power_kw, max_onboard_charger_kw)) and the cost formula, which gives the agent a deeper understanding of how inputs affect outputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with explicit use cases (home wallbox, AC post, DC fast charger) and states exactly what it computes (charging time, energy, cost). It distinguishes from sibling tools by name (battery-charge-time, ev-range-efficiency), leaving no ambiguity about scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear when-to-use and when-not-to-use conditions, explicitly naming the alternative tools for battery charge time and driving range. It also warns about DC fast charging taper, which helps the agent select the tool appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_chinese_zodiacChinese Zodiac Calculator (生肖)ARead-onlyIdempotentInspect
Use this when you need someone's Chinese zodiac sign and element from a Gregorian birth date, especially for January–February births where the boundary matters, or the sign's traditional compatibility groups. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you need a full Bazi chart with month, day and hour pillars (use bazi-four-pillars), or the Western star sign (use zodiac). What it computes: Finds the Chinese zodiac animal (生肖 shengxiao), sexagenary year (干支 ganzhi), stem element, yin/yang, nayin (纳音) and fixed element for a birth date, using either the Chinese New Year boundary or the 立春 (Lichun) boundary, plus the traditional relationship groups (六合, 三合, 六冲, 六害, 相刑) and 本命年 years. Inputs: birth_date (date); boundary (enum, optional); reference_year (integer, optional). Complete JSON argument examples: {"birth_date":"1990-02-10","boundary":"lunar_new_year","reference_year":2026} | {"birth_date":"1990-02-03","boundary":"lichun"} Outputs: zodiac, zodiac_cn, year_ganzhi, year_ganzhi_pinyin, year_english, stem_element, yin_yang, nayin, animal_fixed_element, year_used, chinese_new_year_date, lichun_datetime, boundary_note, benmingnian_years, secret_friend, trine_partners, clash, harm, punishment, age_in_reference_year [years], is_benmingnian_in_reference_year, reference_year_zodiac. Formula: year_used = Gregorian year, minus 1 when birth_date is before Chinese New Year (or before 立春 with boundary = lichun); ganzhi index = (year_used − 4) mod 60; animal = branch = index mod 12; 六合 partner = (13 − b) mod 12; 三合 = b ± 4; 六冲 = b + 6; 六害 partner = (7 − b) mod 12 Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/chinese-zodiac with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/lunar/chinese-zodiac.md
| Name | Required | Description | Default |
|---|---|---|---|
| boundary | No | Which event starts the zodiac year: Chinese New Year (popular usage, default) or 立春 around 4 February (astrological usage). | lunar_new_year |
| birth_date | Yes | Gregorian birth date (civil date in China Standard Time), 1900–2100. | |
| reference_year | No | Optional Gregorian year for which to report the age and whether it is a 本命年. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, idempotent, and non-destructive. The description adds rich behavioral context: boundary selection rules, the exact year and ganzhi formula, the full set of computed fields, and a REST fallback path. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with clear sections, and the usage guidance is front-loaded. There is some redundancy with the input schema examples and the output field list, but the extra detail is relevant for correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a calculator of this complexity, the description is complete: it covers purpose, exclusions, alternatives, inputs, output fields, formulas, boundary semantics, reference_year behavior, REST fallback, and documentation link. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value by explaining how the boundary parameter changes the year calculation and how reference_year is used for age and 本命年 reporting. It mostly restates parameter types but clarifies their behavioral effect beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: it finds the Chinese zodiac sign and element from a Gregorian birth date, including boundary handling and compatibility groups. It also explicitly distinguishes itself from full Bazi chart calculation and Western star signs, so an agent can clearly tell what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to use the tool, when not to use it, and names the alternatives (bazi-four-pillars, zodiac). It also instructs the agent to call the tool directly rather than computing the answer from memory, which is strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_calculator_schemaGet calculator schemaARead-onlyIdempotentInspect
Use this only after search_calculators when its input_hints do not resolve a range, enum or optional-field question. Return the full input/output schema, formula, sources, examples and limitations for one calculator. Do not call it when the search result already supplies enough input detail; call run_calculator instead. This tool only describes and does not calculate.
| Name | Required | Description | Default |
|---|---|---|---|
| calculator_id | Yes | Exact calculator_id returned by search_calculators; for example 'bmi' or 'compound-interest'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | No | |
| success | Yes | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=true, idempotentHint=true, and destructiveHint=false, but the description adds the explicit statement 'This tool only describes and does not calculate.' This prevents misinterpretation even without annotations. Since annotations cover safety, the description adds a small but useful behavioral clarification, earning a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero filler. The primary usage condition is front-loaded, alternatives are named in the second sentence, and a final clarifying disambiguation closes it. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a simple one-parameter input, full schema coverage, and annotations covering safety/idempotence, the description is complete. It explains when to use, what it returns (schema, formula, sources, etc.), and that it does not calculate. Nothing essential is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% coverage for calculator_id, but the description reinforces that the ID comes from search_calculators, adding context beyond the schema's example list. It also clarifies the ID is exact, which prevents guesswork. This goes beyond the schema baseline of 3, so a 4 is justified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('get') and resource ('calculator schema'), and clearly distinguishes itself from siblings by mentioning when not to use it (when search results suffice) and when to use run_calculator instead. It is not a tautology and instantly conveys the tool's role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('only after search_calculators when input_hints...'), when not to use it ('do not call when search result already supplies enough'), and names the alternative (run_calculator). This is direct usage guidance with clear conditions and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_calculator_categoriesList categoriesARead-onlyIdempotentInspect
List the calculator categories with id, name, description and calculator count. Use it to orient before list_calculators. Does not perform calculations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, openWorldHint false, idempotentHint, and destructiveHint false, so the safety profile is covered. The description adds useful behavioral context by stating 'Does not perform calculations,' which prevents an agent from confusing this metadata/list operation with the many calculation siblings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler: the purpose is front-loaded, the workflow hint is concise, and the non-calculation clarification earns its place. Every sentence adds information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless list tool with no output schema, the description provides the essential operational details: what is listed, what fields are returned, when to use it, and a key exclusion ('Does not perform calculations'). Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and schema description coverage is 100%, so there is nothing for the description to add about parameter inputs. The description instead clarifies what the output fields are, which is valuable given there is no output schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource ('calculator categories') and the verb ('List'), and specifies the returned fields: id, name, description, and calculator count. It also distinguishes itself from the sibling list_calculators by positioning itself as the orientation step before listing calculators.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: 'Use it to orient before list_calculators.' This gives clear context for the intended workflow. It does not enumerate exclusions or compare against other listing/search siblings, but the guidance is sufficient for a simple, parameterless tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_calculatorsList calculatorsARead-onlyIdempotentInspect
List all calculators, optionally filtered by category id (finance, health, fitness, math, geometry, statistics, conversion, physics, chemistry, everyday, food, construction, business, time, medical, engineering, weather, investing, developer, energy, photography, science, gaming, lunar, yijing). Returns calculator_id, name, description, use_when and required inputs for each.
Use it to browse a whole category; use search_calculators for keyword lookup. Does not perform calculations.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Category id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description does not need to repeat safety behavior. It adds useful behavioral context by stating the return fields (calculator_id, name, description, use_when, required inputs) and clarifying that no calculation is performed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the core action in the first sentence. It includes only necessary context: filtering, return contents, and tool selection guidance. The category enum list is slightly redundant with the schema but does not bloat the description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with one optional parameter and no output schema, the description fully covers what the tool returns and when to use it. The lack of pagination or error details is not significant given the tool's low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the only parameter is already well described with an enum. The description adds the 'optionally filtered' semantics and lists the category values, but this is largely redundant with the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List all calculators') and clarifies it is a browsing tool, not an execution tool, explicitly saying 'Does not perform calculations.' It also distinguishes itself from sibling search_calculators by mentioning alternative lookup behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit guidance: 'Use it to browse a whole category; use search_calculators for keyword lookup.' This directly tells the agent when to choose this tool over an available sibling, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_solar_terms24 Solar Terms Calculator (二十四节气)ARead-onlyIdempotentInspect
Use this when you need the date or time of 立春, 清明, 夏至, 冬至 or any other solar term in a given year, or the full 24-term table. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you only need the term that a specific date falls in (use lunar-calendar-converter), or you need sunrise/sunset times (use sunrise-sunset). What it computes: Lists the 24 solar terms (节气 jieqi) of a Gregorian year with their exact instants: the moments the Sun's apparent longitude reaches multiples of 15°, computed astronomically and shown in a chosen UTC offset (China Standard Time by default). Example user requests: List all 24 solar terms for 2027 in UTC+8. | 2026 年立春和冬至的准确时间是什么? | When is Qingming this year in China Standard Time? Inputs: year (integer); utc_offset_hours (number, h, optional). Complete JSON argument examples: {"year":2024,"utc_offset_hours":8} | {"year":2026,"utc_offset_hours":8} Outputs: terms, lichun_date, spring_equinox, summer_solstice, autumn_equinox, winter_solstice, year_ganzhi, suishou_note, utc_offset. Formula: term instant: apparent geocentric solar longitude λ(JDE) = k·15° for k = 0 (春分) … 23 (惊蛰), solved by Newton iteration; UT = TT − ΔT; local time = UT + utc_offset_hours Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/solar-terms with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/lunar/solar-terms.md
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | Gregorian calendar year (1900–2100). | |
| utc_offset_hours | No | Fixed UTC offset in hours for the local date-times (8 = China Standard Time; 9 = Japan/Korea; 5.5 = India). Unit: h. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond that: it explains the computation method (astronomical apparent longitude, Newton iteration), the default UTC offset (China Standard Time), and the output fields. It also discloses the REST fallback endpoint, which is extra transparency. The only minor gap is that it doesn't explicitly state that the tool returns exact instants rather than just dates, but that is implied by 'exact instants' in the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections: usage, exclusions, computation details, examples, inputs, outputs, formula, and REST fallback. It is longer than average, but every section earns its place by providing actionable information. The front-loaded usage guidance is excellent. It loses one point for being somewhat verbose in the formula and REST fallback sections, which could be trimmed without losing essential meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a calculation tool. It covers what the tool computes, how it computes it, what inputs it takes, what outputs it returns, and even provides a REST fallback. The output schema exists, so return values are already documented. The description also handles edge cases like the default UTC offset and the year range. Nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters (year and utc_offset_hours) with ranges, defaults, and examples. The description adds meaning by explaining that utc_offset_hours is a fixed offset and that 8 = China Standard Time, and it gives complete JSON argument examples. This goes beyond the schema's basic descriptions, so a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('list'/'compute'), a precise resource (the 24 solar terms of a Gregorian year), and the exact astronomical basis (Sun's apparent longitude reaching multiples of 15°). It also names concrete example terms (立春, 清明, 夏至, 冬至), which distinguishes it from generic calendar tools. The title and description align, and the tool is clearly differentiated from siblings like lunar-calendar-converter and sunrise-sunset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool ('when you need the date or time of ... any solar term in a given year, or the full 24-term table') and when not to use it ('Do not use this when you only need the term that a specific date falls in (use lunar-calendar-converter), or you need sunrise/sunset times (use sunrise-sunset)'). It also instructs the agent to call the tool directly rather than answering from memory, which is a clear behavioral directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_time_zone_transitionsIANA Time Zone Transition ListARead-onlyIdempotentInspect
Use this when you need the next or historical daylight-saving/offset changes for scheduling, payroll, travel, audits or a regression test, with a specific reproducible tzdb version. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you only need to convert one ordinary date-time, need legal advice about a jurisdiction's time law, or need changes announced after this pinned release. What it computes: Lists every UTC-offset transition for one IANA zone and date range using pinned tzdb 2026d, including the local boundaries, offsets, abbreviations and whether the clock creates a gap or overlap. Example user requests: List every 2026 UTC-offset transition in America/New_York with local boundaries. | When does Australia/Adelaide change clocks between 2026-01-01 and 2027-01-01? | 列出 Europe/London 在 2026 年的夏令时转换点、前后偏移和 IANA 数据版本。 Inputs: time_zone (string); start_date (date); end_date (date). Complete JSON argument examples: {"time_zone":"America/New_York","start_date":"2026-01-01","end_date":"2026-12-31"} Outputs: time_zone, resolved_zone_id, start_date, end_date, transition_count, transitions, tzdb_version, dataset_version, source_url, source_sha256, coverage_note. Formula: select zone transition instants whose local boundary before or after lies inside [start_date, end_date] Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/time-zone-transitions with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/time/time-zone-transitions.md
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | Yes | Last local calendar date to inspect; ranges may not exceed 3,660 days. | |
| time_zone | Yes | IANA zone identifier present in tzdb 2026d. | |
| start_date | Yes | First local calendar date to inspect (1900-01-01 through 2100-12-31). |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds meaningful behavioral context: pinned tzdb 2026d, inclusion of gap/overlap flags, the precise selection formula, and a direct REST fallback path. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with clear sections: use cases, exclusions, computation details, examples, inputs, outputs, formula, fallback, and docs. It is front-loaded with the most important decision information and every section earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with an output schema and read-only annotations, the description is complete. It covers invocation scenarios, exclusions, a complete JSON example, the calculation formula, expected outputs, and a fallback endpoint. Nothing needed to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with each parameter already having type, format, examples, and constraints. The description restates the inputs and clarifies date-range inclusion via the formula, but it does not add substantial new parameter-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Lists every UTC-offset transition for one IANA zone and date range using pinned tzdb 2026d.' It also distinguishes itself from ordinary date-time conversion and from tools that need post-pinned-release changes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it (scheduling, payroll, travel, audits, regression tests with reproducible tzdb) and when not to use it (single date-time conversion, legal advice, post-pinned-release changes). Also instructs the agent to call the tool directly and return its calculation rather than answering from memory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_unitsList unitsARead-onlyIdempotentInspect
List every unit symbol supported by convert_units, grouped by quantity, with names. Use it when a unit symbol is rejected with UNKNOWN_UNIT. Does not convert anything.
| Name | Required | Description | Default |
|---|---|---|---|
| quantity | No | Optional quantity id to filter (e.g. 'length'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond annotations by stating that the tool is read-only in its effects ('Does not convert anything') and groups by quantity. While annotations already indicate readOnlyHint=true, the description provides functional context that the tool is a listing operation. It does not contradict annotations, and it adds the nuance of the UNKNOWN_UNIT use case, which is helpful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no wasted words. It front-loads the core purpose, then the usage trigger, and finally a clear exclusion. Everything is essential and adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with one optional parameter, full schema coverage, and readOnly annotations, the description is complete. It covers the purpose, usage trigger, and non-conversion behavior. The output schema is absent, but as a listing tool, the output is self-explanatory, so no additional description is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% coverage for the optional 'quantity' parameter, which is described in the schema. The description does not reiterate the parameter but adds context that it can be used to filter by quantity (e.g., 'length'), which goes slightly beyond the schema's generic description. Since the schema covers the parameter, a baseline of 3 is expected; the description's mention of filtering adds a small extra value, so 4 is justified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: it lists every unit symbol supported by convert_units, grouped by quantity, with names. It also specifies a specific trigger condition (when a unit symbol is rejected with UNKNOWN_UNIT) and explicitly states what it does not do (does not convert anything). This distinguishes it from the sibling convert_units tool and other calculators.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: when a unit symbol is rejected with UNKNOWN_UNIT. It also implies that it is not for conversion, which differentiates it from convert_units. This gives clear, actionable guidance for an agent deciding between tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_iching_hexagramI Ching Hexagram Lookup (六十四卦)ARead-onlyIdempotentInspect
Use this when you need to identify or describe a hexagram, convert between its number, name, trigram pair and line pattern, or find its derived hexagrams and palace position. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when you have moving lines and need the changed hexagram and reading rule (use hexagram-change), or you need to cast a hexagram from a date or numbers (use meihua-yishu). What it computes: Identifies one of the 64 hexagrams (六十四卦, liushisi gua) from its King Wen number, name, two trigrams or line digits and returns its lines, trigrams, nuclear (互卦, hugua), inverse (综卦, zonggua) and opposite (错卦, cuogua) hexagrams, its Jing Fang palace (京房八宫, Jingfang bagong) with 世/应 (shi/ying) lines, and the received judgment text (卦辞, guaci). Inputs: king_wen_number (integer, optional); name (string, optional); upper_trigram (string, optional); lower_trigram (string, optional); lines (string, optional). Valid input combinations: Identify the hexagram with king_wen_number, name, lines, or the complete upper_trigram + lower_trigram pair. Multiple identification methods may be supplied when they agree. Complete JSON argument examples: {"king_wen_number":1} | {"lines":"100010"} Outputs: number, name_cn, full_name_cn, pinyin, english, symbol, lines, lines_text, upper_trigram, lower_trigram, nuclear_hexagram, inverse_hexagram, opposite_hexagram, palace, palace_position, shi_line, ying_line, judgment_text, sequence_pair, binary_value, notes. Formula: lower trigram = lines 1–3, upper trigram = lines 4–6; nuclear = lines 2,3,4 + 3,4,5; inverse = reversed line order; opposite = each line flipped; binary_value = Σ line_i · 2^(i−1); 应 = 世 ± 3 Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/hexagram-lookup with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/yijing/hexagram-lookup.md
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Chinese name (屯, 水雷屯, 乾为天; traditional forms accepted), pinyin (zhun; ambiguous pinyin such as qian or bi is rejected with the candidates) or Wilhelm/Baynes title (Difficulty at the Beginning). | |
| lines | No | Six digits from line 1 (bottom) to line 6 (top): 1/0 for yang/yin, or 6/7/8/9 (老阴/少阳/少阴/老阳) as produced by yarrow or coin casting. | |
| lower_trigram | No | Lower (inner) trigram, in any form accepted by bagua. | |
| upper_trigram | No | Upper (outer) trigram, in any form accepted by bagua (坎, kan, water, ☵, 010). Must be given together with lower_trigram. | |
| king_wen_number | No | Hexagram number 1–64 in the King Wen sequence (1 = 乾, 64 = 未济). Give exactly one of king_wen_number, name, lines or the trigram pair. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already show readOnlyHint=true, idempotentHint=true, destructiveHint=false, and the description adds meaningful behavior beyond them: it explains what the tool computes (nuclear/inverse/opposite hexagrams, palace, shi/ying lines, judgment text), how lines map to trigrams, and the REST fallback path. The only small gap is that it doesn't detail the output object shape beyond listing field names, but the output schema covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: what it computes, inputs, valid combinations, examples, formula, and REST fallback. It is front-loaded with the core purpose and usage guidance, and the structure makes the dense content scannable. There is no filler or tautology.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 optional params, 64 hexagrams, multiple derived values, sibling alternatives), the description covers everything an agent needs: identification methods, combination rules, output fields, formulas, and a fallback URL. The output schema and annotations further enrich context, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters well. The description adds value by stating valid input combinations clearly, noting that multiple identification methods may be supplied when they agree, and giving complete JSON examples. It doesn't repeat schema details verbatim, and it clarifies optionality and combination rules beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('identify or describe a hexagram, convert between its number, name, trigram pair and line pattern') and immediately distinguishes scope from the sibling hexagram-change tool. It states exactly what the tool computes, covering identification and derived hexagrams, so an agent can tell it apart from the many calculation tools listed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Call this tool directly' when identification is needed, and gives a clear exclusion: 'Do not use this when you have moving lines and need the changed hexagram and reading rule (use hexagram-change)' plus the alternative for casting from date/numbers. It also lists valid input combinations, so an agent knows exactly when and how to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
price_black_scholes_optionBlack-Scholes Option CalculatorARead-onlyIdempotentInspect
Use this when you need a theoretical European option price or its sensitivities from a given volatility, or want to check put-call parity for quoted prices. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when the option is American with early exercise value, the underlying pays discrete dividends, or you need implied volatility from a market price (solve numerically instead). Informational only; not financial advice. What it computes: Prices a European call and put with the Black-Scholes-Merton formula from spot, strike, time to expiry, risk-free rate, volatility and a continuous dividend yield, and reports d1, d2 and the Greeks (delta, gamma, vega, theta, rho). Inputs: spot_price (number); strike_price (number); time_years (number, years); risk_free_rate_percent (number, % per year); volatility_percent (number, % per year); dividend_yield_percent (number, % per year, optional). Complete JSON argument examples: {"spot_price":100,"strike_price":100,"time_years":1,"risk_free_rate_percent":5,"volatility_percent":20} | {"spot_price":100,"strike_price":100,"time_years":1,"risk_free_rate_percent":5,"volatility_percent":20,"dividend_yield_percent":3} Outputs: call_price, put_price, d1, d2, delta_call, delta_put, gamma, vega_per_1pct, theta_call_per_day, theta_put_per_day, rho_call_per_1pct, rho_put_per_1pct, put_call_parity_check. Formula: d1 = [ln(S/K) + (r − q + σ²/2)·T] / (σ·√T); d2 = d1 − σ·√T; C = S·e^(−qT)·N(d1) − K·e^(−rT)·N(d2); P = K·e^(−rT)·N(−d2) − S·e^(−qT)·N(−d1); Δ_call = e^(−qT)·N(d1); Γ = e^(−qT)·φ(d1)/(S·σ·√T); vega = S·e^(−qT)·φ(d1)·√T; Θ_call = −S·e^(−qT)·φ(d1)·σ/(2√T) − r·K·e^(−rT)·N(d2) + q·S·e^(−qT)·N(d1); ρ_call = K·T·e^(−rT)·N(d2), with r, q, σ as decimals Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/black-scholes with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/investing/black-scholes.md
| Name | Required | Description | Default |
|---|---|---|---|
| spot_price | Yes | Current price of the underlying asset. | |
| time_years | Yes | Time until expiration in years (e.g. 0.25 for 3 months). Unit: years. | |
| strike_price | Yes | Exercise price of the option. | |
| volatility_percent | Yes | Annualized volatility of the underlying's returns in percent. Unit: % per year. | |
| dividend_yield_percent | No | Continuous dividend yield of the underlying in percent (0 for a non-dividend stock). Unit: % per year. | |
| risk_free_rate_percent | Yes | Continuously compounded annual risk-free interest rate in percent. Unit: % per year. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, idempotent, and non-destructive, and the description does not contradict them. Beyond that, it discloses the exact computation, the output fields including put_call_parity_check, the REST fallback endpoint, and a disclaimer, adding useful behavioral context not available from the schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the most decision-relevant information is front-loaded: when to use, when not to use, and what is computed. The formula block and repeated JSON examples add some redundancy, but they serve as useful transparency and invocation references, so this is still a well-structured description for a complex calculator.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the 100% schema coverage, and the output schema, the description is complete: it covers use cases, exclusions, parameters, output fields, formulas, a REST fallback, and documentation links. An agent has everything needed to select and invoke this tool correctly without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents all six parameters and their units. The description repeats parameter names and units and provides complete JSON examples, but it does not add new semantic meaning beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific use case: theoretical European option prices or sensitivities from a given volatility, plus put-call parity checks. It then states exactly what the tool computes (European call/put via Black-Scholes-Merton, d1, d2, and Greeks), making its purpose unmistakable and distinct from generic sibling calculators.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use the tool (theoretical European pricing, given volatility, put-call parity verification) and when not to use it (American options, discrete dividends, implied volatility). It even names the alternative approach (solve numerically for implied volatility), which gives the agent clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_local_timeIANA Local Time ResolverARead-onlyIdempotentInspect
Use this when you must safely turn a named-zone local time into an instant, validate a scheduled time around a daylight-saving transition, or preserve every possible interpretation instead of silently choosing one. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when the input already includes a numeric UTC offset or Z, the task only needs the current clock time, or latitude/longitude must first be mapped to a zone. What it computes: Resolves a local wall-clock time with pinned IANA tzdb 2026d. Returns every valid UTC candidate for a repeated fall-back time, or the exact gap and shift-forward suggestion for a nonexistent spring-forward time. Example user requests: Resolve 2026-11-01 01:30 in America/New_York and return both UTC candidates. | Does 2026-03-08 02:30 exist in New York? Show the DST gap. | 判断 Australia/Adelaide 的 2026-10-04 02:30 是否存在,并给出时区数据版本。 Inputs: local_datetime (string); time_zone (string). Complete JSON argument examples: {"local_datetime":"2026-11-01T01:30:00","time_zone":"America/New_York"} | {"local_datetime":"2026-03-08T02:30:00","time_zone":"America/New_York"} Outputs: local_datetime, time_zone, resolved_zone_id, status, candidate_count, candidates, gap, related_transition, previous_transition, next_transition, tzdb_version, dataset_version, source_url, source_sha256, coverage_note. Formula: for each zone offset o: candidate_utc = local_wall_time + o; keep candidates whose active offset at candidate_utc equals o Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/local-time-resolver with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/time/local-time-resolver.md
| Name | Required | Description | Default |
|---|---|---|---|
| time_zone | Yes | IANA zone identifier present in tzdb 2026d. | |
| local_datetime | Yes | Wall-clock date and time without Z or a numeric offset; it will be interpreted only in time_zone. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations declaring readOnly/idempotent/non-destructive, the description discloses rich behavior: every valid UTC candidate for ambiguous fall-back times, exact gap and suggestion for nonexistent spring-forward times, pinned tzdb 2026d, the underlying formula, and a direct REST fallback. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with usage guidance, making key information easy to find. However, it is long and somewhat redundant, listing output fields and the formula even though an output schema already exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully covers when to use, when not to use, input construction, output behavior, algorithm, REST fallback, documentation, and example requests. With an output schema present, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by emphasizing that local_datetime must be wall-clock time without Z/offset, providing complete JSON examples, and linking both parameters via the resolution formula.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: resolving a local wall-clock time in a named IANA zone into UTC instant(s). It clearly differentiates the tool from siblings by noting it is not for inputs with numeric offsets/Z, current-time-only tasks, or lat/long mapping.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It begins with explicit 'Use this when' scenarios and follows with a 'Do not use this when' exclusion list, giving the agent clear decision criteria. It also instructs the agent to call the tool directly instead of computing from memory, which is strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_calculatorRun a calculatorARead-onlyIdempotentInspect
Use this when the user needs one of Calcgrid's 538 deterministic calculators and no dedicated typed tool covers it. Call it immediately after search_calculators once calculator_id and input_hints are known; do not stop at search or schema discovery. Do not use it for trivial arithmetic, live rates or unrelated tasks. Returns typed values with units, formula, sources, freshness and timestamp; validation errors identify the field and a repair hint.
| Name | Required | Description | Default |
|---|---|---|---|
| inputs | Yes | Parameter names and values from search_calculators input_hints or get_calculator_schema. Use numbers as numbers, ISO dates as YYYY-MM-DD and lists as arrays. | |
| calculator_id | Yes | Exact calculator_id from search_calculators; for example 'compound-interest'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive, and the description adds determinism, typed return values with units/formula/sources/freshness/timestamp, and validation errors with field-level repair hints. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three purposeful sentences with front-loaded usage conditions, followed by workflow timing, exclusions, and return behavior. Every sentence earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema, full parameter documentation, and rich annotations, the description covers everything an agent needs: selection criteria, invocation timing, parameter origin, exclusions, return payload, and error behavior. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents calculator_id and inputs with examples and types. The description mentions input_hints and the parameter source but does not add substantive semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it runs one of Calcgrid's 538 deterministic calculators when no dedicated typed tool covers it. It identifies a specific verb, resource, and scope, and distinguishes itself from the many specialized sibling calculator tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: call immediately after search_calculators once calculator_id and input_hints are known, and do not stop at search or schema discovery. It also states exclusions: do not use it for trivial arithmetic, live rates, or unrelated tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_calculatorsSearch calculatorsARead-onlyIdempotentInspect
Use this when a user needs a deterministic calculation but none of the dedicated tools clearly matches and the calculator_id is unknown. Search 538 calculators from the complete task in English or Chinese, then call run_calculator with the top matching calculator_id and returned input_hints. Do not use this for trivial arithmetic, live data, writing tasks, or when a dedicated typed tool already matches. This tool only discovers; it does not calculate.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | The complete user task, including known values and units; for example 'compound interest on 15000 at 4.8% monthly for 12 years'. | |
| category | No | Optional category id to restrict results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | No | |
| success | Yes | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description adds meaningful context beyond that: the tool only discovers and does not calculate, it searches 538 calculators in English or Chinese, and it returns input_hints to pass to run_calculator. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no wasted words. The usage condition is front-loaded, followed by behavior, exclusions, and a clarifying final sentence. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations, an output schema, and simple parameter set, the description fully covers what an agent needs: when to call, what it does, what it doesn't do, and the recommended next step. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, with query and category already described. The description reinforces that query should be the complete user task and adds the English/Chinese language detail, but does not meaningfully elaborate on limit or category beyond the schema. Baseline 3 is appropriate since the schema carries most parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Search'), names the resource ('538 calculators'), and clearly states the tool's scope ('This tool only discovers; it does not calculate'). It distinguishes itself from dedicated typed tools and run_calculator, so an agent can tell exactly what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use ('when a user needs a deterministic calculation but none of the dedicated tools clearly matches and the calculator_id is unknown'), when not to use ('trivial arithmetic, live data, writing tasks, or when a dedicated typed tool already matches'), and names the follow-up action ('call run_calculator'). This is exemplary routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solve_ohms_lawOhm's Law CalculatorARead-onlyIdempotentInspect
Use this when you know two of voltage, current and resistance in a DC or purely resistive circuit and need the third and the power. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when the load is reactive (inductors or capacitors require impedance, not resistance), you want energy cost over time (use electric-power), or you need the equivalent resistance of several resistors (use resistors-series-parallel). What it computes: Solves Ohm's law V = I·R for whichever of voltage, current or resistance is omitted and reports the electrical power dissipated (P = V·I). Inputs: voltage_v (number, V, optional); current_a (number, A, optional); resistance_ohm (number, Ω, optional). Valid input combinations: Provide exactly two of voltage_v, current_a and resistance_ohm; the omitted quantity is calculated. Example: {"voltage_v":12,"resistance_ohm":220}. Complete JSON argument examples: {"voltage_v":12,"resistance_ohm":220} | {"current_a":2,"resistance_ohm":50} Outputs: solved_for, voltage_v [V], current_a [A], current_ma [mA], resistance_ohm [Ω], power_w [W]. Formula: V = I × R; I = V / R; R = V / I; P = V × I = I² × R = V² / R Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/ohms-law with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/physics/ohms-law.md
| Name | Required | Description | Default |
|---|---|---|---|
| current_a | No | Current through the component in amperes (1 mA = 0.001 A). Omit to solve for it. Unit: A. | |
| voltage_v | No | Potential difference across the component in volts. Omit to solve for it. Unit: V. | |
| resistance_ohm | No | Resistance in ohms (1 kΩ = 1000 Ω). Omit to solve for it. Unit: Ω. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, and the description adds substantial behavioral context: it reports the exact output fields, substitutes current in milliamperes as well as amperes, gives the formula family used, and provides a direct REST fallback with an explicit warning not to guess another /api/* path. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every section earns its place: usage, exclusions, computation, inputs, valid combinations, outputs, formula, fallback, and docs. It is front-loaded with the most decision-relevant guidance and uses compact formatting, though some content repeats schema examples.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter calculator with an output schema, the description covers everything an agent needs: when to invoke, valid input combinations, output fields, formula, direct REST fallback, and documentation. No critical operational or selection information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter's unit, minimum, and omission semantics. The description reinforces the 'exactly two' constraint and gives complete JSON examples, but this largely duplicates the schema rather than adding substantially new parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it solves Ohm's law for the missing value among voltage, current, and resistance and reports power. It clearly differentiates itself from sibling calculators by naming what it is not for (reactive loads, energy cost, equivalent resistance).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool ('know two of voltage, current and resistance... need the third and the power') and instructs the agent to call it directly rather than answering from memory. It also names specific alternatives for excluded cases: use electric-power for energy cost and resistors-series-parallel for equivalent resistance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solve_quadratic_equationQuadratic Equation SolverARead-onlyIdempotentInspect
Use this when you need the solutions of a second-degree polynomial equation, or the vertex and discriminant of a parabola y = ax² + bx + c. Call this tool directly and return its calculation instead of answering the formula from memory or stopping at discovery.
Do not use this when the coefficient a is 0 (the equation is linear: x = −c / b), or you need roots of x^n = c for other powers (use nth-root). What it computes: Solves ax² + bx + c = 0 with the quadratic formula, reporting the discriminant, both roots (real, or complex conjugates written as strings), the vertex of the parabola and the sum and product of the roots. Inputs: a (number); b (number); c (number). Complete JSON argument examples: {"a":1,"b":-5,"c":6} | {"a":1,"b":2,"c":5} Outputs: discriminant, nature, root1, root2, roots, vertex_x, vertex_y, sum_of_roots, product_of_roots. Formula: Δ = b² − 4ac; x = (−b ± √Δ) / (2a); for Δ < 0: x = −b/(2a) ± i·√(−Δ)/(2|a|); vertex = (−b/(2a), c − b²/(4a)) Direct REST fallback: POST https://tttkmbb.com/api/v1/calculate/quadratic-equation with the same JSON input fields. Do not guess another /api/* path. Docs: https://tttkmbb.com/math/quadratic-equation.md
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | Coefficient of x². Must not be 0. | |
| b | Yes | Coefficient of x. | |
| c | Yes | Constant term. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| result | Yes | |
| request | Yes | |
| sources | No | |
| success | Yes | |
| version | No | |
| freshness | No | |
| timestamp | Yes | |
| next_actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it readOnly, idempotent, and non-destructive. The description adds meaningful behavior beyond that: it reports discriminant, roots (complex roots as strings), vertex, sum/product of roots, and gives the exact formula used for Δ < 0. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than necessary, repeating input names and including a REST fallback and docs URL, but it is well-structured with clear sections and front-loaded usage guidance. The extra details mostly earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description fully covers when to use, what it computes, input examples, formulas, edge-case handling, and fallback invocation. An agent has everything needed to select and call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents a, b, and c well. The description adds examples and formula context, but it mostly repeats the input names rather than introducing substantive new parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with an explicit use condition: solving second-degree polynomial equations or finding vertex/discriminant. It clearly states the tool computes ax² + bx + c = 0 and distinguishes it from the many generic calculate_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance, direct-call guidance, and exclusions: not for a=0 linear cases and not for nth roots, naming an alternative approach. This is model behavior for an agent-facing tool description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
46 tool updates
- Changed
add_china_working_days1 field changed- added
Input schema / examplesAdded value: +[ + { + "start_date": "2026-09-24", + "working_days": 5 + }, + { + "start_date": "2026-09-18", + "working_days": 5 + } +]
- Added
add_uk_working_days - Changed
calculate_ab_test_significance1 field changed- added
Input schema / examplesAdded value: +[ + { + "control_conversions": 50, + "control_visitors": 1000, + "variant_conversions": 70, + "variant_visitors": 1000 + }, + { + "control_conversions": 200, + "control_visitors": 5000, + "variant_conversions": 260, + "variant_visitors": 5000 + } +]
- Changed
calculate_age1 field changed- added
Input schema / examplesAdded value: +[ + { + "as_of_date": "2026-09-23", + "birth_date": "1990-05-17" + }, + { + "as_of_date": "2026-01-10", + "birth_date": "1985-12-25" + } +]
- Changed
calculate_amortization_schedule3 fields changed- added
Input schema / anyOfAdded value: +[ + { + "properties": { + "term_years": { + "exclusiveMinimum": 0 + } + }, + "required": [ + "term_years" + ] + }, + { + "properties": { + "term_months": { + "minimum": 1 + } + }, + "required": [ + "term_months" + ] + } +] - added
Input schema / descriptionAdded value: +"Provide principal and annual_rate_percent, plus a positive term using term_years, term_months, or both. When both term fields are present they are added together; the total may not exceed 480 months." - added
Input schema / examplesAdded value: +[ + { + "annual_rate_percent": 6, + "principal": 200000, + "term_years": 30 + }, + { + "annual_rate_percent": 5, + "extra_monthly_payment": 300, + "principal": 300000, + "start_date": "2026-01-01", + "term_years": 15 + } +]
- Changed
calculate_bazi_four_pillars1 field changed- added
Input schema / examplesAdded value: +[ + { + "birth_date": "1990-05-17", + "birth_time": "08:30", + "sex": "male", + "utc_offset_hours": 8 + }, + { + "birth_date": "2000-01-01", + "birth_time": "00:30", + "sex": "female", + "utc_offset_hours": 8 + } +]
- Changed
calculate_bmi1 field changed- added
Input schema / examplesAdded value: +[ + { + "height_cm": 175, + "weight_kg": 70 + }, + { + "height_cm": 180, + "weight_kg": 95 + } +]
- Changed
calculate_bmr1 field changed- added
Input schema / examplesAdded value: +[ + { + "age_years": 30, + "height_cm": 175, + "sex": "male", + "weight_kg": 70 + }, + { + "age_years": 40, + "height_cm": 165, + "sex": "female", + "weight_kg": 60 + } +]
- Changed
calculate_circle_properties3 fields changed- added
Input schema / anyOfAdded value: +[ + { + "required": [ + "radius" + ] + }, + { + "required": [ + "diameter" + ] + } +] - added
Input schema / descriptionAdded value: +"Provide at least one of radius or diameter. You may provide both when diameter equals 2 × radius; conflicting values are rejected." - added
Input schema / examplesAdded value: +[ + { + "radius": 3 + }, + { + "diameter": 10 + } +]
- Changed
calculate_compound_interest1 field changed- added
Input schema / examplesAdded value: +[ + { + "annual_rate_percent": 5, + "compounding_frequency": "monthly", + "principal": 10000, + "years": 10 + }, + { + "annual_rate_percent": 6, + "compounding_frequency": "monthly", + "monthly_contribution": 100, + "principal": 5000, + "years": 20 + } +]
- Changed
calculate_date_difference1 field changed- added
Input schema / examplesAdded value: +[ + { + "end_date": "2026-12-25", + "start_date": "2026-01-01" + }, + { + "end_date": "2026-03-15", + "include_end_date": true, + "start_date": "2025-11-05" + } +]
- Changed
calculate_depth_of_field1 field changed- added
Input schema / examplesAdded value: +[ + { + "aperture_f": 2.8, + "focal_length_mm": 50, + "focus_distance_m": 3, + "sensor": "full_frame" + }, + { + "aperture_f": 8, + "focal_length_mm": 24, + "focus_distance_m": 5, + "sensor": "full_frame" + } +]
- Changed
calculate_descriptive_statistics1 field changed- added
Input schema / examplesAdded value: +[ + { + "values": [ + 2, + 4, + 4, + 4, + 5, + 5, + 7, + 9 + ] + }, + { + "values": [ + 4, + 8, + 15, + 16, + 23, + 42 + ] + } +]
- Changed
calculate_fraction_arithmetic1 field changed- added
Input schema / examplesAdded value: +[ + { + "fraction_a": "3/4", + "fraction_b": "1/6", + "operation": "add" + }, + { + "fraction_a": "2 1/3", + "fraction_b": "5/6", + "operation": "subtract" + } +]
- Changed
calculate_haversine_distance1 field changed- added
Input schema / examplesAdded value: +[ + { + "lat1": -33.8688, + "lat2": 35.6762, + "lon1": 151.2093, + "lon2": 139.6503 + }, + { + "lat1": 50.06639, + "lat2": 58.64389, + "lon1": -5.71472, + "lon2": -3.07 + } +]
- Changed
calculate_kinetic_energy1 field changed- added
Input schema / examplesAdded value: +[ + { + "mass_kg": 1200, + "velocity_m_s": 25 + }, + { + "mass_kg": 0.145, + "velocity_m_s": 40 + } +]
- Changed
calculate_loan_payment3 fields changed- added
Input schema / anyOfAdded value: +[ + { + "properties": { + "term_years": { + "exclusiveMinimum": 0 + } + }, + "required": [ + "term_years" + ] + }, + { + "properties": { + "term_months": { + "minimum": 1 + } + }, + "required": [ + "term_months" + ] + } +] - added
Input schema / descriptionAdded value: +"Provide principal and annual_rate_percent, plus a positive term using term_years, term_months, or both. When both term fields are present they are added together." - added
Input schema / examplesAdded value: +[ + { + "annual_rate_percent": 6, + "principal": 200000, + "term_years": 30 + }, + { + "annual_rate_percent": 7, + "principal": 25000, + "term_months": 60 + } +]
- Changed
calculate_molar_mass1 field changed- added
Input schema / examplesAdded value: +[ + { + "formula": "C6H12O6" + }, + { + "formula": "CuSO4·5H2O" + } +]
- Changed
calculate_mortgage_payment1 field changed- added
Input schema / examplesAdded value: +[ + { + "annual_home_insurance": 1200, + "annual_property_tax": 3000, + "annual_rate_percent": 6, + "down_payment": 50000, + "home_price": 250000, + "term_years": 30 + }, + { + "annual_rate_percent": 6.5, + "down_payment": 80000, + "home_price": 400000, + "term_years": 30 + } +]
- Changed
calculate_percentage1 field changed- added
Input schema / examplesAdded value: +[ + { + "mode": "percent_of", + "x": 15, + "y": 240 + }, + { + "mode": "is_what_percent", + "x": 30, + "y": 120 + } +]
- Changed
calculate_percentage_change1 field changed- added
Input schema / examplesAdded value: +[ + { + "new_value": 65, + "old_value": 50 + }, + { + "new_value": 60, + "old_value": 80 + } +]
- Changed
calculate_running_pace1 field changed- added
Input schema / examplesAdded value: +[ + { + "distance": 10, + "distance_unit": "km", + "time": "50:00" + }, + { + "distance": 5, + "distance_unit": "mi", + "time": "45:00" + } +]
- Changed
calculate_subnet1 field changed- added
Input schema / examplesAdded value: +[ + { + "cidr": "192.168.1.10/26" + }, + { + "cidr": "10.0.0.0 255.0.0.0" + } +]
- Changed
calculate_t_test3 fields changed- added
Input schema / allOfAdded value: +[ + { + "if": { + "properties": { + "mode": { + "const": "one_sample" + } + }, + "required": [ + "mode" + ] + }, + "then": { + "oneOf": [ + { + "not": { + "anyOf": [ + { + "required": [ + "mean_a" + ] + }, + { + "required": [ + "sd_a" + ] + }, + { + "required": [ + "n_a" + ] + } + ] + }, + "required": [ + "sample_a" + ] + }, + { + "not": { + "required": [ + "sample_a" + ] + }, + "required": [ + "mean_a", + "sd_a", + "n_a" + ] + } + ] + } + }, + { + "if": { + "properties": { + "mode": { + "const": "paired" + } + }, + "required": [ + "mode" + ] + }, + "then": { + "oneOf": [ + { + "not": { + "anyOf": [ + { + "required": [ + "mean_a" + ] + }, + { + "required": [ + "sd_a" + ] + }, + { + "required": [ + "n_a" + ] + } + ] + }, + "required": [ + "sample_a", + "sample_b" + ] + }, + { + "not": { + "anyOf": [ + { + "required": [ + "sample_a" + ] + }, + { + "required": [ + "sample_b" + ] + } + ] + }, + "required": [ + "mean_a", + "sd_a", + "n_a" + ] + } + ] + } + }, + { + "if": { + "anyOf": [ + { + "properties": { + "mode": { + "const": "two_sample" + } + }, + "required": [ + "mode" + ] + }, + { + "not": { + "required": [ + "mode" + ] + } + } + ] + }, + "then": { + "allOf": [ + { + "oneOf": [ + { + "not": { + "anyOf": [ + { + "required": [ + "mean_a" + ] + }, + { + "required": [ + "sd_a" + ] + }, + { + "required": [ + "n_a" + ] + } + ] + }, + "required": [ + "sample_a" + ] + }, + { + "not": { + "required": [ + "sample_a" + ] + }, + "required": [ + "mean_a", + "sd_a", + "n_a" + ] + } + ] + }, + { + "oneOf": [ + { + "not": { + "anyOf": [ + { + "required": [ + "mean_b" + ] + }, + { + "required": [ + "sd_b" + ] + }, + { + "required": [ + "n_b" + ] + } + ] + }, + "required": [ + "sample_b" + ] + }, + { + "not": { + "required": [ + "sample_b" + ] + }, + "required": [ + "mean_b", + "sd_b", + "n_b" + ] + } + ] + } + ] + } + } +] - added
Input schema / descriptionAdded value: +"one_sample: sample_a, or all of mean_a + sd_a + n_a. two_sample (also the default when mode is omitted): one complete raw-or-summary input for A and one for B. paired: both sample_a + sample_b, or paired-difference summary mean_a + sd_a + n_a. Do not mix a raw sample with its summary fields." - added
Input schema / examplesAdded value: +[ + { + "mode": "two_sample", + "sample_a": [ + 5.1, + 4.9, + 5.6, + 5.8, + 6 + ], + "sample_b": [ + 4.2, + 4.8, + 4.4, + 4.6, + 4.5 + ] + }, + { + "mean_a": 5.48, + "mean_b": 4.5, + "mode": "two_sample", + "n_a": 5, + "n_b": 5, + "sd_a": 0.47117, + "sd_b": 0.23452 + }, + { + "hypothesized_mean": 100, + "mode": "one_sample", + "sample_a": [ + 102, + 98, + 105, + 101, + 104 + ] + }, + { + "mode": "paired", + "sample_a": [ + 1.9, + 0.8, + 1.1, + 0.1, + -0.1, + 4.4, + 5.5, + 1.6, + 4.6, + 3.4 + ], + "sample_b": [ + 0.7, + -1.6, + -0.2, + -1.2, + -0.1, + 3.4, + 3.7, + 0.8, + 0, + 2 + ] + }, + { + "mean_a": 1.58, + "mode": "paired", + "n_a": 10, + "sd_a": 1.23042 + } +]
- Changed
calculate_tdee1 field changed- added
Input schema / examplesAdded value: +[ + { + "activity_level": "moderate", + "age_years": 30, + "height_cm": 175, + "sex": "male", + "weight_kg": 70 + } +]
- Changed
calculate_tip1 field changed- added
Input schema / examplesAdded value: +[ + { + "bill_amount": 85.5, + "split_between": 3, + "tip_percent": 18 + }, + { + "bill_amount": 42, + "tip_percent": 20 + } +]
- Changed
cast_plum_blossom_hexagram3 fields changed- added
Input schema / anyOfAdded value: +[ + { + "properties": { + "method": { + "const": "time_method" + } + } + }, + { + "properties": { + "method": { + "const": "two_numbers" + } + }, + "required": [ + "method", + "number_1", + "number_2" + ] + }, + { + "properties": { + "method": { + "const": "three_numbers" + } + }, + "required": [ + "method", + "number_1", + "number_2", + "number_3" + ] + } +] - added
Input schema / descriptionAdded value: +"time_method needs date/time only; two_numbers requires number_1 + number_2; three_numbers requires number_1 + number_2 + number_3." - added
Input schema / examplesAdded value: +[ + { + "date": "2026-09-24", + "method": "time_method", + "time": "14:30" + }, + { + "date": "2026-09-24", + "method": "two_numbers", + "number_1": 3, + "number_2": 7, + "time": "12:00" + } +]
- Changed
check_china_working_day1 field changed- added
Input schema / examplesAdded value: +[ + { + "date": "2026-01-04" + }, + { + "date": "2026-02-18" + } +]
- Added
check_uk_working_day - Changed
compare_loans1 field changed- added
Input schema / examplesAdded value: +[ + { + "fees_a": 3000, + "fees_b": 5000, + "loan_amount": 300000, + "rate_a_percent": 6, + "rate_b_percent": 5.5, + "term_a_years": 30, + "term_b_years": 15 + }, + { + "fees_b": 500, + "loan_amount": 25000, + "rate_a_percent": 7, + "rate_b_percent": 6, + "term_a_years": 5, + "term_b_years": 6 + } +]
- Changed
convert_betting_odds1 field changed- added
Input schema / examplesAdded value: +[ + { + "odds": "+150" + }, + { + "format": "auto", + "odds": "-200", + "stake": 100 + } +]
- Changed
convert_lunar_to_solar1 field changed- added
Input schema / examplesAdded value: +[ + { + "is_leap_month": false, + "lunar_day": 15, + "lunar_month": 8, + "lunar_year": 2026 + }, + { + "is_leap_month": true, + "lunar_day": 1, + "lunar_month": 6, + "lunar_year": 2025 + } +]
- Changed
convert_solar_to_lunar1 field changed- added
Input schema / examplesAdded value: +[ + { + "date": "2026-09-24" + }, + { + "date": "2025-07-25" + } +]
- Changed
convert_temperature1 field changed- added
Input schema / examplesAdded value: +[ + { + "from_unit": "F", + "to_unit": "C", + "value": 100 + }, + { + "from_unit": "C", + "to_unit": "F", + "value": 25 + } +]
- Changed
convert_time_zone1 field changed- added
Input schema / examplesAdded value: +[ + { + "date": "2026-09-23", + "from_zone": "Australia/Adelaide", + "time": "09:00", + "to_zone": "America/New_York" + }, + { + "date": "2026-07-04", + "from_zone": "America/Los_Angeles", + "time": "12:00", + "to_zone": "Asia/Kolkata" + } +]
- Changed
count_china_working_days1 field changed- added
Input schema / examplesAdded value: +[ + { + "end_date": "2026-09-25", + "include_end_date": true, + "include_start_date": true, + "start_date": "2026-09-18" + } +]
- Added
count_uk_working_days - Changed
estimate_ev_charging_time1 field changed- added
Input schema / examplesAdded value: +[ + { + "battery_capacity_kwh": 75, + "charger_power_kw": 7, + "charging_efficiency_percent": 90, + "electricity_price_per_kwh": 0.3, + "start_percent": 20, + "target_percent": 80 + }, + { + "battery_capacity_kwh": 60, + "charger_power_kw": 11, + "max_onboard_charger_kw": 7.4, + "start_percent": 10, + "target_percent": 100 + } +]
- Changed
find_chinese_zodiac1 field changed- added
Input schema / examplesAdded value: +[ + { + "birth_date": "1990-02-10", + "boundary": "lunar_new_year", + "reference_year": 2026 + }, + { + "birth_date": "1990-02-03", + "boundary": "lichun" + } +]
- Changed
list_solar_terms1 field changed- added
Input schema / examplesAdded value: +[ + { + "utc_offset_hours": 8, + "year": 2024 + }, + { + "utc_offset_hours": 8, + "year": 2026 + } +]
- Changed
list_time_zone_transitions1 field changed- added
Input schema / examplesAdded value: +[ + { + "end_date": "2026-12-31", + "start_date": "2026-01-01", + "time_zone": "America/New_York" + } +]
- Changed
lookup_iching_hexagram4 fields changed- added
Input schema / anyOfAdded value: +[ + { + "required": [ + "king_wen_number" + ] + }, + { + "required": [ + "name" + ] + }, + { + "required": [ + "lines" + ] + }, + { + "required": [ + "upper_trigram", + "lower_trigram" + ] + } +] - added
Input schema / dependentRequiredAdded value: +{ + "lower_trigram": [ + "upper_trigram" + ], + "upper_trigram": [ + "lower_trigram" + ] +} - added
Input schema / descriptionAdded value: +"Identify the hexagram with king_wen_number, name, lines, or the complete upper_trigram + lower_trigram pair. Multiple identification methods may be supplied when they agree." - added
Input schema / examplesAdded value: +[ + { + "king_wen_number": 1 + }, + { + "lines": "100010" + } +]
- Changed
price_black_scholes_option1 field changed- added
Input schema / examplesAdded value: +[ + { + "risk_free_rate_percent": 5, + "spot_price": 100, + "strike_price": 100, + "time_years": 1, + "volatility_percent": 20 + }, + { + "dividend_yield_percent": 3, + "risk_free_rate_percent": 5, + "spot_price": 100, + "strike_price": 100, + "time_years": 1, + "volatility_percent": 20 + } +]
- Changed
resolve_local_time1 field changed- added
Input schema / examplesAdded value: +[ + { + "local_datetime": "2026-11-01T01:30:00", + "time_zone": "America/New_York" + }, + { + "local_datetime": "2026-03-08T02:30:00", + "time_zone": "America/New_York" + } +]
- Changed
solve_ohms_law3 fields changed- added
Input schema / descriptionAdded value: +"Provide exactly two of voltage_v, current_a and resistance_ohm; the omitted quantity is calculated. Example: {\"voltage_v\":12,\"resistance_ohm\":220}." - added
Input schema / examplesAdded value: +[ + { + "resistance_ohm": 220, + "voltage_v": 12 + }, + { + "current_a": 2, + "resistance_ohm": 50 + } +] - added
Input schema / oneOfAdded value: +[ + { + "required": [ + "voltage_v", + "current_a" + ] + }, + { + "required": [ + "voltage_v", + "resistance_ohm" + ] + }, + { + "required": [ + "current_a", + "resistance_ohm" + ] + } +]
- Changed
solve_quadratic_equation1 field changed- added
Input schema / examplesAdded value: +[ + { + "a": 1, + "b": -5, + "c": 6 + }, + { + "a": 1, + "b": 2, + "c": 5 + } +]
3 tool updates
- Changed
convert_time_zone9 fields changed- added
Input schema / properties / resolution_policyAdded value: +{ + "default": "reject", + "description": "How to handle a repeated or nonexistent source wall time. reject is safest; earlier/later choose a repeated-time candidate; shift_forward moves a skipped time by the DST gap.", + "enum": [ + "reject", + "earlier", + "later", + "shift_forward" + ], + "examples": [ + "reject" + ], + "type": "string" +} - added
Output schema / properties / result / properties / values / properties / applied_resolution_policyAdded value: +{ + "description": "unique, earlier, later or shift_forward.", + "type": "string" +} - added
Output schema / properties / result / properties / values / properties / dataset_versionAdded value: +{ + "description": "Immutable Calcgrid time-zone evidence-package version.", + "type": "string" +} - changed
Output schema / properties / result / properties / values / properties / from_abbreviation / descriptionPrevious value: -"Short zone name from ICU (e.g. EDT); 'GMT+9:30' style when the zone has no common English abbreviation."New value: +"Short zone abbreviation from the pinned IANA data build (for example EDT)." - added
Output schema / properties / result / properties / values / properties / source_candidate_utc_datetimesAdded value: +{ + "description": "Every UTC instant that matches the source wall time; two values for a repeated time and none for a gap.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / result / properties / values / properties / source_sha256Added value: +{ + "description": "SHA-256 of the official IANA tzdata release artifact.", + "type": "string" +} - added
Output schema / properties / result / properties / values / properties / source_time_statusAdded value: +{ + "description": "unique, ambiguous or nonexistent under the pinned transition table.", + "type": "string" +} - added
Output schema / properties / result / properties / values / properties / source_urlAdded value: +{ + "description": "Version-specific official IANA release URL.", + "type": "string" +} - added
Output schema / properties / result / properties / values / properties / tzdb_versionAdded value: +{ + "description": "Pinned IANA release used for this result.", + "type": "string" +}
- Added
list_time_zone_transitions - Added
resolve_local_time
48 tool updates
- Added
add_china_working_days - Added
calculate_ab_test_significance - Added
calculate_age - Added
calculate_amortization_schedule - Added
calculate_bazi_four_pillars - Added
calculate_bmi - Added
calculate_bmr - Added
calculate_circle_properties - Added
calculate_compound_interest - Added
calculate_date_difference - Added
calculate_depth_of_field - Added
calculate_descriptive_statistics - Added
calculate_fraction_arithmetic - Added
calculate_haversine_distance - Added
calculate_kinetic_energy - Changed
calculate_loan_payment15 fields changed- changed
Output schema / descriptionPrevious value: -"Unified result envelope (see /docs/response-format.md)"New value: +"Deterministic calculation result with typed values, units, formula, sources and timestamp." - added
Output schema / properties / next_actions / itemsAdded value: +{ + "type": "object" +} - added
Output schema / properties / request / propertiesAdded value: +{ + "calculator_id": { + "type": "string" + }, + "inputs": { + "type": "object" + }, + "tool": { + "type": "string" + } +} - added
Output schema / properties / result / properties / calculator_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / calculator_nameAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / entity_typeAdded value: +{ + "const": "calculation", + "type": "string" +} - added
Output schema / properties / result / properties / statusAdded value: +{ + "const": "completed", + "type": "string" +} - added
Output schema / properties / result / properties / units / additionalPropertiesAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / values / propertiesAdded value: +{ + "monthly_payment": { + "description": "Level payment due each month (principal + interest).", + "type": "number" + }, + "number_of_payments": { + "description": "Total months = 12 × term_years + term_months.", + "type": "integer" + }, + "payoff_summary": { + "description": "Plain-language summary of the schedule.", + "type": "string" + }, + "total_interest": { + "description": "total_payment − principal.", + "type": "number" + }, + "total_payment": { + "description": "monthly_payment × number_of_payments (unrounded payment).", + "type": "number" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "entity_type", + "calculator_id", + "status", + "values", + "formula", + "summary" +] - added
Output schema / properties / sources / itemsAdded value: +{ + "type": "object" +} - added
Output schema / properties / success / constAdded value: +true - added
Output schema / properties / timestamp / formatAdded value: +"date-time" - added
Output schema / properties / versionAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "success" -]New value: +[ + "success", + "request", + "result", + "timestamp" +]
- Added
calculate_molar_mass - Added
calculate_mortgage_payment - Added
calculate_percentage - Added
calculate_percentage_change - Added
calculate_running_pace - Added
calculate_subnet - Added
calculate_t_test - Added
calculate_tdee - Added
calculate_tip - Added
cast_plum_blossom_hexagram - Added
check_china_working_day - Added
compare_loans - Added
convert_betting_odds - Changed
convert_lunar_to_solar15 fields changed- changed
Output schema / descriptionPrevious value: -"Unified result envelope (see /docs/response-format.md)"New value: +"Deterministic calculation result with typed values, units, formula, sources and timestamp." - added
Output schema / properties / next_actions / itemsAdded value: +{ + "type": "object" +} - added
Output schema / properties / request / propertiesAdded value: +{ + "calculator_id": { + "type": "string" + }, + "inputs": { + "type": "object" + }, + "tool": { + "type": "string" + } +} - added
Output schema / properties / result / properties / calculator_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / calculator_nameAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / entity_typeAdded value: +{ + "const": "calculation", + "type": "string" +} - added
Output schema / properties / result / properties / statusAdded value: +{ + "const": "completed", + "type": "string" +} - added
Output schema / properties / result / properties / units / additionalPropertiesAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / values / propertiesAdded value: +{ + "day_ganzhi": { + "description": "Sexagenary day with pinyin, e.g. 壬寅 (Renyin).", + "type": "string" + }, + "gregorian_date": { + "description": "Gregorian civil date (China Standard Time).", + "format": "date", + "type": "string" + }, + "julian_day_number": { + "description": "Julian Day Number of the Gregorian date.", + "type": "integer" + }, + "leap_month_note": { + "description": "Which leap month the lunar year has (if any), so a wrong is_leap_month flag can be corrected.", + "type": "string" + }, + "lunar_date_chinese": { + "description": "Written form, e.g. 二〇二六年八月十五.", + "type": "string" + }, + "month_days": { + "description": "Length of the requested lunar month (29 or 30).", + "type": "integer" + }, + "month_name": { + "description": "Traditional month name, prefixed 闰 for a leap month.", + "type": "string" + }, + "weekday": { + "description": "Day of the week.", + "type": "string" + }, + "year_ganzhi": { + "description": "Sexagenary year with pinyin, e.g. 丙午 (Bingwu).", + "type": "string" + }, + "zodiac": { + "description": "Zodiac animal of the lunar year.", + "type": "string" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "entity_type", + "calculator_id", + "status", + "values", + "formula", + "summary" +] - added
Output schema / properties / sources / itemsAdded value: +{ + "type": "object" +} - added
Output schema / properties / success / constAdded value: +true - added
Output schema / properties / timestamp / formatAdded value: +"date-time" - added
Output schema / properties / versionAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "success" -]New value: +[ + "success", + "request", + "result", + "timestamp" +]
- Changed
convert_solar_to_lunar15 fields changed- changed
Output schema / descriptionPrevious value: -"Unified result envelope (see /docs/response-format.md)"New value: +"Deterministic calculation result with typed values, units, formula, sources and timestamp." - added
Output schema / properties / next_actions / itemsAdded value: +{ + "type": "object" +} - added
Output schema / properties / request / propertiesAdded value: +{ + "calculator_id": { + "type": "string" + }, + "inputs": { + "type": "object" + }, + "tool": { + "type": "string" + } +} - added
Output schema / properties / result / properties / calculator_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / calculator_nameAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / entity_typeAdded value: +{ + "const": "calculation", + "type": "string" +} - added
Output schema / properties / result / properties / statusAdded value: +{ + "const": "completed", + "type": "string" +} - added
Output schema / properties / result / properties / units / additionalPropertiesAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / values / propertiesAdded value: +{ + "current_solar_term": { + "description": "Solar-term period the date falls in and the date it began.", + "type": "string" + }, + "day_ganzhi": { + "description": "Sexagenary day (continuous 60-day cycle; 1949-10-01 = 甲子).", + "type": "string" + }, + "day_ganzhi_pinyin": { + "description": "Pinyin of the day ganzhi.", + "type": "string" + }, + "day_name": { + "description": "Traditional day name (初一 … 三十).", + "type": "string" + }, + "days_to_next_term": { + "description": "Days until the next solar term. Unit: days.", + "type": "integer", + "x-unit": "days" + }, + "festival": { + "description": "Traditional festival(s) on this day (春节, 元宵节, 龙抬头, 上巳节, 端午节, 七夕, 中元节, 中秋节, 重阳节, 寒衣节, 下元节, 腊八节, 小年, 除夕, 清明节, 冬至) or \"none\".", + "type": "string" + }, + "is_leap_month": { + "description": "true when the date falls in an intercalary month (闰月 runyue).", + "type": "boolean" + }, + "is_solar_term_day": { + "description": "true when the date is itself a solar-term day.", + "type": "boolean" + }, + "julian_day_number": { + "description": "Julian Day Number of the civil date.", + "type": "integer" + }, + "leap_month_this_year": { + "description": "Number of the leap month in this lunar year, 0 when the year has none.", + "type": "integer" + }, + "lunar_date_chinese": { + "description": "Written form, e.g. 二〇二六年八月十四.", + "type": "string" + }, + "lunar_date_text": { + "description": "Readable form, e.g. 8th lunar month, day 14 (八月十四).", + "type": "string" + }, + "lunar_day": { + "description": "Day of the lunar month, 1–30.", + "type": "integer" + }, + "lunar_month": { + "description": "Lunar month number 1–12.", + "type": "integer" + }, + "lunar_year": { + "description": "Lunar year number (the year that began at the preceding Chinese New Year).", + "type": "integer" + }, + "month_days": { + "description": "Length of this lunar month (29 or 30).", + "type": "integer" + }, + "month_ganzhi": { + "description": "Sexagenary month by solar-term months (节气月): 寅 month starts at 立春, stems by the 五虎遁 rule.", + "type": "string" + }, + "month_ganzhi_pinyin": { + "description": "Pinyin of the month ganzhi.", + "type": "string" + }, + "month_name": { + "description": "Traditional month name (正月 … 腊月, prefixed 闰 for a leap month).", + "type": "string" + }, + "nayin_year": { + "description": "Nayin melodic element of the year ganzhi, e.g. 天河水 · Milky-way Water.", + "type": "string" + }, + "next_solar_term": { + "description": "Next solar term and its date.", + "type": "string" + }, + "weekday": { + "description": "Day of the week.", + "type": "string" + }, + "year_english": { + "description": "Stem element and zodiac animal, e.g. Fire Horse.", + "type": "string" + }, + "year_ganzhi": { + "description": "Sexagenary year of the lunar year, e.g. 丙午.", + "type": "string" + }, + "year_ganzhi_pinyin": { + "description": "Pinyin of the year ganzhi, e.g. Bingwu.", + "type": "string" + }, + "zodiac": { + "description": "Zodiac animal of the lunar year with its character, e.g. Horse (马).", + "type": "string" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "entity_type", + "calculator_id", + "status", + "values", + "formula", + "summary" +] - added
Output schema / properties / sources / itemsAdded value: +{ + "type": "object" +} - added
Output schema / properties / success / constAdded value: +true - added
Output schema / properties / timestamp / formatAdded value: +"date-time" - added
Output schema / properties / versionAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "success" -]New value: +[ + "success", + "request", + "result", + "timestamp" +]
- Added
convert_temperature - Changed
convert_time_zone15 fields changed- changed
Output schema / descriptionPrevious value: -"Unified result envelope (see /docs/response-format.md)"New value: +"Deterministic calculation result with typed values, units, formula, sources and timestamp." - added
Output schema / properties / next_actions / itemsAdded value: +{ + "type": "object" +} - added
Output schema / properties / request / propertiesAdded value: +{ + "calculator_id": { + "type": "string" + }, + "inputs": { + "type": "object" + }, + "tool": { + "type": "string" + } +} - added
Output schema / properties / result / properties / calculator_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / calculator_nameAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / entity_typeAdded value: +{ + "const": "calculation", + "type": "string" +} - added
Output schema / properties / result / properties / statusAdded value: +{ + "const": "completed", + "type": "string" +} - added
Output schema / properties / result / properties / units / additionalPropertiesAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / values / propertiesAdded value: +{ + "converted_date": { + "description": "Calendar date in to_zone.", + "format": "date", + "type": "string" + }, + "converted_datetime": { + "description": "ISO 8601 date-time in to_zone including its UTC offset.", + "type": "string" + }, + "converted_time": { + "description": "Wall-clock time in to_zone (HH:MM).", + "type": "string" + }, + "converted_weekday": { + "description": "Day of the week of converted_date.", + "type": "string" + }, + "day_difference": { + "description": "converted_date minus date: −1, 0 or +1. Unit: days.", + "type": "integer", + "x-unit": "days" + }, + "from_abbreviation": { + "description": "Short zone name from ICU (e.g. EDT); 'GMT+9:30' style when the zone has no common English abbreviation.", + "type": "string" + }, + "from_utc_offset": { + "description": "UTC offset of from_zone at that instant (±HH:MM).", + "type": "string" + }, + "time_difference_hours": { + "description": "to_zone offset minus from_zone offset at that instant; positive when to_zone is ahead. Unit: h.", + "type": "number", + "x-unit": "h" + }, + "to_abbreviation": { + "description": "Short zone name of to_zone at that instant.", + "type": "string" + }, + "to_utc_offset": { + "description": "UTC offset of to_zone at that instant (±HH:MM).", + "type": "string" + }, + "utc_datetime": { + "description": "The same instant in UTC (ISO 8601).", + "type": "string" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "entity_type", + "calculator_id", + "status", + "values", + "formula", + "summary" +] - added
Output schema / properties / sources / itemsAdded value: +{ + "type": "object" +} - added
Output schema / properties / success / constAdded value: +true - added
Output schema / properties / timestamp / formatAdded value: +"date-time" - added
Output schema / properties / versionAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "success" -]New value: +[ + "success", + "request", + "result", + "timestamp" +]
- Changed
convert_units15 fields changed- changed
Output schema / descriptionPrevious value: -"Unified result envelope (see /docs/response-format.md)"New value: +"Deterministic calculation result with typed values, units, formula, sources and timestamp." - added
Output schema / properties / next_actions / itemsAdded value: +{ + "type": "object" +} - added
Output schema / properties / request / propertiesAdded value: +{ + "calculator_id": { + "type": "string" + }, + "inputs": { + "type": "object" + }, + "tool": { + "type": "string" + } +} - added
Output schema / properties / result / properties / calculator_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / calculator_nameAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / entity_typeAdded value: +{ + "const": "calculation", + "type": "string" +} - added
Output schema / properties / result / properties / statusAdded value: +{ + "const": "completed", + "type": "string" +} - added
Output schema / properties / result / properties / units / additionalPropertiesAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / values / additionalPropertiesAdded value: +true - added
Output schema / properties / result / requiredAdded value: +[ + "entity_type", + "calculator_id", + "status", + "values", + "formula", + "summary" +] - added
Output schema / properties / sources / itemsAdded value: +{ + "type": "object" +} - added
Output schema / properties / success / constAdded value: +true - added
Output schema / properties / timestamp / formatAdded value: +"date-time" - added
Output schema / properties / versionAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "success" -]New value: +[ + "success", + "request", + "result", + "timestamp" +]
- Added
count_china_working_days - Added
estimate_ev_charging_time - Added
find_chinese_zodiac - Changed
get_calculator_schema3 fields changed- changed
Input schema / properties / calculator_id / descriptionPrevious value: -"Calculator id from search_calculators, e.g. 'bmi'."New value: +"Exact calculator_id returned by search_calculators; for example 'bmi' or 'compound-interest'." - added
Input schema / properties / calculator_id / examplesAdded value: +[ + "compound-interest" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "Read-only catalogue or schema result used to select a calculation tool.", + "properties": { + "links": { + "type": "object" + }, + "next_actions": { + "items": { + "type": "object" + }, + "type": "array" + }, + "request": { + "type": "object" + }, + "result": { + "type": "object" + }, + "success": { + "const": true, + "type": "boolean" + }, + "timestamp": { + "format": "date-time", + "type": "string" + } + }, + "required": [ + "success", + "result", + "timestamp" + ], + "type": "object" +}
- Added
list_calculator_categories - Added
list_calculators - Changed
list_solar_terms15 fields changed- changed
Output schema / descriptionPrevious value: -"Unified result envelope (see /docs/response-format.md)"New value: +"Deterministic calculation result with typed values, units, formula, sources and timestamp." - added
Output schema / properties / next_actions / itemsAdded value: +{ + "type": "object" +} - added
Output schema / properties / request / propertiesAdded value: +{ + "calculator_id": { + "type": "string" + }, + "inputs": { + "type": "object" + }, + "tool": { + "type": "string" + } +} - added
Output schema / properties / result / properties / calculator_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / calculator_nameAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / entity_typeAdded value: +{ + "const": "calculation", + "type": "string" +} - added
Output schema / properties / result / properties / statusAdded value: +{ + "const": "completed", + "type": "string" +} - added
Output schema / properties / result / properties / units / additionalPropertiesAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / values / propertiesAdded value: +{ + "autumn_equinox": { + "description": "Local date and time of 秋分 (180°).", + "type": "string" + }, + "lichun_date": { + "description": "Local date and time (HH:MM) of 立春, the start of the solar-term year.", + "type": "string" + }, + "spring_equinox": { + "description": "Local date and time of 春分 (Sun at 0°).", + "type": "string" + }, + "suishou_note": { + "description": "When the sexagenary year begins under solar-term reckoning (立春) versus the lunar calendar (Chinese New Year).", + "type": "string" + }, + "summer_solstice": { + "description": "Local date and time of 夏至 (90°).", + "type": "string" + }, + "terms": { + "description": "24 rows in calendar order (小寒 first): name_cn, pinyin, english, solar_longitude (°), datetime_local, datetime_utc, date, type (major 中气 / minor 节).", + "type": "array" + }, + "utc_offset": { + "description": "Offset applied to datetime_local and date.", + "type": "string" + }, + "winter_solstice": { + "description": "Local date and time of 冬至 (270°).", + "type": "string" + }, + "year_ganzhi": { + "description": "Sexagenary name of the year with pinyin and element/animal.", + "type": "string" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "entity_type", + "calculator_id", + "status", + "values", + "formula", + "summary" +] - added
Output schema / properties / sources / itemsAdded value: +{ + "type": "object" +} - added
Output schema / properties / success / constAdded value: +true - added
Output schema / properties / timestamp / formatAdded value: +"date-time" - added
Output schema / properties / versionAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "success" -]New value: +[ + "success", + "request", + "result", + "timestamp" +]
- Added
list_units - Added
lookup_iching_hexagram - Added
price_black_scholes_option - Changed
run_calculator19 fields changed- changed
Input schema / properties / calculator_id / descriptionPrevious value: -"Calculator id, e.g. 'compound-interest'."New value: +"Exact calculator_id from search_calculators; for example 'compound-interest'." - added
Input schema / properties / calculator_id / examplesAdded value: +[ + "compound-interest" +] - changed
Input schema / properties / inputs / descriptionPrevious value: -"Input parameters keyed by name as documented by get_calculator_schema."New value: +"Parameter names and values from search_calculators input_hints or get_calculator_schema. Use numbers as numbers, ISO dates as YYYY-MM-DD and lists as arrays." - added
Input schema / properties / inputs / examplesAdded value: +[ + { + "annual_rate_percent": 4.8, + "principal": 15000, + "years": 12 + } +] - changed
Output schema / descriptionPrevious value: -"Unified result envelope (see /docs/response-format.md)"New value: +"Deterministic calculation result with typed values, units, formula, sources and timestamp." - added
Output schema / properties / next_actions / itemsAdded value: +{ + "type": "object" +} - added
Output schema / properties / request / propertiesAdded value: +{ + "calculator_id": { + "type": "string" + }, + "inputs": { + "type": "object" + }, + "tool": { + "type": "string" + } +} - added
Output schema / properties / result / properties / calculator_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / calculator_nameAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / entity_typeAdded value: +{ + "const": "calculation", + "type": "string" +} - added
Output schema / properties / result / properties / statusAdded value: +{ + "const": "completed", + "type": "string" +} - added
Output schema / properties / result / properties / units / additionalPropertiesAdded value: +{ + "type": "string" +} - added
Output schema / properties / result / properties / values / additionalPropertiesAdded value: +true - added
Output schema / properties / result / requiredAdded value: +[ + "entity_type", + "calculator_id", + "status", + "values", + "formula", + "summary" +] - added
Output schema / properties / sources / itemsAdded value: +{ + "type": "object" +} - added
Output schema / properties / success / constAdded value: +true - added
Output schema / properties / timestamp / formatAdded value: +"date-time" - added
Output schema / properties / versionAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "success" -]New value: +[ + "success", + "request", + "result", + "timestamp" +]
- Changed
search_calculators3 fields changed- changed
Input schema / properties / query / descriptionPrevious value: -"Free-text query, e.g. 'compound interest' or 'body fat'."New value: +"The complete user task, including known values and units; for example 'compound interest on 15000 at 4.8% monthly for 12 years'." - added
Input schema / properties / query / examplesAdded value: +[ + "compound interest on 15000 at 4.8% monthly for 12 years" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "Read-only catalogue or schema result used to select a calculation tool.", + "properties": { + "links": { + "type": "object" + }, + "next_actions": { + "items": { + "type": "object" + }, + "type": "array" + }, + "request": { + "type": "object" + }, + "result": { + "type": "object" + }, + "success": { + "const": true, + "type": "boolean" + }, + "timestamp": { + "format": "date-time", + "type": "string" + } + }, + "required": [ + "success", + "result", + "timestamp" + ], + "type": "object" +}
- Added
solve_ohms_law - Added
solve_quadratic_equation
35 tool updates
- Removed
calculate_ab_test_significance - Removed
calculate_age - Removed
calculate_amortization_schedule - Removed
calculate_bazi_four_pillars - Removed
calculate_bmi - Removed
calculate_bmr - Removed
calculate_circle_properties - Removed
calculate_compound_interest - Removed
calculate_date_difference - Removed
calculate_depth_of_field - Removed
calculate_descriptive_statistics - Removed
calculate_fraction_arithmetic - Removed
calculate_haversine_distance - Removed
calculate_kinetic_energy - Removed
calculate_molar_mass - Removed
calculate_mortgage_payment - Removed
calculate_percentage - Removed
calculate_percentage_change - Removed
calculate_running_pace - Removed
calculate_subnet - Removed
calculate_t_test - Removed
calculate_tdee - Removed
calculate_tip - Removed
cast_plum_blossom_hexagram - Removed
convert_betting_odds - Removed
convert_temperature - Removed
estimate_ev_charging_time - Removed
find_chinese_zodiac - Removed
list_calculator_categories - Removed
list_calculators - Removed
list_units - Removed
lookup_iching_hexagram - Removed
price_black_scholes_option - Removed
solve_ohms_law - Removed
solve_quadratic_equation
44 tool updates
- First observed
calculate_ab_test_significance - First observed
calculate_age - First observed
calculate_amortization_schedule - First observed
calculate_bazi_four_pillars - First observed
calculate_bmi - First observed
calculate_bmr - First observed
calculate_circle_properties - First observed
calculate_compound_interest - First observed
calculate_date_difference - First observed
calculate_depth_of_field - First observed
calculate_descriptive_statistics - First observed
calculate_fraction_arithmetic - First observed
calculate_haversine_distance - First observed
calculate_kinetic_energy - First observed
calculate_loan_payment - First observed
calculate_molar_mass - First observed
calculate_mortgage_payment - First observed
calculate_percentage - First observed
calculate_percentage_change - First observed
calculate_running_pace - First observed
calculate_subnet - First observed
calculate_t_test - First observed
calculate_tdee - First observed
calculate_tip - First observed
cast_plum_blossom_hexagram - First observed
convert_betting_odds - First observed
convert_lunar_to_solar - First observed
convert_solar_to_lunar - First observed
convert_temperature - First observed
convert_time_zone - First observed
convert_units - First observed
estimate_ev_charging_time - First observed
find_chinese_zodiac - First observed
get_calculator_schema - First observed
list_calculator_categories - First observed
list_calculators - First observed
list_solar_terms - First observed
list_units - First observed
lookup_iching_hexagram - First observed
price_black_scholes_option - First observed
run_calculator - First observed
search_calculators - First observed
solve_ohms_law - First observed
solve_quadratic_equation
Related MCP Connectors
Deterministic time tools for AI agents: timezone conversion, business-day math, cron interpretation.
Time zone conversion, meeting-slot finding across countries, DST checks and .ics invites. All.
A real clock for AI agents: current time, timezone conversion, and DST facts from the IANA tzdb.
Business-day, SLA, cron and recurrence calculations — offline, holiday-aware, no network.
Related MCP Servers
- AlicenseAqualityCmaintenanceProvides accurate time zone conversions, DST-safe scheduling, holidays for 200+ countries, business day calculations, and cross-zone meeting slot suggestions.5MIT
- AlicenseAqualityDmaintenanceA comprehensive time and calendar utility server that provides timezone conversions, date arithmetic, and business day calculations for AI agents. It features extensive support for the Chinese lunar calendar, including almanac data, festivals, and public holiday tracking across multiple regions.1340 npmMIT
- FlicenseNot gradedqualityDmaintenanceProvides UK-centric date calculations including bank holiday integration, sprint planning tools, and specialized Asana workflow automation. It enables users to calculate working days, track upcoming holidays, and manage project schedules specifically within the Europe/London timezone.-
- AlicenseAqualityBmaintenanceProvides current local time and time in any IANA timezone, along with timezone listing and NTP-based time retrieval with clock offset information.427 PyPIMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.