메인 콘텐츠로 건너뛰기
Nora Local 은 형태와 무관하게 — 데스크톱, compose, Kubernetes, 에어갭 — SaaS 와 동일한 MCP 서버 를 POST /api/v1/mcp 로 노출합니다. 코딩 에이전트가 로컬 URL 을 가리키기만 하면 Flow CRUD, 블록 조작, 배선, 변수, 배포, 트레이스까지 SaaS 와 같은 도구 표면을 그대로 씁니다.

URL

데스크톱 앱을 기본 설정으로 설치했다면 주소는 다음과 같습니다. 이 페이지의 모든 예시가 이 주소를 씁니다.
  • 포트를 바꿨다면 앱 설정 의 호스트 포트 값으로 8090 을 바꿔 넣습니다. compose 로 띄웠다면 .env.onprem 의 NORA_HOST_PORT 값입니다.
  • Kubernetes 경로는 Helm 차트의 publicUrl 에 설정한 호스트네임을 씁니다 (예: https://nora.example.internal/api/v1/mcp). Kubernetes (Helm) 을 참고하세요.

인증하기

MCP 엔드포인트는 인증 경로가 세 가지입니다. 환경에 따라 어느 것을 쓸지 정하세요.

데스크톱 앱 OAuth (macOS)

Nora Local 을 데스크톱 앱으로 돌릴 때 가장 자연스러운 경로입니다. OAuth 승인 창이 Nora 앱 자체 안 에서 열립니다. 앱에는 이미 로그인 세션이 있으므로 브라우저 왕복이 없습니다.

브라우저 OAuth

기본 브라우저로 OAuth 핸드셰이크를 진행합니다. compose · Kubernetes 배포에 같은 머신에서 접근하는 경우에 맞습니다.

Personal Access Token

정적 Authorization: Bearer nora_pat_... 헤더. 헤드리스 설치, 브라우저 없는 에어갭, CI/스크립트용.

경로 A — 데스크톱 앱 OAuth (macOS)

2026-09-29 신규. 온프렘 서버가 로컬호스트 issuer 로부터의 authorize 요청을 받으면, 브라우저를 [Nora 앱에서 승인] 링크가 있는 작은 핸드오프 페이지로 리다이렉트합니다. 링크를 누르면 nora-local://oauth 딥링크가 열리고 Nora 데스크톱 앱이 자체 창에서 기존 세션 그대로 승인 UI 를 렌더합니다. 별도 로그인이 필요 없습니다.
1

토큰 없이 서버 등록

2

OAuth 흐름 트리거

Claude Code 에서 /mcp → nora-local 선택 → [Authenticate]. 서버가 401 + WWW-Authenticate 를 반환하면 Claude Code 가 브라우저를 로컬 서버의 /oauth/desktop 로 열고, [Nora 앱에서 승인] 을 누르면 승인이 Nora 앱으로 이양됩니다.Nora 앱은 authorize URL 이 이 서버를 가리키는지 검증하고 (다른 origin 은 거절), PKCE · state · resource 를 그대로 보존한 뒤 콜백이 발생하면 창을 자동으로 닫습니다.
요구조건: NORA_DEPLOY_FLAVOR=onprem (compose 파일이 이미 세팅) + issuer 가 로컬호스트 (localhost / 127.0.0.1 / [::1]). 다른 플랫폼에서는 핸드오프 페이지에 [브라우저에서 계속] 도 함께 뜨므로 막히지 않습니다.

경로 B — 브라우저 OAuth

데스크톱 앱이 없는 경우 (compose 만 · Kubernetes) OAuth 는 기본 브라우저에서 완료됩니다.
1

토큰 없이 등록

2

OAuth 흐름 트리거

Claude Code 에서 /mcp → nora-local 선택 → [Authenticate]. 브라우저가 로컬 서버의 로그인 페이지를 엽니다. 로그인 후 read · build · run 에 동의합니다.Codex CLI 대응: codex mcp login nora-local. Cursor: Settings → MCP → nora-local → [Reconnect].
OAuth 콜백 URL 은 NORA_PUBLIC_URL (과 NORA_OAUTH_REDIRECT_BASE) 을 따라갑니다. 두 기본값 모두 이제 NORA_HOST_PORT 를 interpolate 합니다 (2026-09-26 수정). 포트 하나만 바꾸면 콜백까지 함께 이동합니다. 실호스트명이나 TLS 프록시 뒤에서 스택을 서빙한다면 .env.onprem 에 NORA_PUBLIC_URL=https://nora.example.internal 을 지정해 콜백이 실제 URL 로 돌아가게 합니다.

경로 C — Personal Access Token

헤드리스 서버, 브라우저 없는 에어갭, 스크립트 · CI 용.
1

PAT 발급

SPA 에서 Settings → Personal Access Tokens 를 열고 [New token] 을 눌러 이름을 정합니다. 스코프는 기본값 (read · build · run) 을 유지하고 표시되는 평문 값을 복사하세요. 평문은 딱 한 번 만 보입니다.또는 CLI 로:
nora auth login 이 loopback 흐름으로 PAT 를 발급하고 ~/.config/nora/credentials.json (macOS 는 ~/Library/Application Support/nora/credentials.json) 에 저장합니다.
2

PAT 를 헤더로 넣어 등록

PAT 는 MCP 클라이언트의 설정 파일 (~/.claude.json, mcp_config.json 등) 에 평문으로 저장됩니다. 파일 권한은 chmod 0600 으로 유지하고 절대 커밋하지 마세요.

SaaS 와 함께 등록하기

별칭을 다르게 지으면 툴 이름이 겹치지 않습니다.
Claude Code 는 툴 이름 앞에 서버 별칭을 붙이므로 nora_list_flows 와 nora-local_list_flows 가 깔끔하게 분리됩니다. 각 서버는 처음 쓸 때 각자 OAuth 로그인을 요구합니다.

노출되는 도구

도구 표면은 SaaS 와 동일합니다. 전체 목록은 MCP 도구 표면 을 참고하세요. 권한도 Nora Local 의 역할을 그대로 따릅니다. Guest 는 읽기만 가능하고, 승인이 필요한 액션은 MCP 로 실행해도 승인 절차를 그대로 거칩니다.

에어갭 노트

MCP 는 인터넷 접근이 필요 없습니다. OAuth 핸드셰이크와 툴 호출을 포함한 전체 흐름이 로컬 호스트 안에서 끝납니다.
  • NORA_AIRGAP=1 이 켜져 있어도 서버는 MCP 를 그대로 서빙합니다. 부팅 프로브는 서버가 공용 인터넷 에 못 닿는지만 확인하고, 로컬 브라우저 · CLI 의 인바운드 트래픽은 제한하지 않습니다.
  • 타겟 호스트에 브라우저가 없는 헤드리스 서버 설치라면, LAN 으로 서버에 닿을 수 있는 노트북에서 코딩 에이전트를 실행하고 NORA_PUBLIC_URL 을 LAN 호스트네임 (예: http://nora.internal:8090) 으로 설정해 콜백이 도달 가능한 곳으로 돌아가게 합니다. PAT (경로 C) 는 브라우저 단계 자체를 생략하는 대안입니다.

문제 해결

  • claude mcp add 에서 connection refused. 스택이 꺼져 있는 상태입니다. docker ps 또는 데스크톱 앱 트레이로 확인하세요. URL 에는 스킴 (http://) 이 반드시 포함되어야 하고, 포트는 스택 부팅 시점의 NORA_HOST_PORT 값과 일치해야 합니다.
  • OAuth /oauth/desktop 페이지에 “Open Nora” 링크가 안 보임. 서버가 NORA_DEPLOY_FLAVOR=saas 로 돌고 있거나 (compose 기본은 onprem — .env.onprem 확인) issuer 가 로컬호스트가 아닌 경우입니다 (리버스 프록시로 공개 호스트명에 접근 중). 브라우저 OAuth (경로 B) 또는 PAT (경로 C) 를 사용하세요.
  • OAuth 로그인 페이지가 404 · 무한 로딩. NORA_PUBLIC_URL 이 브라우저 접속 URL 과 일치하지 않는 경우입니다. 스킴 · 호스트 · 포트가 실제와 정확히 같은 값으로 지정하고 스택을 재시작하세요.
  • OAuth 경로인데 첫 툴 호출에 아무 일도 안 일어남. OAuth 는 자동 트리거가 아닙니다. Claude Code 세션에서 /mcp → nora-local 선택 → [Authenticate] 를 눌러야 핸드셰이크가 시작됩니다.
  • PAT 헤더 방식인데 401 반복. 토큰이 철회 · 만료되었거나 오타입니다. SPA 의 Settings → Personal Access Tokens 에서 확인한 뒤 claude mcp remove nora-local 로 지우고 새 토큰으로 다시 등록하세요.
  • 로그인 후 툴 목록이 비어 있음. 로그인한 계정이 이 서버의 워크스페이스에 접근 권한이 없는 경우입니다. SPA 의 Settings → Members 에서 권한을 확인한 뒤 재연결합니다.

관련

MCP (SaaS)

호스팅된 platform.nora.my 서버에 대한 같은 페이지.

Settings — 호스트 포트

NORA_HOST_PORT 변경 시 MCP URL 도 함께 이동합니다.

Kubernetes (Helm)

Helm publicUrl 값과 인그레스 세팅.