Skip to main content
Glama
moosin76

Windows Scoped Remote MCP Server

by moosin76
README.md
# ๐Ÿ›ก๏ธ Windows Scoped Remote MCP Server

Windows ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๋Š” **๋ณด์•ˆ ๊ฒฉ๋ฆฌํ˜• ์›๊ฒฉ ๊ฐœ๋ฐœ MCP(Model Context Protocol) ์„œ๋ฒ„**์ž…๋‹ˆ๋‹ค.

ChatGPT, Claude ๋“ฑ MCP๋ฅผ ์ง€์›ํ•˜๋Š” LLM ํด๋ผ์ด์–ธํŠธ์™€ ์—ฐ๊ฒฐํ•˜์—ฌ ์‹ค์ œ Windows ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ํŒŒ์ผ, ํ„ฐ๋ฏธ๋„, ํ”„๋กœ์„ธ์Šค, ๋ธŒ๋ผ์šฐ์ €, ์—ฌ๋Ÿฌ Workspace๋ฅผ ๋Œ€ํ™”ํ˜•์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Godot, Blender ๋“ฑ ๋ณ„๋„์˜ Remote MCP๋ฅผ **Provider**๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด ํ•˜๋‚˜์˜ Gateway์—์„œ ๋‹ค์–‘ํ•œ ๊ฐœ๋ฐœ ๋„๊ตฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

### โค๏ธ ํ”„๋กœ์ ํŠธ ํ›„์›

WSR์ด ์œ ์šฉํ–ˆ๋‹ค๋ฉด GitHub Sponsors๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ํ›„์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

