Estimate text length difference
estimate-text-length-differenceDetect layout risk by comparing original and translated text lengths. Set tolerance percent (default 30%) to control flagging sensitivity.
Instructions
Compare original and translated text lengths to detect layout risk; configurable tolerancePercent (default 30%).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| sourceText | Yes | Original text before translation | |
| translatedText | Yes | Translated text to compare against the original | |
| tolerancePercent | No | Allowed absolute percent difference between lengths before flagging risk |
Implementation Reference
- src/tools/textLengthTool.js:24-63 (handler)The main handler function (registerTextLengthTool) that registers and implements the 'estimate-text-length-difference' tool. It calculates source/translated text lengths, computes percent change, checks against tolerancePercent, and returns a verdict with summary.
function registerTextLengthTool(server) { server.registerTool( 'estimate-text-length-difference', { title: 'Estimate text length difference', description: 'Compare original and translated text lengths to detect layout risk; configurable tolerancePercent (default 30%).', inputSchema: lengthDiffInputSchema }, async params => { const sourceLength = measureLength(params.sourceText); const translatedLength = measureLength(params.translatedText); const delta = translatedLength - sourceLength; const percentChange = sourceLength === 0 ? null : (delta / sourceLength) * 100; const exceeds = percentChange === null ? translatedLength > 0 : Math.abs(percentChange) > params.tolerancePercent; const direction = delta === 0 ? 'no change' : delta > 0 ? 'longer' : 'shorter'; const verdict = percentChange === null && translatedLength === 0 ? '✅ Both texts are empty; no length risk.' : percentChange === null ? '⚠️ Source length is 0; percent change undefined and translated text is present.' : exceeds ? '⚠️ Length difference exceeds tolerance (layout risk likely).' : '✅ Length difference within tolerance.'; const summary = [ verdict, `Source length: ${sourceLength}`, `Translated length: ${translatedLength}`, percentChange === null ? `Change: N/A (source length is 0; direction: ${direction})` : `Change: ${percentChange.toFixed(2)}% (${direction})`, `Tolerance: ±${params.tolerancePercent}%` ].join('\n'); return { content: [{ type: 'text', text: summary }] }; } ); - src/tools/textLengthTool.js:9-18 (schema)Input schema for the tool: sourceText (string), translatedText (string), and tolerancePercent (number, 1-500, default 30).
const lengthDiffInputSchema = z.object({ sourceText: z.string().min(1).describe('Original text before translation'), translatedText: z.string().min(1).describe('Translated text to compare against the original'), tolerancePercent: z .number() .min(1) .max(500) .default(30) .describe('Allowed absolute percent difference between lengths before flagging risk') }); - src/tools/textLengthTool.js:20-22 (helper)Helper function measureLength that counts code points (via Array.from) to get string length.
function measureLength(text) { return Array.from(text).length; } - src/tools/textLengthTool.js:25-63 (registration)Registration of the tool on the MCP server via server.registerTool('estimate-text-length-difference', ...) with title, description, inputSchema, and the async handler callback.
server.registerTool( 'estimate-text-length-difference', { title: 'Estimate text length difference', description: 'Compare original and translated text lengths to detect layout risk; configurable tolerancePercent (default 30%).', inputSchema: lengthDiffInputSchema }, async params => { const sourceLength = measureLength(params.sourceText); const translatedLength = measureLength(params.translatedText); const delta = translatedLength - sourceLength; const percentChange = sourceLength === 0 ? null : (delta / sourceLength) * 100; const exceeds = percentChange === null ? translatedLength > 0 : Math.abs(percentChange) > params.tolerancePercent; const direction = delta === 0 ? 'no change' : delta > 0 ? 'longer' : 'shorter'; const verdict = percentChange === null && translatedLength === 0 ? '✅ Both texts are empty; no length risk.' : percentChange === null ? '⚠️ Source length is 0; percent change undefined and translated text is present.' : exceeds ? '⚠️ Length difference exceeds tolerance (layout risk likely).' : '✅ Length difference within tolerance.'; const summary = [ verdict, `Source length: ${sourceLength}`, `Translated length: ${translatedLength}`, percentChange === null ? `Change: N/A (source length is 0; direction: ${direction})` : `Change: ${percentChange.toFixed(2)}% (${direction})`, `Tolerance: ±${params.tolerancePercent}%` ].join('\n'); return { content: [{ type: 'text', text: summary }] }; } ); - src/index.js:29-29 (registration)Top-level registration call: registerTextLengthTool(server) wires the tool into the MCP server.
registerTextLengthTool(server);