# 셀프 호스팅 설치의 MCP

> 셀프 호스팅 Nodaro의 MCP 서버를 활성화하면 Claude, Cursor, ChatGPT 같은 MCP 클라이언트가 전용 MCP 호스트 이름에서 OAuth로 내 설치를 사용할 수 있습니다.

Source: https://nodaro.ai/ko/docs/self-hosting/mcp

Nodaro **MCP 서버**를 사용하면 Claude, Cursor, Cline, Continue, Goose, ChatGPT 같은 AI 클라이언트가 사용자를 대신해 셀프 호스팅 설치의 도구를 쓸 수 있습니다. 기본적으로는 꺼져 있습니다. 활성화하려면 MCP 전용 호스트 이름을 정하고, 그 호스트 이름을 API로 라우팅하고, 변수 두 개를 설정하세요. 그러면 사용자는 자신의 클라이언트에서 OAuth로 내 설치에 로그인합니다.

## MCP 제공 방식
- **API가 MCP를 제공합니다.** 경로는 `/mcp`이고, `nodaro` 컨테이너 안의 포트 `9000`에서 제공됩니다.
- **포트 `3000`의 웹 서버는 MCP 요청을 거부합니다.** 앱의 기본 주소로 `/mcp`를 요청하면 `wrong_mcp_host` 오류와 실제 엔드포인트 주소와 함께 `405`로 응답합니다.
- **따라서 MCP에는 전용 호스트 이름이 필요합니다.** `mcp.nodaro.example.com`처럼, 트래픽이 API에 직접 닿는 호스트 이름입니다.
- **로그인은 기본 도메인에서 이루어집니다.** OAuth 검색 문서 `/.well-known/oauth-authorization-server`와 동의 화면은 `PUBLIC_URL`에서 제공됩니다.

## MCP 활성화
### MCP 호스트 이름을 API로 라우팅
내 서버를 가리키는 `mcp.<your-domain>` DNS 레코드를 만드세요. CDN으로 프록시하지 마세요. 프록시는 MCP가 쓰는 오래 유지되는 Server-Sent Events 연결을 끊습니다.

**Docker Compose**

Compose 파일은 API 포트를 공개하지 않습니다. `nodaro` 서비스 아래에서 루프백 인터페이스에 공개하세요.

```yaml
nodaro:
ports:
      - "3000:3000"
      - "127.0.0.1:9000:9000"
```

