Skip to main content
Glama

entry-offline-mcp

Claude Code, Codex 같은 AI 에이전트가 내 PC에 설치된 엔트리 오프라인(Entry, playentry.org)을 직접 조작해서 블록코딩 / 엔트리파이썬 작품을 만들 수 있게 해 주는 MCP 서버입니다.

오브젝트 추가(라이브러리 2천여 개 스프라이트·배경·소리 검색), 직접 그린 이미지 업로드, 엔트리파이썬 → 블록 변환, 블록 JSON 작성, 변수·리스트·신호·함수, 장면, 실행·키 입력·스크린샷으로 테스트, .ent 저장/열기까지 지원합니다. 작업은 실제 엔트리 창에서 실시간으로 보입니다.

An MCP server that lets AI agents (Claude, Codex, ...) build Entry (Korean block-coding platform) projects by driving the locally installed Entry offline app (Windows).

요구 사항

  • Windows 10/11

  • 엔트리 오프라인 설치 (playentry.org → 다운로드) (테스트 버전: 2.1.36)

  • Node.js 22 이상

  • Git (npx가 GitHub에서 받을 때 사용)

Related MCP server: Parallel CUA

설치

Claude Code

명령 프롬프트(cmd)

claude mcp add -s user entry -- cmd /c npx -y github:l2l2l4/entry-offline-mcp

PowerShell (--를 따옴표로 감싸야 합니다)

claude mcp add -s user entry '--' cmd /c npx -y github:l2l2l4/entry-offline-mcp

Git Bash에서는 /c가 경로로 바뀌어 버리므로 cmd 또는 PowerShell에서 실행하세요. 첫 실행은 다운로드 때문에 시간이 걸릴 수 있습니다. claude mcp list에서 Connected가 보이면 완료.

제거: claude mcp remove entry -s user

Codex (앱 / CLI)

%USERPROFILE%\.codex\config.toml 맨 끝에 추가하고 Codex를 다시 시작하세요.

[mcp_servers.entry]
command = 'cmd'
args = ['/c', 'npx', '-y', 'github:l2l2l4/entry-offline-mcp']
startup_timeout_sec = 120

Claude Desktop 등 다른 MCP 클라이언트

{
  "mcpServers": {
    "entry": {
      "command": "cmd",
      "args": ["/c", "npx", "-y", "github:l2l2l4/entry-offline-mcp"]
    }
  }
}

직접 받아서 쓰기

git clone https://github.com/l2l2l4/entry-offline-mcp
cd entry-offline-mcp
npm install
claude mcp add -s user entry -- node "%CD%\src\index.js"

Codex는 config.toml에 command = 'node', args = ['<받은 폴더>\src\index.js']로 등록합니다.

같은 엔트리 창을 두 에이전트(예: Claude와 Codex)가 동시에 조작하면 꼬이므로 한 번에 하나만 사용하세요.

사용법

에이전트에게 그냥 부탁하면 됩니다.

  • "엔트리로 별 피하기 게임 만들어줘"

  • "엔트리파이썬으로 레이캐스팅 3D 미로 만들어줘"

  • "방금 만든 작품 실행해서 테스트하고 저장해줘"

에이전트는 먼저 entry_guide 도구로 사용 설명서(GUIDE.md)를 읽고 작업합니다.

  • MCP가 엔트리를 원격 디버깅 포트를 켠 상태로 실행해야 조작할 수 있습니다. 엔트리를 직접 켜 둔 상태라면 entry_launch(restart=true)로 다시 실행합니다(저장 안 된 작업은 미리 저장하세요).

  • 작업하는 동안 엔트리 창을 직접 클릭/편집하면 서로 꼬일 수 있으니 지켜보기만 하세요.

  • 처음 실행할 때 작업 폴더 문서\EntryMCP\(projects / images / sounds / screenshots / json)를 자동으로 만듭니다.

도구 목록

분류

도구

시작/상태

entry_guide, entry_launch, entry_status, entry_logs

작품

entry_project(새로/열기/저장/이름/JSON), entry_get_project, entry_scene

오브젝트

entry_search_assets, entry_preview_assets, entry_add_object, entry_update_object, entry_object_op, entry_object_assets

코드

entry_set_script(파이썬/블록), entry_get_script, entry_define_function, entry_data, entry_block_reference, entry_set_coding_mode

실행/검증

entry_run, entry_input(키·마우스·대답), entry_screenshot, entry_runtime_state

고급

