Public log

@weppy/roblox-mcp

MCP (Model Context Protocol) server for Roblox Studio integration - enables AI coding agents to interact with Roblox Studio in real-time

npm · fingerprint 67c57798074e805ff7279401 · repository · RSS

25tools
2recorded versions
45dtracked
unchanged 12d

What changed

Changed between 4 September 2026 and 5 October 2026 (first seen 2026-10-05 14:20 UTC)

2 descriptions rewritten.

--- pinned/manage_studio
+++ observed/manage_studio
  {
-   "description": "Control Roblox Studio state for playtest lifecycle, automated test runs, and editor view/rendering QA workflows. Use it for state-changing playtest controls and Studio session-level View settings such as UI preview; it does not edit game UI objects or their properties.\n",
+   "description": "Prepare Playtest values on Basic, and control Roblox Studio playtest lifecycle, automated test runs, runtime values, and editor view/rendering QA workflows on Pro.\n",
    "inputSchema": {
      "properties": {
        "action": {
-         "description": "Studio editor action. [PRO]: toggle_ui_preview (toggle StarterGui UI rendering in Edit mode through the Studio UI preview setting), test_profile_get/set/reset (inspect or request Player Emulator test profile state), experience_language_get/set (observe or request the in-experience language), play_start (start Play or Run mode), play_stop (stop active playtest), play_pause (pause active playtest), play_resume (resume paused playtest), play_status (get current playtest state), test_session_start/status/stop (run, inspect, or cancel a structured Play-default test session), run_test (explicit raw_luau opt-in that injects a test script and preserves the legacy report path).\n",
+         "description": "Studio editor action. [BASIC]: playtest_prepare (read Place-scoped readiness, profiles, and last verified catalog), playtest_binding_candidates (read actual Edit selection or Play runtime value candidates), playtest_profile_save (create, update, delete, or copy a local Playtest value profile). [PRO]: playtest_adapter_plan/apply (review and apply owned Test Adapter source), toggle_ui_preview, test_profile_get/set/reset, experience_language_get/set, play_start/stop/pause/resume/status, test_session_start/status/stop, playtest_control_get/apply/reset, run_test.\n",
          "enum": [
            "toggle_ui_preview",
            "test_profile_get",
+           "playtest_control_get",
+           "playtest_prepare",
+           "playtest_binding_candidates",
+           "playtest_profile_save",
+           "playtest_adapter_plan",
+           "playtest_adapter_apply",
+           "playtest_source_open",
+           "playtest_control_apply",
+           "playtest_control_reset",
            "test_session_status",
            "test_session_stop",
            "run_test"
+       "adapterConstraints": {
+         "additionalProperties": false,
+         "description": "Optional numeric editor constraints. Used by create and update adapter plans.",
+         "properties": {
+           "maximum": {
+             "type": "number"
+           },
+           "minimum": {
+             "type": "number"
+           },
+           "step": {
+             "type": "number"
+           }
+         },
+         "type": "object"
+       },
+       "adapterEnumValues": {
+         "description": "Allowed enum values. Used by create and update adapter plans.",
+         "items": {},
+         "maxItems": 100,
+         "minItems": 1,
+         "type": "array"
+       },
+       "adapterId": {
+         "description": "Stable managed Test Adapter ID and ModuleScript name. Used by: playtest_adapter_plan.",
+         "type": "string"
+       },
+       "adapterMethodStyle": {
+         "description": "Explicit dot or colon calling convention for the existing module API. Used by create and update adapter plans.",
+         "enum": [
+           "dot",
+           "colon"
+         ],
+         "type": "string"
+       },
+       "adapterModulePath": {
+         "additionalProperties": false,
+         "description": "Existing server-visible ModuleScript that owns the internal value. Used by create and update adapter plans.",
+         "properties": {
+           "root": {
+             "enum": [
+               "PlayerGui",
+               "Character",
+               "Workspace",
+               "ReplicatedStorage",
+               "ServerStorage",
+               "ServerScriptService",
+               "Players"
+             ],
+             "type": "string"
+           },
+           "segments": {
+             "items": {
+               "maxLength": 4096,
+               "minLength": 1,
+               "type": "string"
+             },
+             "maxItems": 64,
+             "type": "array"
+           }
+         },
+         "required": [
+           "root",
+           "segments"
+         ],
+         "type": "object"
+       },
+       "adapterOperation": {
+         "description": "Reviewed managed adapter operation. Used by: playtest_adapter_plan.",
+         "enum": [
+           "create",
+           "update",
+           "remove_entry",
+           "remove_adapter"
+         ],
+         "type": "string"
+       },
+       "adapterReadMethod": {
+         "description": "Existing module getter name. Used by create and update adapter plans.",
+         "type": "string"
+       },
+       "adapterRegistrationGroup": {
+         "description": "Dashboard group for the adapter value. Used by create and update adapter plans.",
+         "maxLength": 512,
+         "minLength": 1,
+         "type": "string"
+       },
+       "adapterRegistrationId": {
+         "description": "Stable Dashboard entry ID. Used by create, update, and remove_entry adapter plans.",
+         "type": "string"
+       },
+       "adapterRegistrationKind": {
+         "description": "Observation or reversible control intent. Used by create and update adapter plans.",
+         "enum": [
+           "watch",
+           "control"
+         ],
+         "type": "string"
+       },
+       "adapterRegistrationLabel": {
+         "description": "User-facing adapter value label. Used by create and update adapter plans.",
+         "maxLength": 512,
+         "minLength": 1,
+         "type": "string"
+       },
+       "adapterStudioOnly": {
+         "description": "Keep the managed Test Adapter unavailable outside Roblox Studio. Defaults to true and may be false only when the user explicitly asks to omit the RunService:IsStudio() check. Used by create and update adapter plans.",
+         "type": "boolean"
+       },
+       "adapterValueType": {
+         "description": "JSON-compatible adapter value type. Used by create and update adapter plans.",
+         "enum": [
+           "string",
+           "number",
+           "boolean",
+           "enum"
+         ],
+         "type": "string"
+       },
+       "adapterWriteMethod": {
+         "description": "Existing module setter name for a reversible control. Used by create and update adapter plans.",
+         "type": "string"
+       },
+       "candidatePath": {
+         "additionalProperties": false,
+         "description": "Bounded Play runtime path to inspect. Used by: playtest_binding_candidates.",
+         "properties": {
+           "root": {
+             "enum": [
+               "PlayerGui",
+               "Character",
+               "Workspace",
+               "ReplicatedStorage",
+               "ServerStorage",
+               "ServerScriptService",
+               "Players"
+             ],
+             "type": "string"
+           },
+           "segments": {
+             "items": {
+               "maxLength": 4096,
+               "minLength": 1,
+               "type": "string"
+             },
+             "maxItems": 64,
+             "type": "array"
+           }
+         },
+         "required": [
+           "root",
+           "segments"
+         ],
+         "type": "object"
+       },
+       "candidateSource": {
+         "description": "Read candidates from the current Edit selection or a bounded Play runtime path. Used by: playtest_binding_candidates.",
+         "enum": [
+           "selection",
+           "runtime"
+         ],
+         "type": "string"
+       },
+       "candidateTarget": {
+         "additionalProperties": false,
+         "description": "Server or client runtime role for a Play-only candidate query. Used by: playtest_binding_candidates.",
+         "properties": {
+           "clientId": {
+             "enum": [
+               "client-1"
+             ],
+             "type": "string"
+           },
+           "role": {
+             "enum": [
+               "server",
+               "client"
+             ],
+             "type": "string"
+           }
+         },
+         "required": [
+           "role"
+         ],
+         "type": "object"
+       },
        "clientId": {
          "description": "Optional Studio target selector. Routes this call to the exact connected WEPPY Plugin client. Takes precedence over targetAlias and placeId.",
          "type": "string"
+       "controlProfile": {
+         "additionalProperties": false,
+         "description": "Validated local Playtest value profile draft. New v3 controls use applyOnStart=false without a placeholder value until the user explicitly saves one. Used by: playtest_profile_save.",
+         "properties": {
+           "controls": {
+             "items": {
+               "additionalProperties": true,
+               "type": "object"
+             },
+             "maxItems": 128,
+             "type": "array"
+           },
+           "id": {
+             "maxLength": 128,
+             "minLength": 1,
+             "type": "string"
+           },
+           "name": {
+             "maxLength": 512,
+             "minLength": 1,
+             "type": "string"
+           },
+           "presentation": {
+             "additionalProperties": {
+               "additionalProperties": true,
+               "type": "object"
+             },
+             "type": "object"
+           },
+           "schemaVersion": {
+             "enum": [
+               1,
+               2,
+               3
+             ],
+             "type": "integer"
+           },
+           "watches": {
+             "items": {
+               "additionalProperties": true,
+               "type": "object"
+             },
+             "maxItems": 128,
+             "type": "array"
+           }
+         },
+         "required": [
+           "schemaVersion",
+           "id",
+           "name",
+           "controls",
+           "watches"
+         ],
+         "type": "object"
+       },
+       "controlProfileId": {
+         "description": "Place-scoped Playtest Control Profile ID. Used by: play_start, test_session_start, playtest_prepare, playtest_profile_save, playtest_control_get.",
+         "maxLength": 128,
+         "minLength": 1,
+         "type": "string"
+       },
+       "controlValues": {
+         "additionalProperties": true,
+         "description": "Binding ID to JSON-compatible requested value. Used by: playtest_control_apply.",
+         "type": "object"
+       },
+       "destinationProfileId": {
+         "description": "New destination profile ID for an explicit copy. Used by: playtest_profile_save.",
+         "maxLength": 128,
+         "minLength": 1,
+         "type": "string"
+       },
+       "destinationProfileName": {
+         "description": "New destination profile name for an explicit copy. Used by: playtest_profile_save.",
+         "maxLength": 512,
+         "minLength": 1,
+         "type": "string"
+       },
        "enabled": {
          "description": "Boolean value to set. Omit to toggle the current value.\nUsed by: toggle_ui_preview (optional).\n",
          "type": "boolean"
+       "expectedRevision": {
+         "description": "Optimistic revision. For playtest_profile_save update/delete, pass the current stored profile revision. For playtest_control_apply, pass the active runtime lease revision.",
+         "minimum": 0,
+         "type": "integer"
+       },
+       "expectedSourceHash": {
+         "description": "Reviewed current source SHA-256 or absent sentinel. Used by: playtest_adapter_apply.",
+         "maxLength": 64,
+         "minLength": 6,
+         "type": "string"
+       },
        "idempotencyKey": {
          "description": "Optional idempotency key scoped to the pinned Studio target and normalized scenario. Used by: test_session_start.",
          "maxLength": 4096,
+       "leaseId": {
+         "description": "Active runtime control lease ID. Used by: playtest_control_get, playtest_control_apply, playtest_control_reset.",
+         "maxLength": 4096,
+         "minLength": 1,
+         "type": "string"
+       },
        "locale": {
          "description": "Normalized locale identifier requested for the active Experience Language. Used by: experience_language_set.",
          "maxLength": 35,
+       "maxResults": {
+         "description": "Maximum candidate fields to return. Used by: playtest_binding_candidates.",
+         "maximum": 100,
+         "minimum": 1,
+         "type": "integer"
+       },
        "mode": {
          "description": "Playtest mode. \"play\" = Play mode (F5, default), \"run\" = Run mode (F8). Used by: play_start, run_test.",
          "enum": [
+       "planToken": {
+         "description": "Unexpired reviewed adapter plan token. Used by: playtest_adapter_apply.",
+         "maxLength": 4096,
+         "minLength": 1,
+         "type": "string"
+       },
+       "productionExclusionReference": {
+         "description": "Optional production project file or configured test Place reference for the exclusion strategy. Used by: playtest_adapter_plan.",
+         "maxLength": 4096,
+         "minLength": 1,
+         "type": "string"
+       },
+       "productionExclusionStrategy": {
+         "description": "Optional artifact-hygiene strategy for excluding the adapter source even when studioOnly protection is enabled. Used by: playtest_adapter_plan.",
+         "enum": [
+           "rojo",
+           "private_test_place"
+         ],
+         "type": "string"
+       },
+       "profileOperation": {
+         "description": "Local profile operation. create/update use controlProfile, delete uses controlProfileId, and copy uses source/destination fields. Used by: playtest_profile_save. Conditional requirements: \"create\" requires `controlProfile`; \"update\" requires `controlProfile`, `expectedRevision`; \"delete\" requires `controlProfileId`, `expectedRevision`; \"copy\" requires `sourceProfileId`, `sourceRevision`, `destinationProfileId`, `destinationProfileName`.",
+         "enum": [
+           "create",
+           "update",
+           "delete",
+           "copy"
+         ],
+         "type": "string"
+       },
        "replayMetadata": {
          "description": "Optional replay-ready metadata attached to this tool call.",
          "properties": {
+       "sourcePlaceId": {
+         "description": "Published source Place ID for an explicit profile copy. Used by: playtest_profile_save.",
+         "type": "number"
+       },
+       "sourcePlaceName": {
+         "description": "Unpublished source Place name in the current project for an explicit profile copy. Used by: playtest_profile_save.",
+         "maxLength": 512,
+         "minLength": 1,
+         "type": "string"
+       },
+       "sourceProfileId": {
+         "description": "Source profile ID for an explicit copy. Used by: playtest_profile_save.",
+         "maxLength": 128,
+         "minLength": 1,
+         "type": "string"
+       },
+       "sourceRevision": {
+         "description": "Expected source profile revision for an explicit copy. Used by: playtest_profile_save.",
+         "minimum": 1,
+         "type": "integer"
+       },
        "stepCursor": {
          "description": "Optional opaque cursor returned by a previous status page. Used by: test_session_status.",
          "maxLength": 4096,
--- pinned/manage_ui
+++ observed/manage_ui
  {
-   "description": "Create / update / verify Roblox in-game UI (ScreenGui / Frame / TextLabel / …). Always start with `design_brief`. For ambiguous input, it inspects Studio context and returns candidate brief patches; Do not dump enum lists at the user. Pass relevant repository evidence in `projectContext`; explicit screen job, visual thesis, forbidden defaults, tokens, and approved assets determine the direction without a built-in subject preset. `design_brief` returns a primary-view-first Design Contract and an advisory Layout Plan with neutral regions, AnchorPoint strategy, and responsive behavior; it is not a hard tree preset or style quota. A calling agent may declare provider-neutral image generation capability through `agentCapabilities`; missing or unavailable capability must use the explicit existing, user-provided, Creator Store, or assetless fallback. Keep the returned `brief_id`, `design_contract`, and `layout_plan` through creation, update, preview, and check. The asset recommendation gate considers user references, project assets, existing UI, and user-approved `manage_assets.search` intent; do not use a recommendation until the user accepts it. After each meaningful create or update, preview the representative primary view and submit a calling-agent critic verdict (`recompose`, `refine`, or `approved`) with `visualReview`. Read `primary_visual_verdict`, `functional_safe`, `responsive_requirement`, `responsive_ready`, `required_dimensions`, and `readiness` separately from mutation success. Responsive evidence blocks readiness only when the Design Contract marks it required. Read `weppy://ui-studio/guide` for the authoring workflow, `weppy://ui-studio/tokens` for optional visual examples, and `weppy://ui-studio/functional-rules` for machine-readable advisory evidence rules. Design Check permits `priority_high` only for observed functional visual failures such as meaningful overlap, unreadable content, invalid geometry, or primary-view occlusion; style-only findings remain medium or low.\n",
+   "description": "Create / update / verify Roblox in-game UI (ScreenGui / Frame / TextLabel / …). Always start with `design_brief`. For ambiguous input, it inspects Studio context and returns candidate brief patches; Do not dump enum lists at the user. An empty StarterGui does not prove runtime UI absence: for an existing-UI review, follow `runtime_review_required`, collect a structured Play Client PlayerGui snapshot, and pass its saved `runtimeEvidenceRef`. Pass relevant repository evidence in `projectContext`; explicit screen job, visual thesis, forbidden defaults, tokens, and approved assets determine the direction without a built-in subject preset. `design_brief` returns a primary-view-first Design Contract and an advisory Layout Plan with neutral regions, AnchorPoint strategy, and responsive behavior; it is not a hard tree preset or style quota. A calling agent may declare provider-neutral image generation capability through `agentCapabilities`; missing or unavailable capability must use the explicit existing, user-provided, Creator Store, or assetless fallback. Keep the returned `brief_id`, `design_contract`, and `layout_plan` through creation, update, preview, and check. The asset recommendation gate considers user references, project assets, existing UI, and user-approved `manage_assets.search` intent; do not use a recommendation until the user accepts it. After each meaningful create or update, preview the representative primary view and submit a calling-agent critic verdict (`recompose`, `refine`, or `approved`) with `visualReview`. Read `primary_visual_verdict`, `functional_safe`, `responsive_requirement`, `responsive_ready`, `required_dimensions`, and `readiness` separately from mutation success. Responsive evidence blocks readiness only when the Design Contract marks it required. Read `weppy://ui-studio/guide` for the authoring workflow, `weppy://ui-studio/tokens` for optional visual examples, and `weppy://ui-studio/functional-rules` for machine-readable advisory evidence rules. Design Check permits `priority_high` only for observed functional visual failures such as meaningful overlap, unreadable content, invalid geometry, or primary-view occlusion; style-only findings remain medium or low.\n",
    "inputSchema": {
      "properties": {
        "action": {
+       "observationMode": {
+         "description": "Selects Edit StarterGui or validated Play Client runtime evidence. runtime requires runtimeEvidenceRef. Used by: check.",
+         "enum": [
+           "edit",
+           "runtime"
+         ],
+         "type": "string"
+       },
        "placeId": {
          "description": "Optional Studio target selector. When multiple Studio clients are connected, route this call to the active client for this Roblox placeId. If no matching active client exists, the call fails instead of falling back to another Place.",
          "type": "number"
+           "required_state_ids": {
+             "description": "Project-owned state identifiers that require separate review evidence before readiness.",
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           },
            "required_states": {
              "items": {
                "type": "string"
+       "runtimeEvidenceRef": {
+         "description": "Reference to one saved structured Playtest snapshot_gui step. The Bridge validates its Place, Studio target, client, and observation identity before use. Used by: design_brief, check.",
+         "properties": {
+           "recordId": {
+             "type": "string"
+           },
+           "stepId": {
+             "type": "string"
+           }
+         },
+         "required": [
+           "recordId",
+           "stepId"
+         ],
+         "type": "object"
+       },
        "targetAlias": {
          "description": "Optional Studio target selector. Routes this call to the connected WEPPY Studio target alias shown in Dashboard/Plugin, such as studio-1. Takes precedence over placeId.",
          "type": "string"

Current tools

Show all 25 tool fingerprints
batch_execute
d5781dc26c4e88bb
execute_luau
7ab774618f180121
manage_animation
ad3a2ae7de0f3919
manage_assets
46b155ae7a4ec4fc
manage_audio
a0a94edc4fcabed1
manage_camera
7dc178f17d3c3493
manage_effects
0722aa251b31035d
manage_lighting
aae4793ffb9ce8b3
manage_logs
49d107df02fc1a95
manage_open_cloud_assets
b50d6bb617bb0e1b
manage_physics
3a57b99a3e4cd7b8
manage_properties
69ccedac2c8113e1
manage_scripts
5ce46ecff5806298
manage_selection
613158864e93ee33
manage_settings
a40a94c40fb99d76
manage_studio
51368ecd273825b0
manage_sync
4196cf7ff7fa812a
manage_terrain
5a2f4acb01de7671
manage_tween
c894edd885c9f00c
manage_ui
07a6021d15b62928
mutate_instances
e8af9fd607e02865
query_instances
c191b205cd0fec8d
spatial_query
94813f2a52777bb3
system_info
4d4272f86d4b4581
workspace_state
c0dab0d6be492bca

Watch this server yourself

If you run this server, put the proxy in front of it. It pins these exact fingerprints on first connect and stops the session if they move.

npx -y mcp-pin@0.2.3 -- <your @weppy/roblox-mcp command>

Or subscribe to this page's RSS feed to be told when it changes.

Badge

mcp-pin status badge for @weppy/roblox-mcp

The badge states one fact about time and nothing else. It never claims a server is safe.

[![mcp-pin](https://mcp-pin.gautamkhosla.com/badge/6506ba3857fe630b.svg)](https://mcp-pin.gautamkhosla.com/servers/6506ba3857fe630b.html)