diff --git a/extensions/Worker.Extensions.CosmosDB/src/Config/ConfigurationExtensions.cs b/extensions/Worker.Extensions.CosmosDB/src/Config/ConfigurationExtensions.cs
new file mode 100644
index 000000000..8dbb396c2
--- /dev/null
+++ b/extensions/Worker.Extensions.CosmosDB/src/Config/ConfigurationExtensions.cs
@@ -0,0 +1,55 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the MIT License. See License.txt in the project root for license information.
+
+using Microsoft.Extensions.Configuration;
+
+namespace Microsoft.Azure.Functions.Worker
+{
+ internal static class ConfigurationExtensions
+ {
+ public static IConfigurationSection GetCosmosConnectionStringSection(this IConfiguration configuration, string connectionStringName)
+ {
+ if (string.IsNullOrWhiteSpace(connectionStringName))
+ {
+ connectionStringName = Constants.ExtensionName; // default
+ }
+
+ // first try prefixing
+ string prefixedConnectionStringName = GetPrefixedConnectionStringName(connectionStringName);
+ IConfigurationSection section = configuration.GetConnectionStringOrSetting(prefixedConnectionStringName);
+
+ if (!section.Exists())
+ {
+ // next try a direct unprefixed lookup
+ section = configuration.GetConnectionStringOrSetting(connectionStringName);
+ }
+
+ return section;
+ }
+
+ public static string GetPrefixedConnectionStringName(string connectionStringName)
+ {
+ return Constants.ConfigurationSectionName + connectionStringName;
+ }
+
+ ///
+ /// Looks for a connection string by first checking the ConfigurationStrings section, and then the root.
+ ///
+ /// The configuration.
+ /// The connection string key.
+ ///
+ public static IConfigurationSection GetConnectionStringOrSetting(this IConfiguration configuration, string connectionName)
+ {
+ if (configuration.GetSection(Constants.ConnectionStringsSectionName).Exists())
+ {
+ IConfigurationSection onConnectionStrings = configuration.GetSection(Constants.ConnectionStringsSectionName).GetSection(connectionName);
+ if (onConnectionStrings.Exists())
+ {
+ return onConnectionStrings;
+ }
+ }
+
+ return configuration.GetSection(connectionName);
+ }
+ }
+}
\ No newline at end of file
diff --git a/extensions/Worker.Extensions.CosmosDB/src/Config/CosmosDBBindingOptions.cs b/extensions/Worker.Extensions.CosmosDB/src/Config/CosmosDBBindingOptions.cs
new file mode 100644
index 000000000..fa2f86caf
--- /dev/null
+++ b/extensions/Worker.Extensions.CosmosDB/src/Config/CosmosDBBindingOptions.cs
@@ -0,0 +1,29 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the MIT License. See License.txt in the project root for license information.
+
+using Azure.Core;
+using Microsoft.Azure.Cosmos;
+
+namespace Microsoft.Azure.Functions.Worker
+{
+ internal class CosmosDBBindingOptions
+ {
+ public string? ConnectionString { get; set; }
+
+ public string? AccountEndpoint { get; set; }
+
+ public TokenCredential? Credential { get; set; }
+
+ public CosmosClient CreateClient(CosmosClientOptions cosmosClientOptions)
+ {
+ if (string.IsNullOrEmpty(ConnectionString))
+ {
+ // AAD auth
+ return new CosmosClient(AccountEndpoint, Credential, cosmosClientOptions);
+ }
+
+ // Connection string based auth
+ return new CosmosClient(ConnectionString, cosmosClientOptions);
+ }
+ }
+}
\ No newline at end of file
diff --git a/extensions/Worker.Extensions.CosmosDB/src/Config/CosmosDBBindingOptionsSetup.cs b/extensions/Worker.Extensions.CosmosDB/src/Config/CosmosDBBindingOptionsSetup.cs
new file mode 100644
index 000000000..f3133620d
--- /dev/null
+++ b/extensions/Worker.Extensions.CosmosDB/src/Config/CosmosDBBindingOptionsSetup.cs
@@ -0,0 +1,56 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the MIT License. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.Extensions.Azure;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.Azure.Functions.Worker
+{
+ internal class CosmosDBBindingOptionsSetup : IConfigureNamedOptions
+ {
+ private readonly IConfiguration _configuration;
+ private readonly AzureComponentFactory _componentFactory;
+
+ public CosmosDBBindingOptionsSetup(IConfiguration configuration, AzureComponentFactory componentFactory)
+ {
+ _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
+ _componentFactory = componentFactory ?? throw new ArgumentNullException(nameof(componentFactory));
+ }
+
+ public void Configure(CosmosDBBindingOptions options)
+ {
+ Configure(Options.DefaultName, options);
+ }
+
+ public void Configure(string name, CosmosDBBindingOptions options)
+ {
+ IConfigurationSection connectionSection = _configuration.GetCosmosConnectionStringSection(name);
+
+ if (!connectionSection.Exists())
+ {
+ // Not found
+ throw new InvalidOperationException($"Cosmos DB connection configuration '{name}' does not exist. " +
+ "Make sure that it is a defined App Setting.");
+ }
+
+ if (!string.IsNullOrWhiteSpace(connectionSection.Value))
+ {
+ options.ConnectionString = connectionSection.Value;
+ }
+ else
+ {
+ options.AccountEndpoint = connectionSection[Constants.AccountEndpoint];
+ if (string.IsNullOrWhiteSpace(options.AccountEndpoint))
+ {
+ // Not found
+ throw new InvalidOperationException($"Connection should have an '{Constants.AccountEndpoint}' property or be a " +
+ $"string representing a connection string.");
+ }
+
+ options.Credential = _componentFactory.CreateTokenCredential(connectionSection);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/extensions/Worker.Extensions.CosmosDB/src/Constants.cs b/extensions/Worker.Extensions.CosmosDB/src/Constants.cs
new file mode 100644
index 000000000..f5e59ea3d
--- /dev/null
+++ b/extensions/Worker.Extensions.CosmosDB/src/Constants.cs
@@ -0,0 +1,14 @@
+
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the MIT License. See License.txt in the project root for license information.
+
+namespace Microsoft.Azure.Functions.Worker
+{
+ internal static class Constants
+ {
+ internal const string ExtensionName = "CosmosDB";
+ internal const string ConfigurationSectionName = "AzureWebJobs";
+ internal const string ConnectionStringsSectionName = "ConnectionStrings";
+ internal const string AccountEndpoint = "accountEndpoint";
+ }
+}
\ No newline at end of file
diff --git a/extensions/Worker.Extensions.CosmosDB/src/CosmosDBConverter.cs b/extensions/Worker.Extensions.CosmosDB/src/CosmosDBConverter.cs
new file mode 100644
index 000000000..b1313136d
--- /dev/null
+++ b/extensions/Worker.Extensions.CosmosDB/src/CosmosDBConverter.cs
@@ -0,0 +1,210 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the MIT License. See License.txt in the project root for license information.
+
+using System;
+using System.Threading.Tasks;
+using Microsoft.Azure.Functions.Worker.Core;
+using Microsoft.Azure.Functions.Worker.Converters;
+using System.Collections.Generic;
+using Microsoft.Azure.Cosmos;
+using System.Linq;
+using System.Reflection;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.Azure.Functions.Worker
+{
+ ///
+ /// Converter to bind Cosmos DB type parameters.
+ ///
+ internal class CosmosDBConverter : IInputConverter
+ {
+ private readonly IOptionsSnapshot _cosmosOptions;
+
+ public CosmosDBConverter(IOptionsSnapshot cosmosOptions)
+ {
+ _cosmosOptions = cosmosOptions ?? throw new ArgumentNullException(nameof(cosmosOptions));
+ }
+
+ public async ValueTask ConvertAsync(ConverterContext context)
+ {
+ if (context.Source is ModelBindingData modelBindingData)
+ {
+ if (modelBindingData.Source is not Constants.ExtensionName)
+ {
+ return ConversionResult.Unhandled();
+ }
+
+ try
+ {
+ var cosmosAttribute = modelBindingData.Content.ToObjectFromJson();
+ object result = await ToTargetType(context.TargetType, cosmosAttribute);
+
+ if (result is not null)
+ {
+ return ConversionResult.Success(result);
+ }
+ }
+ catch (Exception ex)
+ {
+ // What do we want to do for error handling?
+ Console.WriteLine(ex);
+
+ if (ex is CosmosException docEx)
+ {
+ throw;
+ }
+ }
+ }
+
+ if (context.Source is CollectionModelBindingData collectionModelBindingData)
+ {
+ if (collectionModelBindingData.ModelBindingDataArray.Any(x => x.Source is Constants.ExtensionName))
+ {
+ try
+ {
+ var collectionResult = await ToTargetTypeCollection(context, context.TargetType, collectionModelBindingData);
+
+ if (collectionResult is not null && collectionResult is { Count: > 0 })
+ {
+ return ConversionResult.Success(collectionResult);
+ }
+ }
+ catch (Exception ex)
+ {
+ // TODO: DeserializeObject could throw
+ Console.WriteLine(ex);
+ }
+ }
+ }
+
+ return ConversionResult.Unhandled();
+ }
+
+ private async Task