MineMCP
An MCP server implementation bridging AI agents and Minecraft.
Quick challenge
How far can you run before the mobs catch you?
Minecraft check
Confirm your run
Complete the quick check to get your code.
MineMCP
MineMCP
A Minecraft Paper plugin that implements the Model Context Protocol (MCP) server, enabling AI agents to control and monitor a Minecraft 1.21 server via HTTP.
🛠️ Available Tools
World Manipulation
- `pose_block` - Place a block at specific coordinates - `break_block` - Break a block at specific coordinates - `fill_block` - Fill a region with blocks
Command Execution
- `execute_command` - Execute any Minecraft command with output capture
File System
- `read_file` - Read text files from the server - `write_file` - Write text files to the server - `read_file_base64` - Read binary files as Base64 - `write_file_base64` - Write binary files from Base64 - `list_directory` - List directory contents
Server Information
- `list_plugins` - Get all installed plugins - `get_logs` - Retrieve recent server logs - `get_online_players` - List all online players - `get_player` - Get detailed information about a specific player (health, inventory, location, effects, etc.)
📋 Requirements
- Purpur or higher - Purpur server - Purpur or Purpur server software (Spigot may work but not officially supported)
🚀 Installation
Download Pre-built JAR
1. Download the latest release from the Releases page 2. Place `MineMCP-1.0.0-all.jar` in your server's `plugins/` folder 3. Start/restart your server 4. Configure the token in `plugins/MineMCP/config.yml`
⚙️ Configuration
After the first run, edit `plugins/MineMCP/config.yml`:
```yaml server: port: 3000 token: "your-secret-token-here" # Change this to a secure random token! ```
Important: Always change the default token for security!
Generating a Secure Token
```bash
Linux/macOS
openssl rand -hex 32
Or use any password generator to create a strong token
```
🔌 Usage
Starting the Server
1. Start your Minecraft server with MineMCP installed 2. The MCP server will automatically start on port 3000 (configurable) 3. Check the console for: `[MineMCP] MCP server started on port 3000`
Connecting with an MCP Client
Using VS Code with MCP Extension
Create or edit `.vscode/mcp.json` in your project:
```json { "mcpServers": { "minecraft": { "url": "http://localhost:3000/sse?token=your-secret-token-here" } } } ```
📚 API Examples
Execute a Command
```json { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "execute_command", "arguments": { "command": "time set day" } } } ```
Place a Block
```json { "jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": { "name": "pose_block", "arguments": { "world": "world", "x": 100, "y": 64, "z": 200, "material": "DIAMOND_BLOCK" } } } ```
Get Player Information
```json { "jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": { "name": "get_player", "arguments": { "player": "PlayerName", ... } } } ```
🔒 Security Considerations
1. File System Access: Never commit your token to version control 2. File System Access: By default, the server binds to `0.0.0.0` (all interfaces) 3. File System Access: Restrict port 3000 access to trusted IPs only 4. File System Access: Tools have access to the entire server directory - use with caution
🤝 Contributing
Contributions are welcome! Please follow these steps:
1. Fork the repository 2. Create a feature branch (`git checkout -b feature/amazing-feature`) 3. Commit your changes (`git commit -m 'Add amazing feature'`) 4. Push to the branch (`git push origin feature/amazing-feature`) 5. Open a Pull Request
Adding a New Tool
1. Create a new class extending `McpTool` in `src/main/java/me/axeno/minemcp/tools/impl/` 2. Implement the required methods (`getSchema()` and `execute()`) 3. Register the tool in `ToolHandler.java` constructor
Example:
```java public class MyTool extends McpTool { public MyTool() { super("my_tool", "Description of my tool"); }
@Override public ObjectNode getSchema() { ObjectNode schema = mapper.createObjectNode(); schema.put("type", "object"); // Define your schema... return schema; }
@Override public ObjectNode execute(JsonNode args) throws Exception { CompletableFuture<String> future = new CompletableFuture<>();
Bukkit.getScheduler().runTask(MineMCP.getInstance(), () -> { try { // Your Bukkit operations here future.complete("Success!"); } catch (Exception e) { future.completeExceptionally(e); } });
String result = future.get(10, TimeUnit.SECONDS); return createTextResult(result); } } ```
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
📞 Support
- Issues: Issues
---
Made with ❤️ for the Minecraft and AI communities