# ScriptCompiler (remote · mcp.scriptcompiler.com)

Create motion and play it on The Handy, Autoblow, VacuGlide, Kiiroo, OSSM and Lovense toys.

- Trust score: 72/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-04

## Components

- remote · `mcp.scriptcompiler.com`: 38/100, [markdown](https://verifymcp.io/servers/com-scriptcompiler-scriptcompiler/account-mcp.md), [page](https://verifymcp.io/servers/com-scriptcompiler-scriptcompiler/account-mcp)
- remote · `mcp.scriptcompiler.com`: 72/100 (this document), [markdown](https://verifymcp.io/servers/com-scriptcompiler-scriptcompiler/mcp.md), [page](https://verifymcp.io/servers/com-scriptcompiler-scriptcompiler/mcp)

## Channel facts

- Endpoint: `https://mcp.scriptcompiler.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-04.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (clear_points).
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 73/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 3327 tokens (~195/item across 17 items; 16 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 43/100
  - Stability observed for 13 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 92/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 70% of tool parameters carry a description.
  - Structured output schemas are declared (6% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 18 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).
  - Supports UI / widget rendering.

## Install

### How do I install the ScriptCompiler MCP server?

ScriptCompiler is a hosted endpoint at https://mcp.scriptcompiler.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http com-scriptcompiler-scriptcompiler 'https://mcp.scriptcompiler.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "com-scriptcompiler-scriptcompiler": {
      "url": "https://mcp.scriptcompiler.com/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-scriptcompiler-scriptcompiler": {
      "type": "http",
      "url": "https://mcp.scriptcompiler.com/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-scriptcompiler-scriptcompiler]
url = "https://mcp.scriptcompiler.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-scriptcompiler-scriptcompiler": {
      "type": "remote",
      "url": "https://mcp.scriptcompiler.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-scriptcompiler-scriptcompiler --url 'https://mcp.scriptcompiler.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-scriptcompiler-scriptcompiler:
    url: "https://mcp.scriptcompiler.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "com-scriptcompiler-scriptcompiler": {
      "Transport": "http",
      "Url": "https://mcp.scriptcompiler.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-scriptcompiler-scriptcompiler -t streamable-http -u 'https://mcp.scriptcompiler.com/mcp'
```

### Other

```json
{
  "mcpServers": {
    "com-scriptcompiler-scriptcompiler": {
      "type": "http",
      "url": "https://mcp.scriptcompiler.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 72, +1)

No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-02 (score 71, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-31 (score 70, +1)

No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-28 (score 69, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-26 (score 68, +1)

No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-24 (score 67, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-23 (score 66, 0)

- [functional improvement] Stability: unverified → 0.03

### 2026-10-22 (score 66)

First indexed and scored.

## MCP tools (16)

### `create_motion` (~143 tokens)

Create motion

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.

Input parameters:

- `actions`: Exact funscript points, for example from a pasted funscript. Use instead of sections.
- `device` (string): The device the motion is fitted to.
- `repeat` (integer): Play the whole motion this many times in a row.
- `sections`: The motion as consecutive sections. Use this for described motion.
- `title`: Short name for the motion, for example Slow build-up. Used as the funscript title and download file name.

### `export_funscript` (~128 tokens)

Funscript file

The motion as a .funscript file with ScriptCompiler metadata, for the motion card's Download button.

Input parameters:

- `actions`: Exact funscript points, for example from a pasted funscript. Use instead of sections.
- `device` (string): The device the motion is fitted to.
- `repeat` (integer): Play the whole motion this many times in a row.
- `sections`: The motion as consecutive sections. Use this for described motion.
- `title`: Short name for the motion, for example Slow build-up. Used as the funscript title and download file name.

### `play_motion` (~194 tokens)

Play motion

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.

Input parameters:

- `actions`: Exact funscript points, for example from a pasted funscript. Use instead of sections.
- `connection_key` (string, required): 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).
- `device` (string): Which device the key belongs to. bluetooth covers every Bluetooth toy paired on the ToyController phone screen.
- `repeat` (integer): Play the whole motion this many times in a row.
- `sections`: The motion as consecutive sections. Use this for described motion.
- `title`: Short name for the motion, for example Slow build-up. Used as the funscript title and download file name.

### `stop_motion` (~91 tokens)

Stop motion

Stop whatever is playing on the user's device.

Input parameters:

- `connection_key` (string, required): 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).
- `device` (string): Which device the key belongs to. bluetooth covers every Bluetooth toy paired on the ToyController phone screen.

Output parameters:

- `device` (string)
- `stopped` (boolean)

### `read_script` (~127 tokens)

Read script

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.

Input parameters:

- `editor_code`: 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.

### `read_points` (~124 tokens)

Read points

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.

Input parameters:

- `axis` (string, required): Axis. stroke is the main up and down axis.
- `editor_code`: 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.
- `from_ms` (integer, required)
- `to_ms` (integer, required)

### `write_points` (~231 tokens)

Write points

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.

Input parameters:

- `actions`: Exact points.
- `axis` (string): Axis. stroke is the main up and down axis.
- `editor_code`: 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.
- `fit_to_device_speed` (boolean)
- `from_ms`: Start of the time range in milliseconds on the video timeline.
- `repeat` (integer)
- `sections`: The motion as consecutive sections.

### `edit_points` (~209 tokens)

Edit points

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.

Input parameters:

- `add`: Points to put at exact times.
- `axis` (string): Axis. stroke is the main up and down axis.
- `editor_code`: 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.
- `remove_at_ms`: Times in milliseconds of points to delete.
- `replace_within_ms` (integer): How close counts as the same point.

### `clear_points` (~127 tokens)

Clear points

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.

Input parameters:

- `axis`
- `editor_code`: 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.
- `from_ms`: Start of the time range in milliseconds on the video timeline.
- `to_ms`: End of the time range in milliseconds.

### `write_coordinated_axes` (~276 tokens)

Write coordinated axes

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.

Input parameters:

- `axis_specs` (array, required)
- `editor_code`: 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.
- `schedule` (array, required)
- `target_duration_ms`

### `derive_axis` (~194 tokens)

Derive axis

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.

Input parameters:

- `delay_ms` (number)
- `editor_code`: 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.
- `invert` (boolean)
- `method` (string)
- `position_offset` (number)
- `scale` (number)
- `source_axis` (string, required)
- `target_axis` (string, required)
- `target_max` (number)
- `target_min` (number)

### `run_editor_tool` (~219 tokens)

Run editor tool

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.

Input parameters:

- `axis` (string): Axis. stroke is the main up and down axis.
- `editor_code`: 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.
- `from_ms`: Start of the time range in milliseconds on the video timeline.
- `params`: The tool's settings by name.
- `to_ms`: End of the time range in milliseconds.
- `tool` (string, required): Tool id from read_script, for example smoothing.

### `edit_chapters` (~160 tokens)

Edit chapters

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.

Input parameters:

- `action` (string, required)
- `editor_code`: 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.
- `from_ms`: Start of the time range in milliseconds on the video timeline.
- `name`
- `new_name`
- `to_ms`: End of the time range in milliseconds.

### `undo_last_change` (~80 tokens)

Undo last change

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.

Input parameters:

- `editor_code`: 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.

### `control_playback` (~107 tokens)

Control playback

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.

Input parameters:

- `action` (string, required)
- `at_ms`: Start of the time range in milliseconds on the video timeline.
- `editor_code`: 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.

### `look_at_video` (~163 tokens)

Look at video

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.

Input parameters:

- `at_ms`: Start of the time range in milliseconds on the video timeline.
- `count` (integer)
- `editor_code`: 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.
- `from_ms`: Start of the time range in milliseconds on the video timeline.
- `to_ms`: End of the time range in milliseconds.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-scriptcompiler-scriptcompiler/mcp#diagnostics

## Score history

- 2026-11-04: 72
- 2026-11-03: 71
- 2026-11-02: 71
- 2026-11-01: 70
- 2026-10-31: 70
- 2026-10-30: 69
- 2026-10-29: 69
- 2026-10-28: 69
- 2026-10-27: 68
- 2026-10-26: 68
- 2026-10-25: 67
- 2026-10-24: 67
- 2026-10-23: 66
- 2026-10-22: 66

## Common questions

### What is the ScriptCompiler MCP server?

ScriptCompiler is an MCP server listed in the public MCP registry as com.scriptcompiler/scriptcompiler. Create motion and play it on The Handy, Autoblow, VacuGlide, Kiiroo, OSSM and Lovense toys. This page covers its hosted endpoint (https://mcp.scriptcompiler.com/mcp).

### Is the ScriptCompiler MCP server safe to use?

ScriptCompiler scores 72 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the ScriptCompiler MCP server expose?

ScriptCompiler exposes 16 tools: create_motion, export_funscript, play_motion, stop_motion, read_script, and 11 more. Their descriptions and schemas cost roughly 2,573 tokens of context every time the server is loaded.

### Does the ScriptCompiler MCP server require authentication?

No. We connected to ScriptCompiler without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the ScriptCompiler MCP server still maintained?

ScriptCompiler is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://mcp.scriptcompiler.com/mcp
- Website: https://scriptcompiler.com/
- Changelog RSS feed: https://verifymcp.io/servers/com-scriptcompiler-scriptcompiler/mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-scriptcompiler-scriptcompiler/mcp.json
- HTML version of this page: https://verifymcp.io/servers/com-scriptcompiler-scriptcompiler/mcp