entry_eval_js

환경변수 (선택)

변수

기본값

설명

ENTRY_PATH

C:\entry\Entry.exe 등 자동 탐색

엔트리 실행 파일 경로

ENTRY_DEBUG_PORT

9333

원격 디버깅 포트

ENTRY_MCP_HOME

문서\EntryMCP

작업 폴더

ENTRY_ASAR

엔트리 폴더의 resources\app.asar

내장 리소스 DB 위치

예: claude mcp add -s user entry -e ENTRY_PATH="D:\Entry\Entry.exe" -- cmd /c npx -y github:l2l2l4/entry-offline-mcp

동작 방식

Claude ⇄ (MCP, stdio) ⇄ entry-offline-mcp ⇄ (Chrome DevTools Protocol) ⇄ 엔트리 오프라인(Electron)
  • src/index.js MCP 도구 · src/cdp.js DevTools 연결 · src/bridge.js 엔트리 안에 주입되는 헬퍼 · src/assets.js 내장 리소스 검색 · src/launcher.js 실행

엔트리 내부 API를 사용하므로 엔트리 버전이 바뀌면 일부 기능이 동작하지 않을 수 있습니다. 엔트리 프로그램/리소스는 포함하지 않으며, 사용자 PC에 설치된 엔트리를 그대로 사용합니다. 이 프로젝트는 엔트리(커넥트재단)와 관련 없는 비공식 프로젝트입니다.

라이선스

MIT

Available Tools

24 tools
entry_add_objectA

오브젝트 추가. source='library': 라이브러리 스프라이트/배경(asset_id 또는 asset_name; entry_search_assets로 찾기). 배경은 자동으로 맨 뒤+잠금. source='image': 로컬 이미지 파일(image_paths, png/jpg/svg 등; 여러 장이면 모양 여러 개; 상대경로는 작업폴더/images 기준). source='textbox': 글상자(text, props로 fontSize/color/bgColor 등). source='empty': 빈 오브젝트(붓 그리기용 등). props로 위치/크기/이름 등을 바로 지정. scene을 주면 그 장면에 추가(없으면 현재 장면).

Inputs: source (required), name, text, props, +4 more.

entry_block_referenceB

블록 사전(실행 중인 엔트리에서 직접 읽음). 인자 없이 호출하면 카테고리 목록. category: start, flow, moving, looks, brush, text, sound, judgement, calc, variable, func, analysis, ai_utilize, expansion, arduino. query: 블록 type/한글 문구/파이썬 문법 검색(공백=AND). types: 특정 블록 type들의 상세. 결과: type, text(블록 문구; [KEY]=입력칸), args(입력칸 순서·종류·옵션·기본값), statements(내부 블록 묶음 수), python(엔트리파이썬 문법).

Inputs: limit, query, types, detail, +2 more.

entry_dataA

변수/리스트/신호 관리. kind='variable'|'list'|'message'. action='add'|'set'|'rename'|'delete'. variable: value(초기값), visible(무대에 표시), x,y(표시 위치), scope('global' 또는 오브젝트 이름=그 오브젝트 전용 지역변수). list: items(초기 항목 배열), visible, x, y, width, height. message: name만. 파이썬 코드로 스크립트를 넣으면 쓰인 변수/리스트/신호는 자동 생성되지만, 초기값·표시여부·위치는 여기서 정하세요.

Inputs: kind (required), name (required), action (required), x, +8 more.

entry_define_functionA

함수(나만의 블록) 정의/재정의. 블록 모드용. params: ['이름', ...] 또는 [{name, type:'string'|'boolean'}] (문자/숫자 값 또는 판단 값). {label:'텍스트'}를 끼우면 블록 모양 중간에 글자 삽입. body: compact 블록 배열. 본문에서 매개변수는 {"type":"param","name":"h"}로 참조. kind='value'면 값 반환 함수: return_value에 반환할 값/블록. local_variables: ['i', ...] 함수 지역변수 → 본문에서 {"type":"local_get","name":"i"}, {"type":"local_set","name":"i","value":0}. 호출: 스크립트에서 {"type":"call","function":"함수이름","params":[인자...]}. (엔트리파이썬에서는 entry_set_script의 python 안에 def 함수(인자): 를 쓰면 일반 함수가 자동 생성됩니다)

Inputs: name (required), body, kind, params, +2 more.

entry_eval_jsA

