{"version":"1.0.0","services":[{"id":"preflight","name":"SVG Print Preflight","path":"/api/preflight","url":"https://first-ruble-agent.tohaa28.workers.dev/api/preflight","method":"POST","useCase":"Find artwork risks before sending SVG to print.","input":"SVG text, up to 128 KiB","limits":"Flags raster, live text, RGB, effects and open-path candidates. Heuristic, not certification.","priceUsdc":"0.02","demo":{"url":"https://first-ruble-agent.tohaa28.workers.dev/demo","method":"POST"},"inputSchema":{"type":"object","required":["svg"],"properties":{"svg":{"type":"string","description":"Self-contained UTF-8 SVG up to 128 KiB, no DTD","maxLength":131072}},"additionalProperties":false},"example":{"svg":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10mm\" height=\"10mm\" viewBox=\"0 0 10 10\"><rect width=\"10\" height=\"10\" fill=\"#ff0000\"/></svg>"}},{"id":"printcheck","name":"PrintCheck Geometry","path":"/api/printcheck","url":"https://first-ruble-agent.tohaa28.workers.dev/api/printcheck","method":"POST","useCase":"Check whether sampled details are too fine for a printing method.","input":"Binary ink rows, final dimensions in mm, method code","limits":"Measures sampled ink geometry. Not a PDF/CDR importer.","priceUsdc":"0.05","demo":{"url":"https://first-ruble-agent.tohaa28.workers.dev/demo/printcheck","method":"GET"},"inputSchema":{"type":"object","required":["rows","widthMm","heightMm","method"],"properties":{"rows":{"type":"array","items":{"type":"string"},"maxItems":192},"widthMm":{"type":"number","minimum":0.1,"maximum":500},"heightMm":{"type":"number","minimum":0.1,"maximum":500},"method":{"type":"string"},"conditions":{"type":"object"}}},"example":{"rows":["................","................","...##########...","...##########...","...##########...","................","................","................"],"widthMm":8,"heightMm":4,"method":"B1","conditions":{"underbase":false}}},{"id":"curve-clearance","name":"Bezier Curve Clearance","path":"/api/curve-clearance","url":"https://first-ruble-agent.tohaa28.workers.dev/api/curve-clearance","method":"POST","useCase":"Measure the gap between two curves before engraving or printing.","input":"Two line, quadratic or cubic segments in mm","limits":"Returns witness points and a conservative bound; check completeness.","priceUsdc":"0.03","demo":{"url":"https://first-ruble-agent.tohaa28.workers.dev/demo/curve-clearance","method":"GET"},"inputSchema":{"type":"object","required":["a","b","thresholdMm"],"properties":{"a":{"type":"array","description":"2-4 pairs of millimeter coordinates"},"b":{"type":"array","description":"2-4 pairs of millimeter coordinates"},"thresholdMm":{"type":"number","exclusiveMinimum":0,"maximum":1000}}},"example":{"a":[[0,0],[10,0]],"b":[[0,0.2],[10,0.2]],"thresholdMm":0.3}},{"id":"small-features","name":"Small Feature Detector","path":"/api/small-features","url":"https://first-ruble-agent.tohaa28.workers.dev/api/small-features","method":"POST","useCase":"Find tiny polygon objects and holes before production.","input":"Explicit polygon rings in millimeters","limits":"Checks object and hole dimensions; no SVG or curve import.","priceUsdc":"0.03","demo":{"url":"https://first-ruble-agent.tohaa28.workers.dev/demo/small-features","method":"GET"},"inputSchema":{"type":"object","required":["shapes","minWidthMm","minHeightMm"],"properties":{"shapes":{"type":"array","minItems":1,"maxItems":128,"items":{"type":"object","required":["id","outer"],"properties":{"id":{"type":"string"},"outer":{"type":"array","description":"3-256 [[xMm,yMm],...] points"},"holes":{"type":"array","description":"Optional enclosed simple polygon rings"}}}},"minWidthMm":{"type":"number","exclusiveMinimum":0},"minHeightMm":{"type":"number","exclusiveMinimum":0}}},"example":{"minWidthMm":0.1,"minHeightMm":0.1,"shapes":[{"id":"outer","outer":[[0,0],[10,0],[10,10],[0,10]],"holes":[[[3,3],[3.05,3],[3.05,3.05],[3,3.05]]]},{"id":"tiny","outer":[[12,1],[12.05,1],[12.05,1.04],[12,1.04]]}]}},{"id":"vector-health","name":"Vector Health Check","path":"/api/vector-health","url":"https://first-ruble-agent.tohaa28.workers.dev/api/vector-health","method":"POST","useCase":"Find duplicate nodes and short edges in prepared vector paths.","input":"Normalized polyline points in millimeters","limits":"Checks explicit polylines, not unconverted curved artwork.","priceUsdc":"0.05","demo":{"url":"https://first-ruble-agent.tohaa28.workers.dev/demo/vector-health","method":"GET"},"inputSchema":{"type":"object","required":["paths","minSegmentMm","nearNodeMm","closeGapMm"],"properties":{"paths":{"type":"array","minItems":1,"maxItems":128,"items":{"type":"object","required":["id","closed","points"],"properties":{"id":{"type":"string"},"closed":{"type":"boolean"},"points":{"type":"array","description":"2..512 [xMm,yMm] coordinate pairs"}}}},"minSegmentMm":{"type":"number","exclusiveMinimum":0},"nearNodeMm":{"type":"number","exclusiveMinimum":0},"closeGapMm":{"type":"number","exclusiveMinimum":0}}},"example":{"minSegmentMm":0.1,"nearNodeMm":0.015,"closeGapMm":0.05,"paths":[{"id":"tiny-gap","closed":false,"points":[[0,0],[10,0],[10,10],[0,10],[0,0.03]]},{"id":"short-edge","closed":true,"points":[[12,0],[15,0],[15,0.04],[15,4],[12,4]]}]}},{"id":"cutting-paths","name":"Cutting Path Validator","path":"/api/cutting-paths","url":"https://first-ruble-agent.tohaa28.workers.dev/api/cutting-paths","method":"POST","useCase":"Find open contours and self-intersections before cutting.","input":"Normalized polyline points in millimeters","limits":"Reports topology risks; not CNC certification.","priceUsdc":"0.05","demo":{"url":"https://first-ruble-agent.tohaa28.workers.dev/demo/cutting-paths","method":"GET"},"inputSchema":{"type":"object","required":["paths","minSegmentMm","nearNodeMm","closeGapMm"],"properties":{"paths":{"type":"array","minItems":1,"maxItems":128,"items":{"type":"object","required":["id","closed","points"],"properties":{"id":{"type":"string"},"closed":{"type":"boolean"},"points":{"type":"array","description":"2..512 [xMm,yMm] coordinate pairs"}}}},"minSegmentMm":{"type":"number","exclusiveMinimum":0},"nearNodeMm":{"type":"number","exclusiveMinimum":0},"closeGapMm":{"type":"number","exclusiveMinimum":0}}},"example":{"minSegmentMm":0.1,"nearNodeMm":0.015,"closeGapMm":0.05,"paths":[{"id":"tiny-gap","closed":false,"points":[[0,0],[10,0],[10,10],[0,10],[0,0.03]]},{"id":"short-edge","closed":true,"points":[[12,0],[15,0],[15,0.04],[15,4],[12,4]]}]}},{"id":"native-vector-health","name":"Native Bezier Health","path":"/api/native-vector-health","url":"https://first-ruble-agent.tohaa28.workers.dev/api/native-vector-health","method":"POST","useCase":"Inspect original SVG or restricted CorelDRAW EPS curve commands.","input":"Path-only SVG or supported CorelDRAW EPS text","limits":"Preserves native curves; rejects unsupported constructs and EPS transforms.","priceUsdc":"0.08","demo":{"url":"https://first-ruble-agent.tohaa28.workers.dev/demo/native-vector-health","method":"GET"},"inputSchema":{"type":"object","required":["format","source"],"properties":{"format":{"type":"string","enum":["svg","eps"]},"source":{"type":"string","description":"Restricted raw SVG or CorelDRAW EPS source text"},"minSegmentMm":{"type":"number","exclusiveMinimum":0}}},"example":{"format":"svg","source":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20mm\" height=\"20mm\" viewBox=\"0 0 20 20\"><path d=\"M0 0 C1 0 1 1 2 1 L2 2 Z\"/></svg>","minSegmentMm":0.1}}],"mcp":"https://first-ruble-agent.tohaa28.workers.dev/mcp"}