estimate-text-length-difference
Compare original and translated text lengths to detect layout issues in Android apps; configurable tolerance helps identify potential display problems.
Instructions
Compare original and translated text lengths to detect layout risk; configurable tolerancePercent (default 30%).
Input Schema
TableJSON 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:33-62 (handler)The main execution logic for the 'estimate-text-length-difference' tool. Computes character lengths of source and translated text, calculates absolute percentage change, checks against configurable tolerance, determines direction of change, and formats a verdict summary with details.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)Zod input schema defining required sourceText and translatedText strings (non-empty), and optional tolerancePercent number (default 30%, range 1-500).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:24-64 (registration)Function to register the 'estimate-text-length-difference' tool on the MCP server, specifying the tool name, title, description, input schema, and handler function.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/index.js:29-29 (registration)Top-level call to register the text length tool on the main MCP server instance.registerTextLengthTool(server);
- src/tools/textLengthTool.js:20-22 (helper)Utility function to accurately measure text length by converting to array (handles Unicode grapheme clusters properly).function measureLength(text) { return Array.from(text).length; }