Pytraeger Client
FreeNot checkedAsync Python client for the Traeger WiFIRE grill IoT API, with an optional MCP server
About
Async Python client for the Traeger WiFIRE grill IoT API, with an optional MCP server
README
Async Python client for the Traeger WiFIRE grill IoT API, with an optional MCP server so LLM agents (Claude Desktop, Claude Code, …) can monitor and control your grill.
Disclaimer: This library uses an unofficial, reverse-engineered API that may change at any time without notice. It is not affiliated with or endorsed by Traeger. See api.md for the API reference this is built on.
The Traeger API is fully cloud-based: the library talks to Traeger's cloud (HTTPS + MQTT over WebSockets, all on port 443), never to the grill directly. It works from anywhere with internet access — your laptop, a server, or a cloud agent sandbox — as long as the grill itself is online.
Installation
pip install pytraeger-client # client library
pip install "pytraeger-client[mcp]" # + MCP server
Requires Python 3.11+.
Library usage
import asyncio
from pytraeger_client import TraegerClient
async def main():
async with TraegerClient("[email protected]", "your-password") as client:
grills = await client.get_grills()
grill = grills[0]
print(grill.friendly_name, grill.thing_name)
# Read live state (one MQTT round trip)
state = await client.get_status(grill.thing_name)
print(state.status.system_status.name, state.status.grill_temperature)
# Control the grill
await client.set_temperature(grill.thing_name, 225)
await client.set_probe_temperature(grill.thing_name, 165)
await client.set_super_smoke(grill.thing_name, True)
# await client.shutdown(grill.thing_name)
asyncio.run(main())
Streaming live updates
There is no REST endpoint for grill state — the grill publishes it over MQTT.
TraegerMqttListener handles the signed-URL handshake, subscription, and
reconnection for you:
from pytraeger_client import TraegerClient, TraegerMqttListener
async with TraegerClient(username, password) as client:
listener = TraegerMqttListener(client, ["YOUR_THING_NAME"])
async for state in listener.listen():
print(state.status.grill_temperature, "→", state.status.target_temperature)
API surface
| Method | Effect |
|---|---|
get_user() / get_grills() |
Account profile and registered grills |
get_status(thing_name) |
One-shot live state via MQTT |
set_temperature(thing_name, temp) |
Set grill target temperature |
set_timer(thing_name, seconds) / clear_timer(...) |
Cook timer |
set_probe_temperature(thing_name, temp) |
Probe target/alarm temperature |
set_keep_warm(thing_name, on) |
Keep Warm mode |
set_super_smoke(thing_name, on) |
Super Smoke mode |
shutdown(thing_name) |
Start the cool-down cycle |
send_command(thing_name, cmd) |
Raw command escape hatch |
Temperatures use whatever units the grill is configured for — check
state.status.units (Units.CELSIUS / Units.FAHRENHEIT).
MCP server
The traeger-mcp server exposes the grill as MCP tools: list_grills,
get_grill_status, set_grill_temperature, set_cook_timer,
clear_cook_timer, set_probe_target, set_keep_warm, set_super_smoke,
and shutdown_grill.
Credentials come from the TRAEGER_USERNAME / TRAEGER_PASSWORD environment
variables.
Claude Code
claude mcp add traeger \
-e [email protected] \
-e TRAEGER_PASSWORD=your-password \
-- traeger-mcp
Claude Desktop
Open the config file from Settings → Developer → Edit Config (this creates it if needed), or edit it directly:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Use an absolute command path. Claude Desktop launches MCP servers with a minimal environment that usually does not include your shell
PATH, so a bare"command": "traeger-mcp"typically fails with "spawn traeger-mcp ENOENT". Pointcommandat the full path instead — find it withwhich traeger-mcp(macOS/Linux) orwhere traeger-mcp(Windows) after installing.
{
"mcpServers": {
"traeger": {
"command": "/absolute/path/to/traeger-mcp",
"env": {
"TRAEGER_USERNAME": "[email protected]",
"TRAEGER_PASSWORD": "your-password"
}
}
}
}
Or run it straight from a source checkout with uv,
which avoids the PATH problem entirely (replace the directory with your clone
location):
{
"mcpServers": {
"traeger": {
"command": "uv",
"args": ["run", "--directory", "/path/to/pytraeger-client", "traeger-mcp"],
"env": {
"TRAEGER_USERNAME": "[email protected]",
"TRAEGER_PASSWORD": "your-password"
}
}
}
}
If uv itself isn't found, use its absolute path too (which uv).
After saving, fully quit and reopen Claude Desktop (a window reload isn't
enough). The traeger tools then appear under the tools (🔨) icon in the chat
box. If the server fails to start, check the logs at
~/Library/Logs/Claude/mcp-server-traeger.log (macOS).
Remote / cloud hosting
The server also speaks Streamable HTTP for use as a remote MCP endpoint:
traeger-mcp --transport http --host 0.0.0.0 --port 8000
Security: in HTTP mode, anyone who can reach the endpoint can control your grill with your credentials. Run it only on a private network or behind an authenticating reverse proxy — never exposed directly to the internet.
Development
uv sync # install with dev dependencies
uv run pytest # mocked tests (no credentials needed)
uv run ruff check . && uv run mypy
# Live read-only smoke test against your real account/grill:
TRAEGER_USERNAME=... TRAEGER_PASSWORD=... uv run python scripts/smoke_test.py
License
MIT
Installing Pytraeger Client
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/bruno-t-de-renzo/pytraeger-clientFAQ
Is Pytraeger Client MCP free?
Yes, Pytraeger Client MCP is free — one-click install via Unyly at no cost.
Does Pytraeger Client need an API key?
No, Pytraeger Client runs without API keys or environment variables.
Is Pytraeger Client hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Pytraeger Client in Claude Desktop, Claude Code or Cursor?
Open Pytraeger Client on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
GitHub
PRs, issues, code search, CI status
by GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
by mcpdotdirectCompare Pytraeger Client with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All development MCPs
