diff --git a/.cicd/test.sh b/.cicd/test.sh index 2c51a14..42a593a 100755 --- a/.cicd/test.sh +++ b/.cicd/test.sh @@ -228,6 +228,20 @@ function check_creates_template() { check_string_existence "--set grpcService.enabled=true" "containerPort: 50051" check_string_existence "--set grpcService.enabled=true --set grpcService.name=weaviate-grpc-service-custom-name" "name: weaviate-grpc-service-custom-name" check_string_existence "--set grpcService.name=weaviate-grpc-defult-service-custom-name" "name: weaviate-grpc-defult-service-custom-name" + check_string_existence "--set mcp.enabled=true" "name: MCP_SERVER_ENABLED" + check_setting_has_value "--set mcp.enabled=true" "name: MCP_SERVER_ENABLED" "value: \"true\"" + check_setting_has_value "--set mcp.enabled=true" "name: MCP_SERVER_WRITE_ACCESS_ENABLED" "value: \"false\"" + check_setting_has_value "--set mcp.enabled=true --set mcp.writeAccessEnabled=true" "name: MCP_SERVER_WRITE_ACCESS_ENABLED" "value: \"true\"" + # MCP config tests + check_setting_has_value "--set mcp.enabled=true --set mcp.config.tools.test-tool.description=test-description" "name: MCP_SERVER_CONFIG_PATH" "value: \"/mcp-config/mcp-config.yaml\"" + check_string_existence "--set mcp.enabled=true --set mcp.config.tools.test-tool.description=test-description" "name: weaviate-mcp-config" + check_string_existence "--set mcp.enabled=true --set mcp.config.tools.test-tool.description=test-description" "mcp-config.yaml" + check_string_existence "--set mcp.enabled=true --set mcp.config.tools.test-tool.description=test-description" "test-description" + check_no_setting "--set mcp.enabled=true" "name: MCP_SERVER_CONFIG_PATH" + check_no_setting "--set mcp.enabled=true" "weaviate-mcp-config" + check_no_setting "" "name: MCP_SERVER_ENABLED" + check_no_setting "--set mcp.enabled=false" "name: MCP_SERVER_ENABLED" + check_modules "--set mcp.enabled=true --set modules.text2vec-contextionary.enabled=false --set modules.text2vec-transformers.enabled=true" "value: text2vec-transformers" check_string_existence "--set modules.text2vec-aws.enabled=true --set modules.text2vec-aws.secrets.AWS_ACCESS_KEY_ID=key --set modules.text2vec-aws.secrets.AWS_SECRET_ACCESS_KEY=secret" "name: AWS_ACCESS_KEY_ID" check_string_existence "--set modules.text2vec-aws.enabled=true --set modules.text2vec-aws.secrets.AWS_ACCESS_KEY_ID=key --set modules.text2vec-aws.secrets.AWS_SECRET_ACCESS_KEY=secret" "name: AWS_SECRET_ACCESS_KEY" check_string_existence "--set modules.multi2vec-aws.enabled=true --set modules.multi2vec-aws.secrets.AWS_ACCESS_KEY_ID=key --set modules.multi2vec-aws.secrets.AWS_SECRET_ACCESS_KEY=secret" "name: AWS_ACCESS_KEY_ID" diff --git a/weaviate/templates/weaviateMCPConfig.yaml b/weaviate/templates/weaviateMCPConfig.yaml new file mode 100644 index 0000000..e45578e --- /dev/null +++ b/weaviate/templates/weaviateMCPConfig.yaml @@ -0,0 +1,12 @@ +{{- if and .Values.mcp.enabled .Values.mcp.config }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: weaviate-mcp-config + labels: + app.kubernetes.io/name: weaviate + app.kubernetes.io/managed-by: {{ .Release.Service }} +data: + mcp-config.yaml: |- + {{ .Values.mcp.config | toYaml | nindent 4 }} +{{- end }} diff --git a/weaviate/templates/weaviateStatefulset.yaml b/weaviate/templates/weaviateStatefulset.yaml index 7226296..c1c7fbb 100644 --- a/weaviate/templates/weaviateStatefulset.yaml +++ b/weaviate/templates/weaviateStatefulset.yaml @@ -485,6 +485,16 @@ spec: {{- end }} {{- end }} {{- end }} + {{- if .Values.mcp.enabled }} + - name: MCP_SERVER_ENABLED + value: "true" + - name: MCP_SERVER_WRITE_ACCESS_ENABLED + value: {{ .Values.mcp.writeAccessEnabled | default false | quote }} + {{- if .Values.mcp.config }} + - name: MCP_SERVER_CONFIG_PATH + value: "/mcp-config/mcp-config.yaml" + {{- end }} + {{- end }} - name: CLUSTER_JOIN value: {{ .Values.service.name }}-headless.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }} ports: @@ -508,6 +518,10 @@ spec: - name: weaviate-runtime-overrides mountPath: /config {{- end }} + {{- if and .Values.mcp.enabled .Values.mcp.config }} + - name: weaviate-mcp-config + mountPath: /mcp-config + {{- end }} {{- if index .Values "backups" "gcs" "enabled" }} {{- if or (index .Values "backups" "gcs" "secrets") (index .Values "backups" "gcs" "envSecrets") }} {{- if or (index .Values "backups" "gcs" "secrets" "GOOGLE_APPLICATION_CREDENTIALS") (index .Values "backups" "gcs" "envSecrets" "GOOGLE_APPLICATION_CREDENTIALS") }} @@ -560,6 +574,11 @@ spec: configMap: name: weaviate-runtime-overrides {{- end }} + {{- if and .Values.mcp.enabled .Values.mcp.config }} + - name: weaviate-mcp-config + configMap: + name: weaviate-mcp-config + {{- end }} - name: weaviate-config configMap: {{ if .Values.custom_config_map.enabled }}name: {{ .Values.custom_config_map.name }} {{ else }}name: weaviate-config{{ end }} diff --git a/weaviate/values.yaml b/weaviate/values.yaml index 778e19a..ccc3768 100644 --- a/weaviate/values.yaml +++ b/weaviate/values.yaml @@ -160,6 +160,29 @@ grpcService: clusterIP: annotations: {} +# MCP (Model Context Protocol) allows LLM clients to interact with Weaviate. +# MCP is served on the main REST port at /v1/mcp, no separate port is needed. +# This is by default disabled. Set enabled to true to enable the MCP server. +mcp: + enabled: false + # Write access allows MCP clients to create/update objects. + # Disabled by default for safety. + writeAccessEnabled: false + # Custom MCP server configuration for tool descriptions. + # When set, a ConfigMap is created and mounted automatically. + # Example: + # config: + # tools: + # weaviate-collections-get-config: + # description: "Retrieves the schema configuration for one or all collections in the Weaviate database." + # weaviate-tenants-list: + # description: "Lists all tenants for a specific multi-tenant collection." + # weaviate-query-hybrid: + # description: "Performs a hybrid search combining vector similarity and keyword matching (BM25) on a collection." + # weaviate-objects-upsert: + # description: "Upserts (inserts or updates) one or more objects into a collection in batch." + config: + # The service monitor defines prometheus monitoring for a set of services # https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#monitoring.coreos.com/v1.ServiceMonitor # Make sure to set the following prometheus values if deploying observability with the kube-prometheus-stack helm chart: