Manage LWS (lws.fr) domains, DNS zones, hosting and account from any MCP client.
Runs on your machine from its package; the steps are below.
At most: moves money, runs code or commands, deletes data, or sends messages for you.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
uvx lws-mcp
MCP client config
{
"mcpServers": {
"lws": {
"command": "uvx",
"args": [
"lws-mcp"
]
}
}
}English · Français
An MCP server for the LWS Client API. Manage your domains, DNS zones, hosting and account from Claude, Cursor or any MCP client:
"Add the CNAME records Stripe gave me to example.fr, then tell me when they are live."
It covers the whole LWS Client API (29 endpoints), plus a propagation check that compares your LWS zone, its nameservers and three public resolvers.
Community project, not affiliated with or endorsed by LWS.
| Area | Tools |
|---|---|
| DNS | get_dns_zone · add_dns_record · update_dns_record · delete_dns_record · check_dns_propagation |
| Domains | get_domain · check_domain_availability · list_tlds · update_nameservers · set_transfer_protection · request_transfer_authcode · create_domain_redirect · delete_domain_redirect |
| Hosting | list_hostings · get_hosting · list_hosting_prices · get_renewal_prices · set_auto_renew · buy_hosting¹ · renew_hosting¹ |
| Account | get_account_balance · get_purchase_history · list_contacts · get_contact · create_contact · update_contact · add_test_credit_to_contact² · add_test_credit_to_account² |
| Requests | list_requests · list_pending_requests |
¹ Paid: off unless LWS_ENABLE_PURCHASES=true. ² Only in test mode.
DNS record names can be written in full (_dmarc.example.fr): they are shortened to what the LWS zone expects (_dmarc, @).
An assistant with access to your DNS can take a site or a mailbox down, and one with access to purchases can spend money. So:
buy_hosting and renew_hosting only exist when LWS_ENABLE_PURCHASES=true.LWS_READ_ONLY=true removes every tool that changes something.LWS_TEST_MODE=true sends every request to the LWS sandbox.api.lws.net, and is never logged or returned to the model.bad source <your IP>.Every client runs the same command, uvx lws-mcp, with LWS_LOGIN and LWS_API_KEY in its environment (see Configuration for the optional settings).
The buttons leave LWS_LOGIN and LWS_API_KEY empty: fill them in after installing.
claude mcp add lws \
-e LWS_LOGIN=123456 \
-e LWS_API_KEY=your-api-key \
-- uvx lws-mcp
codex mcp add lws \
--env LWS_LOGIN=123456 \
--env LWS_API_KEY=your-api-key \
-- uvx lws-mcp
Or in ~/.codex/config.toml:
[mcp_servers.lws]
command = "uvx"
args = ["lws-mcp"]
env = { LWS_LOGIN = "123456", LWS_API_KEY = "your-api-key" }
Use the button above, or add to ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project):
{
"mcpServers": {
"lws": {
"command": "uvx",
"args": [
"lws-mcp"
],
"env": {
"LWS_LOGIN": "123456",
"LWS_API_KEY": "your-api-key"
}
}
}
}
code --add-mcp '{"name":"lws","command":"uvx","args":["lws-mcp"],"env":{"LWS_LOGIN":"123456","LWS_API_KEY":"your-api-key"}}'
Or in .vscode/mcp.json:
{
"servers": {
"lws": {
"type": "stdio",
"command": "uvx",
"args": [
"lws-mcp"
],
"env": {
"LWS_LOGIN": "123456",
"LWS_API_KEY": "your-api-key"
}
}
}
}
Add this block to the client's MCP file:
| Client | File |
|---|---|
| Claude Desktop | Settings → Developer → Edit Config (claude_desktop_config.json) |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Gemini CLI | ~/.gemini/settings.json |
| Cline, Roo Code, Zed… | their MCP settings, same format |
{
"mcpServers": {
"lws": {
"command": "uvx",
"args": [
"lws-mcp"
],
"env": {
"LWS_LOGIN": "123456",
"LWS_API_KEY": "your-api-key"
}
}
}
}
| Variable | Default | Description |
|---|---|---|
LWS_LOGIN | required | Your LWS account ID (the digits of LWS-XXXXXX). |
LWS_API_KEY | required | Production API key. |
LWS_TEST_API_KEY | Test key, used instead of LWS_API_KEY in test mode. | |
LWS_TEST_MODE | false | Send requests to the LWS test environment. |
LWS_READ_ONLY | false | Only expose tools that read. |
LWS_ENABLE_PURCHASES | false | Expose buy_hosting and renew_hosting. |
LWS_TIMEOUT | 30 | Request timeout, in seconds. |
LWS_BASE_URL | https://api.lws.net/v1 | API base URL. |
list_pending_requests.check_dns_propagation compares what is saved in the LWS zone, what the domain's nameservers answer (no cache) and what Cloudflare, Google and Quad9 answer, then says how long a stale answer can last. Some networks block direct DNS queries to nameservers; the resolvers are asked over HTTPS, so that part always works.add_dns_record and update_dns_record return the current id.Invalid input (rate limit): wait a minute and retry.git clone https://github.com/NKSTUD/lws-mcp && cd lws-mcp
uv sync
uv run pytest
uv run ruff check . && uv run ruff format --check .
Try it against your account with the MCP Inspector, credentials in a local .env (see .env.example):
npx @modelcontextprotocol/inspector uv run --env-file .env lws-mcp
See CONTRIBUTING.md to add a tool or fix a bug.