diff --git a/README.MD b/README.MD
index 96dc9ce..d5c3d17 100644
--- a/README.MD
+++ b/README.MD
@@ -12,6 +12,13 @@ For more information about MCP:
- [Protocol Specification](https://spec.modelcontextprotocol.io/)
- [GitHub Organization](https://github.com/modelcontextprotocol)
+## Available Packages
+
+| Package | Description | Documentation |
+|---------|-------------|---------------|
+| [mcpdotnet](src/mcpdotnet) | Core MCP implementation for .NET | [README](README.md) |
+| [McpDotNet.Extensions.AI](src/McpDotNet.Extensions.AI) | Integration with Microsoft.Extensions.AI | [README](src/McpDotNet.Extensions.AI/README.md) |
+
## Design Goals
This library aims to provide a clean, specification-compliant implementation of the MCP protocol, with minimal additional abstraction. While transport implementations necessarily include additional code, they follow patterns established by the official SDKs where possible.
diff --git a/mcpdotnet.sln b/mcpdotnet.sln
index dd6c82d..375a103 100644
--- a/mcpdotnet.sln
+++ b/mcpdotnet.sln
@@ -13,6 +13,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AnthropicToolsConsole", "sa
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mcpdotnet.TestServer", "tests\mcpdotnet.TestServer\mcpdotnet.TestServer.csproj", "{7C229573-A085-4ECC-8131-958CDA2BE731}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "McpDotNet.Extensions.AI", "src\McpDotNet.Extensions.AI\McpDotNet.Extensions.AI.csproj", "{B3E019B8-3459-4D52-864E-703DDA2C02AD}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "McpDotNet.Extensions.AI.Tests", "tests\McpDotNet.Extensions.AI.Tests\McpDotNet.Extensions.AI.Tests.csproj", "{67BEF596-AD39-4BDD-B505-31DE7FF0C8D2}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -39,6 +43,14 @@ Global
{7C229573-A085-4ECC-8131-958CDA2BE731}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7C229573-A085-4ECC-8131-958CDA2BE731}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7C229573-A085-4ECC-8131-958CDA2BE731}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B3E019B8-3459-4D52-864E-703DDA2C02AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B3E019B8-3459-4D52-864E-703DDA2C02AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B3E019B8-3459-4D52-864E-703DDA2C02AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B3E019B8-3459-4D52-864E-703DDA2C02AD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {67BEF596-AD39-4BDD-B505-31DE7FF0C8D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {67BEF596-AD39-4BDD-B505-31DE7FF0C8D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {67BEF596-AD39-4BDD-B505-31DE7FF0C8D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {67BEF596-AD39-4BDD-B505-31DE7FF0C8D2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/samples/microsoft.extensions.ai/tools/ToolsConsole/McpAIFunction.cs b/samples/microsoft.extensions.ai/tools/ToolsConsole/McpAIFunction.cs
index de65d3c..4e3e812 100644
--- a/samples/microsoft.extensions.ai/tools/ToolsConsole/McpAIFunction.cs
+++ b/samples/microsoft.extensions.ai/tools/ToolsConsole/McpAIFunction.cs
@@ -1,7 +1,6 @@
using McpDotNet.Client;
using McpDotNet.Protocol.Types;
using Microsoft.Extensions.AI;
-using SimpleToolsConsole;
namespace SimpleToolsConsole;
diff --git a/src/McpDotNet.Extensions.AI/AIFunctionUtilities.cs b/src/McpDotNet.Extensions.AI/AIFunctionUtilities.cs
new file mode 100644
index 0000000..da00892
--- /dev/null
+++ b/src/McpDotNet.Extensions.AI/AIFunctionUtilities.cs
@@ -0,0 +1,26 @@
+using McpDotNet.Protocol.Types;
+using System.Text.Json;
+
+namespace McpDotNet.Extensions.AI;
+
+internal static class AIFunctionUtilities
+{
+ ///
+ /// Maps a Tool to a JsonElement that represents the tool's schema (top-level and input schema/parameters).
+ ///
+ public static JsonElement MapToJsonElement(Tool tool)
+ {
+ // Create a JsonObject that matches the MEAI schema format
+ var schemaObj = new Dictionary
+ {
+ ["type"] = "object",
+ ["title"] = tool.Name,
+ ["description"] = tool.Description ?? string.Empty,
+ ["properties"] = tool.InputSchema?.Properties ?? new(),
+ ["required"] = tool.InputSchema?.Required ?? []
+ };
+
+ // Convert to JsonElement
+ return JsonSerializer.SerializeToElement(schemaObj);
+ }
+}
diff --git a/src/McpDotNet.Extensions.AI/McpAIFunction.cs b/src/McpDotNet.Extensions.AI/McpAIFunction.cs
new file mode 100644
index 0000000..6c8f7b1
--- /dev/null
+++ b/src/McpDotNet.Extensions.AI/McpAIFunction.cs
@@ -0,0 +1,57 @@
+using McpDotNet.Client;
+using McpDotNet.Protocol.Types;
+using Microsoft.Extensions.AI;
+using System.Text.Json;
+
+namespace McpDotNet.Extensions.AI;
+
+///
+/// Represents an AI function that calls a tool through mcpdotnet.
+///
+public class McpAIFunction : AIFunction
+{
+ private readonly Tool _tool;
+ private readonly IMcpClient _client;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public McpAIFunction(Tool tool, IMcpClient client)
+ {
+ _tool = tool ?? throw new ArgumentNullException(nameof(tool));
+ _client = client ?? throw new ArgumentNullException(nameof(client));
+ }
+
+ ///
+ public override string ToString() => _tool.Name;
+
+ ///
+ public override JsonElement JsonSchema => AIFunctionUtilities.MapToJsonElement(_tool);
+
+ ///
+ protected async override Task