diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/CobblemonCommands.kt b/common/src/main/kotlin/com/cobblemon/mod/common/CobblemonCommands.kt
index f649dc0a2314f395d13622b0ca4185c498d24c4f..d1deadc0cf3134fac2fafc4bc77964ab3698f803 100644
--- a/common/src/main/kotlin/com/cobblemon/mod/common/CobblemonCommands.kt
+++ b/common/src/main/kotlin/com/cobblemon/mod/common/CobblemonCommands.kt
@@ -56,6 +56,7 @@ object CobblemonCommands {
         AbandonMultiTeam.register(dispatcher)
         FreezePokemonCommand.register(dispatcher)
         ApplyPlayerTextureCommand.register(dispatcher)
+        RunMolangScriptCommand.register(dispatcher)
 
         // Possibly lock down registration if and only if under dev environment or running in an environment
         // with a certain system environment variable set
diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/api/permission/CobblemonPermissions.kt b/common/src/main/kotlin/com/cobblemon/mod/common/api/permission/CobblemonPermissions.kt
index 10dfe6f6370af13de5082157cb18940f26790f12..db538f8b008c9e8b70ca6b2be22a92c038520ef4 100644
--- a/common/src/main/kotlin/com/cobblemon/mod/common/api/permission/CobblemonPermissions.kt
+++ b/common/src/main/kotlin/com/cobblemon/mod/common/api/permission/CobblemonPermissions.kt
@@ -82,6 +82,8 @@ object CobblemonPermissions {
 
     val ABANDON_MULTITEAM = this.create("${COMMAND_PREFIX}abandonmultiteam", PermissionLevel.NONE)
 
+    val RUN_MOLANG_SCRIPT = this.create("${COMMAND_PREFIX}runmolangscript", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
+
     fun all(): Iterable<Permission> = this.permissions
 
     private fun create(node: String, level: PermissionLevel): Permission {
diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/command/RunMolangScriptCommand.kt b/common/src/main/kotlin/com/cobblemon/mod/common/command/RunMolangScriptCommand.kt
new file mode 100644
index 0000000000000000000000000000000000000000..cd30543179b718c10358777b6f2c2ffac4eda896
--- /dev/null
+++ b/common/src/main/kotlin/com/cobblemon/mod/common/command/RunMolangScriptCommand.kt
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2023 Cobblemon Contributors
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/.
+ */
+
+package com.cobblemon.mod.common.command
+
+import com.bedrockk.molang.runtime.MoLangRuntime
+import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
+import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
+import com.cobblemon.mod.common.api.permission.CobblemonPermissions
+import com.cobblemon.mod.common.api.scripting.CobblemonScripts
+import com.cobblemon.mod.common.entity.npc.NPCEntity
+import com.cobblemon.mod.common.util.permission
+import com.cobblemon.mod.common.util.player
+import com.cobblemon.mod.common.util.resourceLocation
+import com.cobblemon.mod.common.util.uuid
+import com.cobblemon.mod.common.util.withQueryValue
+import com.mojang.brigadier.Command
+import com.mojang.brigadier.CommandDispatcher
+import com.mojang.brigadier.arguments.StringArgumentType
+import com.mojang.brigadier.context.CommandContext
+import java.util.UUID
+import net.minecraft.commands.CommandSourceStack
+import net.minecraft.commands.Commands.argument
+import net.minecraft.commands.Commands.literal
+import net.minecraft.commands.arguments.EntityArgument
+import net.minecraft.commands.arguments.ResourceLocationArgument
+import net.minecraft.resources.ResourceLocation
+import net.minecraft.server.level.ServerPlayer
+
+object RunMolangScriptCommand {
+    private const val NAME = "runmolangscript"
+    private const val SCRIPT = "script"
+    private const val PLAYER = "player"
+    private const val NPC = "npc"
+    private const val POKEMON = "pokemon"
+
+    fun register(dispatcher : CommandDispatcher<CommandSourceStack>) {
+        dispatcher.register(literal(NAME)
+            .permission(CobblemonPermissions.RUN_MOLANG_SCRIPT)
+            .then(
+                argument(SCRIPT, ResourceLocationArgument.id())
+                .executes { execute(it, it.resourceLocation(SCRIPT), null, null, null) }
+                .then(argument(PLAYER, EntityArgument.player())
+                    .executes { execute(it, it.resourceLocation(SCRIPT), it.player(PLAYER), null, null) }
+                    .then(argument(NPC, StringArgumentType.string())
+                        .executes { execute(it, it.resourceLocation(SCRIPT), it.player(PLAYER), it.uuid(NPC), null) }
+                        .then(argument(POKEMON, StringArgumentType.string())
+                            .executes { execute(it, it.resourceLocation(SCRIPT), it.player(PLAYER), it.uuid(NPC), it.uuid(POKEMON)) }
+                        )
+                    )
+                    .then(argument(POKEMON, StringArgumentType.string())
+                        .executes { execute(it, it.resourceLocation(SCRIPT), it.player(PLAYER), null, it.uuid(POKEMON)) }
+                    )
+                )
+                .then(argument(NPC, StringArgumentType.string())
+                    .executes { execute(it, it.resourceLocation(SCRIPT), null, it.uuid(NPC), null) }
+                    .then(argument(POKEMON, StringArgumentType.string())
+                        .executes { execute(it, it.resourceLocation(SCRIPT), null, it.uuid(NPC), it.uuid(POKEMON)) }
+                    )
+                )
+                .then(argument(POKEMON, StringArgumentType.string())
+                    .executes { execute(it, it.resourceLocation(SCRIPT), null, null, it.uuid(POKEMON)) }
+                )
+            )
+        )
+    }
+
+    private fun execute(context: CommandContext<CommandSourceStack>, scriptId: ResourceLocation, player: ServerPlayer?, npcId: UUID?, pokemonId: UUID? = null): Int {
+        try {
+            val runtime = MoLangRuntime().setup()
+            val npc = npcId?.let { context.source.level.getEntity(it) as? NPCEntity }
+            val pokemon = pokemonId?.let { context.source.level.getEntity(it) as? NPCEntity }
+
+            npc?.let { runtime.withQueryValue("npc", npc.struct) }
+            pokemon?.let { runtime.withQueryValue("pokemon", pokemon.struct) }
+            player?.let { runtime.withQueryValue("player", player.asMoLangValue()) }
+
+            CobblemonScripts.run(scriptId, runtime)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return Command.SINGLE_SUCCESS
+    }
+}
\ No newline at end of file
diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/util/CommandContextExtensions.kt b/common/src/main/kotlin/com/cobblemon/mod/common/util/CommandContextExtensions.kt
index 095a86efd413f66693b0cf35c88792fdede13a58..d60c9c59d15563cb0ee9622b4f2690b2e98bc332 100644
--- a/common/src/main/kotlin/com/cobblemon/mod/common/util/CommandContextExtensions.kt
+++ b/common/src/main/kotlin/com/cobblemon/mod/common/util/CommandContextExtensions.kt
@@ -11,5 +11,9 @@ package com.cobblemon.mod.common.util
 import com.mojang.brigadier.context.CommandContext
 import net.minecraft.commands.CommandSourceStack
 import net.minecraft.commands.arguments.EntityArgument
+import net.minecraft.commands.arguments.ResourceLocationArgument
 
-fun CommandContext<CommandSourceStack>.player(argumentName: String = "player") = EntityArgument.getPlayer(this, argumentName)
\ No newline at end of file
+fun CommandContext<CommandSourceStack>.player(argumentName: String = "player") = EntityArgument.getPlayer(this, argumentName)
+fun CommandContext<CommandSourceStack>.string(argumentName: String) = this.getArgument(argumentName, String::class.java)
+fun CommandContext<CommandSourceStack>.uuid(argumentName: String) = this.getArgument(argumentName, String::class.java).asUUID
+fun CommandContext<CommandSourceStack>.resourceLocation(argumentName: String) = ResourceLocationArgument.getId(this, argumentName)
\ No newline at end of file
diff --git a/deps/local/com/bedrockk/molang/1.1.18/molang-1.1.18.jar b/deps/local/com/bedrockk/molang/1.1.18/molang-1.1.18.jar
new file mode 100644
index 0000000000000000000000000000000000000000..1968153bfb6f368e83bcd7aa19a90cba5d0483ef
Binary files /dev/null and b/deps/local/com/bedrockk/molang/1.1.18/molang-1.1.18.jar differ
diff --git a/deps/local/com/bedrockk/molang/1.1.18/molang-1.1.18.pom b/deps/local/com/bedrockk/molang/1.1.18/molang-1.1.18.pom
new file mode 100644
index 0000000000000000000000000000000000000000..985acad6d839184a9e4739d47fa5c3e9bbe00213
--- /dev/null
+++ b/deps/local/com/bedrockk/molang/1.1.18/molang-1.1.18.pom
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>local.com.bedrockk</groupId>
+    <artifactId>molang</artifactId>
+    <version>1.1.18</version>
+</project>
\ No newline at end of file
diff --git a/deps/local/com/bedrockk/molang/maven-metadata-local.xml b/deps/local/com/bedrockk/molang/maven-metadata-local.xml
index 23ff70989bc751241eee9f0f44f38144b896d23b..f2d6ba7ef5c8d7c2103e20d91f76827f4ff8d366 100644
--- a/deps/local/com/bedrockk/molang/maven-metadata-local.xml
+++ b/deps/local/com/bedrockk/molang/maven-metadata-local.xml
@@ -3,10 +3,10 @@
   <groupId>local.com.bedrockk</groupId>
   <artifactId>molang</artifactId>
   <versioning>
-    <release>1.1.16</release>
+    <release>1.1.18</release>
     <versions>
-      <version>1.1.16</version>
+      <version>1.1.18</version>
     </versions>
-    <lastUpdated>20231949390002</lastUpdated>
+    <lastUpdated>20231949390005</lastUpdated>
   </versioning>
 </metadata>
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index af8f82bf986030f8ce0ac80f6077fea94676a5eb..9db3a3b37c0cae3b1fea71ee4bfe887a8c534715 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -13,7 +13,7 @@ loom = "1.7-SNAPSHOT"
 architectury-plugin = "3.4-SNAPSHOT"
 
 # Common
-molang = "1.1.16"
+molang = "1.1.18"
 graal = "22.3.0"
 icu4j = "71.1"
 jei-api = "19.8.2.99"