{"name":"com.moltlinestudio/vision","slug":"moltlinestudio-vision","title":"Moltline Vision Maths","description":"Image header probing, bbox conversion, resize plans and colour maths. 4 of 6 free.","url":"https://mcp.market/server/moltlinestudio-vision","rating":null,"grade":"B","score":77,"certified":false,"status":"active","category":"media","tags":["media"],"presence":{"score":23,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-09-19T15:00:29.000Z","license":"MIT"},"uptime":{"percent":100,"checks":3,"ok":3,"last_checked_at":"2026-09-20T03:21:10.357Z","last_ok_at":"2026-09-20T03:21:10.357Z","latency_ms":115},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/GarphenGate/moltline-mcp","website":"https://moltlinestudio.com/servers.html#vision","version":"1.2.0","remotes":[{"type":"streamable-http","url":"https://mcp.moltlinestudio.com/vision"}],"packages":[],"tools":[{"name":"bbox_convert","description":"Convert bounding boxes between COCO, Pascal VOC and YOLO. FREE.\n\nThe three formats disagree on everything: COCO is [x, y, width, height],\nVOC is [x1, y1, x2, y2], YOLO is [cx, cy, w, h] normalised to the image.\nGetting this wrong produces boxes that look plausible and quietly ruin\nevery metric. Typical input {\"boxes\": [[10, 20, 100, 50]], \"from_format\":\n\"coco\", \"to_format\": \"yolo\", \"image_width\": 640, \"image_height\": 480}\nreturns {\"boxes\": [[0.0938, 0.0938, 0.1562, 0.1042]], \"converted\": 1,\n\"rejected\": []}.\n\nUse whenever a dataset and a model disagree about format. Not for scoring\npredictions (detection_metrics) and not for removing overlaps (nms). Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {\"error\": \"<what is wrong and how to fix it>\"} (for example {\"error\": \"boxes must contain at least one box\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"boxes":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","description":"Boxes to convert, each a list of exactly four numbers in\nfrom_format, e.g. [[10, 20, 100, 50]]."},"from_format":{"enum":["coco","voc","yolo"],"type":"string","description":"\"coco\" for [x, y, w, h], \"voc\" for [x1, y1, x2, y2], or\n\"yolo\" for normalised [cx, cy, w, h]."},"to_format":{"enum":["coco","voc","yolo"],"type":"string","description":"The format to convert to; same three choices."},"image_width":{"default":0,"minimum":0,"type":"integer","description":"Pixel width, required whenever yolo is on either side."},"image_height":{"default":0,"minimum":0,"type":"integer","description":"Pixel height, required whenever yolo is on either side."},"clip":{"default":false,"type":"boolean","description":"When true, clamp boxes to the image bounds instead of returning\nthem as they are. Off by default, because a box outside the image\nis usually a bug worth seeing."}},"required":["boxes","from_format","to_format"],"additionalProperties":false}},{"name":"colour_check","description":"Check a colour pair against the WCAG contrast thresholds. FREE.\n\nUses the WCAG 2 relative-luminance formula, so the number matches what an\naccessibility audit will report. Typical input {\"foreground\": \"#767676\",\n\"background\": \"#ffffff\"} returns {\"contrast_ratio\": 4.54, \"AA\": true,\n\"AAA\": false, \"required\": {\"AA\": 4.5, \"AAA\": 7.0}, \"verdict\": \"Passes AA\nfor normal text, fails AAA.\"}.\n\nUse when generating or auditing an interface. Not for converting colours\nbetween spaces and not for palettes. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {\"error\": \"<what is wrong and how to fix it>\"} (for example {\"error\": \"foreground must be a hex colour like #767676\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"foreground":{"type":"string","description":"Text colour as hex, e.g. \"#767676\" or \"767676\" or \"#777\"."},"background":{"type":"string","description":"Background colour in the same notation."},"large_text":{"default":false,"type":"boolean","description":"True for text at least 18pt, or 14pt bold, which WCAG\nallows to pass at a lower ratio. Default false."}},"required":["foreground","background"],"additionalProperties":false}},{"name":"detection_metrics","description":"Score detections against ground truth and show the working. PREMIUM (license).\n\nGreedy matching at the IoU threshold, highest-confidence prediction first,\neach ground-truth box matched at most once - the standard protocol.\nReports per-class precision, recall and F1, and average precision by the\nall-points interpolation used by Pascal VOC 2010 onward. Typical input\n{\"predictions\": [{\"box\": [0,0,10,10], \"label\": \"cat\", \"score\": 0.9}],\n\"ground_truth\": [{\"box\": [1,1,11,11], \"label\": \"cat\"}]} returns\n{\"overall\": {\"tp\": 1, \"fp\": 0, \"fn\": 0, \"precision\": 1.0, \"recall\": 1.0,\n\"f1\": 1.0}, \"per_class\": {...}, \"mAP\": 1.0}.\n\nUse to compare two models on the same held-out set. Not for cleaning up a\nsingle model's overlapping output first - run nms before this. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {\"error\": \"<what is wrong and how to fix it>\"} (for example {\"error\": \"ground_truth must contain at least one box\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"predictions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","description":"Predicted boxes, each {\"box\": [...], \"label\": ...,\n\"score\": ...}. Score defaults to 1.0 when omitted."},"ground_truth":{"items":{"additionalProperties":true,"type":"object"},"type":"array","description":"True boxes, each {\"box\": [...], \"label\": ...}."},"iou_threshold":{"default":0.5,"exclusiveMinimum":0,"maximum":1,"type":"number","description":"Overlap at which a prediction counts as a match.\nDefault 0.5, the usual reporting threshold."},"box_format":{"default":"voc","enum":["coco","voc","yolo"],"type":"string","description":"\"voc\", \"coco\" or \"yolo\". Default \"voc\"."},"image_width":{"default":0,"minimum":0,"type":"integer","description":"Pixel width; required for yolo boxes."},"image_height":{"default":0,"minimum":0,"type":"integer","description":"Pixel height; required for yolo boxes."}},"required":["predictions","ground_truth"],"additionalProperties":false}},{"name":"image_probe","description":"Read an image's format and pixel size from its header alone. FREE.\n\nDimensions live in the first few dozen bytes of PNG, JPEG, GIF, BMP and\nWebP, so a base64 prefix is enough - you do not need to send the whole\nfile, and nothing is decoded. Typical input {\"data_base64\": \"iVBORw0KG...\"}\nreturns {\"format\": \"png\", \"width\": 1920, \"height\": 1080, \"aspect_ratio\":\n1.7778, \"aspect_label\": \"16:9\", \"megapixels\": 2.07, \"orientation\":\n\"landscape\", \"bytes_inspected\": 512}.\n\nUse to find out what you are dealing with before planning a resize. Not for\npixel content - nothing here reads pixels - and not for EXIF. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {\"error\": \"<what is wrong and how to fix it>\"} (for example {\"error\": \"data_base64 must not be empty\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"data_base64":{"type":"string","description":"The image file, base64-encoded. The first few hundred\nbytes are enough for every supported format; send a prefix rather\nthan a large file. Data-URL prefixes like \"data:image/png;base64,\"\nare accepted and stripped."}},"required":["data_base64"],"additionalProperties":false}},{"name":"nms","description":"Remove duplicate detections of the same object. PREMIUM (license).\n\nGreedy non-maximum suppression: keep the highest-scoring box, drop\neverything overlapping it above the threshold, repeat. Ties break on the\nearlier index, so the result is deterministic rather than dependent on sort\nstability. Typical input {\"boxes\": [[0,0,10,10],[1,1,11,11],[50,50,60,60]],\n\"scores\": [0.9, 0.8, 0.7]} returns {\"keep\": [0, 2], \"suppressed\": [{\"index\":\n1, \"by\": 0, \"iou\": 0.6807}], \"kept\": 2}.\n\nUse after a detector that emits overlapping boxes. Not for scoring against\nground truth (detection_metrics) and not for format changes (bbox_convert). Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {\"error\": \"<what is wrong and how to fix it>\"} (for example {\"error\": \"boxes and scores must be the same length\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"boxes":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","description":"Candidate boxes in box_format, e.g. [[0, 0, 10, 10]]."},"scores":{"items":{"type":"number"},"type":"array","description":"One confidence per box, same order and same length as boxes."},"iou_threshold":{"default":0.5,"exclusiveMinimum":0,"maximum":1,"type":"number","description":"Overlap above which the lower-scoring box is dropped.\nDefault 0.5."},"box_format":{"default":"voc","enum":["coco","voc","yolo"],"type":"string","description":"\"voc\", \"coco\" or \"yolo\". Default \"voc\"."},"image_width":{"default":0,"minimum":0,"type":"integer","description":"Pixel width; required for yolo boxes."},"image_height":{"default":0,"minimum":0,"type":"integer","description":"Pixel height; required for yolo boxes."}},"required":["boxes","scores"],"additionalProperties":false}},{"name":"resize_plan","description":"Work out the exact scale, padding and crop for a model input size. FREE.\n\nReturns the numbers you need to transform boxes alongside the image, which\nis the step that usually gets skipped. Typical input {\"width\": 1920,\n\"height\": 1080, \"target\": \"yolo_640\"} returns {\"scale\": 0.3333,\n\"resized\": [640, 360], \"pad\": {\"left\": 0, \"top\": 140, \"right\": 0,\n\"bottom\": 140}, \"box_transform\": \"x_new = x * 0.3333 + 0; y_new = y *\n0.3333 + 140\"}.\n\nUse before feeding an image to a fixed-input model. Not for finding out the\nimage's size in the first place - that is image_probe. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {\"error\": \"<what is wrong and how to fix it>\"} (for example {\"error\": \"unknown target <value>; use one of <value> or set\"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"width":{"exclusiveMinimum":0,"type":"integer","description":"Source image width in pixels."},"height":{"exclusiveMinimum":0,"type":"integer","description":"Source image height in pixels."},"target":{"default":"yolo_640","type":"string","description":"A named preset: \"clip_224\", \"vit_384\", \"yolo_640\", \"sam_1024\",\n\"sd_512\", \"sd_768\" or \"detr_800\". Ignored when target_size is set."},"target_size":{"default":0,"minimum":0,"type":"integer","description":"A square side length in pixels, overriding target. Use\nthis for a size the presets do not cover."},"mode":{"default":"letterbox","enum":["letterbox","cover","stretch"],"type":"string","description":"\"letterbox\" scales to fit and pads the remainder, preserving\naspect; \"cover\" scales to fill and crops the overflow; \"stretch\"\ndistorts to fit exactly. Default \"letterbox\"."}},"required":["width","height"],"additionalProperties":false}}],"scan":{"score":77,"grade":"B","scanned_at":"2026-09-20T00:23:49.649Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T00:23:49.665Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 817ms"]},"poisoning":{"score":15,"max":15,"notes":["6 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 1 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 0 days ago"]},"identity":{"score":5,"max":10,"notes":["namespace and repository owner differ","website matches verified namespace"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://mcp.moltlinestudio.com/vision","reachable":true,"authRequired":false,"latencyMs":817,"serverInfo":{"name":"moltline-vision","version":"1.1.0"}}],"packages":[],"repo":{"found":true,"owner":"GarphenGate","repo":"moltline-mcp","archived":false,"pushedAt":"2026-09-19T15:00:29Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/316633241?v=4","ownerCreatedAt":"2026-08-13T15:17:26Z","license":"MIT"},"icon":{"url":"https://moltlinestudio.com/icon-192.png","source":"registry","width":192,"height":192},"presence":{"stars":0,"forks":0,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-09-19T15:00:29.000Z","score":23}}}},"grade_history":[],"reviews":[]}