kagent 참조 구현에 자체 MCP 서버 가져오기

소개

자체 모델 컨텍스트 프로토콜(MCP) 서버를 사용하면 AI 에이전트가 기존 인프라 전반에서 표준화된 연결을 사용하여 실시간으로 외부 저장소의 데이터를 쿼리하고 처리할 수 있습니다.

이 솔루션 참조 구현(SRI) 문서에서는 kagent용 Solo Enterprise에서 Nextcloud 에이전트와 함께 Nextcloud 오픈소스 애플리케이션과 MCP 서버를 배포하는 방법을 보여줍니다. 이 아키텍처는 Google Distributed Cloud 소프트웨어 전용(GDC)에 배포된 Google Kubernetes Engine(GKE) 클러스터 내에서 Nextcloud, kagent, Gemma 4 모델을 연결합니다. 이 구성에서 kagent는 Nextcloud를 데이터 저장소로 사용하여 Gemma 4 모델이 표준화된 MCP 인터페이스를 통해 Nextcloud의 파일에 액세스하고 처리할 수 있도록 합니다. 아키텍처 컨텍스트는 함께 제공되는 참조 아키텍처를 참조하세요.

Nextcloud 개요

Nextcloud는 온프레미스 배포를 지원하는 오픈소스 자체 호스팅 공동작업 및 클라우드 스토리지 플랫폼입니다. 온프레미스에 Nextcloud를 배포하면 데이터에 대한 주권, 보안, 개인 정보 보호를 유지하는 데 도움이 됩니다.

Nextcloud는 다음과 같은 기능을 제공합니다.

  • 파일 동기화 및 공유: 파일을 저장하고 전용 앱을 통해 데스크톱과 휴대기기 간에 동기화하며 링크를 사용하여 다른 사용자와 공유합니다.
  • 생산성 도구: 기본 제공되는 캘린더, 연락처, 작업 관리, 이메일 클라이언트를 사용하여 일정과 커뮤니케이션을 관리합니다.
  • 공동작업: Collabora Online 또는 ONLYOFFICE와 같은 오피스 제품군을 Nextcloud에 직접 통합하여 문서, 스프레드시트, 프레젠테이션을 실시간으로 공동 수정합니다.
  • 확장성: 앱 스토어에서 플러그인을 설치하여 비밀번호 관리자, Kanban 보드, 음악 플레이어와 같은 기능을 추가할 수 있습니다.

솔루션 아키텍처

이 솔루션에는 kagent용 Solo Enterprise 및 Gemma 4 모델이 포함된 vLLM이 배포된 GDC 환경과 kubectl 및 helm가 설치된 워크스테이션이 필요합니다.

다음 다이어그램은 GDC, kagent, Nextcloud, vLLM을 Gemma 4와 연결하는 솔루션 아키텍처를 보여줍니다.

솔루션 아키텍처: GDC, kagent, Nextcloud, Gemma 4를 사용한 vLLM

배포 방식

Nextcloud를 배포하고 MCP 서버를 kagent와 통합하려면 다음 상위 수준 단계를 완료하세요.

  1. Nextcloud 전용 네임스페이스 만들기: kubectl를 사용하여 nextcloud 네임스페이스를 만들어 배포를 격리합니다.
  2. Helm 저장소 추가 및 업데이트: 공식 Nextcloud Helm 저장소로 워크스테이션을 구성하고 로컬 차트 메타데이터를 업데이트합니다.
  3. 커스텀 배포 값 구성: 커스텀 values.yaml 파일을 만들어 대상 환경에 맞게 Nextcloud를 구성합니다. 이 구성은 기본 로컬 SQLite 데이터베이스를 사용 중지하고, MariaDB 영구 스토리지를 구성하고, 관리자 사용자 인증 정보를 정의하고, ClusterIP 서비스를 사용하여 내부 라우팅을 설정합니다.
  4. Helm 설치 실행: 커스텀 구성 파일을 사용하여 차트를 대상 네임스페이스에 배포합니다. Nextcloud 애플리케이션 및 MariaDB 스토리지 포드를 포함한 모든 구성요소가 Running 상태에 도달하는지 확인합니다.
  5. Nextcloud MCP 서버 배포: 사용자 인증 정보에 대한 불투명 보안 비밀, nextcloud-mcp-server:latest 이미지를 사용하는 배포, 8000 포트를 노출하는 ClusterIP 서비스를 포함하는 배포 매니페스트(nextcloud-mcp.yaml)를 만듭니다. 이 매니페스트를 적용하여 Nextcloud 애플리케이션과의 내부 Kubernetes DNS 통신을 허용합니다.
  6. kagent에 도구 서버 등록: 내부 서비스 URL http://nextcloud-mcp-service.nextcloud.svc.cluster.local:8000/mcp 및 STREAMABLE_HTTP 프로토콜을 사용하여 kagent UI에서 서버를 연결합니다.

