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].경로 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 를 헤더로 넣어 등록
- Claude Code
- Codex CLI
- Cursor · 기타 호스트
SaaS 와 함께 등록하기
별칭을 다르게 지으면 툴 이름이 겹치지 않습니다.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 값과 인그레스 세팅.