**[๐Ÿ’– GitHub Sponsors๋กœ ํ›„์›ํ•˜๊ธฐ](https://github.com/sponsors/moosin76)**

ํ›„์›์€ WSR์˜ ์œ ์ง€๋ณด์ˆ˜์™€ ์ƒˆ๋กœ์šด MCP Provider ๋ฐ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

---

## ์ฃผ์š” ํŠน์ง•

- **Windows SandboxGuard** โ€” ์„ค์ •ํ•œ Workspace ๊ฒฝ๊ณ„ ์•ˆ์—์„œ ํŒŒ์ผ๊ณผ ๋ช…๋ น ์‹คํ–‰์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
- **Multi-Workspace** โ€” ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ํ™œ์„ฑ Workspace๋ฅผ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ChatGPT/MCP ์„ธ์…˜๋ณ„๋กœ ํ™œ์„ฑ Workspace ์ƒํƒœ๊ฐ€ ๋…๋ฆฝ๋ฉ๋‹ˆ๋‹ค.
- **ํŒŒ์ผ/์ฝ”๋“œ ๊ด€๋ฆฌ** โ€” ์กฐํšŒ, ์ƒ์„ฑ, ์ˆ˜์ •, ์ด๋™, ๋ณต์‚ฌ, ์‚ญ์ œ, patch ์ ์šฉ ๋“ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
- **PowerShell / CMD / ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ** โ€” ๊ฐœ๋ฐœ ๋ช…๋ น ์‹คํ–‰๊ณผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
- **Playwright ๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™”** โ€” ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด๊ณ  ํƒ์ƒ‰, ์ž…๋ ฅ, ํด๋ฆญ, ์Šคํฌ๋ฆฐ์ƒท ๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
- **Remote MCP Provider** โ€” Godot, Blender ๋“ฑ ์›ํ•˜๋Š” MCP๋ฅผ Gateway์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- **Provider ์žฅ์•  ๊ฒฉ๋ฆฌ** โ€” ํ•˜๋‚˜์˜ MCP๊ฐ€ ๊บผ์ ธ ์žˆ์–ด๋„ WSR Core์™€ ๋‹ค๋ฅธ Provider๋Š” ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- **Provider Scheduler** โ€” MCP์˜ ์—ฐ๊ฒฐ ์ƒํƒœ์™€ `tools/list`๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•˜๊ณ  ์ž๋™ ์žฌ์—ฐ๊ฒฐ ๋ฐ Tool Registry ๊ฐฑ์‹ ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
- **Provider Tool ๋ณ€๊ฒฝ ์•Œ๋ฆผ** โ€” Remote MCP์˜ Tool ๋ชฉ๋ก์ด ๋ฐ”๋€Œ๋ฉด ์ง€์›ํ•˜๋Š” modern MCP ํด๋ผ์ด์–ธํŠธ์— `tools/list_changed` ์•Œ๋ฆผ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
- **Project Handoff / Resume** โ€” `workspace_context`์™€ `workspace_resume`์œผ๋กœ Git, AGENTS, Roadmap, Session ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค๋ฅธ AI/์„ธ์…˜์—์„œ ์ž‘์—… ์ƒํƒœ๋ฅผ ์ด์–ด๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- **WSR ์šด์˜ ์ง„๋‹จ** โ€” `wsr_status` ํ•˜๋‚˜๋กœ WSR, Workspace, Provider, Browser, cloudflared ๋ฐ ์ธ์ฆ ์„ค์ • ์ƒํƒœ๋ฅผ ๋น„๋ฐ€๊ฐ’ ์—†์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- **OAuth 2.1 / Cloudflare Tunnel ์ง€์›** โ€” ์›๊ฒฉ MCP ํด๋ผ์ด์–ธํŠธ์™€ ์•ˆ์ „ํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
- **MCP 2026-07-28 + legacy ํ˜ธํ™˜** โ€” `server/discover` ๊ธฐ๋ฐ˜ ์ตœ์‹  stateless ์š”์ฒญ๊ณผ 2025 `initialize` ํ๋ฆ„์„ ๊ฐ™์€ `/mcp` endpoint์—์„œ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

---

## ์•„ํ‚คํ…์ฒ˜

```text
                         ChatGPT / Claude
                                โ”‚
                         MCP / HTTPS
                                โ”‚
                       Cloudflare Tunnel
                                โ”‚
                                โ–ผ
                 Windows Scoped Remote MCP Server
                                โ”‚
              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
              โ”‚                 โ”‚                 โ”‚
           Workspace        Playwright          Providers
              โ”‚                 โ”‚                 โ”‚
       Files / Process      Browser tools    โ”Œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”
                                             โ”‚    โ”‚     โ”‚
                                           Godot Blender ...
                                             โ”‚    โ”‚
                                         godot_* blender_*
```

WSR ์ž์ฒด๋Š” Gateway ์—ญํ• ์„ ํ•˜๊ณ , ์™ธ๋ถ€ MCP๋Š” `RemoteMcpProvider`๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. Provider transport๋Š” Streamable HTTP, legacy SSE, local stdio๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

HTTP MCP ๊ณ„์ธต์€ ๊ณต์‹ TypeScript SDK v2์˜ `createMcpHandler`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. `2026-07-28` ํด๋ผ์ด์–ธํŠธ์—๋Š” `server/discover`์™€ ์š”์ฒญ๋ณ„ `_meta` envelope๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๊ธฐ์กด ํด๋ผ์ด์–ธํŠธ์—๋Š” ๊ฐ™์€ tool ์ •์˜๋กœ 2025-era stateless `initialize` fallback์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

```text
POST /mcp
  โ”œโ”€ MCP 2026-07-28 โ†’ server/discover / per-request envelope
  โ””โ”€ MCP 2025-era  โ†’ initialize / notifications/initialized
```

---

## Remote MCP Provider

์‚ฌ์šฉ์ž๋งˆ๋‹ค ํ•„์š”ํ•œ MCP๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ WSR์€ ํŠน์ • MCP ํ•˜๋‚˜์— ์ข…์†๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:

```text
WSR
โ”œโ”€โ”€ Godot MCP
โ”œโ”€โ”€ Blender MCP
โ”œโ”€โ”€ Playwright
โ””โ”€โ”€ ์‚ฌ์šฉ์ž๊ฐ€ ์ถ”๊ฐ€ํ•œ MCP
```

๊ฐ Provider์—๋Š” namespace๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

| MCP        | Namespace ์˜ˆ์‹œ |
| :--------- | :------------- |
| Godot      | `godot_*`      |
| Blender    | `blender_*`    |
| Browser    | `browser_*`    |
| ์ƒˆ๋กœ์šด MCP | `<provider>_*` |

์˜ˆ๋ฅผ ๋“ค์–ด Blender MCP์˜ `get_scene`์€ WSR์—์„œ `blender_get_scene`์œผ๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

### MCP๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•

ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐ›์€ ํ›„ ChatGPT์—๊ฒŒ ๋‹ค์Œ์ฒ˜๋Ÿผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```text
์ด windows-scoped-remote-mcp-server ํ”„๋กœ์ ํŠธ์— Blender MCP๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜.
AGENTS.md์™€ skills/add-remote-mcp-provider/SKILL.md๋ฅผ ๋จผ์ € ์ฝ๊ณ 
๊ธฐ์กด RemoteMcpProvider / ProviderRegistry ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ผ ์ž‘์—…ํ•ด์ค˜.
Blender MCP์˜ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•๊ณผ ํ•„์š”ํ•œ ์„ค์ •์„ ํ™•์ธํ•˜๊ณ 
blender_* namespace๋ฅผ ์‚ฌ์šฉํ•ด์ค˜.
ํ…Œ์ŠคํŠธ์™€ ๋ฌธ์„œ๋„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  typecheck์™€ ์ „์ฒด ํ…Œ์ŠคํŠธ๊นŒ์ง€ ์‹คํ–‰ํ•ด์ค˜.
```

์ž์„ธํ•œ ์ ˆ์ฐจ๋Š” `skills/add-remote-mcp-provider/SKILL.md`๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

---

## Provider๊ฐ€ ๊บผ์ ธ ์žˆ์–ด๋„ WSR์€ ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค

Remote MCP๋Š” ์„ ํƒ์  ์˜์กด์„ฑ์ž…๋‹ˆ๋‹ค.

```text
Godot MCP OFF
     โ”‚
     โ–ผ
Godot Provider = unavailable
     โ”‚
     โ”œโ”€โ”€ WSR Core       โ†’ ๊ณ„์† ์‚ฌ์šฉ ๊ฐ€๋Šฅ
     โ”œโ”€โ”€ Playwright     โ†’ ๊ณ„์† ์‚ฌ์šฉ ๊ฐ€๋Šฅ
     โ””โ”€โ”€ ๋‹ค๋ฅธ Provider  โ†’ ๊ณ„์† ์‚ฌ์šฉ ๊ฐ€๋Šฅ
```

Provider ์—ฐ๊ฒฐ ์‹คํŒจ ๋•Œ๋ฌธ์— WSR ์ „์ฒด๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Provider-specific tool์„ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

```text
MCP provider 'godot' (godot) is not connected.
Start the godot MCP server/editor and try again.
```

ํ˜„์žฌ ์ƒํƒœ๋Š” `mcp_provider_status` tool๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

---

## Provider Scheduler

WSR์€ `ProviderScheduler`๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•˜์—ฌ Remote MCP์˜ ์ƒํƒœ๋ฅผ ์ง€์†์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

```text
                    ProviderScheduler
                           โ”‚
             โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
             โ–ผ                           โ–ผ
        CONNECTED                    UNAVAILABLE
             โ”‚                           โ”‚
        tools/list                    reconnect
             โ”‚                           โ”‚
       ๋ณ€๊ฒฝ ์—ฌ๋ถ€ ํ™•์ธ                tools/list
             โ”‚                           โ”‚
             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           โ–ผ
                    Tool Registry ๊ฐฑ์‹ 
```

๊ธฐ๋ณธ๊ฐ’:

- ์—ฐ๊ฒฐ๋œ Provider health check: **10์ดˆ**
- ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ Provider retry: **5์ดˆ**

ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```env
MCP_PROVIDER_HEALTH_INTERVAL_MS=10000
MCP_PROVIDER_RETRY_INTERVAL_MS=5000
```

### MCP๋ฅผ ์ผฐ๋‹ค ๊บผ๋„ ์ž๋™์œผ๋กœ ๋”ฐ๋ผ๊ฐ‘๋‹ˆ๋‹ค

```text
WSR ์‹คํ–‰
   โ†“
Godot OFF
   โ†“
Provider unavailable
   โ†“
Godot ์‹คํ–‰
   โ†“
Scheduler๊ฐ€ ์ž๋™ ๋ฐœ๊ฒฌ
   โ†“
tools/list
   โ†“
godot_* Tool Registry ๊ฐฑ์‹ 
```

๋”ฐ๋ผ์„œ Provider๋ฅผ ์ผœ๊ฑฐ๋‚˜ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด WSR ์ž์ฒด๋ฅผ ์žฌ์‹œ์ž‘ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Remote MCP์˜ Tool ์ •์˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด `tools/list` ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•˜์—ฌ Registry snapshot๋„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

Remote MCP์˜ Tool ์ •์˜๊ฐ€ ๋ฐ”๋€Œ๋ฉด Registry snapshot์„ ๊ฐฑ์‹ ํ•œ ๋’ค, ์ง€์›ํ•˜๋Š” modern MCP ํด๋ผ์ด์–ธํŠธ์—๋Š” ํ‘œ์ค€ `tools/list_changed` ์•Œ๋ฆผ์„ fan-outํ•ฉ๋‹ˆ๋‹ค. ์•Œ๋ฆผ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” legacy ํด๋ผ์ด์–ธํŠธ๋„ ๋‹ค์Œ `tools/list` ์š”์ฒญ์—์„œ ์ตœ์‹  Registry๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. Provider์˜ ์‹คํ–‰/์ข…๋ฃŒ๋‚˜ Tool ๋ชฉ๋ก ๋ณ€๊ฒฝ ๋•Œ๋ฌธ์— WSR ์ž์ฒด๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

---

## ํ”„๋กœ์ ํŠธ ์ž‘์—… ์ธ๊ณ„์™€ ์žฌ๊ฐœ

WSR์€ Codex, ChatGPT/WSR ๋“ฑ ์„œ๋กœ ๋‹ค๋ฅธ AI ์ž‘์—… ํ™˜๊ฒฝ ์‚ฌ์ด์—์„œ **๋Œ€ํ™” ๊ธฐ๋ก์ด ์•„๋‹ˆ๋ผ ์ €์žฅ์†Œ ์ž์ฒด๋ฅผ ๊ณตํ†ต ๊ธฐ์ค€**์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ณตํ†ต ๊ธฐ์ค€์€ Git ์ƒํƒœ, `AGENTS.md`, Roadmap, TODO, Session/Handoff ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

`workspace_context`๋Š” ๋“ฑ๋ก๋œ Workspace๋ฅผ ์ „ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ •๋ณด๋ฅผ read-only๋กœ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.

- ํ˜„์žฌ Git branch / HEAD / dirty ์ƒํƒœ / ์ตœ๊ทผ commit
- `AGENTS.md` ๋˜๋Š” `AGENT.md`
- Roadmap
- ์ตœ๊ทผ Session/Handoff ๋ฌธ์„œ
- TODO ๋ฌธ์„œ

`workspace_resume`๋Š” ์ด ์ •๋ณด๋ฅผ ๋‹ค์‹œ ํ•ด์„ํ•ด ์ž‘์—… ์žฌ๊ฐœ์— ํ•„์š”ํ•œ ํžŒํŠธ๋ฅผ ๊ตฌ์กฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

```text
workspace_context(workspace="ec")
workspace_resume(workspace="ec")

โ†’ branch/session ๋ถˆ์ผ์น˜ ๊ฒฝ๊ณ 
โ†’ dirty ๋ณ€๊ฒฝ ์˜์—ญ ์š”์•ฝ
โ†’ Roadmap์˜ ๋‹ค์Œ ์ž‘์—…
โ†’ ์ตœ์‹  handoff ๊ธฐ์ค€ resume summary
```

๋‘ Tool ๋ชจ๋‘ ๋Œ€์ƒ Workspace๋ฅผ ์ „ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ChatGPT์—์„œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋ฉด์„œ ํ˜„์žฌ ํ™œ์„ฑ Workspace๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋™์ž‘์€ `docs/workspace-context.md`์™€ `docs/workspace-resume.md`๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

---

## WSR ์šด์˜ ์ƒํƒœ ์ง„๋‹จ

`wsr_status`๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ง„๋‹จ Tool์„ ๋”ฐ๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  WSR์˜ ํ•ต์‹ฌ ์šด์˜ ์ƒํƒœ๋ฅผ ํ•œ ๋ฒˆ์— ํ™•์ธํ•˜๋Š” read-only Tool์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ์ •๋ณด:

- WSR version / Git commit / uptime / Node version
- active Workspace์™€ ๋“ฑ๋ก Workspace ์ˆ˜
- Provider ์—ฐ๊ฒฐ ์ƒํƒœ์™€ Tool ๊ฐœ์ˆ˜
- Browser manager ์ดˆ๊ธฐํ™”/ํŽ˜์ด์ง€ ์ƒํƒœ
- cloudflared ์„ค์น˜ ๋ฐ ๋ฒ„์ „
- public endpoint, OAuth, static auth, Tunnel token์˜ **์„ค์ • ์—ฌ๋ถ€**
- ์šด์˜์ƒ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•œ warning

์‘๋‹ต์—๋Š” ์‹ค์ œ token/password/cookie/session ๊ฐ’์ด๋‚˜ Provider raw error๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. WSR ์‹œ์ž‘ ๋กœ๊ทธ์™€ Tunnel ์—ฐ๊ฒฐ ๋กœ๊ทธ ์—ญ์‹œ Bearer token ์›๋ฌธ์„ ์ถœ๋ ฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ `docs/wsr-status.md`๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

---

## Multi-Workspace

์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‚˜์˜ WSR์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```env
MCP_WORKSPACE_FILE=workspaces.local.json
```

`workspaces.example.json`์„ `workspaces.local.json`์œผ๋กœ ๋ณต์‚ฌํ•œ ๋’ค Workspace๋ฅผ ํ•œ ํ•ญ๋ชฉ์”ฉ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์— ๋“ฑ๋ก๋œ ์ฒซ ๋ฒˆ์งธ Workspace๊ฐ€ ์ž๋™์œผ๋กœ ํ™œ์„ฑ Workspace๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ `MCP_WORKSPACE_ROOT` ์„ค์ •์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด `MCP_WORKSPACE_ROOTS` ํ•œ ์ค„ ํ˜•์‹์€ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๊ณ„์† ์ง€์›๋ฉ๋‹ˆ๋‹ค.

ํ™œ์„ฑ Workspace ์ƒํƒœ๋Š” MCP ์„ธ์…˜๋ณ„๋กœ ๋…๋ฆฝ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋กœ ๋‹ค๋ฅธ ChatGPT ์ฑ„ํŒ…์—์„œ ๊ฐ๊ฐ `game`, `tools`์ฒ˜๋Ÿผ ๋‹ค๋ฅธ Workspace๋ฅผ ์„ ํƒํ•ด๋„ `switch_workspace` ์ƒํƒœ๊ฐ€ ๋‹ค๋ฅธ ์ฑ„ํŒ…์œผ๋กœ ์ „ํŒŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. MCP 2025-era๋Š” `Mcp-Session-Id`, ChatGPT์˜ MCP 2026-07-28 ์—ฐ๊ฒฐ์€ `x-openai-session`์„ ๊ธฐ์ค€์œผ๋กœ ์„ธ์…˜์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

Workspace ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚œ ํŒŒ์ผ ๋ฐ ๋ช…๋ น ์ ‘๊ทผ์€ SandboxGuard๊ฐ€ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์„ธ๋ถ€ ๊ตฌํ˜„์€ `docs/session-scoped-workspaces.md`๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

---

## Playwright

Playwright๊ฐ€ ํ†ตํ•ฉ๋˜์–ด ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ MCP๋ฅผ ํ†ตํ•ด ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```text
ChatGPT
   โ†“
"๋ธŒ๋ผ์šฐ์ €์—์„œ ํŽ˜์ด์ง€๋ฅผ ์—ด๊ณ  ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ค˜"
   โ†“
WSR
   โ†“
Playwright
   โ†“
์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €
```

์ง€์› ์˜ˆ:

- URL ์ด๋™
- ์š”์†Œ ํด๋ฆญ
- ์ž…๋ ฅ/ํผ ์ž‘์„ฑ
- ํ‚ค๋ณด๋“œ ์ž…๋ ฅ
- ํŽ˜์ด์ง€ ๋‚ด์šฉ ์กฐํšŒ
- JavaScript ํ‰๊ฐ€
- ์Šคํฌ๋ฆฐ์ƒท
- ๋ธŒ๋ผ์šฐ์ € ์„ธ์…˜ ๊ด€๋ฆฌ

---

## ์„ค์น˜

```cmd
git clone <repository-url>
cd windows-scoped-remote-mcp-server
npm install
copy .env.example .env
copy workspaces.example.json workspaces.local.json
npm run build
npm test
```

Windows์—์„œ๋Š” CMD/PowerShell์šฉ `start.bat`์™€ Git Bash์šฉ `start.sh`๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

```cmd
start.bat
```

```bash
./start.sh
# ๋˜๋Š”
bash start.sh
```

๋‘ ์‹œ์ž‘ ์Šคํฌ๋ฆฝํŠธ๋Š” `uvx`๊ฐ€ ์—†์œผ๋ฉด Astral ๊ณต์‹ ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ๋กœ `uv`/`uvx` ์„ค์น˜๋ฅผ ์‹œ๋„ํ•˜๊ณ , ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค PATH์— `%USERPROFILE%\.local\bin`์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ `bin\cloudflared.exe`๊ฐ€ ์—†์œผ๋ฉด ์ตœ์‹  Windows 64-bit ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋‚ด๋ ค๋ฐ›์Šต๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์ค€๋น„๋œ ๋’ค์—๋Š” ํ˜„์žฌ ๋ฒ„์ „์„ ํ‘œ์‹œํ•˜๊ณ  `cloudflared update`๋กœ ๊ณต์‹ ์—…๋ฐ์ดํŠธ ์„œ๋ฒ„๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ํ™•์ธ์ด ์‹คํŒจํ•ด๋„ ๊ธฐ์กด ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ WSR ์‹œ์ž‘์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

WSR์˜ Windows ๊ธฐ๋ณธ ์…ธ์€ ์ž๋™์œผ๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. Git Bash๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์œผ๋ฉด PATH ๋“ฑ๋ก ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ์ผ๋ฐ˜์ ์ธ Git for Windows ์„ค์น˜ ๊ฒฝ๋กœ๊นŒ์ง€ ํƒ์ƒ‰ํ•ด Git Bash๋ฅผ ์šฐ์„  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Git Bash๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด PowerShell 7(`pwsh`)์„ ์‚ฌ์šฉํ•˜๋ฉฐ, PowerShell 7๋„ ์—†์œผ๋ฉด `winget`์œผ๋กœ ์„ค์น˜๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

---

## ChatGPT์— WSR ์—ฐ๊ฒฐ

์ตœ๊ทผ ChatGPT์—์„œ๋Š” WSR ๊ฐ™์€ Remote MCP ์„œ๋ฒ„๋ฅผ ๋จผ์ € **Custom MCP app**์œผ๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•˜๋‹ค๋ฉด ์ด MCP app์„ ๋ณ„๋„์˜ Plugin ๊ตฌ์„ฑ์— ํฌํ•จํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, WSR ์ž์ฒด ์—ฐ๊ฒฐ ์ ˆ์ฐจ๋Š” MCP app ์ƒ์„ฑ ํ๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € WSR๊ณผ Cloudflare Tunnel์„ ์‹คํ–‰ํ•œ ์ƒํƒœ์—์„œ ์‹ค์ œ MCP endpoint๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

```text
MCP_PUBLIC_URL=https://mcp.example.com
MCP_ENDPOINT=/mcp

ChatGPT์— ์ž…๋ ฅํ•  MCP endpoint:
https://mcp.example.com/mcp
```

์ค‘์š”: `MCP_PUBLIC_URL`์€ **๊ธฐ๋ณธ ๊ณต๊ฐœ URL**์ด๋ฉฐ ๊ธฐ๋ณธ MCP ๊ฒฝ๋กœ `/mcp`๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ChatGPT์— ๋“ฑ๋กํ•  ๋•Œ๋Š” `MCP_PUBLIC_URL + MCP_ENDPOINT`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. `MCP_ENDPOINT`๋ฅผ ๋”ฐ๋กœ ๋ฐ”๊พธ์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ `/mcp`์ž…๋‹ˆ๋‹ค.

ChatGPT ์ชฝ ๋“ฑ๋ก ์ ˆ์ฐจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. ChatGPT์˜ **Settings โ†’ Apps โ†’ Create**๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌํ˜• Workspace์—์„œ๋Š” **Workspace Settings โ†’ Apps โ†’ Create** ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2. ๊ณ„์ •/Workspace ์ •์ฑ…์ƒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Developer mode๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋‰ด ์œ„์น˜๋Š” ํ”Œ๋žœ๊ณผ Workspace ๊ถŒํ•œ์— ๋”ฐ๋ผ **Settings โ†’ Apps โ†’ Advanced Settings** ๋˜๋Š” Workspace ์„ค์ •์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
3. ์ƒˆ Custom MCP app์„ ๋งŒ๋“ค๊ณ  ์ด๋ฆ„(์˜ˆ: `wsr`)๊ณผ MCP endpoint๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
4. ์ธ์ฆ ๋ฐฉ์‹์€ **OAuth**๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
5. **Scan Tools**๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. WSR OAuth ์Šน์ธ ํ™”๋ฉด์ด ์—ด๋ฆฌ๋ฉด `.env`์˜ `MCP_AUTH_TOKEN` ๊ฐ’์„ ์ž…๋ ฅํ•˜๊ณ  ์Šน์ธํ•ฉ๋‹ˆ๋‹ค.
6. Tool scan์ด ๋๋‚˜๋ฉด app ์ƒ์„ฑ์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

```text
Name: wsr
MCP endpoint: https://mcp.example.com/mcp
Authentication: OAuth
```

Godot, Blender ๋“ฑ Provider๋ฅผ ์ƒˆ๋กœ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ Provider ๋ฒ„์ „ ๋ณ€๊ฒฝ์œผ๋กœ Tool ๋ชฉ๋ก์ด ๋ฐ”๋€Œ๋ฉด ChatGPT์˜ WSR app ์„ค์ •์—์„œ **Refresh / Scan Tools**๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ChatGPT๋Š” ์Šน์ธ๋œ MCP Tool ๊ตฌ์„ฑ์„ ์ž๋™์œผ๋กœ ์ฆ‰์‹œ ๊ฐฑ์‹ ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ ํ›„์—๋Š” ์ƒˆ ์ฑ„ํŒ…์—์„œ WSR app์„ ์„ ํƒํ•œ ๋’ค ๋‹ค์Œ์ฒ˜๋Ÿผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```text
"WSR ์ƒํƒœ ํ™•์ธํ•ด์ค˜"              โ†’ wsr_status
"์›Œํฌ์ŠคํŽ˜์ด์Šค ๋ชฉ๋ก ํ™•์ธํ•ด์ค˜"     โ†’ list_workspaces
"Provider ์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธํ•ด์ค˜"    โ†’ mcp_provider_status
```

---

## ์ฃผ์š” ํ™˜๊ฒฝ๋ณ€์ˆ˜

| ๋ณ€์ˆ˜                              | ๊ธฐ๋ณธ๊ฐ’                      | ์„ค๋ช…                                   |
| :-------------------------------- | :-------------------------- | :------------------------------------- |
| `MCP_PORT`                        | `12000`                     | WSR HTTP ์„œ๋ฒ„ ํฌํŠธ                     |
| `MCP_WORKSPACE_FILE`              | ์—†์Œ                        | Workspace JSON ํŒŒ์ผ. ์ฒซ ํ•ญ๋ชฉ์ด ํ™œ์„ฑ Workspace |
| `MCP_WORKSPACE_ROOTS`             | ํ˜„์žฌ ๊ฒฝ๋กœ                   | ๋ ˆ๊ฑฐ์‹œ ํ•œ ์ค„ Multi-Workspace ํ˜•์‹             |
| `MCP_AUTH_TOKEN`                  | ์—†์Œ                        | ์ธ์ฆ์šฉ ํ† ํฐ                            |
| `MCP_PUBLIC_URL`                  | ์—†์Œ                        | ๊ณต๊ฐœ ๊ธฐ๋ณธ URL (`/mcp` ์ œ์™ธ)          |
| `MCP_ENDPOINT`                    | `/mcp`                      | ChatGPT๊ฐ€ ์—ฐ๊ฒฐํ•  MCP ๊ฒฝ๋กœ             |
| `CLOUDFLARE_TUNNEL_TOKEN`         | ์—†์Œ                        | Cloudflare Tunnel ํ† ํฐ                 |
| `MCP_BROWSER_HEADLESS`            | `false`                     | Playwright Headless ์—ฌ๋ถ€               |
| `MCP_PROVIDER_HEALTH_INTERVAL_MS` | `10000`                     | ์—ฐ๊ฒฐ๋œ Provider ๊ฒ€์‚ฌ ์ฃผ๊ธฐ(ms)          |
| `MCP_PROVIDER_RETRY_INTERVAL_MS`  | `5000`                      | ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ Provider ์žฌ์—ฐ๊ฒฐ ์ฃผ๊ธฐ(ms) |
| `MCP_NEEDLE_ENABLED`              | `false`                     | Needle 3 Fast Tool Router ํ™œ์„ฑํ™”       |
| `MCP_NEEDLE_PYTHON`               | `python`                    | Needle sidecar Python ์‹คํ–‰ ๋ช…๋ น        |
| `MCP_NEEDLE_CONFIDENCE_THRESHOLD` | `0.70`                      | ์ถ”์ฒœ์œผ๋กœ ์ธ์ •ํ•  ์ตœ์†Œ confidence       |
| `MCP_NEEDLE_TOOL_INDEX_PATH`      | `.cache/needle/wsr-tools.idx` | Needle Tool index ๊ธฐ์ค€ ๊ฒฝ๋กœ          |
| `MCP_NEEDLE_REQUEST_TIMEOUT_MS`   | `60000`                     | Needle ์š”์ฒญ timeout(ms)                |
| `MCP_NEEDLE_MAX_CATALOG_TOOLS`    | `24`                        | Needle์— ์ „๋‹ฌํ•  ์ „์ฒด Tool ์ƒํ•œ         |
| `MCP_GODOT_ENABLED`               | `false`                     | Godot AI MCP Provider ํ™œ์„ฑํ™”           |
| `MCP_GODOT_COMMAND`               | `uvx`                       | Godot AI attach ์‹คํ–‰์šฉ uvx ๋ช…๋ น        |
| `MCP_GODOT_VERSION`               | `4.3.0`                     | Godot AI Python package ๋ฒ„์ „           |
| `MCP_GODOT_HTTP_PORT`             | `8001`                      | Godot AI HTTP ํฌํŠธ                     |
| `MCP_GODOT_WS_PORT`               | `8002`                      | Godot AI WebSocket ํฌํŠธ                |
| `MCP_BLENDER_ENABLED`             | `false`                     | Blender MCP Provider ํ™œ์„ฑํ™”            |
| `MCP_BLENDER_COMMAND`             | `uvx`                       | Blender MCP stdio ์‹คํ–‰ ๋ช…๋ น            |
| `MCP_BLENDER_VERSION`             | `1.0.3`                     | Blender Lab ๊ณต์‹ MCP ์„œ๋ฒ„ ๋ฒ„์ „         |
| `MCP_BLENDER_HOST`                | `127.0.0.1`                 | Blender add-on socket host             |
| `MCP_BLENDER_PORT`                | `9876`                      | Blender add-on socket port             |
| `MCP_WINDOWS_ENABLED`             | `false`                     | Windows Computer Use Provider ํ™œ์„ฑํ™”   |
| `MCP_WINDOWS_COMMAND`             | `uvx`                       | Windows-MCP stdio ์‹คํ–‰ ๋ช…๋ น            |
| `MCP_WINDOWS_TOOLS`               | UI allowlist                | WSR์— ๋…ธ์ถœํ•  Windows-MCP ๋„๊ตฌ ๋ชฉ๋ก     |
| `MCP_GAS_ENABLED`                 | `false`                     | Game Assets Studio MCP Provider ํ™œ์„ฑํ™” |
| `MCP_GAS_URL`                     | `http://127.0.0.1:52214/mcp` | GAS Desktop MCP endpoint               |

### Needle 3 Fast Tool Router

Needle์€ ์„ ํƒ ๊ธฐ๋Šฅ์ด๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋จผ์ € ๋กœ์ปฌ Python์— `cactus-needle`์„ ์„ค์น˜ํ•˜๊ณ  ๋‹ค์Œ์ฒ˜๋Ÿผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

```bash
python -m pip install cactus-needle
```

```env
MCP_NEEDLE_ENABLED=true
MCP_NEEDLE_PYTHON=python
MCP_NEEDLE_CONFIDENCE_THRESHOLD=0.70
```

`needle_route`๋Š” Tool์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ถ”์ฒœ๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. AI ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉ์ž์˜ ์–ธ์–ด์™€ ๊ด€๊ณ„์—†์ด ์š”์ฒญ์„ ์งง์€ ์˜์–ด canonical command๋กœ ์ •๊ทœํ™”ํ•ด์„œ `query`์— ๋„ฃ๊ณ , ์›๋ฌธ์€ ํ•„์š”ํ•˜๋ฉด `originalQuery`๋กœ ํ•จ๊ป˜ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. Workspace alias, ๊ฒฝ๋กœ, URL, branch, object/schema/table ์ด๋ฆ„ ๊ฐ™์€ literal ๊ฐ’์€ ๋ฒˆ์—ญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Provider๊ฐ€ ๋ช…ํ™•ํ•œ ์š”์ฒญ์€ `scope="providers"`์™€ `providerId`๋กœ ์ขํžˆ๊ณ , Core ์š”์ฒญ์€ `scope="core"`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. confidence๊ฐ€ threshold ๋ฏธ๋งŒ์ด๊ฑฐ๋‚˜ `escalate=true`๋ฉด ์ผ๋ฐ˜ LLM reasoning์œผ๋กœ fallbackํ•ฉ๋‹ˆ๋‹ค.

๋ฏผ๊ฐํ•œ ํ† ํฐ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” `.env`์—๋งŒ ์ €์žฅํ•˜๊ณ  Git์— ์ปค๋ฐ‹ํ•˜์ง€ ๋งˆ์„ธ์š”.

---

## ๊ฐœ๋ฐœ

```cmd
npm run typecheck
npm test
npm run build
```

MCP SDK๋Š” v2 split package ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

- ์„œ๋ฒ„ ๋ฐ `createMcpHandler`: `@modelcontextprotocol/server`
- Node/Express adapter: `@modelcontextprotocol/node`
- Streamable HTTP Provider client: `@modelcontextprotocol/client`
- legacy SSE / stdio Provider compatibility client: `@modelcontextprotocol/sdk`
- ๊ธฐ์กด ๋‚ด์žฅ OAuth Authorization Server ํ˜ธํ™˜ ๊ณ„์ธต: `@modelcontextprotocol/server-legacy/auth`

๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์€ ๊ณต์‹ v1โ†’v2 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ธŒ๋ฆฌ์ง€์ด๋ฉฐ deprecated ์ƒํƒœ์ž…๋‹ˆ๋‹ค. discovery ๋ณต๊ตฌ์™€ ๊ธฐ์กด OAuth ๋™์ž‘ ๋ณด์กด์„ ์œ„ํ•ด ์œ ์ง€ํ•˜๋˜, ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ์ „์šฉ OAuth/IdP ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ MCP Provider๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ๋‹ค์Œ ๋ฌธ์„œ๋ฅผ ๋จผ์ € ์ฝ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

- `AGENTS.md` โ€” ํ”„๋กœ์ ํŠธ ์ž‘์—… ๊ทœ์น™
- `docs/mcp-gateway-architecture.md` โ€” Gateway / Provider ๊ตฌ์กฐ
- `docs/workspace-context.md` โ€” Workspace ์ž‘์—… ์ƒํƒœ ์ˆ˜์ง‘
- `docs/workspace-resume.md` โ€” ์ž‘์—… ์žฌ๊ฐœ ํžŒํŠธ
- `docs/provider-tool-change-notifications.md` โ€” Provider Tool ๋ณ€๊ฒฝ ์•Œ๋ฆผ
- `docs/wsr-status.md` โ€” WSR ์šด์˜ ์ง„๋‹จ
- `skills/add-remote-mcp-provider/SKILL.md` โ€” MCP ์ถ”๊ฐ€ ์ ˆ์ฐจ
- `skills/test-mcp-provider/SKILL.md` โ€” Provider ํ…Œ์ŠคํŠธ
- `skills/debug-mcp-gateway/SKILL.md` โ€” MCP ๋ฌธ์ œ ํ•ด๊ฒฐ

---

## ์‹ค์ œ ๊ฒ€์ฆ ์‚ฌ๋ก€

ํ˜„์žฌ WSR์€ Godot MCP์™€ ์‹ค์ œ ์—ฐ๊ฒฐํ•˜์—ฌ ๋‹ค์Œ ์ž‘์—…์„ ๊ฒ€์ฆํ–ˆ์Šต๋‹ˆ๋‹ค.

```text
ChatGPT
  โ†“
WSR
  โ†“
Godot MCP
  โ†“
Godot Editor
  โ†“
Scene ์ƒ์„ฑ / ์ˆ˜์ • / ์ €์žฅ
```

ํ…Œ์ŠคํŠธ Scene:

```text
res://mcp_test.tscn

McpTest (Node3D)
โ”œโ”€โ”€ TestCube (MeshInstance3D)
โ”œโ”€โ”€ Camera3D
โ””โ”€โ”€ DirectionalLight3D
```

์ด ํ๋ฆ„์€ WSR์ด ๋‹จ์ˆœํ•œ ํŒŒ์ผ MCP๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ ๊ฐœ๋ฐœ ๋„๊ตฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” Gateway๋ผ๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋Œ€ํ‘œ์ ์ธ ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

---

## ๋ณด์•ˆ ์›์น™

WSR์€ ๊ฐœ๋ฐœ ์ž๋™ํ™”๋ฅผ ์œ„ํ•ด ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๋‹ค์Œ ์›์น™์„ ์ค‘์š”ํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

- Workspace ์™ธ๋ถ€ ์ ‘๊ทผ์„ SandboxGuard๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
- ๋‹ค๋ฅธ Workspace๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋„๋ก ๊ต์ฐจ Workspace ๊ถŒํ•œ์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
- ์ธ์ฆ ํ† ํฐ๊ณผ Cloudflare Tunnel ํ† ํฐ์„ ์†Œ์Šค ์ฝ”๋“œ์— ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์šด์˜ ๋กœ๊ทธ์—๋„ Bearer token ์›๋ฌธ์„ ์ถœ๋ ฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
- ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ์ ˆ๋Œ€์ ์ธ ์•ˆ์ „ ๋ณด์žฅ์œผ๋กœ ํ‘œํ˜„ํ•˜์ง€ ์•Š๊ณ  ์„ค์ •๋œ ๊ฒฝ๊ณ„์™€ ๊ถŒํ•œ ๋ชจ๋ธ์„ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
- ์›๊ฒฉ MCP Provider ํ•˜๋‚˜์˜ ์žฅ์• ๊ฐ€ ์ „์ฒด Gateway ์žฅ์• ๋กœ ์ด์–ด์ง€์ง€ ์•Š๋„๋ก ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

---

## License

MIT License

## Blender Lab ๊ณต์‹ MCP

WSR์€ Blender Lab **๊ณต์‹ MCP** ์„œ๋ฒ„๋ฅผ ๋กœ์ปฌ stdio Provider๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. Blender์˜ Preferences โ†’ Get Extensions์—์„œ Blender Lab ์ €์žฅ์†Œ์˜ `MCP` ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์„ค์น˜ํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. Blender ํ™•์žฅ ๊ธฐ๋Šฅ์˜ `9876` ์†Œ์ผ“์€ MCP HTTP ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. WSR์€ ๊ณต์‹ Python MCP ์„œ๋ฒ„๋ฅผ stdio๋กœ ์‹คํ–‰ํ•˜์—ฌ ์ด ์†Œ์ผ“์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

Blender ํ™•์žฅ ๊ธฐ๋Šฅ Preferences์—์„œ `Server is running`์„ ํ™•์ธํ•˜๊ณ , `uvx` ๋ฐ Python 3.12๋ฅผ ์ค€๋น„ํ•œ ๋’ค ๋ฃจํŠธ `.env`๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

```env
MCP_BLENDER_ENABLED=true
MCP_BLENDER_COMMAND=uvx
MCP_BLENDER_VERSION=1.0.3
MCP_BLENDER_HOST=127.0.0.1
MCP_BLENDER_PORT=9876
```

๊ณต์‹ MCP ์„œ๋ฒ„๋Š” `https://projects.blender.org/lab/blender_mcp`์˜ `v1.0.3` ์†Œ์Šค๋ฅผ `uvx --python 3.12`๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์ผ“ ํ†ต์‹  ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” `BLENDER_MCP_HOST`, `BLENDER_MCP_PORT`์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ๋„๊ตฌ๋Š” `blender_*` namespace๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ `docs/blender-mcp-provider.md`๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

---

## Windows Computer Use MCP

WSR์€ CursorTouch/Windows-MCP๋ฅผ local stdio Provider๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๋„ ์†Œ์Šค๋ฅผ `mcp-servers/`์— ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  `uvx windows-mcp serve`๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ์ฒซ WSR ์‹œ์ž‘ ์‹œ uv๊ฐ€ ํŒจํ‚ค์ง€์™€ ์˜์กด์„ฑ์„ ๋‚ด๋ ค๋ฐ›์•„ ์บ์‹œํ•˜๊ณ  ์ดํ›„ WSR ์ˆ˜๋ช…๊ณผ ํ•จ๊ป˜ ์‹คํ–‰/์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ allowlist๋Š” Windows ํ™”๋ฉด ๊ด€์ฐฐ๊ณผ UI ์ž…๋ ฅ์— ํ•„์š”ํ•œ ๋„๊ตฌ๋งŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. `App`, `PowerShell`, `FileSystem`, `Process`, `Notification`, `Registry`, `Scrape`๋Š” WSR ๊ธฐ์กด ๊ธฐ๋Šฅ๊ณผ ๊ฒน์น˜๊ฑฐ๋‚˜ ๊ถŒํ•œ ๋ฒ”์œ„๊ฐ€ ๋„“๊ฑฐ๋‚˜ ํ˜„์žฌ ๋ชฉ์ ์— ๋ถˆํ•„์š”ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋…ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

```env
MCP_WINDOWS_ENABLED=true
MCP_WINDOWS_COMMAND=uvx
MCP_WINDOWS_TOOLS=DisplayInventory,Snapshot,Screenshot,Click,Type,Scroll,Move,Shortcut,Wait,WaitFor,MultiSelect,MultiEdit,Clipboard
```

Provider ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ๋Š” Python UTF-8 ๋ชจ๋“œ๋ฅผ ๊ฐ•์ œํ•˜๊ณ  Windows-MCP ์ต๋ช… telemetry๋ฅผ ๋„๋ฉฐ screenshot flash overlay๋„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ๋„๊ตฌ๋Š” `windows_*` namespace๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ `docs/windows-computer-use-provider.md`๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

---

## PostgreSQL MCP (CrystalDBA)

WSR์€ Remote MCP Provider๋ณ„๋กœ transport๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ฒ€์ฆ๋œ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

| Provider | Endpoint | Transport | Tools |
| --- | --- | --- | ---: |
| Godot | `http://127.0.0.1:8000/mcp` | Streamable HTTP | 45 |
| Blender Lab ๊ณต์‹ MCP 1.0.3 | `uvx --python 3.12` โ†’ ๊ณต์‹ ์†Œ์ผ“ `127.0.0.1:9876` | stdio | 26 |
| Windows (CursorTouch/Windows-MCP) | `uvx windows-mcp serve` | stdio | 13 (๊ธฐ๋ณธ allowlist) |
| PostgreSQL (CrystalDBA postgres-mcp) | `http://127.0.0.1:10021/sse` | legacy SSE | 9 |
| Game Assets Studio (GAS) | `http://127.0.0.1:52214/mcp` | Streamable HTTP | 16 |

PostgreSQL Provider๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋ฃจํŠธ `.env`์— ๋‹ค์Œ ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

```env
MCP_POSTGRESQL_ENABLED=true
MCP_POSTGRESQL_URL=http://127.0.0.1:10021/sse
```

Docker ์‹คํ–‰ ํ™˜๊ฒฝ์€ `mcp-servers/postgres-mcp/`์— ์žˆ์œผ๋ฉฐ ์‹ค์ œ `DATABASE_URI`๋Š” ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ `.env`์—๋งŒ ๋‘ก๋‹ˆ๋‹ค. DB ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ์‹ค์ œ ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด์€ Git์— ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

PostgreSQL MCP๊ฐ€ ์ œ๊ณตํ•˜๋Š” 9๊ฐœ ๋„๊ตฌ๋Š” WSR namespace ์ ์šฉ ํ›„ `postgresql_*` ํ˜•ํƒœ๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์—ฐ๊ฒฐ์—์„œ๋Š” `list_schemas`, `list_objects`, `get_object_details`, `explain_query`, `analyze_workload_indexes`, `analyze_query_indexes`, `analyze_db_health`, `get_top_queries`, `execute_sql`์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ์„ค์น˜/์šด์˜ ๋ฐฉ๋ฒ•์€ `docs/postgresql-mcp-provider.md`์™€ `mcp-servers/postgres-mcp/README.md`๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

### Game Assets Studio MCP

GAS Desktop์ด ์‹คํ–‰ ์ค‘์ด๋ฉด WSR์€ ๊ณ ์ • localhost endpoint๋ฅผ Streamable HTTP Provider๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```env
MCP_GAS_ENABLED=true
MCP_GAS_URL=http://127.0.0.1:52214/mcp
```

GAS ์ž์ฒด MCP๋Š” ๋ณ„๋„ Bearer ์ธ์ฆ ์—†์ด `127.0.0.1`์—๋งŒ ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค. WSR์—์„œ๋Š” Provider id/namespace ๋ชจ๋‘ `gas`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์›๊ฒฉ `job_list` ๊ฐ™์€ Tool์€ `gas_job_list` ํ˜•ํƒœ๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค. GAS Desktop์ด ๊บผ์ ธ ์žˆ์–ด๋„ WSR Core์™€ ๋‹ค๋ฅธ Provider๋Š” ๊ณ„์† ๋™์ž‘ํ•˜๊ณ  Scheduler๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ์žฌ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.