GroupeZ Docs

Installation

This guide will walk you through adding Sarah to your project and configuring it properly.

Dependencies

Gradle

Add the GroupeZ repository and Sarah dependency to your build.gradle:

repositories {
    mavenCentral()
    maven { url 'https://repo.groupez.dev/releases' }
}

dependencies {
    implementation 'fr.maxlego08.sarah:sarah:1.26'
}

Maven

Add the repository and dependency to your pom.xml:

<repositories>
    <repository>
        <id>groupez</id>
        <url>https://repo.groupez.dev/releases</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>fr.maxlego08.sarah</groupId>
        <artifactId>sarah</artifactId>
        <version>1.26</version>
    </dependency>
</dependencies>

Relocation (Important!)

To avoid conflicts with other plugins using Sarah, you should relocate the dependency.

Gradle with Shadow Plugin

plugins {
    id 'com.github.johnrengelman.shadow' version '8.1.1'
}

shadowJar {
    relocate 'fr.maxlego08.sarah', 'your.package.sarah'
}

Maven with Shade Plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.5.0</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <relocations>
                    <relocation>
                        <pattern>fr.maxlego08.sarah</pattern>
                        <shadedPattern>your.package.sarah</shadedPattern>
                    </relocation>
                </relocations>
            </configuration>
        </execution>
    </executions>
</plugin>

Basic Setup Example

Here's a complete example of setting up Sarah in a Minecraft plugin:

public class MyPlugin extends JavaPlugin {

    private DatabaseConnection databaseConnection;
    private RequestHelper requestHelper;

    @Override
    public void onEnable() {
        // Load configuration
        saveDefaultConfig();

        // Setup database
        setupDatabase();

        // Run migrations
        runMigrations();
    }

    private void setupDatabase() {
        String type = getConfig().getString("database.type", "sqlite");

        if (type.equalsIgnoreCase("mysql")) {
            DatabaseConfiguration config = DatabaseConfiguration.create(
                getConfig().getString("database.user"),
                getConfig().getString("database.password"),
                getConfig().getInt("database.port", 3306),
                getConfig().getString("database.host"),
                getConfig().getString("database.database")
            );
            this.databaseConnection = new MySqlConnection(config);
        } else {
            DatabaseConfiguration config = DatabaseConfiguration.sqlite(
                getConfig().getBoolean("database.debug", false)
            );
            this.databaseConnection = new SqliteConnection(config, getDataFolder());
        }

        // Connect to database
        try {
            this.databaseConnection.connect();
        } catch (SQLException e) {
            getLogger().severe("Failed to connect to database!");
            e.printStackTrace();
            getServer().getPluginManager().disablePlugin(this);
            return;
        }

        // Create request helper
        this.requestHelper = new RequestHelper(databaseConnection, getLogger());
    }

    private void runMigrations() {
        MigrationManager.setMigrationTableName("my_plugin_migrations");
        MigrationManager.registerMigration(new CreatePlayersTable());
        MigrationManager.registerMigration(new CreateStatsTable());

        try {
            MigrationManager.execute(databaseConnection, getLogger());
        } catch (SQLException e) {
            getLogger().severe("Failed to run migrations!");
            e.printStackTrace();
        }
    }

    @Override
    public void onDisable() {
        if (databaseConnection != null) {
            databaseConnection.disconnect();
        }
    }

    public RequestHelper getRequestHelper() {
        return requestHelper;
    }
}

Configuration File Example

Here's a sample config.yml for your plugin:

database:
  # Type: mysql, mariadb, or sqlite
  type: sqlite

  # MySQL/MariaDB settings (ignored for SQLite)
  host: localhost
  port: 3306
  database: my_plugin
  user: root
  password: secret

  # Enable SQL query logging
  debug: false

Next Steps

Now that you have Sarah installed, learn how to:

On this page

GroupeZ MCP

Documentation in your AI

MCP lets your AI search GroupeZ documentation and read current examples to help you configure your plugins.

Read-only · No documentation API key needed

1. Copy the server URL

Transport: HTTP (Streamable HTTP). Authentication: none. Your tool uses its own model and subscription limits.

  1. Open Plugins in ChatGPT on the web, then + → Add custom MCP server.
  2. Name it ‘GroupeZ Documentation’, paste the URL above and choose ‘No authentication’. Create and install the plugin.
  3. In a conversation, type @ and select the plugin before asking. If needed, enable search, get_page and list_pages in its settings.
Official setup guide

3. Ask a question

Use GroupeZ MCP to help me create a zMenu inventory. Search relevant pages, read the examples and cite your sources.
Other clients and troubleshooting

For clients using mcpServers, adapt this example to their format:

{
  "mcpServers": {
    "groupez-docs": {
      "url": ""
    }
  }
}

Available tools are search, get_page and list_pages. Refresh the connector’s tools after updates. If your AI cannot access them, check that the connector is enabled in the conversation and your account allows custom MCP servers. Opening the URL in a browser is not an MCP test.