Si has creat un servidor MCP i vols que un assistent s’hi connecti des d’un altre equip, necessites una adreça pública i un procés que continuï funcionant. Un VPS et dona control sobre aquest procés, el proxy HTTPS i les actualitzacions, però també et fa responsable de la màquina.
Això és diferent de connectar un assistent al servidor MCP del compte Hostbrid: aquest servei permet consultar i gestionar recursos del teu compte; no executa un servidor MCP que hagis programat. Per desplegar una web generada amb IA, consulta Projects; per mantenir un servei MCP persistent que administris tu, aquesta guia fa servir un VPS.
Tria el transport abans de desplegar
El protocol MCP defineix stdio i Streamable HTTP. Amb stdio, el client inicia el procés localment, al seu propi equip. Per connectar-te a un servei remot necessites un endpoint HTTP accessible, normalment una ruta com https://mcp.exemple.com/mcp. El transport Streamable HTTP fa servir peticions HTTP i pot mantenir respostes SSE; un proxy o tallafoc que no admeti aquest trànsit pot interrompre la sessió encara que la pàgina respongui.
Abans de contractar, comprova quin transport admeten el servidor i el client. Si només necessites eines locals, stdio pot ser suficient i no et cal un VPS públic.
Crea un servidor petit i protegit
Aquest exemple fa servir el SDK oficial MCP v2 per a TypeScript, Express i una eina innòcua ping. Es va validar el 9 d’octubre de 2026 amb @modelcontextprotocol/server i @modelcontextprotocol/client 2.3.1, @modelcontextprotocol/express 2.0.2, @modelcontextprotocol/node 2.1.1, Express i Zod. Comprova les versions vigents abans de desplegar: el SDK i l’especificació evolucionen.
Instal·la les dependències i desa les versions exactes a package-lock.json:
npm install --save-exact @modelcontextprotocol/server@2.3.1 @modelcontextprotocol/express@2.0.2 @modelcontextprotocol/node@2.1.1 express zod
Crea server.mjs:
import { createMcpExpressApp } from '@modelcontextprotocol/express';
import { toNodeHandler } from '@modelcontextprotocol/node';
import { McpServer, createMcpHandler } from '@modelcontextprotocol/server';
import { timingSafeEqual } from 'node:crypto';
import { z } from 'zod';
const port = Number(process.env.PORT || 3000);
const bearer = process.env.MCP_BEARER_TOKEN;
const allowedHost = process.env.MCP_ALLOWED_HOST || '127.0.0.1';
if (!bearer || bearer.length < 32) throw new Error('Configura MCP_BEARER_TOKEN amb un secret aleatori d’almenys 32 caràcters.');
if (!Number.isInteger(port) || port < 1 || port > 65535) throw new Error('PORT no és vàlid.');
const app = createMcpExpressApp({
host: '0.0.0.0',
allowedHosts: [allowedHost],
allowedOrigins: [allowedHost],
});
const handler = createMcpHandler(() => {
const server = new McpServer({ name: 'mi-servidor-mcp', version: '1.0.0' });
server.registerTool('ping', {
description: 'Retorna una resposta d’estat fixa; no modifica res.',
inputSchema: z.object({}),
}, async () => ({ content: [{ type: 'text', text: 'pong' }] }));
return server;
});
const nodeHandler = toNodeHandler(handler);
app.all('/mcp', (req, res) => {
const header = req.get('authorization') || '';
const actual = Buffer.from(header.startsWith('Bearer ') ? header.slice(7) : '');
const expected = Buffer.from(bearer);
const valid = actual.length === expected.length && timingSafeEqual(actual, expected);
if (!valid) return res.status(401).json({ error: 'unauthorized' });
return void nodeHandler(req, res, req.body);
});
app.listen(port, '127.0.0.1', () => console.log(`MCP escoltant a 127.0.0.1:${port}/mcp`));
allowedHosts i allowedOrigins han d’incloure el nom públic que servirà el proxy, per exemple mcp.exemple.com. El procés escolta només a loopback; no exposis directament a Internet el port de Node. Si algun client envia un Origin diferent —per exemple, una extensió—, afegeix-hi només l’origen que facis servir realment.
L’autenticació amb bearer token de l’exemple serveix per a una prova controlada i per a un client que permeti configurar aquesta capçalera. Per a diversos usuaris, tokens amb permisos o accés OAuth, fes servir un flux d’autenticació compatible amb els teus clients MCP. No posis secrets a Git, al repositori d’exemples ni als logs.
Mantén el procés actiu i publica HTTPS
Executa l’aplicació amb un usuari del sistema sense privilegis d’administrador. Un servei de systemd la pot reiniciar després d’una fallada o quan s’engegui la màquina. Desa MCP_BEARER_TOKEN en un fitxer d’entorn que només pugui llegir aquest usuari; no el posis a la línia d’ordres ni al repositori.
Posa Nginx davant del procés, acaba-hi TLS per al subdomini i reenvia la ruta /mcp a 127.0.0.1:3000/mcp. Conserva les capçaleres Host i Origin perquè la validació correspongui al domini públic; permet els mètodes HTTP que requereix Streamable HTTP i desactiva el buffering per a les respostes SSE. Ajusta el temps d’espera de lectura si el servidor pot trigar a respondre. No obris a Internet ports d’administració ni de bases de dades.
Quan tinguis un certificat HTTPS, comprova des de fora que el DNS apunta a la IP del VPS i que la ruta MCP arriba al servei. Les instruccions concretes de Nginx depenen del certificat, el domini, la versió de l’SDK i si el servidor fa servir sessions; prova la configuració en un subdomini abans de traslladar-hi trànsit real.
Comprova el protocol, l’accés i la recuperació
Connecta un client MCP real —per exemple, MCP Inspector— a l’endpoint HTTPS. Confirma que pot inicialitzar la sessió, llistar ping i rebre pong. Repeteix la prova sense token i amb un Origin no permès: l’exemple els ha de rebutjar. Comprova també el mètode GET/SSE si el servidor l’ofereix, el reinici del servei i que els logs no incloguin tokens.
La prova local d’aquest exemple va fer servir el client MCP oficial: la crida sense token va rebre HTTP 401, el client autoritzat va llistar ping i va obtenir pong, i un origen no permès va rebre HTTP 403. Això valida l’exemple del protocol i els controls; no demostra el rendiment, la disponibilitat ni la configuració del teu VPS en producció.
Quan convé un VPS i què implica
Un VPS és adequat si necessites un procés persistent, instal·lar paquets del sistema, controlar el proxy o adaptar la xarxa. Hostbrid proporciona la màquina virtual; tu administres el sistema operatiu, les actualitzacions, els permisos, l’aplicació, els secrets, les còpies de seguretat i la resposta davant d’incidents. Consulta les mides i els preus dels VPS i comprova el cost total i els recursos abans de contractar.
Una aplicació Node.js en allotjament Sites podria servir per a un MCP HTTP senzill, però la documentació pública no confirma la compatibilitat amb les sessions, el streaming SSE i els límits de connexió de cada client. Abans de dependre’n, comprova aquest comportament amb el proveïdor. Projects està pensat per compilar i publicar repositoris web; no el consideris un procés MCP persistent sense haver-ne provat els límits.
Si el servei desa dades, defineix-ne una còpia de seguretat i assaja com restaurar-les. Si una eina pot esborrar dades, canviar permisos o gastar diners, afegeix-hi autorització explícita, límits i una confirmació humana. El format MCP connecta clients amb eines; no fa que una eina sigui segura automàticament.