66c870385f9a7fe729d1d458657124168ff39f02

proximaclient.json — plugin & mod API for ProximaClient

Also available in: Русский

The proximaclient.json file lets a plugin or mod author extend the ProximaClient app for their project without involving our team:

  • settings — gives the plugin its own settings screen (a gear icon on the plugin card → a modal with fields). The user edits the config through the UI, without opening .yml/.toml by hand.
  • content — adds your commands, items, effects, etc. to the server console autocomplete (the user sees suggestions as they type a command).

Both blocks are optional — you can ship settings only, content only, or both. The format is versioned via schemaVersion (current version — 1). This is a developer-facing document; the examples use Minecraft.

If you're not sure how users install plugins yet, see How to install plugins on a Minecraft server.

Where the file lives

The app looks for the manifest in two places, in this priority order:

  1. In the root of your .jar — a proximaclient.json file next to plugin.yml / paper-plugin.yml / mods.toml / fabric.mod.json.
  2. On the ProximaMP CDN (fallback, if the jar has no file) — by plugin/mod name.
MyPlugin.jar
├── proximaclient.json   ← here, in the archive root
├── plugin.yml
└── ...classes...

jar archive structure with proximaclient.json in the root

CDN fallback (on the ProximaMP side)

If the jar has no file, the app tries to fetch the manifest from our CDN by plugin name. The ProximaMP team places schemas there — for example, ready-made settings for popular plugins that don't ship their own proximaclient.json. Plugin authors don't have direct CDN access: your main path is the file in the jar.

