Skip to main content
Glama
TrackLine
by TrackLine

nodes_create

Add new VPN nodes to the Remnawave panel by specifying name, address, port, country, traffic settings, and configuration profiles.

Instructions

Create a new node in Remnawave

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameYesNode name
addressYesNode address (IP or hostname)
portNoNode port
countryCodeNoCountry code (e.g. US, DE, NL)
isTrafficTrackingActiveNoEnable traffic tracking
trafficLimitBytesNoTraffic limit in bytes
trafficResetDayNoDay of month to reset traffic (1-31)
notifyPercentNoTraffic notification threshold percentage
consumptionMultiplierNoTraffic consumption multiplier
activeConfigProfileUuidYesConfig profile UUID to assign
activeInboundsYesArray of inbound UUIDs to enable

Implementation Reference

  • The handler for the 'nodes_create' tool, which constructs the request body from parameters and calls the client's createNode method.
    async (params) => {
        try {
            const body: Record<string, unknown> = {
                name: params.name,
                address: params.address,
                configProfile: {
                    activeConfigProfileUuid:
                        params.activeConfigProfileUuid,
                    activeInbounds: params.activeInbounds,
                },
            };
            if (params.port !== undefined) body.port = params.port;
            if (params.countryCode !== undefined)
                body.countryCode = params.countryCode;
            if (params.isTrafficTrackingActive !== undefined)
                body.isTrafficTrackingActive =
                    params.isTrafficTrackingActive;
            if (params.trafficLimitBytes !== undefined)
                body.trafficLimitBytes = params.trafficLimitBytes;
            if (params.trafficResetDay !== undefined)
                body.trafficResetDay = params.trafficResetDay;
            if (params.notifyPercent !== undefined)
                body.notifyPercent = params.notifyPercent;
            if (params.consumptionMultiplier !== undefined)
                body.consumptionMultiplier = params.consumptionMultiplier;
    
            const result = await client.createNode(body);
            return toolResult(result);
        } catch (e) {
            return toolError(e);
        }
    },
  • The Zod schema defining the input parameters for the 'nodes_create' tool.
    {
        name: z.string().describe('Node name'),
        address: z.string().describe('Node address (IP or hostname)'),
        port: z.number().optional().describe('Node port'),
        countryCode: z
            .string()
            .optional()
            .describe('Country code (e.g. US, DE, NL)'),
        isTrafficTrackingActive: z
            .boolean()
            .optional()
            .describe('Enable traffic tracking'),
        trafficLimitBytes: z
            .number()
            .optional()
            .describe('Traffic limit in bytes'),
        trafficResetDay: z
            .number()
            .optional()
            .describe('Day of month to reset traffic (1-31)'),
        notifyPercent: z
            .number()
            .optional()
            .describe('Traffic notification threshold percentage'),
        consumptionMultiplier: z
            .number()
            .optional()
            .describe('Traffic consumption multiplier'),
        activeConfigProfileUuid: z
            .string()
            .describe('Config profile UUID to assign'),
        activeInbounds: z
            .array(z.string())
            .describe('Array of inbound UUIDs to enable'),
    },
  • The tool registration block for 'nodes_create' in the MCP server.
    server.tool(
        'nodes_create',
        'Create a new node in Remnawave',
        {
            name: z.string().describe('Node name'),
            address: z.string().describe('Node address (IP or hostname)'),
            port: z.number().optional().describe('Node port'),
            countryCode: z
                .string()
                .optional()
                .describe('Country code (e.g. US, DE, NL)'),
            isTrafficTrackingActive: z
                .boolean()
                .optional()
                .describe('Enable traffic tracking'),
            trafficLimitBytes: z
                .number()
                .optional()
                .describe('Traffic limit in bytes'),
            trafficResetDay: z
                .number()
                .optional()
                .describe('Day of month to reset traffic (1-31)'),
            notifyPercent: z
                .number()
                .optional()
                .describe('Traffic notification threshold percentage'),
            consumptionMultiplier: z
                .number()
                .optional()
                .describe('Traffic consumption multiplier'),
            activeConfigProfileUuid: z
                .string()
                .describe('Config profile UUID to assign'),
            activeInbounds: z
                .array(z.string())
                .describe('Array of inbound UUIDs to enable'),
        },
        async (params) => {
            try {
                const body: Record<string, unknown> = {
                    name: params.name,
                    address: params.address,
                    configProfile: {
                        activeConfigProfileUuid:
                            params.activeConfigProfileUuid,
                        activeInbounds: params.activeInbounds,
                    },
                };
                if (params.port !== undefined) body.port = params.port;
                if (params.countryCode !== undefined)
                    body.countryCode = params.countryCode;
                if (params.isTrafficTrackingActive !== undefined)
                    body.isTrafficTrackingActive =
                        params.isTrafficTrackingActive;
                if (params.trafficLimitBytes !== undefined)
                    body.trafficLimitBytes = params.trafficLimitBytes;
                if (params.trafficResetDay !== undefined)
                    body.trafficResetDay = params.trafficResetDay;
                if (params.notifyPercent !== undefined)
                    body.notifyPercent = params.notifyPercent;
                if (params.consumptionMultiplier !== undefined)
                    body.consumptionMultiplier = params.consumptionMultiplier;
    
                const result = await client.createNode(body);
                return toolResult(result);
            } catch (e) {
                return toolError(e);
            }
        },
    );

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/TrackLine/mcp-remnawave'

If you have feedback or need assistance with the MCP directory API, please join our Discord server