그런 다음 리버스 프록시에 MCP 호스트용 두 번째 사이트를 추가해 `127.0.0.1:3000` 대신 `127.0.0.1:9000`으로 전달하게 하세요. [nginx 예시](https://nodaro.ai/docs/self-hosting/reverse-proxy#option-a-nginx)처럼 응답 버퍼링은 꺼 두세요.

**Railway**

MCP 호스트 이름을 백엔드 서비스의 커스텀 도메인으로 추가하세요.

```bash
railway domain add mcp.your-domain.com --service backend
```

또는 Railway 대시보드에서 **Project › backend service › Settings › Domains › Add custom domain**으로 이동하세요. 그런 다음 DNS 공급자에서 CNAME 레코드를 추가하세요.

### 변수 설정
```bash
MCP_ENABLED=true                              # required; the default is off
MCP_PUBLIC_URL=https://mcp.your-domain.com    # the hostname from step 1
```

Compose 스택에서는 Compose 파일이 `.env`에서 이 두 변수를 전달하지 않으므로, `nodaro` 서비스의 `environment:` 아래에 둘 다 추가하세요. 그런 다음 `docker compose -f docker-compose.community.yml up -d`를 실행하세요.

`MCP_PUBLIC_URL`은 검색 엔드포인트가 보호된 리소스(RFC 9728)의 ID로 알리는 값이며, 도구가 반환하는 업로드 링크의 기준 주소이기도 합니다. 이 값이 없으면 내 설치는 Nodaro Cloud의 MCP 호스트를 알립니다. 하위 도메인 대신 기본 도메인에서 MCP를 제공한다면 `PUBLIC_URL`과 같은 값으로 설정하세요. 이때도 `/mcp` 요청은 API 포트에 직접 닿아야 합니다.

### 검색 엔드포인트 확인
```bash
curl https://mcp.your-domain.com/.well-known/oauth-protected-resource
curl https://your-domain.com/.well-known/oauth-authorization-server
```

둘 다 상태 `200`과 함께 JSON을 반환해야 합니다.

### 클라이언트에 커넥터 추가
MCP 엔드포인트는 `https://mcp.your-domain.com/mcp`입니다. Claude에서는 **Settings › Connectors › Add custom connector**를 열고 그 URL을 입력하세요. 다른 클라이언트는 [클라이언트 연결](https://nodaro.ai/docs/mcp/connect)을 참조하고, Nodaro Cloud의 URL 대신 내 MCP URL을 쓰세요.

## 등록할 수 있는 클라이언트
MCP 클라이언트는 OAuth로 로그인합니다. 지원되는 클라이언트는 동적 클라이언트 등록(RFC 7591)으로 내 설치에 스스로 등록합니다. 이를 제어하는 변수는 두 개이며, 기본값은 대부분의 설치에 적합합니다.

| 변수 | 기본값 | 역할 |
| --- | --- | --- |
| `MCP_DYNAMIC_REGISTRATION` | `allowlist` | `allowlist`는 `MCP_DCR_ALLOWLIST`에 있는 클라이언트 이름만 받습니다. `open`은 모든 클라이언트를 받습니다. `off`는 동적 등록을 끕니다. |
| `MCP_DCR_ALLOWLIST` | 알려진 클라이언트 14개 | `allowlist` 모드에서 받는 클라이언트 이름을 쉼표로 구분한 목록입니다. |

기본 허용 목록은 Claude, Claude Code, Cursor, Cline, Continue, Goose, ChatGPT, OpenAI, Lovable, Gemini, Gemini CLI, Codex, MCP Inspector, mcp-inspector입니다. 내 클라이언트를 추가하려면 전체 목록을 설정하세요.

```bash
MCP_DCR_ALLOWLIST=Claude,Cursor,Cline,Continue,Goose,YourCustomClient
```

권장 모드는 `allowlist`입니다.

## 클라이언트가 할 수 있는 것
MCP 서버는 이미지, 동영상, 오디오, 캐릭터, 장소, 오브젝트 생성 도구와 갤러리, 워크플로, 앱, 저장된 컴포넌트, 모델용 도구를 제공합니다. 각 사용자는 내 설치에서 자신의 계정으로 작업합니다. [MCP 도구](https://nodaro.ai/docs/mcp/tools) 레퍼런스와 [MCP 문제 해결](https://nodaro.ai/docs/mcp/troubleshooting)을 참조하세요.

## 자주 묻는 질문

### 셀프 호스팅 Nodaro에서 MCP는 기본적으로 켜져 있나요?

아니요. MCP_ENABLED=true와 MCP_PUBLIC_URL을 설정하고, MCP 호스트 이름을 API로 라우팅한 다음 재시작하세요. Compose 스택에서는 Compose 파일이 .env에서 이 두 변수를 전달하지 않으므로, nodaro 서비스의 environment 블록 아래에 추가하세요.

### MCP 클라이언트가 405 wrong_mcp_host를 받는 이유는 무엇인가요?

클라이언트가 앱의 기본 주소를 쓰고 있고, 그 주소의 웹 서버는 MCP 요청을 거부합니다. 클라이언트를 MCP 호스트인 https://your-mcp-host/mcp로 지정하세요. 이 호스트는 포트 9000의 API에 직접 닿아야 합니다.

### 어떤 MCP 클라이언트가 내 설치에 등록할 수 있나요?

기본적으로 Claude, Claude Code, Cursor, Cline, Continue, Goose, ChatGPT, Codex를 포함한 알려진 클라이언트 14개입니다. MCP_DCR_ALLOWLIST에 이름을 추가하거나, 모든 클라이언트를 받으려면 MCP_DYNAMIC_REGISTRATION=open으로 설정하세요.

### MCP 호스트 앞에 CDN을 둘 수 있나요?

트래픽을 프록시하는 CDN은 안 됩니다. MCP는 오래 유지되는 Server-Sent Events 연결을 열어 두는데, 프록시하는 CDN은 이 연결을 끊습니다. DNS를 서버로 직접 지정하세요.
