nyxilum-mcp
Click on "Deploy 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., "@nyxilum-mcprun this arx code: println('hello')"
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.
nyxilum-mcp
An MCP server that lets an AI assistant (Claude, Cursor, etc.) directly
compile/run/lint/format NyxilumLang (.nx) code via
NyxilumNode — without manual
dotnet run/copy-paste into a terminal.
Why a separate repo instead of part of NyxilumLang
This project's node_modules shouldn't end up in NyxilumLang's dotnet build or
publish/. It lives alongside it, as a sibling project.
Related MCP server: Arduino MCP Server (Simple)
Installation
git clone https://github.com/Faneraiy14/NyxilumMcp.git
cd NyxilumMcp
npm installNeeds a built NyxilumNode nearby (../NyxilumLang by default,
dotnet build src/NyxilumLang there) — or set the path explicitly:
# Linux/Mac
export NX_NODE_PATH=/path/to/NyxilumLang # .exe on Windows, .dll — then runs via `dotnet`
# or
export NX_ECOSYSTEM_ROOT=/path/to/NyxilumLang# Windows
$env:NX_NODE_PATH = "C:\path\to\NyxilumLang.exe"
# or
$env:NX_ECOSYSTEM_ROOT = "C:\path\to\NyxilumLang"Connecting (Claude Desktop / Claude Code)
{
"mcpServers": {
"nyxilum": {
"command": "node",
"args": ["/path/to/NyxilumMcp/src/server.js"]
}
}
}Tools
Tool | What it does |
| Compiles and runs code in a sandbox (separate process, timeout, GC-allocation limit) |
| Lexer+parser only — checks syntax WITHOUT running the code (cheaper and safer than |
| Style warnings (line length, empty blocks) — not a syntax check, always exitCode=0 |
| Formats code |
| Version of the NyxilumNode found — doubles as a health check |
| GUIDE.md in full, or a specific section (by |
|
|
| NyxilumLang's |
| Starts a long-lived sandboxed REPL session — |
| Runs code in an existing REPL session |
| Ends a REPL session and cleans up its temp folder |
Execution security (nyxilum_run)
Code NEVER ends up in the shell/argv as text — it's always written to its own temp file, whose path is passed as a normal process argument (
execFile, withoutshell: true).A process
timeout(10s by default, 60s max) is the only real protection againstwhile (true) {}with no allocations:NX_GC_MAX_OBJECTSonly counts NyxilumLang allocations (arrays/structs/maps), not loop iterations by themselves.envis an allowlist (PATH,SystemRoot,TEMP,DOTNET_ROOT, etc.), not the wholeprocess.envof this server process.NX_SANDBOX=1(fixed, doesn't depend on the tool's input arguments) — file I/O is restricted to the run's temp folder, and network (httpGet/httpServer/wsConnect, etc.) and reading environment variables (osEnv) are completely forbidden. Requires a NyxilumNode build withNX_SANDBOXsupport (see the NyxilumLang README); with an older binary the flag is simply ignored.Output (
stdout/stderr) is truncated to 32 KB per stream — a loop that prints millions of lines won't fill up the response context.The temp folder is always removed in a
finally, even on timeout.
RunFile in Nx.cs writes Runtime Error:/Parse Error: to stdout
(not stderr) and exits with exitCode=1 — that's NyxilumNode's own
behavior, not this server's; every tool explicitly notes this in its
description.
nyxilum_repl_* — persistent state, same sandbox
nyxilum_run starts a brand-new process every call — no memory between
calls. The nyxilum_repl_* tools instead keep one nx REPL process alive
across multiple nyxilum_repl_eval calls, so a var/func declared in
one call is still visible in the next — useful for stepping through an
exploration ("try this, look at the result, adjust") instead of
re-writing the whole accumulated script every time. Same sandbox as
nyxilum_run (NX_SANDBOX=1, env allowlist, own temp working directory
per session, output truncated to 32 KB).
Two things that follow directly from the REPL being a real, long-lived process reading stdin line by line, not a one-shot file:
Newlines in
codeare flattened to spaces before being sent. The REPL reads oneConsole.ReadLine()per statement — afuncbody split across lines breaks it (Error: expected '}' on line 1, verified live) the moment a\nis written to its stdin mid-declaration. Braces don't care about line breaks, so multi-linefunc {...}/struct {...}still work fine once flattened — but//line comments do NOT survive flattening (the comment would silently eat everything after it on the now-single line), so avoid//inside multi-linecodepassed here.A timed-out
nyxilum_repl_evalkills the session. There's no safe way to keep waiting on a process that might be stuck in an infinite loop indefinitely, so a call that doesn't respond withintimeout_msterminates the session immediately (sessionKilled: truein the response) — start a new one withnyxilum_repl_start.
Reading the response reliably (not just "wait a bit and read stdout")
needed its own protocol: right after the caller's code, the session
writes a second line — print() of a random one-time marker — and reads
stdout until that marker shows up in the buffer. Everything before it,
minus the REPL's own "> " prompt (stripped positionally, as a fixed
2-byte suffix right before the marker — not a blind find-and-replace, so
legitimate output containing "> " itself, e.g. print("a > b"), comes
through untouched) is the real output of the caller's code.
Sessions are capped at 5 concurrent and auto-close after 10 minutes idle
— always call nyxilum_repl_stop when done with one rather than relying
on the idle timeout.
nyxilum_dev_build/nyxilum_dev_test — a different trust model
These two are NOT sandboxed (no NX_SANDBOX, no env allowlist, no
temp file with code): they run dotnet build/tests/run_all.sh
on the NyxilumLang repo itself, not on arbitrary .nx code from the
call. The caller passes no text that could end up in the command —
only optional configuration/timeout_ms. Meant for developing
the language itself (changing the VM's/compiler's C# code), not for
checking untrusted code — that's what nyxilum_run/nyxilum_check are for.
Tests
npm test32 checks: smoke.mjs calls the handlers directly (successful run,
unhandled throw, infinite-loop timeout, gc_max_objects,
large-output truncation, resilience to shell metacharacters in the code,
nyxilum_check (passes/catches a syntax error/does NOT run the code),
no temp-directory leaks), repl.mjs (state persists across calls within
one session, multi-line func flattening, legitimate "> " output
surviving intact, an error not killing the session, two sessions not
seeing each other's variables, an infinite loop's timeout killing the
session cleanly, no temp-directory leaks), transport.mjs — the same
things but through the REAL MCP protocol (StdioClientTransport +
Client), not just direct function calls.
Updating
No separate build/publish step for the MCP server itself — claude mcp add
points straight at this checkout's src/server.js, so updating it is just
git pull && npm install, taking effect on the next new Claude Code
session. Separately, if NyxilumLang itself has moved on, rebuild the
NyxilumNode binary this server talks to (dotnet build src/NyxilumLang in
the NyxilumLang checkout) — the two update independently.
Docker
docker build -t nyxilum-mcp .
docker run -i --rm nyxilum-mcpThe server speaks MCP over stdio, so keep -i. Needs: nothing - nx (NyxilumNode v1.8.3) is already inside the image.
In an MCP client config use "command": "docker" with the same arguments.
Startup timeout
The server itself starts in about a second, but a client launching several MCP servers at once on a cold machine (right after boot) can hit Claude Code's default 30-second startup limit and mark it "failed". That limit belongs to the client, not to the server, so raise it there - in ~/.claude/settings.json:
{ "env": { "MCP_TIMEOUT": "120000" } }(or start Claude Code as MCP_TIMEOUT=120000 claude). Takes effect in the next session.
License
MIT — Faneraiy14.
This server cannot be deployed
Maintenance
Related MCP Connectors
Connect AI assistants to authorized Windows and macOS devices for files, commands, and management.
11Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Run accessibility, contrast, and design token audits and file QA issues from your AI coding tool.
311Connect AI assistants to explicitly paired computers, servers, and VMs for permitted remote actions.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceEnables AI agents to compile, execute, and check Almide code for syntax or compilation errors. It provides tools for generating ASTs and accessing language grammar resources.-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with Arduino boards for compiling, uploading sketches, and serial communication.6MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to compile, upload, and monitor Arduino boards via natural language, with electrical safety checks and dependency management.2181 npm22MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage project analysis, code metrics, documentation, Git operations, code quality, and file organization through natural language commands.3 npm2MIT