出口单 chukoudan
Server Details
外贸出口计算与数据 / China export tools: tax refund, quotes, container loading, CBM, FX rates.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 13 tools
Each tool targets a fairly distinct calculation (quoting, refund lookup, CBM, container loading, FX, unit conversion, dataset access). Minor overlap exists: baojia vs make_quote (making a price vs packaging it into a buyer document) and fx-convert vs fx-cost (settlement amount vs yearly comparison) could blur, but descriptions differentiate them.
Names mix three conventions plus pinyin: kebab-case (container-load, fx-convert, unit-convert), snake_case (get_dataset, lookup_refund_rate, make_quote), bare pinyin (baojia, maitou, tuishui), and an abbreviation (cbm). No single predictable pattern governs the set.
13 tools is well within a healthy range and each earns its place: a handful of quote/freight calculators, FX tools, refund tools, and dataset plumbing. Nothing feels redundant or missing at the count level.
The domain (export trade calculations) is covered broadly: pricing, refunds, FX, volume/container math, shipping marks, units, and dataset lifecycle. Some adjacent needs (e.g. insurance, documentation beyond quotes) are absent, but core workflows are complete.
Available Tools
13 toolsbaojiaFOB/CIF/CFR 报价ARead-onlyIdempotentInspect
FOB/CIF/CFR 报价(FOB/CIF/CFR quotes):由成本算三种术语报价和利润。 Quotes and profit on all three terms, from your cost. 读取数据 / Reads: central-parity@current, ports@current, refund-rates@current. 输入为精确的十进制字符串 / Inputs are exact decimal strings. 用户没有给的数字和日期不要自己编:必填的先问用户,选填的不填。 / Never make up a figure or a date the user did not give: ask for a required one, leave an optional one out. 回复时引用回答里的 provenance.source_line / Quote provenance.source_line in your reply.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 计算方向。可选值:forward = 正算:成本 → 报价;reverse = 反算:报价 → 利润 / Direction. options: forward = Quote from cost; reverse = Profit from a quote | |
| port | No | 起运港(选填) / Port of loading (optional) | |
| term | No | 你报的术语。可选值:FOB = FOB;CFR = CFR;CIF = CIF / Your quote is on. options: FOB = FOB; CFR = CFR; CIF = CIF | |
| unit | No | 数量单位。可选值:pcs = 件;sets = 套;cartons = 箱;kg = 千克 / Unit. options: pcs = pcs; sets = sets; cartons = cartons; kg = kg | |
| fxPer | No | 汇率单位。可选值:1 = 每 1 外币;100 = 每 100 外币 / Rate quoted per. options: 1 = per 1 unit; 100 = per 100 units | |
| price | Yes | 含税采购单价(CNY) / Purchase price per unit, VAT included (CNY) | |
| fxRate | Yes | 汇率 / Exchange rate | |
| margin | No | 目标利润率(%) / Target margin (%) | |
| markup | No | 投保加成(%) / Insured at (% of CIF) | |
| volume | No | 总体积(m3) / Total volume (m3) | |
| freight | No | 海运费 / Sea freight | |
| taxRate | Yes | 征税率(%) / VAT rate on the purchase (%) | |
| currency | No | 报价币种 / Quote currency | |
| domestic | No | 国内费用(CNY) / Domestic costs (CNY) | |
| quantity | Yes | 数量 / Quantity | |
| commission | No | 佣金率(%) / Commission rate (%) | |
| containers | No | 柜数 / Containers | |
| refundRate | Yes | 退税率(%) / Refund rate (%) | |
| marginBasis | No | 利润率按。可选值:quote = 报价;cost = 成本 / Margin on. options: quote = the quote; cost = cost | |
| quotedPrice | No | 你的报价单价 / Your unit price | |
| freightBasis | No | 运费计价方式。可选值:container = 每柜;cbm = 每立方米;total = 合计 / Freight is charged. options: container = per container; cbm = per m³; total = for the whole order | |
| domesticBasis | No | 国内费用按。可选值:total = 合计;perUnit = 每件 / Domestic costs are given. options: total = for the whole order; perUnit = per unit | |
| insuranceRate | No | 保险费率(%) / Insurance rate (%) |
Output Schema
| Name | Required | Description |
|---|---|---|
| tool | Yes | |
| links | Yes | |
| steps | Yes | |
| outputs | Yes | |
| warnings | Yes | |
| normalized | No | |
| provenance | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds real value beyond them: it names the live datasets consumed (central-parity@current, ports@current, refund-rates@current), imposes a no-fabrication rule, and requires echoing provenance.source_line in the reply.
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 content is front-loaded (what it does, then data sources, then input/behaviour rules) and every sentence carries a distinct instruction. Length is inflated only by the bilingual duplication, which is justified for this audience.
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, so return values need no explanation, and the description correctly focuses on inputs, live-data dependencies, and the provenance-citation requirement. The only shortfall is the absence of guidance on selecting this tool over its near-sibling make_quote.
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?
With 23 parameters at 100% schema description coverage, the schema carries the parameter burden including per-parameter enum meanings and formats. The description's format notes (decimal strings, no symbols/units, currency spelling variants) largely restate conventions already present in the schema description, so it adds only marginal 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?
States a specific verb+resource: computes FOB/CIF/CFR quotes and profit, with forward (cost→quote) and reverse (quote→profit) directions, which an agent can distinguish from a generic cost or conversion tool. It does not, however, differentiate itself from the sibling make_quote, leaving the agent to infer which of the two produces the final quote.
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 procedural guidance (ask for required inputs, omit optional ones, never fabricate figures) but no when-to-use/when-not-to-use framing and no routing to alternatives such as make_quote or fx-cost. Usage is implied by the FOB/CIF/CFR scope rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cbmCBM / 体积重ARead-onlyIdempotentInspect
CBM / 体积重(CBM & volumetric weight):算立方数、毛重和空运快递计费重。 CBM, gross weight and chargeable weight for air and express. 读取数据 / Reads: divisors@current, containers@current. 输入为精确的十进制字符串 / Inputs are exact decimal strings. 每箱毛重 grossWeight 可以不填:不填就只算体积,回答里没有总毛重和计费重,并有一句说明。用户只问“多少方”时不要填,绝不要编一个重量。 / grossWeight may be left out: the answer then has the volumes only, and says so. Leave it out when the user asked only for the volume; never invent a weight. 用户没有给的数字和日期不要自己编:必填的先问用户,选填的不填。 / Never make up a figure or a date the user did not give: ask for a required one, leave an optional one out. 回复时引用回答里的 provenance.source_line / Quote provenance.source_line in your reply.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 运输方式。可选值:lcl = 海运拼箱;air = 空运;express = 快递 / Shipping mode. options: lcl = Sea LCL; air = Air; express = Express | |
| cartons | Yes | 箱规 / Carton sizes | |
| airDivisor | No | 空运体积重系数 / Air divisor | |
| lengthUnit | No | 尺寸单位。可选值:cm = cm;mm = mm;in = in / Size unit. options: cm = cm; mm = mm; in = in | |
| weightUnit | No | 重量单位。可选值:kg = kg;lb = lb / Weight unit. options: kg = kg; lb = lb | |
| expressDivisor | No | 快递体积重系数 / Express divisor |
Output Schema
| Name | Required | Description |
|---|---|---|
| tool | Yes | |
| links | Yes | |
| steps | Yes | |
| outputs | Yes | |
| warnings | Yes | |
| normalized | No | |
| provenance | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe read-only/idempotent profile, so the description earns credit for adding behavior beyond that: the consequences of omitting grossWeight (volumes only, with an explicit note in the answer) and the provenance.source_line quoting requirement. It also discloses data dependencies (divisors@current, containers@current).
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?
Purpose is front-loaded and every sentence carries operational rules (omission semantics, no-invention rule, provenance quoting). Length is inflated by full bilingual duplication, which is a design choice rather than 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, so return values need not be spelled out, and the description still covers input format, optionality, output-altering behavior, and reply requirements. Nothing needed 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?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning the schema lacks: grossWeight is optional and changing its presence changes the output (no total gross/chargeable weight), and inputs must be exact decimal strings. This goes beyond the schema's terse field labels.
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 concrete verb+resource set (compute cube/volume, gross weight, and chargeable weight for air and express) and is bilingual for disambiguation. It is clearly distinct from siblings like unit-convert or container-load, which handle different operations.
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 concrete when-to-use guidance: leave grossWeight out when the user only asks for volume, and never invent a weight or date. It does not name sibling alternatives as routes, but for a pure-computation tool there is little ambiguity about which sibling applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
container-load装柜计算器ARead-onlyIdempotentInspect
装柜计算器(Container loading calculator):每柜装多少箱、要几个柜、怎么摆。 Cartons per container, containers needed, and how to stack them. 读取数据 / Reads: containers@current. 输入为精确的十进制字符串 / Inputs are exact decimal strings. 每箱毛重 grossWeight 可以不填:用户没给重量就不要填,绝不要编一个。不填时只按尺寸算能装多少箱、要几个柜,没有核对载重上限;回答里第一条 warning 的 message 说明了这一点,回复用户时必须把这句话原样带上。 / grossWeight may be left out: when the user gave no weight, do not fill it and never invent one. The answer is then a count by size alone with the payload limit not checked; the first warning’s message says so, and your reply must pass that sentence on. 用户没有给的数字和日期不要自己编:必填的先问用户,选填的不填。 / Never make up a figure or a date the user did not give: ask for a required one, leave an optional one out. 回复时引用回答里的 provenance.source_line / Quote provenance.source_line in your reply.
| Name | Required | Description | Default |
|---|---|---|---|
| fill | No | 装满为止(不填箱数) / Fill the container (no carton count) | |
| width | Yes | 宽 / Width | |
| height | Yes | 高 / Height | |
| length | Yes | 长 / Length | |
| upright | No | 必须正放(此面朝上) / This side up only | |
| quantity | No | 箱数 / Cartons | |
| maxLayers | No | 堆叠层数上限 / Max layers | |
| lengthUnit | No | 尺寸单位。可选值:cm = cm;mm = mm;in = in / Size unit. options: cm = cm; mm = mm; in = in | |
| weightUnit | No | 重量单位。可选值:kg = kg;lb = lb / Weight unit. options: kg = kg; lb = lb | |
| grossWeight | No | 每箱毛重 / Gross weight per carton | |
| containerType | No | 柜型。可选值:auto = 自动比较;20gp = 20GP;40gp = 40GP;40hq = 40HQ;45hq = 45HQ / Container. options: auto = Compare all; 20gp = 20GP; 40gp = 40GP; 40hq = 40HQ; 45hq = 45HQ |
Output Schema
| Name | Required | Description |
|---|---|---|
| tool | Yes | |
| links | Yes | |
| steps | Yes | |
| outputs | Yes | |
| warnings | Yes | |
| normalized | No | |
| provenance | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses non-obvious behavior: omitting grossWeight drops payload-limit checking entirely, the first warning message states this and must be relayed verbatim to the user, and the reply must quote provenance.source_line. These are real operational consequences an agent could not infer from the schema or 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 purpose is front-loaded and each rule is actionable, but the bilingual duplication roughly doubles the length, and the 'never invent a figure' instruction is stated twice (once for grossWeight, once generally). Content earns its place, though a bit of redundancy could be trimmed.
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 11 parameters, an output schema, and rich annotations, the description covers what remains: the data source, the optional-weight branch and its warning contract, input-format refusal behavior, and which output fields (normalized, provenance.source_line) matter in the reply. Nothing needed 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 description coverage is already 100%, so the baseline is 3. The description adds meaning the schema does not: grossWeight is genuinely optional and its absence silently changes the calculation semantics (size-only count, no weight check), plus the exact-decimal-string input rule with refusal-and-normalize behavior.
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 computation and its three outputs: cartons per container, number of containers, and stacking arrangement. An agent can immediately distinguish this from siblings like cbm (volume) or unit-convert, since the tool answers a loading-plan question rather than a measurement 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 gives operational when/when-not guidance: grossWeight may be omitted when the user gave no weight, required figures must be asked for, optional ones left out, and reads come from containers@current. It does not name a sibling alternative or a scenario where a different tool should be preferred, so it falls short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fx-convert结算汇率ARead-onlyIdempotentInspect
结算汇率(Settlement exchange rates):人民币汇率中间价,和按你的银行价估算的结汇金额。 RMB central parity, and what you receive at your own bank rate. 读取数据 / Reads: central-parity@current. 输入为精确的十进制字符串 / Inputs are exact decimal strings. 用户没有给的数字和日期不要自己编:必填的先问用户,选填的不填。 / Never make up a figure or a date the user did not give: ask for a required one, leave an optional one out. 回复时引用回答里的 provenance.source_line / Quote provenance.source_line in your reply.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | 外币金额 / Foreign currency amount | |
| keptOn | No | 上次填写的日期 / Date you last entered it | |
| bankRate | No | 你的银行现汇买入价 / Your bank’s spot buying rate | |
| currency | Yes | 币种 / Currency | |
| keptRate | No | 上次填的银行价 / Your last bank rate | |
| keptMidpoint | No | 上次填写那天的中间价 / Central parity on the day you last entered it |
Output Schema
| Name | Required | Description |
|---|---|---|
| tool | Yes | |
| links | Yes | |
| steps | Yes | |
| outputs | Yes | |
| warnings | Yes | |
| normalized | No | |
| provenance | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds genuinely new behavior: it reads a named parity dataset, it refuses any ambiguously readable input with a stated reason rather than guessing, and it reports accepted values in `normalized` and provenance via source_line. Those refusal and provenance traits are not in the annotations, though the description stops short of describing rounding/rate-date semantics.
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?
Front-loaded with the tool's purpose and data source, then constraints, then reply instructions; every element is actionable. It is, however, written twice in full (Chinese and English), which roughly doubles length without adding 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?
An output schema exists, so return values need not be enumerated, and the description still points at the two fields that matter for a correct answer (normalized, provenance.source_line). Combined with complete annotations and 100% parameter coverage, an agent has everything needed to 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 baseline is 3. The description restates the decimal-string rule and the never-invent-a-figure policy for amount/dates, which reinforces but does not extend the per-parameter schema text; it adds no meaning for bankRate, keptRate, keptMidpoint, or keptOn beyond what the schema descriptions already say.
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 concrete resource and output: RMB central parity plus an estimated settlement amount at the user's own bank rate, and pins the data source (central-parity@current). It is clearly more than a restatement of the title, but it never contrasts itself with the sibling fx-cost, so an agent must guess which of the two FX tools 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?
Usage is only implied: the 'Reads: central-parity@current' line and the 'ask for required, omit optional' rule imply when the tool is appropriate and how to gather inputs. There is no explicit when-to-use/when-not-to-use statement and no routing advice versus fx-cost or unit-convert.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fx-cost结汇成本计算器ARead-onlyIdempotentInspect
结汇成本计算器(FX conversion cost calculator):比较银行和其他方式一年到手多少人民币。 Compare banks and other options: how much RMB you actually get in a year. 读取数据 / Reads: central-parity@current. 输入为精确的十进制字符串 / Inputs are exact decimal strings. 用户没有给的数字和日期不要自己编:必填的先问用户,选填的不填。 / Never make up a figure or a date the user did not give: ask for a required one, leave an optional one out. 回复时引用回答里的 provenance.source_line / Quote provenance.source_line in your reply.
| Name | Required | Description | Default |
|---|---|---|---|
| useB | No | 添加方案 B / Add option B | |
| useC | No | 添加方案 C / Add option C | |
| nameB | No | 方案 B 的名称 / Option B’s name | |
| nameC | No | 方案 C 的名称 / Option C’s name | |
| bankFee | No | 银行的每笔费用(CNY) / Bank’s fee per payment (CNY) | |
| receipts | Yes | 收汇情况 / Your receipts | |
| feePercentB | No | 方案 B 的费率(%) / Option B’s fee rate (%) | |
| feePercentC | No | 方案 C 的费率(%) / Option C’s fee rate (%) | |
| feePerReceiptB | No | 方案 B 的每笔费用(CNY) / Option B’s fee per payment (CNY) | |
| feePerReceiptC | No | 方案 C 的每笔费用(CNY) / Option C’s fee per payment (CNY) |
Output Schema
| Name | Required | Description |
|---|---|---|
| tool | Yes | |
| links | Yes | |
| steps | Yes | |
| outputs | Yes | |
| warnings | Yes | |
| normalized | No | |
| provenance | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish a safe read-only, idempotent, closed-world operation, and the description adds genuinely new behavior: it declares the external dependency (central-parity@current), the refusal policy for ambiguous input ('读不准的一律拒绝并说明原因,绝不猜'), and the normalized/provenance fields in the reply. That is real context beyond the structured safety hints.
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 purpose and data source are front-loaded and each sentence carries actionable content (input format, no-fabrication rule, provenance citation). Length is inflated by full bilingual duplication, which is audience-driven rather than padding, so it stays efficient but is not maximally tight.
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 needn't restate return values, and it correctly focuses on inputs, data dependency, and refusal/normalization semantics for a 10-parameter tool. Only the missing sibling-routing guidance (fx-convert vs fx-cost) keeps it from being fully complete.
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 every property (useB, receipts, feePercentB, bankFee, etc.) is documented in the schema itself, so the baseline is 3. The description only reinforces the decimal-string format rather than adding per-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 a specific verb and resource ('结汇成本计算器' / FX conversion cost calculator) and states the outcome it produces ('compare banks and other options: how much RMB you actually get in a year'), so an agent knows what it computes. It does not, however, distinguish itself from the sibling fx-convert, leaving the boundary between the two to inference.
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 guidance present ('用户没有给的数字和日期不要自己编', 'Reads: central-parity@current') governs how to fill parameters and where data comes from, not when to choose this tool over fx-convert or the other siblings. There is no when-to-use / when-not-to-use statement and no named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dataset数据集版本ARead-onlyIdempotentInspect
一个数据集:全部版本,新的在前,含日期、记录条数、列和内容校验。 One dataset: its versions, newest first, with date, row count, columns and content hash.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset | Yes | 数据集编号,来自 list_datasets,例如 central-parity(人民币汇率中间价)、refund-rates(出口退税率文库)。 A dataset id from list_datasets. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds genuinely useful non-annotation context: that all versions are returned newest-first with date, row count, columns and content hash.
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?
A single tight sentence with the key scope ('all versions, newest first') front-loaded. The full bilingual duplication is mildly redundant but does not obscure the 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?
There is no output schema, so the description must carry the return shape, and it does by listing versions, ordering, date, row count, columns and content hash. What is missing is whether results are paginated or how a missing/invalid id is surfaced.
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?
Only one parameter and schema coverage is 100%, with the schema itself carrying rich examples (central-parity, refund-rates). The description adds no format/syntax detail beyond that, so the baseline 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?
States a specific verb+resource ('one dataset: its versions') and enumerates the returned fields, so the agent knows exactly what it gets. It names list_datasets as the id source but does not explicitly distinguish itself from the sibling get_dataset_rows, so it falls short of a 5.
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 implies usage by telling the agent where the dataset id comes from (list_datasets), but gives no when-to-use vs. get_dataset_rows (metadata/version listing) guidance and no exclusions or prerequisites beyond that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dataset_rows数据集数据行BRead-onlyIdempotentInspect
一个数据集版本的一页数据行,与发布的一致(不指定版本时取当前版本)。 A page of the rows of one dataset version, as published (the current version when none is named).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 一页多少行,默认 1000,最多 5000。 Rows in the page (default 1000, at most 5000). | |
| offset | No | 跳过的行数,默认 0。 Rows to skip (default 0). | |
| dataset | Yes | 数据集编号,来自 list_datasets,例如 central-parity(人民币汇率中间价)。 A dataset id from list_datasets. | |
| version | No | 版本号,来自 get_dataset;不填就是当前版本。 A version from get_dataset; the current one when left out. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description usefully adds that rows match what was published and that the current version is used when none is named, but says nothing about pagination behavior, large-result handling, or result ordering.
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?
Two short, front-loaded sentences with no filler, and the most decision-relevant fact (equivalent to published data, current version by default) leads. The bilingual duplication adds length but is consistent with the schema's own bilingual style.
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 no output schema, an agent would benefit from knowing the shape of a row (columns, keying, whether rows are JSON objects) and how to page through the full dataset, neither of which is covered. Adequate for invoking the tool, but thin for interpreting or iterating results.
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 every parameter is already documented in the schema, including the version default and the limit/offset semantics. The description's restatement of the version default adds no information beyond the schema; baseline 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?
States a concrete verb and resource: retrieving a page of rows from one dataset version, with the version default resolved. It is distinguishable from get_dataset and list_datasets by the 'rows' framing, though it never names those siblings explicitly.
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 no when-to-use or when-not-to-use guidance and no mention of the alternatives (get_dataset for metadata, list_datasets for ids). The only conditional given is the version default, which is a behavior, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_datasets数据集列表BRead-onlyIdempotentInspect
本站公开的数据集(人民币汇率中间价、出口退税率文库、集装箱规格…),每个附当前版本。 The datasets the site publishes (人民币汇率中间价, 出口退税率文库, 集装箱规格…), each with its current version.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and a closed-world scope, so the safety profile is covered. The description's added value is the note that each dataset carries a current version, but it says nothing about result size, ordering, or pagination for a zero-parameter enumeration tool.
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?
Front-loaded and focused, but the entire sentence is duplicated in Chinese and English with no added information in the second pass, which halves the effective information density. Neither version is padded beyond the duplication.
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 trivial zero-argument, read-only list tool with no output schema, the description conveys what the enumeration contains and that a version accompanies each entry. The only real gap is how the result relates to the get_dataset sibling, which the description leaves implicit.
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 takes no parameters (0 params, 100% schema coverage), so per the baseline there is nothing for the description to disambiguate. No misleading parameter talk is present.
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 definition identifies the resource precisely — the site's published datasets — and adds scope via examples (人民币汇率中间价, 出口退税率文库, 集装箱规格) plus the 'each with its current version' qualifier. It never states the verb itself (listing is only carried by the name/title), and it does not explicitly distinguish itself from get_dataset or get_dataset_rows, so it falls short of a 5.
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 no when-to-use guidance, no preconditions, and no mention of the alternatives (get_dataset, get_dataset_rows) despite three dataset-related siblings existing. The agent must infer that this is the entry-point enumeration tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_refund_rate出口退税率查询ARead-onlyIdempotentInspect
查询一个海关编码(HS 编码、商品编码,8 位或 10 位,可带点)在出口退税率文库中的出口退税率(退税率、征税率),用于“帮我查一下海关编码 … 的出口退税率”这类问题。返回该编码的各个时期,并标出适用的一期:给出 export_date(报关单出口日期,不是开票日期)就按那一天;没给就按今天(北京时间),回答里的 lookup.in_force_on 写明用的是哪一天。用户问“现在”“今天”时不要填 export_date,绝不要自己猜今天的日期;回答时说明是按哪一天标出的。编码不在文库中时返回 found: false 和相近编码,绝不编造税率。本站非官方渠道,仅供参考,以官方公布为准,请把答案里的 notes 一并转告用户。 Look up the export VAT refund rate (出口退税率, 退税率) of ONE customs / HS code (海关编码, 商品编码; 8 or 10 digits, dots allowed, e.g. 8506101110) in the 出口退税率文库. Use it for "帮我查一下海关编码 … 的出口退税率" / "what is the export refund rate of HS code …". Returns every period of the code (refund rate, levy rate 征税率, from, to) and the period in force on one day: export_date when given, otherwise today by the Beijing calendar (lookup.in_force_on names the day). The rate that counts is the one on the export date of the customs declaration (报关单出口日期), not the invoice date: for “now” or “today” leave export_date out and never guess today’s date; say in your reply which day the period was marked for. An unknown code answers found: false with nearby codes, never a rate. Reference data from this site, not the official channel; the official publication prevails. Pass on the notes in the answer.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | 海关编码(HS 编码),8 位或 10 位,可带点或空格,例如 8506101110。 The customs code, 8 or 10 digits (dots and spaces allowed), e.g. 8506101110. | |
| export_date | No | 报关单上的出口日期(不是开票日期),格式 YYYY-MM-DD;不填则按今天(北京时间)标出适用的一期。用户问“现在”就不填,绝不要自己猜今天的日期。 The export date on the customs declaration, YYYY-MM-DD (not the invoice date). Optional: without it the period in force today (Beijing calendar) is marked; leave it out for “now” and never guess today’s date. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely new behavior: unknown codes return found: false with nearby codes and never a fabricated rate, the rate is keyed to the declaration export date rather than the invoice date, lookup.in_force_on names the reference day, and the notes must be relayed to the user with the non-official-source caveat.
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?
Purpose is front-loaded and the sentences are individually tight, but the entire content is duplicated in Chinese and English, roughly doubling the length with no new information. The repeated 'never guess today's date' instruction also appears three times across the description and schema.
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 no output schema, the description carries the return contract itself: every period (refund rate, levy rate 征税率, from, to), the in-force period, in_force_on, and the found:false/nearby-codes failure shape. Combined with the annotations, an agent has everything needed to call and interpret 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 description coverage is 100%, and the schema entries for code and export_date already carry the same format and 'not the invoice date / Beijing calendar' semantics the description repeats. Per the rubric, repeating structured data earns no extra credit, so the baseline 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 states a precise verb+resource: look up the export VAT refund rate of ONE customs/HS code in the 出口退税率文库, with accepted formats (8/10 digits, dots/spaces) and an example. The word 'ONE' implicitly scopes it as a single-code lookup. It does not name or contrast with the sibling 'tuishui', which is the most plausible overlap, so it falls short of full sibling differentiation.
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 trigger phrasing ('帮我查一下海关编码 … 的出口退税率'), states exactly when to supply export_date (the customs declaration export date) versus when to omit it ('现在'/'今天'), and warns never to guess today's date. It also says to state in the reply which day was used. This is about as complete a when/when-not/behavioral-routing set as a lookup tool can carry.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
maitou唛头生成ARead-onlyIdempotentInspect
唛头生成(Shipping mark generator):正唛和侧唛,A4 或 100×150 mm 标签直接打印。 Main and side marks, printed on A4 or 100×150 mm labels. 输入为精确的十进制字符串 / Inputs are exact decimal strings. 用户没有给的数字和日期不要自己编:必填的先问用户,选填的不填。 / Never make up a figure or a date the user did not give: ask for a required one, leave an optional one out. 回复时引用回答里的 provenance.source_line / Quote provenance.source_line in your reply.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | 正唛 / Main mark | |
| width | Yes | 宽(cm) / Width (cm) | |
| height | Yes | 高(cm) / Height (cm) | |
| length | Yes | 长(cm) / Length (cm) | |
| cartons | Yes | 箱数 / Carton count | |
| capitals | No | 拉丁字母全部大写 / Capitalise Latin letters | |
| netWeight | Yes | 每箱净重 N.W.(kg) / N.W./carton (kg) | |
| grossWeight | Yes | 每箱毛重 G.W.(kg) / G.W./carton (kg) |
Output Schema
| Name | Required | Description |
|---|---|---|
| tool | Yes | |
| links | Yes | |
| steps | Yes | |
| outputs | Yes | |
| printed | No | |
| warnings | Yes | |
| normalized | No | |
| provenance | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description still adds genuinely new behaviour: exact-decimal-string inputs, refusal with a reason when a value is ambiguous ('读不准的一律拒绝并说明原因,绝不猜'), and the instruction to quote provenance.source_line in the reply. These cover error handling and output conventions the annotations cannot express.
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?
Purpose is front-loaded, which is good, but the whole description is duplicated in Chinese and English, effectively doubling the text for the same content. For a bilingual audience that may be defensible, yet it means every sentence is paid for twice and the no-fabrication rule is stated at length. Structure is sound; economy is not.
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, return values need not be described, and the description still points at `normalized` and provenance.source_line. Combined with the rich annotations and 100% parameter coverage, an agent knows what to send, what to refuse, and what to cite. Only explicit guidance on when this tool is chosen over siblings 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 every one of the 8 parameters carries a bilingual description with a regex pattern, so the schema does the heavy lifting. The description reinforces the string-format convention ('输入为精确的十进制字符串') and the no-fabrication rule, but adds no per-parameter meaning beyond what the schema already documents.
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+resource (唛头生成 / Shipping mark generator) and even nails the output artifact: main marks (正唛) and side marks (侧唛) printed on A4 or 100×150 mm labels. That is far more concrete than a bare title restatement. It doesn't explicitly contrast itself with any sibling, but none of the other tools (baojia, cbm, container-load, fx-convert, etc.) overlap with shipping-mark generation, so disambiguation is not really at stake.
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 context is implied by the resource name, and the description adds a behavioural rule for missing data ('ask for a required one, leave an optional one out'). However, it never states when to reach for this tool versus a sibling, nor any preconditions beyond the no-fabrication rule. Implied usage with a useful extra instruction, but no explicit when-to-use framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_quote生成报价单ARead-onlyIdempotentInspect
按报价工具的输入和卖方的条款,生成一份发给买方的报价单:quote 是结构化数据(https://chukoudan.com/schemas/quote/v1.json,只有价格和条款,带 digest 和汇率依据,买方可核对),text 是可直接发出的纯文本(语言按 language),internal 是卖方自己的成本、退税和利润,只给卖方看,绝不发给买方。本站不保存任何内容。 Make a quote for a buyer from the quote calculator’s inputs (pricing) and the seller’s terms (quote): quote is the quote as data (schema https://chukoudan.com/schemas/quote/v1.json; prices and terms only, with a digest and the dated rate it rests on, so the buyer can check it), text is the same quote as plain text ready to send, and internal holds the seller’s own cost, refund and profit: for the seller only, NEVER send it to the buyer. Leave pricing.fxRate out to use the day’s RMB central parity. Nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| quote | Yes | 报价单上的其他内容:卖方、买方、品名、术语、港口、有效期、付款方式、交货期。 What the quote says besides the prices: seller, buyer, goods, terms, ports, validity, payment, lead time. | |
| pricing | Yes | 报价工具(baojia)的输入;不填 fxRate 就用当天的人民币汇率中间价。 The inputs of the quote calculator (baojia); leave fxRate out to use the day’s RMB central parity. |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | Yes | |
| tool | Yes | |
| quote | Yes | |
| internal | Yes | The seller’s own figures (cost, refund, profit, margin, break-even): never send these to the buyer. |
| provenance | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint, idempotent, non-destructive, closed world), and the description corroborates and extends it: 'Nothing is stored' explains why a document-generating tool is read-only, and it discloses the shape and audience of each output field. The explicit warning that `internal` holds the seller's cost, refund and profit and must NEVER be sent to the buyer is exactly the kind of behavioral disclosure annotations cannot carry.
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?
Front-loaded with the core purpose and then the three output fields, the buyer-safety warning, and the fxRate default — each sentence adds information. The bilingual duplication roughly doubles the length, but given the audience mix it is dense rather than padded.
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, so return values need no explanation, yet the description still describes the three returned fields and the no-storage guarantee, which is more than sufficient for a 2-parameter tool. The only gap is the dangling `language` reference that controls the `text` language but is absent from the input schema.
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 every `pricing` and `quote` field, which sets the baseline at 3. The description adds some value by characterizing the nested `quote` object (prices and terms only, with a digest and the dated rate it rests on) and the fxRate default, but its reference to a `language` parameter that does not exist in the schema slightly muddies 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?
States a specific verb and resource (generate a quote for a buyer) and grounds it in the two input sources: the quote calculator's pricing inputs plus the seller's terms. The three-part output structure (quote/text/internal) further pins down what the tool produces, which cleanly distinguishes it from the sibling calculator `baojia`.
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 is implied rather than stated: it says the quote is built from 'the quote calculator's inputs (pricing)', which hints the agent should run `baojia` first, and it gives a concrete default rule ('Leave pricing.fxRate out to use the day's RMB central parity'). But it never says when to call this versus `baojia`, nor any exclusion or prerequisite, so the agent must infer the workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tuishui出口退税计算器ARead-onlyIdempotentInspect
出口退税计算器(Export tax refund calculator):填发票金额和退税率,立刻看到应退税额和每一步的出处。 Trading companies (exempt-and-refund) and manufacturers (exempt-credit-refund). 读取数据 / Reads: refund-rates@current, central-parity@current. 输入为精确的十进制字符串 / Inputs are exact decimal strings. 用户没有给的数字和日期不要自己编:必填的先问用户,选填的不填。 / Never make up a figure or a date the user did not give: ask for a required one, leave an optional one out. 回复时引用回答里的 provenance.source_line / Quote provenance.source_line in your reply.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 计算方式。可选值:period = 按申报期计算;order = 单笔估算 / How to work it out. options: period = For a filing period; order = One-order estimate | |
| exports | Yes | 出口货物 / Exported goods | |
| inputTax | No | 当期进项税额(CNY) / Input VAT this period (CNY) | |
| outputTax | No | 当期内销销项税额(CNY) / Output VAT on domestic sales this period (CNY) | |
| carriedCredit | No | 上期留抵税额(CNY) / Credit carried from the last period (CNY) | |
| enterpriseType | Yes | 企业类型。可选值:trading = 外贸企业(免退税);manufacturer = 生产企业(免抵退) / Business type. options: trading = Trading company (exempt-and-refund); manufacturer = Manufacturer (exempt-credit-refund) | |
| declaredEndCredit | No | 申报表的期末留抵税额(可选)(CNY) / Period-end credit on the VAT return (optional) (CNY) |
Output Schema
| Name | Required | Description |
|---|---|---|
| tool | Yes | |
| links | Yes | |
| steps | Yes | |
| outputs | Yes | |
| warnings | Yes | |
| normalized | No | |
| provenance | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, closed-world behavior, so the description isn't carrying the safety burden. It still adds real behavioral context: inputs must be exact decimal strings, values that cannot be read unambiguously are refused with a reason rather than guessed, and the caller must cite provenance.source_line in the reply. That is meaningful operational detail 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 purpose is front-loaded in the first clause, followed by data sources, input conventions, and an anti-fabrication rule. Every sentence carries a distinct constraint; the bilingual duplication is a deliberate inclusion choice rather than 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, so return values (including provenance and normalized) need not be documented, and the description correctly points at provenance.source_line instead. With 100% schema coverage and clear safety annotations, the only missing element is explicit routing against alternative tools.
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 every parameter carries a bilingual description, so the schema does the heavy lifting — the baseline of 3 applies. The description reinforces the exact-decimal-string input convention but adds no per-parameter meaning beyond what the schema already documents.
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 concrete verb+resource: given invoice amount and refund rate, it computes the refundable tax and shows each step's derivation, and it names the two regimes (trading/exempt-and-refund, manufacturer/exempt-credit-refund). It also discloses the data it reads (refund-rates@current, central-parity@current), which implicitly separates it from the rate-lookup sibling. It never names lookup_refund_rate or the quote siblings outright, so the differentiation is inferential rather than explicit.
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 tells the agent how to behave inside the call (ask for required figures, omit optional ones, quote provenance) and which enterprise regimes apply, but it gives no when-to-use/when-not guidance against siblings such as lookup_refund_rate or make_quote. Usage is implied by the calculation framing rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unit-convert单位换算ARead-onlyIdempotentInspect
单位换算(Unit converter):长度、重量、体积,按国际通用的定义系数换算。 Length, weight and volume, with the internationally defined factors. 输入为精确的十进制字符串 / Inputs are exact decimal strings. 用户没有给的数字和日期不要自己编:必填的先问用户,选填的不填。 / Never make up a figure or a date the user did not give: ask for a required one, leave an optional one out. 回复时引用回答里的 provenance.source_line / Quote provenance.source_line in your reply.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | 换算为。可选值:mm = 毫米 mm;cm = 厘米 cm;m = 米 m;in = 英寸 in;ft = 英尺 ft;g = 克 g;kg = 千克 kg;t = 公吨 t;lb = 磅 lb;cm3 = 立方厘米 cm³;L = 升 L;m3 = 立方米 m³;in3 = 立方英寸 in³;ft3 = 立方英尺 ft³ / Convert to. options: mm = mm; cm = cm; m = m; in = in; ft = ft; g = g; kg = kg; t = t (metric ton); lb = lb; cm3 = cm³; L = L; m3 = m³; in3 = in³; ft3 = ft³ | |
| from | Yes | 原单位。可选值:mm = 毫米 mm;cm = 厘米 cm;m = 米 m;in = 英寸 in;ft = 英尺 ft;g = 克 g;kg = 千克 kg;t = 公吨 t;lb = 磅 lb;cm3 = 立方厘米 cm³;L = 升 L;m3 = 立方米 m³;in3 = 立方英寸 in³;ft3 = 立方英尺 ft³ / From. options: mm = mm; cm = cm; m = m; in = in; ft = ft; g = g; kg = kg; t = t (metric ton); lb = lb; cm3 = cm³; L = L; m3 = m³; in3 = in³; ft3 = ft³ | |
| value | Yes | 数值 / Value |
Output Schema
| Name | Required | Description |
|---|---|---|
| tool | Yes | |
| links | Yes | |
| steps | Yes | |
| outputs | Yes | |
| warnings | Yes | |
| normalized | No | |
| provenance | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that: ambiguous input is refused with a reason rather than guessed, and the answer carries `normalized` and `provenance.source_line` fields. It does not discuss rounding/precision limits of the conversion itself, which is the one behavioral trait an agent might still wonder about.
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?
Content is front-loaded and every clause is actionable, but the fully duplicated Chinese/English text roughly doubles the length for no added meaning. It also carries boilerplate irrelevant to a unit converter (currency symbols, date formats such as 2026/05/01, provenance quoting), which reads as template spillover into a pure length/weight/volume 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?
With a full schema and an output schema present, the description need not explain return values, and it correctly does not. It covers input constraints, refusal-on-ambiguity, and the reply convention. The one gap is the sibling boundary: nothing states that currency conversion belongs to fx-convert, so the agent must infer the domain split.
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 parameter list and unit enumerations are already documented. The description still adds value beyond the schema by specifying accepted input forms for `value` (decimal string preferred, JSON number allowed, thousands commas only as 1,234,567, dot decimal, no unit or currency suffix) and by noting unit aliases like 'cm' or '厘米'. That is real semantic enrichment on top of an already-complete 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 a specific resource (unit conversion) and enumerates its scope: length, weight and volume, with internationally defined factors. This implicitly carves it away from the currency-focused siblings (fx-convert, fx-cost), but it never names those siblings or explicitly excludes currency, so an agent facing an ambiguous 'convert' request has to infer the boundary.
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 real usage discipline — ask the user for required inputs rather than inventing them, leave optional ones out, quote provenance.source_line in the reply — but these are response-handling rules, not when-to-use-this-tool-vs-alternatives guidance. Nothing tells the agent when to route to fx-convert instead, leaving usage at the implied level.
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.
1 tool update
- Changed
container-load44 fields changed- added
Output schema / $defs / container_loadOutputs / properties / fullVolumeUse20GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / fullVolumeUse40GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / fullVolumeUse40HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / fullVolumeUse45HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / fullWeight20GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / fullWeight40GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / fullWeight40HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / fullWeight45HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / fullWeightUse20GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / fullWeightUse40GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / fullWeightUse40HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / fullWeightUse45HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastDoorGap20GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastDoorGap40GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastDoorGap40HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastDoorGap45HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastDoorGapIn20GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastDoorGapIn40GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastDoorGapIn40HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastDoorGapIn45HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastRowBoxes20GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastRowBoxes40GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastRowBoxes40HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastRowBoxes45HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastRows20GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastRows40GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastRows40HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastRows45HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastVolumeUse20GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastVolumeUse40GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastVolumeUse40HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastVolumeUse45HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastWeight20GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastWeight40GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastWeight40HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastWeight45HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastWeightUse20GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastWeightUse40GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastWeightUse40HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / lastWeightUse45HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / usedRows20GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / usedRows40GPAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / usedRows40HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +} - added
Output schema / $defs / container_loadOutputs / properties / usedRows45HQAdded value: +{ + "$ref": "#/$defs/PlainValue" +}
9 tool updates
- Changed
baojia2 fields changed- added
Input schema / examplesAdded value: +[ + { + "containers": "1", + "currency": "USD", + "freight": "1800", + "freightBasis": "container", + "fxRate": "7.0850", + "margin": "10", + "marginBasis": "quote", + "mode": "forward", + "price": "50", + "quantity": "4500", + "quotedPrice": "7.50", + "refundRate": "13", + "taxRate": "13", + "term": "FOB" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "Links": { + "additionalProperties": false, + "description": "Addresses that go with the answer. `page`: the tool’s page on the site with the same inputs in its address, in the language asked (Chinese for a language the site does not publish yet), so a person can open the page that shows these numbers.", + "properties": { + "page": { + "description": "The tool’s page holding these inputs.", + "format": "uri", + "type": "string" + } + }, + "required": [ + "page" + ], + "type": "object" + }, + "Normalized": { + "description": "What the API changed in the inputs before core saw them, so the caller sees what was understood: a JSON number as text, a thousands comma, full-width digits, a currency or unit name or a date written another way. Absent when nothing was changed.", + "items": { + "additionalProperties": false, + "properties": { + "given": { + "description": "What was sent, as text.", + "type": "string" + }, + "path": { + "description": "The input, like `cartons.0.length`.", + "type": "string" + }, + "used": { + "description": "What core was given.", + "type": "string" + } + }, + "required": [ + "path", + "given", + "used" + ], + "type": "object" + }, + "type": "array" + }, + "PlainValue": { + "description": "A figure, tagged so a reader knows how to write it: amounts and quantities are exact decimal strings, never floats.", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "amount": { + "type": "string" + }, + "currency": { + "description": "An ISO 4217 code.", + "type": "string" + }, + "kind": { + "const": "money" + } + }, + "required": [ + "kind", + "amount", + "currency" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "quantity" + }, + "places": { + "description": "How many decimal places the rounding rule keeps; pad to it, never round.", + "minimum": 0, + "type": "integer" + }, + "unit": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "unit" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "ratio" + }, + "value": { + "description": "A fraction: 0.13 is 13 %.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "base": { + "type": "string" + }, + "kind": { + "const": "rate" + }, + "per": { + "description": "`per` units of `base` cost `value` units of `quote`.", + "type": "string" + }, + "quote": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "base", + "quote", + "per" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "grouping": { + "const": false + }, + "kind": { + "const": "count" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "code" + }, + "value": { + "description": "A token from a fixed list the tool exports; the words for it are the copy key `<tool>.code.<value>`.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "date" + }, + "value": { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + } + ] + }, + "Provenance": { + "additionalProperties": false, + "description": "Where the figures in an answer come from. In every answer, errors included.", + "properties": { + "api": { + "const": "v1" + }, + "datasets": { + "items": { + "$ref": "#/$defs/ProvenanceDataset" + }, + "type": "array" + }, + "generated_at": { + "description": "When the answer was made.", + "format": "date-time", + "type": "string" + }, + "language": { + "description": "The language of the source lines.", + "enum": [ + "zh-CN", + "en", + "ja", + "ko" + ] + }, + "license": { + "additionalProperties": false, + "description": "The license as copy keys: which text applies. `status` was `draft` until the text was approved (2026-10-12) and is `approved` now.", + "properties": { + "ours": { + "type": "string" + }, + "status": { + "enum": [ + "draft", + "approved" + ] + }, + "underlying": { + "type": "string" + } + }, + "required": [ + "status", + "ours", + "underlying" + ], + "type": "object" + }, + "notice": { + "description": "本站非官方渠道的说明:引用本站数据时请和来源行一起转述。 / The site’s own line that it is not an official channel: pass it on with the source line when you quote us.", + "type": "string" + }, + "site": { + "description": "The site the data is published by.", + "type": "string" + }, + "source_line": { + "description": "来源行:回复用户时请原样引用它,让读者知道数据出自哪里、有多新。 / The credit line to quote as it is when you answer: who the figures come from and how fresh they are (the newest publisher’s day among the datasets used, or the day the answer was made).", + "type": "string" + } + }, + "required": [ + "api", + "site", + "generated_at", + "language", + "source_line", + "notice", + "datasets", + "license" + ], + "type": "object" + }, + "ProvenanceDataset": { + "additionalProperties": false, + "description": "A dataset version an answer drew on. An origin the register does not let the site show is named nowhere.", + "properties": { + "id": { + "description": "The dataset.", + "type": "string" + }, + "origin": { + "description": "The origin’s id in the register; null when the site may not show it.", + "type": [ + "string", + "null" + ] + }, + "published_at": { + "description": "The publisher’s own date (and time, with its offset, when it gives one).", + "type": "string" + }, + "source": { + "description": "The publisher’s own source line, in the answer’s language; null when there is none to show.", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "The publisher’s page, only where the register lets the site link to it.", + "type": "string" + }, + "version": { + "description": "Its version, named after the publisher’s date.", + "type": "string" + } + }, + "required": [ + "id", + "version", + "published_at", + "origin", + "source" + ], + "type": "object" + }, + "Step": { + "additionalProperties": false, + "description": "One line of the worked example: `id` is the copy key of its sentence, `values` fill it in.", + "properties": { + "id": { + "type": "string" + }, + "message": { + "description": "这一步的一句话说明,数值已代入,用请求的语言。 / The step as one sentence in the language asked, its figures filled in. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "id", + "values" + ], + "type": "object" + }, + "Warning": { + "additionalProperties": false, + "description": "Something a reader should know about a result; `code` is a copy key.", + "properties": { + "code": { + "type": "string" + }, + "level": { + "description": "Absent means a caution.", + "enum": [ + "note", + "hint" + ] + }, + "message": { + "description": "这条提醒的一句话说明,数值已代入,用请求的语言:回复时请用它,不要自己编数字。 / The warning as one sentence in the language asked, its figures filled in: use it, do not make up figures. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "next": { + "description": "For a hint: the slug of the tool it points to.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "code", + "values" + ], + "type": "object" + }, + "baojiaOutputs": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "description": "Each figure core returns, by id, as a tagged value. The ids listed are the ones the tool’s manifest names; a tool may return more (a figure that only its worked steps use), in the same form.", + "properties": { + "breakEvenCfr": { + "$ref": "#/$defs/PlainValue" + }, + "breakEvenCif": { + "$ref": "#/$defs/PlainValue" + }, + "breakEvenFob": { + "$ref": "#/$defs/PlainValue" + }, + "commissionPriceCfr": { + "$ref": "#/$defs/PlainValue" + }, + "commissionPriceCif": { + "$ref": "#/$defs/PlainValue" + }, + "commissionPriceFob": { + "$ref": "#/$defs/PlainValue" + }, + "commissionTotalCfr": { + "$ref": "#/$defs/PlainValue" + }, + "commissionTotalCif": { + "$ref": "#/$defs/PlainValue" + }, + "commissionTotalFob": { + "$ref": "#/$defs/PlainValue" + }, + "costTotal": { + "$ref": "#/$defs/PlainValue" + }, + "marginAltCfr": { + "$ref": "#/$defs/PlainValue" + }, + "marginAltCif": { + "$ref": "#/$defs/PlainValue" + }, + "marginAltFob": { + "$ref": "#/$defs/PlainValue" + }, + "marginCfr": { + "$ref": "#/$defs/PlainValue" + }, + "marginCif": { + "$ref": "#/$defs/PlainValue" + }, + "marginFob": { + "$ref": "#/$defs/PlainValue" + }, + "priceCfr": { + "$ref": "#/$defs/PlainValue" + }, + "priceCif": { + "$ref": "#/$defs/PlainValue" + }, + "priceFob": { + "$ref": "#/$defs/PlainValue" + }, + "profitCfr": { + "$ref": "#/$defs/PlainValue" + }, + "profitCif": { + "$ref": "#/$defs/PlainValue" + }, + "profitFob": { + "$ref": "#/$defs/PlainValue" + }, + "refundTotal": { + "$ref": "#/$defs/PlainValue" + }, + "totalCfr": { + "$ref": "#/$defs/PlainValue" + }, + "totalCif": { + "$ref": "#/$defs/PlainValue" + }, + "totalFob": { + "$ref": "#/$defs/PlainValue" + } + }, + "required": [ + "priceFob", + "totalFob", + "profitFob", + "breakEvenFob", + "refundTotal", + "costTotal" + ], + "type": "object" + } + }, + "additionalProperties": false, + "properties": { + "links": { + "$ref": "#/$defs/Links" + }, + "normalized": { + "$ref": "#/$defs/Normalized" + }, + "outputs": { + "$ref": "#/$defs/baojiaOutputs" + }, + "provenance": { + "$ref": "#/$defs/Provenance" + }, + "steps": { + "items": { + "$ref": "#/$defs/Step" + }, + "type": "array" + }, + "tool": { + "const": "baojia" + }, + "warnings": { + "items": { + "$ref": "#/$defs/Warning" + }, + "type": "array" + } + }, + "required": [ + "tool", + "outputs", + "steps", + "warnings", + "links", + "provenance" + ], + "type": "object" +}
- Changed
cbm2 fields changed- added
Input schema / examplesAdded value: +[ + { + "cartons": [ + { + "grossWeight": "18", + "height": "50", + "length": "60", + "quantity": "450", + "width": "40" + } + ], + "lengthUnit": "cm", + "mode": "lcl", + "weightUnit": "kg" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "Links": { + "additionalProperties": false, + "description": "Addresses that go with the answer. `page`: the tool’s page on the site with the same inputs in its address, in the language asked (Chinese for a language the site does not publish yet), so a person can open the page that shows these numbers.", + "properties": { + "page": { + "description": "The tool’s page holding these inputs.", + "format": "uri", + "type": "string" + } + }, + "required": [ + "page" + ], + "type": "object" + }, + "Normalized": { + "description": "What the API changed in the inputs before core saw them, so the caller sees what was understood: a JSON number as text, a thousands comma, full-width digits, a currency or unit name or a date written another way. Absent when nothing was changed.", + "items": { + "additionalProperties": false, + "properties": { + "given": { + "description": "What was sent, as text.", + "type": "string" + }, + "path": { + "description": "The input, like `cartons.0.length`.", + "type": "string" + }, + "used": { + "description": "What core was given.", + "type": "string" + } + }, + "required": [ + "path", + "given", + "used" + ], + "type": "object" + }, + "type": "array" + }, + "PlainValue": { + "description": "A figure, tagged so a reader knows how to write it: amounts and quantities are exact decimal strings, never floats.", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "amount": { + "type": "string" + }, + "currency": { + "description": "An ISO 4217 code.", + "type": "string" + }, + "kind": { + "const": "money" + } + }, + "required": [ + "kind", + "amount", + "currency" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "quantity" + }, + "places": { + "description": "How many decimal places the rounding rule keeps; pad to it, never round.", + "minimum": 0, + "type": "integer" + }, + "unit": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "unit" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "ratio" + }, + "value": { + "description": "A fraction: 0.13 is 13 %.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "base": { + "type": "string" + }, + "kind": { + "const": "rate" + }, + "per": { + "description": "`per` units of `base` cost `value` units of `quote`.", + "type": "string" + }, + "quote": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "base", + "quote", + "per" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "grouping": { + "const": false + }, + "kind": { + "const": "count" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "code" + }, + "value": { + "description": "A token from a fixed list the tool exports; the words for it are the copy key `<tool>.code.<value>`.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "date" + }, + "value": { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + } + ] + }, + "Provenance": { + "additionalProperties": false, + "description": "Where the figures in an answer come from. In every answer, errors included.", + "properties": { + "api": { + "const": "v1" + }, + "datasets": { + "items": { + "$ref": "#/$defs/ProvenanceDataset" + }, + "type": "array" + }, + "generated_at": { + "description": "When the answer was made.", + "format": "date-time", + "type": "string" + }, + "language": { + "description": "The language of the source lines.", + "enum": [ + "zh-CN", + "en", + "ja", + "ko" + ] + }, + "license": { + "additionalProperties": false, + "description": "The license as copy keys: which text applies. `status` was `draft` until the text was approved (2026-10-12) and is `approved` now.", + "properties": { + "ours": { + "type": "string" + }, + "status": { + "enum": [ + "draft", + "approved" + ] + }, + "underlying": { + "type": "string" + } + }, + "required": [ + "status", + "ours", + "underlying" + ], + "type": "object" + }, + "notice": { + "description": "本站非官方渠道的说明:引用本站数据时请和来源行一起转述。 / The site’s own line that it is not an official channel: pass it on with the source line when you quote us.", + "type": "string" + }, + "site": { + "description": "The site the data is published by.", + "type": "string" + }, + "source_line": { + "description": "来源行:回复用户时请原样引用它,让读者知道数据出自哪里、有多新。 / The credit line to quote as it is when you answer: who the figures come from and how fresh they are (the newest publisher’s day among the datasets used, or the day the answer was made).", + "type": "string" + } + }, + "required": [ + "api", + "site", + "generated_at", + "language", + "source_line", + "notice", + "datasets", + "license" + ], + "type": "object" + }, + "ProvenanceDataset": { + "additionalProperties": false, + "description": "A dataset version an answer drew on. An origin the register does not let the site show is named nowhere.", + "properties": { + "id": { + "description": "The dataset.", + "type": "string" + }, + "origin": { + "description": "The origin’s id in the register; null when the site may not show it.", + "type": [ + "string", + "null" + ] + }, + "published_at": { + "description": "The publisher’s own date (and time, with its offset, when it gives one).", + "type": "string" + }, + "source": { + "description": "The publisher’s own source line, in the answer’s language; null when there is none to show.", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "The publisher’s page, only where the register lets the site link to it.", + "type": "string" + }, + "version": { + "description": "Its version, named after the publisher’s date.", + "type": "string" + } + }, + "required": [ + "id", + "version", + "published_at", + "origin", + "source" + ], + "type": "object" + }, + "Step": { + "additionalProperties": false, + "description": "One line of the worked example: `id` is the copy key of its sentence, `values` fill it in.", + "properties": { + "id": { + "type": "string" + }, + "message": { + "description": "这一步的一句话说明,数值已代入,用请求的语言。 / The step as one sentence in the language asked, its figures filled in. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "id", + "values" + ], + "type": "object" + }, + "Warning": { + "additionalProperties": false, + "description": "Something a reader should know about a result; `code` is a copy key.", + "properties": { + "code": { + "type": "string" + }, + "level": { + "description": "Absent means a caution.", + "enum": [ + "note", + "hint" + ] + }, + "message": { + "description": "这条提醒的一句话说明,数值已代入,用请求的语言:回复时请用它,不要自己编数字。 / The warning as one sentence in the language asked, its figures filled in: use it, do not make up figures. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "next": { + "description": "For a hint: the slug of the tool it points to.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "code", + "values" + ], + "type": "object" + }, + "cbmOutputs": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "description": "Each figure core returns, by id, as a tagged value. The ids listed are the ones the tool’s manifest names; a tool may return more (a figure that only its worked steps use), in the same form.", + "properties": { + "airBy": { + "$ref": "#/$defs/PlainValue" + }, + "airChargeable": { + "$ref": "#/$defs/PlainValue" + }, + "airVolumetric": { + "$ref": "#/$defs/PlainValue" + }, + "chargeable": { + "$ref": "#/$defs/PlainValue" + }, + "expressBy": { + "$ref": "#/$defs/PlainValue" + }, + "expressChargeable": { + "$ref": "#/$defs/PlainValue" + }, + "expressVolumetric": { + "$ref": "#/$defs/PlainValue" + }, + "lclBy": { + "$ref": "#/$defs/PlainValue" + }, + "lclChargeable": { + "$ref": "#/$defs/PlainValue" + }, + "perCartonVolume": { + "$ref": "#/$defs/PlainValue" + }, + "totalGrossWeight": { + "$ref": "#/$defs/PlainValue" + }, + "totalVolume": { + "$ref": "#/$defs/PlainValue" + } + }, + "required": [ + "totalVolume", + "airVolumetric", + "expressVolumetric" + ], + "type": "object" + } + }, + "additionalProperties": false, + "properties": { + "links": { + "$ref": "#/$defs/Links" + }, + "normalized": { + "$ref": "#/$defs/Normalized" + }, + "outputs": { + "$ref": "#/$defs/cbmOutputs" + }, + "provenance": { + "$ref": "#/$defs/Provenance" + }, + "steps": { + "items": { + "$ref": "#/$defs/Step" + }, + "type": "array" + }, + "tool": { + "const": "cbm" + }, + "warnings": { + "items": { + "$ref": "#/$defs/Warning" + }, + "type": "array" + } + }, + "required": [ + "tool", + "outputs", + "steps", + "warnings", + "links", + "provenance" + ], + "type": "object" +}
- Changed
container-load2 fields changed- added
Input schema / examplesAdded value: +[ + { + "containerType": "auto", + "fill": false, + "grossWeight": "18", + "height": "50", + "length": "60", + "quantity": "450", + "upright": false, + "width": "40" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "Links": { + "additionalProperties": false, + "description": "Addresses that go with the answer. `page`: the tool’s page on the site with the same inputs in its address, in the language asked (Chinese for a language the site does not publish yet), so a person can open the page that shows these numbers.", + "properties": { + "page": { + "description": "The tool’s page holding these inputs.", + "format": "uri", + "type": "string" + } + }, + "required": [ + "page" + ], + "type": "object" + }, + "Normalized": { + "description": "What the API changed in the inputs before core saw them, so the caller sees what was understood: a JSON number as text, a thousands comma, full-width digits, a currency or unit name or a date written another way. Absent when nothing was changed.", + "items": { + "additionalProperties": false, + "properties": { + "given": { + "description": "What was sent, as text.", + "type": "string" + }, + "path": { + "description": "The input, like `cartons.0.length`.", + "type": "string" + }, + "used": { + "description": "What core was given.", + "type": "string" + } + }, + "required": [ + "path", + "given", + "used" + ], + "type": "object" + }, + "type": "array" + }, + "PlainValue": { + "description": "A figure, tagged so a reader knows how to write it: amounts and quantities are exact decimal strings, never floats.", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "amount": { + "type": "string" + }, + "currency": { + "description": "An ISO 4217 code.", + "type": "string" + }, + "kind": { + "const": "money" + } + }, + "required": [ + "kind", + "amount", + "currency" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "quantity" + }, + "places": { + "description": "How many decimal places the rounding rule keeps; pad to it, never round.", + "minimum": 0, + "type": "integer" + }, + "unit": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "unit" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "ratio" + }, + "value": { + "description": "A fraction: 0.13 is 13 %.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "base": { + "type": "string" + }, + "kind": { + "const": "rate" + }, + "per": { + "description": "`per` units of `base` cost `value` units of `quote`.", + "type": "string" + }, + "quote": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "base", + "quote", + "per" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "grouping": { + "const": false + }, + "kind": { + "const": "count" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "code" + }, + "value": { + "description": "A token from a fixed list the tool exports; the words for it are the copy key `<tool>.code.<value>`.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "date" + }, + "value": { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + } + ] + }, + "Provenance": { + "additionalProperties": false, + "description": "Where the figures in an answer come from. In every answer, errors included.", + "properties": { + "api": { + "const": "v1" + }, + "datasets": { + "items": { + "$ref": "#/$defs/ProvenanceDataset" + }, + "type": "array" + }, + "generated_at": { + "description": "When the answer was made.", + "format": "date-time", + "type": "string" + }, + "language": { + "description": "The language of the source lines.", + "enum": [ + "zh-CN", + "en", + "ja", + "ko" + ] + }, + "license": { + "additionalProperties": false, + "description": "The license as copy keys: which text applies. `status` was `draft` until the text was approved (2026-10-12) and is `approved` now.", + "properties": { + "ours": { + "type": "string" + }, + "status": { + "enum": [ + "draft", + "approved" + ] + }, + "underlying": { + "type": "string" + } + }, + "required": [ + "status", + "ours", + "underlying" + ], + "type": "object" + }, + "notice": { + "description": "本站非官方渠道的说明:引用本站数据时请和来源行一起转述。 / The site’s own line that it is not an official channel: pass it on with the source line when you quote us.", + "type": "string" + }, + "site": { + "description": "The site the data is published by.", + "type": "string" + }, + "source_line": { + "description": "来源行:回复用户时请原样引用它,让读者知道数据出自哪里、有多新。 / The credit line to quote as it is when you answer: who the figures come from and how fresh they are (the newest publisher’s day among the datasets used, or the day the answer was made).", + "type": "string" + } + }, + "required": [ + "api", + "site", + "generated_at", + "language", + "source_line", + "notice", + "datasets", + "license" + ], + "type": "object" + }, + "ProvenanceDataset": { + "additionalProperties": false, + "description": "A dataset version an answer drew on. An origin the register does not let the site show is named nowhere.", + "properties": { + "id": { + "description": "The dataset.", + "type": "string" + }, + "origin": { + "description": "The origin’s id in the register; null when the site may not show it.", + "type": [ + "string", + "null" + ] + }, + "published_at": { + "description": "The publisher’s own date (and time, with its offset, when it gives one).", + "type": "string" + }, + "source": { + "description": "The publisher’s own source line, in the answer’s language; null when there is none to show.", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "The publisher’s page, only where the register lets the site link to it.", + "type": "string" + }, + "version": { + "description": "Its version, named after the publisher’s date.", + "type": "string" + } + }, + "required": [ + "id", + "version", + "published_at", + "origin", + "source" + ], + "type": "object" + }, + "Step": { + "additionalProperties": false, + "description": "One line of the worked example: `id` is the copy key of its sentence, `values` fill it in.", + "properties": { + "id": { + "type": "string" + }, + "message": { + "description": "这一步的一句话说明,数值已代入,用请求的语言。 / The step as one sentence in the language asked, its figures filled in. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "id", + "values" + ], + "type": "object" + }, + "Warning": { + "additionalProperties": false, + "description": "Something a reader should know about a result; `code` is a copy key.", + "properties": { + "code": { + "type": "string" + }, + "level": { + "description": "Absent means a caution.", + "enum": [ + "note", + "hint" + ] + }, + "message": { + "description": "这条提醒的一句话说明,数值已代入,用请求的语言:回复时请用它,不要自己编数字。 / The warning as one sentence in the language asked, its figures filled in: use it, do not make up figures. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "next": { + "description": "For a hint: the slug of the tool it points to.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "code", + "values" + ], + "type": "object" + }, + "container_loadOutputs": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "description": "Each figure core returns, by id, as a tagged value. The ids listed are the ones the tool’s manifest names; a tool may return more (a figure that only its worked steps use), in the same form.", + "properties": { + "across20GP": { + "$ref": "#/$defs/PlainValue" + }, + "across40GP": { + "$ref": "#/$defs/PlainValue" + }, + "across40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "across45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "along20GP": { + "$ref": "#/$defs/PlainValue" + }, + "along40GP": { + "$ref": "#/$defs/PlainValue" + }, + "along40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "along45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "best": { + "$ref": "#/$defs/PlainValue" + }, + "columns20GP": { + "$ref": "#/$defs/PlainValue" + }, + "columns40GP": { + "$ref": "#/$defs/PlainValue" + }, + "columns40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "columns45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "containers20GP": { + "$ref": "#/$defs/PlainValue" + }, + "containers40GP": { + "$ref": "#/$defs/PlainValue" + }, + "containers40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "containers45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "lastContainer20GP": { + "$ref": "#/$defs/PlainValue" + }, + "lastContainer40GP": { + "$ref": "#/$defs/PlainValue" + }, + "lastContainer40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "lastContainer45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "layers20GP": { + "$ref": "#/$defs/PlainValue" + }, + "layers40GP": { + "$ref": "#/$defs/PlainValue" + }, + "layers40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "layers45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "limit20GP": { + "$ref": "#/$defs/PlainValue" + }, + "limit40GP": { + "$ref": "#/$defs/PlainValue" + }, + "limit40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "limit45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "perContainer20GP": { + "$ref": "#/$defs/PlainValue" + }, + "perContainer40GP": { + "$ref": "#/$defs/PlainValue" + }, + "perContainer40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "perContainer45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "rank20GP": { + "$ref": "#/$defs/PlainValue" + }, + "rank40GP": { + "$ref": "#/$defs/PlainValue" + }, + "rank40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "rank45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "rows20GP": { + "$ref": "#/$defs/PlainValue" + }, + "rows40GP": { + "$ref": "#/$defs/PlainValue" + }, + "rows40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "rows45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "spareHeight20GP": { + "$ref": "#/$defs/PlainValue" + }, + "spareHeight40GP": { + "$ref": "#/$defs/PlainValue" + }, + "spareHeight40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "spareHeight45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "spareHeightIn20GP": { + "$ref": "#/$defs/PlainValue" + }, + "spareHeightIn40GP": { + "$ref": "#/$defs/PlainValue" + }, + "spareHeightIn40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "spareHeightIn45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "spareLength20GP": { + "$ref": "#/$defs/PlainValue" + }, + "spareLength40GP": { + "$ref": "#/$defs/PlainValue" + }, + "spareLength40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "spareLength45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "spareLengthIn20GP": { + "$ref": "#/$defs/PlainValue" + }, + "spareLengthIn40GP": { + "$ref": "#/$defs/PlainValue" + }, + "spareLengthIn40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "spareLengthIn45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "spareWidth20GP": { + "$ref": "#/$defs/PlainValue" + }, + "spareWidth40GP": { + "$ref": "#/$defs/PlainValue" + }, + "spareWidth40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "spareWidth45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "spareWidthIn20GP": { + "$ref": "#/$defs/PlainValue" + }, + "spareWidthIn40GP": { + "$ref": "#/$defs/PlainValue" + }, + "spareWidthIn40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "spareWidthIn45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "up20GP": { + "$ref": "#/$defs/PlainValue" + }, + "up40GP": { + "$ref": "#/$defs/PlainValue" + }, + "up40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "up45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "volumeUse20GP": { + "$ref": "#/$defs/PlainValue" + }, + "volumeUse40GP": { + "$ref": "#/$defs/PlainValue" + }, + "volumeUse40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "volumeUse45HQ": { + "$ref": "#/$defs/PlainValue" + }, + "weightUse20GP": { + "$ref": "#/$defs/PlainValue" + }, + "weightUse40GP": { + "$ref": "#/$defs/PlainValue" + }, + "weightUse40HQ": { + "$ref": "#/$defs/PlainValue" + }, + "weightUse45HQ": { + "$ref": "#/$defs/PlainValue" + } + }, + "required": [], + "type": "object" + } + }, + "additionalProperties": false, + "properties": { + "links": { + "$ref": "#/$defs/Links" + }, + "normalized": { + "$ref": "#/$defs/Normalized" + }, + "outputs": { + "$ref": "#/$defs/container_loadOutputs" + }, + "provenance": { + "$ref": "#/$defs/Provenance" + }, + "steps": { + "items": { + "$ref": "#/$defs/Step" + }, + "type": "array" + }, + "tool": { + "const": "container-load" + }, + "warnings": { + "items": { + "$ref": "#/$defs/Warning" + }, + "type": "array" + } + }, + "required": [ + "tool", + "outputs", + "steps", + "warnings", + "links", + "provenance" + ], + "type": "object" +}
- Changed
fx-convert2 fields changed- added
Input schema / examplesAdded value: +[ + { + "amount": "100", + "currency": "USD" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "Links": { + "additionalProperties": false, + "description": "Addresses that go with the answer. `page`: the tool’s page on the site with the same inputs in its address, in the language asked (Chinese for a language the site does not publish yet), so a person can open the page that shows these numbers.", + "properties": { + "page": { + "description": "The tool’s page holding these inputs.", + "format": "uri", + "type": "string" + } + }, + "required": [ + "page" + ], + "type": "object" + }, + "Normalized": { + "description": "What the API changed in the inputs before core saw them, so the caller sees what was understood: a JSON number as text, a thousands comma, full-width digits, a currency or unit name or a date written another way. Absent when nothing was changed.", + "items": { + "additionalProperties": false, + "properties": { + "given": { + "description": "What was sent, as text.", + "type": "string" + }, + "path": { + "description": "The input, like `cartons.0.length`.", + "type": "string" + }, + "used": { + "description": "What core was given.", + "type": "string" + } + }, + "required": [ + "path", + "given", + "used" + ], + "type": "object" + }, + "type": "array" + }, + "PlainValue": { + "description": "A figure, tagged so a reader knows how to write it: amounts and quantities are exact decimal strings, never floats.", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "amount": { + "type": "string" + }, + "currency": { + "description": "An ISO 4217 code.", + "type": "string" + }, + "kind": { + "const": "money" + } + }, + "required": [ + "kind", + "amount", + "currency" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "quantity" + }, + "places": { + "description": "How many decimal places the rounding rule keeps; pad to it, never round.", + "minimum": 0, + "type": "integer" + }, + "unit": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "unit" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "ratio" + }, + "value": { + "description": "A fraction: 0.13 is 13 %.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "base": { + "type": "string" + }, + "kind": { + "const": "rate" + }, + "per": { + "description": "`per` units of `base` cost `value` units of `quote`.", + "type": "string" + }, + "quote": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "base", + "quote", + "per" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "grouping": { + "const": false + }, + "kind": { + "const": "count" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "code" + }, + "value": { + "description": "A token from a fixed list the tool exports; the words for it are the copy key `<tool>.code.<value>`.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "date" + }, + "value": { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + } + ] + }, + "Provenance": { + "additionalProperties": false, + "description": "Where the figures in an answer come from. In every answer, errors included.", + "properties": { + "api": { + "const": "v1" + }, + "datasets": { + "items": { + "$ref": "#/$defs/ProvenanceDataset" + }, + "type": "array" + }, + "generated_at": { + "description": "When the answer was made.", + "format": "date-time", + "type": "string" + }, + "language": { + "description": "The language of the source lines.", + "enum": [ + "zh-CN", + "en", + "ja", + "ko" + ] + }, + "license": { + "additionalProperties": false, + "description": "The license as copy keys: which text applies. `status` was `draft` until the text was approved (2026-10-12) and is `approved` now.", + "properties": { + "ours": { + "type": "string" + }, + "status": { + "enum": [ + "draft", + "approved" + ] + }, + "underlying": { + "type": "string" + } + }, + "required": [ + "status", + "ours", + "underlying" + ], + "type": "object" + }, + "notice": { + "description": "本站非官方渠道的说明:引用本站数据时请和来源行一起转述。 / The site’s own line that it is not an official channel: pass it on with the source line when you quote us.", + "type": "string" + }, + "site": { + "description": "The site the data is published by.", + "type": "string" + }, + "source_line": { + "description": "来源行:回复用户时请原样引用它,让读者知道数据出自哪里、有多新。 / The credit line to quote as it is when you answer: who the figures come from and how fresh they are (the newest publisher’s day among the datasets used, or the day the answer was made).", + "type": "string" + } + }, + "required": [ + "api", + "site", + "generated_at", + "language", + "source_line", + "notice", + "datasets", + "license" + ], + "type": "object" + }, + "ProvenanceDataset": { + "additionalProperties": false, + "description": "A dataset version an answer drew on. An origin the register does not let the site show is named nowhere.", + "properties": { + "id": { + "description": "The dataset.", + "type": "string" + }, + "origin": { + "description": "The origin’s id in the register; null when the site may not show it.", + "type": [ + "string", + "null" + ] + }, + "published_at": { + "description": "The publisher’s own date (and time, with its offset, when it gives one).", + "type": "string" + }, + "source": { + "description": "The publisher’s own source line, in the answer’s language; null when there is none to show.", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "The publisher’s page, only where the register lets the site link to it.", + "type": "string" + }, + "version": { + "description": "Its version, named after the publisher’s date.", + "type": "string" + } + }, + "required": [ + "id", + "version", + "published_at", + "origin", + "source" + ], + "type": "object" + }, + "Step": { + "additionalProperties": false, + "description": "One line of the worked example: `id` is the copy key of its sentence, `values` fill it in.", + "properties": { + "id": { + "type": "string" + }, + "message": { + "description": "这一步的一句话说明,数值已代入,用请求的语言。 / The step as one sentence in the language asked, its figures filled in. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "id", + "values" + ], + "type": "object" + }, + "Warning": { + "additionalProperties": false, + "description": "Something a reader should know about a result; `code` is a copy key.", + "properties": { + "code": { + "type": "string" + }, + "level": { + "description": "Absent means a caution.", + "enum": [ + "note", + "hint" + ] + }, + "message": { + "description": "这条提醒的一句话说明,数值已代入,用请求的语言:回复时请用它,不要自己编数字。 / The warning as one sentence in the language asked, its figures filled in: use it, do not make up figures. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "next": { + "description": "For a hint: the slug of the tool it points to.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "code", + "values" + ], + "type": "object" + }, + "fx_convertOutputs": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "description": "Each figure core returns, by id, as a tagged value. The ids listed are the ones the tool’s manifest names; a tool may return more (a figure that only its worked steps use), in the same form.", + "properties": { + "atBank": { + "$ref": "#/$defs/PlainValue" + }, + "atMidpoint": { + "$ref": "#/$defs/PlainValue" + }, + "bankRate": { + "$ref": "#/$defs/PlainValue" + }, + "difference": { + "$ref": "#/$defs/PlainValue" + }, + "estimated": { + "$ref": "#/$defs/PlainValue" + }, + "gap": { + "$ref": "#/$defs/PlainValue" + }, + "gapShown": { + "$ref": "#/$defs/PlainValue" + }, + "midpoint": { + "$ref": "#/$defs/PlainValue" + } + }, + "required": [ + "midpoint" + ], + "type": "object" + } + }, + "additionalProperties": false, + "properties": { + "links": { + "$ref": "#/$defs/Links" + }, + "normalized": { + "$ref": "#/$defs/Normalized" + }, + "outputs": { + "$ref": "#/$defs/fx_convertOutputs" + }, + "provenance": { + "$ref": "#/$defs/Provenance" + }, + "steps": { + "items": { + "$ref": "#/$defs/Step" + }, + "type": "array" + }, + "tool": { + "const": "fx-convert" + }, + "warnings": { + "items": { + "$ref": "#/$defs/Warning" + }, + "type": "array" + } + }, + "required": [ + "tool", + "outputs", + "steps", + "warnings", + "links", + "provenance" + ], + "type": "object" +}
- Changed
fx-cost2 fields changed- added
Input schema / examplesAdded value: +[ + { + "bankFee": "50", + "feePerReceiptB": "0", + "feePercentB": "0.3", + "receipts": [ + { + "amount": "100000", + "bankRate": "7.0800", + "count": "1", + "currency": "USD", + "rateB": "7.1000" + } + ], + "useB": true + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "Links": { + "additionalProperties": false, + "description": "Addresses that go with the answer. `page`: the tool’s page on the site with the same inputs in its address, in the language asked (Chinese for a language the site does not publish yet), so a person can open the page that shows these numbers.", + "properties": { + "page": { + "description": "The tool’s page holding these inputs.", + "format": "uri", + "type": "string" + } + }, + "required": [ + "page" + ], + "type": "object" + }, + "Normalized": { + "description": "What the API changed in the inputs before core saw them, so the caller sees what was understood: a JSON number as text, a thousands comma, full-width digits, a currency or unit name or a date written another way. Absent when nothing was changed.", + "items": { + "additionalProperties": false, + "properties": { + "given": { + "description": "What was sent, as text.", + "type": "string" + }, + "path": { + "description": "The input, like `cartons.0.length`.", + "type": "string" + }, + "used": { + "description": "What core was given.", + "type": "string" + } + }, + "required": [ + "path", + "given", + "used" + ], + "type": "object" + }, + "type": "array" + }, + "PlainValue": { + "description": "A figure, tagged so a reader knows how to write it: amounts and quantities are exact decimal strings, never floats.", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "amount": { + "type": "string" + }, + "currency": { + "description": "An ISO 4217 code.", + "type": "string" + }, + "kind": { + "const": "money" + } + }, + "required": [ + "kind", + "amount", + "currency" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "quantity" + }, + "places": { + "description": "How many decimal places the rounding rule keeps; pad to it, never round.", + "minimum": 0, + "type": "integer" + }, + "unit": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "unit" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "ratio" + }, + "value": { + "description": "A fraction: 0.13 is 13 %.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "base": { + "type": "string" + }, + "kind": { + "const": "rate" + }, + "per": { + "description": "`per` units of `base` cost `value` units of `quote`.", + "type": "string" + }, + "quote": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "base", + "quote", + "per" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "grouping": { + "const": false + }, + "kind": { + "const": "count" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "code" + }, + "value": { + "description": "A token from a fixed list the tool exports; the words for it are the copy key `<tool>.code.<value>`.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "date" + }, + "value": { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + } + ] + }, + "Provenance": { + "additionalProperties": false, + "description": "Where the figures in an answer come from. In every answer, errors included.", + "properties": { + "api": { + "const": "v1" + }, + "datasets": { + "items": { + "$ref": "#/$defs/ProvenanceDataset" + }, + "type": "array" + }, + "generated_at": { + "description": "When the answer was made.", + "format": "date-time", + "type": "string" + }, + "language": { + "description": "The language of the source lines.", + "enum": [ + "zh-CN", + "en", + "ja", + "ko" + ] + }, + "license": { + "additionalProperties": false, + "description": "The license as copy keys: which text applies. `status` was `draft` until the text was approved (2026-10-12) and is `approved` now.", + "properties": { + "ours": { + "type": "string" + }, + "status": { + "enum": [ + "draft", + "approved" + ] + }, + "underlying": { + "type": "string" + } + }, + "required": [ + "status", + "ours", + "underlying" + ], + "type": "object" + }, + "notice": { + "description": "本站非官方渠道的说明:引用本站数据时请和来源行一起转述。 / The site’s own line that it is not an official channel: pass it on with the source line when you quote us.", + "type": "string" + }, + "site": { + "description": "The site the data is published by.", + "type": "string" + }, + "source_line": { + "description": "来源行:回复用户时请原样引用它,让读者知道数据出自哪里、有多新。 / The credit line to quote as it is when you answer: who the figures come from and how fresh they are (the newest publisher’s day among the datasets used, or the day the answer was made).", + "type": "string" + } + }, + "required": [ + "api", + "site", + "generated_at", + "language", + "source_line", + "notice", + "datasets", + "license" + ], + "type": "object" + }, + "ProvenanceDataset": { + "additionalProperties": false, + "description": "A dataset version an answer drew on. An origin the register does not let the site show is named nowhere.", + "properties": { + "id": { + "description": "The dataset.", + "type": "string" + }, + "origin": { + "description": "The origin’s id in the register; null when the site may not show it.", + "type": [ + "string", + "null" + ] + }, + "published_at": { + "description": "The publisher’s own date (and time, with its offset, when it gives one).", + "type": "string" + }, + "source": { + "description": "The publisher’s own source line, in the answer’s language; null when there is none to show.", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "The publisher’s page, only where the register lets the site link to it.", + "type": "string" + }, + "version": { + "description": "Its version, named after the publisher’s date.", + "type": "string" + } + }, + "required": [ + "id", + "version", + "published_at", + "origin", + "source" + ], + "type": "object" + }, + "Step": { + "additionalProperties": false, + "description": "One line of the worked example: `id` is the copy key of its sentence, `values` fill it in.", + "properties": { + "id": { + "type": "string" + }, + "message": { + "description": "这一步的一句话说明,数值已代入,用请求的语言。 / The step as one sentence in the language asked, its figures filled in. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "id", + "values" + ], + "type": "object" + }, + "Warning": { + "additionalProperties": false, + "description": "Something a reader should know about a result; `code` is a copy key.", + "properties": { + "code": { + "type": "string" + }, + "level": { + "description": "Absent means a caution.", + "enum": [ + "note", + "hint" + ] + }, + "message": { + "description": "这条提醒的一句话说明,数值已代入,用请求的语言:回复时请用它,不要自己编数字。 / The warning as one sentence in the language asked, its figures filled in: use it, do not make up figures. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "next": { + "description": "For a hint: the slug of the tool it points to.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "code", + "values" + ], + "type": "object" + }, + "fx_costOutputs": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "description": "Each figure core returns, by id, as a tagged value. The ids listed are the ones the tool’s manifest names; a tool may return more (a figure that only its worked steps use), in the same form.", + "properties": { + "annualB": { + "$ref": "#/$defs/PlainValue" + }, + "annualBank": { + "$ref": "#/$defs/PlainValue" + }, + "annualC": { + "$ref": "#/$defs/PlainValue" + }, + "annualMidpoint": { + "$ref": "#/$defs/PlainValue" + }, + "best": { + "$ref": "#/$defs/PlainValue" + }, + "costB": { + "$ref": "#/$defs/PlainValue" + }, + "costBank": { + "$ref": "#/$defs/PlainValue" + }, + "costC": { + "$ref": "#/$defs/PlainValue" + }, + "feesB": { + "$ref": "#/$defs/PlainValue" + }, + "feesBank": { + "$ref": "#/$defs/PlainValue" + }, + "feesC": { + "$ref": "#/$defs/PlainValue" + }, + "gainB": { + "$ref": "#/$defs/PlainValue" + }, + "gainBank": { + "$ref": "#/$defs/PlainValue" + }, + "gainC": { + "$ref": "#/$defs/PlainValue" + }, + "rankB": { + "$ref": "#/$defs/PlainValue" + }, + "rankBank": { + "$ref": "#/$defs/PlainValue" + }, + "rankC": { + "$ref": "#/$defs/PlainValue" + } + }, + "required": [ + "annualBank", + "feesBank", + "costBank", + "gainBank", + "rankBank", + "annualMidpoint", + "best" + ], + "type": "object" + } + }, + "additionalProperties": false, + "properties": { + "links": { + "$ref": "#/$defs/Links" + }, + "normalized": { + "$ref": "#/$defs/Normalized" + }, + "outputs": { + "$ref": "#/$defs/fx_costOutputs" + }, + "provenance": { + "$ref": "#/$defs/Provenance" + }, + "steps": { + "items": { + "$ref": "#/$defs/Step" + }, + "type": "array" + }, + "tool": { + "const": "fx-cost" + }, + "warnings": { + "items": { + "$ref": "#/$defs/Warning" + }, + "type": "array" + } + }, + "required": [ + "tool", + "outputs", + "steps", + "warnings", + "links", + "provenance" + ], + "type": "object" +}
- Changed
maitou2 fields changed- added
Input schema / examplesAdded value: +[ + { + "capitals": true, + "cartons": "450", + "grossWeight": "18", + "height": "50", + "length": "60", + "lines": [ + { + "text": "ACME" + }, + { + "text": "HAMBURG" + }, + { + "text": "P.O. NO. 20260917" + }, + { + "text": "ITEM: STORAGE BOX" + } + ], + "netWeight": "16", + "width": "40" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "Links": { + "additionalProperties": false, + "description": "Addresses that go with the answer. `page`: the tool’s page on the site with the same inputs in its address, in the language asked (Chinese for a language the site does not publish yet), so a person can open the page that shows these numbers.", + "properties": { + "page": { + "description": "The tool’s page holding these inputs.", + "format": "uri", + "type": "string" + } + }, + "required": [ + "page" + ], + "type": "object" + }, + "Normalized": { + "description": "What the API changed in the inputs before core saw them, so the caller sees what was understood: a JSON number as text, a thousands comma, full-width digits, a currency or unit name or a date written another way. Absent when nothing was changed.", + "items": { + "additionalProperties": false, + "properties": { + "given": { + "description": "What was sent, as text.", + "type": "string" + }, + "path": { + "description": "The input, like `cartons.0.length`.", + "type": "string" + }, + "used": { + "description": "What core was given.", + "type": "string" + } + }, + "required": [ + "path", + "given", + "used" + ], + "type": "object" + }, + "type": "array" + }, + "PlainValue": { + "description": "A figure, tagged so a reader knows how to write it: amounts and quantities are exact decimal strings, never floats.", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "amount": { + "type": "string" + }, + "currency": { + "description": "An ISO 4217 code.", + "type": "string" + }, + "kind": { + "const": "money" + } + }, + "required": [ + "kind", + "amount", + "currency" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "quantity" + }, + "places": { + "description": "How many decimal places the rounding rule keeps; pad to it, never round.", + "minimum": 0, + "type": "integer" + }, + "unit": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "unit" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "ratio" + }, + "value": { + "description": "A fraction: 0.13 is 13 %.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "base": { + "type": "string" + }, + "kind": { + "const": "rate" + }, + "per": { + "description": "`per` units of `base` cost `value` units of `quote`.", + "type": "string" + }, + "quote": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "base", + "quote", + "per" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "grouping": { + "const": false + }, + "kind": { + "const": "count" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "code" + }, + "value": { + "description": "A token from a fixed list the tool exports; the words for it are the copy key `<tool>.code.<value>`.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "date" + }, + "value": { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + } + ] + }, + "Printed": { + "additionalProperties": false, + "description": "What a generator prints: each piece’s lines, the same on every item.", + "properties": { + "items": { + "description": "How many items get one of every piece.", + "type": "string" + }, + "pieces": { + "additionalProperties": { + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "text": { + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "sequence": { + "additionalProperties": false, + "properties": { + "of": { + "type": "string" + }, + "prefix": { + "type": "string" + } + }, + "required": [ + "prefix", + "of" + ], + "type": "object" + } + }, + "required": [ + "sequence" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "type": "object" + } + }, + "required": [ + "items", + "pieces" + ], + "type": "object" + }, + "Provenance": { + "additionalProperties": false, + "description": "Where the figures in an answer come from. In every answer, errors included.", + "properties": { + "api": { + "const": "v1" + }, + "datasets": { + "items": { + "$ref": "#/$defs/ProvenanceDataset" + }, + "type": "array" + }, + "generated_at": { + "description": "When the answer was made.", + "format": "date-time", + "type": "string" + }, + "language": { + "description": "The language of the source lines.", + "enum": [ + "zh-CN", + "en", + "ja", + "ko" + ] + }, + "license": { + "additionalProperties": false, + "description": "The license as copy keys: which text applies. `status` was `draft` until the text was approved (2026-10-12) and is `approved` now.", + "properties": { + "ours": { + "type": "string" + }, + "status": { + "enum": [ + "draft", + "approved" + ] + }, + "underlying": { + "type": "string" + } + }, + "required": [ + "status", + "ours", + "underlying" + ], + "type": "object" + }, + "notice": { + "description": "本站非官方渠道的说明:引用本站数据时请和来源行一起转述。 / The site’s own line that it is not an official channel: pass it on with the source line when you quote us.", + "type": "string" + }, + "site": { + "description": "The site the data is published by.", + "type": "string" + }, + "source_line": { + "description": "来源行:回复用户时请原样引用它,让读者知道数据出自哪里、有多新。 / The credit line to quote as it is when you answer: who the figures come from and how fresh they are (the newest publisher’s day among the datasets used, or the day the answer was made).", + "type": "string" + } + }, + "required": [ + "api", + "site", + "generated_at", + "language", + "source_line", + "notice", + "datasets", + "license" + ], + "type": "object" + }, + "ProvenanceDataset": { + "additionalProperties": false, + "description": "A dataset version an answer drew on. An origin the register does not let the site show is named nowhere.", + "properties": { + "id": { + "description": "The dataset.", + "type": "string" + }, + "origin": { + "description": "The origin’s id in the register; null when the site may not show it.", + "type": [ + "string", + "null" + ] + }, + "published_at": { + "description": "The publisher’s own date (and time, with its offset, when it gives one).", + "type": "string" + }, + "source": { + "description": "The publisher’s own source line, in the answer’s language; null when there is none to show.", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "The publisher’s page, only where the register lets the site link to it.", + "type": "string" + }, + "version": { + "description": "Its version, named after the publisher’s date.", + "type": "string" + } + }, + "required": [ + "id", + "version", + "published_at", + "origin", + "source" + ], + "type": "object" + }, + "Step": { + "additionalProperties": false, + "description": "One line of the worked example: `id` is the copy key of its sentence, `values` fill it in.", + "properties": { + "id": { + "type": "string" + }, + "message": { + "description": "这一步的一句话说明,数值已代入,用请求的语言。 / The step as one sentence in the language asked, its figures filled in. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "id", + "values" + ], + "type": "object" + }, + "Warning": { + "additionalProperties": false, + "description": "Something a reader should know about a result; `code` is a copy key.", + "properties": { + "code": { + "type": "string" + }, + "level": { + "description": "Absent means a caution.", + "enum": [ + "note", + "hint" + ] + }, + "message": { + "description": "这条提醒的一句话说明,数值已代入,用请求的语言:回复时请用它,不要自己编数字。 / The warning as one sentence in the language asked, its figures filled in: use it, do not make up figures. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "next": { + "description": "For a hint: the slug of the tool it points to.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "code", + "values" + ], + "type": "object" + }, + "maitouOutputs": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "additionalProperties": false, + "properties": { + "links": { + "$ref": "#/$defs/Links" + }, + "normalized": { + "$ref": "#/$defs/Normalized" + }, + "outputs": { + "$ref": "#/$defs/maitouOutputs" + }, + "printed": { + "$ref": "#/$defs/Printed" + }, + "provenance": { + "$ref": "#/$defs/Provenance" + }, + "steps": { + "items": { + "$ref": "#/$defs/Step" + }, + "type": "array" + }, + "tool": { + "const": "maitou" + }, + "warnings": { + "items": { + "$ref": "#/$defs/Warning" + }, + "type": "array" + } + }, + "required": [ + "tool", + "outputs", + "steps", + "warnings", + "links", + "provenance" + ], + "type": "object" +}
- Changed
make_quote2 fields changed- added
Input schema / properties / pricing / examplesAdded value: +[ + { + "containers": "1", + "currency": "USD", + "freight": "1800", + "freightBasis": "container", + "fxRate": "7.0850", + "margin": "10", + "marginBasis": "quote", + "mode": "forward", + "price": "50", + "quantity": "4500", + "quotedPrice": "7.50", + "refundRate": "13", + "taxRate": "13", + "term": "FOB" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "PlainValue": { + "description": "A figure, tagged so a reader knows how to write it: amounts and quantities are exact decimal strings, never floats.", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "amount": { + "type": "string" + }, + "currency": { + "description": "An ISO 4217 code.", + "type": "string" + }, + "kind": { + "const": "money" + } + }, + "required": [ + "kind", + "amount", + "currency" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "quantity" + }, + "places": { + "description": "How many decimal places the rounding rule keeps; pad to it, never round.", + "minimum": 0, + "type": "integer" + }, + "unit": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "unit" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "ratio" + }, + "value": { + "description": "A fraction: 0.13 is 13 %.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "base": { + "type": "string" + }, + "kind": { + "const": "rate" + }, + "per": { + "description": "`per` units of `base` cost `value` units of `quote`.", + "type": "string" + }, + "quote": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "base", + "quote", + "per" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "grouping": { + "const": false + }, + "kind": { + "const": "count" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "code" + }, + "value": { + "description": "A token from a fixed list the tool exports; the words for it are the copy key `<tool>.code.<value>`.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "date" + }, + "value": { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + } + ] + }, + "Provenance": { + "additionalProperties": false, + "description": "Where the figures in an answer come from. In every answer, errors included.", + "properties": { + "api": { + "const": "v1" + }, + "datasets": { + "items": { + "$ref": "#/$defs/ProvenanceDataset" + }, + "type": "array" + }, + "generated_at": { + "description": "When the answer was made.", + "format": "date-time", + "type": "string" + }, + "language": { + "description": "The language of the source lines.", + "enum": [ + "zh-CN", + "en", + "ja", + "ko" + ] + }, + "license": { + "additionalProperties": false, + "description": "The license as copy keys: which text applies. `status` was `draft` until the text was approved (2026-10-12) and is `approved` now.", + "properties": { + "ours": { + "type": "string" + }, + "status": { + "enum": [ + "draft", + "approved" + ] + }, + "underlying": { + "type": "string" + } + }, + "required": [ + "status", + "ours", + "underlying" + ], + "type": "object" + }, + "notice": { + "description": "本站非官方渠道的说明:引用本站数据时请和来源行一起转述。 / The site’s own line that it is not an official channel: pass it on with the source line when you quote us.", + "type": "string" + }, + "site": { + "description": "The site the data is published by.", + "type": "string" + }, + "source_line": { + "description": "来源行:回复用户时请原样引用它,让读者知道数据出自哪里、有多新。 / The credit line to quote as it is when you answer: who the figures come from and how fresh they are (the newest publisher’s day among the datasets used, or the day the answer was made).", + "type": "string" + } + }, + "required": [ + "api", + "site", + "generated_at", + "language", + "source_line", + "notice", + "datasets", + "license" + ], + "type": "object" + }, + "ProvenanceDataset": { + "additionalProperties": false, + "description": "A dataset version an answer drew on. An origin the register does not let the site show is named nowhere.", + "properties": { + "id": { + "description": "The dataset.", + "type": "string" + }, + "origin": { + "description": "The origin’s id in the register; null when the site may not show it.", + "type": [ + "string", + "null" + ] + }, + "published_at": { + "description": "The publisher’s own date (and time, with its offset, when it gives one).", + "type": "string" + }, + "source": { + "description": "The publisher’s own source line, in the answer’s language; null when there is none to show.", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "The publisher’s page, only where the register lets the site link to it.", + "type": "string" + }, + "version": { + "description": "Its version, named after the publisher’s date.", + "type": "string" + } + }, + "required": [ + "id", + "version", + "published_at", + "origin", + "source" + ], + "type": "object" + }, + "QuoteDocument": { + "additionalProperties": false, + "description": "One seller’s quote to one buyer: prices and terms only, never the seller’s costs. Each field’s description names its counterpart in OASIS UBL 2.4 Quotation. `digest` is sha256 of the canonical JSON (UTF-8, keys sorted, no spaces) of the document without `digest`; `basis.rate` names the dated exchange rate the prices rest on, which a buyer can check at https://chukoudan.com/v1/datasets/central-parity.", + "properties": { + "basis": { + "additionalProperties": false, + "description": "The dated exchange rate the prices rest on, when the seller includes it, so a buyer can check it.", + "properties": { + "made_with": { + "const": "https://chukoudan.com" + }, + "rate": { + "additionalProperties": false, + "properties": { + "base": { + "pattern": "^[A-Z]{3}$", + "type": "string" + }, + "day": { + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$", + "type": "string" + }, + "per": { + "enum": [ + "1", + "100" + ], + "type": "string" + }, + "quote": { + "const": "CNY" + }, + "source": { + "description": "`central-parity`: the RMB central parity of `day`, from https://chukoudan.com/v1/datasets/central-parity; `given`: the seller’s own rate.", + "enum": [ + "central-parity", + "given" + ], + "type": "string" + }, + "value": { + "pattern": "^(0|[1-9]\\d*)(\\.\\d+)?$", + "type": "string" + } + }, + "required": [ + "base", + "quote", + "value", + "per", + "source" + ], + "type": "object" + } + }, + "required": [ + "made_with" + ], + "type": "object" + }, + "buyer": { + "additionalProperties": false, + "description": "UBL: cac:OriginatorCustomerParty. country: ISO 3166-1 alpha-2.", + "properties": { + "contact": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "country": { + "pattern": "^[A-Z]{2}$", + "type": "string" + }, + "name": { + "maxLength": 120, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "country" + ], + "type": "object" + }, + "currency": { + "description": "ISO 4217 code of every price. UBL: cbc:PricingCurrencyCode.", + "pattern": "^[A-Z]{3}$", + "type": "string" + }, + "digest": { + "description": "`sha256:` and the hex SHA-256 of this document’s canonical JSON without `digest`: UTF-8, keys sorted, no spaces, non-ASCII characters written as themselves (Python: json.dumps(doc, sort_keys=True, separators=(\",\", \":\"), ensure_ascii=False)).", + "pattern": "^sha256:[0-9a-f]{64}$", + "type": "string" + }, + "issued": { + "description": "The day the quote is issued, YYYY-MM-DD. UBL: cbc:IssueDate.", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$", + "type": "string" + }, + "items": { + "description": "The goods. One line in v1. UBL: cac:QuotationLine/cac:LineItem.", + "items": { + "additionalProperties": false, + "properties": { + "description": { + "description": "UBL: cac:Item/cbc:Description.", + "type": "string" + }, + "hs_code": { + "description": "The seller’s HS code, digits only. UBL: cac:Item/cac:CommodityClassification/cbc:ItemClassificationCode.", + "type": "string" + }, + "origin": { + "description": "Country of origin, ISO 3166-1 alpha-2. UBL: cac:Item/cac:OriginCountry.", + "pattern": "^[A-Z]{2}$", + "type": "string" + }, + "packing": { + "description": "How the goods are packed, as the seller says it.", + "type": "string" + }, + "quantity": { + "description": "A decimal string. UBL: cac:LineItem/cbc:Quantity.", + "pattern": "^(0|[1-9]\\d*)(\\.\\d+)?$", + "type": "string" + }, + "unit": { + "description": "UN/ECE Recommendation 20 code: the quantity’s unitCode in UBL.", + "enum": [ + "PCE", + "SET", + "CT", + "KGM" + ], + "type": "string" + } + }, + "required": [ + "description", + "origin", + "quantity", + "unit" + ], + "type": "object" + }, + "maxItems": 1, + "minItems": 1, + "type": "array" + }, + "lead_time_days": { + "description": "Days from order to shipment, a whole number.", + "type": "integer" + }, + "notes": { + "description": "UBL: cbc:Note.", + "type": "string" + }, + "number": { + "description": "The seller’s quote number. UBL: cbc:ID.", + "type": "string" + }, + "payment": { + "description": "Payment terms as the seller writes them (T/T, L/C at sight…). UBL: cac:PaymentTerms/cbc:Note.", + "type": "string" + }, + "prices": { + "description": "One price per term offered. UBL quotes one set of delivery terms per document; this lists several side by side.", + "items": { + "additionalProperties": false, + "properties": { + "commission_included": { + "description": "Whether the price includes the buying agent’s commission (含佣).", + "type": "boolean" + }, + "place": { + "description": "The named place: port of loading for FOB, port of destination for CFR and CIF.", + "type": "string" + }, + "term": { + "description": "Incoterms 2020 term. UBL: cac:Delivery/cac:DeliveryTerms/cbc:ID.", + "enum": [ + "FOB", + "CFR", + "CIF" + ], + "type": "string" + }, + "total": { + "description": "unit_price × quantity, a decimal string in `currency`. UBL: cbc:LineExtensionAmount.", + "pattern": "^(0|[1-9]\\d*)(\\.\\d+)?$", + "type": "string" + }, + "unit_price": { + "description": "A decimal string in `currency`. UBL: cac:Price/cbc:PriceAmount.", + "pattern": "^(0|[1-9]\\d*)(\\.\\d+)?$", + "type": "string" + } + }, + "required": [ + "term", + "place", + "unit_price", + "total", + "commission_included" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "schema": { + "const": "https://chukoudan.com/schemas/quote/v1.json", + "description": "This schema’s address, which names its version." + }, + "seller": { + "additionalProperties": false, + "description": "UBL: cac:SellerSupplierParty. country: ISO 3166-1 alpha-2.", + "properties": { + "contact": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "country": { + "pattern": "^[A-Z]{2}$", + "type": "string" + }, + "name": { + "maxLength": 120, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "country" + ], + "type": "object" + }, + "valid_until": { + "description": "The last day the quote holds. UBL: cac:ValidityPeriod/cbc:EndDate.", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$", + "type": "string" + } + }, + "required": [ + "schema", + "issued", + "valid_until", + "seller", + "buyer", + "items", + "currency", + "prices", + "basis" + ], + "title": "Quote (chukoudan.com, v1)", + "type": "object" + }, + "Step": { + "additionalProperties": false, + "description": "One line of the worked example: `id` is the copy key of its sentence, `values` fill it in.", + "properties": { + "id": { + "type": "string" + }, + "message": { + "description": "这一步的一句话说明,数值已代入,用请求的语言。 / The step as one sentence in the language asked, its figures filled in. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "id", + "values" + ], + "type": "object" + }, + "Warning": { + "additionalProperties": false, + "description": "Something a reader should know about a result; `code` is a copy key.", + "properties": { + "code": { + "type": "string" + }, + "level": { + "description": "Absent means a caution.", + "enum": [ + "note", + "hint" + ] + }, + "message": { + "description": "这条提醒的一句话说明,数值已代入,用请求的语言:回复时请用它,不要自己编数字。 / The warning as one sentence in the language asked, its figures filled in: use it, do not make up figures. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "next": { + "description": "For a hint: the slug of the tool it points to.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "code", + "values" + ], + "type": "object" + } + }, + "additionalProperties": false, + "properties": { + "internal": { + "description": "The seller’s own figures (cost, refund, profit, margin, break-even): never send these to the buyer.", + "properties": { + "do_not_send": { + "const": true + }, + "outputs": { + "type": "object" + }, + "steps": { + "items": { + "$ref": "#/$defs/Step" + }, + "type": "array" + }, + "warnings": { + "items": { + "$ref": "#/$defs/Warning" + }, + "type": "array" + } + }, + "required": [ + "do_not_send", + "outputs", + "steps", + "warnings" + ], + "type": "object" + }, + "provenance": { + "$ref": "#/$defs/Provenance" + }, + "quote": { + "$ref": "#/$defs/QuoteDocument" + }, + "text": { + "type": "string" + }, + "tool": { + "const": "make_quote" + } + }, + "required": [ + "tool", + "quote", + "text", + "internal", + "provenance" + ], + "type": "object" +}
- Changed
tuishui2 fields changed- added
Input schema / examplesAdded value: +[ + { + "enterpriseType": "trading", + "exports": [ + { + "exportDate": "2026-09-24", + "hsCode": "61091000", + "invoiceAmount": "100000", + "refundRate": "13", + "taxRate": "13" + } + ] + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "Links": { + "additionalProperties": false, + "description": "Addresses that go with the answer. `page`: the tool’s page on the site with the same inputs in its address, in the language asked (Chinese for a language the site does not publish yet), so a person can open the page that shows these numbers.", + "properties": { + "page": { + "description": "The tool’s page holding these inputs.", + "format": "uri", + "type": "string" + } + }, + "required": [ + "page" + ], + "type": "object" + }, + "Normalized": { + "description": "What the API changed in the inputs before core saw them, so the caller sees what was understood: a JSON number as text, a thousands comma, full-width digits, a currency or unit name or a date written another way. Absent when nothing was changed.", + "items": { + "additionalProperties": false, + "properties": { + "given": { + "description": "What was sent, as text.", + "type": "string" + }, + "path": { + "description": "The input, like `cartons.0.length`.", + "type": "string" + }, + "used": { + "description": "What core was given.", + "type": "string" + } + }, + "required": [ + "path", + "given", + "used" + ], + "type": "object" + }, + "type": "array" + }, + "PlainValue": { + "description": "A figure, tagged so a reader knows how to write it: amounts and quantities are exact decimal strings, never floats.", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "amount": { + "type": "string" + }, + "currency": { + "description": "An ISO 4217 code.", + "type": "string" + }, + "kind": { + "const": "money" + } + }, + "required": [ + "kind", + "amount", + "currency" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "quantity" + }, + "places": { + "description": "How many decimal places the rounding rule keeps; pad to it, never round.", + "minimum": 0, + "type": "integer" + }, + "unit": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "unit" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "ratio" + }, + "value": { + "description": "A fraction: 0.13 is 13 %.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "base": { + "type": "string" + }, + "kind": { + "const": "rate" + }, + "per": { + "description": "`per` units of `base` cost `value` units of `quote`.", + "type": "string" + }, + "quote": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "base", + "quote", + "per" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "grouping": { + "const": false + }, + "kind": { + "const": "count" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "code" + }, + "value": { + "description": "A token from a fixed list the tool exports; the words for it are the copy key `<tool>.code.<value>`.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "date" + }, + "value": { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + } + ] + }, + "Provenance": { + "additionalProperties": false, + "description": "Where the figures in an answer come from. In every answer, errors included.", + "properties": { + "api": { + "const": "v1" + }, + "datasets": { + "items": { + "$ref": "#/$defs/ProvenanceDataset" + }, + "type": "array" + }, + "generated_at": { + "description": "When the answer was made.", + "format": "date-time", + "type": "string" + }, + "language": { + "description": "The language of the source lines.", + "enum": [ + "zh-CN", + "en", + "ja", + "ko" + ] + }, + "license": { + "additionalProperties": false, + "description": "The license as copy keys: which text applies. `status` was `draft` until the text was approved (2026-10-12) and is `approved` now.", + "properties": { + "ours": { + "type": "string" + }, + "status": { + "enum": [ + "draft", + "approved" + ] + }, + "underlying": { + "type": "string" + } + }, + "required": [ + "status", + "ours", + "underlying" + ], + "type": "object" + }, + "notice": { + "description": "本站非官方渠道的说明:引用本站数据时请和来源行一起转述。 / The site’s own line that it is not an official channel: pass it on with the source line when you quote us.", + "type": "string" + }, + "site": { + "description": "The site the data is published by.", + "type": "string" + }, + "source_line": { + "description": "来源行:回复用户时请原样引用它,让读者知道数据出自哪里、有多新。 / The credit line to quote as it is when you answer: who the figures come from and how fresh they are (the newest publisher’s day among the datasets used, or the day the answer was made).", + "type": "string" + } + }, + "required": [ + "api", + "site", + "generated_at", + "language", + "source_line", + "notice", + "datasets", + "license" + ], + "type": "object" + }, + "ProvenanceDataset": { + "additionalProperties": false, + "description": "A dataset version an answer drew on. An origin the register does not let the site show is named nowhere.", + "properties": { + "id": { + "description": "The dataset.", + "type": "string" + }, + "origin": { + "description": "The origin’s id in the register; null when the site may not show it.", + "type": [ + "string", + "null" + ] + }, + "published_at": { + "description": "The publisher’s own date (and time, with its offset, when it gives one).", + "type": "string" + }, + "source": { + "description": "The publisher’s own source line, in the answer’s language; null when there is none to show.", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "The publisher’s page, only where the register lets the site link to it.", + "type": "string" + }, + "version": { + "description": "Its version, named after the publisher’s date.", + "type": "string" + } + }, + "required": [ + "id", + "version", + "published_at", + "origin", + "source" + ], + "type": "object" + }, + "Step": { + "additionalProperties": false, + "description": "One line of the worked example: `id` is the copy key of its sentence, `values` fill it in.", + "properties": { + "id": { + "type": "string" + }, + "message": { + "description": "这一步的一句话说明,数值已代入,用请求的语言。 / The step as one sentence in the language asked, its figures filled in. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "id", + "values" + ], + "type": "object" + }, + "Warning": { + "additionalProperties": false, + "description": "Something a reader should know about a result; `code` is a copy key.", + "properties": { + "code": { + "type": "string" + }, + "level": { + "description": "Absent means a caution.", + "enum": [ + "note", + "hint" + ] + }, + "message": { + "description": "这条提醒的一句话说明,数值已代入,用请求的语言:回复时请用它,不要自己编数字。 / The warning as one sentence in the language asked, its figures filled in: use it, do not make up figures. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "next": { + "description": "For a hint: the slug of the tool it points to.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "code", + "values" + ], + "type": "object" + }, + "tuishuiOutputs": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "description": "Each figure core returns, by id, as a tagged value. The ids listed are the ones the tool’s manifest names; a tool may return more (a figure that only its worked steps use), in the same form.", + "properties": { + "basis": { + "$ref": "#/$defs/PlainValue" + }, + "carriedForward": { + "$ref": "#/$defs/PlainValue" + }, + "costAddition": { + "$ref": "#/$defs/PlainValue" + }, + "endCredit": { + "$ref": "#/$defs/PlainValue" + }, + "exempted": { + "$ref": "#/$defs/PlainValue" + }, + "exemption": { + "$ref": "#/$defs/PlainValue" + }, + "exemptionOffset": { + "$ref": "#/$defs/PlainValue" + }, + "inputVat": { + "$ref": "#/$defs/PlainValue" + }, + "nonCreditable": { + "$ref": "#/$defs/PlainValue" + }, + "nonCreditableOffset": { + "$ref": "#/$defs/PlainValue" + }, + "refund": { + "$ref": "#/$defs/PlainValue" + }, + "taxDue": { + "$ref": "#/$defs/PlainValue" + }, + "taxPayable": { + "$ref": "#/$defs/PlainValue" + } + }, + "required": [], + "type": "object" + } + }, + "additionalProperties": false, + "properties": { + "links": { + "$ref": "#/$defs/Links" + }, + "normalized": { + "$ref": "#/$defs/Normalized" + }, + "outputs": { + "$ref": "#/$defs/tuishuiOutputs" + }, + "provenance": { + "$ref": "#/$defs/Provenance" + }, + "steps": { + "items": { + "$ref": "#/$defs/Step" + }, + "type": "array" + }, + "tool": { + "const": "tuishui" + }, + "warnings": { + "items": { + "$ref": "#/$defs/Warning" + }, + "type": "array" + } + }, + "required": [ + "tool", + "outputs", + "steps", + "warnings", + "links", + "provenance" + ], + "type": "object" +}
- Changed
unit-convert2 fields changed- added
Input schema / examplesAdded value: +[ + { + "from": "cm", + "kind": "length", + "to": "in", + "value": "60" + } +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "Links": { + "additionalProperties": false, + "description": "Addresses that go with the answer. `page`: the tool’s page on the site with the same inputs in its address, in the language asked (Chinese for a language the site does not publish yet), so a person can open the page that shows these numbers.", + "properties": { + "page": { + "description": "The tool’s page holding these inputs.", + "format": "uri", + "type": "string" + } + }, + "required": [ + "page" + ], + "type": "object" + }, + "Normalized": { + "description": "What the API changed in the inputs before core saw them, so the caller sees what was understood: a JSON number as text, a thousands comma, full-width digits, a currency or unit name or a date written another way. Absent when nothing was changed.", + "items": { + "additionalProperties": false, + "properties": { + "given": { + "description": "What was sent, as text.", + "type": "string" + }, + "path": { + "description": "The input, like `cartons.0.length`.", + "type": "string" + }, + "used": { + "description": "What core was given.", + "type": "string" + } + }, + "required": [ + "path", + "given", + "used" + ], + "type": "object" + }, + "type": "array" + }, + "PlainValue": { + "description": "A figure, tagged so a reader knows how to write it: amounts and quantities are exact decimal strings, never floats.", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "amount": { + "type": "string" + }, + "currency": { + "description": "An ISO 4217 code.", + "type": "string" + }, + "kind": { + "const": "money" + } + }, + "required": [ + "kind", + "amount", + "currency" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "quantity" + }, + "places": { + "description": "How many decimal places the rounding rule keeps; pad to it, never round.", + "minimum": 0, + "type": "integer" + }, + "unit": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "unit" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "ratio" + }, + "value": { + "description": "A fraction: 0.13 is 13 %.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "base": { + "type": "string" + }, + "kind": { + "const": "rate" + }, + "per": { + "description": "`per` units of `base` cost `value` units of `quote`.", + "type": "string" + }, + "quote": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value", + "base", + "quote", + "per" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "grouping": { + "const": false + }, + "kind": { + "const": "count" + }, + "value": { + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "code" + }, + "value": { + "description": "A token from a fixed list the tool exports; the words for it are the copy key `<tool>.code.<value>`.", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "date" + }, + "value": { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + }, + "required": [ + "kind", + "value" + ], + "type": "object" + } + ] + }, + "Provenance": { + "additionalProperties": false, + "description": "Where the figures in an answer come from. In every answer, errors included.", + "properties": { + "api": { + "const": "v1" + }, + "datasets": { + "items": { + "$ref": "#/$defs/ProvenanceDataset" + }, + "type": "array" + }, + "generated_at": { + "description": "When the answer was made.", + "format": "date-time", + "type": "string" + }, + "language": { + "description": "The language of the source lines.", + "enum": [ + "zh-CN", + "en", + "ja", + "ko" + ] + }, + "license": { + "additionalProperties": false, + "description": "The license as copy keys: which text applies. `status` was `draft` until the text was approved (2026-10-12) and is `approved` now.", + "properties": { + "ours": { + "type": "string" + }, + "status": { + "enum": [ + "draft", + "approved" + ] + }, + "underlying": { + "type": "string" + } + }, + "required": [ + "status", + "ours", + "underlying" + ], + "type": "object" + }, + "notice": { + "description": "本站非官方渠道的说明:引用本站数据时请和来源行一起转述。 / The site’s own line that it is not an official channel: pass it on with the source line when you quote us.", + "type": "string" + }, + "site": { + "description": "The site the data is published by.", + "type": "string" + }, + "source_line": { + "description": "来源行:回复用户时请原样引用它,让读者知道数据出自哪里、有多新。 / The credit line to quote as it is when you answer: who the figures come from and how fresh they are (the newest publisher’s day among the datasets used, or the day the answer was made).", + "type": "string" + } + }, + "required": [ + "api", + "site", + "generated_at", + "language", + "source_line", + "notice", + "datasets", + "license" + ], + "type": "object" + }, + "ProvenanceDataset": { + "additionalProperties": false, + "description": "A dataset version an answer drew on. An origin the register does not let the site show is named nowhere.", + "properties": { + "id": { + "description": "The dataset.", + "type": "string" + }, + "origin": { + "description": "The origin’s id in the register; null when the site may not show it.", + "type": [ + "string", + "null" + ] + }, + "published_at": { + "description": "The publisher’s own date (and time, with its offset, when it gives one).", + "type": "string" + }, + "source": { + "description": "The publisher’s own source line, in the answer’s language; null when there is none to show.", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "The publisher’s page, only where the register lets the site link to it.", + "type": "string" + }, + "version": { + "description": "Its version, named after the publisher’s date.", + "type": "string" + } + }, + "required": [ + "id", + "version", + "published_at", + "origin", + "source" + ], + "type": "object" + }, + "Step": { + "additionalProperties": false, + "description": "One line of the worked example: `id` is the copy key of its sentence, `values` fill it in.", + "properties": { + "id": { + "type": "string" + }, + "message": { + "description": "这一步的一句话说明,数值已代入,用请求的语言。 / The step as one sentence in the language asked, its figures filled in. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "id", + "values" + ], + "type": "object" + }, + "Warning": { + "additionalProperties": false, + "description": "Something a reader should know about a result; `code` is a copy key.", + "properties": { + "code": { + "type": "string" + }, + "level": { + "description": "Absent means a caution.", + "enum": [ + "note", + "hint" + ] + }, + "message": { + "description": "这条提醒的一句话说明,数值已代入,用请求的语言:回复时请用它,不要自己编数字。 / The warning as one sentence in the language asked, its figures filled in: use it, do not make up figures. Absent when a sentence cannot be made whole.", + "type": "string" + }, + "next": { + "description": "For a hint: the slug of the tool it points to.", + "type": "string" + }, + "values": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "type": "object" + } + }, + "required": [ + "code", + "values" + ], + "type": "object" + }, + "unit_convertOutputs": { + "additionalProperties": { + "$ref": "#/$defs/PlainValue" + }, + "description": "Each figure core returns, by id, as a tagged value. The ids listed are the ones the tool’s manifest names; a tool may return more (a figure that only its worked steps use), in the same form.", + "properties": { + "result": { + "$ref": "#/$defs/PlainValue" + } + }, + "required": [ + "result" + ], + "type": "object" + } + }, + "additionalProperties": false, + "properties": { + "links": { + "$ref": "#/$defs/Links" + }, + "normalized": { + "$ref": "#/$defs/Normalized" + }, + "outputs": { + "$ref": "#/$defs/unit_convertOutputs" + }, + "provenance": { + "$ref": "#/$defs/Provenance" + }, + "steps": { + "items": { + "$ref": "#/$defs/Step" + }, + "type": "array" + }, + "tool": { + "const": "unit-convert" + }, + "warnings": { + "items": { + "$ref": "#/$defs/Warning" + }, + "type": "array" + } + }, + "required": [ + "tool", + "outputs", + "steps", + "warnings", + "links", + "provenance" + ], + "type": "object" +}
1 tool update
- Added
make_quote
12 tool updates
- First observed
baojia - First observed
cbm - First observed
container-load - First observed
fx-convert - First observed
fx-cost - First observed
get_dataset - First observed
get_dataset_rows - First observed
list_datasets - First observed
lookup_refund_rate - First observed
maitou - First observed
tuishui - First observed
unit-convert
Related MCP Connectors
China export tax rebate rate & HS code lookup (官方退税率).
U.S. tariffs (HTS), Schedule B codes, export statistics, party screening and FMC license checks.
Taiwan parcel forwarding tools: freight and import-tax quotes, CCC tariff lookup, import rules.
Export invoices, packing list, SI, PO from order data; HS codes; port codes; CBM; Incoterms prices.
Related MCP Servers
AlicenseBqualityDmaintenance提供全球238个国家/地区的进出口贸易数据查询,支持按企业名称、产品关键字、HS编码等多维度联合搜索。1MIT- AlicenseNot gradedqualityDmaintenance全球海关贸易数据MCP服务器,支持按企业名称、产品关键字、HS编码等多维度查询238个国家/地区的进出口贸易数据。1MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to search Chinese HS commodity codes, retrieve detailed tariff and regulatory information, and calculate import taxes using 2026 import/export tariff data.MIT
- AlicenseAqualityDmaintenanceEnables querying China National Bureau of Statistics data including economic indicators, time series, and regional statistics. Supports natural language search, batch queries, comparisons, and analysis across monthly, quarterly, and yearly datasets.3124 npm8Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.