MCP server for reading and writing .env variables (email/SMTP and custom keys)
Project description
nlp2env
AI Cost Tracking
- 🤖 LLM usage: $0.7961 (5 commits)
- 👤 Human dev: ~$566 (5.7h @ $100/h, 30min dedup)
Generated on 2026-06-08 using openrouter/qwen/qwen3-coder-next
MCP server do odczytu i zapisu pliku .env — w tym profilu SMTP/email dla workflow send_email (nlp2dsl-worker).
Instalacja
cd ~/github/semcod/nlp2env
pip install -e ".[mcp]"
Uruchomienie MCP
export NLP2ENV_ENV_FILE=~/github/wronai/todomat/.env # opcjonalnie
nlp2env-mcp
Narzędzia MCP
| Tool | Opis |
|---|---|
nlp2env_interfaces |
Metadane, ścieżka .env, profile |
nlp2env_list |
Lista kluczy (sekrety zamaskowane) |
nlp2env_get |
Odczyt kluczy (comma-separated) |
nlp2env_set |
Zapis z JSON {"SMTP_HOST":"..."} |
nlp2env_set_email |
Zapis profilu SMTP (host, user, password, …) |
nlp2env_apply_text |
Parsuj bloki KEY=value z tekstu |
nlp2env_delete |
Usuń klucze (comma-separated) z .env |
nlp2env_backup |
Kopia .env → .nlp2env/backups/ |
nlp2env_email_status |
Czy SMTP jest kompletny |
nlp2env_set_api |
Zapis kluczy API (OpenAI, Anthropic, Groq, HF) |
nlp2env_api_status |
Czy jakieś klucze API są skonfigurowane |
nlp2env_set_db |
Zapis profilu bazy danych (Postgres, Redis, Mongo) |
nlp2env_db_status |
Czy profil bazy danych jest kompletny |
nlp2env_generate_key |
Generuj nowy klucz szyfrowania Fernet |
nlp2env_encrypt |
Szyfruj plaintext → enc:<base64> |
nlp2env_decrypt |
Odszyfruj enc:<base64> → plaintext |
nlp2env_load_multi |
Połącz .env + .env.{suffix} (override wins) |
nlp2env_list_files |
Lista plików .env* w katalogu projektu |
Profil email (nlp2dsl)
Klucze zgodne z nlp2dsl worker:
SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD, SMTP_TLS, SMTP_FROM, SMTP_TIMEOUT
Po zapisie zrestartuj worker:
docker compose -f ~/github/wronai/nlp2dsl/docker-compose.yml restart worker
Profil API keys
Klucze LLM/API zapisywane przez nlp2env_set_api:
OPENAI_API_KEY, ANTHROPIC_API_KEY, GROQ_API_KEY, HUGGINGFACE_API_TOKEN
Profil database
Klucze PostgreSQL, Redis i MongoDB zapisywane przez nlp2env_set_db:
POSTGRES_HOST, POSTGRES_PORT, POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD
REDIS_URL, REDIS_HOST, REDIS_PORT
MONGO_URI
nlp2env_db_status sprawdza czy PostgreSQL jest kompletny (host, db, user, password) oraz czy Redis/Mongo są skonfigurowane.
Wiele .env (suffix)
resolve_env_path obsługuje suffix — automatycznie wybiera .env.local, .env.production:
# env_file.py
resolve_env_path(suffix="local") # → ./.env.local
resolve_env_path(suffix="production") # → ./.env.production
MCP tool nlp2env_load_multi ładuje base .env a potem overlay .env.{suffix} (override nadpisuje base):
# .env
SMTP_HOST=prod.server.com
SMTP_PORT=587
# .env.local
SMTP_HOST=localhost
SMTP_PORT=2525
nlp2env_load_multi(suffix="local") → SMTP_HOST=localhost, SMTP_PORT=2525
Cursor (mcp.json)
{
"mcpServers": {
"nlp2env": {
"command": "nlp2env-mcp",
"env": {
"NLP2ENV_ENV_FILE": "/home/tom/github/wronai/todomat/.env"
}
}
}
}
uri2env
Pakiet uri2env (w src/uri2env/) mapuje URI env:// na plik .env — używany przez nlp2uri do adresowania konfiguracji:
pip install -e ".[mcp,nlp2uri]"
uri2env materialize --uri 'env://nlp2env/smtp?dest=./.env'
W nlp2uri: resolve_env() → env://… → materialize_env().
Walidacja formatów
nlp2env_set i nlp2env_set_email automatycznie walidują wartości:
| Format | Klucze (suffix/prefix) | Przykład poprawny |
|---|---|---|
_EMAIL, _USER |
jan@firma.pl |
|
| Host/IP | _HOST, SERVER, ADDRESS |
smtp.gmail.com, 192.168.1.1 |
| Port | _PORT, _TIMEOUT |
587, 30 |
| URL | _URL |
https://api.example.com |
| Bool | _TLS, _ENABLED |
1, true, yes, on |
| API key | _API_KEY, _TOKEN |
sk-..., gsk-..., hf_... |
Błędy walidacji zatrzymują zapis i zwracają validation_errors w odpowiedzi MCP.
Szyfrowanie wartości
Wartości w .env mogą być szyfrowane AES-128-CBC + HMAC (Fernet):
# Generuj klucz
nlp2env_generate_key() # → zapisz do ~/.nlp2env/key lub NLP2ENV_MASTER_KEY
# Szyfruj
nlp2env_encrypt("sekret123") # → "enc:gAAAAAB..."
# Zapisz zaszyfrowane do .env
nlp2env_set('{"API_KEY": "enc:gAAAAAB..."}')
# Odszyfruj (automatycznie przy odczycie przez MCP)
nlp2env_decrypt("enc:gAAAAAB...") # → "sekret123"
Klucz — 32 bajty base64 (44 znaki), generowany przez generate_key() lub hasło przez _derive_key().
Maskowanie — zaszyfrowane wartości wyświetlane jako enc:****wxyz.
Testy
pip install -e ".[dev]"
pytest
make examples # szybkie e2e
make examples-multilang # 26 promptów LLM/Ollama (16 języków)
make examples-all # oba
prompts-multilang.txt (examples/write/smtp-email/) — 26 wielojęzycznych promptów NL testujących ścieżkę LLM → MCP → .env; uruchamiane przez make examples-multilang. Opis: examples/write/smtp-email/README.md.
Przykłady NL → .env (Docker + README): examples/README.md.
License
Licensed under Apache-2.0.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nlp2env-0.1.5.tar.gz.
File metadata
- Download URL: nlp2env-0.1.5.tar.gz
- Upload date:
- Size: 30.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7750fd8f9aa8a0e632b14fa8bc01da8bee5c0f15e425b3dadd5fa8b550bd4373
|
|
| MD5 |
f84a194d6bf2164dadef6a36369c3a23
|
|
| BLAKE2b-256 |
fce734b0281335687826446bc28ac373187fb3bf26502ef56dca5e47a26b417a
|
File details
Details for the file nlp2env-0.1.5-py3-none-any.whl.
File metadata
- Download URL: nlp2env-0.1.5-py3-none-any.whl
- Upload date:
- Size: 27.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
21cc29998af4ac3da62123e9360d0c9cfe4eb0fda33f074b55bca1202f1119ca
|
|
| MD5 |
b6aea542a4b2e2874442ff2a39d24b7d
|
|
| BLAKE2b-256 |
aaf3e9560b03371f7a1d9ede719fc7faa5bf9c30654494b64c798f263b2b2216
|