고급: 엔트리 렌더러에서 JavaScript를 직접 실행합니다(전역 Entry 객체, window.__entryMcp 헬퍼 사용 가능). async 함수 본문으로 실행되며 return 값이 JSON으로 반환됩니다. 다른 도구로 불가능한 경우에만 사용하세요.

Inputs: code (required).

entry_get_projectB

현재 작품의 상세 구조: 장면별 오브젝트(id, 이름, 좌표, 크기, 방향, 모양/소리 목록, 레이어), 변수/리스트/신호/함수. scripts='blocks'면 각 오브젝트 코드를 compact 블록 JSON으로, 'python'이면 엔트리파이썬으로 포함.

Inputs: object, scripts.

entry_get_scriptB

오브젝트 코드 읽기. format='blocks'(compact JSON, entry_set_script에 그대로 넣을 수 있음) | 'python'(엔트리파이썬) | 'raw'(엔트리 원본 JSON).

Inputs: object (required), format.

entry_guideA

엔트리 MCP 사용 설명서(좌표계, 블록 JSON 형식, 엔트리파이썬 문법, 고품질 작품 제작 팁). 작업 시작 전에 한 번 읽으세요.

Inputs: no named parameters.

entry_inputA

실행 중인 작품에 사용자 입력을 보냅니다(게임 테스트용). events를 순서대로 실행. {type:'key', key:'space'|'left'|'a'|..., duration_ms?:누르고 있을 시간(기본 100)} {type:'key_down'|'key_up', key} {type:'click', x, y} (무대 좌표, 오브젝트/마우스 클릭 이벤트 발생) {type:'mouse_move', x, y} {type:'mouse_down'|'mouse_up', x, y} {type:'text', text, submit?:true} (묻고 기다리기 대답 입력) {type:'wait', ms} 마지막에 screenshot/state를 돌려줍니다.

Inputs: events (required), state, screenshot.

entry_launchA

Entry 오프라인 앱을 원격 디버깅 포트로 실행하고 연결합니다. 이미 연결 가능하면 그대로 연결합니다. Entry가 디버그 포트 없이 실행 중이면 restart=true가 필요합니다(앱 강제 종료 → 저장 안 된 작업 손실 가능, 사용자 확인 후 사용). 시작 시 "작품 복구" 대화상자가 뜨면 recovery 옵션으로 처리합니다.

Inputs: restart, recovery, open_file.

entry_logsC

엔트리 앱의 콘솔 로그/예외/토스트 경고 메시지를 봅니다(디버깅용).

Inputs: clear, errors_only.

entry_object_assetsA

오브젝트의 모양(picture)/소리(sound) 관리. add_picture: library_ids(entry_search_assets kind=picture의 id) 또는 files(로컬 이미지 경로; 상대경로는 작업폴더/images 기준). add_sound: library_ids(kind=sound의 id) 또는 files(mp3/wav 경로; 상대경로는 작업폴더/sounds 기준). remove_picture / remove_sound / rename_picture / rename_sound: name(현재 이름) [+ new_name].

Inputs: action (required), object (required), name, files, +2 more.

entry_object_opC

오브젝트 관리: action='delete' 삭제, 'duplicate' 복제(스크립트 포함, new_name), 'select' 선택(편집 화면에 표시).

Inputs: action (required), object (required), new_name.

entry_preview_assetsC

라이브러리 리소스의 썸네일 이미지를 봅니다(디자인 선택용). 최대 8개.

Inputs: ids (required), kind (required).

entry_projectA

작품 단위 작업. action='new': 새 작품(기본 엔트리봇 포함, empty=true면 오브젝트 모두 제거). 현재 작품은 저장하지 않으면 사라짐. action='open': .ent 파일 열기(path; 상대경로는 작업폴더/projects 기준). action='save': .ent 파일로 저장. path 생략 시 작업폴더/projects/<작품이름>.ent. 상대경로는 작업폴더/projects 기준. name을 주면 작품 이름도 변경. action='rename': 작품 이름 변경(name). action='export_json': 엔트리 원본 project JSON 전체를 반환(고급 편집용, path를 주면 파일로 저장). action='import_json': project JSON(json 문자열 또는 json_path 파일)을 그대로 불러오기.

Inputs: action (required), json, name, path, +2 more.

entry_runB

작품 실행 제어. action='start'(시작하기 버튼), 'stop', 'restart'. wait_ms만큼 기다린 뒤 결과를 돌려주며, screenshot=true면 무대 화면 캡처, state=true면 변수/오브젝트 상태 포함. 실행 중 에러/경고 로그도 포함됩니다.

