In development

mcbot

Minecraft bots you run rather than rent, for Java and Bedrock. A desktop client, a headless daemon, a hub that manages both, and a proxy for your own client, built on a from-scratch Minecraft protocol stack, where your account credentials stay sealed under your own password.

The site is still in development and not publicly available yet. It will live at mcbot.nick22985.com.

Four pieces

One Rust workspace, run three different ways, plus a proxy beside it

Desktop client
Tauri 2 + React

A daemon with a window attached. It links the same supervisor and worker crates the headless daemon runs, so enrollment, the hub link and the key schedule have exactly one implementation. Ships on Windows, macOS and Linux.

Daemon
Rust, headless

Runs on a VPS, a home server, or inside Kubernetes with no display server at all. A supervisor holds the hub link and spawns one worker process per owner; workers are where bots actually live.

Hub
TanStack Start + Postgres

Where bots are created, assigned to daemons, watched live and driven by hand. A separate realtime process carries socket.io for browsers and a raw websocket server for daemons on a single port, with a Postgres-elected leader so it survives losing a replica.

Java proxy
Rust, local or hosted

Puts your own Minecraft client through mcbot. It runs as a sidecar the desktop app starts, or as a hosted gateway that accepts public traffic while holding no refresh token, credential key or database credential.

What it does

Bot hosting, hands-on control, packet tools and my own protocol stack

Bots you own
Run bots on your own hardware instead of renting them. I offer hosting too, but nothing in the design needs it.
No passwords
You sign in with Microsoft directly. There is no Minecraft or Microsoft password field anywhere in the system, only a sealed refresh token.
Your choice per bot
Attended, always-on self-hosted, or always-on hosted. The key schedule is the same in all three; only how much can be decrypted without you changes.
Own protocol stack
Varints, framing, compression, encryption, NBT, packets, chunks and physics for Java, plus RakNet and NetherNet for Bedrock, with no third-party Minecraft crate.
Java and Bedrock
Java from the pre-netty 1.4 wire to 26.x, with the protocol version as a parameter rather than a compile flag. Bedrock is experimental, over RakNet or NetherNet.
Drive it from a browser
Move, look, sneak, use and attack. A vanilla-layout inventory with drag and drop, server dialogs and Bedrock forms, and the tab list, all live.
Packet tools
A packet log decoded from generated schemas, a field editor to change and resend one, and saved intercept and inject rules with live hit counts.
Bring your own client
The Java proxy runs an ordinary Minecraft client through the same captures, rules and injection, with captures private to the account that made them.
Scenarios
An optional, separately installed runner adds navigation and versioned multi-bot test scenarios with assertions, server diagnostics and side-by-side run comparisons.
MCP for AI agents
A scoped MCP adapter exposes the hub's bot controls to AI agents, calling the same owner-authorized operations the UI does. No tool exists without a hub counterpart.
Organizations
Bots belong to an organization, with per-org entitlements and limits. A daemon I host serves many owners; a daemon you host is assigned nothing but yours.
Discord bot
A Discord bot acts on your behalf through the hub's public API, using a service credential plus a per-user link token.

Protocols

Two editions, three transports, and a lab that tests how far each release gets

Java
Primary
1.4.6 to 26.x

Native TCP, from the pre-netty legacy wire through modern configuration-phase protocols. Packet ids and registries are generated per version from Mojang's own reports.

Bedrock over RakNet
Experimental
UDP

My own RakNet: connection setup, reliability, ordering and splitting. Packet tables come from Mojang's bedrock-protocol-docs, sign-in from the Xbox Live and PlayFab chain.

Bedrock over NetherNet
Experimental, opt-in
WebRTC

HTTP signaling into WebRTC data channels driven by str0m. Opted into per bot, advertised separately, and never silently falls back to RakNet.

The compatibility lab

Roughly ninety releases, each booted from Mojang's own server download. A release claims the highest rung it held, and the first rung that fails ends the climb. A decode failure can be minimised into a byte fixture that replays in the normal test gate with no JVM.

  1. 1Status ping
  2. 2Login
  3. 3Keepalive
  4. 4Chat
  5. 5Movement
  6. 6Inventory
  7. 7World

How it fits together

Daemons dial out and hold the connection open, because a hub that reaches inward only works in a cluster

dials out to the hub, never the other waycalls the hubMinecraft traffic
Telemetry with flow control

The high-volume path, and the only droppable one:

  • • Batched and sequenced, carrying its own drop count
  • • Daemons stop sending past a fixed unacknowledged window
  • • Per-bot flow levels: off, summary, or full
  • • Full is on only while somebody is watching
The crate graph is enforced

A dedicated crate encodes the architecture as tests:

  • • Any crate edge not in the table fails the build
  • • The supervisor links no protocol code
  • • Credential crypto exists in exactly one crate
  • • Nothing may depend on the automation runner
  • • Platform-conditional code lives in one module per crate

Security rules

Enforced in code and tests, not written down as intent

The daemon dials the hub. Always.

Daemons run behind home NAT and on VPS firewalls nobody else controls, so nothing in the hub may open a connection towards one. The wire protocol has no message that asks for it and no field a daemon could advertise an address in.

Owner comes from the session, never a payload.

The hub resolves ownership from the caller's token; nothing a daemon or a request sends can name an owner. Every query touching a bot-scoped table carries an owner predicate in the SQL, and a test enforces the shape.

The supervisor parses no protocol.

The process holding the hub link and every owner's ciphertext links no Minecraft protocol code, so it is never the one decoding bytes from an arbitrary third-party server. A worker, in turn, cannot reach the hub.

Revocation that does not go through me.

What is stored is an OAuth refresh token, sealed under your own password and rotated on every use. You can revoke it from your Microsoft account without changing your password and without my cooperation.

A hosted bot cannot reach my network.

Shared daemons refuse private and loopback server addresses, so a bot running on hardware I host can only be pointed at public Minecraft servers.

Automation is never shipped by default.

The runner is a separate artifact that nothing in the workspace depends on, enforced by the architecture tests. An operator installs it by path and checksum, and the daemon refuses to exec it on a mismatch.

You choose how much can be decrypted

Attended

Only you can decrypt the credential. The bot runs while you are there to unlock it, and nothing on any machine but yours can start it.

Always-on, self-hosted

Your own daemon holds a wrapped key, so your bot keeps running without you. The hosted side still cannot read it.

Always-on, hosted

A daemon I run holds the wrapped key so the bot survives your machine being off. The most convenient option, and the one that trusts me the most. You have to opt in.

Built with

A Rust workspace, a Tauri shell, and a TanStack Start hub

Rust
Tokio
Tauri 2
React 19
TanStack Start
TypeScript
PostgreSQL
Redis
SQLite
Drizzle ORM
better-auth
socket.io
Bun
str0m (WebRTC)
rustls
CodeMirror
MCP
Docker
Kubernetes
Tailwind CSS

Still being built

mcbot is in active development. The hub is not open to sign-ups yet, and Bedrock and the hosted proxy stay marked experimental until the lab and a recorded real-client run both pass.