remnawave-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| REMNAWAVE_API_KEY | No | Value for the X-Api-Key header when the panel is behind Caddy with a secret path. | |
| REMNAWAVE_PRIVACY | No | Privacy mode: strict (default), basic, or off. | strict |
| REMNAWAVE_BASE_URL | Yes | Remnawave panel address, e.g. https://panel.example.com (without /api) | |
| REMNAWAVE_READONLY | No | true by default. Set to false to enable write commands (also requires a token with write permissions). | true |
| CF_ACCESS_CLIENT_ID | No | Cloudflare Access client ID when the panel is behind Cloudflare Access. | |
| REMNAWAVE_API_TOKEN | Yes | Remnawave API token | |
| REMNAWAVE_TIMEOUT_MS | No | Request timeout in milliseconds. | 30000 |
| REMNAWAVE_PRIVACY_SALT | No | Any long string used as a salt so pseudonyms do not change after restart. | |
| CF_ACCESS_CLIENT_SECRET | No | Cloudflare Access client secret when the panel is behind Cloudflare Access. | |
| REMNAWAVE_TOOLS_EXCLUDE | No | Comma-separated list of tools to hide. | |
| REMNAWAVE_TOOLS_INCLUDE | No | Comma-separated list of tools to keep; only these tools will be available. | |
| REMNAWAVE_MAX_RESPONSE_CHARS | No | Maximum number of characters for long responses before truncation. | 60000 |
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 | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| find_userB | Find users by any identifier: id, username, shortUuid, telegramId, email or tag. Returns full user objects. Use this instead of guessing which endpoint to call. |
| panel_overviewA | One-call panel summary: users by status and online, node list with online/offline state, users online and traffic per node, bandwidth (2 days / 7 days / month) and subscriptions expiring soon. Start here for "how is the panel doing" questions. |
| user_reportA | Everything about one client in one call: subscription and status, devices (HWID), traffic per day and per node for the last N days, recent subscription requests (apps, IP pseudonyms). Identify the user by id, username, telegramId, email, shortUuid or a pseudonym. |
| sharing_suspectsA | Find clients who probably share their subscription: many different IPs / apps in recent subscription requests, and top users by number of HWID devices. Only counts and pseudonyms are returned. Cheap: reads panel history, does not touch the nodes. |
| geocheck_nodeA | Run GeoCheck on a node and wait for the result (how services see the node IP: country, blocks). Returns a compact report: country per service and GeoIP base, reputation, blocks, one line per route target. Pass full: true for the raw report with every traceroute hop (large); the SVG image is always dropped. Uses node traffic: repeated calls for the same node within the cooldown return the previous result (also with full: true — it does not start a new check). |
| node_connectionsA | Get users currently connected to a node with their IPs and last-seen time (starts a job and waits). |
| user_connectionsA | Get a user's current connections (IPs per node) — starts a job and waits for the result. |
| generate_x25519B | Generate 30 X25519 keypairs [READ] GET /api/system/tools/x25519/generate |
| get_all_inboundsA | Get all inbounds from all config profiles [READ] GET /api/config-profiles/inbounds |
| get_bandwidth_statsC | Get Bandwidth Stats [READ] GET /api/system/stats/bandwidth |
| get_computed_config_profile_by_uuidB | Get computed config profile by uuid [READ] GET /api/config-profiles/:uuid/computed-config |
| get_config_profile_by_uuidB | Get config profile by uuid [READ] GET /api/config-profiles/:uuid |
| get_config_profilesC | Get config profiles [READ] GET /api/config-profiles/ |
| get_configurationB | Get Remnawave Configuration Returns some of the configuration values. [READ] GET /api/system/configuration |
| get_external_squad_by_uuidB | Get external squad by uuid [READ] GET /api/external-squads/:uuid |
| get_external_squadsB | Get all external squads [READ] GET /api/external-squads/ |
| get_hostB | Get a host by UUID [READ] GET /api/hosts/:uuid |
| get_hostsB | Get hosts [READ] GET /api/hosts/ |
| get_hosts_tagsB | Get tags of hosts [READ] GET /api/hosts/tags |
| get_http_statsC | Get HTTP Stats [READ] GET /api/system/stats/http |
| get_hwid_devicesB | 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. [READ] GET /api/hwid/devices |
| get_hwid_devices_statsC | Get HWID devices stats [READ] GET /api/hwid/devices/stats |
| get_inbounds_by_profile_uuidA | Get inbounds by profile uuid [READ] GET /api/config-profiles/:uuid/inbounds |
| get_infra_billing_nodesC | Get infra billing nodes [READ] GET /api/infra-billing/nodes |
| get_infra_billing_recordsB | Get infra billing history [READ] GET /api/infra-billing/history |
| get_infra_providerC | Get infra provider by uuid [READ] GET /api/infra-billing/providers/:uuid |
| get_infra_providersB | Get all infra providers [READ] GET /api/infra-billing/providers |
| get_internal_squadB | Get internal squad by uuid [READ] GET /api/internal-squads/:uuid |
| get_internal_squad_accessible_nodesC | Get internal squad accessible nodes [READ] GET /api/internal-squads/:uuid/accessible-nodes |
| get_internal_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. [READ] GET /api/bandwidth-stats/internal-squads/:uuid/usage |
| get_internal_squad_user_usageA | 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. [READ] GET /api/bandwidth-stats/internal-squads/:squadUuid/users/:userId/usage |
| get_internal_squadsB | Get all internal squads [READ] GET /api/internal-squads/ |
| get_metadataB | Get Remnawave Information [READ] GET /api/system/metadata |
| get_nodeB | Get node by UUID [READ] GET /api/nodes/:uuid Returns a compact view; pass full: true for the raw panel response. |
| get_node_integrationB | Get Node Integration by uuid [READ] GET /api/node-integrations/:uuid |
| get_node_integrationsB | Get all Node Integrations [READ] GET /api/node-integrations/ |
| get_node_metadataC | Get node metadata [READ] GET /api/metadata/node/:uuid |
| get_node_pluginB | Get Node Plugin by uuid [READ] GET /api/node-plugins/:uuid |
| get_node_pluginsB | Get all Node Plugins [READ] GET /api/node-plugins/ |
| get_node_usageB | 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. [READ] POST /api/bandwidth-stats/nodes/usage |
| get_nodesC | Get nodes [READ] GET /api/nodes/ Returns a compact view; pass full: true for the raw panel response. |
| get_nodes_metricsC | Get Nodes Metrics [READ] GET /api/system/nodes/metrics |
| get_nodes_statisticsC | Get Nodes Statistics [READ] GET /api/system/stats/nodes |
| get_nodes_tagsC | Get nodes tags [READ] GET /api/nodes/tags |
| get_recapC | Get Recap [READ] GET /api/system/stats/recap |
| get_remnawave_healthB | Get Remnawave Health [READ] GET /api/system/health |
| get_remnawave_settingsB | Get Remnawave settings [READ] GET /api/remnawave-settings/ |
| get_shared_listB | Get Shared List by name [READ] GET /api/node-plugins/shared-lists/:name |
| get_shared_listsA | 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. [READ] GET /api/node-plugins/shared-lists |
| get_snippetsC | Get snippets [READ] GET /api/snippets/ |
| get_statsD | Get Stats [READ] GET /api/system/stats |
| get_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. [READ] GET /api/system/stats/digest |
| get_stats_node_users_usageC | Get Node Users Usage by Node UUID [READ] GET /api/bandwidth-stats/nodes/:uuid/users |
| get_stats_nodes_usageC | Get Nodes Usage by Range [READ] GET /api/bandwidth-stats/nodes/ |
| get_stats_nodes_users_usageC | Get Nodes Users Usage by Nodes UUIDs [READ] POST /api/bandwidth-stats/nodes/users |
| get_stats_user_usageC | Get User Usage by Range [READ] GET /api/bandwidth-stats/users/:userId |
| get_statusB | Get the status of the authentication [READ] GET /api/auth/status |
| get_subpage_configB | Get subscription page config by uuid [READ] GET /api/subscription-page-configs/:uuid |
| get_subpage_config_by_short_uuidC | Get Subpage Config by Short UUID [READ] GET /api/subscriptions/subpage-config/:shortUuid |
| get_subpage_configsA | Get all subscription page configs [READ] GET /api/subscription-page-configs/ |
| get_subscription_by_idB | Get subscription by User ID [READ] GET /api/subscriptions/by-id/:userId |
| get_subscription_by_short_uuid_protectedC | Get subscription by short uuid (protected route) [READ] GET /api/subscriptions/by-short-uuid/:shortUuid |
| get_subscription_by_usernameB | Get subscription by username [READ] GET /api/subscriptions/by-username/:username |
| get_subscription_info_by_short_uuidD | Get Subscription Info by Short UUID [READ] GET /api/sub/:shortUuid/info |
| get_subscription_request_historyA | 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. [READ] GET /api/subscription-request-history/ |
| get_subscription_request_history_statsC | Get subscription request history stats [READ] GET /api/subscription-request-history/stats |
| get_subscription_settingsB | Get subscription settings [READ] GET /api/subscription-settings/ |
| get_subscription_templateB | Get subscription template by uuid [READ] GET /api/subscription-templates/:uuid |
| get_subscription_templatesB | Get all subscription templates (wihout content) [READ] GET /api/subscription-templates/ |
| get_subscriptionsC | Get all subscriptions [READ] GET /api/subscriptions/ |
| get_top_users_by_hwid_devicesC | Get top users by HWID devices [READ] GET /api/hwid/devices/top-users |
| get_torrent_blocker_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. [READ] GET /api/node-plugins/torrent-blocker |
| get_torrent_blocker_reports_statsB | Get Torrent Blocker Reports Stats [READ] GET /api/node-plugins/torrent-blocker/stats |
| get_user_accessible_nodesC | Get user accessible nodes [READ] GET /api/users/:userId/accessible-nodes |
| get_user_by_idB | Get user by ID [READ] GET /api/users/:userId |
| get_user_by_short_uuidB | Get user by Short UUID [READ] GET /api/users/by-short-uuid/:shortUuid |
| get_user_by_usernameC | Get user by username [READ] GET /api/users/by-username/:username |
| get_user_hwid_devicesC | Get user HWID devices [READ] GET /api/hwid/devices/:userId |
| get_user_metadataC | Get user metadata [READ] GET /api/metadata/user/:userId |
| get_user_subscription_request_historyB | Get user subscription request history, recent 24 records [READ] GET /api/users/:userId/subscription-request-history |
| get_usersB | Get all users using offset-based pagination 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. [READ] GET /api/users/ |
| get_users_streamA | Get all users using cursor-based (keyset) pagination with filtering options [READ] GET /api/users/stream |
| get_users_tagsC | Get users tags [READ] GET /api/users/tags |
| resolve_userB | Resolve a user Resolve a user by ID, Short UUID or username. Exactly one of the fields must be provided. [READ] POST /api/users/resolve |
| test_srr_matcherC | Test SRR Matcher [READ] POST /api/system/testers/srr-matcher |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| daily_summary | Users, online, offline nodes, traffic, subscriptions expiring soon |
| client_review | Subscription, devices, traffic and recent requests of one client |
| sharing_audit | Clients with many IPs or devices |
| node_check | Offline nodes, load balance, optional GeoCheck of one node |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 85 tools
Many tools overlap heavily: get_user_by_id, get_user_by_username, get_user_by_short_uuid, find_user, and resolve_user all retrieve the same resource, and the stats surface (get_stats, get_stats_digest, get_bandwidth_stats, get_nodes_statistics, get_nodes_metrics, get_recap, get_node_usage, get_stats_nodes_usage, get_stats_nodes_users_usage, get_stats_node_users_usage, get_internal_squad_usage, get_internal_squad_user_usage) is a wall of near-identical names. Some descriptions (e.g. panel_overview, user_report, find_user) explicitly steer away from duplication, but the boundaries are still unclear for many pairs.
Virtually all names are snake_case and the vast majority are get_<resource> reflecting the underlying REST endpoints, so the pattern is predictable. A handful of verb variants (find_user, resolve_user, geocheck_node, panel_overview, user_report, sharing_suspects, node_connections) break the get_ prefix but remain consistent in style.
85 tools is far beyond a well-scoped set and essentially exposes the entire REST API one-to-one, including near-duplicate stats and lookup endpoints. Agents must choose among dozens of highly similar reads, which is the extreme end of tool-count mismatch.
The surface is almost entirely read-only ([READ] endpoints); there are no create/update/delete operations for users, nodes, squads, hosts, or config profiles, so a management workflow dead-ends as soon as a mutation is needed. The read/reporting coverage is broad, but lifecycle coverage for the domain is severely lacking.