+
+## General API changes
+
+API string references to resources in other namespaces in the format `namespace/name` now fail. Instead, the APIs have a separate field for you to specify the namespace of the resource.
+
+## Tools APIs
+
+The Tools-related APIs are split up into several different APIs. Some functionality is moved to kmcp, such as the ToolServer API.
+
+### ToolServer
+
+The ToolServer API is completely removed from kagent. Instead, use other resources including some [kmcp APIs](https://kagent.dev/docs/kmcp) to create and manage tools.
+
+#### Stdio ToolServer now in kmcp MCPServer
+
+Flip through the following tabs to understand the API differences between the old kagent ToolServer and the new method of using kmcp along with a kagent MCPServer and Kubernetes Service for the Stdio transport type.
+
+
+
+
+ Old ToolServer example:
+ * The `stdio` config section includes the Grafana deployment details.
+ * The Grafana details, including the API key, are loaded as environment settings directly in the ToolServer.
+ ```yaml
+ apiVersion: kagent.dev/v1alpha1
+ kind: ToolServer
+ metadata:
+ name: mcp-grafana
+ namespace: kagent
+ spec:
+ config:
+ stdio:
+ command: /app/python/bin/mcp-grafana
+ args:
+ - -t
+ - stdio
+ - debug
+ readTimeoutSeconds: 30
+ envFrom:
+ - name: "GRAFANA_URL"
+ value: my-url.com
+ - name: "GRAFANA_API_KEY"
+ valueFrom:
+ type: Secret
+ key: "grafana"
+ valueRef: kagent-toolserver-secret
+ description: ""
+ ```
+
+
+
+ kmcp example:
+ * The kagent MCPServer includes the Grafana deployment details, with `stdio` as the transport type.
+ * The Grafana API key is loaded separately in a Secret, which is more secure.
+ ```yaml
+ apiVersion: v1
+ kind: Secret
+ metadata:
+ name: grafana-api-key
+ type: Opaque
+ data:
+ GRAFANA_API_KEY: my-base-64-ikey
+ ---
+ apiVersion: kagent.dev/v1alpha1
+ kind: MCPServer
+ metadata:
+ name: grafana
+ spec:
+ deployment:
+ image: "mcp/grafana:latest"
+ port: 3000
+ cmd: "/app/mcp-grafana"
+ args:
+ - "--transport"
+ - "stdio"
+ env:
+ GRAFANA_URL: my-url.com
+ secretRefs:
+ - name: grafana-api-key
+ transportType: "stdio"
+ ```
+
+
+#### HTTP ToolServer moved to RemoteMCPServer
+
+ToolServer resources that used `type: streamableHttp` are now configured as RemoteMCPServer resources. For more detailed information, review the API definitions:
+* ToolServer: [toolserver_types.go](https://github.com/kagent-dev/kagent/blob/main/go/controller/api/v1alpha1/toolserver_types.go)
+* RemoteMCPServer: [remotemcpserver_types.go](https://github.com/kagent-dev/kagent/blob/main/go/controller/api/v1alpha2/remotemcpserver_types.go)
+* MCPServer: [mcpserver_types.go](https://github.com/kagent-dev/kmcp/blob/main/api/v1alpha1/mcpserver_types.go)
+
+
+
+
+
+### Kubernetes Services as HTTP MCP servers
+
+Now, you can use Kubernetes Services as MCP Servers.
+
+
+
+
+In the old configuration, you created a Service for your MCP Deployment, and then a ToolServer resource that referred to the Service.
+```yaml
+apiVersion: v1
+kind: Service
+metadata:
+ name: kagent-querydoc
+ namespace: kagent
+spec:
+ ports:
+ - name: http
+ port: 8080
+ protocol: TCP
+ targetPort: http
+---
+apiVersion: kagent.dev/v1alpha1
+kind: ToolServer
+metadata:
+ name: kagent-querydoc
+ namespace: kagent
+spec:
+ description: Queries a documentation site
+ config:
+ sse:
+ url: http://kagent-querydoc.kagent.svc.cluster.local/sse
+```
+
+
+
+In v0.6, you add certain fields to designate the Service as an MCP server.
+
+In the following configuration file, notice the following settings:
+* `kagent.dev/mcp-service: "true"`: Optional: Configure kagent to discover the tools for this Service.
+* `appProtocol: mcp`: Required: Configure the port that the controller uses. If not set, and there is a single port, the controller uses that port for the MCP server.
+
+**Additional annotations**: You can use the following annotations to further configure the your MCP Service.
+
+* `kagent.dev:mcp-service-path`: Set the path on which the MCP server lives. The default value is `/mcp`.
+* `kagent.dev/mcp-service-port`: Set the port number to be used. No port is set by default.
+* `kagent.dev/mcp-service-port`: Set the protocol to use. Accepted values are `SSE` or `STREAMABLE_HTTP`. The default value is `STREAMABLE_HTTP`.
+
+```yaml
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ kagent.dev/mcp-service: "true"
+ annotations:
+ kagent.dev:mcp-service-path: /sse
+ kagent.dev/mcp-service-port: 8080
+ kagent.dev/mcp-service-protocol: SSE
+ name: kagent-querydoc
+ namespace: kagent
+spec:
+ ports:
+ - appProtocol: mcp
+ name: http
+ port: 8080
+ protocol: TCP
+ targetPort: http
+```
+
+
+
+## Agent APIs
+
+### API to specify the MCP server
+
+
+
+
+ **New API Example:**
+ ```yaml
+ tools:
+ - type: McpServer
+ mcpServer:
+ name: kagent-querydoc
+ kind: Service
+ toolNames:
+ - query_documentation
+ ```
+
+ **Key Changes:**
+ * The `toolServer` field has been removed
+ * Replaced with: `name`, `kind`, and `apiGroup` fields
+ * This allows specifying 3 different types: `RemoteMCPServer`, `Service`, and `MCPServer`
+
+
+
+The toolServer field has been removed, and has been replaced with the following:
+name
+kind
+apiGroup
+This allows for specifying the 3 different types which may be used. Those are:
+RemoteMCPServer
+Service
+MCPServer
+Here are the 2 api defs:
+* [v1alpha1](https://github.com/kagent-dev/kagent/blob/069582fbd748cb66df31d620ceb2a7beae85caf0/go/controller/api/v1alpha1/agent_types.go#L106)
+* [v1alpha2](https://github.com/kagent-dev/kagent/blob/069582fbd748cb66df31d620ceb2a7beae85caf0/go/controller/api/v1alpha2/agent_types.go#L93)
+
+### Top-level field for Agent APIs
+
+A new top-level `type` field is added to the Agents API. For existing Agents, set the `type` to `Inline`, and then nest the previous Agent configuration under the `inline` setting.
+
+This change supports the new type for BYO agents.
+
+
+
+
+[v1alpha1 Example](https://github.com/kagent-dev/kagent/blob/main/helm/agents/k8s/templates/agent.yaml):
+
+ ```yaml
+ apiVersion: kagent.dev/v1alpha2
+ kind: Agent
+ metadata:
+ name: k8s-agent
+ namespace: {{ include "kagent.namespace" . }}
+ labels:
+ {{- include "kagent.labels" . | nindent 4 }}
+ spec:
+ description: An Kubernetes Expert AI Agent specializing in cluster operations, troubleshooting, and maintenance.
+ systemMessage: |
+ # Kubernetes AI Agent System Prompt
+
+ You are KubeAssist, an advanced AI agent
+ # ... (truncated for brevity)
+ ```
+
+
+
+[v1alpha2 Example](https://github.com/kagent-dev/kagent/blob/eitanya/byo/helm/agents/k8s/templates/agent.yaml): Note that the entire agent configuration is now nested under the `inline` setting.
+
+ ```yaml
+ apiVersion: kagent.dev/v1alpha2
+ kind: Agent
+ metadata:
+ name: k8s-agent
+ namespace: kagent
+ spec:
+ description: An Kubernetes Expert AI Agent specializing in cluster operations, troubleshooting, and maintenance.
+ type: Inline
+ inline:
+ systemMessage: |
+ # Kubernetes AI Agent System Prompt
+
+ You are KubeAssist, an advanced AI agent
+ # ... (truncated for brevity)
+ ```
+
+ **Key Changes:**
+ * Added `type: Inline` field to specify agent type
+ * Agent configuration now under `inline` section
+ * Supports new BYO deployment model
+
+
+### New! BYO agents
+
+A new agent type has been added to the Agents API so that you can bring your own (BYO) agent. The agent must be written in ADK, with other frameworks under development.
+
+BYO Agent example configuration:
+
+```yaml
+apiVersion: kagent.dev/v1alpha2
+kind: Agent
+metadata:
+ name: basic-agent
+spec:
+ description: This agent can do anything.
+ type: BYO
+ byo:
+ deployment:
+ image: my-byo:latest
+ env:
+ - name: GOOGLE_API_KEY
+ valueFrom:
+ secretKeyRef:
+ name: kagent-google
+ key: GOOGLE_API_KEY
+```
+
+## ModelConfig API
+
+The secret name field is renamed from `apiKeySecretRef` to `apiKeySecret`.
diff --git a/src/components/mdx/tabs.tsx b/src/components/mdx/tabs.tsx
new file mode 100644
index 00000000..c088c46f
--- /dev/null
+++ b/src/components/mdx/tabs.tsx
@@ -0,0 +1,80 @@
+'use client'
+import React, { useState, useEffect } from 'react';
+
+
+
+interface Tab {
+ id: string;
+ label: string;
+}
+
+interface TabsProps {
+ tabs: Tab[];
+ defaultTab?: string;
+ className?: string;
+}
+
+export const Tabs: React.FC = ({ tabs, defaultTab, className = '' }) => {
+ const [activeTab, setActiveTab] = useState('');
+ const [tabContents, setTabContents] = useState>({});
+
+ // Find and get the content elements after component mounts
+ useEffect(() => {
+ if (tabs.length === 0) return;
+
+ const initialTab = defaultTab || tabs[0]?.id || '';
+ setActiveTab(initialTab);
+
+ const contents: Record = {};
+
+ tabs.forEach(tab => {
+ const element = document.getElementById(`${tab.id}-tab`);
+ contents[tab.id] = element;
+
+ // Hide all tab content divs at the start
+ if (element) {
+ element.style.display = tab.id === initialTab ? 'block' : 'none';
+ }
+ });
+
+ setTabContents(contents);
+ }, [tabs, defaultTab]);
+
+ // Handle tab switching
+ const handleTabChange = (tabId: string) => {
+ setActiveTab(tabId);
+
+ // Update display for each content div
+ tabs.forEach(tab => {
+ const content = tabContents[tab.id];
+ if (content) {
+ content.style.display = tab.id === tabId ? 'block' : 'none';
+ }
+ });
+ };
+
+ if (tabs.length === 0) return null;
+
+ return (
+
+ {/* Tab Navigation */}
+
+ {tabs.map((tab) => (
+
+ ))}
+
+
+ );
+};
+
+
diff --git a/src/config/navigation.json b/src/config/navigation.json
index 819e3b21..0a156c76 100644
--- a/src/config/navigation.json
+++ b/src/config/navigation.json
@@ -169,6 +169,11 @@
"title": "FAQs",
"href": "/docs/kagent/resources/faq",
"description": "Find answers to frequently asked questions about kagent."
+ },
+ {
+ "title": "Release Notes",
+ "href": "/docs/kagent/resources/release-notes",
+ "description": "Review the release notes for kagent."
}
]
}
diff --git a/src/mdx-components.tsx b/src/mdx-components.tsx
index 3af1e716..5a4b0f3a 100644
--- a/src/mdx-components.tsx
+++ b/src/mdx-components.tsx
@@ -1,6 +1,7 @@
import type { MDXComponents } from "mdx/types";
import { useMemo } from "react";
import { PlatformTabs } from "./components/mdx/platform-tabs";
+import { Tabs } from "./components/mdx/tabs";
import SmartLink from "./components/mdx/smart-link";
import { CodeBlock } from "./components/mdx/code-block";
import Image from "next/image";
@@ -111,6 +112,7 @@ export function useMDXComponents(components: MDXComponents): MDXComponents {
// Pre (for code blocks)
pre: ({ children }) => <>{children}>,
PlatformTabs,
+ Tabs,
YouTube,
...components,
}),