diff --git a/.roo/mcp.json b/.roo/mcp.json
new file mode 100644
index 0000000..6e5de05
--- /dev/null
+++ b/.roo/mcp.json
@@ -0,0 +1,3 @@
+{
+ "mcpServers": {}
+}
\ No newline at end of file
diff --git a/.roo/rules-code/roo-rules.md b/.roo/rules-code/roo-rules.md
new file mode 100644
index 0000000..31dc8e6
--- /dev/null
+++ b/.roo/rules-code/roo-rules.md
@@ -0,0 +1,92 @@
+# roo-rules.md
+
+Behavioral guidelines to reduce common LLM coding mistakes. Merge with project-specific instructions as needed.
+
+**Tradeoff:** These guidelines bias toward caution over speed. For trivial tasks, use judgment.
+
+## 1. Think Before Coding
+
+**Don't assume. Don't hide confusion. Surface tradeoffs.**
+
+Before implementing:
+- State your assumptions explicitly. If uncertain, ask.
+- If multiple interpretations exist, present them - don't pick silently.
+- If a simpler approach exists, say so. Push back when warranted.
+- If something is unclear, stop. Name what's confusing. Ask.
+
+## 2. Simplicity First
+
+**Minimum code that solves the problem. Nothing speculative.**
+
+- No features beyond what was asked.
+- No abstractions for single-use code.
+- No "flexibility" or "configurability" that wasn't requested.
+- No error handling for impossible scenarios.
+- If you write 200 lines and it could be 50, rewrite it.
+
+Ask yourself: "Would a senior engineer say this is overcomplicated?" If yes, simplify.
+
+## 3. Surgical Changes
+
+**Touch only what you must. Clean up only your own mess.**
+
+When editing existing code:
+- Don't "improve" adjacent code, comments, or formatting.
+- Don't refactor things that aren't broken.
+- Match existing style, even if you'd do it differently.
+- If you notice unrelated dead code, mention it - don't delete it.
+
+When your changes create orphans:
+- Remove imports/variables/functions that YOUR changes made unused.
+- Don't remove pre-existing dead code unless asked.
+
+The test: Every changed line should trace directly to the user's request.
+
+## 4. Goal-Driven Execution
+
+**Define success criteria. Loop until verified.**
+
+Transform tasks into verifiable goals:
+- "Add validation" → "Write tests for invalid inputs, then make them pass"
+- "Fix the bug" → "Write a test that reproduces it, then make it pass"
+- "Refactor X" → "Ensure tests pass before and after"
+
+For multi-step tasks, state a brief plan:
+```
+1. [Step] → verify: [check]
+2. [Step] → verify: [check]
+3. [Step] → verify: [check]
+```
+
+Strong success criteria let you loop independently. Weak criteria ("make it work") require constant clarification.
+
+## 5. Backup + Diff Before Edit
+
+**기존 파일을 수정하기 전에 반드시 다음 두 단계를 수행할 것.**
+
+### Step 1 — 백업
+수정 대상 파일을 `.rooBackup/` 폴더에 원본 그대로 저장한다.
+
+- 저장 경로: `.rooBackup/<원본경로>/<파일명>` (디렉토리 구조 유지)
+- 예: `src/Web/wwwroot/js/app.js` → `.rooBackup/src/Web/wwwroot/js/app.js`
+- 백업 후 "백업 완료: `.rooBackup/...`" 를 출력할 것
+
+### Step 2 — Diff 제시
+변경 내용을 diff 형식으로 보여주고, 사용자 확인 후 실제 수정 진행.
+
+```diff
+- 기존 코드
++ 변경된 코드
+```
+
+변경 이유를 한 줄로 함께 설명할 것.
+
+### 예외 (백업/diff 생략 가능)
+- 신규 파일 생성
+- 공백/포맷팅만 바뀌는 경우
+
+**위반 사례 (금지):** 백업·diff 없이 바로 파일을 덮어쓰는 것 — roo가 이전에 fastRecord 섹션 전체를 날린 것이 이 케이스에 해당.
+
+---
+
+**These guidelines are working if:** fewer unnecessary changes in diffs, fewer rewrites due to overcomplication, and clarifying questions come before implementation rather than after mistakes.
\ No newline at end of file
diff --git a/.rooBackup/src/Web/Controllers/TextToSqlController.cs b/.rooBackup/src/Web/Controllers/TextToSqlController.cs
new file mode 100644
index 0000000..246a25e
--- /dev/null
+++ b/.rooBackup/src/Web/Controllers/TextToSqlController.cs
@@ -0,0 +1,364 @@
+using ExperionCrawler.Core.Application.DTOs;
+using ExperionCrawler.Core.Application.Interfaces;
+using ExperionCrawler.Infrastructure.Mcp;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Logging;
+
+namespace ExperionCrawler.Web.Controllers;
+
+///
+/// Text-to-SQL API 컨트롤러
+/// 자연어 질의를 파싱하고 시계열 데이터를 조회합니다.
+/// MCP (Model Context Protocol) 통합을 위한 엔드포인트를 제공합니다.
+///
+[ApiController]
+[Route("api/text-to-sql")]
+public class TextToSqlController : ControllerBase
+{
+ private readonly ITextToSqlService _textToSqlService;
+ private readonly IExperionDbService _dbService;
+ private readonly IMcpService _mcpService;
+ private readonly ILogger _logger;
+
+ public TextToSqlController(
+ ITextToSqlService textToSqlService,
+ IExperionDbService dbService,
+ IMcpService mcpService,
+ ILogger logger)
+ {
+ _textToSqlService = textToSqlService;
+ _dbService = dbService;
+ _mcpService = mcpService;
+ _logger = logger;
+ }
+
+ ///
+ /// 자연어 질의를 SQL로 변환
+ ///
+ [HttpPost("parse")]
+ public async Task Parse([FromBody] NaturalLanguageQueryDto dto)
+ {
+ try
+ {
+ var sql = await _textToSqlService.ParseNaturalLanguageAsync(dto.Query);
+ return Ok(new { success = true, sql });
+ }
+ catch (Exception ex)
+ {
+ return Ok(new { success = false, error = ex.Message });
+ }
+ }
+
+ ///
+ /// MCP query_with_nl 도구 호출 - 자연어 → LLM SQL 생성 → 실행
+ ///
+ [HttpPost("query-nl")]
+ public async Task QueryWithNl([FromBody] NaturalLanguageQueryDto dto)
+ {
+ if (string.IsNullOrWhiteSpace(dto.Query))
+ return BadRequest(new { success = false, error = "질문이 비어있음" });
+
+ try
+ {
+ var result = await _mcpService.QueryWithNlAsync(dto.Query);
+ if (!result.Success)
+ return Ok(new { success = false, error = result.Error });
+
+ try
+ {
+ var jsonData = System.Text.Json.JsonSerializer.Deserialize