mcp-remnawave
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| REMNAWAVE_API_KEY | No | X-Api-Key for a reverse proxy in front of the panel | |
| REMNAWAVE_BASE_URL | Yes | Panel URL, e.g. https://panel.example.com (required) | |
| REMNAWAVE_ENV_FILE | No | Explicit path to a config file | |
| REMNAWAVE_READONLY | No | true = only tools that read are registered (recommended to start with) | false |
| REMNAWAVE_TOOLSETS | No | Comma-separated toolsets to register, e.g. users,nodes,hosts (default is all) | |
| REMNAWAVE_API_TOKEN | Yes | API token (Bearer) — Panel → API tokens (required) | |
| REMNAWAVE_TIMEOUT_MS | No | Timeout for one request to the panel | 30000 |
| REMNAWAVE_TOOLS_EXCLUDE | No | Comma-separated tool names to leave out; * is a wildcard (e.g. users_bulk_*) | |
| REMNAWAVE_ALLOW_DESTRUCTIVE | No | false = tools that delete data or act on every user/node are not registered | true |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| users_listB | List users with offset pagination and optional TanStack-style filters. To find users by telegramId, email, tag, status etc. pass filters, e.g. [{"id":"telegramId","value":123456789}]. Users are identified by numeric id. |
| users_streamB | Get all users using cursor-based (keyset) pagination with filtering options |
| users_getC | Get user by ID |
| users_get_by_usernameC | Get user by username |
| users_get_by_short_uuidC | Get user by Short UUID |
| users_resolveA | Resolve a user by EXACTLY ONE of: id, shortUuid, username |
| users_tags_listC | Get users tags |
| users_accessible_nodesA | Which nodes a user can actually reach: per node — config profile, active squads and their inbounds. Handy for debugging squad/inbound routing. |
| users_subscription_request_historyA | Get user subscription request history, recent 24 records |
| users_createA | Create a user. Credentials (vlessUuid/ssPassword/trojanPassword/shortUuid) are generated by the panel unless given — pass them explicitly for service users. |
| users_updateC | Update a user. Identify by id OR username. |
| users_deleteC | Delete user |
| users_enableC | Enable user |
| users_disableC | Disable user |
| users_revoke_subscriptionB | Revoke user subscription: rotates the subscription link (and credentials unless told otherwise) |
| users_reset_trafficC | Reset user traffic |
| users_extend_expirationA | Extend user expiration date. If user status is EXPIRED, the new expiration date is calculated from the current date and the user becomes ACTIVE. If user status is ACTIVE, the given number of days is added to the existing expiration date. DISABLED and LIMITED users will be extended, but their status will not change. |
| users_bulk_updateC | Bulk update users by User IDs |
| users_bulk_update_squadsC | Bulk update users internal squads by User IDs |
| users_bulk_extend_expirationC | Extend expiration date for specified users by days |
| users_bulk_reset_trafficC | Bulk reset traffic users by User IDs |
| users_bulk_revoke_subscriptionC | Revoke users subscription by User IDs |
| users_bulk_deleteC | Bulk delete users by User IDs |
| users_bulk_delete_by_statusB | Delete ALL users that have the given status |
| users_bulk_all_updateC | Update EVERY user at once |
| users_bulk_all_reset_trafficA | Reset used traffic for EVERY user |
| users_bulk_all_extend_expirationA | Extend expiration date for EVERY user by days |
| nodes_listA | List all nodes. Compact by default: inbounds as tags, provider as name, system info trimmed. Pass full=true for the raw panel response, or use nodes_get for one node. |
| nodes_getC | Get node by UUID |
| nodes_tags_listC | Get nodes tags |
| nodes_createD | Create a new node |
| nodes_updateD | Update node |
| nodes_deleteC | Delete a node |
| nodes_enableC | Enable a node |
| nodes_disableC | Disable a node |
| nodes_restartC | Restart node |
| nodes_restart_allB | Restart EVERY node |
| nodes_reset_trafficC | Reset Node Traffic |
| nodes_reorderD | Reorder nodes |
| nodes_bulk_actionsC | Perform actions for many nodes |
| nodes_bulk_updateD | Update many nodes |
| nodes_bulk_profile_modificationC | Modify Inbounds & Profile for many nodes |
| keygen_getB | Get SECRET_KEY for Remnawave Node |
| node_integrations_listB | Get all Node Integrations |
| node_integrations_getC | Get Node Integration by uuid |
| node_integrations_createD | Create Node Integration |
| node_integrations_updateD | Update Node Integration |
| node_integrations_deleteC | Delete Node Integration |
| hosts_listC | Get hosts |
| hosts_getC | Get a host by UUID |
| hosts_tags_listB | Get tags of hosts |
| hosts_createC | Create a new host |
| hosts_updateC | Update a host |
| hosts_cloneC | Clone host |
| hosts_deleteC | Delete a host by UUID |
| hosts_reorderD | Reorder hosts |
| hosts_bulk_enableC | Enable hosts by UUIDs |
| hosts_bulk_disableC | Disable hosts by UUIDs |
| hosts_bulk_updateB | Update many hosts at once: the given fields (same as hosts_update) are applied to every host in |
| hosts_bulk_deleteC | Delete hosts by UUIDs |
| config_profiles_listA | List config profiles with their inbounds and nodes. The xray config itself is left out: use config_profiles_get for one profile, or full=true. |
| config_profiles_getB | Get config profile by uuid |
| config_profiles_get_computed_configB | Get computed config profile by uuid |
| config_profiles_get_inboundsC | Get inbounds by profile uuid |
| inbounds_listA | List inbounds of all config profiles (tag, type, port, squads). full=true adds the raw xray inbound objects. |
| config_profiles_tags_listB | Get tags of Config Profiles |
| config_profiles_createC | Create config profile |
| config_profiles_updateA | Update a config profile: name and/or the full xray config. Nodes that use the profile restart xray to apply it. |
| config_profiles_set_tagsC | Set tags of Config Profile |
| config_profiles_reorderC | Reorder config profiles |
| config_profiles_deleteC | Delete config profile |
| snippets_listC | Get snippets |
| snippets_createD | Create snippet |
| snippets_updateD | Update snippet |
| snippets_syncB | Sync snippet to affected config profiles. Trigger the sync of a snippet to all config profiles that reference it. Nodes which use affected config profiles will be restarted. |
| snippets_deleteC | Delete snippet |
| squads_listB | List internal squads with their inbounds. full=true adds the raw xray inbound objects. |
| squads_getB | Get internal squad by uuid |
| squads_accessible_nodesD | Get internal squad accessible nodes |
| squads_tags_listB | Get tags of Internal Squads |
| squads_createC | Create internal squad |
| squads_updateC | Update internal squad |
| squads_set_tagsC | Set tags of Internal Squad |
| squads_reorderC | Reorder internal squads |
| squads_add_many_usersC | Add many users to internal squad |
| squads_remove_many_usersC | Delete many users from internal squad |
| squads_add_all_usersA | Add EVERY user to an internal squad. For selected users use squads_add_many_users. |
| squads_remove_all_usersA | Remove EVERY user from an internal squad. For selected users use squads_remove_many_users. |
| squads_deleteC | Delete internal squad |
| external_squads_listB | Get all external squads |
| external_squads_getC | Get external squad by uuid |
| external_squads_tags_listB | Get tags of External Squads |
| external_squads_createC | Create external squad |
| external_squads_updateD | Update external squad |
| external_squads_set_tagsC | Set tags of External Squad |
| external_squads_reorderC | Reorder external squads |
| external_squads_add_all_usersB | Add EVERY user to an external squad |
| external_squads_remove_all_usersB | Remove EVERY user from an external squad |
| external_squads_deleteC | Delete external squad |
| hwid_devices_listC | Get user HWID devices |
| hwid_devices_list_allB | Get HWID devices. Please note that the filters here are primarily intended for use by the frontend and rely on expensive operators such as LIKE under the hood. Misusing these filters may negatively impact the performance of your database. |
| hwid_statsC | Get HWID devices stats |
| hwid_top_usersB | Get top users by HWID devices |
| hwid_device_createC | Create a user HWID device |
| hwid_device_deleteC | Delete a user HWID device |
| hwid_devices_delete_allB | Delete all user HWID devices |
| subscriptions_listC | Get all subscriptions |
| subscriptions_get_by_user_idC | Get subscription by User ID |
| subscriptions_get_by_usernameC | Get subscription by username |
| subscriptions_get_by_short_uuidB | Get subscription by short uuid (protected route) |
| subscriptions_get_raw_by_short_uuidD | Get Raw Subscription by Short UUID |
| subscriptions_get_connection_keysB | Get connection keys (base64 format) by user id |
| subscription_infoC | Get Subscription Info by Short UUID |
| subscription_request_history_listA | Get all subscription request history. Please note that the filters here are primarily intended for use by the frontend and rely on expensive operators such as LIKE under the hood. Misusing these filters may negatively impact the performance of your database. |
| subscription_request_history_statsC | Get subscription request history stats |
| subscription_settings_getC | Get subscription settings |
| subscription_settings_updateD | Update subscription settings |
| subscription_templates_listB | Get all subscription templates (wihout content) |
| subscription_templates_getC | Get subscription template by uuid |
| subscription_templates_tags_listB | Get tags of Subscription Templates |
| subscription_templates_createC | Create subscription template |
| subscription_templates_updateC | Update subscription template |
| subscription_templates_set_tagsC | Set tags of Subscription Template |
| subscription_templates_reorderC | Reorder subscription templates |
| subscription_templates_deleteC | Delete subscription template |
| sub_page_configs_listB | Get all subscription page configs |
| sub_page_configs_getC | Get subscription page config by uuid |
| sub_page_configs_tags_listB | Get tags of Subpage Configs |
| sub_page_configs_createC | Create subscription page config |
| sub_page_configs_updateC | Update subscription page config |
| sub_page_configs_cloneC | Clone subscription page config |
| sub_page_configs_set_tagsC | Set tags of Subpage Config |
| sub_page_configs_reorderC | Reorder subscription page configs |
| sub_page_configs_deleteC | Delete subscription page config |
| node_plugins_listB | Get all Node Plugins |
| node_plugins_getC | Get Node Plugin by uuid |
| node_plugins_tags_listB | Get tags of Node Plugins |
| node_plugins_createC | Create Node Plugin |
| node_plugins_updateD | Update Node Plugin |
| node_plugins_cloneD | Clone Node Plugin |
| node_plugins_set_tagsC | Set tags of Node Plugin |
| node_plugins_reorderC | Reorder Node Plugins |
| node_plugins_syncA | Sync Node Plugin to nodes. Push the current plugin config, including referenced shared lists, to every connected node this plugin is active on. |
| node_plugins_executeC | Execute command on node plugins |
| node_plugins_deleteC | Delete Node Plugin |
| node_plugins_torrent_reportsB | Get Torrent Blocker Reports. Please note that the filters here are primarily intended for use by the frontend and rely on expensive operators such as LIKE under the hood. Misusing these filters may negatively impact the performance of your database. |
| node_plugins_torrent_statsC | Get Torrent Blocker Reports Stats |
| node_plugins_torrent_truncateC | Truncate Torrent Blocker Reports |
| shared_lists_listA | Get Shared Lists (Preview). Returns only the name, type and item count of every shared list. Use "Get Shared List by name" to fetch the items themselves. |
| shared_lists_getC | Get Shared List by name |
| shared_lists_createC | Create Shared List |
| shared_lists_updateD | Update Shared List |
| shared_lists_syncB | Sync Shared List to nodes. Push every plugin referencing this shared list to the nodes it is active on. |
| shared_lists_deleteC | Delete Shared List by name |
| connections_by_user_requestA | Request the active connections (IPs) of a user. Starts a job on the node(s) and returns a jobId — fetch the outcome with connections_by_user_result. |
| connections_by_user_resultC | Get Connections for User by Job ID |
| connections_by_node_requestA | Request the active connections on a node. Starts a job on the node(s) and returns a jobId — fetch the outcome with connections_by_node_result. |
| connections_by_node_resultC | Get Connections for Node by Job ID |
| connections_geocheck_requestA | Check how a node's exit IP is geolocated. Starts a job on the node(s) and returns a jobId — fetch the outcome with connections_geocheck_result. |
| connections_geocheck_resultC | Get Geocheck for Node by Job ID |
| connections_dropC | Drop Connections for Users or IPs |
| system_statsD | Get Stats |
| system_stats_recapD | Get Recap |
| system_stats_digestA | Get Stats Digest. Aggregated statistics for a datetime range [start, end): created and expired users, total traffic, traffic spent by users created within the range and new HWID devices. Per-user traffic history is stored with daily granularity (UTC), so the "traffic by new users" metric snaps to whole days at the range edges. |
| system_http_statsC | Get HTTP Stats |
| system_bandwidth_statsC | Get Bandwidth Stats |
| system_nodes_statisticsC | Get Nodes Statistics |
| system_nodes_metricsC | Get Nodes Metrics |
| bandwidth_nodes_usageC | Get Nodes Usage by Range |
| bandwidth_node_usersC | Get Node Users Usage by Node UUID |
| bandwidth_nodes_usersC | Get Nodes Users Usage by Nodes UUIDs |
| bandwidth_nodes_usage_thresholdA | Get users exceeding a traffic threshold on the given nodes for a period. Returns users whose total usage over the period on the given nodes is >= minTotalBytes. Underlying usage data is flushed to the database roughly every 2 minutes. |
| bandwidth_user_usageC | Get User Usage by Range |
| bandwidth_squad_usageA | Get internal squad users traffic usage for a period. Returns users whose total usage over the period on the given nodes is >= minTotalBytes, scoped to the nodes reachable via the internal squad inbounds. Underlying usage data is flushed to the database roughly every 2 minutes. |
| bandwidth_squad_user_usageC | Get a single user daily traffic usage on the internal squad nodes for a period. Returns users whose total usage over the period on the given nodes is >= minTotalBytes, scoped to the nodes reachable via the Internal Squad inbounds. Every day in the range is present (zero-filled). Underlying usage data is flushed to the database roughly every 2 minutes. |
| system_healthC | Get Remnawave Health |
| system_metadataA | Get panel version and build information |
| system_configurationB | Get Remnawave Configuration. Returns some of the configuration values. |
| system_generate_x25519B | Generate 30 X25519 keypairs |
| system_srr_matcherB | Validate a subscription response rules (SRR) config against the panel matcher. The body is the full responseRules config object, not an input string. |
| auth_statusC | Get the status of the authentication |
| settings_getC | Get Remnawave settings |
| settings_updateC | Update Remnawave settings |
| api_tokens_listA | Get all API tokens. This endpoint is forbidden to use via "API-key". It can only be used with admin JWT-token. |
| api_tokens_scopesA | Get available API token scopes. Returns the catalog of scopes that can be granted to an API token, grouped by resource. Forbidden via "API-key", admin JWT only. |
| api_tokens_createA | Create a new API token. This endpoint is forbidden to use via "API-key". It can only be used with an admin JWT-token. |
| api_tokens_deleteA | Delete API token. This endpoint is forbidden to use via "API-key". It can be used only with an admin JWT-token. |
| metadata_node_getC | Get node metadata |
| metadata_node_upsertC | Update or create Node Metadata |
| metadata_user_getC | Get user metadata |
| metadata_user_upsertC | Update or create User Metadata |
| billing_providers_listB | Get all infra providers |
| billing_provider_getC | Get infra provider by uuid |
| billing_provider_createC | Create infra provider |
| billing_provider_updateD | Update infra provider |
| billing_provider_deleteC | Delete infra provider by uuid |
| billing_nodes_listC | Get infra billing nodes |
| billing_node_createC | Create infra billing node |
| billing_node_updateC | Update infra billing nodes |
| billing_node_deleteC | Delete infra billing node |
| billing_history_listC | Get infra billing history |
| billing_history_createC | Create infra billing history |
| billing_history_deleteC | Delete infra billing history |
| api_requestA | Send a raw request to the panel REST API with the configured token. Use it only for endpoints no dedicated tool covers. All methods are allowed. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| create_user_wizard | Step-by-step guide to create a new VPN user |
| node_diagnostics | Diagnose issues with a specific node |
| traffic_report | Generate a traffic usage report |
| user_audit | Complete audit of a specific user |
| bulk_user_cleanup | Find and manage expired or inactive users |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| panel-stats | Current Remnawave panel statistics (users, nodes, traffic, system) |
| panel-nodes | Status of all Remnawave nodes (online/offline, traffic) |
| panel-health | Remnawave panel health check |
TDQS
Scored across 204 tools
Tools are generally named by resource and action, but several overlapping getters/resolvers exist (e.g., users_get, users_get_by_username, users_get_by_short_uuid, users_resolve; multiple subscription getters; generic nodes_bulk_actions vs specific bulk tools). The sheer number of closely related bulk and stats tools creates selection friction, though descriptions usually clarify intent.
Names predominantly follow a snake_case resource_action pattern (users_list, nodes_create, hosts_update). Minor inconsistencies appear in singular/plural prefixes and special cases like api_request, auth_status, keygen_get, subscription_info, and metadata_node_get vs nodes_get.
204 tools is an extreme mismatch for an MCP server; even a comprehensive panel API can be exposed more compactly. This volume makes tool selection impractical and exceeds any reasonable agent context.
The surface covers the full Remnawave domain: users, nodes, hosts, config profiles, squads, subscriptions, templates, plugins, shared lists, billing, stats, and more, with CRUD and bulk operations. A raw api_request fallback further covers any unlisted endpoints, so no obvious gaps remain.