diff --git a/docs-site/src/content/docs/guides/idf-workflow.mdx b/docs-site/src/content/docs/guides/idf-workflow.mdx
new file mode 100644
index 0000000..8e4ca97
--- /dev/null
+++ b/docs-site/src/content/docs/guides/idf-workflow.mdx
@@ -0,0 +1,223 @@
+---
+title: IDF Project Workflows
+description: Build, flash, and monitor ESP-IDF projects through MCP tools
+sidebar:
+ order: 8
+---
+
+import { Steps, Aside, Tabs, TabItem, LinkCard } from '@astrojs/starlight/components';
+
+mcesptool wraps ESP-IDF's toolchain management and project build system as MCP tools. This guide walks through the full development cycle: checking your environment, setting up toolchains for a target chip, building, flashing, and monitoring. Each section is self-contained -- jump to the step you need.
+
+## Check your environment
+
+Before building anything, confirm that ESP-IDF is detected and see which toolchains are installed.
+
+
+
+1. Get the ESP-IDF path, version, and environment variables:
+
+ ```python
+ result = await client.call_tool("idf_env_info", {})
+ ```
+
+ The response includes `idf_path`, `idf_version`, and the `PATH` additions that ESP-IDF exports. If `success` is `false`, ESP-IDF is not installed or not on the system path.
+
+2. Check which tools are installed vs missing:
+
+ ```python
+ result = await client.call_tool("idf_tools_check", {})
+ ```
+
+ The response lists every tool with its install status. The `installed_count` and `missing_count` fields give a quick summary.
+
+
+
+
+
+## Set up a new target chip
+
+When you need to build for a chip you have not used before (say, an ESP32-P4), some toolchains may be missing. The RISC-V targets need the `riscv32-esp-elf` toolchain; Xtensa targets need `xtensa-esp-elf`.
+
+
+
+1. Check readiness for the specific target:
+
+ ```python
+ result = await client.call_tool("idf_tools_check", {
+ "target": "esp32p4"
+ })
+ ```
+
+ Look at the `target_ready` field. If it is `false`, the `missing_for_target` array tells you exactly which tools are needed.
+
+2. Install the missing tools:
+
+ ```python
+ result = await client.call_tool("idf_tools_install", {
+ "targets": ["esp32p4"]
+ })
+ ```
+
+ This downloads and installs only the tools required for the specified targets. You can pass multiple targets at once (e.g. `["esp32p4", "esp32c6"]`) to install everything in a single operation.
+
+3. Verify the installation:
+
+ ```python
+ result = await client.call_tool("idf_tools_check", {
+ "target": "esp32p4"
+ })
+ # result["target_ready"] should now be true
+ ```
+
+
+
+
+
+## Build a project
+
+With the toolchain in place, build an ESP-IDF project for your target.
+
+```python
+result = await client.call_tool("idf_build_project", {
+ "project_path": "/home/user/esp/my-project",
+ "target": "esp32p4"
+})
+```
+
+The `project_path` must point to a directory containing a `CMakeLists.txt`. The tool runs `idf.py set-target` followed by `idf.py build`.
+
+
+
+ The default behavior is an incremental build. CMake only recompiles files that changed since the last build.
+
+ ```python
+ result = await client.call_tool("idf_build_project", {
+ "project_path": "/home/user/esp/my-project",
+ "target": "esp32s3"
+ })
+ ```
+
+
+ If you are switching targets or need to start fresh, set `clean` to `true`. This runs `idf.py fullclean` before building.
+
+ ```python
+ result = await client.call_tool("idf_build_project", {
+ "project_path": "/home/user/esp/my-project",
+ "target": "esp32s3",
+ "clean": True
+ })
+ ```
+
+ A clean build is also useful when you see stale object files causing link errors after changing `sdkconfig` options.
+
+
+
+## Flash to device
+
+Once the build completes, flash it to a connected device.
+
+```python
+result = await client.call_tool("idf_flash_project", {
+ "project_path": "/home/user/esp/my-project",
+ "port": "/dev/ttyUSB0"
+})
+```
+
+The tool runs `idf.py flash` using the build artifacts already in the project's `build/` directory. It flashes the bootloader, partition table, and application binary in one operation.
+
+
+
+## Monitor output
+
+After flashing, capture the device's serial output to verify it booted correctly.
+
+```python
+result = await client.call_tool("idf_monitor", {
+ "port": "/dev/ttyUSB0",
+ "duration": 15
+})
+```
+
+The tool captures serial output for the specified duration (default 10 seconds, max 60) and returns it as text.
+
+### ELF-based crash decoding
+
+When you provide the `project_path`, IDF monitor uses the built ELF file to decode crash backtraces into source file names and line numbers.
+
+```python
+result = await client.call_tool("idf_monitor", {
+ "port": "/dev/ttyUSB0",
+ "project_path": "/home/user/esp/my-project",
+ "duration": 20
+})
+```
+
+Without `project_path`, backtrace addresses appear as raw hex values. With it, you get output like `app_main.c:42` instead of `0x400d1234`.
+
+## Troubleshoot
+
+### ESP-IDF not detected
+
+If `idf_env_info` returns `success: false`, the IDF path is not set. Common causes:
+
+- ESP-IDF is not installed. Follow the [ESP-IDF Get Started guide](https://docs.espressif.com/projects/esp-idf/en/stable/esp32/get-started/) to install it.
+- The `IDF_PATH` environment variable is not set in the shell where the MCP server runs. Make sure `export.sh` (or `export.bat` on Windows) has been sourced before starting the server.
+
+### Tier 2 tools report "environment not available"
+
+The build, flash, and monitor tools require a fully configured IDF environment. If they fail with this error:
+
+
+
+1. Run `idf_tools_check` to see what is missing.
+
+2. Run `idf_tools_install` with the appropriate targets.
+
+3. Restart the MCP server so the updated PATH takes effect.
+
+
+
+### Missing tools for a target
+
+When `idf_tools_check` shows `target_ready: false`, the specific toolchain for that chip architecture is not installed. RISC-V targets (esp32c2, esp32c3, esp32c5, esp32c6, esp32c61, esp32h2, esp32p4) need `riscv32-esp-elf`. Xtensa targets (esp32, esp32s2, esp32s3) need `xtensa-esp-elf`. Run `idf_tools_install` with the target name and the correct toolchain is resolved automatically.
+
+### Build failures after switching targets
+
+If you change the `target` parameter without cleaning the build directory, CMake may fail with configuration errors. Use a clean build:
+
+```python
+result = await client.call_tool("idf_build_project", {
+ "project_path": "/home/user/esp/my-project",
+ "target": "esp32c6",
+ "clean": True
+})
+```
+
+### Flash connection failures
+
+If flashing fails with a connection timeout:
+
+- Confirm the device is in download mode. Most dev boards enter download mode automatically, but some require holding the BOOT button during reset.
+- Check the serial port path. Use `esp_detect_ports` to list connected devices.
+- Try a lower baud rate. Long USB cables or cheap adapters may not sustain 460800 baud reliably.
+
+