marzban-mcp
This MCP server lets an AI agent inspect and manage a Marzban panel through read-only diagnostics and user lifecycle operations.
Read the Xray core config as a summary, one section, or raw JSON.
Inspect proxy hosts and flag unknown
{VARIABLE}template tokens.List nodes with status, Xray version, and bandwidth usage.
View panel system stats and inbound proxy details.
Look up subscription info by public subscription token.
List/search users and fetch user details, expiry/data summaries, and traffic usage by node.
Create, update, activate, deactivate, put on hold, and extend/renew users, including data-limit and expiry changes.
Per the README, credentials are env-only and destructive calls are confirmation-gated.
marzban-mcp
An MCP server that lets AI agents manage a Marzban panel — built on marzban-sdk.
Users, subscriptions, nodes, and the core config — through Claude, Cursor, or any MCP-compatible client.
Documentation · Client Setup · Tools
Point an AI agent at your panel and it can actually run it — not just read about it. No custom integration code, just an entry in your MCP config.
Install
npm install -g marzban-mcpYou don't usually need to install it yourself — your MCP client runs it via npx (see below). Prefer a container? A multi-arch image is published at ilmar7786/marzban-mcp:
docker pull ilmar7786/marzban-mcpRelated MCP server: io.github.antonio-mello-ai/mcp-pfsense
Quick start
Add it to your client's MCP config with your panel's URL and an admin login. Every client reads roughly the same shape:
{
"mcpServers": {
"marzban": {
"command": "npx",
"args": ["-y", "marzban-mcp"],
"env": {
"MARZBAN_BASE_URL": "https://panel.example.com",
"MARZBAN_USERNAME": "admin",
"MARZBAN_PASSWORD": "secret"
}
}
}
}Claude Desktop, Claude Code, Cursor and other MCP clients all read the same
mcpServers block — just from a different config file. Restart the client
and the tools below become available.
Features
🔒 Env-only credentials — the panel URL, username and password are never accepted as a tool argument, so a compromised or confused model can't redirect the server elsewhere.
🎯 Profile-gated tools — a tool outside the active profile never appears in
tools/listat all, not just hidden behind a hint.✅ Confirmation on every destructive call — the first call only describes the consequences and returns a one-time token; nothing runs until a human-approved second call repeats it, and confirming one call never authorizes a different target or a wider version of the same call.
🔁 A retried destructive call doesn't run twice — an identical repeat within 5 minutes returns the recorded result of the first one instead of restarting the core again; a call whose outcome was never observed says so plainly rather than guessing.
🙈 Credentials masked by default —
proxies,subscription_urlandlinksstay hidden unless you explicitly opt in.🧭 21 tools, 3 prompts — full user lifecycle, config, hosts, nodes, system stats and subscriptions, plus ready-made investigations that chain several tools together.
🛠️ Built on
marzban-sdk— the same auth, retry and reconnect behavior as the SDK itself, just exposed as MCP tools.
Configuration
Variable | Required | Description |
| Yes | Your panel's URL, e.g. |
| Yes | Admin username |
| Yes | Admin password — also used to silently re-authenticate on expiry |
Everything else — profile, output format, verbosity, tool allow/deny filters, log level, link masking — is optional and documented in Configuration.
Tools
21 tools, namespaced marzban_<area>_<action>: Users (11) · Config (5)
· System & nodes (3) · Subscription (2). Three prompts —
expiring_users_audit, node_diagnostics, traffic_report — chain those
tools into ready-made investigations. Full list at
Tools &
Prompts.
Safety model
A profile isn't a hint — a tool outside it never appears in tools/list, so a
model can't call what it can't see. readonly exposes only lists and
lookups; standard (default) adds full user CRUD, renewals and status
changes; full adds destructive tools — delete, reset traffic, rewrite
config, restart the core.
Destructive tools also gate on confirmation: the first call never runs
anything — it describes exactly what would happen and returns a one-time
token. Only a second call, with that token attached, executes. MARZBAN_MCP_CONFIRM
controls how often this is required: auto (default, once per tool and
exact arguments, for 5 minutes — a different target or a wider call always
needs its own confirmation), always (every call), or off (unattended
environments only — no safety net once set).
Confirmation decides whether a call may run; it doesn't decide whether it has
already run. So each destructive call is also remembered for 5 minutes: an
identical repeat — the kind a client sends after a timeout — returns the
recorded result of the first one, with a note saying so, and never reaches
the panel. When a request went out and no answer came back, the outcome is
reported as unknown, with instructions to check the state with a read-only
tool rather than retry. A fresh confirmation still runs the operation for
real — in auto the replayed result carries a fresh token, so a second run
can be approved on the spot — and restarting the server clears the memory.
Documentation
Full setup guides and the complete tool/prompt reference live at ilmar7786.github.io/marzban-sdk:
Contributing
This package lives in the marzban-sdk
monorepo — see the root CONTRIBUTING.md
for how to submit a patch. Running the server locally in watch mode, poking
it with the MCP Inspector, or wiring a client to your own build? See
ARCHITECTURE.md § Local development & manual testing.
Found a bug or have an idea?
Open an issue.
License
Available Tools
15 toolsmarzban_config_getGet core configARead-only
Reads the Xray core configuration. Defaults to a structural summary (inbound/outbound tags, ports, protocols, routing rule count) — the full config can be tens of KB and this is usually all that's needed. Pass section (e.g. "inbounds") for one key's raw JSON, or section: "raw" for the entire config.
| Name | Required | Description | Default |
|---|---|---|---|
| section | No | Return this one top-level key's raw JSON instead of the summary (e.g. "inbounds", "routing"). Use "raw" for the entire config. Omit for a structural summary — prefer that over "raw" unless you specifically need the full JSON. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| mode | Yes | |
| section | Yes | |
| summary | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavioral context the annotations don't: the full config can be tens of KB, the default is a summarized projection, and raw output is opt-in. No mention of auth scope or error behavior, but nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and the default behavior, followed by the parameter modes. Every clause carries information the agent needs; nothing is redundant padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return value documentation is unnecessary, and the description covers the mode selection and payload-size tradeoff an agent needs to call it correctly. What remains unsaid — permission requirements, sibling overlap — is minor for a read-only config getter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by repeating and enriching the semantics of `section` with a concrete example ("inbounds") and the special sentinel value "raw", plus the preference ordering (summary > raw unless the full JSON is needed).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Reads the Xray core configuration") and immediately clarifies the default return shape (structural summary with tags, ports, protocols, routing rule count). That detail distinguishes it from siblings like marzban_system_get_inbounds or marzban_system_get_stats without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use guidance for the single parameter: omit for summary, pass a key name for one section's raw JSON, pass "raw" for everything, and explicitly prefers summary over raw. It does not compare against sibling tools that also expose inbound/config data, so routing between siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
marzban_hosts_getGet proxy hostsARead-only
Lists proxy host settings grouped by inbound tag. Flags host fields (remark/address/host/sni/path) that reference an unknown {VARIABLE} template token — almost always a typo, since Marzban leaves unknown tokens un-substituted rather than erroring.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| hosts | Yes | |
| warnings | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuinely non-obvious context: results are grouped by inbound tag and unknown `{VARIABLE}` tokens are surfaced because Marzban silently leaves them un-substituted rather than erroring.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the grouping behavior before the diagnostics detail. The second sentence is long but every clause (which fields are flagged, why it matters) contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. For a zero-parameter read tool, the description covers what is returned (host settings by inbound tag) and the one caveat an agent must interpret (un-substituted tokens = likely typo).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. No parameter text is needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Lists) and a precise resource (proxy host settings grouped by inbound tag), plus a secondary validation behavior. The resource is distinct from siblings like marzban_config_get and marzban_system_get_inbounds, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the tool for inspecting proxy host settings and spotting broken template tokens. There is no explicit when-to-use guidance or statement of when another sibling such as marzban_system_get_inbounds is preferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
marzban_nodes_listList nodesARead-only
Lists all connected nodes with their status and Xray version, plus bandwidth usage (uplink/downlink) over the given period. start/end (ISO datetimes) narrow the usage window; omit both for all-time.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ISO datetime. Omit for no upper bound. | |
| start | No | ISO datetime. Omit for no lower bound. |
Output Schema
| Name | Required | Description |
|---|---|---|
| nodes | Yes | |
| usage | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: it discloses what data comes back (status, Xray version, per-node bandwidth) and that the time window defaults to all-time when both bounds are omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the resource scope and returned data front-loaded and the parameter behavior trailing. Every clause carries information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be defined here, and the tool has only two optional params on a read-only operation — the description covers everything needed to call it correctly. Minor omission: no mention of whether the node list is paginated or truncated for large deployments.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, and the description earns an extra point by explaining the joint behavior of the two params — omitting both yields all-time, which the schema's per-field 'no lower/upper bound' text does not state on its own.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists all connected nodes') and enumerates the returned facets: status, Xray version, and uplink/downlink bandwidth. No sibling tool deals with nodes, so the domain is unambiguous versus marzban_users_list, marzban_hosts_get, and the config/system tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives usage semantics for the time window ('omit both for all-time'), which is enough to call the tool, but it never says when to reach for this versus marzban_system_get_stats or marzban_hosts_get, which plausibly overlap for node/host telemetry. Selection guidance is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
marzban_subscription_getGet subscription infoARead-only
Reads subscription status/usage/expiry using the token from a subscription URL (the same public, unauthenticated endpoint client apps use) — for diagnosing a broken subscription link without needing the username. For an admin-side lookup by username, use marzban_users_get instead.
| Name | Required | Description | Default |
|---|---|---|---|
| subscriptionToken | Yes | The opaque token from a user's subscription URL (the path segment after "/sub/") — not an admin/session token. |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | No | |
| expire | No | |
| status | Yes | |
| proxies | Yes | |
| username | Yes | |
| next_plan | No | |
| online_at | No | |
| created_at | Yes | |
| data_limit | No | data_limit can be 0 or greater |
| used_traffic | Yes | |
| sub_updated_at | No | |
| on_hold_timeout | No | |
| subscription_url | No | |
| sub_last_user_agent | No | |
| lifetime_used_traffic | No | |
| on_hold_expire_duration | No | |
| data_limit_reset_strategy | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds real behavioral context beyond them: this hits the same public, unauthenticated endpoint client apps use, and no username is needed. It does not discuss rate limits or what the response contains, but an output schema exists so return values are covered elsewhere.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and its data source, followed by the routing rule. The parenthetical about the public endpoint is load-bearing for understanding what kind of token is required, so nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with full schema coverage, safety annotations, and an output schema, the description covers the remaining gaps: auth model (unauthenticated public endpoint), token provenance, and sibling routing. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter is already documented as the opaque path segment after /sub/ and explicitly not an admin/session token. The description reinforces this from the caller's perspective ('the same public, unauthenticated endpoint client apps use'), clarifying where the token comes from rather than restating types, which adds modest but genuine value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (reads) and specific resource facets (subscription status/usage/expiry) plus the exact input basis (token from a subscription URL). It explicitly contrasts with the sibling marzban_users_get, so an agent can distinguish the two without reading either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use scenario — diagnosing a broken subscription link when the username is unknown — and names the alternative (marzban_users_get) with the condition that selects it (admin-side lookup by username). Both routing directions are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
marzban_system_get_inboundsList inboundsARead-only
Lists configured inbound proxies grouped by protocol, with tag, network, TLS mode, and port for each. For the raw Xray inbound JSON (routing, stream settings, etc.) use marzban_config_get with section: "inbounds" instead.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds useful behavioral context by describing the grouping (by protocol) and the per-entry fields returned, well beyond the annotations. It stops short of mentioning auth requirements or pagination, but for a simple read-only listing that gap is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste: the first front-loads what is returned, the second handles the disambiguation. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A zero-parameter, read-only listing tool with a declared output schema. The description covers purpose, return shape, and the alternative route, so nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to convey; the baseline for a 0-param tool applies. Nothing in the description conflicts with the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Lists') plus resource ('configured inbound proxies') and an explicit statement of what each entry contains (tag, network, TLS mode, port). It also names the sibling it is not (marzban_config_get with section: 'inbounds'), so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the alternative and the condition that selects it: use marzban_config_get for raw Xray inbound JSON (routing, stream settings). This is a clear when-to-use-this vs when-to-use-that routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
marzban_system_get_statsGet system statsARead-only
Reports panel-wide stats: CPU/memory usage, user counts by status, and bandwidth totals/speeds, plus the Xray core version and whether it is currently running.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| core | Yes | |
| system | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds 'panel-wide' scope and the fact that the Xray core's current running state is reported (a liveness signal), but says nothing about data freshness, caching, or auth/admin requirements. Much of its content restates return fields that the output schema already carries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and scope, then the enumerated data. No filler, no repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with a full output schema and readOnly annotations, the description covers what an agent needs to decide and call it. The only shortfall is the missing routing guidance relative to sibling monitoring/config tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to disambiguate and the baseline for a no-arg tool applies. No parameter guidance is needed or given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb plus resource: 'Reports panel-wide stats', then enumerates exactly what those stats are (CPU/memory, user counts by status, bandwidth totals/speeds, Xray core version, running state). The 'panel-wide' framing and the software/hardware content clearly separate it from siblings like marzban_users_list, marzban_nodes_list, and marzban_config_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The content implies a health/monitoring use case, but the description never says when to pick this over marzban_nodes_list (per-node stats) or marzban_config_get, nor does it state any prerequisites such as admin authentication. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
marzban_users_activateActivate userB
Sets a user's status to active.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| admin | No | |
| links | No | |
| expire | No | |
| status | Yes | |
| proxies | Yes | |
| inbounds | No | |
| username | Yes | |
| next_plan | No | |
| online_at | No | |
| created_at | Yes | |
| data_limit | No | data_limit can be 0 or greater |
| used_traffic | Yes | |
| sub_updated_at | No | |
| on_hold_timeout | No | |
| subscription_url | No | |
| excluded_inbounds | No | |
| auto_delete_in_days | No | |
| sub_last_user_agent | No | |
| lifetime_used_traffic | No | |
| on_hold_expire_duration | No | |
| data_limit_reset_strategy | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered. The description adds that the effect is a status-field change rather than a destructive write, but says nothing about idempotency, behavior on an already-active or nonexistent user, or any side effects on expiry/subscription state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler. Brevity is appropriate for a one-parameter status toggle, though the sentence stops short of the point where it would be genuinely useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover the safety profile, so the remaining burden is small for a single-parameter toggle. The main gap is failure/edge-case behavior (unknown user, already active), which is a moderate rather than critical omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 0% schema description coverage, so the description should carry weight; 'a user's status' at least implies the username identifies the target. The format constraints (pattern, 3-32 chars) live in the schema itself, so nothing further is expected here, but no meaning is added beyond the field name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('sets a user's status to active'), and the mention of 'status' clarifies the mechanism beyond the title alone. It does not, however, differentiate itself from the sibling marzban_users_deactivate or explain what 'active' implies for the user's subscription.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus marzban_users_deactivate, marzban_users_update, or marzban_users_hold, and no stated preconditions. The agent must infer entirely from the tool name that this is the inverse of deactivate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
marzban_users_createCreate userA
Creates a new user. dataLimit accepts a human size ("10GB"), expire a relative duration ("30d") or absolute date — both default to unlimited when omitted. templateId fills dataLimit/inbounds/expire from a user template; any field also given explicitly overrides the template value.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| expire | No | e.g. "30d". Omit for no expiration. | |
| status | No | Defaults to active. | |
| proxies | No | Protocol name -> settings, e.g. {"vless": {"id": "<uuid>"}} or {"shadowsocks": {}} to auto-generate credentials. Omit to leave unchanged on update. On create there is no server default — omitting this (without templateId) errors; provide at least one protocol with a matching inbound configured on the panel. | |
| inbounds | No | Protocol name -> inbound tags to restrict this user to. Omit for all inbounds. | |
| username | Yes | ||
| dataLimit | No | e.g. "10GB". Omit or 0 for unlimited. | |
| templateId | No | Create from a user template instead of specifying proxies/inbounds by hand. | |
| onHoldExpireDuration | No | Seconds the user may stay on_hold before expiring, counted from their first connection. Only meaningful when status is on_hold. | |
| dataLimitResetStrategy | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| admin | No | |
| links | No | |
| expire | No | |
| status | Yes | |
| proxies | Yes | |
| inbounds | No | |
| username | Yes | |
| next_plan | No | |
| online_at | No | |
| created_at | Yes | |
| data_limit | No | data_limit can be 0 or greater |
| used_traffic | Yes | |
| sub_updated_at | No | |
| on_hold_timeout | No | |
| subscription_url | No | |
| excluded_inbounds | No | |
| auto_delete_in_days | No | |
| sub_last_user_agent | No | |
| lifetime_used_traffic | No | |
| on_hold_expire_duration | No | |
| data_limit_reset_strategy | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered. The description does add real value by disclosing the unlimited defaults for dataLimit/expire and the template-override precedence rule. It omits the create-specific failure mode (omitting proxies without a template errors) and any permission or side-effect details, which live only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action before format and template details. Each sentence carries non-redundant information, though the param-format sentences partially mirror the schema descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the 70%-covered 10-param schema fills most gaps for flags like status and onHoldExpireDuration. The description covers the three most semantically tricky parameters; the main residual gap is not restating that proxies is effectively required on create without a templateId.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 70% schema coverage the baseline is 3, and the description goes beyond it: it explains accepted formats for dataLimit ("10GB") and expire ("30d" or absolute date), and clarifies the override precedence between templateId and explicit fields, which the schema does not state. It says nothing about username constraints, status, onHoldExpireDuration, or dataLimitResetStrategy, leaving those to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Creates a new user"), which clearly separates it from update/activate/hold siblings in the marzban_users family. It stops short of explicitly routing an agent between create and marzban_users_update or the template path, but the action is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The templateId sentence implies an alternative creation path (template vs. hand-specified fields) but never frames it as guidance, and there is no statement of when to prefer this over sibling tools like marzban_users_update. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
marzban_users_deactivateDeactivate userA
Sets a user's status to disabled, immediately blocking their access without deleting them.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| admin | No | |
| links | No | |
| expire | No | |
| status | Yes | |
| proxies | Yes | |
| inbounds | No | |
| username | Yes | |
| next_plan | No | |
| online_at | No | |
| created_at | Yes | |
| data_limit | No | data_limit can be 0 or greater |
| used_traffic | Yes | |
| sub_updated_at | No | |
| on_hold_timeout | No | |
| subscription_url | No | |
| excluded_inbounds | No | |
| auto_delete_in_days | No | |
| sub_last_user_agent | No | |
| lifetime_used_traffic | No | |
| on_hold_expire_duration | No | |
| data_limit_reset_strategy | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false; the description adds meaningful context beyond them by stating the effect is immediate and non-destructive (the account is retained). It does not cover idempotency (what happens if already disabled), permissions required, or reversibility, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the effect front-loaded and zero filler; every clause ('immediately blocking their access', 'without deleting them') carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the description does the core job for a one-parameter mutation. What is missing is operational guidance: how to undo it (marzban_users_activate), error behavior for unknown or already-disabled users, and any permission requirements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the schema supplies only the field name plus pattern/length constraints and the description says nothing about username. Since there is exactly one obvious, constrained required parameter, the gap is minor, but the description adds no semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (sets status to disabled) and resource (user), plus the concrete effect (access blocked, account retained). It implicitly distinguishes the operation from deletion, but never names the sibling marzban_users_activate, so the pairing is left for the agent to infer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'without deleting them' suggests the tool is for suspending rather than removing an account. There is no explicit when-to-use statement, no prerequisite, and no pointer to marzban_users_activate as the reversal path, so the agent must derive the choice from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
marzban_users_extendExtend user subscriptionA
Renews a user: adds addDuration to their current expiration (or to now, if they have none or it already passed) and/or addData on top of their current data limit. If the user was expired or limited, status is moved back to active. Use this instead of marzban_users_update for renewals — it reads the current expire/limit first so the increment is relative, not an absolute overwrite.
| Name | Required | Description | Default |
|---|---|---|---|
| addData | No | Extra data allowance to add on top of the current limit, e.g. "10GB". | |
| username | Yes | ||
| addDuration | No | Relative duration to add to the current expiration, e.g. "30d". |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| user | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish that this is a non-read-only, non-destructive mutation. The description adds important behavior beyond that: increments are relative, a missing or past expiration falls back to now, and expired/limited users are reactivated. It lacks details on permissions or failure behavior, so it is not fully exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact, front-loaded paragraph that immediately explains the operation, then covers edge cases and the sibling-tool alternative. Every sentence contributes actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existing output schema and annotations, the description supplies the missing behavioral context an agent needs: relative increment semantics, fallback behavior for expiration, reactivation behavior, and the distinction from marzban_users_update. Nothing essential for correct invocation appears absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description meaningfully explains the two mutating parameters: addDuration is added to current expiration or now, and addData is added on top of the current data limit. This adds important semantics beyond the schema's type and format constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it renews a Marzban user by incrementing expiration and/or data limit. It clearly distinguishes this relative-increment operation from marzban_users_update, which performs absolute overwrites.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names marzban_users_update as the alternative and explains that this tool should be used for renewals because it reads current values first. It does not explicitly state when not to use it, but the relative-vs-absolute distinction supplies clear selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
marzban_users_getGet userARead-only
Fetches one user by username, with a computed summary: data left, days left, usage percent, and whether they are effectively expired (covers the case where status has not caught up with an already-past expire yet).
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| user | Yes | |
| summary | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this as a read-only, non-destructive operation, so the description's main value is disclosing the computed summary fields and the effective-expiry edge case. That is useful behavioral context beyond the annotations, though it does not mention not-found handling or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no waste. The parenthetical about effective expiry earns its place by clarifying an otherwise non-obvious computed result.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only getter with an output schema and annotations covering safety, the description is largely complete. It explains the computed summary and the status-versus-expiry edge case, though it could mention not-found behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter, and the description identifies it as the lookup username, so the parameter's role is clear. With schema description coverage at 0%, this simple single-param case still benefits from that explicit lookup semantics, even though format details remain in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: fetches one user by username. It implicitly distinguishes itself from the list tool by saying it returns one user, and it adds computed fields, but it does not explicitly address overlap with marzban_users_get_usage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: use this when you need details for a specific username rather than a list. The description gives no explicit when-not guidance or named alternatives, even though get_usage and users_list are closely related siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
marzban_users_get_usageGet user traffic usageARead-only
Reports how much data a user has used: total, lifetime total, their current limit, and a breakdown by node. start/end (ISO datetimes) narrow the per-node breakdown to a period; omit both for all-time.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ISO datetime. Omit for no upper bound. | |
| start | No | ISO datetime. Omit for no lower bound. | |
| username | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| byNode | Yes | |
| username | Yes | |
| dataLimit | Yes | |
| usedTraffic | Yes | |
| lifetimeUsedTraffic | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds real behavioral context beyond that: it discloses the shape of the result and, importantly, that the time window narrows only the per-node breakdown while totals remain all-time.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the return payload first, then the parameter scoping rule. Every clause carries information and nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the description nonetheless summarizes them. Combined with annotations covering safety, the definition gives an agent enough to call this correctly; only explicit sibling routing is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description closes the main gap by stating that start/end are ISO datetimes and that omitting both yields all-time figures. It adds scope semantics (which part of the response is filtered) that the schema does not express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A specific verb ('Reports how much data a user has used') plus an enumeration of exactly what is returned: total, lifetime total, current limit, and per-node breakdown. This distinguishes it cleanly from marzban_users_get (user record) and marzban_users_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to supply start/end versus omitting them, which is genuine usage guidance for the parameters. It never states when to choose this tool over siblings such as marzban_users_get, so tool-level selection guidance is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
marzban_users_holdPut user on holdA
Sets a user's status to on_hold — inactive until their first connection, at which point the on-hold timer starts. Useful for provisioning an account ahead of time without starting its clock.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | ||
| onHoldExpireDuration | No | Seconds the user may stay on_hold before expiring, counted from their first connection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| admin | No | |
| links | No | |
| expire | No | |
| status | Yes | |
| proxies | Yes | |
| inbounds | No | |
| username | Yes | |
| next_plan | No | |
| online_at | No | |
| created_at | Yes | |
| data_limit | No | data_limit can be 0 or greater |
| used_traffic | Yes | |
| sub_updated_at | No | |
| on_hold_timeout | No | |
| subscription_url | No | |
| excluded_inbounds | No | |
| auto_delete_in_days | No | |
| sub_last_user_agent | No | |
| lifetime_used_traffic | No | |
| on_hold_expire_duration | No | |
| data_limit_reset_strategy | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations: on_hold means inactive until first connection, then the timer begins. This clarifies the state transition and timing, which is valuable even though annotations already indicate a non-read-only, non-destructive mutation. It does not cover idempotency or effects on an already-active user.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single tightly written sentence that front-loads the core action and then explains the key behavior. Every clause earns its place with no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and annotations covering safety, the description supplies the critical domain-specific behavior of on_hold and the timer. The main gap is the lack of parameter guidance, particularly for the required username field, but overall the agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not mention either parameter. Schema coverage is 50%, with onHoldExpireDuration documented only in the schema, and username undocumented in both schema and description. The description fails to compensate for the uncovered required username parameter or add any parameter meaning beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: setting a user's status to on_hold. It explains the unique on_hold state (inactive until first connection, then timer starts), which implicitly distinguishes it from activate/deactivate siblings, but does not explicitly name those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a clear usage scenario: provisioning an account ahead of time without starting its clock. It does not state when not to use the tool or explicitly compare it to alternatives like activate or deactivate, but the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
marzban_users_listList usersARead-only
Lists users, optionally filtered by status or a search term (matches username/note). Paginated — default 25, max 100 per call; prefer search over paging through everyone. For one known username, use marzban_users_get instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 25, max 100. | |
| offset | No | ||
| search | No | Matches username or note (server-side substring search). | |
| status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| total | Yes | |
| users | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered by structured data. The description adds pagination economics (default 25, max 100) and the recommendation to search rather than page, which is genuinely useful behavioral context, but it says nothing about ordering, whether a total count is returned, or what happens at the end of a page.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then pagination constraint, then the routing advice. No filler or restated title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A read-only list tool with an output schema and only four optional parameters needs little more; the description covers filtering, pagination limits, and tool selection. The only real gap is offset/paging mechanics, which the agent must infer when a result set exceeds the page size.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, and the description largely restates what the schema already documents for `limit` (default 25, max 100) and `search` (username/note matching). It adds only that filtering is possible by status; `offset` is never explained in either place, and the status enum values carry no guidance. Adequate but not compensating for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists users') plus the two supported filters, and explicitly distinguishes itself from marzban_users_get for single-user lookup. An agent can select this over its siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives positive guidance ('prefer `search` over paging through everyone') and an explicit alternative with its trigger condition ('For one known username, use marzban_users_get instead'). This is exactly the when/when-not/alternative structure that removes inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
marzban_users_updateUpdate userA
Partially updates a user — only fields you provide are changed, everything else is left as-is. For status changes prefer marzban_users_activate/deactivate/hold (clearer intent, no need to know the raw status enum). For renewing an expiring/expired user prefer marzban_users_extend.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| expire | No | e.g. "30d" or an absolute date. 0 means unlimited. | |
| proxies | No | Protocol name -> settings, e.g. {"vless": {"id": "<uuid>"}} or {"shadowsocks": {}} to auto-generate credentials. Omit to leave unchanged on update. On create there is no server default — omitting this (without templateId) errors; provide at least one protocol with a matching inbound configured on the panel. | |
| inbounds | No | Protocol name -> inbound tags to restrict this user to. Omit for all inbounds. | |
| username | Yes | ||
| dataLimit | No | e.g. "10GB". 0 means unlimited. | |
| dataLimitResetStrategy | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| admin | No | |
| links | No | |
| expire | No | |
| status | Yes | |
| proxies | Yes | |
| inbounds | No | |
| username | Yes | |
| next_plan | No | |
| online_at | No | |
| created_at | Yes | |
| data_limit | No | data_limit can be 0 or greater |
| used_traffic | Yes | |
| sub_updated_at | No | |
| on_hold_timeout | No | |
| subscription_url | No | |
| excluded_inbounds | No | |
| auto_delete_in_days | No | |
| sub_last_user_agent | No | |
| lifetime_used_traffic | No | |
| on_hold_expire_duration | No | |
| data_limit_reset_strategy | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, so the safety bar is lower. The description adds the key behavioral detail beyond them: omitted fields are left as-is, which tells the agent this is a merge-patch rather than a replace. It stops short of stating permission requirements or whether inbounds/proxies changes disrupt active connections.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core merge semantics, followed by the routing rules. Every clause carries actionable information; nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations and an output schema present, the description covers the one thing an agent must know to avoid data loss (merge vs replace) and the sibling routing. Remaining gaps are the undocumented enum and nested-object parameters rather than missing conceptual framing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 57% and the description adds no meaning for any of the 7 parameters — no guidance on dataLimitResetStrategy (the undocumented enum), note, or the nested proxies/inbounds interplay. The partial-update framing implies 'omit to keep' but never says it per-parameter, so agents still depend on the uneven schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Partially updates a user — only fields you provide are changed" names a specific verb (partial update), resource (user), and semantics (merge not replace). It is immediately distinguishable from marzban_users_create and the status-toggle siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes two common intents away from this tool: status changes go to activate/deactivate/hold, renewals go to extend, with a stated reason (clearer intent, no raw status enum). A rare case of naming alternatives and the condition that selects them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
19 tool updates
v0.2.4- Changed
marzban_config_get2 fields changed- removed
Input schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema"
- Changed
marzban_hosts_get8 fields changed- removed
Input schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / properties / hosts / additionalProperties / items / properties / fragment_setting / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / hosts / additionalProperties / items / properties / host / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / hosts / additionalProperties / items / properties / noise_setting / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / hosts / additionalProperties / items / properties / path / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / hosts / additionalProperties / items / properties / port / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Output schema / properties / hosts / additionalProperties / items / properties / sni / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +]
- Changed
marzban_nodes_list13 fields changed- removed
Input schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / properties / nodes / items / properties / api_port / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / nodes / items / properties / api_port / minimumRemoved value: --9007199254740991 - removed
Output schema / properties / nodes / items / properties / id / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / nodes / items / properties / id / minimumRemoved value: --9007199254740991 - removed
Output schema / properties / nodes / items / properties / port / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / nodes / items / properties / port / minimumRemoved value: --9007199254740991 - removed
Output schema / properties / usage / items / properties / downlink / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / usage / items / properties / downlink / minimumRemoved value: --9007199254740991 - changed
Output schema / properties / usage / items / properties / node_id / anyOfPrevious value: -[ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / usage / items / properties / uplink / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / usage / items / properties / uplink / minimumRemoved value: --9007199254740991
- Added
marzban_subscription_get - Removed
marzban_subscription_info - Added
marzban_system_get_inbounds - Added
marzban_system_get_stats - Removed
marzban_system_inbounds - Removed
marzban_system_stats - Changed
marzban_users_activate18 fields changed- removed
Input schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / properties / admin / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "discord_webhook": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "is_sudo": { - "type": "boolean" - }, - "telegram_id": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "username": { - "type": "string" - }, - "users_usage": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "username", - "is_sudo" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "discord_webhook": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "is_sudo": { + "type": "boolean" + }, + "telegram_id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "username": { + "type": "string" + }, + "users_usage": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "username", + "is_sudo" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / auto_delete_in_days / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Output schema / properties / data_limit / anyOfPrevious value: -[ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / excluded_inbounds / propertiesRemoved value: -{} - changed
Output schema / properties / expire / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / inbounds / propertiesRemoved value: -{} - removed
Output schema / properties / lifetime_used_traffic / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / lifetime_used_traffic / minimumRemoved value: --9007199254740991 - changed
Output schema / properties / next_plan / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "add_remaining_traffic": { - "default": false, - "type": "boolean" - }, - "data_limit": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "expire": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "fire_on_either": { - "default": true, - "type": "boolean" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "add_remaining_traffic": { + "default": false, + "type": "boolean" + }, + "data_limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "expire": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "fire_on_either": { + "default": true, + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / note / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / on_hold_expire_duration / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / proxies / additionalProperties / propertiesRemoved value: -{} - removed
Output schema / properties / proxies / propertiesRemoved value: -{} - changed
Output schema / properties / sub_last_user_agent / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / used_traffic / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / used_traffic / minimumRemoved value: --9007199254740991
- Changed
marzban_users_create22 fields changed- removed
Input schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / dataLimit / anyOfPrevious value: -[ - { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - { - "pattern": "^\\d+(?:[.,]\\d+)?\\s*(B|KB|KIB|MB|MIB|GB|GIB|TB|TIB|PB|PIB)?$", - "type": "string" - } -]New value: +[ + { + "minimum": 0, + "type": "integer" + }, + { + "pattern": "^\\d+(?:[.,]\\d+)?\\s*(B|KB|KIB|MB|MIB|GB|GIB|TB|TIB|PB|PIB)?$", + "type": "string" + } +] - changed
Input schema / properties / expire / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } -]New value: +[ + { + "type": "string" + }, + { + "minimum": 0, + "type": "integer" + } +] - removed
Input schema / properties / onHoldExpireDuration / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / templateId / maximumRemoved value: -9007199254740991 - removed
Output schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / properties / admin / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "discord_webhook": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "is_sudo": { - "type": "boolean" - }, - "telegram_id": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "username": { - "type": "string" - }, - "users_usage": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "username", - "is_sudo" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "discord_webhook": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "is_sudo": { + "type": "boolean" + }, + "telegram_id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "username": { + "type": "string" + }, + "users_usage": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "username", + "is_sudo" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / auto_delete_in_days / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Output schema / properties / data_limit / anyOfPrevious value: -[ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / excluded_inbounds / propertiesRemoved value: -{} - changed
Output schema / properties / expire / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / inbounds / propertiesRemoved value: -{} - removed
Output schema / properties / lifetime_used_traffic / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / lifetime_used_traffic / minimumRemoved value: --9007199254740991 - changed
Output schema / properties / next_plan / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "add_remaining_traffic": { - "default": false, - "type": "boolean" - }, - "data_limit": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "expire": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "fire_on_either": { - "default": true, - "type": "boolean" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "add_remaining_traffic": { + "default": false, + "type": "boolean" + }, + "data_limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "expire": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "fire_on_either": { + "default": true, + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / note / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / on_hold_expire_duration / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / proxies / additionalProperties / propertiesRemoved value: -{} - removed
Output schema / properties / proxies / propertiesRemoved value: -{} - changed
Output schema / properties / sub_last_user_agent / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / used_traffic / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / used_traffic / minimumRemoved value: --9007199254740991
- Changed
marzban_users_deactivate18 fields changed- removed
Input schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / properties / admin / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "discord_webhook": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "is_sudo": { - "type": "boolean" - }, - "telegram_id": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "username": { - "type": "string" - }, - "users_usage": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "username", - "is_sudo" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "discord_webhook": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "is_sudo": { + "type": "boolean" + }, + "telegram_id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "username": { + "type": "string" + }, + "users_usage": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "username", + "is_sudo" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / auto_delete_in_days / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Output schema / properties / data_limit / anyOfPrevious value: -[ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / excluded_inbounds / propertiesRemoved value: -{} - changed
Output schema / properties / expire / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / inbounds / propertiesRemoved value: -{} - removed
Output schema / properties / lifetime_used_traffic / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / lifetime_used_traffic / minimumRemoved value: --9007199254740991 - changed
Output schema / properties / next_plan / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "add_remaining_traffic": { - "default": false, - "type": "boolean" - }, - "data_limit": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "expire": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "fire_on_either": { - "default": true, - "type": "boolean" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "add_remaining_traffic": { + "default": false, + "type": "boolean" + }, + "data_limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "expire": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "fire_on_either": { + "default": true, + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / note / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / on_hold_expire_duration / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / proxies / additionalProperties / propertiesRemoved value: -{} - removed
Output schema / properties / proxies / propertiesRemoved value: -{} - changed
Output schema / properties / sub_last_user_agent / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / used_traffic / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / used_traffic / minimumRemoved value: --9007199254740991
- Changed
marzban_users_extend19 fields changed- removed
Input schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / addData / anyOfPrevious value: -[ - { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - { - "pattern": "^\\d+(?:[.,]\\d+)?\\s*(B|KB|KIB|MB|MIB|GB|GIB|TB|TIB|PB|PIB)?$", - "type": "string" - } -]New value: +[ + { + "minimum": 0, + "type": "integer" + }, + { + "pattern": "^\\d+(?:[.,]\\d+)?\\s*(B|KB|KIB|MB|MIB|GB|GIB|TB|TIB|PB|PIB)?$", + "type": "string" + } +] - removed
Output schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / properties / user / properties / admin / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "discord_webhook": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "is_sudo": { - "type": "boolean" - }, - "telegram_id": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "username": { - "type": "string" - }, - "users_usage": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "username", - "is_sudo" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "discord_webhook": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "is_sudo": { + "type": "boolean" + }, + "telegram_id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "username": { + "type": "string" + }, + "users_usage": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "username", + "is_sudo" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / user / properties / auto_delete_in_days / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Output schema / properties / user / properties / data_limit / anyOfPrevious value: -[ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / user / properties / excluded_inbounds / propertiesRemoved value: -{} - changed
Output schema / properties / user / properties / expire / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / user / properties / inbounds / propertiesRemoved value: -{} - removed
Output schema / properties / user / properties / lifetime_used_traffic / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / user / properties / lifetime_used_traffic / minimumRemoved value: --9007199254740991 - changed
Output schema / properties / user / properties / next_plan / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "add_remaining_traffic": { - "default": false, - "type": "boolean" - }, - "data_limit": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "expire": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "fire_on_either": { - "default": true, - "type": "boolean" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "add_remaining_traffic": { + "default": false, + "type": "boolean" + }, + "data_limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "expire": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "fire_on_either": { + "default": true, + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / user / properties / note / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / user / properties / on_hold_expire_duration / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / user / properties / proxies / additionalProperties / propertiesRemoved value: -{} - removed
Output schema / properties / user / properties / proxies / propertiesRemoved value: -{} - changed
Output schema / properties / user / properties / sub_last_user_agent / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / user / properties / used_traffic / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / user / properties / used_traffic / minimumRemoved value: --9007199254740991
- Changed
marzban_users_get18 fields changed- removed
Input schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / properties / user / properties / admin / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "discord_webhook": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "is_sudo": { - "type": "boolean" - }, - "telegram_id": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "username": { - "type": "string" - }, - "users_usage": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "username", - "is_sudo" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "discord_webhook": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "is_sudo": { + "type": "boolean" + }, + "telegram_id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "username": { + "type": "string" + }, + "users_usage": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "username", + "is_sudo" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / user / properties / auto_delete_in_days / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Output schema / properties / user / properties / data_limit / anyOfPrevious value: -[ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / user / properties / excluded_inbounds / propertiesRemoved value: -{} - changed
Output schema / properties / user / properties / expire / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / user / properties / inbounds / propertiesRemoved value: -{} - removed
Output schema / properties / user / properties / lifetime_used_traffic / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / user / properties / lifetime_used_traffic / minimumRemoved value: --9007199254740991 - changed
Output schema / properties / user / properties / next_plan / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "add_remaining_traffic": { - "default": false, - "type": "boolean" - }, - "data_limit": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "expire": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "fire_on_either": { - "default": true, - "type": "boolean" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "add_remaining_traffic": { + "default": false, + "type": "boolean" + }, + "data_limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "expire": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "fire_on_either": { + "default": true, + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / user / properties / note / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / user / properties / on_hold_expire_duration / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / user / properties / proxies / additionalProperties / propertiesRemoved value: -{} - removed
Output schema / properties / user / properties / proxies / propertiesRemoved value: -{} - changed
Output schema / properties / user / properties / sub_last_user_agent / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / user / properties / used_traffic / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / user / properties / used_traffic / minimumRemoved value: --9007199254740991
- Added
marzban_users_get_usage - Changed
marzban_users_hold19 fields changed- removed
Input schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / properties / onHoldExpireDuration / maximumRemoved value: -9007199254740991 - removed
Output schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / properties / admin / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "discord_webhook": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "is_sudo": { - "type": "boolean" - }, - "telegram_id": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "username": { - "type": "string" - }, - "users_usage": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "username", - "is_sudo" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "discord_webhook": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "is_sudo": { + "type": "boolean" + }, + "telegram_id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "username": { + "type": "string" + }, + "users_usage": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "username", + "is_sudo" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / auto_delete_in_days / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Output schema / properties / data_limit / anyOfPrevious value: -[ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / excluded_inbounds / propertiesRemoved value: -{} - changed
Output schema / properties / expire / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / inbounds / propertiesRemoved value: -{} - removed
Output schema / properties / lifetime_used_traffic / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / lifetime_used_traffic / minimumRemoved value: --9007199254740991 - changed
Output schema / properties / next_plan / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "add_remaining_traffic": { - "default": false, - "type": "boolean" - }, - "data_limit": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "expire": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "fire_on_either": { - "default": true, - "type": "boolean" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "add_remaining_traffic": { + "default": false, + "type": "boolean" + }, + "data_limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "expire": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "fire_on_either": { + "default": true, + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / note / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / on_hold_expire_duration / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / proxies / additionalProperties / propertiesRemoved value: -{} - removed
Output schema / properties / proxies / propertiesRemoved value: -{} - changed
Output schema / properties / sub_last_user_agent / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / used_traffic / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / used_traffic / minimumRemoved value: --9007199254740991
- Changed
marzban_users_list20 fields changed- removed
Input schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / properties / limit / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / offset / maximumRemoved value: -9007199254740991 - removed
Output schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / properties / users / items / properties / admin / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "discord_webhook": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "is_sudo": { - "type": "boolean" - }, - "telegram_id": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "username": { - "type": "string" - }, - "users_usage": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "username", - "is_sudo" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "discord_webhook": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "is_sudo": { + "type": "boolean" + }, + "telegram_id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "username": { + "type": "string" + }, + "users_usage": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "username", + "is_sudo" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / users / items / properties / auto_delete_in_days / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Output schema / properties / users / items / properties / data_limit / anyOfPrevious value: -[ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / users / items / properties / excluded_inbounds / propertiesRemoved value: -{} - changed
Output schema / properties / users / items / properties / expire / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / users / items / properties / inbounds / propertiesRemoved value: -{} - removed
Output schema / properties / users / items / properties / lifetime_used_traffic / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / users / items / properties / lifetime_used_traffic / minimumRemoved value: --9007199254740991 - changed
Output schema / properties / users / items / properties / next_plan / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "add_remaining_traffic": { - "default": false, - "type": "boolean" - }, - "data_limit": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "expire": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "fire_on_either": { - "default": true, - "type": "boolean" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "add_remaining_traffic": { + "default": false, + "type": "boolean" + }, + "data_limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "expire": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "fire_on_either": { + "default": true, + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / users / items / properties / note / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / users / items / properties / on_hold_expire_duration / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / users / items / properties / proxies / additionalProperties / propertiesRemoved value: -{} - removed
Output schema / properties / users / items / properties / proxies / propertiesRemoved value: -{} - changed
Output schema / properties / users / items / properties / sub_last_user_agent / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / users / items / properties / used_traffic / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / users / items / properties / used_traffic / minimumRemoved value: --9007199254740991
- Changed
marzban_users_update20 fields changed- removed
Input schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / dataLimit / anyOfPrevious value: -[ - { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - { - "pattern": "^\\d+(?:[.,]\\d+)?\\s*(B|KB|KIB|MB|MIB|GB|GIB|TB|TIB|PB|PIB)?$", - "type": "string" - } -]New value: +[ + { + "minimum": 0, + "type": "integer" + }, + { + "pattern": "^\\d+(?:[.,]\\d+)?\\s*(B|KB|KIB|MB|MIB|GB|GIB|TB|TIB|PB|PIB)?$", + "type": "string" + } +] - changed
Input schema / properties / expire / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } -]New value: +[ + { + "type": "string" + }, + { + "minimum": 0, + "type": "integer" + } +] - removed
Output schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / properties / admin / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "discord_webhook": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "is_sudo": { - "type": "boolean" - }, - "telegram_id": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "username": { - "type": "string" - }, - "users_usage": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "username", - "is_sudo" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "discord_webhook": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "is_sudo": { + "type": "boolean" + }, + "telegram_id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "username": { + "type": "string" + }, + "users_usage": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "username", + "is_sudo" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / auto_delete_in_days / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Output schema / properties / data_limit / anyOfPrevious value: -[ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / excluded_inbounds / propertiesRemoved value: -{} - changed
Output schema / properties / expire / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / inbounds / propertiesRemoved value: -{} - removed
Output schema / properties / lifetime_used_traffic / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / lifetime_used_traffic / minimumRemoved value: --9007199254740991 - changed
Output schema / properties / next_plan / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "add_remaining_traffic": { - "default": false, - "type": "boolean" - }, - "data_limit": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "expire": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "fire_on_either": { - "default": true, - "type": "boolean" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "add_remaining_traffic": { + "default": false, + "type": "boolean" + }, + "data_limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "expire": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "fire_on_either": { + "default": true, + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / note / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / on_hold_expire_duration / anyOfPrevious value: -[ - { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Output schema / properties / proxies / additionalProperties / propertiesRemoved value: -{} - removed
Output schema / properties / proxies / propertiesRemoved value: -{} - changed
Output schema / properties / sub_last_user_agent / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / used_traffic / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / used_traffic / minimumRemoved value: --9007199254740991
- Removed
marzban_users_usage
9 tool updates
v0.2.3- Changed
marzban_subscription_info5 fields changed- removed
Output schema / properties / created_at / formatRemoved value: -"date-time" - removed
Output schema / properties / created_at / patternRemoved value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$" - changed
Output schema / properties / on_hold_timeout / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / online_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / sub_updated_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +]
- Changed
marzban_users_activate5 fields changed- removed
Output schema / properties / created_at / formatRemoved value: -"date-time" - removed
Output schema / properties / created_at / patternRemoved value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$" - changed
Output schema / properties / on_hold_timeout / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / online_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / sub_updated_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +]
- Changed
marzban_users_create6 fields changed- changed
Input schema / properties / proxies / descriptionPrevious value: -"Protocol name -> settings, e.g. {\"vless\": {\"id\": \"<uuid>\"}}. Omit to leave unchanged (update) or use server defaults (create)."New value: +"Protocol name -> settings, e.g. {\"vless\": {\"id\": \"<uuid>\"}} or {\"shadowsocks\": {}} to auto-generate credentials. Omit to leave unchanged on update. On create there is no server default — omitting this (without templateId) errors; provide at least one protocol with a matching inbound configured on the panel." - removed
Output schema / properties / created_at / formatRemoved value: -"date-time" - removed
Output schema / properties / created_at / patternRemoved value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$" - changed
Output schema / properties / on_hold_timeout / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / online_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / sub_updated_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +]
- Changed
marzban_users_deactivate5 fields changed- removed
Output schema / properties / created_at / formatRemoved value: -"date-time" - removed
Output schema / properties / created_at / patternRemoved value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$" - changed
Output schema / properties / on_hold_timeout / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / online_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / sub_updated_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +]
- Changed
marzban_users_extend5 fields changed- removed
Output schema / properties / user / properties / created_at / formatRemoved value: -"date-time" - removed
Output schema / properties / user / properties / created_at / patternRemoved value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$" - changed
Output schema / properties / user / properties / on_hold_timeout / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / user / properties / online_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / user / properties / sub_updated_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +]
- Changed
marzban_users_get5 fields changed- removed
Output schema / properties / user / properties / created_at / formatRemoved value: -"date-time" - removed
Output schema / properties / user / properties / created_at / patternRemoved value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$" - changed
Output schema / properties / user / properties / on_hold_timeout / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / user / properties / online_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / user / properties / sub_updated_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +]
- Changed
marzban_users_hold5 fields changed- removed
Output schema / properties / created_at / formatRemoved value: -"date-time" - removed
Output schema / properties / created_at / patternRemoved value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$" - changed
Output schema / properties / on_hold_timeout / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / online_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / sub_updated_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +]
- Changed
marzban_users_list5 fields changed- removed
Output schema / properties / users / items / properties / created_at / formatRemoved value: -"date-time" - removed
Output schema / properties / users / items / properties / created_at / patternRemoved value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$" - changed
Output schema / properties / users / items / properties / on_hold_timeout / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / users / items / properties / online_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / users / items / properties / sub_updated_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +]
- Changed
marzban_users_update6 fields changed- changed
Input schema / properties / proxies / descriptionPrevious value: -"Protocol name -> settings, e.g. {\"vless\": {\"id\": \"<uuid>\"}}. Omit to leave unchanged (update) or use server defaults (create)."New value: +"Protocol name -> settings, e.g. {\"vless\": {\"id\": \"<uuid>\"}} or {\"shadowsocks\": {}} to auto-generate credentials. Omit to leave unchanged on update. On create there is no server default — omitting this (without templateId) errors; provide at least one protocol with a matching inbound configured on the panel." - removed
Output schema / properties / created_at / formatRemoved value: -"date-time" - removed
Output schema / properties / created_at / patternRemoved value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$" - changed
Output schema / properties / on_hold_timeout / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / online_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / sub_updated_at / anyOfPrevious value: -[ - { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "null" + } +]
15 tool updates
v0.2.2- First observed
marzban_config_get - First observed
marzban_hosts_get - First observed
marzban_nodes_list - First observed
marzban_subscription_info - First observed
marzban_system_inbounds - First observed
marzban_system_stats - First observed
marzban_users_activate - First observed
marzban_users_create - First observed
marzban_users_deactivate - First observed
marzban_users_extend - First observed
marzban_users_get - First observed
marzban_users_hold - First observed
marzban_users_list - First observed
marzban_users_update - First observed
marzban_users_usage
TDQS
Scored across 15 tools
Tools are clearly separated by resource and action, and the descriptions explicitly distinguish potentially overlapping operations such as status changes, renewal, and partial update. Cross-references between config_get and system_get_inbounds, and between users_get and subscription_get, further reduce misselection risk.
All tools follow a consistent marzban_<resource>_<action> snake_case pattern. Compound actions like get_inbounds and get_usage still fit the same predictable convention.
With 15 tools, the set is well-scoped and each tool has a clear purpose within user, node, subscription, system, or config administration. There is no obvious filler or redundant tool.
User lifecycle coverage is strong for create/get/list/update/status/renew/usage, but there is no delete-user operation. Node, host, and config surfaces are mostly read-only or list-only, so common admin tasks like removing a user or managing nodes/hosts have no tool path.
Maintenance
Related MCP Connectors
MCP server for mandates, delegation, policy-gated execution, credential grants, and audit.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
A paid remote MCP for CLI tool MCP, built to return verdicts, receipts, usage logs, and audit-ready
MCP server for Pentest-Tools.com: run scans, manage findings and reports via your preffered LLM.
Related MCP Servers
- AlicenseBqualityAmaintenanceProduction-grade MCP server for MikroTik RouterOS with secure AI-native network automation.133731 npm84MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to manage pfSense firewalls using 17 tools for system status, firewall rules, DHCP, DNS, monitoring, and service management via the pfSense REST API.2038 PyPI6MIT
- AlicenseNot gradedqualityCmaintenanceLocal-first CLI + proxy that curates your MCP servers per client from one canonical config, cutting tool-schema tokens ~80% and resolving secret references instead of hardcoding keys.MIT
- AlicenseAqualityBmaintenanceMCP server for Proxmox VE and Proxmox Datacenter Manager, covering every API endpoint via six consolidated tools for list, describe, and call operations with a read-only safety gate.616 npm2AGPL 3.0