{"data":{"name":"com.scriptcompiler/scriptcompiler","title":"ScriptCompiler","description":"Create motion and play it on The Handy, Autoblow, VacuGlide, Kiiroo, OSSM and Lovense toys.","version":"1.0.0","websiteUrl":"https://scriptcompiler.com","repositoryUrl":null,"remotes":[{"url":"https://mcp.scriptcompiler.com/account/mcp","type":"streamable-http"},{"url":"https://mcp.scriptcompiler.com/mcp","type":"streamable-http"}],"packages":[],"status":"active","isLatest":true,"publishedAt":"2026-10-22T09:00:51.647Z","updatedAt":"2026-10-22T09:00:51.647Z","source":"official-registry","verification":"official","confidence":100,"stars":null,"sources":[{"stars":null,"title":"ScriptCompiler","source":"official-registry","sourceId":"com.scriptcompiler/scriptcompiler","updatedAt":"2026-10-22T09:00:51.647Z","confidence":100,"websiteUrl":"https://scriptcompiler.com","description":"Create motion and play it on The Handy, Autoblow, VacuGlide, Kiiroo, OSSM and Lovense toys.","verification":"official","repositoryUrl":null}],"toolIndex":{"tools":[{"serverName":"com.scriptcompiler/scriptcompiler","endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","name":"clear_points","title":"Clear points","description":"Delete points. Give axis to clear one axis, or leave it out for every axis. Give from_ms and to_ms to clear only that range. Only when the user asks to clear, delete or start over.","inputSchema":{"type":"object","properties":{"editor_code":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"The editor code the user reads from the editor's AI panel under Your own AI, for example K7P4QX. Leave it out when connected with the account address.","title":"Editor Code"},"axis":{"anyOf":[{"enum":["stroke","surge","sway","twist","roll","pitch","vibrate"],"type":"string"},{"type":"null"}],"default":null,"title":"Axis"},"from_ms":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Start of the time range in milliseconds on the video timeline.","title":"From Ms"},"to_ms":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"End of the time range in milliseconds.","title":"To Ms"}},"title":"clear_pointsArguments"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"definitionHash":"3a1207dd1eb942b2b68dbdd4d6cc77cd179c950ae89502c6d26841d954fe55a6","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T10:47:03.165Z","metadataTrust":"untrusted"},{"serverName":"com.scriptcompiler/scriptcompiler","endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","name":"control_playback","title":"Control playback","description":"Play, pause or jump to at_ms in the user's editor, for example to have the user watch and feel one part. play and pause need a loaded video.","inputSchema":{"type":"object","properties":{"editor_code":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"The editor code the user reads from the editor's AI panel under Your own AI, for example K7P4QX. Leave it out when connected with the account address.","title":"Editor Code"},"action":{"enum":["play","pause","seek"],"title":"Action","type":"string"},"at_ms":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Start of the time range in milliseconds on the video timeline.","title":"At Ms"}},"required":["action"],"title":"control_playbackArguments"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"definitionHash":"7ca7ac49645a3b567e623de79939cd5958c29263bdeb7d6e50724ccbd272964c","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T10:47:03.165Z","metadataTrust":"untrusted"},{"serverName":"com.scriptcompiler/scriptcompiler","endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","name":"create_motion","title":"Create motion","description":"Render a described motion (or exact funscript points) and show it without playing it on a device. Needs no connection key. To play it afterwards, call play_motion with the same motion.","inputSchema":{"type":"object","properties":{"device":{"default":"handy","description":"The device the motion is fitted to.","enum":["handy","autoblow","vacuglide","bluetooth"],"title":"Device","type":"string"},"sections":{"anyOf":[{"items":{"$ref":"#/$defs/Section"},"maxItems":200,"type":"array"},{"type":"null"}],"default":null,"description":"The motion as consecutive sections. Use this for described motion.","title":"Sections"},"actions":{"anyOf":[{"items":{"$ref":"#/$defs/Action"},"maxItems":10000,"type":"array"},{"type":"null"}],"default":null,"description":"Exact funscript points, for example from a pasted funscript. Use instead of sections.","title":"Actions"},"repeat":{"default":1,"description":"Play the whole motion this many times in a row.","maximum":100,"minimum":1,"title":"Repeat","type":"integer"},"title":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Short name for the motion, for example Slow build-up. Used as the funscript title and download file name.","title":"Title"}},"$defs":{"Action":{"description":"One funscript point.","properties":{"at":{"description":"Time in milliseconds.","minimum":0,"title":"At","type":"number"},"pos":{"description":"Position 0-100.","maximum":100,"minimum":0,"title":"Pos","type":"number"}},"required":["at","pos"],"title":"Action","type":"object"},"Section":{"description":"One stretch of motion. Fields ending in _end ramp linearly from the\nsection's start value to that value by the section's end.","properties":{"duration_seconds":{"description":"Length of this section in seconds.","exclusiveMinimum":0,"maximum":3600,"title":"Duration Seconds","type":"number"},"kind":{"default":"strokes","description":"strokes = repeated up-down strokes; hold = stay still at one position.","enum":["strokes","hold"],"title":"Kind","type":"string"},"strokes_per_minute":{"default":60,"description":"Tempo at the section start. One stroke is a full down-up-down cycle. Slow 20-40, medium 50-90, fast 100-160, very fast 170+.","maximum":300,"minimum":1,"title":"Strokes Per Minute","type":"number"},"strokes_per_minute_end":{"anyOf":[{"maximum":300,"minimum":1,"type":"number"},{"type":"null"}],"default":null,"description":"Tempo at the section end, to speed up or slow down gradually.","title":"Strokes Per Minute End"},"bottom":{"default":0,"description":"Lowest position of each stroke (0 = bottom of travel).","maximum":100,"minimum":0,"title":"Bottom","type":"number"},"top":{"default":100,"description":"Highest position of each stroke (100 = top of travel).","maximum":100,"minimum":0,"title":"Top","type":"number"},"bottom_end":{"anyOf":[{"maximum":100,"minimum":0,"type":"number"},{"type":"null"}],"default":null,"description":"Lowest position at the section end.","title":"Bottom End"},"top_end":{"anyOf":[{"maximum":100,"minimum":0,"type":"number"},{"type":"null"}],"default":null,"description":"Highest position at the section end.","title":"Top End"},"curve":{"default":"snap","description":"Stroke shape: snap (linear, crisp), ease (smooth), settle (lingers low), hold-peak (pauses briefly at the top), rise (slow rise, quick drop).","enum":["snap","ease","settle","hold-peak","rise"],"title":"Curve","type":"string"},"variation":{"default":0,"description":"Random variation in tempo and depth for a less mechanical feel. 0 = exact, 0.2-0.4 = natural.","maximum":1,"minimum":0,"title":"Variation","type":"number"},"position":{"anyOf":[{"maximum":100,"minimum":0,"type":"number"},{"type":"null"}],"default":null,"description":"Hold sections only: the position to hold. Omit to hold where the motion stopped.","title":"Position"}},"required":["duration_seconds"],"title":"Section","type":"object"}},"title":"create_motionArguments"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"4dda3a986adb66aadd4236078b904ced389f6f8ccd56587bb212f4d649d9de98","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T10:47:03.165Z","metadataTrust":"untrusted"},{"serverName":"com.scriptcompiler/scriptcompiler","endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","name":"derive_axis","title":"Derive axis","description":"Build target_axis from source_axis over the whole script. method follow makes a scaled, optionally inverted copy shifted by delay_ms and position_offset, for example a gentler, delayed surge from the stroke. method per_stroke puts one point on each stroke of the source, moving between target_min (at the bottom) and target_max (at the top), best for vibrate.","inputSchema":{"type":"object","properties":{"editor_code":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"The editor code the user reads from the editor's AI panel under Your own AI, for example K7P4QX. Leave it out when connected with the account address.","title":"Editor Code"},"source_axis":{"enum":["stroke","surge","sway","twist","roll","pitch","vibrate"],"title":"Source Axis","type":"string"},"target_axis":{"enum":["stroke","surge","sway","twist","roll","pitch","vibrate"],"title":"Target Axis","type":"string"},"method":{"default":"follow","enum":["follow","per_stroke"],"title":"Method","type":"string"},"scale":{"default":1,"title":"Scale","type":"number"},"invert":{"default":false,"title":"Invert","type":"boolean"},"delay_ms":{"default":0,"title":"Delay Ms","type":"number"},"position_offset":{"default":0,"title":"Position Offset","type":"number"},"target_min":{"default":0,"maximum":100,"minimum":0,"title":"Target Min","type":"number"},"target_max":{"default":100,"maximum":100,"minimum":0,"title":"Target Max","type":"number"}},"required":["source_axis","target_axis"],"title":"derive_axisArguments"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"definitionHash":"c93e4c6c6244e77ed616a8e67b9d5f0d179a2dcca909c3400b227d9141c06d8a","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T10:47:03.165Z","metadataTrust":"untrusted"},{"serverName":"com.scriptcompiler/scriptcompiler","endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","name":"edit_chapters","title":"Edit chapters","description":"Change the chapters: add (name, from_ms, to_ms), rename (name, new_name), retime (name, from_ms, to_ms), remove (name) or clear_all. Chapters are found by exact name and overlapping neighbours are trimmed. Only when the user asks for a chapter change.","inputSchema":{"type":"object","properties":{"editor_code":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"The editor code the user reads from the editor's AI panel under Your own AI, for example K7P4QX. Leave it out when connected with the account address.","title":"Editor Code"},"action":{"enum":["add","rename","retime","remove","clear_all"],"title":"Action","type":"string"},"name":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"title":"Name"},"new_name":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"title":"New Name"},"from_ms":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Start of the time range in milliseconds on the video timeline.","title":"From Ms"},"to_ms":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"End of the time range in milliseconds.","title":"To Ms"}},"required":["action"],"title":"edit_chaptersArguments"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"definitionHash":"d74d3d1bb3b9512f2a69065612cb89cc4e83a9cdd34be41e5ae1fda42bfa8111","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T10:47:03.165Z","metadataTrust":"untrusted"},{"serverName":"com.scriptcompiler/scriptcompiler","endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","name":"edit_points","title":"Edit points","description":"Add, move or delete single points on one axis at exact times. Every other point stays as it is. add puts each point exactly where given and replaces an existing point within replace_within_ms of it. remove_at_ms deletes the point nearest each time, within replace_within_ms. To move a point, remove its old time and add the new one. Points are not speed fitted; the result lists any part now too fast for devices. Lands in the editor at once as one Undo step.","inputSchema":{"type":"object","properties":{"editor_code":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"The editor code the user reads from the editor's AI panel under Your own AI, for example K7P4QX. Leave it out when connected with the account address.","title":"Editor Code"},"axis":{"default":"stroke","description":"Axis. stroke is the main up and down axis.","enum":["stroke","surge","sway","twist","roll","pitch","vibrate"],"title":"Axis","type":"string"},"add":{"anyOf":[{"items":{"$ref":"#/$defs/Action"},"maxItems":1000,"type":"array"},{"type":"null"}],"default":null,"description":"Points to put at exact times.","title":"Add"},"remove_at_ms":{"anyOf":[{"items":{"minimum":0,"type":"integer"},"maxItems":1000,"type":"array"},{"type":"null"}],"default":null,"description":"Times in milliseconds of points to delete.","title":"Remove At Ms"},"replace_within_ms":{"default":50,"description":"How close counts as the same point.","maximum":1000,"minimum":0,"title":"Replace Within Ms","type":"integer"}},"$defs":{"Action":{"description":"One funscript point.","properties":{"at":{"description":"Time in milliseconds.","minimum":0,"title":"At","type":"number"},"pos":{"description":"Position 0-100.","maximum":100,"minimum":0,"title":"Pos","type":"number"}},"required":["at","pos"],"title":"Action","type":"object"}},"title":"edit_pointsArguments"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"definitionHash":"4d9636ee68ed52b5492c254b7a74a8f15e8187fa6999b612d95b6dbe4cfc3716","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T10:47:03.165Z","metadataTrust":"untrusted"},{"serverName":"com.scriptcompiler/scriptcompiler","endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","name":"export_funscript","title":"Funscript file","description":"The motion as a .funscript file with ScriptCompiler metadata, for the motion card's Download button.","inputSchema":{"type":"object","properties":{"device":{"default":"handy","description":"The device the motion is fitted to.","enum":["handy","autoblow","vacuglide","bluetooth"],"title":"Device","type":"string"},"sections":{"anyOf":[{"items":{"$ref":"#/$defs/Section"},"maxItems":200,"type":"array"},{"type":"null"}],"default":null,"description":"The motion as consecutive sections. Use this for described motion.","title":"Sections"},"actions":{"anyOf":[{"items":{"$ref":"#/$defs/Action"},"maxItems":10000,"type":"array"},{"type":"null"}],"default":null,"description":"Exact funscript points, for example from a pasted funscript. Use instead of sections.","title":"Actions"},"repeat":{"default":1,"description":"Play the whole motion this many times in a row.","maximum":100,"minimum":1,"title":"Repeat","type":"integer"},"title":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Short name for the motion, for example Slow build-up. Used as the funscript title and download file name.","title":"Title"}},"$defs":{"Action":{"description":"One funscript point.","properties":{"at":{"description":"Time in milliseconds.","minimum":0,"title":"At","type":"number"},"pos":{"description":"Position 0-100.","maximum":100,"minimum":0,"title":"Pos","type":"number"}},"required":["at","pos"],"title":"Action","type":"object"},"Section":{"description":"One stretch of motion. Fields ending in _end ramp linearly from the\nsection's start value to that value by the section's end.","properties":{"duration_seconds":{"description":"Length of this section in seconds.","exclusiveMinimum":0,"maximum":3600,"title":"Duration Seconds","type":"number"},"kind":{"default":"strokes","description":"strokes = repeated up-down strokes; hold = stay still at one position.","enum":["strokes","hold"],"title":"Kind","type":"string"},"strokes_per_minute":{"default":60,"description":"Tempo at the section start. One stroke is a full down-up-down cycle. Slow 20-40, medium 50-90, fast 100-160, very fast 170+.","maximum":300,"minimum":1,"title":"Strokes Per Minute","type":"number"},"strokes_per_minute_end":{"anyOf":[{"maximum":300,"minimum":1,"type":"number"},{"type":"null"}],"default":null,"description":"Tempo at the section end, to speed up or slow down gradually.","title":"Strokes Per Minute End"},"bottom":{"default":0,"description":"Lowest position of each stroke (0 = bottom of travel).","maximum":100,"minimum":0,"title":"Bottom","type":"number"},"top":{"default":100,"description":"Highest position of each stroke (100 = top of travel).","maximum":100,"minimum":0,"title":"Top","type":"number"},"bottom_end":{"anyOf":[{"maximum":100,"minimum":0,"type":"number"},{"type":"null"}],"default":null,"description":"Lowest position at the section end.","title":"Bottom End"},"top_end":{"anyOf":[{"maximum":100,"minimum":0,"type":"number"},{"type":"null"}],"default":null,"description":"Highest position at the section end.","title":"Top End"},"curve":{"default":"snap","description":"Stroke shape: snap (linear, crisp), ease (smooth), settle (lingers low), hold-peak (pauses briefly at the top), rise (slow rise, quick drop).","enum":["snap","ease","settle","hold-peak","rise"],"title":"Curve","type":"string"},"variation":{"default":0,"description":"Random variation in tempo and depth for a less mechanical feel. 0 = exact, 0.2-0.4 = natural.","maximum":1,"minimum":0,"title":"Variation","type":"number"},"position":{"anyOf":[{"maximum":100,"minimum":0,"type":"number"},{"type":"null"}],"default":null,"description":"Hold sections only: the position to hold. Omit to hold where the motion stopped.","title":"Position"}},"required":["duration_seconds"],"title":"Section","type":"object"}},"title":"export_funscriptArguments"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"a0ca97bbf67ba39b16d182af924975409686e191c84b9766177c51db4b024f54","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T10:47:03.165Z","metadataTrust":"untrusted"},{"serverName":"com.scriptcompiler/scriptcompiler","endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","name":"look_at_video","title":"Look at video","description":"See frames of the user's video as small pictures: one at at_ms, or up to 6 spread evenly from from_ms to to_ms. Use it to see what happens in a part, not to time single strokes. Only works after the user turns on Let my AI see video frames.","inputSchema":{"type":"object","properties":{"editor_code":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"The editor code the user reads from the editor's AI panel under Your own AI, for example K7P4QX. Leave it out when connected with the account address.","title":"Editor Code"},"at_ms":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Start of the time range in milliseconds on the video timeline.","title":"At Ms"},"from_ms":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Start of the time range in milliseconds on the video timeline.","title":"From Ms"},"to_ms":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"End of the time range in milliseconds.","title":"To Ms"},"count":{"default":4,"maximum":6,"minimum":1,"title":"Count","type":"integer"}},"title":"look_at_videoArguments"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"a89d1cb0b0380adad8ab8c4164eb90f1659ef5c61cb79ab41a554882fe00a6a9","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T10:47:03.165Z","metadataTrust":"untrusted"},{"serverName":"com.scriptcompiler/scriptcompiler","endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","name":"play_motion","title":"Play motion","description":"Render a described motion (or exact funscript points) and play it on the user's device, replacing anything already playing. Returns what will actually play.","inputSchema":{"type":"object","properties":{"connection_key":{"description":"The device's connection key (Handy) or device token (Autoblow, VacuGlide) from the manufacturer's app, or the Device ID on the ToyController phone screen (Bluetooth toys).","maxLength":255,"minLength":1,"title":"Connection Key","type":"string"},"device":{"default":"handy","description":"Which device the key belongs to. bluetooth covers every Bluetooth toy paired on the ToyController phone screen.","enum":["handy","autoblow","vacuglide","bluetooth"],"title":"Device","type":"string"},"sections":{"anyOf":[{"items":{"$ref":"#/$defs/Section"},"maxItems":200,"type":"array"},{"type":"null"}],"default":null,"description":"The motion as consecutive sections. Use this for described motion.","title":"Sections"},"actions":{"anyOf":[{"items":{"$ref":"#/$defs/Action"},"maxItems":10000,"type":"array"},{"type":"null"}],"default":null,"description":"Exact funscript points, for example from a pasted funscript. Use instead of sections.","title":"Actions"},"repeat":{"default":1,"description":"Play the whole motion this many times in a row.","maximum":100,"minimum":1,"title":"Repeat","type":"integer"},"title":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Short name for the motion, for example Slow build-up. Used as the funscript title and download file name.","title":"Title"}},"required":["connection_key"],"$defs":{"Action":{"description":"One funscript point.","properties":{"at":{"description":"Time in milliseconds.","minimum":0,"title":"At","type":"number"},"pos":{"description":"Position 0-100.","maximum":100,"minimum":0,"title":"Pos","type":"number"}},"required":["at","pos"],"title":"Action","type":"object"},"Section":{"description":"One stretch of motion. Fields ending in _end ramp linearly from the\nsection's start value to that value by the section's end.","properties":{"duration_seconds":{"description":"Length of this section in seconds.","exclusiveMinimum":0,"maximum":3600,"title":"Duration Seconds","type":"number"},"kind":{"default":"strokes","description":"strokes = repeated up-down strokes; hold = stay still at one position.","enum":["strokes","hold"],"title":"Kind","type":"string"},"strokes_per_minute":{"default":60,"description":"Tempo at the section start. One stroke is a full down-up-down cycle. Slow 20-40, medium 50-90, fast 100-160, very fast 170+.","maximum":300,"minimum":1,"title":"Strokes Per Minute","type":"number"},"strokes_per_minute_end":{"anyOf":[{"maximum":300,"minimum":1,"type":"number"},{"type":"null"}],"default":null,"description":"Tempo at the section end, to speed up or slow down gradually.","title":"Strokes Per Minute End"},"bottom":{"default":0,"description":"Lowest position of each stroke (0 = bottom of travel).","maximum":100,"minimum":0,"title":"Bottom","type":"number"},"top":{"default":100,"description":"Highest position of each stroke (100 = top of travel).","maximum":100,"minimum":0,"title":"Top","type":"number"},"bottom_end":{"anyOf":[{"maximum":100,"minimum":0,"type":"number"},{"type":"null"}],"default":null,"description":"Lowest position at the section end.","title":"Bottom End"},"top_end":{"anyOf":[{"maximum":100,"minimum":0,"type":"number"},{"type":"null"}],"default":null,"description":"Highest position at the section end.","title":"Top End"},"curve":{"default":"snap","description":"Stroke shape: snap (linear, crisp), ease (smooth), settle (lingers low), hold-peak (pauses briefly at the top), rise (slow rise, quick drop).","enum":["snap","ease","settle","hold-peak","rise"],"title":"Curve","type":"string"},"variation":{"default":0,"description":"Random variation in tempo and depth for a less mechanical feel. 0 = exact, 0.2-0.4 = natural.","maximum":1,"minimum":0,"title":"Variation","type":"number"},"position":{"anyOf":[{"maximum":100,"minimum":0,"type":"number"},{"type":"null"}],"default":null,"description":"Hold sections only: the position to hold. Omit to hold where the motion stopped.","title":"Position"}},"required":["duration_seconds"],"title":"Section","type":"object"}},"title":"play_motionArguments"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"definitionHash":"c171f3f49630a955256304048ed650779d9d0ddb1bcae98a5b54147d9043f184","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T10:47:03.165Z","metadataTrust":"untrusted"},{"serverName":"com.scriptcompiler/scriptcompiler","endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","name":"read_points","title":"Read points","description":"The points of one axis between from_ms and to_ms, thinned out evenly past 400 points, plus a summary of that range: main stroke frequency, position range and whether it builds or winds down.","inputSchema":{"type":"object","properties":{"editor_code":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"The editor code the user reads from the editor's AI panel under Your own AI, for example K7P4QX. Leave it out when connected with the account address.","title":"Editor Code"},"axis":{"description":"Axis. stroke is the main up and down axis.","enum":["stroke","surge","sway","twist","roll","pitch","vibrate"],"title":"Axis","type":"string"},"from_ms":{"minimum":0,"title":"From Ms","type":"integer"},"to_ms":{"minimum":0,"title":"To Ms","type":"integer"}},"required":["axis","from_ms","to_ms"],"title":"read_pointsArguments"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"bd3a7e082d7b33cda6ec7b365fd7289090d3441206f92330f6daf033c0e00f60","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T10:47:03.165Z","metadataTrust":"untrusted"},{"serverName":"com.scriptcompiler/scriptcompiler","endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","name":"read_script","title":"Read script","description":"Overview of the script open in the user's ScriptCompiler editor: each axis with its points, range, strokes and speed, parts too fast for devices (over 400 units per second), chapters, the video length, the play position, the user's selection, whether video frames are allowed, and the editor tools run_editor_tool can run. Call it first, and again after the user edits.","inputSchema":{"type":"object","properties":{"editor_code":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"The editor code the user reads from the editor's AI panel under Your own AI, for example K7P4QX. Leave it out when connected with the account address.","title":"Editor Code"}},"title":"read_scriptArguments"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"1973f5f0778ee519011076cec21b4707b4a5cadc3c7b4c71a6e984b8447f3503","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T10:47:03.165Z","metadataTrust":"untrusted"},{"serverName":"com.scriptcompiler/scriptcompiler","endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","name":"run_editor_tool","title":"Run editor tool","description":"Run one of the editor's own Tools panel tools (Smoothing, Speed Limiter, Simplify and the rest) on an axis, as if the user ran it. read_script lists the ids and settings. Give from_ms and to_ms for one range, or leave both out for the whole axis. A tool marked needs ScriptCompiler Pro cannot run: tell the user it is part of Pro and do not copy its effect another way. Lands as one Undo step.","inputSchema":{"type":"object","properties":{"editor_code":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"The editor code the user reads from the editor's AI panel under Your own AI, for example K7P4QX. Leave it out when connected with the account address.","title":"Editor Code"},"tool":{"description":"Tool id from read_script, for example smoothing.","maxLength":40,"title":"Tool","type":"string"},"axis":{"default":"stroke","description":"Axis. stroke is the main up and down axis.","enum":["stroke","surge","sway","twist","roll","pitch","vibrate"],"title":"Axis","type":"string"},"from_ms":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Start of the time range in milliseconds on the video timeline.","title":"From Ms"},"to_ms":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"End of the time range in milliseconds.","title":"To Ms"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"The tool's settings by name.","title":"Params"}},"required":["tool"],"title":"run_editor_toolArguments"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"definitionHash":"7e7810fcaa6479861c8c4fc38ca0ac8ef697adf82ead33c9c07f67ed7bddacd4","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T10:47:03.165Z","metadataTrust":"untrusted"},{"serverName":"com.scriptcompiler/scriptcompiler","endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","name":"stop_motion","title":"Stop motion","description":"Stop whatever is playing on the user's device.","inputSchema":{"type":"object","properties":{"connection_key":{"description":"The device's connection key (Handy) or device token (Autoblow, VacuGlide) from the manufacturer's app, or the Device ID on the ToyController phone screen (Bluetooth toys).","maxLength":255,"minLength":1,"title":"Connection Key","type":"string"},"device":{"default":"handy","description":"Which device the key belongs to. bluetooth covers every Bluetooth toy paired on the ToyController phone screen.","enum":["handy","autoblow","vacuglide","bluetooth"],"title":"Device","type":"string"}},"required":["connection_key"],"title":"stop_motionArguments"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"definitionHash":"3aecf0dbe7ae364c05c969d2b19825a3a1bf95db62a71766a7dea621d5878287","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T10:47:03.165Z","metadataTrust":"untrusted"},{"serverName":"com.scriptcompiler/scriptcompiler","endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","name":"undo_last_change","title":"Undo last change","description":"Undo the last change you made in the editor. It refuses when the user edited those axes since, so it never undoes the user's own work.","inputSchema":{"type":"object","properties":{"editor_code":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"The editor code the user reads from the editor's AI panel under Your own AI, for example K7P4QX. Leave it out when connected with the account address.","title":"Editor Code"}},"title":"undo_last_changeArguments"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"definitionHash":"6e67053db66f8e2cf9fa1e373664aaf641554b6106f055d5f0236821801a7048","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T10:47:03.165Z","metadataTrust":"untrusted"},{"serverName":"com.scriptcompiler/scriptcompiler","endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","name":"write_coordinated_axes","title":"Write coordinated axes","description":"Write several axes at once from one shared stroke rhythm, so all axes keep the same beat. schedule is an ordered, gap-free list of cycles (start_ms, duration_ms, kind stroke or hold, and for strokes bottom 0, top 100, peak_frac 0.5 and intensity 50 unless given). One stroke cycle is one full down and up. A hold pauses where the last cycle ended or at its position. Each axis spec is tracking (curve snap, ease, settle, hold-peak or rise, phase_lag 0-1, amplitude, baseline, per_cycle_track) or static (position, ease_in_ms). amplitude scales the schedule depth: the stroke axis always uses amplitude 50 and baseline 50, companions use a smaller amplitude. Set speed with duration_ms and depth with bottom and top. Pass target_duration_ms when the user asks for a length; the call fails if the schedule does not match it. Lands as one Undo step and returns measured stats.","inputSchema":{"type":"object","properties":{"editor_code":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"The editor code the user reads from the editor's AI panel under Your own AI, for example K7P4QX. Leave it out when connected with the account address.","title":"Editor Code"},"schedule":{"items":{"$ref":"#/$defs/Cycle"},"maxItems":5000,"minItems":1,"title":"Schedule","type":"array"},"axis_specs":{"items":{"$ref":"#/$defs/AxisSpec"},"maxItems":7,"minItems":1,"title":"Axis Specs","type":"array"},"target_duration_ms":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"title":"Target Duration Ms"}},"required":["schedule","axis_specs"],"$defs":{"AxisSpec":{"properties":{"axis":{"enum":["stroke","surge","sway","twist","roll","pitch","vibrate"],"title":"Axis","type":"string"},"mode":{"enum":["tracking","static"],"title":"Mode","type":"string"},"curve":{"anyOf":[{"enum":["snap","ease","settle","hold-peak","rise"],"type":"string"},{"type":"null"}],"default":null,"title":"Curve"},"phase_lag":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Phase Lag"},"amplitude":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Amplitude"},"baseline":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Baseline"},"per_cycle_track":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Per Cycle Track"},"position":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Position"},"ease_in_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Ease In Ms"}},"required":["axis","mode"],"title":"AxisSpec","type":"object"},"Cycle":{"properties":{"start_ms":{"title":"Start Ms","type":"number"},"duration_ms":{"title":"Duration Ms","type":"number"},"kind":{"enum":["stroke","hold"],"title":"Kind","type":"string"},"bottom":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Bottom"},"top":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Top"},"peak_frac":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Peak Frac"},"intensity":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Intensity"},"position":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Hold cycles only: the 0-100 position to pause at. Omit to hold where the last cycle ended.","title":"Position"}},"required":["start_ms","duration_ms","kind"],"title":"Cycle","type":"object"}},"title":"write_coordinated_axesArguments"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"definitionHash":"83b811091b1cbc527d6d785c285a3583df1b7bf67879a2533e5e3eee714b1c3b","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T10:47:03.165Z","metadataTrust":"untrusted"},{"serverName":"com.scriptcompiler/scriptcompiler","endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","name":"write_points","title":"Write points","description":"Replace a time range on one axis with a described motion (sections, the same as play_motion) or with exact points. With sections the motion starts at from_ms and replaces what was there until it ends. With actions the points keep their own times, or are moved so the first one lands on from_ms. The motion is fitted to 400 units per second like the Speed Limiter unless fit_to_device_speed is false. Lands in the editor at once as one Undo step. To add, move or delete single points without replacing a range, use edit_points.","inputSchema":{"type":"object","properties":{"editor_code":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"The editor code the user reads from the editor's AI panel under Your own AI, for example K7P4QX. Leave it out when connected with the account address.","title":"Editor Code"},"axis":{"default":"stroke","description":"Axis. stroke is the main up and down axis.","enum":["stroke","surge","sway","twist","roll","pitch","vibrate"],"title":"Axis","type":"string"},"from_ms":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Start of the time range in milliseconds on the video timeline.","title":"From Ms"},"sections":{"anyOf":[{"items":{"$ref":"#/$defs/Section"},"maxItems":200,"type":"array"},{"type":"null"}],"default":null,"description":"The motion as consecutive sections.","title":"Sections"},"actions":{"anyOf":[{"items":{"$ref":"#/$defs/Action"},"maxItems":10000,"type":"array"},{"type":"null"}],"default":null,"description":"Exact points.","title":"Actions"},"repeat":{"default":1,"maximum":100,"minimum":1,"title":"Repeat","type":"integer"},"fit_to_device_speed":{"default":true,"title":"Fit To Device Speed","type":"boolean"}},"$defs":{"Action":{"description":"One funscript point.","properties":{"at":{"description":"Time in milliseconds.","minimum":0,"title":"At","type":"number"},"pos":{"description":"Position 0-100.","maximum":100,"minimum":0,"title":"Pos","type":"number"}},"required":["at","pos"],"title":"Action","type":"object"},"Section":{"description":"One stretch of motion. Fields ending in _end ramp linearly from the\nsection's start value to that value by the section's end.","properties":{"duration_seconds":{"description":"Length of this section in seconds.","exclusiveMinimum":0,"maximum":3600,"title":"Duration Seconds","type":"number"},"kind":{"default":"strokes","description":"strokes = repeated up-down strokes; hold = stay still at one position.","enum":["strokes","hold"],"title":"Kind","type":"string"},"strokes_per_minute":{"default":60,"description":"Tempo at the section start. One stroke is a full down-up-down cycle. Slow 20-40, medium 50-90, fast 100-160, very fast 170+.","maximum":300,"minimum":1,"title":"Strokes Per Minute","type":"number"},"strokes_per_minute_end":{"anyOf":[{"maximum":300,"minimum":1,"type":"number"},{"type":"null"}],"default":null,"description":"Tempo at the section end, to speed up or slow down gradually.","title":"Strokes Per Minute End"},"bottom":{"default":0,"description":"Lowest position of each stroke (0 = bottom of travel).","maximum":100,"minimum":0,"title":"Bottom","type":"number"},"top":{"default":100,"description":"Highest position of each stroke (100 = top of travel).","maximum":100,"minimum":0,"title":"Top","type":"number"},"bottom_end":{"anyOf":[{"maximum":100,"minimum":0,"type":"number"},{"type":"null"}],"default":null,"description":"Lowest position at the section end.","title":"Bottom End"},"top_end":{"anyOf":[{"maximum":100,"minimum":0,"type":"number"},{"type":"null"}],"default":null,"description":"Highest position at the section end.","title":"Top End"},"curve":{"default":"snap","description":"Stroke shape: snap (linear, crisp), ease (smooth), settle (lingers low), hold-peak (pauses briefly at the top), rise (slow rise, quick drop).","enum":["snap","ease","settle","hold-peak","rise"],"title":"Curve","type":"string"},"variation":{"default":0,"description":"Random variation in tempo and depth for a less mechanical feel. 0 = exact, 0.2-0.4 = natural.","maximum":1,"minimum":0,"title":"Variation","type":"number"},"position":{"anyOf":[{"maximum":100,"minimum":0,"type":"number"},{"type":"null"}],"default":null,"description":"Hold sections only: the position to hold. Omit to hold where the motion stopped.","title":"Position"}},"required":["duration_seconds"],"title":"Section","type":"object"}},"title":"write_pointsArguments"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"definitionHash":"622af15278791d04f0e7977ea520efaabaf9c666edda298d136621809b1a13a9","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T10:47:03.165Z","metadataTrust":"untrusted"}],"endpoints":[{"endpointFingerprint":"269cb9b83cf0e185ceba0b1e0ae112f678f8a6cbc995234e884814bd1a8cf2be","protocol":"streamable-http","status":"auth-required","toolCount":0,"observedAt":"2026-10-24T12:46:11.617Z"},{"endpointFingerprint":"efa55223d74c74c6d229a889bbbb3aaca243e751e9c856bfcce6533144aff639","protocol":"streamable-http","status":"indexed","toolCount":16,"observedAt":"2026-10-30T10:47:03.165Z"}],"authentication":"required"},"connectionConfigurations":{"status":"ready","authentication":"not embedded","clients":{"Claude Desktop":{"mcpServers":{"com.scriptcompiler/scriptcompiler":{"url":"https://mcp.scriptcompiler.com/account/mcp"}}},"Cursor":{"mcpServers":{"com.scriptcompiler/scriptcompiler":{"url":"https://mcp.scriptcompiler.com/account/mcp"}}},"VS Code":{"servers":{"com.scriptcompiler/scriptcompiler":{"type":"http","url":"https://mcp.scriptcompiler.com/account/mcp"}}}}},"resourceType":"mcp-server","callable":true,"runtime":{"callable":true,"protocols":["mcp"]},"interfaces":[{"protocol":"mcp","transport":"streamable-http","url":"https://mcp.scriptcompiler.com/account/mcp"},{"protocol":"mcp","transport":"streamable-http","url":"https://mcp.scriptcompiler.com/mcp"}],"profile":{"apiVersion":"1","schemaVersion":"1","id":"mcp-server:com.scriptcompiler%2Fscriptcompiler","resourceType":"mcp-server","canonicalUrl":"https://www.agentsjunction.com/api/v1/servers/com.scriptcompiler%2Fscriptcompiler","name":"com.scriptcompiler/scriptcompiler","description":"Create motion and play it on The Handy, Autoblow, VacuGlide, Kiiroo, OSSM and Lovense toys.","interfaces":[{"protocol":"mcp","transport":"streamable-http","url":"https://mcp.scriptcompiler.com/account/mcp"},{"protocol":"mcp","transport":"streamable-http","url":"https://mcp.scriptcompiler.com/mcp"}],"capabilities":[],"identity":{"source":"official-registry","websiteUrl":"https://scriptcompiler.com","repositoryUrl":null,"version":"1.0.0"},"verification":{"state":"official","confidence":100},"operations":{"resourceType":"mcp-server","name":"com.scriptcompiler/scriptcompiler","status":"degraded","lastCheckedAt":"2026-11-03T17:15:52.481Z","lastSuccessfulCheck":null,"latencyMs":262,"consecutiveFailures":64,"isStale":false,"checks":{"endpointReachable":true,"protocolValid":false,"agentCardValid":null,"mcpHandshakeValid":false},"lastSeen":null,"lastSuccessfulInteraction":null,"lastHealthCheck":"2026-11-03T17:15:52.481Z","source":{"type":"health-check","url":null},"observedAt":"2026-11-03T17:15:52.481Z"},"security":null,"timestamps":{"createdAt":"2026-10-22T09:00:51.647Z","updatedAt":"2026-10-22T09:00:51.647Z","observedAt":"2026-11-03T17:15:52.481Z"},"compatibility":{"serverVersion":"1.0.0","protocolVersions":[{"protocol":"mcp","version":null}]}}}}