kagent リファレンス実装に独自の MCP サーバーを導入する

はじめに

独自の Model Context Protocol(MCP)サーバーを使用すると、AI エージェントは既存のインフラストラクチャ全体で標準化された接続を使用して、外部リポジトリからデータをリアルタイムでクエリして処理できます。

このソリューション リファレンス実装(SRI)ドキュメントでは、Nextcloud オープンソース アプリケーションとその MCP サーバーを、Solo Enterprise for kagent の Nextcloud エージェントとともにデプロイする方法について説明します。このアーキテクチャは、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 に直接統合して、ドキュメント、スプレッドシート、プレゼンテーションをリアルタイムで共同編集します。
  • 拡張性: アプリストアからプラグインをインストールして、パスワード マネージャー、カンバンボード、音楽プレーヤーなどの機能を追加できます。

ソリューション アーキテクチャ

このソリューションには、kagent 用の Solo Enterprise と Gemma 4 モデルを搭載した vLLM がデプロイされた GDC 環境と、kubectl と helm がインストールされたワークステーションが必要です。

次の図は、GDC、kagent、Nextcloud、vLLM を Gemma 4 に接続するソリューション アーキテクチャを示しています。

ソリューション アーキテクチャ: GDC、kagent、Nextcloud、vLLM と Gemma 4。

導入アプローチ

Nextcloud をデプロイして、その MCP サーバーを kagent と統合するには、次の大まかな手順を完了します。

  1. Nextcloud 専用の Namespace を作成する: kubectl を使用して nextcloud Namespace を作成し、デプロイを分離します。
  2. Helm リポジトリを追加して更新する: 公式の Nextcloud Helm リポジトリを使用してワークステーションを構成し、ローカル チャートのメタデータを更新します。
  3. カスタム デプロイ値を構成する: カスタム values.yaml ファイルを作成して、ターゲット環境用に Nextcloud を構成します。この構成では、デフォルトのローカル SQLite データベースを無効にし、MariaDB 永続ストレージを構成し、管理者認証情報を定義し、ClusterIP サービスを使用して内部ルーティングを設定します。
  4. Helm のインストールを実行する: カスタム構成ファイルを使用して、チャートをターゲットの名前空間にデプロイします。Nextcloud アプリケーションや MariaDB ストレージ Pod などのすべてのコンポーネントが Running ステータスに達していることを確認します。
  5. Nextcloud MCP サーバーをデプロイする: 認証情報の不透明な Secret、nextcloud-mcp-server:latest イメージを使用する Deployment、ポート 8000 を公開する ClusterIP Service を含むデプロイ マニフェスト(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 の Namespace を作成します。

    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 Pod が Running ステータスであり、Service が nextcloud Namespace に存在することを確認します。

    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 MCP サーバーを nextcloud Namespace にデプロイするには、ワークステーションに 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
    

    Pod と Service が nextcloud Namespace で実行されていることを確認します。

    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 Namespace で受け入れられていることを確認します。

    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 アプリケーション ダッシュボード ページ。

[Files] ビューに、Nextcloud に保存されているディレクトリとファイルが表示されます。

Nextcloud アプリケーション内のディレクトリとファイルのインターフェース。

kagent UI の [Dashboard] ページに、接続されたクラスタとデプロイされたエージェントが表示されます。

kagent アプリケーション ダッシュボード。

[ツールサーバー] ページには、Nextcloud アプリケーションの MCP を介して検出されたツールが一覧表示されます。

Nextcloud アプリケーションで検出されたツールが表示されている kagent ツールの [Servers] ページ。

[ツール] ページには、エージェントが使用できる Nextcloud ツールのコレクションが表示されます。

Nextcloud で利用可能な kagent ツール コレクション。

kagent UI で nextcloud エージェントを作成するには、[基本情報] にエージェント名、クラスタ、名前空間、説明を入力します。

Nextcloud の kagent エージェントの作成。

[動作とモデルの設定] で、Gemma 4 モデルを選択し、エージェントのシステム指示を入力します。

スキルとモデルの調整のための kagent エージェント構成。

[ツールとエージェント] で、エージェントの Nextcloud MCP ツールを選択し、[エージェントを作成] をクリックします。

Nextcloud ツール選択用の kagent エージェント構成。

[エージェント] ページに、Ready ステータスの nextcloud エージェントが表示されます。

kagent アプリケーションに追加されたエージェント。

Nextcloud エージェントに、Nextcloud アプリケーションのディレクトリとファイルを一覧表示するように指示できます。

ディレクトリとファイルを一覧表示する Nextcloud エージェント。

Nextcloud エージェントに、ファイルの内容を英語からフランス語に翻訳して文字変換するように指示することもできます。

ファイルの内容を英語からフランス語に翻訳する Nextcloud エージェント。