Nextcloud 및 MCP 서버 배포

  1. Nextcloud의 네임스페이스를 만듭니다.

    kubectl create namespace nextcloud
    

    출력은 다음과 비슷합니다.

    namespace/nextcloud created
    
  2. Nextcloud Helm 저장소를 워크스테이션에 추가하고 로컬 차트 메타데이터를 업데이트합니다.

    helm repo add nextcloud https://nextcloud.github.io/helm/
    helm repo update
    

    출력은 다음과 비슷합니다.

    "nextcloud" has been added to your repositories
    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "nextcloud" chart repository
    Update Complete. ⎈Happy Helming!⎈
    
  3. 워크스테이션에서 커스텀 values.yaml 파일을 만들어 Nextcloud Helm 차트의 기본 구성 매개변수를 재정의합니다.

    # 0. Nextcloud administrator configuration
    nextcloud:
      # Use the internal CoreDNS record
      host: "nextcloud.nextcloud.svc.cluster.local"  # Application access through CoreDNS rather than external DNS
      username: "admin"  # Application Login Credentials
      password: "SuperSecretPassword123"
    
    # You can use a standard ClusterIP service since
    # you are relying on internal routing, not an External LB.
    service:
      type: ClusterIP
    
    # 1. Configure RWO Storage for Nextcloud
    persistence:
      enabled: true
      storageClass: "local-shared"
      accessMode: ReadWriteOnce
      size: 50Gi # Adjust based on your file storage needs
    
    # 2. Explicitly disable the default local SQLite database
    internalDatabase:
      enabled: false
    
    # 3. Configure RWO Storage for the Database
    mariadb:
      enabled: true
      auth:
        database: "nextcloud"
        username: "nextcloud"
        password: "NextcloudDBPassword123"
        rootPassword: "RootDBPassword123"
      primary:
        persistence:
          enabled: true
          storageClass: "local-shared"
          accessModes:
            - ReadWriteOnce
          size: 10Gi
    
    # 4. Force Nextcloud to connect through the TCP Network
    externalDatabase:
      enabled: true
      type: mysql
      host: "nextcloud-mariadb" # The internal Kubernetes service name for the DB
      database: "nextcloud"
      user: "nextcloud"
      password: "NextcloudDBPassword123" # MUST match mariadb.auth.password above
    
    # Optional: Enable Ingress to route external traffic to Nextcloud
    ingress:
      enabled: false # Set to true if you are using an Ingress Controller (like NGINX)
      className: "nginx"
      annotations:
        nginx.ingress.kubernetes.io/proxy-body-size: 4G # Required to allow large file uploads
    
  4. Helm을 사용하여 Nextcloud를 배포합니다.

    helm install nextcloud nextcloud/nextcloud \
        --namespace nextcloud \
        --values values.yaml
    

    출력은 다음과 비슷합니다.

    NAME: nextcloud
    LAST DEPLOYED: Thu Jul  9 17:14:03 2026
    NAMESPACE: nextcloud
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    1. Get the nextcloud URL by running:
    
      export POD_NAME=$(kubectl get pods --namespace nextcloud -l "app.kubernetes.io/name=nextcloud" -o jsonpath="{.items[0].metadata.name}")
      echo http://127.0.0.1:8080/
      kubectl port-forward --namespace nextcloud $POD_NAME 8080:80
    
    2. Get your nextcloud login credentials by running:
    
      echo User:     admin
      echo Password: $(kubectl get secret --namespace nextcloud nextcloud -o jsonpath="{.data.nextcloud-password}" | base64 --decode)
    

    Nextcloud 포드가 Running 상태이고 서비스가 nextcloud 네임스페이스에 있는지 확인합니다.

    kubectl get pod -n nextcloud
    kubectl get svc -n nextcloud
    

    출력은 다음과 비슷합니다.

    NAME                                    READY   STATUS    RESTARTS   AGE
    nextcloud-558cbccb4c-q6zqq              1/1     Running   0          25m
    nextcloud-mariadb-0                     1/1     Running   0          25m
    
    NAME                         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    nextcloud                    ClusterIP   10.255.224.187   <none>        8080/TCP   25m
    nextcloud-mariadb            ClusterIP   10.255.226.235   <none>        3306/TCP   25m
    nextcloud-mariadb-headless   ClusterIP   None             <none>        3306/TCP   25m
    
  5. nextcloud 네임스페이스에 Nextcloud MCP 서버를 배포하려면 워크스테이션에 nextcloud-mcp.yaml라는 파일을 만듭니다.

    # Secret Creation
    apiVersion: v1
    kind: Secret
    metadata:
      name: nextcloud-mcp-secret
      namespace: nextcloud
    type: Opaque
    stringData:
      # Use your dedicated App Password here, NEVER your primary administrator password
      NEXTCLOUD_USERNAME: "admin"
      NEXTCLOUD_PASSWORD: "SuperSecretPassword123"
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nextcloud-mcp-server
      namespace: nextcloud
      labels:
        app: nextcloud-mcp
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nextcloud-mcp
      template:
        metadata:
          labels:
            app: nextcloud-mcp
        spec:
          containers:
            - name: mcp-server
              # The official Docker image provided by the project
              image: ghcr.io/cbcoutinho/nextcloud-mcp-server:latest
              imagePullPolicy: Always
              ports:
                - containerPort: 8000
                  name: http-mcp
              env:
                - name: NEXTCLOUD_HOST
                  # Since the MCP server is in the same namespace, it can securely
                  # talk to Nextcloud through the internal Kubernetes DNS, completely bypassing the internet.
                  value: "http://nextcloud.nextcloud.svc.cluster.local:8080"
                - name: NEXTCLOUD_USERNAME
                  valueFrom:
                    secretKeyRef:
                      name: nextcloud-mcp-secret
                      key: NEXTCLOUD_USERNAME
                - name: NEXTCLOUD_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: nextcloud-mcp-secret
                      key: NEXTCLOUD_PASSWORD
              resources:
                requests:
                  cpu: "100m"
                  memory: "128Mi"
                limits:
                  cpu: "500m"
                  memory: "512Mi"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nextcloud-mcp-service
      namespace: nextcloud
    spec:
      type: ClusterIP
      ports:
        - port: 8000
          targetPort: 8000
          protocol: TCP
          name: http-mcp
      selector:
        app: nextcloud-mcp
    

    nextcloud-mcp.yaml 매니페스트를 적용합니다.

    kubectl apply -f nextcloud-mcp.yaml
    

    출력은 다음과 비슷합니다.

    secret/nextcloud-mcp-secret created
    deployment.apps/nextcloud-mcp-server created
    service/nextcloud-mcp-service created
    

    포드와 서비스가 nextcloud 네임스페이스에서 실행 중인지 확인합니다.

    kubectl get svc -n nextcloud
    kubectl get pod -n nextcloud
    

    출력은 다음과 비슷합니다.

    NAME                         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    nextcloud                    ClusterIP   10.255.224.187   <none>        8080/TCP   26m
    nextcloud-mariadb            ClusterIP   10.255.226.235   <none>        3306/TCP   26m
    nextcloud-mariadb-headless   ClusterIP   None             <none>        3306/TCP   26m
    nextcloud-mcp-service        ClusterIP   10.255.226.105   <none>        8000/TCP   55s
    
    NAME                                    READY   STATUS    RESTARTS   AGE
    nextcloud-558cbccb4c-q6zqq              1/1     Running   0          29m
    nextcloud-mariadb-0                     1/1     Running   0          29m
    nextcloud-mcp-server-58484d5799-mfvct   1/1     Running   0          4m11s
    
  6. URL로 Nextcloud MCP 도구를 통합하려면 kagent UI로 이동하여 다음 값으로 도구 서버를 등록합니다.

    • URL: http://nextcloud-mcp-service.nextcloud.svc.cluster.local:8000/mcp
    • 프로토콜: STREAMABLE_HTTP
    • Namespace(네임스페이스): kagent
    • 클러스터: 클러스터 이름(예: mgmt-cluster)

    RemoteMCPServer 리소스가 kagent 네임스페이스에서 허용되는지 확인합니다.

    kubectl get remotemcpserver -n kagent
    

    출력은 다음과 비슷합니다.

    NAME                 PROTOCOL          URL                                                                 ACCEPTED
    kagent-grafana-mcp   STREAMABLE_HTTP   http://kagent-grafana-mcp.kagent:8000/mcp                           True
    kagent-tool-server   STREAMABLE_HTTP   http://kagent-tools.kagent:8084/mcp                                 True
    nextcloud            STREAMABLE_HTTP   http://nextcloud-mcp-service.nextcloud.svc.cluster.local:8000/mcp   True
    
  7. 워크스테이션에서 Nextcloud에 액세스하려면 로컬 포트 8080를 nextcloud 서비스로 전달합니다(외부 URL을 구성한 경우 이 단계 건너뛰기).

    kubectl port-forward -n nextcloud svc/nextcloud 8080:8080 &
    

    출력은 다음과 비슷합니다.

    Forwarding from 127.0.0.1:8080 -> 80
    Forwarding from [::1]:8080 -> 80
    

