ie-mode-mcp
ie-mode-mcp
Microsoft Edge의 IE 모드에서 작동하는 레거시 웹 애플리케이션을 AI 에이전트에서 MCP (Model Context Protocol)를 통해 조작하기 위한 MCP Server입니다.
AI Agent ──(MCP / stdio)──> ie-mode-mcp ──> BrowserManager ──> selenium-webdriver
│
IEDriverServer.exe
│
Microsoft Edge (IE Mode)
│
Legacy Web ApplicationNode.js 22 / TypeScript / selenium-webdriver만으로 구성됨 (HTTP Server, DB, DI, Logging Framework 없음)
MCP Transport는 stdio만 지원
브라우저 세션은 1개만, WebDriver 조작은 완전 순차 실행
HTML 전체를 반환하지 않고,
inspect_page가 LLM을 위해 요약한 화면 정보를 반환승인 흐름 없음. Tool을 호출한 시점에 조작을 실행
목차
1. 퀵스타트
Windows에서 다음을 실행합니다.
git clone https://github.com/sumikof/iedriver-mcp.git
cd iedriver-mcp
npm install
npm run build
# IEDriverServer.exe のパスと、遷移を許可する Origin を指定して起動
$env:IE_MCP_DRIVER_PATH = "C:\tools\IEDriverServer.exe"
$env:IE_MCP_ALLOWED_ORIGINS = "http://legacy01.local"
node dist/index.js{"level":"info","event":"started","transport":"stdio"}가 stderr에 출력되면 시작 성공입니다.
일반적으로 수동으로 시작하지 않고, AI Agent 측의 MCP 설정에서 자동 시작시킵니다.
2. 전제 조건
항목 | 내용 |
OS | Windows 11 / Windows 10 (로그인된 대화형 세션) |
Node.js | 22 이상 |
브라우저 | Microsoft Edge (IE 모드 사용 가능) |
Driver | IEDriverServer.exe (Selenium 4.x 계열. 32비트 버전 권장) |
IEDriverServer.exe는 Selenium 다운로드 페이지에서 받아, 원하는 폴더 (예:
C:\tools\)에 배치합니다. 64비트 버전에는 알려진 제약이 있으므로, Selenium 공식에서는 32비트 버전 사용을 권장합니다.IEDriver는 GUI, 창 포커스, 네이티브 이벤트의 영향을 받으므로, 전용 Windows VM 또는 전용 Windows 세션에서 사용하는 것을 권장합니다.
Windows Service (Session 0)에서 브라우저를 작동시키는 구성은 가정하지 않습니다.
MCP Server와 IEDriver / Edge는 동일한 Windows 환경에서 작동시킵니다.
3. Windows 측 사전 설정
IEDriver는 환경 설정의 영향을 크게 받습니다. 먼저 수동으로 설정을 완료한 후 MCP Server를 시작합니다.
3.1 Edge의 IE 모드 사용 가능하게 하기
대상 사이트가 IE 모드로 열리는지, 먼저 Edge의 수동 조작으로 확인해 둡니다. IE 모드는 다음
정책 중 하나로 활성화합니다 (Software\Policies\Microsoft\Edge 아래).
정책 (표시 이름) | 레지스트리 값 이름 |
Configure Internet Explorer integration |
|
Configure the Enterprise Mode Site List |
|
Send all intranet sites to Internet Explorer | (Edge 77 이후 그룹 정책에서 설정) |
구체적인 구성은 조직의 정책에 따라 달라지므로, 자세한 내용은 Microsoft의 IE 모드 문서 와 소속 조직의 관리자에게 확인하십시오. Windows / Edge는 최신 업데이트를 적용해 둡니다.
3.2 IEDriver가 요구하는 설정
항목 | 필요한 상태 | 본 Server에서의 처리 |
브라우저 줌 | 100% |
|
보호 모드 (Protected Mode) | 모든 영역에서 동일한 설정 | 통일되지 않은 경우 시작 시 예외 발생. 인터넷 옵션 → 보안에서 통일 |
IEDriverServer 비트 수 | 32비트 권장 | — |
보호 모드 설정이 통일되지 않으면 browser_start가 실패합니다. IEDriver의
introduceFlakinessByIgnoringProtectedModeSettings는 동작이 불안정해지므로 사용하지 않습니다.
4. 설치 및 빌드
npm install # 依存パッケージの取得
npm run build # TypeScript を dist/ へビルド산출물은 dist/index.js입니다. 빌드 후 npm start (= node dist/index.js)로도 시작할 수 있습니다.
5. 환경 변수
설정 파일 (YAML / JSON)은 사용하지 않고, 환경 변수로만 설정합니다.
환경 변수 | 설명 | 기본값 |
| msedge.exe 경로 | 미지정 (IEDriver가 자동 검색) |
| IEDriverServer.exe 경로 | 미지정 ( |
|
|
|
| 요소 검색 및 대기의 기본 타임아웃 (ms) |
|
IE_MCP_EDGE_PATH=C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
IE_MCP_DRIVER_PATH=C:\tools\IEDriverServer.exe
IE_MCP_ALLOWED_ORIGINS=http://legacy01.local,http://legacy02.local
IE_MCP_TIMEOUT_MS=10000IE Driver 4.5.0 이후는 IE 미탑재 환경 (Windows 11 기본)에서 Edge를 자동 검색하므로,
IE_MCP_EDGE_PATH는 일반적으로 불필요합니다. 자동 검색에 실패하는 경우에만 명시적으로 지정합니다.운영의 재현성을 중시하는 경우
IE_MCP_DRIVER_PATH를 명시적으로 지정하는 것을 권장합니다.IE_MCP_ALLOWED_ORIGINS는 오조작 방지용 간이 제한이며, Origin (scheme + host + port) 의 완전 일치로 판단합니다. 경로 단위의 제한은 하지 않습니다.
6. 시작 방법
수동 시작 (동작 확인용)
PowerShell:
$env:IE_MCP_DRIVER_PATH = "C:\tools\IEDriverServer.exe"
$env:IE_MCP_ALLOWED_ORIGINS = "http://legacy01.local"
node dist/index.js명령 프롬프트:
set IE_MCP_DRIVER_PATH=C:\tools\IEDriverServer.exe
set IE_MCP_ALLOWED_ORIGINS=http://legacy01.local
node dist\index.jsstdio에서 클라이언트의 연결을 기다립니다. 표준 입출력이 MCP 프로토콜에 사용되므로,
이 상태에서 키보드 입력해도 응답이 없습니다 (정상). 모든 로그는 stderr에 출력됩니다.
종료는 Ctrl+C (브라우저도 자동으로 닫힘).
주의: MCP Server 시작만으로는 브라우저가 시작되지 않습니다. 브라우저는 Agent가
browser_start를 호출한 시점에 시작됩니다.
일반 운영
AI Agent (MCP 클라이언트)가 본 Server를 자식 프로세스로 시작합니다. 수동 시작은 불필요합니다. 다음 장의 설정을 수행합니다.
7. AI Agent 등록
MCP 클라이언트의 설정 파일에 다음을 추가합니다.
{
"mcpServers": {
"ie-mode": {
"command": "node",
"args": ["C:\\ie-mode-mcp\\dist\\index.js"],
"env": {
"IE_MCP_DRIVER_PATH": "C:\\tools\\IEDriverServer.exe",
"IE_MCP_EDGE_PATH": "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe",
"IE_MCP_ALLOWED_ORIGINS": "http://legacy01.local,http://legacy02.local",
"IE_MCP_TIMEOUT_MS": "10000"
}
}
}
}경로는 JSON 내에서 백슬래시를 이스케이프합니다 (
C:\\...).args에는 빌드 후dist/index.js의 절대 경로를 지정합니다.Claude Code의 경우
claude mcp add로도 등록할 수 있습니다.
claude mcp add ie-mode --env IE_MCP_DRIVER_PATH=C:\tools\IEDriverServer.exe --env IE_MCP_ALLOWED_ORIGINS=http://legacy01.local -- node C:\ie-mode-mcp\dist\index.js등록 후, 클라이언트 측에서 browser_start를 포함한 10개의 Tool이 보이면 연결 성공입니다.
8. Tool 레퍼런스
공개하는 Tool은 10개입니다. WebDriver의 저수준 API (findElement / executeScript 등)는 공개하지 않습니다.
Tool | 입력 | 개요 |
| 없음 | Edge IE Mode를 시작합니다. 이미 시작된 경우 기존 세션 재사용 |
| 없음 | 브라우저를 종료합니다. 여러 번 호출해도 오류가 발생하지 않음 |
|
| URL Allowlist를 확인한 후 이동 |
|
| URL / title / 화면 텍스트 / 조작 가능 요소 반환 |
|
| 표시 및 활성화를 기다린 후 클릭 |
|
| input / textarea에 입력 |
|
|
|
|
| 조건이 충족될 때까지 대기 |
|
| 팝업 및 다른 Window로 전환 |
| 없음 | 현재 화면을 PNG (MCP image content)로 반환 |
공통: Selector
{ "by": "id | name | css | xpath | linkText", "value": "searchButton" }레거시 웹 애플리케이션에서는 name과 xpath 사용 빈도가 높으므로 대응합니다.
공통: frame (iframe은 1계층)
모든 요소 조작 Tool은 임의의 frame을 받습니다. 지정하면 defaultContent로 돌아간 후
frame으로 전환하여 그 안에서 요소를 검색합니다.
{
"frame": { "by": "name", "value": "mainFrame" },
"selector": { "by": "id", "value": "searchButton" }
}browser_start
{}{ "status": "ready", "reused": false }reused: true는 기존 세션을 그대로 사용했음을 나타냅니다. 기존 세션이 죽어있는 경우
자동으로 다시 시작합니다.
navigate
{ "url": "http://legacy01.local/customer" }{ "url": "http://legacy01.local/customer", "title": "顧客検索" }inspect_page
Agent가 화면을 이해하기 위한 주요 Tool입니다. HTML 전체를 반환하지 않고, URL / title / 표시 텍스트 /
조작 가능 요소 (a button input textarea select iframe)만 반환합니다.
비표시 요소와 type="hidden"의 input은 제외됩니다.
{ "frame": { "by": "name", "value": "mainFrame" } }{
"url": "http://legacy01.local/customer",
"title": "顧客検索",
"text": "顧客検索 顧客名 支店 検索",
"elements": [
{ "tag": "input", "id": "customerName", "name": "customerName", "type": "text" },
{ "tag": "select", "id": "branch", "name": "branch", "text": "東京支店", "optionCount": 12 },
{ "tag": "button", "id": "searchButton", "text": "検索" },
{ "tag": "iframe", "name": "mainFrame" }
],
"truncated": false
}truncated: true는 요소가 상한 (300건)에서 잘렸음을 나타냅니다.요소 목록에
iframe이 포함된 경우, 그 내용을 보려면frame을 지정하여 다시 호출합니다.
click
{ "selector": { "by": "id", "value": "searchButton" } }{ "url": "http://legacy01.local/customer", "title": "顧客検索" }표시 및 활성화될 때까지 기다린 후 클릭합니다. click은 자동 Retry하지 않습니다 (등록, 갱신, 전송이 이미 성공한 상태에서 재클릭으로 인한 이중 처리를 방지하기 위해).
type
{
"selector": { "by": "id", "value": "customerName" },
"text": "山田太郎",
"clear": true
}clear (기본값 true)가 true이면 clear() 후 입력, false이면 추가 입력합니다.
select
{
"selector": { "by": "id", "value": "branch" },
"by": "text",
"value": "東京支店"
}{ "text": "東京支店", "value": "13", "index": 2 }by는 text / value / index (index는 0부터 시작).
wait_for
고정 sleep을 사용하지 않고 명시적으로 대기합니다.
{
"type": "visible",
"selector": { "by": "id", "value": "resultTable" },
"timeoutMs": 10000
}
| 필요한 입력 | 조건 |
|
| 요소가 DOM에 존재 |
|
| 요소가 표시됨 |
|
| 요소가 표시되고 조작 가능 |
|
| 요소 텍스트가 |
|
| 현재 URL이 |
|
| title이 |
timeoutMs 생략 시 IE_MCP_TIMEOUT_MS를 사용합니다.
switch_window
{ "target": "newest" }{ "index": 1 }{ "url": "http://legacy01.local/detail", "title": "顧客詳細", "index": 1, "windowCount": 2 }newest는 새 Window Handle이 나타날 때까지 짧은 시간 폴링합니다. 검색할 수 없는 경우
현존하는 마지막 Window로 전환합니다.
screenshot
{}PNG 이미지 (MCP의 image content)를 반환합니다. DOM만으로는 판단할 수 없는 레이아웃 및 오류 화면 확인에 사용합니다.
9. 사용 예시
기본 루프
browser_start → navigate → inspect_page → click / type / select → wait_for → inspect_pageinspect_page로 화면 파악 → 조작 → wait_for로 결과 대기 → 다시 inspect_page를 반복합니다.
예시: 고객 "야마다 타로" 검색 후 상세 화면 열기
# | Tool | 인수 |
1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
5 |
|
|
6 |
|
|
7 |
|
|
8 |
|
|
9 |
|
|
10 |
|
|
11 |
|
|
예시: iframe 내부 조작
{"tool": "inspect_page", "args": {}}
{"tool": "inspect_page", "args": { "frame": { "by": "name", "value": "mainFrame" } }}
{"tool": "click", "args": {
"frame": { "by": "name", "value": "mainFrame" },
"selector": { "by": "id", "value": "searchButton" }
}}frame 지정은 조작마다 매번 전달합니다 (내부에서 매번 defaultContent로 돌아간 후 전환하므로,
상태는 유지되지 않습니다).
예시: 팝업 조작 후 원래 Window로 돌아가기
{"tool": "click", "args": { "selector": { "by": "id", "value": "openPopup" } }}
{"tool": "switch_window", "args": { "target": "newest" }}
{"tool": "inspect_page", "args": {}}
{"tool": "switch_window", "args": { "index": 0 }}10. 에러 및 대처
에러는 Selenium의 Stack Trace가 아닌, 다음 코드로 반환됩니다 (isError: true).
{
"error": "ELEMENT_NOT_FOUND",
"message": "Element was not found: id=searchButton",
"selector": { "by": "id", "value": "searchButton" }
}에러 코드 | 의미 | 대처 |
| 브라우저 미시작 |
|
| 요소 또는 frame을 찾을 수 없음 |
|
|
| 조건 및 |
| 지정 Window가 존재하지 않음 |
|
| 이동 실패 | URL, 네트워크, 인증 확인 |
| IEDriver / Edge 비정상 종료 |
|
| Allowlist 외부 Origin |
|
| 인수 오류 | Tool 입력 사양 확인 |
| 기타 (시작 실패 포함) |
|
DRIVER_LOST로부터 복구
브라우저 또는 Driver가 다운된 경우, 내부 WebDriver는 폐기되고 이후 조작은
BROWSER_NOT_STARTED가 됩니다. 자동 복구 및 직전 조작 자동 재실행은 하지 않습니다 (이중 등록 등의
부작용을 방지하기 위해). Agent 측에서 browser_start를 다시 호출하고, 화면 상태를 inspect_page로
확인한 후 조작을 재개합니다. 직전 조작이 이미 성공했을 가능성이 있으므로, 등록 및 갱신 계열의
조작을 그대로 재실행해서는 안 됩니다.
11. 로그
stdout은 MCP 프로토콜이 사용하므로, 로그는 모두 stderr에 JSON 1행으로 출력합니다.
{"level":"info","event":"started","transport":"stdio"}
{"level":"info","tool":"navigate","url":"http://legacy01.local/customer","durationMs":842}
{"level":"info","tool":"type","selector":{"by":"id","value":"password"},"textLength":16,"durationMs":128}
{"level":"error","tool":"click","selector":{"by":"id","value":"x"},"error":"ELEMENT_NOT_FOUND","message":"Element was not found: id=x","durationMs":5012}입력 문자열 자체, 쿠키, 인증 정보, HTML 전체는 기록하지 않습니다 (type은 문자 수만).
파일에 남기려면 stderr를 리디렉션합니다.
node dist/index.js 2>> C:\logs\ie-mode-mcp.log12. 트러블슈팅
증상 | 확인할 사항 |
|
|
보호 모드 관련 예외가 발생하는 경우 | 인터넷 옵션 → 보안에서 모든 영역의 보호 모드 설정을 통일 |
확대/축소 관련 예외가 발생하는 경우 | Edge/IE의 확대/축소를 100%로 되돌리기 |
Edge는 실행되지만 IE 모드가 되지 않는 경우 | IE 모드 정책(사이트 목록 등)을 확인. 수동으로 IE 모드 표시가 가능한지 먼저 확인 |
조작이 멈추거나 요소를 클릭할 수 없는 경우 | 창이 최소화 또는 비활성화되지 않았는지 확인. 원격 데스크톱 연결이 끊어져 있으면 불안정해짐 |
| 프레임 내의 화면인지 확인( |
Agent 측에 Tool이 보이지 않는 경우 |
|
표준 출력에 아무것도 나오지 않는 경우 | 정상. 로그는 stderr로 출력됨 |
screenshot은 원인 조사에 유효. DOM 정보만으로는 판단할 수 없는 상태(모달, 인증 대화상자, 렌더링 깨짐)를 확인할 수 있음.
13. 개발
src/
├─ index.ts MCP Server のエントリーポイント(stdio)
├─ config.ts 環境変数と stderr ログ
├─ tools.ts MCP Tool の Schema と Handler
├─ browser.ts BrowserManager(Selenium / IEDriver 操作の集約)
├─ selectors.ts Selector → Selenium の By 変換
└─ errors.ts Selenium Error → MCP Error Code 変換npm run build # tsc でビルド
npm start # node dist/index.jsMCP Tool은 Selenium을 직접 다루지 않고, 반드시
BrowserManager를 경유한다.모든 WebDriver 조작은 Promise Chain으로 직렬화되어 있으며, Tool이 병렬로 호출되어도 IEDriver에는 1건씩만 전송된다.
부작용이 없는 조작(요소 검색, Window Handle 검출)만 Retry한다.
click이나 전송은 Retry하지 않는다.
14. 제한 사항
초기 구현에서는 다음을 지원하지 않는다.
다중 브라우저 세션 / 다중 사용자 / HTTP Transport / REST API / DB / 세션 영속화 /
자동 브라우저 복구 / 복잡한 Retry Policy / WebDriver Grid / 범용 Selenium API /
executeScript Tool / 다단계 iframe(1계층만) / Element Cache / Metrics / 승인 흐름 / 인증·인가
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Live browser debugging for AI assistants — DOM, console, network via MCP.
Screenshot, diff, audit and sitemap-capture any web page — 5 MCP tools for AI agents.
A paid remote MCP for AI agent browser MCP session, built to return verdicts, receipts, usage logs,
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sumikof/iedriver-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server