Inputs: action (required), state, wait_ms, screenshot.

entry_runtime_stateB

실행 상태 조회: 엔진 상태, 모든 변수/리스트 값, 각 오브젝트의 위치/크기/방향/모양/말풍선/복제본 수, 대답 값.

Inputs: no named parameters.

entry_sceneA

장면 관리: add(name), rename(scene,name), select(scene), delete(scene), move(scene,index). 오브젝트는 '현재 선택된 장면'에 추가되므로, 다른 장면에 넣으려면 entry_add_object의 scene 인자를 쓰세요.

Inputs: action (required), name, index, scene.

entry_screenshotA

화면 캡처. target='stage'(실행 화면만) | 'window'(엔트리 전체 창: 블록 편집기 포함). save_as를 주면 작업폴더/screenshots에 PNG로도 저장.

Inputs: target, save_as.

entry_search_assetsA

엔트리 기본 리소스 라이브러리 검색(오프라인 내장). kind='sprite'(오브젝트: 모양 여러 개+소리 포함), 'background'(배경 오브젝트), 'picture'(모양 단일 그림), 'sound'(소리). query는 한국어/영어 키워드(공백=AND). query 없이 list_categories=true면 카테고리 목록.

Inputs: kind (required), limit, query, offset, +2 more.

entry_set_coding_modeA

엔트리 화면의 코딩 모드 전환: 'block'(블록코딩) | 'python'(엔트리파이썬 텍스트 편집 화면). 코드 자체는 동일하며 표시 방식만 바뀝니다. 파이썬 모드는 일부 블록(값 반환 함수, 지역변수 함수 등)을 지원하지 않습니다.

Inputs: mode (required).

entry_set_scriptA

오브젝트의 코드를 설정합니다. python 또는 blocks 중 하나를 주세요. python: 엔트리파이썬 코드(이벤트는 def when_start():, def when_press_key("space"): 등). 엔트리 자체 변환기로 블록으로 바뀌며, 쓰인 변수/리스트/신호/함수가 자동 생성됩니다. 'import Entry'는 생략 가능. blocks: 스레드 배열 [[이벤트블록, 블록, ...], [...]] (compact 형식, entry_guide 참고). 숫자/문자 리터럴, 드롭다운은 값 또는 이름(변수/신호/오브젝트/모양/소리/장면 이름 → id 자동 변환). mode='replace'(기본: 기존 코드 전부 교체) | 'append'(기존 코드 뒤에 스레드 추가). 결과의 warnings를 반드시 확인하세요(없는 모양/변수 등).

Inputs: object (required), mode, blocks, python.

entry_statusA

연결 상태, 작업 폴더 경로, 현재 작품 요약(장면/오브젝트 이름/변수/신호/함수, 코딩 모드, 실행 상태)을 봅니다.

Inputs: no named parameters.

entry_update_objectA

오브젝트 속성 변경(이름, x/y, 크기, 방향, 이동방향, 회전방식, 보이기, 현재 모양, 레이어 순서, 글상자 글자/글꼴/색 등). 실행 전 "초기 상태"를 정하는 용도입니다.

Inputs: props (required), object (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 24 tools

    Disambiguation4/5

    Each tool maps to a distinct resource or action (project, object, scene, data, script, assets, runtime), and descriptions clarify boundaries well. Minor overlaps exist: entry_status vs entry_get_project both summarize the project, entry_screenshot vs entry_run(screenshot=true) duplicate capture, and entry_runtime_state vs entry_run(state=true) overlap for state inspection.

    Naming Consistency4/5

    All tools share a consistent 'entry_' prefix and snake_case, with readable verb_noun forms for actions (get_project, add_object, set_script, define_function). A few are noun-based aggregates (entry_object_op, entry_scene, entry_data, entry_object_assets), which slightly deviates from the verb pattern but stays readable.

    Tool Count3/5

    24 tools is at the heavy end, justified by the breadth of the Entry IDE domain (project, scenes, objects, scripts, blocks, assets, runtime testing). It feels borderline heavy, with some redundancy (screenshot/state folded into run plus separate tools) that could be consolidated.

    Completeness4/5

    Coverage is strong: full project lifecycle (new/open/save/export/import), object and scene CRUD, variables/lists/messages, block and Python scripting, asset library, block reference, run control, input simulation, runtime state, and logging. Only minor gaps like no undo or dedicated script removal (covered by replace) remain.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers