diff --git a/plugin/build.gradle b/plugin/build.gradle
index 7cbf95f..ac8ee3d 100644
--- a/plugin/build.gradle
+++ b/plugin/build.gradle
@@ -30,10 +30,28 @@ dependencies {
     implementation project(":api")
 }
 
+ext {
+    gitBranch = System.getenv('GIT_BRANCH') ?: ''
+    gitCommitHash = System.getenv('GIT_COMMIT') ?: ''
+    buildId = System.getenv('BUILD_ID') ?: ''
+}
+
 shadowJar {
     archivesBaseName = "ZNPCsPlus"
     archiveClassifier.set ""
 
+    manifest {
+        if (gitBranch?.trim()) {
+            attributes('Git-Branch': gitBranch)
+        }
+        if (gitCommitHash?.trim()) {
+            attributes('Git-Commit': gitCommitHash)
+        }
+        if (buildId?.trim()) {
+            attributes('Build-Id': buildId)
+        }
+    }
+
     relocate "org.objectweb.asm", "lol.pyr.znpcsplus.libraries.asm"
     relocate "me.lucko.jarrelocator", "lol.pyr.znpcsplus.libraries.jarrelocator"
 
diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java
index 2a0d64f..2a12c2d 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java
@@ -342,6 +342,7 @@ public class ZNpcsPlus {
                         .addSubcommand("delete", new ActionDeleteCommand(npcRegistry))
                         .addSubcommand("edit", new ActionEditCommand(npcRegistry, actionRegistry))
                         .addSubcommand("list", new ActionListCommand(npcRegistry)))
+                .addSubcommand("version", new VersionCommand(this))
         );
     }
 
diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/commands/VersionCommand.java b/plugin/src/main/java/lol/pyr/znpcsplus/commands/VersionCommand.java
new file mode 100644
index 0000000..f59bf17
--- /dev/null
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/commands/VersionCommand.java
@@ -0,0 +1,64 @@
+package lol.pyr.znpcsplus.commands;
+
+import lol.pyr.director.adventure.command.CommandContext;
+import lol.pyr.director.adventure.command.CommandHandler;
+import lol.pyr.director.common.command.CommandExecutionException;
+import lol.pyr.znpcsplus.ZNpcsPlus;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.event.ClickEvent;
+import net.kyori.adventure.text.format.NamedTextColor;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+
+public class VersionCommand implements CommandHandler {
+
+    private final String pluginVersion;
+    private final String gitBranch;
+    private final String gitCommitHash;
+    private final String buildId;
+
+    public VersionCommand(ZNpcsPlus plugin) {
+        pluginVersion = plugin.getDescription().getVersion();
+        String gitBranch = "";
+        String gitCommitHash = "";
+        String buildId = "";
+        try {
+            URL jarUrl = getClass().getProtectionDomain().getCodeSource().getLocation();
+            JarFile jarFile = new JarFile(jarUrl.toURI().getPath());
+            Attributes attributes = jarFile.getManifest().getMainAttributes();
+            gitBranch = attributes.getValue("Git-Branch");
+            gitCommitHash = attributes.getValue("Git-Commit-Hash");
+            buildId = attributes.getValue("Build-Id");
+        } catch (IOException | URISyntaxException e) {
+            e.printStackTrace();
+        }
+        this.gitBranch = gitBranch;
+        this.gitCommitHash = gitCommitHash;
+        this.buildId = buildId;
+    }
+
+    @Override
+    public void run(CommandContext context) throws CommandExecutionException {
+
+        StringBuilder versionBuilder = new StringBuilder("This server is running ZNPCsPlus version ").append(pluginVersion);
+        if (gitBranch != null && !gitBranch.isEmpty()) {
+            versionBuilder.append("-").append(gitBranch);
+        }
+        if (gitCommitHash != null && !gitCommitHash.isEmpty()) {
+            versionBuilder.append("@").append(gitCommitHash);
+        }
+        if (buildId != null && !buildId.isEmpty()) {
+            versionBuilder.append(" (Build #").append(buildId).append(")");
+        }
+
+        String version = versionBuilder.toString();
+
+        context.send(Component.text(version, NamedTextColor.GREEN)
+                .hoverEvent(Component.text("Click to copy version to clipboard"))
+                .clickEvent(ClickEvent.copyToClipboard(version)));
+    }
+}