The app-side cache is 5 minutes. Need a CDN fallback for your plugin (e.g. you can't modify the jar)? Contact the ProximaMP team — we'll add it on our side.

Priority: if the file exists both in the jar and on the CDN, the version from the jar wins. The CDN is used only when the jar has no file.

Top level of the file

{
  "schemaVersion": 1,        // file format version (number, defaults to 1)
  "settings": { ... },       // optional — settings screen
  "content":  { ... }        // optional — data for console autocomplete
}
FieldTypeReq.Description
schemaVersionnumber (integer > 0)noFormat version. Defaults to 1 if omitted.
settingsobjectnoSettings screen schema.
contentobjectnoGame-data delta for the console.

Unknown keys are forbidden. Any unknown key at any level → the whole file is considered invalid and ignored (strict validation).

The settings block — settings screen

Adds a gear icon and a settings modal to the plugin. The user changes values — the app writes them to the specified config file.

Plugin settings modal with tabs

Top-level settings fields

FieldTypeReq.Description
categoryIdstringyesPlugin category (see list below). A value outside the list → the settings block is dropped.
configPathstringyesPath to the editable config relative to the server folder (e.g. plugins/MyPlugin/config.yml). No line breaks; ≤ 255 chars.
description{ru, en}yesShort description for the modal header.
fieldsarrayyesForm fields. Up to 300.
groupsarraynoGrouping fields into tabs. Up to 50.

Allowed categoryId (exactly these 6 values):

categoryIdPurpose
administrationAdministration, management
securitySecurity, access, passwords
performancePerformance, optimization
gameplayGameplay, mechanics
communicationChat, messages, notifications
otherOther

Form field (fields[])

{
  "key": "max-homes",          // required — field identifier
  "path": "homes.max",         // opt. — path in the config (defaults to key)
  "type": "number",            // required — control type
  "required": false,           // opt. — whether the field is required
  "label": { "ru": "Макс. домов", "en": "Max homes" },        // required
  "description": { "ru": "Лимит домов на игрока", "en": "Homes per player" }  // opt.
}
AttributeTypeReq.Description
keystring (1–64)yesUnique field identifier within the schema.
pathstring (1–128)noPath to the value in the config (dot notation, e.g. homes.max). Defaults to key.
typestringyesField type — one of 6 (see below).
requiredbooleannoMarks the field required. Defaults to false.
label{ru, en}yesField label in the UI.
description{ru, en}noHelper text under the field.
optionsarrayfor enumChoice options.
withGeneratorbooleanfor password"Generate password" button.

Field types (type)

typeUI controlExtra attributes
stringText field
passwordPassword field (hidden input)withGenerator: true → generate button
numberNumber field
booleanToggle
enumDropdownoptionsrequired, ≥ 1 item
string-arrayString list editor

enum option (options[]):

{
  "value": "strict",                                  // what gets saved to the config (1–128 chars)
  "label": { "ru": "Строгий", "en": "Strict" }        // what to show in the list
}

values within one field must be unique.

Groups / tabs (groups[])

Optional. Splits fields into tabs inside the modal. Fields not assigned to any group go to the "General" tab. If groups is omitted, fields render as a flat list.

{
  "id": "general",                                    // required, unique (1–64)
  "icon": "settings",                                 // opt. — icon name
  "label": { "ru": "Общее", "en": "General" },        // required
  "description": { "ru": "Базовые опции", "en": "Basics" },  // opt.
  "fieldKeys": ["max-homes", "mode"]                  // required — keys of this tab's fields
}

Each fieldKeys[i] must reference an existing key from fields. Up to 300 keys per group.

The content block — console data

Adds your plugin's commands and game objects to the server console autocomplete. It's a flat delta on top of the built-in game data: you can add new entries and remove existing ones.

Console autocomplete with a plugin command

Contents of the content block

FieldTypeDescription
addedCommandsarray of CommandTemplateNew commands. Up to 200.
removedCommandsarray of stringCommand names to remove from suggestions. Up to 200.
addedItems / removedItemsarrayItem registry.
addedEffects / removedEffectsarrayEffect registry.
addedEnchantments / removedEnchantmentsarrayEnchantment registry.
addedMobs / removedMobsarrayMob/entity registry.
addedBiomes / removedBiomesarrayBiome registry.
addedAttributes / removedAttributesarrayAttribute registry.
addedSounds / removedSoundsarraySound registry.
addedParticles / removedParticlesarrayParticle registry.
addedStructures / removedStructuresarrayStructure registry.
addedDimensions / removedDimensionsarrayDimension registry.

added* take an array of GameItem objects, removed* — an array of identifier strings.

Command template (CommandTemplate)

{
  "name": "sethome",                                   // required — command name (no slash)
  "description": { "ru": "Установить дом", "en": "Set home" },  // opt.
  "usage": { "ru": "<имя>", "en": "<name>" },          // opt. — free-tail hint
  "slots": []                                          // required — positional arguments
}
AttributeTypeReq.Description
namestring (1–64)yesCommand name without a slash. Allowed: A–Z a–z 0–9 _ : -. Subcommands are modeled via enum + followedBy, not a space in the name.
description{ru, en}noCommand description in the suggestion.
usage{ru, en}noHint for the "free tail" (coordinates, JSON, text). Shown when slots run out but the command still expects input.
slotsarray of CommandSlotyesPositional arguments in order. Up to 64. An empty array = a command with no arguments.

Slots (slots[]) — supported kinds

Each slot describes one positional argument. There are 12 kinds (kind):

kindWhat it suggestsWhere the values come from
enumA fixed list of optionsInline, from the slot itself (values)
playerPlayer nameOnline players (+ selectors @a @e @p @s @r @n)
itemsItemaddedItems registry (+ built-ins)
effectEffectaddedEffects registry
enchantmentEnchantmentaddedEnchantments registry
mobMob / entityaddedMobs registry
biomeBiomeaddedBiomes registry
attributeAttributeaddedAttributes registry
soundSoundaddedSounds registry
particleParticleaddedParticles registry
structureStructureaddedStructures registry
dimensionDimensionaddedDimensions registry

Simple slots are written as { "kind": "player" }, { "kind": "items" }, etc. The enum slot is special (see below).

The enum slot, EnumValue and subcommands (followedBy)

{
  "kind": "enum",
  "values": [
    { "value": "add",    "followedBy": [ { "kind": "player" } ] },
    { "value": "remove", "followedBy": [ { "kind": "player" } ] },
    { "value": "list" }
  ]
}
AttributeTypeReq.Description
valuestring (1–64)yesThe value sent to the server as-is.
label{ru, en}noDisplay name of the option.
description{ru, en}noOption explanation.
followedByarray of CommandSlotnoSlots added after this value if it's chosen. This is how subcommands are made. Recursive. Up to 64.

Subcommands via followedBy: the whitelist command is a template with name: "whitelist" and a single enum slot [add, remove, on, off, list], where add/remove have followedBy: [{ "kind": "player" }], and on/off/list don't. Up to 256 values in one enum.

followedBy subcommands in action — whitelist add <player>

Game object (GameItem)

An element of any added* registry:

{
  "id": "myplugin:magic_wand",                          // required
  "name": { "ru": "Волшебная палочка", "en": "Magic Wand" }  // required
}
AttributeTypeReq.Description
idstring (1–128)yesIdentifier sent to the server as-is. Format: namespace:path or just path.
name{ru, en}yesHuman-readable name in the suggestion.

The registry expands dynamically: add an item via addedItems and it's immediately available in items slots.

Limits and validation

The file is untrusted input, so it's validated strictly. On any validation error, the file (or the corresponding block) is fully ignored — the app keeps working without your schema.

What gets it rejected:

  • Extra/unknown keys at any level.
  • Exceeding limits: ≤ 200 commands, ≤ 200 removedCommands, ≤ 2000 entries per registry, ≤ 256 values in an enum, ≤ 64 slots, ≤ 300 fields, ≤ 50 groups. Localized strings {ru, en} — ≤ 200 chars.
  • Invalid command name / id (command names — only A–Z a–z 0–9 _ : -).
  • categoryId outside the list — the settings block is dropped.
  • File size > 512 KB — not read from the jar.
  • Broken JSON.

Tip: if the schema "isn't picked up", check the file with a strict JSON validator, verify categoryId against the list, and make sure there are no extra fields.

Full proximaclient.json example

{
  "schemaVersion": 1,
  "settings": {
    "categoryId": "gameplay",
    "configPath": "plugins/Homes/config.yml",
    "description": { "ru": "Настройки системы домов", "en": "Homes settings" },
    "fields": [
      { "key": "max-homes", "path": "homes.max", "type": "number",
        "label": { "ru": "Макс. домов", "en": "Max homes" } },
      { "key": "cooldown", "path": "homes.cooldown-seconds", "type": "number",
        "label": { "ru": "Кулдаун (сек)", "en": "Cooldown (s)" } },
      { "key": "cross-world", "type": "boolean",
        "label": { "ru": "Телепорт между мирами", "en": "Cross-world teleport" } }
    ]
  },
  "content": {
    "addedCommands": [
      { "name": "home", "slots": [],
        "description": { "ru": "Телепорт домой", "en": "Teleport home" } },
      { "name": "sethome", "slots": [],
        "usage": { "ru": "<имя дома>", "en": "<home name>" } },
      { "name": "delhome", "slots": [],
        "usage": { "ru": "<имя дома>", "en": "<home name>" } }
    ]
  }
}

Integration questions

The format version is schemaVersion: 1. For integration questions, reach the ProximaMP team via Telegram. ProximaClient itself is on the /client page.

proximaclient.json — plugin & mod API for ProximaClient