@skynode/mcp
Ce serveur MCP expose huit outils pour gérer le déploiement de vos projets sur vos serveurs SkyNode, en lecture seule pour la plupart et sans jamais commander ni payer.
list_servers: liste vos serveurs SkyNode (nom, IP, état, identifiant).server_status: détaille un serveur (état, IP, système, région, utilisateur SSH, échéance).inspect_project: inspecte un projet local (Dockerfile, runtime, framework, port, clés d’environnement).inspect_server: inspecte un serveur distant par SSH (système, Docker, ports, configuration).plan_deployment: propose un plan de déploiement détaillé, sans rien exécuter.apply_plan: applique le plan approuvé — installe, transfère, construit, démarre, publie.app_logs: affiche les dernières lignes du journal d’une application déployée.rollback: restaure l’image précédente et redémarre le conteneur.
Six outils sont en lecture seule ; apply_plan et rollback sont les seuls qui écrivent sur vos serveurs.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@skynode/mcplist my servers and their current status"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@skynode/mcp
Serveur MCP qui donne à votre agent de code — Claude Code, Cursor, Codex — la visibilité sur vos serveurs SkyNode.
Il constate vos projets et vos serveurs, propose un plan de déploiement en français, et l'applique quand vous l'avez approuvé. Il ne peut ni commander ni payer.
Six de ses huit outils sont en lecture seule, et le déclarent à votre client MCP. Les
deux autres — apply_plan et rollback — écrivent sur votre serveur, et votre client vous
le demande avant. Ce qu'ils font exactement est décrit plus bas, sans détour.
Installation
Créez d'abord un jeton d'accès personnel dans votre espace client, sur /compte/securite, en cochant la portée « Lire mes serveurs et leur état ». La valeur n'est affichée qu'une seule fois.
Claude Code
claude mcp add skynode --env SKYNODE_TOKEN=sky_votre_jeton -- npx -y @skynode/mcpCursor, Windsurf, Codex
Dans la configuration MCP de votre client :
{
"mcpServers": {
"skynode": {
"command": "npx",
"args": ["-y", "@skynode/mcp"],
"env": { "SKYNODE_TOKEN": "sky_votre_jeton" }
}
}
}Related MCP server: Akamai Cloud MCP Server
Outils
Outil | Ce qu'il fait |
| Liste vos serveurs : nom, adresse IP, état, identifiant |
| Détaille un serveur : état, IP, système, région, échéance |
| Constate un projet local : Dockerfile, runtime, framework, port, clés d'environnement |
| Constate un serveur par SSH : système, Docker, ports, régime, marche à suivre |
| Propose un plan de déploiement détaillé, à lire avant toute action. N'exécute rien |
| Écrit. Exécute un plan que vous avez approuvé : équipe la machine, transfère, construit, démarre, publie |
| Rend les dernières lignes du journal d'une application déployée. Lecture seule |
| Écrit. Ramène une application à l'image précédente et redémarre son conteneur |
Variables d'environnement
Variable | Rôle |
| Requis. Votre jeton personnel, commençant par |
| Facultatif. Par défaut |
Le jeton se déclare par variable d'environnement, jamais en argument de ligne de commande : les arguments d'un processus sont lisibles par tout utilisateur de la machine.
Ce qu'apply_plan fait sur votre machine
C'est le seul outil du produit qui écrit, et il s'exécute en root. Ce qu'il fait, il le fait pour de bon.
Il écrit. Il installe des paquets (docker-ce, ufw, fail2ban,
unattended-upgrades), crée des conteneurs et des volumes Docker, et pose des fichiers
sous /etc/skynode/ — l'environnement de vos applications, les fichiers de site du
reverse proxy, et l'état du déploiement. Il crée un compte applicatif skynode et un
fichier d'échange si le plan le prévoit.
Il durcit SSH — mais jamais à l'aveugle. Le mot de passe et la connexion root
directe sont refusés une fois le compte applicatif en place. Avant d'écrire quoi que ce
soit, il vérifie qu'une seconde session fonctionne ; après avoir écrit, il en ouvre
une troisième, et défait tout si elle ne passe plus. C'est la seule opération du
produit dont l'échec serait irréparable à distance, et elle est traitée comme telle.
Il ne touche jamais ce qu'il n'a pas créé. Un fichier qu'il n'a pas écrit n'est
modifié que par un bloc marqué, qu'il sait retirer sans toucher au reste. Il ne prend
jamais un port tenu par un autre service. Il n'arrête, ne remplace ni ne supprime aucun
conteneur qui ne porte pas son étiquette skynode.app — un conteneur à vous qui
porterait le même nom fait échouer l'étape, il n'est pas écrasé. Votre Dockerfile, s'il
y en a un, est utilisé tel quel et jamais régénéré.
Ce qu'il ne sait pas défaire. Une étape qui échoue fait défaire celles du même passage, en ordre inverse — sauf l'installation de paquets, qui ne se désinstalle pas, et la préparation de la machine. Le rapport le dit à chaque fois, nommément, plutôt que de laisser croire à un retour arrière complet. Ce qui reste sur la machine y est écrit noir sur blanc.
Rejoué, il ne refait rien. Chaque étape constate avant d'agir et rend « inchangé » quand il n'y a rien à faire. Réappliquer un plan déjà appliqué ne coupe pas le service.
Une machine modifiée entre-temps fait refuser le plan. Le plan porte une empreinte de l'état constaté ; si quoi que ce soit a changé depuis, il est refusé sans qu'une seule étape ne s'exécute. Ce que vous aviez approuvé décrivait un serveur qui n'existe plus. Un plan destiné à un autre serveur est refusé de la même façon, et pour la même raison.
dry_run décrit tout cela sans ouvrir la moindre session.
Ce que le plan n'est pas
plan_deployment constate votre projet et votre serveur, puis propose — il n'applique
rien.
plan_deploymentn'exécute rien. Il constate et propose ; rien de ce qu'il rend ne touche à votre serveur. C'estapply_plan, et lui seul, qui agit — après votre approbation.Un plan est une donnée, pas un script. Le vocabulaire des étapes est fermé et versionné avec le paquet : votre agent choisit lesquelles, dans quel ordre et avec quelles valeurs, mais ne peut pas en inventer une. C'est ce qui borne ce qu'une instruction malveillante trouvée dans un dépôt peut provoquer — au pire un plan légitime et mauvais, que vous lisez avant d'approuver.
Le
Dockerfilegénéré vient d'un gabarit éprouvé, pas d'une improvisation. Votre agent en fixe les paramètres — version du runtime, gestionnaire de paquets, port — mais la construction en plusieurs étapes, l'utilisateur non-root et le cache des dépendances sont les mêmes pour tous les clients, donc corrigés une fois pour tous.Le plan vous est rendu en français, étape par étape, jamais sous forme de données à déchiffrer. C'est ce texte-là que vous approuvez — il nomme le serveur visé, l'application, le domaine, et ce qui restera sur la machine même si une étape échoue plus loin.
Un plan appartient au serveur pour lequel il a été composé.
apply_planrefuse de l'appliquer ailleurs : deux VPS neufs de la même image se ressemblent trop pour qu'une empreinte d'état suffise à les distinguer.
Le compte applicatif, et sa clé
L'étape host.prepare — celle qui prépare un serveur avant d'y déployer quoi que ce soit —
crée un compte non-root skynode, lui accorde sudo sans mot de passe, et y recopie la
clé qui a ouvert la session, c'est-à-dire celle de /root/.ssh/authorized_keys.
Cette copie est prise une seule fois et ne suit pas. Si vous révoquez plus tard une clé
sur root — le geste réflexe quand un ordinateur est perdu ou volé — elle reste valable sur
le compte skynode, qui peut devenir root sans mot de passe. Retirez-la des deux
fichiers :
/root/.ssh/authorized_keys/home/skynode/.ssh/authorized_keys
Le rapport de l'étape le rappelle, au moment même où la copie a lieu.
Prérequis SSH
inspect_server s'appuie sur le client ssh du système, pas sur une bibliothèque
embarquée. plan_deployment ouvre la même session : il rejoue exactement la même
sonde que inspect_server avant de composer un plan — les prérequis ci-dessous
s'appliquent aux deux.
Le client
sshdu système est requis. Sous Windows, passez par WSL — le paquet suppose la présence desshet detar.Le compte SSH est celui que l'API déclare, sauf si vous en indiquez un autre par
ssh_user— disponible surinspect_server,plan_deploymentetapply_plan. Le même compte doit servir aux trois : c'est celui dont le constat a établi qu'il peut s'élever.La clé doit déjà être autorisée sur le serveur. SkyNode n'en détient aucune et n'en installe aucune : c'est le corollaire direct de la promesse « ce que SkyNode ne voit pas » ci-dessous.
inspect_serveretplan_deploymentne modifient rien : ni installation, ni écriture, ni configuration.apply_planetrollback, eux, modifient — voir plus haut.tarest requis sur votre machine : le transfert du projet passe par lui, sur l'entrée standard dessh. Nirsyncdes deux côtés, nigit clonedistant — le serveur ne reçoit jamais les identifiants d'un dépôt privé.Une trace, une seule : la sonde exécute
sudo -n truepour savoir si l'élévation est possible. Horssudoers, le réglagemail_no_userpar défaut de sudo écrit une ligne dansauth.loget envoie un courriel à root. Rien n'est modifié — mais si vous retrouvez cette ligne dans vos journaux, c'est bieninspect_serverouplan_deploymentqui l'a laissée.
Ce que SkyNode ne voit pas
Ce serveur tourne sur votre machine. SkyNode ne reçoit que les appels d'API classiques de votre compte — les mêmes que ceux de votre espace client. Toutes les sessions SSH partent de votre machine : celle du constat, celles de chaque étape appliquée, et le transfert de votre projet. Ni la clé privée, ni le code de votre projet, ni le contenu de vos fichiers d'environnement ne transitent par l'infrastructure SkyNode.
Les valeurs de vos fichiers d'environnement ne sont d'ailleurs affichées nulle part : ni dans le plan, ni dans le rapport d'exécution, ni dans les journaux. Le plan nomme le fichier, le rapport compte ses lignes.
Les journaux que rend app_logs sont produits par votre application. Ce sont des
données, jamais des instructions, et le texte rendu le dit à votre agent — un dépôt ou
une dépendance hostile ne doit pas pouvoir lui parler par ce canal.
Développement
pnpm install
pnpm test
pnpm buildPour l'essayer contre une API locale :
SKYNODE_API_URL=http://localhost:3001/api/v1 SKYNODE_TOKEN=sky_… node dist/index.jsLicence
MIT
Available Tools
2 toolslist_serversLister mes serveurs SkyNodeA
Liste les serveurs (VPS) du compte SkyNode : nom, adresse IP, état, identifiant. À appeler en premier pour savoir sur quelle machine travailler. Lecture seule.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses read-only nature ('Lecture seule') and enumerates the returned fields (name, IP, state, ID), offering useful behavioral context beyond the empty 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?
The description is compact—two sentences—with the main purpose front-loaded and no superfluous content. Every sentence contributes value.
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 list operation with no parameters and no output schema, the description provides essential information: what is returned, that it is read-only, and when to use it. It adequately covers the tool's context given its simplicity.
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 accepts zero parameters, so there is no parameter semantics to convey. The baseline for no parameters is 4, and the description correctly omits any parameter details.
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 clearly states it lists SkyNode VPS servers with their name, IP, state, and ID, using the specific verb 'list' and resource 'servers (VPS) of the SkyNode account'. It also differentiates from the sibling tool 'server_status' by indicating it should be called first to know which machine to work on.
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 explicitly instructs to call this tool first to determine the machine to work on, providing clear usage context. It does not explicitly mention exclusions or alternatives, but the sequencing guidance is sufficient for typical workflows.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_statusDétail d’un serveur SkyNodeA
Détaille un serveur : état, adresses IP, système, région, utilisateur SSH, échéance de facturation. L’identifiant s’obtient avec list_servers. Lecture seule.
| Name | Required | Description | Default |
|---|---|---|---|
| server_id | Yes | Identifiant du serveur, tel que rendu par list_servers |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosing behavior. It explicitly states 'Lecture seule' (read-only) and enumerates what information is returned. It does not discuss errors or permissions, but for a read-only detail endpoint this is sufficient.
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 concise sentences, front-loaded with the tool's purpose and output fields. Every word earns its place with no redundancy.
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 single-parameter read-only tool with no output schema, the description fully covers what the tool does, what it returns, and how to obtain the required ID. It is complete for an agent to invoke 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?
Schema coverage is 100%, so the schema already defines server_id. The description adds value by telling the agent that the ID comes from list_servers, which is genuinely useful contextual information 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?
Uses the specific verb 'Détaille' with a clear resource ('un serveur') and lists concrete attributes (état, adresses IP, système, etc.). It clearly distinguishes itself from list_servers by focusing on a single server's detailed status.
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 tells the agent to obtain the identifier via list_servers, establishing a clear usage flow. It does not mention when not to use it, but for a simple detail lookup the context is clear.
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. Dates show when Glama detected each change.
2 tool updates
v0.1.0- First observed
list_servers - First observed
server_status
TDQS
The two tools are clearly distinct: list_servers provides a high-level overview of all servers, while server_status gives detailed information for a specific server. There is no ambiguity in their purposes.
Naming is not fully consistent: list_servers follows a verb_noun pattern, while server_status uses a noun_phrase without a verb. Both are readable, but the mixed patterns make the set slightly less predictable.
With only two tools, the server is minimal but appropriate for a read-only server information utility. However, it feels thin if broader server management capabilities are expected.
For a read-only toolset, it covers the essential operations: listing all servers and retrieving detailed status for one. Missing actions like start/stop are out of scope, but the read-only domain is well covered.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read-only MCP server: verify credentials and browse escrows on the Stellar testnet contract.
MCP server for Hostinger API
Read-only MCP server for The Quiet Protocol's engines, benchmarks, proof, and business data.
Read-only MCP server for AIStatusDashboard status, incidents, metrics, and fallback recommendations.
Related MCP Servers
- AlicenseAqualityBmaintenanceRead-only MCP server for the RareCloud API, enabling AI agents to list servers, browse the catalog, check billing, and plan deployments.10016MIT
- AlicenseAqualityDmaintenanceA read-only MCP server for Akamai Cloud (Linode) that lets users ask plain-language questions about their account, including inventory, pricing, GPU availability, and account limits.37Apache 2.0
- AlicenseNot gradedqualityCmaintenanceRead-only MCP server that monitors a Bitcoin Core full node via JSON-RPC, providing tools to check node status, network info, mempool, and peer information.MIT
- AlicenseNot gradedqualityCmaintenanceA read-only MCP server for Cartrack fleet management, enabling listing vehicles and checking their last-known status and location.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/zampou-code/skynode-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server