배포 확인 및 Nextcloud 에이전트 구성

워크스테이션 브라우저에서 http://localhost:8080을 열어 Nextcloud 대시보드를 확인합니다.

Nextcloud 애플리케이션 대시보드 페이지

파일 뷰에는 Nextcloud에 저장된 디렉터리와 파일이 표시됩니다.

Nextcloud 애플리케이션 내의 디렉터리 및 파일 인터페이스

kagent UI에서 대시보드 페이지에는 연결된 클러스터와 배포된 에이전트가 표시됩니다.

kagent 애플리케이션 대시보드

도구 서버 페이지에는 Nextcloud 애플리케이션에 대해 MCP를 통해 검색된 도구가 나열됩니다.

Nextcloud 애플리케이션에 대해 검색된 도구를 보여주는 kagent 도구 서버 페이지

도구 페이지에는 상담사가 사용할 수 있는 Nextcloud 도구 모음이 표시됩니다.

Nextcloud에서 사용할 수 있는 kagent 도구 모음입니다.

kagent UI에서 nextcloud 에이전트를 만들려면 기본 정보에 에이전트 이름, 클러스터, 네임스페이스, 설명을 입력합니다.

Nextcloud용 kagent 에이전트 생성

동작 및 모델 설정에서 Gemma 4 모델을 선택하고 에이전트의 시스템 요청 사항을 입력합니다.

기술 및 모델 정렬을 위한 kagent 에이전트 구성

도구 및 에이전트에서 에이전트의 Nextcloud MCP 도구를 선택한 후 에이전트 만들기를 클릭합니다.

Nextcloud 도구 선택을 위한 kagent 에이전트 구성

에이전트 페이지에 nextcloud 에이전트가 Ready 상태로 표시됩니다.

에이전트가 kagent 애플리케이션에 추가되었습니다.

Nextcloud 애플리케이션에서 디렉터리와 파일을 나열하도록 Nextcloud 에이전트에 프롬프트를 표시할 수 있습니다.

디렉터리와 파일을 나열하는 Nextcloud 에이전트

Nextcloud 에이전트에게 파일 콘텐츠를 영어에서 프랑스어로 번역하고 음역하도록 프롬프트를 표시할 수도 있습니다.

파일 콘텐츠를 영어에서 프랑스어로 번역하는 Nextcloud 에이전트