You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by fm...@apache.org on 2026/02/27 16:43:33 UTC

(camel) branch main updated: CAMEL-23093: Add OAuth SPI for multi-IdP Client Credentials support

This is an automated email from the ASF dual-hosted git repository.

fmariani pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 423b0e9977fe CAMEL-23093: Add OAuth SPI for multi-IdP Client Credentials support
423b0e9977fe is described below

commit 423b0e9977fef0db50cfa6571217e6f91f3562b9
Author: Federico Mariani <34...@users.noreply.github.com>
AuthorDate: Fri Feb 27 17:43:28 2026 +0100

    CAMEL-23093: Add OAuth SPI for multi-IdP Client Credentials support
---
 .../apache/camel/catalog/components/docling.json   |   6 +-
 .../camel/catalog/components/huggingface.json      |   6 +-
 .../camel/catalog/components/ibm-watsonx-ai.json   |   6 +-
 .../catalog/components/langchain4j-agent.json      |   4 +-
 .../apache/camel/catalog/components/openai.json    |   5 +-
 .../docling/DoclingComponentConfigurer.java        |   6 ++
 .../docling/DoclingConfigurationConfigurer.java    |   6 ++
 .../docling/DoclingEndpointConfigurer.java         |   6 ++
 .../docling/DoclingEndpointUriFactory.java         |   3 +-
 .../apache/camel/component/docling/docling.json    |   6 +-
 .../src/main/docs/docling-component.adoc           |  22 +++++
 .../component/docling/DoclingConfiguration.java    |  14 +++
 .../camel/component/docling/DoclingProducer.java   |  14 +++
 .../HuggingFaceComponentConfigurer.java            |   6 ++
 .../huggingface/HuggingFaceEndpointConfigurer.java |   6 ++
 .../huggingface/HuggingFaceEndpointUriFactory.java |   3 +-
 .../camel/component/huggingface/huggingface.json   |   6 +-
 .../src/main/docs/huggingface-component.adoc       |  17 ++++
 .../huggingface/HuggingFaceConfiguration.java      |  14 +++
 .../component/huggingface/HuggingFaceProducer.java |  11 +++
 .../langchain4j/agent/langchain4j-agent.json       |   4 +-
 .../src/main/docs/langchain4j-agent-component.adoc |  64 ++++++++++++
 .../agent/LangChain4jAgentConfiguration.java       |   7 +-
 .../agent/LangChain4jAgentProducer.java            |   5 +-
 .../agent/LangChain4jMcpServerDefinition.java      |  57 ++++++++---
 .../component/openai/OpenAIEndpointConfigurer.java |   6 ++
 .../component/openai/OpenAIEndpointUriFactory.java |   3 +-
 .../org/apache/camel/component/openai/openai.json  |   5 +-
 .../src/main/docs/openai-component.adoc            |  30 ++++++
 .../component/openai/OpenAIConfiguration.java      |  19 +++-
 .../camel/component/openai/OpenAIEndpoint.java     |  40 ++++++--
 .../watsonx/ai/WatsonxAiComponentConfigurer.java   |   6 ++
 .../watsonx/ai/WatsonxAiEndpointConfigurer.java    |   6 ++
 .../watsonx/ai/WatsonxAiEndpointUriFactory.java    |   3 +-
 .../component/ibm/watsonx/ai/ibm-watsonx-ai.json   |   6 +-
 .../src/main/docs/ibm-watsonx-ai-component.adoc    |  17 ++++
 .../ibm/watsonx/ai/WatsonxAiConfiguration.java     |  14 +++
 .../ibm/watsonx/ai/WatsonxAiEndpoint.java          |  10 ++
 .../camel/oauth-client-authentication-factory      |   2 +
 components/camel-oauth/src/main/docs/oauth.adoc    | 100 ++++++++++++++++++-
 .../DefaultOAuthClientAuthenticationFactory.java   |  99 +++++++++++++++++++
 .../oauth/OAuthClientCredentialsTokenResolver.java |  79 +++++++++++++++
 .../org/apache/camel/oauth/OAuthTokenRequest.java  | 109 +++++++++++++++++++++
 .../java/org/apache/camel/oauth/UserProfile.java   |  16 +++
 .../apache/camel/oauth/jakarta/ServletOAuth.java   |  36 +++----
 .../spi/OAuthClientAuthenticationFactory.java      |  77 +++++++++++++++
 .../org/apache/camel/spi/OAuthClientConfig.java    |  97 ++++++++++++++++++
 .../java/org/apache/camel/support/OAuthHelper.java |  53 ++++++++++
 .../dsl/DoclingComponentBuilderFactory.java        |  19 ++++
 .../dsl/HuggingfaceComponentBuilderFactory.java    |  19 ++++
 .../dsl/IbmWatsonxAiComponentBuilderFactory.java   |  19 ++++
 .../Langchain4jAgentComponentBuilderFactory.java   |  10 +-
 .../dsl/DoclingEndpointBuilderFactory.java         |  17 ++++
 .../dsl/HuggingFaceEndpointBuilderFactory.java     |  17 ++++
 .../LangChain4jAgentEndpointBuilderFactory.java    |  20 ++--
 .../endpoint/dsl/OpenAIEndpointBuilderFactory.java |  29 +++++-
 .../dsl/WatsonxAiEndpointBuilderFactory.java       |  17 ++++
 .../camel-main-known-dependencies.properties       |   1 +
 58 files changed, 1216 insertions(+), 89 deletions(-)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/docling.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/docling.json
index 1366dbfdaf55..362c01fdb5d0 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/docling.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/docling.json
@@ -74,7 +74,8 @@
     "apiKeyHeader": { "index": 47, "kind": "property", "displayName": "Api Key Header", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "X-API-Key", "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "Header name for API key authentication" },
     "authenticationScheme": { "index": 48, "kind": "property", "displayName": "Authentication Scheme", "group": "security", "label": "security", "required": false, "type": "enum", "javaType": "org.apache.camel.component.docling.AuthenticationScheme", "enum": [ "NONE", "BEARER", "API_KEY" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "NONE", "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configuration [...]
     "authenticationToken": { "index": 49, "kind": "property", "displayName": "Authentication Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "Authentication token for docling-serve API (Bearer token or API  [...]
-    "maxFileSize": { "index": 50, "kind": "property", "displayName": "Max File Size", "group": "security", "label": "security", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 52428800, "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "Maximum file size in bytes for processing" }
+    "maxFileSize": { "index": 50, "kind": "property", "displayName": "Max File Size", "group": "security", "label": "security", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 52428800, "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "Maximum file size in bytes for processing" },
+    "oauthProfile": { "index": 51, "kind": "property", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 Client Cre [...]
   },
   "headers": {
     "CamelDoclingOperation": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "DoclingOperations", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform", "constantName": "org.apache.camel.component.docling.DoclingHeaders#OPERATION" },
@@ -159,6 +160,7 @@
     "apiKeyHeader": { "index": 46, "kind": "parameter", "displayName": "Api Key Header", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "X-API-Key", "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "Header name for API key authentication" },
     "authenticationScheme": { "index": 47, "kind": "parameter", "displayName": "Authentication Scheme", "group": "security", "label": "security", "required": false, "type": "enum", "javaType": "org.apache.camel.component.docling.AuthenticationScheme", "enum": [ "NONE", "BEARER", "API_KEY" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "NONE", "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configuratio [...]
     "authenticationToken": { "index": 48, "kind": "parameter", "displayName": "Authentication Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "Authentication token for docling-serve API (Bearer token or API [...]
-    "maxFileSize": { "index": 49, "kind": "parameter", "displayName": "Max File Size", "group": "security", "label": "security", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 52428800, "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "Maximum file size in bytes for processing" }
+    "maxFileSize": { "index": 49, "kind": "parameter", "displayName": "Max File Size", "group": "security", "label": "security", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 52428800, "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "Maximum file size in bytes for processing" },
+    "oauthProfile": { "index": 50, "kind": "parameter", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 Client Cr [...]
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/huggingface.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/huggingface.json
index 005388076bf3..24de317f56e4 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/huggingface.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/huggingface.json
@@ -44,7 +44,8 @@
     "userRole": { "index": 17, "kind": "property", "displayName": "User Role", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "user", "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Role for user messages in chat history (e.g., 'user' or 'human')" },
     "autowiredEnabled": { "index": 18, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching  [...]
     "healthCheckConsumerEnabled": { "index": 19, "kind": "property", "displayName": "Health Check Consumer Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all consumer based health checks from this component" },
-    "healthCheckProducerEnabled": { "index": 20, "kind": "property", "displayName": "Health Check Producer Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all producer based health checks from this component. Notice: Camel has by default disabled all producer based health-checks. You can turn on produce [...]
+    "healthCheckProducerEnabled": { "index": 20, "kind": "property", "displayName": "Health Check Producer Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all producer based health checks from this component. Notice: Camel has by default disabled all producer based health-checks. You can turn on produce [...]
+    "oauthProfile": { "index": 21, "kind": "property", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 Cl [...]
   },
   "headers": {
     "CamelHuggingFaceOutput": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The output from the model", "constantName": "org.apache.camel.component.huggingface.HuggingFaceConstants#OUTPUT" }
@@ -67,6 +68,7 @@
     "temperature": { "index": 14, "kind": "parameter", "displayName": "Temperature", "group": "producer", "label": "", "required": false, "type": "number", "javaType": "float", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Temperature for sampling (0.0-1.0)" },
     "topK": { "index": 15, "kind": "parameter", "displayName": "Top K", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 5, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Top-k parameter for classification tasks" },
     "userRole": { "index": 16, "kind": "parameter", "displayName": "User Role", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "user", "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Role for user messages in chat history (e.g., 'user' or 'human')" },
-    "lazyStartProducer": { "index": 17, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...]
+    "lazyStartProducer": { "index": 17, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...]
+    "oauthProfile": { "index": 18, "kind": "parameter", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 C [...]
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ibm-watsonx-ai.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ibm-watsonx-ai.json
index 9a6d7e156fff..044e614b3860 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ibm-watsonx-ai.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ibm-watsonx-ai.json
@@ -57,7 +57,8 @@
     "logResponses": { "index": 30, "kind": "property", "displayName": "Log Responses", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "Whether to log HTTP responses from the watsonx.ai API" },
     "timeout": { "index": 31, "kind": "property", "displayName": "Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Long", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "Request timeout in milliseconds" },
     "verifySsl": { "index": 32, "kind": "property", "displayName": "Verify Ssl", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "Whether to verify SSL certificates" },
-    "apiKey": { "index": 33, "kind": "property", "displayName": "Api Key", "group": "security", "label": "security", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "IBM Cloud API key for authentication" }
+    "apiKey": { "index": 33, "kind": "property", "displayName": "Api Key", "group": "security", "label": "security", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "IBM Cloud API key for authentication" },
+    "oauthProfile": { "index": 34, "kind": "property", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 Client Credentials grant [...]
   },
   "headers": {
     "CamelIBMWatsonxAiOperation": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "WatsonxAiOperations", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform", "constantName": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConstants#OPERATION" },
@@ -159,6 +160,7 @@
     "logResponses": { "index": 29, "kind": "parameter", "displayName": "Log Responses", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "Whether to log HTTP responses from the watsonx.ai API" },
     "timeout": { "index": 30, "kind": "parameter", "displayName": "Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Long", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "Request timeout in milliseconds" },
     "verifySsl": { "index": 31, "kind": "parameter", "displayName": "Verify Ssl", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "Whether to verify SSL certificates" },
-    "apiKey": { "index": 32, "kind": "parameter", "displayName": "Api Key", "group": "security", "label": "security", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "IBM Cloud API key for authentication" }
+    "apiKey": { "index": 32, "kind": "parameter", "displayName": "Api Key", "group": "security", "label": "security", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "IBM Cloud API key for authentication" },
+    "oauthProfile": { "index": 33, "kind": "parameter", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 Client Credentials gran [...]
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/langchain4j-agent.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/langchain4j-agent.json
index 593d99e60555..548a04f6466f 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/langchain4j-agent.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/langchain4j-agent.json
@@ -31,7 +31,7 @@
     "tags": { "index": 4, "kind": "property", "displayName": "Tags", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.agent.LangChain4jAgentConfiguration", "configurationField": "configuration", "description": "Tags for discovering and calling Camel route tools" },
     "autowiredEnabled": { "index": 5, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching t [...]
     "mcpClients": { "index": 6, "kind": "property", "displayName": "Mcp Clients", "group": "advanced", "label": "advanced", "required": false, "type": "array", "javaType": "java.util.List<dev.langchain4j.mcp.client.McpClient>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.agent.LangChain4jAgentConfiguration", "configurationField": "configuration", "description": "Pre-built MCP (Model Context Protocol) client insta [...]
-    "mcpServer": { "index": 7, "kind": "property", "displayName": "Mcp Server", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "mcpServer.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.agent.LangChain4jAgentConfiguration", "configurationField": "configuration", "description": "MCP server  [...]
+    "mcpServer": { "index": 7, "kind": "property", "displayName": "Mcp Server", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "mcpServer.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.agent.LangChain4jAgentConfiguration", "configurationField": "configuration", "description": "MCP server  [...]
   },
   "headers": {
     "CamelLangChain4jAgentSystemMessage": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The system prompt.", "constantName": "org.apache.camel.component.langchain4j.agent.api.Headers#SYSTEM_MESSAGE" },
@@ -48,6 +48,6 @@
     "tags": { "index": 3, "kind": "parameter", "displayName": "Tags", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.agent.LangChain4jAgentConfiguration", "configurationField": "configuration", "description": "Tags for discovering and calling Camel route tools" },
     "lazyStartProducer": { "index": 4, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produc [...]
     "mcpClients": { "index": 5, "kind": "parameter", "displayName": "Mcp Clients", "group": "advanced", "label": "advanced", "required": false, "type": "array", "javaType": "java.util.List<dev.langchain4j.mcp.client.McpClient>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.agent.LangChain4jAgentConfiguration", "configurationField": "configuration", "description": "Pre-built MCP (Model Context Protocol) client inst [...]
-    "mcpServer": { "index": 6, "kind": "parameter", "displayName": "Mcp Server", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "mcpServer.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.agent.LangChain4jAgentConfiguration", "configurationField": "configuration", "description": "MCP server [...]
+    "mcpServer": { "index": 6, "kind": "parameter", "displayName": "Mcp Server", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "mcpServer.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.agent.LangChain4jAgentConfiguration", "configurationField": "configuration", "description": "MCP server [...]
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openai.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openai.json
index 25fe703efaf3..e9366504a874 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openai.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openai.json
@@ -78,7 +78,7 @@
     "maxToolIterations": { "index": 13, "kind": "parameter", "displayName": "Max Tool Iterations", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 50, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Maximum number of tool call loop iterations to prevent infinite loops" },
     "mcpProtocolVersions": { "index": 14, "kind": "parameter", "displayName": "Mcp Protocol Versions", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Comma-separated list of MCP protocol versions to advertise when connect [...]
     "mcpReconnect": { "index": 15, "kind": "parameter", "displayName": "Mcp Reconnect", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Automatically reconnect to MCP servers when a tool call fails due to a t [...]
-    "mcpServer": { "index": 16, "kind": "parameter", "displayName": "Mcp Server", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "mcpServer.", "multiValue": true, "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "MCP (Model Cont [...]
+    "mcpServer": { "index": 16, "kind": "parameter", "displayName": "Mcp Server", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "mcpServer.", "multiValue": true, "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "MCP (Model Cont [...]
     "mcpTimeout": { "index": 17, "kind": "parameter", "displayName": "Mcp Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 20, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Timeout in seconds for MCP tool call requests. Applies to all MCP operations inclu [...]
     "model": { "index": 18, "kind": "parameter", "displayName": "Model", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "The model to use for chat completion" },
     "outputClass": { "index": 19, "kind": "parameter", "displayName": "Output Class", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Fully qualified class name for structured output using response format" },
@@ -88,6 +88,7 @@
     "temperature": { "index": 23, "kind": "parameter", "displayName": "Temperature", "group": "producer", "label": "", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Temperature for response generation (0.0 to 2.0)" },
     "topP": { "index": 24, "kind": "parameter", "displayName": "Top P", "group": "producer", "label": "", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Top P for response generation (0.0 to 1.0)" },
     "userMessage": { "index": 25, "kind": "parameter", "displayName": "User Message", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Default user message text to use when no prompt is provided" },
-    "lazyStartProducer": { "index": 26, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...]
+    "lazyStartProducer": { "index": 26, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...]
+    "oauthProfile": { "index": 27, "kind": "parameter", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 Client Cred [...]
   }
 }
diff --git a/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingComponentConfigurer.java b/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingComponentConfigurer.java
index 6ba30fb97860..06f2b12a0327 100644
--- a/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingComponentConfigurer.java
+++ b/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingComponentConfigurer.java
@@ -105,6 +105,8 @@ public class DoclingComponentConfigurer extends PropertyConfigurerSupport implem
         case "maxFileSize": getOrCreateConfiguration(target).setMaxFileSize(property(camelContext, long.class, value)); return true;
         case "mdpagebreakplaceholder":
         case "mdPageBreakPlaceholder": getOrCreateConfiguration(target).setMdPageBreakPlaceholder(property(camelContext, java.lang.String.class, value)); return true;
+        case "oauthprofile":
+        case "oauthProfile": getOrCreateConfiguration(target).setOauthProfile(property(camelContext, java.lang.String.class, value)); return true;
         case "ocrengine":
         case "ocrEngine": getOrCreateConfiguration(target).setOcrEngine(property(camelContext, java.lang.String.class, value)); return true;
         case "ocrlanguage":
@@ -211,6 +213,8 @@ public class DoclingComponentConfigurer extends PropertyConfigurerSupport implem
         case "maxFileSize": return long.class;
         case "mdpagebreakplaceholder":
         case "mdPageBreakPlaceholder": return java.lang.String.class;
+        case "oauthprofile":
+        case "oauthProfile": return java.lang.String.class;
         case "ocrengine":
         case "ocrEngine": return java.lang.String.class;
         case "ocrlanguage":
@@ -318,6 +322,8 @@ public class DoclingComponentConfigurer extends PropertyConfigurerSupport implem
         case "maxFileSize": return getOrCreateConfiguration(target).getMaxFileSize();
         case "mdpagebreakplaceholder":
         case "mdPageBreakPlaceholder": return getOrCreateConfiguration(target).getMdPageBreakPlaceholder();
+        case "oauthprofile":
+        case "oauthProfile": return getOrCreateConfiguration(target).getOauthProfile();
         case "ocrengine":
         case "ocrEngine": return getOrCreateConfiguration(target).getOcrEngine();
         case "ocrlanguage":
diff --git a/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingConfigurationConfigurer.java b/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingConfigurationConfigurer.java
index d237932aec55..0cc0f033b1d8 100644
--- a/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingConfigurationConfigurer.java
+++ b/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingConfigurationConfigurer.java
@@ -93,6 +93,8 @@ public class DoclingConfigurationConfigurer extends org.apache.camel.support.com
         case "maxFileSize": target.setMaxFileSize(property(camelContext, long.class, value)); return true;
         case "mdpagebreakplaceholder":
         case "mdPageBreakPlaceholder": target.setMdPageBreakPlaceholder(property(camelContext, java.lang.String.class, value)); return true;
+        case "oauthprofile":
+        case "oauthProfile": target.setOauthProfile(property(camelContext, java.lang.String.class, value)); return true;
         case "ocrengine":
         case "ocrEngine": target.setOcrEngine(property(camelContext, java.lang.String.class, value)); return true;
         case "ocrlanguage":
@@ -194,6 +196,8 @@ public class DoclingConfigurationConfigurer extends org.apache.camel.support.com
         case "maxFileSize": return long.class;
         case "mdpagebreakplaceholder":
         case "mdPageBreakPlaceholder": return java.lang.String.class;
+        case "oauthprofile":
+        case "oauthProfile": return java.lang.String.class;
         case "ocrengine":
         case "ocrEngine": return java.lang.String.class;
         case "ocrlanguage":
@@ -296,6 +300,8 @@ public class DoclingConfigurationConfigurer extends org.apache.camel.support.com
         case "maxFileSize": return target.getMaxFileSize();
         case "mdpagebreakplaceholder":
         case "mdPageBreakPlaceholder": return target.getMdPageBreakPlaceholder();
+        case "oauthprofile":
+        case "oauthProfile": return target.getOauthProfile();
         case "ocrengine":
         case "ocrEngine": return target.getOcrEngine();
         case "ocrlanguage":
diff --git a/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingEndpointConfigurer.java b/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingEndpointConfigurer.java
index 1442e4a80ffe..47ca22efb0f5 100644
--- a/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingEndpointConfigurer.java
+++ b/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingEndpointConfigurer.java
@@ -95,6 +95,8 @@ public class DoclingEndpointConfigurer extends PropertyConfigurerSupport impleme
         case "maxFileSize": target.getConfiguration().setMaxFileSize(property(camelContext, long.class, value)); return true;
         case "mdpagebreakplaceholder":
         case "mdPageBreakPlaceholder": target.getConfiguration().setMdPageBreakPlaceholder(property(camelContext, java.lang.String.class, value)); return true;
+        case "oauthprofile":
+        case "oauthProfile": target.getConfiguration().setOauthProfile(property(camelContext, java.lang.String.class, value)); return true;
         case "ocrengine":
         case "ocrEngine": target.getConfiguration().setOcrEngine(property(camelContext, java.lang.String.class, value)); return true;
         case "ocrlanguage":
@@ -198,6 +200,8 @@ public class DoclingEndpointConfigurer extends PropertyConfigurerSupport impleme
         case "maxFileSize": return long.class;
         case "mdpagebreakplaceholder":
         case "mdPageBreakPlaceholder": return java.lang.String.class;
+        case "oauthprofile":
+        case "oauthProfile": return java.lang.String.class;
         case "ocrengine":
         case "ocrEngine": return java.lang.String.class;
         case "ocrlanguage":
@@ -302,6 +306,8 @@ public class DoclingEndpointConfigurer extends PropertyConfigurerSupport impleme
         case "maxFileSize": return target.getConfiguration().getMaxFileSize();
         case "mdpagebreakplaceholder":
         case "mdPageBreakPlaceholder": return target.getConfiguration().getMdPageBreakPlaceholder();
+        case "oauthprofile":
+        case "oauthProfile": return target.getConfiguration().getOauthProfile();
         case "ocrengine":
         case "ocrEngine": return target.getConfiguration().getOcrEngine();
         case "ocrlanguage":
diff --git a/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingEndpointUriFactory.java b/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingEndpointUriFactory.java
index e1c8dc113d21..dad866ccfdb7 100644
--- a/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingEndpointUriFactory.java
+++ b/components/camel-ai/camel-docling/src/generated/java/org/apache/camel/component/docling/DoclingEndpointUriFactory.java
@@ -23,7 +23,7 @@ public class DoclingEndpointUriFactory extends org.apache.camel.support.componen
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Map<String, String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(50);
+        Set<String> props = new HashSet<>(51);
         props.add("abortOnError");
         props.add("apiKeyHeader");
         props.add("asyncPollInterval");
@@ -60,6 +60,7 @@ public class DoclingEndpointUriFactory extends org.apache.camel.support.componen
         props.add("lazyStartProducer");
         props.add("maxFileSize");
         props.add("mdPageBreakPlaceholder");
+        props.add("oauthProfile");
         props.add("ocrEngine");
         props.add("ocrLanguage");
         props.add("operation");
diff --git a/components/camel-ai/camel-docling/src/generated/resources/META-INF/org/apache/camel/component/docling/docling.json b/components/camel-ai/camel-docling/src/generated/resources/META-INF/org/apache/camel/component/docling/docling.json
index 1366dbfdaf55..362c01fdb5d0 100644
--- a/components/camel-ai/camel-docling/src/generated/resources/META-INF/org/apache/camel/component/docling/docling.json
+++ b/components/camel-ai/camel-docling/src/generated/resources/META-INF/org/apache/camel/component/docling/docling.json
@@ -74,7 +74,8 @@
     "apiKeyHeader": { "index": 47, "kind": "property", "displayName": "Api Key Header", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "X-API-Key", "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "Header name for API key authentication" },
     "authenticationScheme": { "index": 48, "kind": "property", "displayName": "Authentication Scheme", "group": "security", "label": "security", "required": false, "type": "enum", "javaType": "org.apache.camel.component.docling.AuthenticationScheme", "enum": [ "NONE", "BEARER", "API_KEY" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "NONE", "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configuration [...]
     "authenticationToken": { "index": 49, "kind": "property", "displayName": "Authentication Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "Authentication token for docling-serve API (Bearer token or API  [...]
-    "maxFileSize": { "index": 50, "kind": "property", "displayName": "Max File Size", "group": "security", "label": "security", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 52428800, "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "Maximum file size in bytes for processing" }
+    "maxFileSize": { "index": 50, "kind": "property", "displayName": "Max File Size", "group": "security", "label": "security", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 52428800, "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "Maximum file size in bytes for processing" },
+    "oauthProfile": { "index": 51, "kind": "property", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 Client Cre [...]
   },
   "headers": {
     "CamelDoclingOperation": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "DoclingOperations", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform", "constantName": "org.apache.camel.component.docling.DoclingHeaders#OPERATION" },
@@ -159,6 +160,7 @@
     "apiKeyHeader": { "index": 46, "kind": "parameter", "displayName": "Api Key Header", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "X-API-Key", "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "Header name for API key authentication" },
     "authenticationScheme": { "index": 47, "kind": "parameter", "displayName": "Authentication Scheme", "group": "security", "label": "security", "required": false, "type": "enum", "javaType": "org.apache.camel.component.docling.AuthenticationScheme", "enum": [ "NONE", "BEARER", "API_KEY" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "NONE", "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configuratio [...]
     "authenticationToken": { "index": 48, "kind": "parameter", "displayName": "Authentication Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "Authentication token for docling-serve API (Bearer token or API [...]
-    "maxFileSize": { "index": 49, "kind": "parameter", "displayName": "Max File Size", "group": "security", "label": "security", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 52428800, "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "Maximum file size in bytes for processing" }
+    "maxFileSize": { "index": 49, "kind": "parameter", "displayName": "Max File Size", "group": "security", "label": "security", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 52428800, "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "Maximum file size in bytes for processing" },
+    "oauthProfile": { "index": 50, "kind": "parameter", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.docling.DoclingConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 Client Cr [...]
   }
 }
diff --git a/components/camel-ai/camel-docling/src/main/docs/docling-component.adoc b/components/camel-ai/camel-docling/src/main/docs/docling-component.adoc
index c227d8bd26e6..3459720929be 100644
--- a/components/camel-ai/camel-docling/src/main/docs/docling-component.adoc
+++ b/components/camel-ai/camel-docling/src/main/docs/docling-component.adoc
@@ -2177,6 +2177,28 @@ docling.serve.url=http://localhost:5001
 docling.serve.token=your-bearer-token-here
 ----
 
+==== OAuth Authentication
+
+When the docling-serve instance is protected by an OAuth identity provider, set the `oauthProfile` parameter to acquire an access token via the OAuth 2.0 Client Credentials grant. The token is used as the `authenticationToken` and the `authenticationScheme` is automatically set to `BEARER`. This requires `camel-oauth` on the classpath.
+
+[source,properties]
+----
+camel.oauth.docling.client-id=my-client
+camel.oauth.docling.client-secret=my-secret
+camel.oauth.docling.token-endpoint=https://idp.example.com/token
+----
+
+[source,java]
+----
+from("file:///data/input")
+    .to("docling:CONVERT_TO_MARKDOWN"
+        + "?useDoclingServe=true"
+        + "&doclingServeUrl=http://localhost:5001"
+        + "&oauthProfile=docling"
+        + "&contentInBody=true")
+    .log("${body}");
+----
+
 == Advanced Processing Options (API Mode)
 
 When using docling-serve API mode (`useDoclingServe=true`), the component exposes advanced processing options that control how the server processes documents. These options are passed directly to the docling-serve API and provide fine-grained control over OCR, table recognition, enrichment features, and output formatting.
diff --git a/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingConfiguration.java b/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingConfiguration.java
index 76f4506d6ba8..a67ae6113b3a 100644
--- a/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingConfiguration.java
+++ b/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingConfiguration.java
@@ -85,6 +85,12 @@ public class DoclingConfiguration implements Cloneable {
     @Metadata(description = "Authentication token for docling-serve API (Bearer token or API key)", secret = true)
     private String authenticationToken;
 
+    @UriParam(label = "security")
+    @Metadata(description = "OAuth profile name for obtaining an access token via the OAuth 2.0 Client Credentials grant. "
+                            + "When set, the token is acquired from the configured identity provider and used as authenticationToken. "
+                            + "Requires camel-oauth on the classpath.")
+    private String oauthProfile;
+
     @UriParam(label = "security")
     @Metadata(description = "Authentication scheme (BEARER, API_KEY, NONE)", defaultValue = "NONE",
               enums = "BEARER,API_KEY,NONE")
@@ -333,6 +339,14 @@ public class DoclingConfiguration implements Cloneable {
         this.authenticationToken = authenticationToken;
     }
 
+    public String getOauthProfile() {
+        return oauthProfile;
+    }
+
+    public void setOauthProfile(String oauthProfile) {
+        this.oauthProfile = oauthProfile;
+    }
+
     public AuthenticationScheme getAuthenticationScheme() {
         return authenticationScheme;
     }
diff --git a/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingProducer.java b/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingProducer.java
index 3e7d1b15d4b7..8eeeb8a28e9c 100644
--- a/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingProducer.java
+++ b/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingProducer.java
@@ -71,6 +71,8 @@ import org.apache.camel.Exchange;
 import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.WrappedFile;
 import org.apache.camel.support.DefaultProducer;
+import org.apache.camel.support.OAuthHelper;
+import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -94,6 +96,7 @@ public class DoclingProducer extends DefaultProducer {
     @Override
     protected void doStart() throws Exception {
         super.doStart();
+        resolveOAuthToken();
         if (configuration.isUseDoclingServe()) {
             String baseUrl = configuration.getDoclingServeUrl();
             if (baseUrl.endsWith("/")) {
@@ -132,6 +135,17 @@ public class DoclingProducer extends DefaultProducer {
         }
     }
 
+    private void resolveOAuthToken() throws Exception {
+        if (ObjectHelper.isEmpty(configuration.getOauthProfile())) {
+            return;
+        }
+        String token = OAuthHelper.resolveOAuthToken(getEndpoint().getCamelContext(), configuration.getOauthProfile());
+        configuration.setAuthenticationToken(token);
+        if (configuration.getAuthenticationScheme() == AuthenticationScheme.NONE) {
+            configuration.setAuthenticationScheme(AuthenticationScheme.BEARER);
+        }
+    }
+
     @Override
     public void process(Exchange exchange) throws Exception {
         LOG.debug("DoclingProducer processing exchange with message ID: {}", exchange.getExchangeId());
diff --git a/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceComponentConfigurer.java b/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceComponentConfigurer.java
index fa759f23657e..c069a858d910 100644
--- a/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceComponentConfigurer.java
+++ b/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceComponentConfigurer.java
@@ -56,6 +56,8 @@ public class HuggingFaceComponentConfigurer extends PropertyConfigurerSupport im
         case "modelLoadingTimeout": getOrCreateConfiguration(target).setModelLoadingTimeout(property(camelContext, int.class, value)); return true;
         case "multilabel":
         case "multiLabel": getOrCreateConfiguration(target).setMultiLabel(property(camelContext, boolean.class, value)); return true;
+        case "oauthprofile":
+        case "oauthProfile": getOrCreateConfiguration(target).setOauthProfile(property(camelContext, java.lang.String.class, value)); return true;
         case "predicttimeout":
         case "predictTimeout": getOrCreateConfiguration(target).setPredictTimeout(property(camelContext, int.class, value)); return true;
         case "predictorbean":
@@ -101,6 +103,8 @@ public class HuggingFaceComponentConfigurer extends PropertyConfigurerSupport im
         case "modelLoadingTimeout": return int.class;
         case "multilabel":
         case "multiLabel": return boolean.class;
+        case "oauthprofile":
+        case "oauthProfile": return java.lang.String.class;
         case "predicttimeout":
         case "predictTimeout": return int.class;
         case "predictorbean":
@@ -147,6 +151,8 @@ public class HuggingFaceComponentConfigurer extends PropertyConfigurerSupport im
         case "modelLoadingTimeout": return getOrCreateConfiguration(target).getModelLoadingTimeout();
         case "multilabel":
         case "multiLabel": return getOrCreateConfiguration(target).isMultiLabel();
+        case "oauthprofile":
+        case "oauthProfile": return getOrCreateConfiguration(target).getOauthProfile();
         case "predicttimeout":
         case "predictTimeout": return getOrCreateConfiguration(target).getPredictTimeout();
         case "predictorbean":
diff --git a/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceEndpointConfigurer.java b/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceEndpointConfigurer.java
index a18bc7b2a62a..1a18ecc45a1a 100644
--- a/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceEndpointConfigurer.java
+++ b/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceEndpointConfigurer.java
@@ -42,6 +42,8 @@ public class HuggingFaceEndpointConfigurer extends PropertyConfigurerSupport imp
         case "modelLoadingTimeout": target.getConfiguration().setModelLoadingTimeout(property(camelContext, int.class, value)); return true;
         case "multilabel":
         case "multiLabel": target.getConfiguration().setMultiLabel(property(camelContext, boolean.class, value)); return true;
+        case "oauthprofile":
+        case "oauthProfile": target.getConfiguration().setOauthProfile(property(camelContext, java.lang.String.class, value)); return true;
         case "predicttimeout":
         case "predictTimeout": target.getConfiguration().setPredictTimeout(property(camelContext, int.class, value)); return true;
         case "predictorbean":
@@ -80,6 +82,8 @@ public class HuggingFaceEndpointConfigurer extends PropertyConfigurerSupport imp
         case "modelLoadingTimeout": return int.class;
         case "multilabel":
         case "multiLabel": return boolean.class;
+        case "oauthprofile":
+        case "oauthProfile": return java.lang.String.class;
         case "predicttimeout":
         case "predictTimeout": return int.class;
         case "predictorbean":
@@ -119,6 +123,8 @@ public class HuggingFaceEndpointConfigurer extends PropertyConfigurerSupport imp
         case "modelLoadingTimeout": return target.getConfiguration().getModelLoadingTimeout();
         case "multilabel":
         case "multiLabel": return target.getConfiguration().isMultiLabel();
+        case "oauthprofile":
+        case "oauthProfile": return target.getConfiguration().getOauthProfile();
         case "predicttimeout":
         case "predictTimeout": return target.getConfiguration().getPredictTimeout();
         case "predictorbean":
diff --git a/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceEndpointUriFactory.java b/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceEndpointUriFactory.java
index 117429514b86..bb17f2ca65bd 100644
--- a/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceEndpointUriFactory.java
+++ b/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceEndpointUriFactory.java
@@ -23,7 +23,7 @@ public class HuggingFaceEndpointUriFactory extends org.apache.camel.support.comp
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Map<String, String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(18);
+        Set<String> props = new HashSet<>(19);
         props.add("authToken");
         props.add("autoSelect");
         props.add("device");
@@ -34,6 +34,7 @@ public class HuggingFaceEndpointUriFactory extends org.apache.camel.support.comp
         props.add("modelId");
         props.add("modelLoadingTimeout");
         props.add("multiLabel");
+        props.add("oauthProfile");
         props.add("predictTimeout");
         props.add("predictorBean");
         props.add("revision");
diff --git a/components/camel-ai/camel-huggingface/src/generated/resources/META-INF/org/apache/camel/component/huggingface/huggingface.json b/components/camel-ai/camel-huggingface/src/generated/resources/META-INF/org/apache/camel/component/huggingface/huggingface.json
index 005388076bf3..24de317f56e4 100644
--- a/components/camel-ai/camel-huggingface/src/generated/resources/META-INF/org/apache/camel/component/huggingface/huggingface.json
+++ b/components/camel-ai/camel-huggingface/src/generated/resources/META-INF/org/apache/camel/component/huggingface/huggingface.json
@@ -44,7 +44,8 @@
     "userRole": { "index": 17, "kind": "property", "displayName": "User Role", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "user", "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Role for user messages in chat history (e.g., 'user' or 'human')" },
     "autowiredEnabled": { "index": 18, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching  [...]
     "healthCheckConsumerEnabled": { "index": 19, "kind": "property", "displayName": "Health Check Consumer Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all consumer based health checks from this component" },
-    "healthCheckProducerEnabled": { "index": 20, "kind": "property", "displayName": "Health Check Producer Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all producer based health checks from this component. Notice: Camel has by default disabled all producer based health-checks. You can turn on produce [...]
+    "healthCheckProducerEnabled": { "index": 20, "kind": "property", "displayName": "Health Check Producer Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all producer based health checks from this component. Notice: Camel has by default disabled all producer based health-checks. You can turn on produce [...]
+    "oauthProfile": { "index": 21, "kind": "property", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 Cl [...]
   },
   "headers": {
     "CamelHuggingFaceOutput": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The output from the model", "constantName": "org.apache.camel.component.huggingface.HuggingFaceConstants#OUTPUT" }
@@ -67,6 +68,7 @@
     "temperature": { "index": 14, "kind": "parameter", "displayName": "Temperature", "group": "producer", "label": "", "required": false, "type": "number", "javaType": "float", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Temperature for sampling (0.0-1.0)" },
     "topK": { "index": 15, "kind": "parameter", "displayName": "Top K", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 5, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Top-k parameter for classification tasks" },
     "userRole": { "index": 16, "kind": "parameter", "displayName": "User Role", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "user", "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Role for user messages in chat history (e.g., 'user' or 'human')" },
-    "lazyStartProducer": { "index": 17, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...]
+    "lazyStartProducer": { "index": 17, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...]
+    "oauthProfile": { "index": 18, "kind": "parameter", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 C [...]
   }
 }
diff --git a/components/camel-ai/camel-huggingface/src/main/docs/huggingface-component.adoc b/components/camel-ai/camel-huggingface/src/main/docs/huggingface-component.adoc
index eae541bc2bfc..139ad87e3f2c 100644
--- a/components/camel-ai/camel-huggingface/src/main/docs/huggingface-component.adoc
+++ b/components/camel-ai/camel-huggingface/src/main/docs/huggingface-component.adoc
@@ -95,6 +95,23 @@ include::partial$component-endpoint-headers.adoc[]
 // endpoint options: START
 // endpoint options: END
 
+== OAuth Authentication
+
+When accessing private or gated models behind an OAuth-protected endpoint, set the `oauthProfile` parameter to acquire an access token via the OAuth 2.0 Client Credentials grant. The token is used as the `authToken`. This requires `camel-oauth` on the classpath.
+
+[source,properties]
+----
+camel.oauth.hf.client-id=my-client
+camel.oauth.hf.client-secret=my-secret
+camel.oauth.hf.token-endpoint=https://idp.example.com/token
+----
+
+[source,java]
+----
+from("direct:chat")
+    .to("huggingface:chat?modelId=mistralai/Mistral-7B-Instruct-v0.2&oauthProfile=hf");
+----
+
 == Examples
 
 .Classify sentiment of text:
diff --git a/components/camel-ai/camel-huggingface/src/main/java/org/apache/camel/component/huggingface/HuggingFaceConfiguration.java b/components/camel-ai/camel-huggingface/src/main/java/org/apache/camel/component/huggingface/HuggingFaceConfiguration.java
index 2d985f1f189f..7b7e827548b9 100644
--- a/components/camel-ai/camel-huggingface/src/main/java/org/apache/camel/component/huggingface/HuggingFaceConfiguration.java
+++ b/components/camel-ai/camel-huggingface/src/main/java/org/apache/camel/component/huggingface/HuggingFaceConfiguration.java
@@ -56,6 +56,12 @@ public class HuggingFaceConfiguration implements Cloneable {
     @Metadata(description = "HF API token for private models")
     private String authToken;
 
+    @UriParam(label = "security")
+    @Metadata(description = "OAuth profile name for obtaining an access token via the OAuth 2.0 Client Credentials grant. "
+                            + "When set, the token is acquired from the configured identity provider and used as authToken. "
+                            + "Requires camel-oauth on the classpath.")
+    private String oauthProfile;
+
     @UriParam
     @Metadata(description = "Min tokens for summarization tasks")
     private int minLength = 30;
@@ -205,6 +211,14 @@ public class HuggingFaceConfiguration implements Cloneable {
         this.authToken = authToken;
     }
 
+    public String getOauthProfile() {
+        return oauthProfile;
+    }
+
+    public void setOauthProfile(String oauthProfile) {
+        this.oauthProfile = oauthProfile;
+    }
+
     public HuggingFaceTask getTask() {
         return task;
     }
diff --git a/components/camel-ai/camel-huggingface/src/main/java/org/apache/camel/component/huggingface/HuggingFaceProducer.java b/components/camel-ai/camel-huggingface/src/main/java/org/apache/camel/component/huggingface/HuggingFaceProducer.java
index 9bcef8cb8bf4..ac34e3b02d6a 100644
--- a/components/camel-ai/camel-huggingface/src/main/java/org/apache/camel/component/huggingface/HuggingFaceProducer.java
+++ b/components/camel-ai/camel-huggingface/src/main/java/org/apache/camel/component/huggingface/HuggingFaceProducer.java
@@ -23,6 +23,8 @@ import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.component.huggingface.tasks.TaskPredictor;
 import org.apache.camel.component.huggingface.tasks.TaskPredictorFactory;
 import org.apache.camel.support.DefaultProducer;
+import org.apache.camel.support.OAuthHelper;
+import org.apache.camel.util.ObjectHelper;
 
 public class HuggingFaceProducer extends DefaultProducer {
 
@@ -35,10 +37,19 @@ public class HuggingFaceProducer extends DefaultProducer {
     @Override
     protected void doStart() throws Exception {
         super.doStart();
+        resolveOAuthToken();
         predictor = TaskPredictorFactory.getPredictor(getEndpoint());
         predictor.loadModel();
     }
 
+    private void resolveOAuthToken() throws Exception {
+        HuggingFaceConfiguration config = getEndpoint().getConfiguration();
+        if (ObjectHelper.isEmpty(config.getOauthProfile())) {
+            return;
+        }
+        config.setAuthToken(OAuthHelper.resolveOAuthToken(getEndpoint().getCamelContext(), config.getOauthProfile()));
+    }
+
     @Override
     public void process(Exchange exchange) throws Exception {
         try {
diff --git a/components/camel-ai/camel-langchain4j-agent/src/generated/resources/META-INF/org/apache/camel/component/langchain4j/agent/langchain4j-agent.json b/components/camel-ai/camel-langchain4j-agent/src/generated/resources/META-INF/org/apache/camel/component/langchain4j/agent/langchain4j-agent.json
index 593d99e60555..548a04f6466f 100644
--- a/components/camel-ai/camel-langchain4j-agent/src/generated/resources/META-INF/org/apache/camel/component/langchain4j/agent/langchain4j-agent.json
+++ b/components/camel-ai/camel-langchain4j-agent/src/generated/resources/META-INF/org/apache/camel/component/langchain4j/agent/langchain4j-agent.json
@@ -31,7 +31,7 @@
     "tags": { "index": 4, "kind": "property", "displayName": "Tags", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.agent.LangChain4jAgentConfiguration", "configurationField": "configuration", "description": "Tags for discovering and calling Camel route tools" },
     "autowiredEnabled": { "index": 5, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching t [...]
     "mcpClients": { "index": 6, "kind": "property", "displayName": "Mcp Clients", "group": "advanced", "label": "advanced", "required": false, "type": "array", "javaType": "java.util.List<dev.langchain4j.mcp.client.McpClient>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.agent.LangChain4jAgentConfiguration", "configurationField": "configuration", "description": "Pre-built MCP (Model Context Protocol) client insta [...]
-    "mcpServer": { "index": 7, "kind": "property", "displayName": "Mcp Server", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "mcpServer.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.agent.LangChain4jAgentConfiguration", "configurationField": "configuration", "description": "MCP server  [...]
+    "mcpServer": { "index": 7, "kind": "property", "displayName": "Mcp Server", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "mcpServer.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.agent.LangChain4jAgentConfiguration", "configurationField": "configuration", "description": "MCP server  [...]
   },
   "headers": {
     "CamelLangChain4jAgentSystemMessage": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The system prompt.", "constantName": "org.apache.camel.component.langchain4j.agent.api.Headers#SYSTEM_MESSAGE" },
@@ -48,6 +48,6 @@
     "tags": { "index": 3, "kind": "parameter", "displayName": "Tags", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.agent.LangChain4jAgentConfiguration", "configurationField": "configuration", "description": "Tags for discovering and calling Camel route tools" },
     "lazyStartProducer": { "index": 4, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produc [...]
     "mcpClients": { "index": 5, "kind": "parameter", "displayName": "Mcp Clients", "group": "advanced", "label": "advanced", "required": false, "type": "array", "javaType": "java.util.List<dev.langchain4j.mcp.client.McpClient>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.agent.LangChain4jAgentConfiguration", "configurationField": "configuration", "description": "Pre-built MCP (Model Context Protocol) client inst [...]
-    "mcpServer": { "index": 6, "kind": "parameter", "displayName": "Mcp Server", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "mcpServer.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.agent.LangChain4jAgentConfiguration", "configurationField": "configuration", "description": "MCP server [...]
+    "mcpServer": { "index": 6, "kind": "parameter", "displayName": "Mcp Server", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "mcpServer.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.agent.LangChain4jAgentConfiguration", "configurationField": "configuration", "description": "MCP server [...]
   }
 }
diff --git a/components/camel-ai/camel-langchain4j-agent/src/main/docs/langchain4j-agent-component.adoc b/components/camel-ai/camel-langchain4j-agent/src/main/docs/langchain4j-agent-component.adoc
index aa1416c042f8..a126832f26bc 100644
--- a/components/camel-ai/camel-langchain4j-agent/src/main/docs/langchain4j-agent-component.adoc
+++ b/components/camel-ai/camel-langchain4j-agent/src/main/docs/langchain4j-agent-component.adoc
@@ -55,6 +55,70 @@ include::partial$component-endpoint-options.adoc[]
 include::partial$component-endpoint-headers.adoc[]
 // component options: END
 
+== OAuth Authentication
+
+=== Quarkus Runtime
+
+When running in Quarkus, use the https://quarkus.io/extensions/io.quarkiverse.langchain4j/quarkus-langchain4j-oidc-mcp-auth-provider/[quarkus-langchain4j-oidc-mcp-auth-provider] extension for MCP server authentication. This is the recommended approach as it integrates natively with Quarkus OIDC, supports automatic token propagation, and follows Quarkus security best practices.
+
+[source,xml]
+----
+<dependency>
+    <groupId>io.quarkiverse.langchain4j</groupId>
+    <artifactId>quarkus-langchain4j-oidc-mcp-auth-provider</artifactId>
+</dependency>
+----
+
+With this extension, the authenticated user's OIDC access token is automatically propagated to MCP servers. MCP clients are configured via `quarkus.langchain4j.mcp.*` properties and are injected as pre-built beans. Camel picks them up via the `mcpClients` parameter — no `oauthProfile` or `camel-oauth` is needed.
+
+=== camel-main and manual MCP server configuration
+
+When running outside Quarkus (e.g., camel-main) or when manually configuring MCP servers via inline `mcpServer.<name>.*` parameters, use the `oauthProfile` option to acquire an access token via the OAuth 2.0 Client Credentials grant. The token is injected as an `Authorization: Bearer` header on HTTP-based MCP transports. This requires `camel-oauth` on the classpath.
+
+[source,properties]
+----
+camel.oauth.keycloak.client-id=camel-client
+camel.oauth.keycloak.client-secret=camel-client-secret
+camel.oauth.keycloak.token-endpoint=https://keycloak.example.com/realms/camel/protocol/openid-connect/token
+----
+
+[source,java]
+----
+from("direct:agent")
+    .to("langchain4j-agent:myAgent"
+        + "?mcpServer.tools.transportType=http"
+        + "&mcpServer.tools.url=https://mcp.internal/mcp"
+        + "&mcpServer.tools.oauthProfile=keycloak");
+----
+
+=== LLM Provider Authentication
+
+The langchain4j-agent component accepts a pre-built `Agent` or `ChatModel` bean — it does not create the LLM client itself. For LLM providers that require OAuth authentication (e.g., Azure OpenAI), use `OAuthHelper` when building the bean programmatically:
+
+[source,java]
+----
+import org.apache.camel.support.OAuthHelper;
+
+public class MyRouteBuilder extends RouteBuilder {
+    @Override
+    public void configure() throws Exception {
+        String token = OAuthHelper.resolveOAuthToken(getContext(), "azure");
+
+        ChatModel chatModel = OpenAiChatModel.builder()
+                .apiKey(token)
+                .modelName("gpt-4")
+                .build();
+
+        getContext().getRegistry().bind("myChatModel", chatModel);
+
+        from("direct:agent")
+            .to("langchain4j-agent:myAgent");
+    }
+}
+----
+
+NOTE: In Quarkus or Spring Boot, configure the ChatModel via the framework's own properties and dependency injection instead of programmatic bean registration.
+
 include::spring-boot:partial$starter.adoc[]
 
 
diff --git a/components/camel-ai/camel-langchain4j-agent/src/main/java/org/apache/camel/component/langchain4j/agent/LangChain4jAgentConfiguration.java b/components/camel-ai/camel-langchain4j-agent/src/main/java/org/apache/camel/component/langchain4j/agent/LangChain4jAgentConfiguration.java
index 8ef15e74a167..5379129df3f2 100644
--- a/components/camel-ai/camel-langchain4j-agent/src/main/java/org/apache/camel/component/langchain4j/agent/LangChain4jAgentConfiguration.java
+++ b/components/camel-ai/camel-langchain4j-agent/src/main/java/org/apache/camel/component/langchain4j/agent/LangChain4jAgentConfiguration.java
@@ -49,10 +49,11 @@ public class LangChain4jAgentConfiguration implements Cloneable {
     private List<McpClient> mcpClients;
 
     @UriParam(description = "MCP server definitions in the form of mcpServer.<name>.<property>=<value>."
-                            + " Supported properties: transportType (stdio or http, default: stdio),"
-                            + " command (comma-separated, for stdio), url (for http),"
+                            + " Supported properties: transportType (stdio, http, streamableHttp, or sse, default: stdio),"
+                            + " command (comma-separated, for stdio), url (for http/sse),"
                             + " environment.<key>=<value> (for stdio), timeout (in seconds, default: 60),"
-                            + " logRequests, logResponses.",
+                            + " logRequests, logResponses,"
+                            + " oauthProfile (OAuth profile for HTTP auth, requires camel-oauth).",
               prefix = "mcpServer.", multiValue = true, label = "advanced")
     private Map<String, Object> mcpServer;
 
diff --git a/components/camel-ai/camel-langchain4j-agent/src/main/java/org/apache/camel/component/langchain4j/agent/LangChain4jAgentProducer.java b/components/camel-ai/camel-langchain4j-agent/src/main/java/org/apache/camel/component/langchain4j/agent/LangChain4jAgentProducer.java
index f74743644275..afc1ff6e8a73 100644
--- a/components/camel-ai/camel-langchain4j-agent/src/main/java/org/apache/camel/component/langchain4j/agent/LangChain4jAgentProducer.java
+++ b/components/camel-ai/camel-langchain4j-agent/src/main/java/org/apache/camel/component/langchain4j/agent/LangChain4jAgentProducer.java
@@ -274,7 +274,7 @@ public class LangChain4jAgentProducer extends DefaultProducer {
                 materializedMcpClients = new ArrayList<>();
                 for (LangChain4jMcpServerDefinition def : serverDefs) {
                     LOG.debug("Building MCP client '{}' (transport: {})", def.getServerName(), def.getTransportType());
-                    materializedMcpClients.add(def.buildClient());
+                    materializedMcpClients.add(def.buildClient(endpoint.getCamelContext()));
                 }
                 LOG.debug("Materialized {} MCP clients from server definitions", materializedMcpClients.size());
             }
@@ -336,6 +336,9 @@ public class LangChain4jAgentProducer extends DefaultProducer {
             if (props.containsKey("logResponses")) {
                 def.setLogResponses(Boolean.parseBoolean(props.get("logResponses")));
             }
+            if (props.containsKey("oauthProfile")) {
+                def.setOauthProfile(props.get("oauthProfile"));
+            }
 
             // Collect environment variables (environment.<key>=<value>)
             Map<String, String> environment = new LinkedHashMap<>();
diff --git a/components/camel-ai/camel-langchain4j-agent/src/main/java/org/apache/camel/component/langchain4j/agent/LangChain4jMcpServerDefinition.java b/components/camel-ai/camel-langchain4j-agent/src/main/java/org/apache/camel/component/langchain4j/agent/LangChain4jMcpServerDefinition.java
index d196ae1d2da4..a963c6ec06df 100644
--- a/components/camel-ai/camel-langchain4j-agent/src/main/java/org/apache/camel/component/langchain4j/agent/LangChain4jMcpServerDefinition.java
+++ b/components/camel-ai/camel-langchain4j-agent/src/main/java/org/apache/camel/component/langchain4j/agent/LangChain4jMcpServerDefinition.java
@@ -26,6 +26,8 @@ import dev.langchain4j.mcp.client.transport.McpTransport;
 import dev.langchain4j.mcp.client.transport.http.HttpMcpTransport;
 import dev.langchain4j.mcp.client.transport.http.StreamableHttpMcpTransport;
 import dev.langchain4j.mcp.client.transport.stdio.StdioMcpTransport;
+import org.apache.camel.CamelContext;
+import org.apache.camel.support.OAuthHelper;
 
 /**
  * A simplified configuration POJO for declaratively defining MCP (Model Context Protocol) servers.
@@ -63,6 +65,7 @@ public class LangChain4jMcpServerDefinition {
     private Duration timeout = Duration.ofSeconds(60);
     private boolean logRequests;
     private boolean logResponses;
+    private String oauthProfile;
 
     /**
      * Gets the server name (used for identification and as the MCP client key).
@@ -176,14 +179,33 @@ public class LangChain4jMcpServerDefinition {
         this.logResponses = logResponses;
     }
 
+    /**
+     * Gets the OAuth profile name for HTTP transport authentication.
+     */
+    public String getOauthProfile() {
+        return oauthProfile;
+    }
+
+    /**
+     * Sets the OAuth profile name for obtaining an access token via the OAuth 2.0 Client Credentials grant. When set,
+     * the token is injected as an Authorization: Bearer header on HTTP-based MCP transports. Requires camel-oauth on
+     * the classpath.
+     */
+    public void setOauthProfile(String oauthProfile) {
+        this.oauthProfile = oauthProfile;
+    }
+
     /**
      * Builds an {@link McpClient} from this definition.
      *
+     * @param  camelContext             the CamelContext for resolving OAuth profiles (may be null if no oauthProfile is
+     *                                  set)
      * @return                          a configured and ready-to-use McpClient
      * @throws IllegalArgumentException if required configuration is missing
+     * @throws Exception                if OAuth token resolution fails
      */
-    public McpClient buildClient() {
-        McpTransport transport = buildTransport();
+    public McpClient buildClient(CamelContext camelContext) throws Exception {
+        McpTransport transport = buildTransport(camelContext);
 
         DefaultMcpClient.Builder clientBuilder = new DefaultMcpClient.Builder()
                 .transport(transport)
@@ -197,27 +219,40 @@ public class LangChain4jMcpServerDefinition {
     }
 
     @SuppressWarnings("deprecation")
-    private McpTransport buildTransport() {
-        if ("http".equalsIgnoreCase(transportType)) {
+    private McpTransport buildTransport(CamelContext camelContext) throws Exception {
+        // Resolve OAuth token for HTTP-based transports
+        Map<String, String> authHeaders = null;
+        if (oauthProfile != null && !oauthProfile.isBlank() && camelContext != null) {
+            String token = OAuthHelper.resolveOAuthToken(camelContext, oauthProfile);
+            authHeaders = Map.of("Authorization", "Bearer " + token);
+        }
+
+        if ("http".equalsIgnoreCase(transportType) || "streamableHttp".equalsIgnoreCase(transportType)) {
             if (url == null || url.trim().isEmpty()) {
                 throw new IllegalArgumentException("URL is required for HTTP MCP transport");
             }
-            return new StreamableHttpMcpTransport.Builder()
+            StreamableHttpMcpTransport.Builder builder = new StreamableHttpMcpTransport.Builder()
                     .url(url)
                     .logRequests(logRequests)
                     .logResponses(logResponses)
-                    .timeout(timeout)
-                    .build();
+                    .timeout(timeout);
+            if (authHeaders != null) {
+                builder.customHeaders(authHeaders);
+            }
+            return builder.build();
         } else if ("sse".equalsIgnoreCase(transportType)) {
             if (url == null || url.trim().isEmpty()) {
                 throw new IllegalArgumentException("URL is required for SSE MCP transport");
             }
-            return new HttpMcpTransport.Builder()
+            HttpMcpTransport.Builder builder = new HttpMcpTransport.Builder()
                     .sseUrl(url)
                     .logRequests(logRequests)
                     .logResponses(logResponses)
-                    .timeout(timeout)
-                    .build();
+                    .timeout(timeout);
+            if (authHeaders != null) {
+                builder.customHeaders(authHeaders);
+            }
+            return builder.build();
         } else if ("stdio".equalsIgnoreCase(transportType)) {
             if (command == null || command.isEmpty()) {
                 throw new IllegalArgumentException("Command is required for stdio MCP transport");
@@ -232,7 +267,7 @@ public class LangChain4jMcpServerDefinition {
         } else {
             throw new IllegalArgumentException(
                     "Unsupported MCP transport type: " + transportType
-                                               + ". Supported values: stdio, http, sse");
+                                               + ". Supported values: stdio, http, streamableHttp, sse");
         }
     }
 }
diff --git a/components/camel-ai/camel-openai/src/generated/java/org/apache/camel/component/openai/OpenAIEndpointConfigurer.java b/components/camel-ai/camel-openai/src/generated/java/org/apache/camel/component/openai/OpenAIEndpointConfigurer.java
index 175c61fb7543..0aea51146fae 100644
--- a/components/camel-ai/camel-openai/src/generated/java/org/apache/camel/component/openai/OpenAIEndpointConfigurer.java
+++ b/components/camel-ai/camel-openai/src/generated/java/org/apache/camel/component/openai/OpenAIEndpointConfigurer.java
@@ -59,6 +59,8 @@ public class OpenAIEndpointConfigurer extends PropertyConfigurerSupport implemen
         case "mcptimeout":
         case "mcpTimeout": target.getConfiguration().setMcpTimeout(property(camelContext, int.class, value)); return true;
         case "model": target.getConfiguration().setModel(property(camelContext, java.lang.String.class, value)); return true;
+        case "oauthprofile":
+        case "oauthProfile": target.getConfiguration().setOauthProfile(property(camelContext, java.lang.String.class, value)); return true;
         case "outputclass":
         case "outputClass": target.getConfiguration().setOutputClass(property(camelContext, java.lang.String.class, value)); return true;
         case "storefullresponse":
@@ -114,6 +116,8 @@ public class OpenAIEndpointConfigurer extends PropertyConfigurerSupport implemen
         case "mcptimeout":
         case "mcpTimeout": return int.class;
         case "model": return java.lang.String.class;
+        case "oauthprofile":
+        case "oauthProfile": return java.lang.String.class;
         case "outputclass":
         case "outputClass": return java.lang.String.class;
         case "storefullresponse":
@@ -170,6 +174,8 @@ public class OpenAIEndpointConfigurer extends PropertyConfigurerSupport implemen
         case "mcptimeout":
         case "mcpTimeout": return target.getConfiguration().getMcpTimeout();
         case "model": return target.getConfiguration().getModel();
+        case "oauthprofile":
+        case "oauthProfile": return target.getConfiguration().getOauthProfile();
         case "outputclass":
         case "outputClass": return target.getConfiguration().getOutputClass();
         case "storefullresponse":
diff --git a/components/camel-ai/camel-openai/src/generated/java/org/apache/camel/component/openai/OpenAIEndpointUriFactory.java b/components/camel-ai/camel-openai/src/generated/java/org/apache/camel/component/openai/OpenAIEndpointUriFactory.java
index 094de4e90691..2098da83bf73 100644
--- a/components/camel-ai/camel-openai/src/generated/java/org/apache/camel/component/openai/OpenAIEndpointUriFactory.java
+++ b/components/camel-ai/camel-openai/src/generated/java/org/apache/camel/component/openai/OpenAIEndpointUriFactory.java
@@ -23,7 +23,7 @@ public class OpenAIEndpointUriFactory extends org.apache.camel.support.component
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Map<String, String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(27);
+        Set<String> props = new HashSet<>(28);
         props.add("additionalBodyProperty");
         props.add("apiKey");
         props.add("autoToolExecution");
@@ -43,6 +43,7 @@ public class OpenAIEndpointUriFactory extends org.apache.camel.support.component
         props.add("mcpServer");
         props.add("mcpTimeout");
         props.add("model");
+        props.add("oauthProfile");
         props.add("operation");
         props.add("outputClass");
         props.add("storeFullResponse");
diff --git a/components/camel-ai/camel-openai/src/generated/resources/META-INF/org/apache/camel/component/openai/openai.json b/components/camel-ai/camel-openai/src/generated/resources/META-INF/org/apache/camel/component/openai/openai.json
index 25fe703efaf3..e9366504a874 100644
--- a/components/camel-ai/camel-openai/src/generated/resources/META-INF/org/apache/camel/component/openai/openai.json
+++ b/components/camel-ai/camel-openai/src/generated/resources/META-INF/org/apache/camel/component/openai/openai.json
@@ -78,7 +78,7 @@
     "maxToolIterations": { "index": 13, "kind": "parameter", "displayName": "Max Tool Iterations", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 50, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Maximum number of tool call loop iterations to prevent infinite loops" },
     "mcpProtocolVersions": { "index": 14, "kind": "parameter", "displayName": "Mcp Protocol Versions", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Comma-separated list of MCP protocol versions to advertise when connect [...]
     "mcpReconnect": { "index": 15, "kind": "parameter", "displayName": "Mcp Reconnect", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Automatically reconnect to MCP servers when a tool call fails due to a t [...]
-    "mcpServer": { "index": 16, "kind": "parameter", "displayName": "Mcp Server", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "mcpServer.", "multiValue": true, "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "MCP (Model Cont [...]
+    "mcpServer": { "index": 16, "kind": "parameter", "displayName": "Mcp Server", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "mcpServer.", "multiValue": true, "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "MCP (Model Cont [...]
     "mcpTimeout": { "index": 17, "kind": "parameter", "displayName": "Mcp Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 20, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Timeout in seconds for MCP tool call requests. Applies to all MCP operations inclu [...]
     "model": { "index": 18, "kind": "parameter", "displayName": "Model", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "The model to use for chat completion" },
     "outputClass": { "index": 19, "kind": "parameter", "displayName": "Output Class", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Fully qualified class name for structured output using response format" },
@@ -88,6 +88,7 @@
     "temperature": { "index": 23, "kind": "parameter", "displayName": "Temperature", "group": "producer", "label": "", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Temperature for response generation (0.0 to 2.0)" },
     "topP": { "index": 24, "kind": "parameter", "displayName": "Top P", "group": "producer", "label": "", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Top P for response generation (0.0 to 1.0)" },
     "userMessage": { "index": 25, "kind": "parameter", "displayName": "User Message", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Default user message text to use when no prompt is provided" },
-    "lazyStartProducer": { "index": 26, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...]
+    "lazyStartProducer": { "index": 26, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...]
+    "oauthProfile": { "index": 27, "kind": "parameter", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 Client Cred [...]
   }
 }
diff --git a/components/camel-ai/camel-openai/src/main/docs/openai-component.adoc b/components/camel-ai/camel-openai/src/main/docs/openai-component.adoc
index 7bb5cb3883c4..4e09e1d24ecc 100644
--- a/components/camel-ai/camel-openai/src/main/docs/openai-component.adoc
+++ b/components/camel-ai/camel-openai/src/main/docs/openai-component.adoc
@@ -66,6 +66,36 @@ API key resolution order:
 The API key can be omitted if using OpenAI-compatible providers that don't require authentication (e.g., some local LLM servers).
 ====
 
+==== OAuth Authentication
+
+When using an identity provider (e.g., Azure AD for Azure OpenAI), set the `oauthProfile` parameter to acquire an access token via the OAuth 2.0 Client Credentials grant. The token is used in place of the API key. This requires `camel-oauth` on the classpath.
+
+[source,properties]
+----
+camel.oauth.azure.client-id=my-client
+camel.oauth.azure.client-secret=my-secret
+camel.oauth.azure.token-endpoint=https://login.microsoftonline.com/tenant/oauth2/v2.0/token
+camel.oauth.azure.scope=https://cognitiveservices.azure.com/.default
+----
+
+[source,java]
+----
+from("direct:chat")
+    .to("openai:chat-completion?model=gpt-4&oauthProfile=azure");
+----
+
+MCP servers can also use OAuth independently via per-server `oauthProfile`:
+
+[source,java]
+----
+from("direct:chat")
+    .to("openai:chat-completion?model=gpt-4"
+        + "&oauthProfile=azure"
+        + "&mcpServer.tools.transportType=streamableHttp"
+        + "&mcpServer.tools.url=https://mcp.internal/mcp"
+        + "&mcpServer.tools.oauthProfile=keycloak");
+----
+
 === Basic Chat Completion with String Input
 
 [tabs]
diff --git a/components/camel-ai/camel-openai/src/main/java/org/apache/camel/component/openai/OpenAIConfiguration.java b/components/camel-ai/camel-openai/src/main/java/org/apache/camel/component/openai/OpenAIConfiguration.java
index abdb908150a3..6cb9bea4943c 100644
--- a/components/camel-ai/camel-openai/src/main/java/org/apache/camel/component/openai/OpenAIConfiguration.java
+++ b/components/camel-ai/camel-openai/src/main/java/org/apache/camel/component/openai/OpenAIConfiguration.java
@@ -33,6 +33,14 @@ public class OpenAIConfiguration implements Cloneable {
     @Metadata(description = "OpenAI API key. Can also be set via OPENAI_API_KEY environment variable.", secret = true)
     private String apiKey;
 
+    @UriParam(label = "security")
+    @Metadata(description = "OAuth profile name for obtaining an access token via the OAuth 2.0 Client Credentials grant. "
+                            + "When set, the token is acquired from the configured identity provider and used instead of apiKey. "
+                            + "Requires camel-oauth on the classpath. The profile properties are resolved from "
+                            + "camel.oauth.<profileName>.client-id, camel.oauth.<profileName>.client-secret, "
+                            + "and camel.oauth.<profileName>.token-endpoint.")
+    private String oauthProfile;
+
     @UriParam
     @Metadata(description = "Base URL for OpenAI API. Defaults to OpenAI's official endpoint. Can be used for local or third-party providers.",
               defaultValue = ClientOptions.PRODUCTION_URL)
@@ -100,7 +108,8 @@ public class OpenAIConfiguration implements Cloneable {
     @Metadata(description = "MCP (Model Context Protocol) server configurations. "
                             + "Define servers using prefix notation: mcpServer.<name>.transportType=stdio|sse|streamableHttp, "
                             + "mcpServer.<name>.command=<cmd> (stdio), mcpServer.<name>.args=<comma-separated> (stdio), "
-                            + "mcpServer.<name>.url=<url> (sse/streamableHttp)")
+                            + "mcpServer.<name>.url=<url> (sse/streamableHttp), "
+                            + "mcpServer.<name>.oauthProfile=<profile> (OAuth profile for HTTP auth, requires camel-oauth)")
     private Map<String, Object> mcpServer;
 
     @UriParam(defaultValue = "50")
@@ -151,6 +160,14 @@ public class OpenAIConfiguration implements Cloneable {
         this.apiKey = apiKey;
     }
 
+    public String getOauthProfile() {
+        return oauthProfile;
+    }
+
+    public void setOauthProfile(String oauthProfile) {
+        this.oauthProfile = oauthProfile;
+    }
+
     public String getBaseUrl() {
         return baseUrl;
     }
diff --git a/components/camel-ai/camel-openai/src/main/java/org/apache/camel/component/openai/OpenAIEndpoint.java b/components/camel-ai/camel-openai/src/main/java/org/apache/camel/component/openai/OpenAIEndpoint.java
index 51dd5eba7689..eac39672e95d 100644
--- a/components/camel-ai/camel-openai/src/main/java/org/apache/camel/component/openai/OpenAIEndpoint.java
+++ b/components/camel-ai/camel-openai/src/main/java/org/apache/camel/component/openai/OpenAIEndpoint.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.openai;
 
+import java.net.http.HttpRequest;
 import java.time.Duration;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -46,6 +47,7 @@ import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
 import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.support.OAuthHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -132,7 +134,7 @@ public class OpenAIEndpoint extends DefaultEndpoint {
         super.doStop();
     }
 
-    private void initializeMcpServers() {
+    private void initializeMcpServers() throws Exception {
         Map<String, Object> mcpServerConfig = configuration.getMcpServer();
         if (mcpServerConfig == null || mcpServerConfig.isEmpty()) {
             LOG.debug("No MCP server configuration found, skipping MCP initialization");
@@ -200,7 +202,17 @@ public class OpenAIEndpoint extends DefaultEndpoint {
         }
     }
 
-    private McpClientTransport createMcpTransport(String serverName, String transportType, Map<String, String> props) {
+    private McpClientTransport createMcpTransport(String serverName, String transportType, Map<String, String> props)
+            throws Exception {
+        // Resolve per-server OAuth token if configured
+        String mcpOauthProfile = props.get("oauthProfile");
+        HttpRequest.Builder authRequestBuilder = null;
+        if (ObjectHelper.isNotEmpty(mcpOauthProfile)) {
+            String token = OAuthHelper.resolveOAuthToken(getCamelContext(), mcpOauthProfile);
+            authRequestBuilder = HttpRequest.newBuilder()
+                    .header("Authorization", "Bearer " + token);
+        }
+
         return switch (transportType) {
             case "stdio" -> {
                 String command = props.get("command");
@@ -219,7 +231,11 @@ public class OpenAIEndpoint extends DefaultEndpoint {
                 if (url == null) {
                     throw new IllegalArgumentException("mcpServer." + serverName + ".url is required for sse transport");
                 }
-                yield HttpClientSseClientTransport.builder(url).build();
+                HttpClientSseClientTransport.Builder sseBuilder = HttpClientSseClientTransport.builder(url);
+                if (authRequestBuilder != null) {
+                    sseBuilder.requestBuilder(authRequestBuilder);
+                }
+                yield sseBuilder.build();
             }
             case "streamableHttp" -> {
                 String url = props.get("url");
@@ -233,6 +249,9 @@ public class OpenAIEndpoint extends DefaultEndpoint {
                 if (protocolVersions != null) {
                     transportBuilder.supportedProtocolVersions(protocolVersions);
                 }
+                if (authRequestBuilder != null) {
+                    transportBuilder.requestBuilder(authRequestBuilder);
+                }
                 yield transportBuilder.build();
             }
             default -> throw new IllegalArgumentException(
@@ -339,7 +358,7 @@ public class OpenAIEndpoint extends DefaultEndpoint {
         }
     }
 
-    protected OpenAIClient createClient() {
+    protected OpenAIClient createClient() throws Exception {
         String apiKey = resolveApiKey();
 
         OpenAIOkHttpClient.Builder builder = OpenAIOkHttpClient.builder();
@@ -353,12 +372,17 @@ public class OpenAIEndpoint extends DefaultEndpoint {
         return builder.build();
     }
 
-    protected String resolveApiKey() {
-        // Priority: URI parameter > component config > environment variable > application.properties
+    protected String resolveApiKey() throws Exception {
+        // Priority: URI parameter > OAuth profile > environment variable > system property
         if (ObjectHelper.isNotEmpty(configuration.getApiKey())) {
             return configuration.getApiKey();
         }
 
+        // Try OAuth profile if configured
+        if (ObjectHelper.isNotEmpty(configuration.getOauthProfile())) {
+            return resolveOAuthToken();
+        }
+
         String envApiKey = System.getenv("OPENAI_API_KEY");
         if (ObjectHelper.isNotEmpty(envApiKey)) {
             return envApiKey;
@@ -367,6 +391,10 @@ public class OpenAIEndpoint extends DefaultEndpoint {
         return System.getProperty("openai.api.key");
     }
 
+    private String resolveOAuthToken() throws Exception {
+        return OAuthHelper.resolveOAuthToken(getCamelContext(), configuration.getOauthProfile());
+    }
+
     public String getOperation() {
         return operation;
     }
diff --git a/components/camel-ibm/camel-ibm-watsonx-ai/src/generated/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiComponentConfigurer.java b/components/camel-ibm/camel-ibm-watsonx-ai/src/generated/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiComponentConfigurer.java
index 6997242ae8f4..7da3bc7df3ec 100644
--- a/components/camel-ibm/camel-ibm-watsonx-ai/src/generated/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiComponentConfigurer.java
+++ b/components/camel-ibm/camel-ibm-watsonx-ai/src/generated/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiComponentConfigurer.java
@@ -65,6 +65,8 @@ public class WatsonxAiComponentConfigurer extends PropertyConfigurerSupport impl
         case "maxNewTokens": getOrCreateConfiguration(target).setMaxNewTokens(property(camelContext, java.lang.Integer.class, value)); return true;
         case "modelid":
         case "modelId": getOrCreateConfiguration(target).setModelId(property(camelContext, java.lang.String.class, value)); return true;
+        case "oauthprofile":
+        case "oauthProfile": getOrCreateConfiguration(target).setOauthProfile(property(camelContext, java.lang.String.class, value)); return true;
         case "operation": getOrCreateConfiguration(target).setOperation(property(camelContext, org.apache.camel.component.ibm.watsonx.ai.WatsonxAiOperations.class, value)); return true;
         case "presencepenalty":
         case "presencePenalty": getOrCreateConfiguration(target).setPresencePenalty(property(camelContext, java.lang.Double.class, value)); return true;
@@ -136,6 +138,8 @@ public class WatsonxAiComponentConfigurer extends PropertyConfigurerSupport impl
         case "maxNewTokens": return java.lang.Integer.class;
         case "modelid":
         case "modelId": return java.lang.String.class;
+        case "oauthprofile":
+        case "oauthProfile": return java.lang.String.class;
         case "operation": return org.apache.camel.component.ibm.watsonx.ai.WatsonxAiOperations.class;
         case "presencepenalty":
         case "presencePenalty": return java.lang.Double.class;
@@ -208,6 +212,8 @@ public class WatsonxAiComponentConfigurer extends PropertyConfigurerSupport impl
         case "maxNewTokens": return getOrCreateConfiguration(target).getMaxNewTokens();
         case "modelid":
         case "modelId": return getOrCreateConfiguration(target).getModelId();
+        case "oauthprofile":
+        case "oauthProfile": return getOrCreateConfiguration(target).getOauthProfile();
         case "operation": return getOrCreateConfiguration(target).getOperation();
         case "presencepenalty":
         case "presencePenalty": return getOrCreateConfiguration(target).getPresencePenalty();
diff --git a/components/camel-ibm/camel-ibm-watsonx-ai/src/generated/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiEndpointConfigurer.java b/components/camel-ibm/camel-ibm-watsonx-ai/src/generated/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiEndpointConfigurer.java
index d0a02af4d349..09741ad5a6b8 100644
--- a/components/camel-ibm/camel-ibm-watsonx-ai/src/generated/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiEndpointConfigurer.java
+++ b/components/camel-ibm/camel-ibm-watsonx-ai/src/generated/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiEndpointConfigurer.java
@@ -55,6 +55,8 @@ public class WatsonxAiEndpointConfigurer extends PropertyConfigurerSupport imple
         case "maxNewTokens": target.getConfiguration().setMaxNewTokens(property(camelContext, java.lang.Integer.class, value)); return true;
         case "modelid":
         case "modelId": target.getConfiguration().setModelId(property(camelContext, java.lang.String.class, value)); return true;
+        case "oauthprofile":
+        case "oauthProfile": target.getConfiguration().setOauthProfile(property(camelContext, java.lang.String.class, value)); return true;
         case "operation": target.getConfiguration().setOperation(property(camelContext, org.apache.camel.component.ibm.watsonx.ai.WatsonxAiOperations.class, value)); return true;
         case "presencepenalty":
         case "presencePenalty": target.getConfiguration().setPresencePenalty(property(camelContext, java.lang.Double.class, value)); return true;
@@ -123,6 +125,8 @@ public class WatsonxAiEndpointConfigurer extends PropertyConfigurerSupport imple
         case "maxNewTokens": return java.lang.Integer.class;
         case "modelid":
         case "modelId": return java.lang.String.class;
+        case "oauthprofile":
+        case "oauthProfile": return java.lang.String.class;
         case "operation": return org.apache.camel.component.ibm.watsonx.ai.WatsonxAiOperations.class;
         case "presencepenalty":
         case "presencePenalty": return java.lang.Double.class;
@@ -192,6 +196,8 @@ public class WatsonxAiEndpointConfigurer extends PropertyConfigurerSupport imple
         case "maxNewTokens": return target.getConfiguration().getMaxNewTokens();
         case "modelid":
         case "modelId": return target.getConfiguration().getModelId();
+        case "oauthprofile":
+        case "oauthProfile": return target.getConfiguration().getOauthProfile();
         case "operation": return target.getConfiguration().getOperation();
         case "presencepenalty":
         case "presencePenalty": return target.getConfiguration().getPresencePenalty();
diff --git a/components/camel-ibm/camel-ibm-watsonx-ai/src/generated/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiEndpointUriFactory.java b/components/camel-ibm/camel-ibm-watsonx-ai/src/generated/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiEndpointUriFactory.java
index 075c59f863bf..c76cae91f622 100644
--- a/components/camel-ibm/camel-ibm-watsonx-ai/src/generated/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiEndpointUriFactory.java
+++ b/components/camel-ibm/camel-ibm-watsonx-ai/src/generated/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiEndpointUriFactory.java
@@ -23,7 +23,7 @@ public class WatsonxAiEndpointUriFactory extends org.apache.camel.support.compon
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Map<String, String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(33);
+        Set<String> props = new HashSet<>(34);
         props.add("apiKey");
         props.add("baseUrl");
         props.add("cosUrl");
@@ -41,6 +41,7 @@ public class WatsonxAiEndpointUriFactory extends org.apache.camel.support.compon
         props.add("maxCompletionTokens");
         props.add("maxNewTokens");
         props.add("modelId");
+        props.add("oauthProfile");
         props.add("operation");
         props.add("presencePenalty");
         props.add("projectId");
diff --git a/components/camel-ibm/camel-ibm-watsonx-ai/src/generated/resources/META-INF/org/apache/camel/component/ibm/watsonx/ai/ibm-watsonx-ai.json b/components/camel-ibm/camel-ibm-watsonx-ai/src/generated/resources/META-INF/org/apache/camel/component/ibm/watsonx/ai/ibm-watsonx-ai.json
index 9a6d7e156fff..044e614b3860 100644
--- a/components/camel-ibm/camel-ibm-watsonx-ai/src/generated/resources/META-INF/org/apache/camel/component/ibm/watsonx/ai/ibm-watsonx-ai.json
+++ b/components/camel-ibm/camel-ibm-watsonx-ai/src/generated/resources/META-INF/org/apache/camel/component/ibm/watsonx/ai/ibm-watsonx-ai.json
@@ -57,7 +57,8 @@
     "logResponses": { "index": 30, "kind": "property", "displayName": "Log Responses", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "Whether to log HTTP responses from the watsonx.ai API" },
     "timeout": { "index": 31, "kind": "property", "displayName": "Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Long", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "Request timeout in milliseconds" },
     "verifySsl": { "index": 32, "kind": "property", "displayName": "Verify Ssl", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "Whether to verify SSL certificates" },
-    "apiKey": { "index": 33, "kind": "property", "displayName": "Api Key", "group": "security", "label": "security", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "IBM Cloud API key for authentication" }
+    "apiKey": { "index": 33, "kind": "property", "displayName": "Api Key", "group": "security", "label": "security", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "IBM Cloud API key for authentication" },
+    "oauthProfile": { "index": 34, "kind": "property", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 Client Credentials grant [...]
   },
   "headers": {
     "CamelIBMWatsonxAiOperation": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "WatsonxAiOperations", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform", "constantName": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConstants#OPERATION" },
@@ -159,6 +160,7 @@
     "logResponses": { "index": 29, "kind": "parameter", "displayName": "Log Responses", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "Whether to log HTTP responses from the watsonx.ai API" },
     "timeout": { "index": 30, "kind": "parameter", "displayName": "Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Long", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "Request timeout in milliseconds" },
     "verifySsl": { "index": 31, "kind": "parameter", "displayName": "Verify Ssl", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "Whether to verify SSL certificates" },
-    "apiKey": { "index": 32, "kind": "parameter", "displayName": "Api Key", "group": "security", "label": "security", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "IBM Cloud API key for authentication" }
+    "apiKey": { "index": 32, "kind": "parameter", "displayName": "Api Key", "group": "security", "label": "security", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "IBM Cloud API key for authentication" },
+    "oauthProfile": { "index": 33, "kind": "parameter", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.ibm.watsonx.ai.WatsonxAiConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 Client Credentials gran [...]
   }
 }
diff --git a/components/camel-ibm/camel-ibm-watsonx-ai/src/main/docs/ibm-watsonx-ai-component.adoc b/components/camel-ibm/camel-ibm-watsonx-ai/src/main/docs/ibm-watsonx-ai-component.adoc
index 626898dcc3ef..59fa1c335f28 100644
--- a/components/camel-ibm/camel-ibm-watsonx-ai/src/main/docs/ibm-watsonx-ai-component.adoc
+++ b/components/camel-ibm/camel-ibm-watsonx-ai/src/main/docs/ibm-watsonx-ai-component.adoc
@@ -61,6 +61,23 @@ You must provide the following options to use this component:
 * (optional) `documentConnectionId`, `documentBucket`, `cosUrl` - needed by services like `textExtraction` or `textClassification`
 * (optional) `wxUrl` - For hosted IBM tools
 
+== OAuth Authentication
+
+When using an identity provider for service-to-service authentication instead of a static API key, set the `oauthProfile` parameter to acquire an access token via the OAuth 2.0 Client Credentials grant. The token is used as the `apiKey`. This requires `camel-oauth` on the classpath.
+
+[source,properties]
+----
+camel.oauth.ibm.client-id=my-client
+camel.oauth.ibm.client-secret=my-secret
+camel.oauth.ibm.token-endpoint=https://iam.cloud.ibm.com/identity/token
+----
+
+[source,java]
+----
+from("direct:generate")
+    .to("ibm-watsonx-ai:myLabel?oauthProfile=ibm&baseUrl=https://us-south.ml.cloud.ibm.com&projectId=my-project&modelId=ibm/granite-13b-instruct-v2");
+----
+
 == Security Considerations
 
 === Sensitive Data Logging
diff --git a/components/camel-ibm/camel-ibm-watsonx-ai/src/main/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiConfiguration.java b/components/camel-ibm/camel-ibm-watsonx-ai/src/main/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiConfiguration.java
index 4241b9a33786..d4d9c777c900 100644
--- a/components/camel-ibm/camel-ibm-watsonx-ai/src/main/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiConfiguration.java
+++ b/components/camel-ibm/camel-ibm-watsonx-ai/src/main/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiConfiguration.java
@@ -32,6 +32,12 @@ public class WatsonxAiConfiguration implements Cloneable {
     @Metadata(required = true)
     private String apiKey;
 
+    @UriParam(label = "security",
+              description = "OAuth profile name for obtaining an access token via the OAuth 2.0 Client Credentials grant. "
+                            + "When set, the token is acquired from the configured identity provider and used as apiKey. "
+                            + "Requires camel-oauth on the classpath.")
+    private String oauthProfile;
+
     // Connection
     @UriParam(label = "common", description = "The watsonx.ai base URL (e.g., https://us-south.ml.cloud.ibm.com)")
     @Metadata(required = true)
@@ -154,6 +160,14 @@ public class WatsonxAiConfiguration implements Cloneable {
         this.apiKey = apiKey;
     }
 
+    public String getOauthProfile() {
+        return oauthProfile;
+    }
+
+    public void setOauthProfile(String oauthProfile) {
+        this.oauthProfile = oauthProfile;
+    }
+
     public String getBaseUrl() {
         return baseUrl;
     }
diff --git a/components/camel-ibm/camel-ibm-watsonx-ai/src/main/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiEndpoint.java b/components/camel-ibm/camel-ibm-watsonx-ai/src/main/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiEndpoint.java
index e9b8fc9b79cd..9e7dd64eb981 100644
--- a/components/camel-ibm/camel-ibm-watsonx-ai/src/main/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiEndpoint.java
+++ b/components/camel-ibm/camel-ibm-watsonx-ai/src/main/java/org/apache/camel/component/ibm/watsonx/ai/WatsonxAiEndpoint.java
@@ -39,6 +39,8 @@ import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
 import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.support.OAuthHelper;
+import org.apache.camel.util.ObjectHelper;
 
 /**
  * Interact with IBM watsonx.ai foundation models for text generation, chat, embeddings, and more.
@@ -91,9 +93,17 @@ public class WatsonxAiEndpoint extends DefaultEndpoint implements EndpointServic
     @Override
     protected void doStart() throws Exception {
         super.doStart();
+        resolveOAuthToken();
         validateConfiguration();
     }
 
+    private void resolveOAuthToken() throws Exception {
+        if (ObjectHelper.isEmpty(configuration.getOauthProfile())) {
+            return;
+        }
+        configuration.setApiKey(OAuthHelper.resolveOAuthToken(getCamelContext(), configuration.getOauthProfile()));
+    }
+
     @Override
     protected void doStop() throws Exception {
         super.doStop();
diff --git a/components/camel-oauth/src/generated/resources/META-INF/services/org/apache/camel/oauth-client-authentication-factory b/components/camel-oauth/src/generated/resources/META-INF/services/org/apache/camel/oauth-client-authentication-factory
new file mode 100644
index 000000000000..07f480dc9be7
--- /dev/null
+++ b/components/camel-oauth/src/generated/resources/META-INF/services/org/apache/camel/oauth-client-authentication-factory
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.oauth.DefaultOAuthClientAuthenticationFactory
diff --git a/components/camel-oauth/src/main/docs/oauth.adoc b/components/camel-oauth/src/main/docs/oauth.adoc
index 9b4d4ac5646b..08b9717e10c2 100644
--- a/components/camel-oauth/src/main/docs/oauth.adoc
+++ b/components/camel-oauth/src/main/docs/oauth.adoc
@@ -14,7 +14,7 @@ These processors intercept the message flow and perform the necessary authentica
 
 The idea is that a "Resource Owner" can give a "User Agent" access to some protected resources without sharing credentials directly with the agent.
 
-For example, Alice has an account with Spotify and now wishes to use a cool service from Acme which compiles a daily playlist according based on Alice's preferences. Instead of giving Acme her Spotify credentials (i.e. username/password) directly, Acme can obtain an access token from an Identity Provider that encodes the scope and duration for Acme to access Alice's Spotify account. Alice can revoke access any time - Acme never sees more information thant waht Alice has granted and is ne [...]
+For example, Alice has an account with Spotify and now wishes to use a cool service from Acme which compiles a daily playlist according based on Alice's preferences. Instead of giving Acme her Spotify credentials (i.e. username/password) directly, Acme can obtain an access token from an Identity Provider that encodes the scope and duration for Acme to access Alice's Spotify account. Alice can revoke access any time - Acme never sees more information than what Alice has granted and is nec [...]
 
 Maven users will need to add the following dependency to their `pom.xml`
 for this component:
@@ -61,7 +61,7 @@ For details see the https://openid.net/specs/openid-connect-core-1_0.html[OIDC 1
 
 A client can request an access token using only the client id and secret shared with the identity provider.
 
-This code flow suitable for fully automated authorization for example in the case of REST based service interaction.
+This flow is suitable for fully automated authorization, for example in the case of REST based service interaction.
 
 For details see the https://datatracker.ietf.org/doc/html/rfc6749#section-4.4[OAuth 2.0] spec.
 
@@ -78,6 +78,102 @@ For details see the https://datatracker.ietf.org/doc/html/rfc6749#section-4.4[OA
 |`camel.oauth.client-secret` |The client secret provided by the identity provider.
 |===
 
+== OAuth SPI for Component Integration
+
+The camel-oauth module provides an SPI (`OAuthClientAuthenticationFactory`) that allows other Camel components to use OAuth Client Credentials authentication without a compile-time dependency on camel-oauth. Components discover the factory at runtime via Camel's FactoryFinder mechanism. If camel-oauth is not on the classpath, a clear error message instructs the user to add it.
+
+Components that support this integration include: camel-openai, camel-huggingface, camel-docling and camel-ibm-watsonx-ai. Each of these components exposes an `oauthProfile` parameter.
+
+=== Named Profiles (Multiple Identity Providers)
+
+Named profiles allow configuring multiple identity providers in a single application. Each profile is identified by a name and has its own set of properties.
+
+==== Configuration Properties
+
+Properties are resolved from `camel.oauth.<profileName>.*`:
+
+[width="100%",cols="10%,10%,80%",options="header",]
+|===
+|Name |Required |Description
+
+|`camel.oauth.<profile>.client-id` |Yes |The client identifier registered with the identity provider.
+
+|`camel.oauth.<profile>.client-secret` |Yes |The client secret provided by the identity provider.
+
+|`camel.oauth.<profile>.token-endpoint` |Yes |The OAuth 2.0 token endpoint URL.
+
+|`camel.oauth.<profile>.scope` |No |The OAuth 2.0 scope to request.
+
+|`camel.oauth.<profile>.cache-tokens` |No |Whether to cache tokens. Default: `true`.
+
+|`camel.oauth.<profile>.cached-tokens-default-expiry-seconds` |No |Default token expiry if `expires_in` is not in the response. Default: `3600`.
+
+|`camel.oauth.<profile>.cached-tokens-expiration-margin-seconds` |No |Safety margin subtracted from token expiry to refresh early. Default: `5`.
+|===
+
+==== Example: Multiple Identity Providers
+
+[source,properties]
+----
+# Keycloak for backend services
+camel.oauth.keycloak.client-id=backend-client
+camel.oauth.keycloak.client-secret=backend-secret
+camel.oauth.keycloak.token-endpoint=https://keycloak.example.com/realms/main/protocol/openid-connect/token
+
+# Azure AD for OpenAI
+camel.oauth.azure.client-id=openai-client
+camel.oauth.azure.client-secret=openai-secret
+camel.oauth.azure.token-endpoint=https://login.microsoftonline.com/tenant/oauth2/v2.0/token
+camel.oauth.azure.scope=https://cognitiveservices.azure.com/.default
+----
+
+Components reference a profile by name via the `oauthProfile` parameter:
+
+[source,yaml]
+----
+- route:
+    from:
+      uri: "direct:start"
+    steps:
+      - to:
+          uri: "openai:chat-completion"
+          parameters:
+            model: "gpt-4"
+            oauthProfile: "azure"
+----
+
+=== Using the SPI Programmatically
+
+Components and custom code can use the `OAuthHelper` utility from `camel-support`:
+
+[source,java]
+----
+import org.apache.camel.support.OAuthHelper;
+
+// Resolve a token from a named profile
+String token = OAuthHelper.resolveOAuthToken(camelContext, "keycloak");
+----
+
+For advanced use cases, the `OAuthClientAuthenticationFactory` can be used directly with an explicit `OAuthClientConfig`:
+
+[source,java]
+----
+import org.apache.camel.spi.OAuthClientAuthenticationFactory;
+import org.apache.camel.spi.OAuthClientConfig;
+import org.apache.camel.support.ResolverHelper;
+
+OAuthClientAuthenticationFactory factory = ResolverHelper.resolveService(
+        context, OAuthClientAuthenticationFactory.FACTORY,
+        OAuthClientAuthenticationFactory.class)
+    .orElseThrow(() -> new IllegalArgumentException("Add camel-oauth to the classpath"));
+
+String token = factory.resolveToken(
+    new OAuthClientConfig()
+        .setClientId("my-client")
+        .setClientSecret("my-secret")
+        .setTokenEndpoint("https://idp.example.com/token"));
+----
+
 == Trusted Certificates
 
 Naturally, we want all communication between camel and the identity provider to be secured at the transport layer (TLS). For this, the Camel service need's to trust the identity provider's certificate.
diff --git a/components/camel-oauth/src/main/java/org/apache/camel/oauth/DefaultOAuthClientAuthenticationFactory.java b/components/camel-oauth/src/main/java/org/apache/camel/oauth/DefaultOAuthClientAuthenticationFactory.java
new file mode 100644
index 000000000000..4e6f3d686c7b
--- /dev/null
+++ b/components/camel-oauth/src/main/java/org/apache/camel/oauth/DefaultOAuthClientAuthenticationFactory.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.oauth;
+
+import java.util.Optional;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.OAuthClientAuthenticationFactory;
+import org.apache.camel.spi.OAuthClientConfig;
+import org.apache.camel.spi.annotations.JdkService;
+
+/**
+ * Default implementation of {@link OAuthClientAuthenticationFactory} that resolves OAuth 2.0 bearer tokens using the
+ * Client Credentials grant.
+ * <p/>
+ * Delegates token acquisition and caching to {@link OAuthClientCredentialsTokenResolver}.
+ */
+@JdkService(OAuthClientAuthenticationFactory.FACTORY)
+public class DefaultOAuthClientAuthenticationFactory implements OAuthClientAuthenticationFactory {
+
+    private final OAuthClientCredentialsTokenResolver resolver = new OAuthClientCredentialsTokenResolver();
+
+    @Override
+    public String resolveToken(OAuthClientConfig config) throws Exception {
+        validateConfig(config);
+        return resolver.resolveToken(config);
+    }
+
+    @Override
+    public String resolveToken(CamelContext context, String profileName) throws Exception {
+        OAuthClientConfig config = resolveProfileConfig(context, "camel.oauth." + profileName + ".");
+        return resolveToken(config);
+    }
+
+    @Override
+    public String resolveToken(CamelContext context) throws Exception {
+        OAuthClientConfig config = resolveProfileConfig(context, "camel.oauth.");
+        return resolveToken(config);
+    }
+
+    private OAuthClientConfig resolveProfileConfig(CamelContext context, String prefix) {
+        OAuthClientConfig config = new OAuthClientConfig();
+
+        // Required
+        config.setClientId(resolveRequiredProperty(context, prefix + "client-id"));
+        config.setClientSecret(resolveRequiredProperty(context, prefix + "client-secret"));
+        config.setTokenEndpoint(resolveRequiredProperty(context, prefix + "token-endpoint"));
+
+        // Optional
+        resolveOptionalProperty(context, prefix + "scope")
+                .ifPresent(config::setScope);
+        resolveOptionalProperty(context, prefix + "cache-tokens")
+                .map(Boolean::parseBoolean)
+                .ifPresent(config::setCacheTokens);
+        resolveOptionalProperty(context, prefix + "cached-tokens-default-expiry-seconds")
+                .map(Long::parseLong)
+                .ifPresent(config::setCachedTokensDefaultExpirySeconds);
+        resolveOptionalProperty(context, prefix + "cached-tokens-expiration-margin-seconds")
+                .map(Long::parseLong)
+                .ifPresent(config::setCachedTokensExpirationMarginSeconds);
+
+        return config;
+    }
+
+    private String resolveRequiredProperty(CamelContext ctx, String key) {
+        return resolveOptionalProperty(ctx, key)
+                .orElseThrow(() -> new IllegalArgumentException("Required OAuth property not found: " + key));
+    }
+
+    private Optional<String> resolveOptionalProperty(CamelContext ctx, String key) {
+        return ctx.getPropertiesComponent().resolveProperty(key);
+    }
+
+    private void validateConfig(OAuthClientConfig config) {
+        if (config.getClientId() == null || config.getClientId().isBlank()) {
+            throw new IllegalArgumentException("OAuth clientId is required");
+        }
+        if (config.getClientSecret() == null || config.getClientSecret().isBlank()) {
+            throw new IllegalArgumentException("OAuth clientSecret is required");
+        }
+        if (config.getTokenEndpoint() == null || config.getTokenEndpoint().isBlank()) {
+            throw new IllegalArgumentException("OAuth tokenEndpoint is required");
+        }
+    }
+}
diff --git a/components/camel-oauth/src/main/java/org/apache/camel/oauth/OAuthClientCredentialsTokenResolver.java b/components/camel-oauth/src/main/java/org/apache/camel/oauth/OAuthClientCredentialsTokenResolver.java
new file mode 100644
index 000000000000..74ce15db46ce
--- /dev/null
+++ b/components/camel-oauth/src/main/java/org/apache/camel/oauth/OAuthClientCredentialsTokenResolver.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.oauth;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import com.google.gson.JsonObject;
+import org.apache.camel.spi.OAuthClientConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Resolves OAuth 2.0 bearer tokens using the client_credentials grant with thread-safe caching.
+ * <p/>
+ * Tokens are cached per (tokenEndpoint, clientId) pair using {@link UserProfile} for expiry tracking. This class
+ * contains no Processor or Exchange dependencies — it is a pure token resolver.
+ */
+public class OAuthClientCredentialsTokenResolver {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OAuthClientCredentialsTokenResolver.class);
+
+    private static final ConcurrentMap<TokenCacheKey, UserProfile> TOKEN_CACHE = new ConcurrentHashMap<>();
+
+    /**
+     * Resolves a bearer token for the given config. Uses caching if enabled.
+     *
+     * @param  config the OAuth client configuration
+     * @return        the access token string
+     */
+    public String resolveToken(OAuthClientConfig config) {
+        UserProfile profile;
+
+        if (config.isCacheTokens()) {
+            TokenCacheKey cacheKey = new TokenCacheKey(config.getTokenEndpoint(), config.getClientId());
+            long margin = config.getCachedTokensExpirationMarginSeconds();
+            profile = TOKEN_CACHE.compute(cacheKey, (key, existing) -> {
+                if (existing != null && existing.ttl() > margin) {
+                    return existing;
+                }
+                return acquireToken(config);
+            });
+        } else {
+            profile = acquireToken(config);
+        }
+
+        return profile.accessToken()
+                .orElseThrow(() -> new OAuthException("No access_token in token response"));
+    }
+
+    private UserProfile acquireToken(OAuthClientConfig config) {
+        JsonObject json = OAuthTokenRequest.clientCredentialsGrant(
+                config.getTokenEndpoint(),
+                config.getClientId(),
+                config.getClientSecret(),
+                config.getScope());
+
+        UserProfile profile = UserProfile.fromTokenResponse(json);
+        LOG.debug("Acquired OAuth token from {}, ttl {}s", config.getTokenEndpoint(), profile.ttl());
+        return profile;
+    }
+
+    record TokenCacheKey(String tokenEndpoint, String clientId) {
+    }
+}
diff --git a/components/camel-oauth/src/main/java/org/apache/camel/oauth/OAuthTokenRequest.java b/components/camel-oauth/src/main/java/org/apache/camel/oauth/OAuthTokenRequest.java
new file mode 100644
index 000000000000..c5fa8f8e0fb7
--- /dev/null
+++ b/components/camel-oauth/src/main/java/org/apache/camel/oauth/OAuthTokenRequest.java
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.oauth;
+
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Base64;
+import java.util.List;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import org.apache.hc.client5.http.fluent.Request;
+import org.apache.hc.core5.http.message.BasicNameValuePair;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Shared utility for making OAuth 2.0 token requests using the client_credentials grant.
+ * <p/>
+ * Used by both {@link OAuthClientCredentialsProcessor} (SPI path) and
+ * {@link org.apache.camel.oauth.jakarta.ServletOAuth} (full OIDC path) to avoid duplicating HTTP POST logic.
+ */
+public final class OAuthTokenRequest {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OAuthTokenRequest.class);
+
+    private OAuthTokenRequest() {
+    }
+
+    /**
+     * Acquires an access token using the OAuth 2.0 Client Credentials grant.
+     *
+     * @param  tokenEndpoint  the token endpoint URL
+     * @param  clientId       the client identifier
+     * @param  clientSecret   the client secret
+     * @param  scope          the requested scope (may be null)
+     * @return                the parsed JSON response containing access_token, expires_in, etc.
+     * @throws OAuthException if the token request fails
+     */
+    public static JsonObject clientCredentialsGrant(
+            String tokenEndpoint, String clientId, String clientSecret, String scope) {
+        try {
+            String auth = clientId + ":" + clientSecret;
+            String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.UTF_8));
+
+            Request request = Request.post(tokenEndpoint)
+                    .addHeader("Content-Type", "application/x-www-form-urlencoded")
+                    .addHeader("Authorization", "Basic " + encodedAuth);
+
+            List<BasicNameValuePair> params = new ArrayList<>();
+            params.add(new BasicNameValuePair("grant_type", "client_credentials"));
+            if (scope != null && !scope.isBlank()) {
+                params.add(new BasicNameValuePair("scope", scope));
+            }
+            request.bodyForm(params.toArray(new BasicNameValuePair[0]));
+
+            String content = request.execute().returnContent().asString();
+            LOG.debug("Token response from {}", tokenEndpoint);
+            return JsonParser.parseString(content).getAsJsonObject();
+        } catch (Exception e) {
+            throw new OAuthException("Failed to acquire OAuth token from " + tokenEndpoint, e);
+        }
+    }
+
+    /**
+     * Refreshes an access token using the refresh_token grant.
+     *
+     * @param  tokenEndpoint  the token endpoint URL
+     * @param  clientId       the client identifier
+     * @param  clientSecret   the client secret
+     * @param  refreshToken   the refresh token
+     * @return                the parsed JSON response containing the new access_token
+     * @throws OAuthException if the refresh request fails
+     */
+    public static JsonObject refreshTokenGrant(
+            String tokenEndpoint, String clientId, String clientSecret, String refreshToken) {
+        try {
+            String auth = clientId + ":" + clientSecret;
+            String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.UTF_8));
+
+            String content = Request.post(tokenEndpoint)
+                    .addHeader("Content-Type", "application/x-www-form-urlencoded")
+                    .addHeader("Authorization", "Basic " + encodedAuth)
+                    .bodyForm(
+                            new BasicNameValuePair("grant_type", "refresh_token"),
+                            new BasicNameValuePair("token", refreshToken))
+                    .execute().returnContent().asString();
+
+            LOG.debug("Refresh token response from {}", tokenEndpoint);
+            return JsonParser.parseString(content).getAsJsonObject();
+        } catch (Exception e) {
+            throw new OAuthException("Failed to refresh OAuth token from " + tokenEndpoint, e);
+        }
+    }
+}
diff --git a/components/camel-oauth/src/main/java/org/apache/camel/oauth/UserProfile.java b/components/camel-oauth/src/main/java/org/apache/camel/oauth/UserProfile.java
index 06c756ad2eda..9e9524ba2d9c 100644
--- a/components/camel-oauth/src/main/java/org/apache/camel/oauth/UserProfile.java
+++ b/components/camel-oauth/src/main/java/org/apache/camel/oauth/UserProfile.java
@@ -44,6 +44,22 @@ public class UserProfile {
         this.attributes = attributes;
     }
 
+    /**
+     * Creates a UserProfile from a token endpoint response without JWT verification. Suitable for the SPI path where
+     * the response comes directly from a trusted token endpoint via client_credentials grant.
+     */
+    public static UserProfile fromTokenResponse(JsonObject json) {
+        var principal = json.deepCopy();
+        var attributes = new JsonObject();
+        long now = System.currentTimeMillis() / 1000L;
+        if (principal.has("expires_in")) {
+            var expiresIn = json.get("expires_in").getAsLong();
+            attributes.addProperty("exp", now + expiresIn);
+            attributes.addProperty("iat", now);
+        }
+        return new UserProfile(principal, attributes);
+    }
+
     public static UserProfile fromJson(OAuthConfig config, JsonObject json) {
         var principal = json.deepCopy();
         var attributes = new JsonObject();
diff --git a/components/camel-oauth/src/main/java/org/apache/camel/oauth/jakarta/ServletOAuth.java b/components/camel-oauth/src/main/java/org/apache/camel/oauth/jakarta/ServletOAuth.java
index 3c3b62ca1f1b..09446ae56c5b 100644
--- a/components/camel-oauth/src/main/java/org/apache/camel/oauth/jakarta/ServletOAuth.java
+++ b/components/camel-oauth/src/main/java/org/apache/camel/oauth/jakarta/ServletOAuth.java
@@ -37,6 +37,7 @@ import org.apache.camel.oauth.OAuthConfig;
 import org.apache.camel.oauth.OAuthException;
 import org.apache.camel.oauth.OAuthFlowType;
 import org.apache.camel.oauth.OAuthLogoutParams;
+import org.apache.camel.oauth.OAuthTokenRequest;
 import org.apache.camel.oauth.TokenCredentials;
 import org.apache.camel.oauth.UserCredentials;
 import org.apache.camel.oauth.UserProfile;
@@ -191,21 +192,14 @@ public class ServletOAuth extends OAuth {
         var userProfile = creds.getUserProfile();
         if (userProfile.expired() && userProfile.refreshToken().isPresent()) {
 
-            // Encode username and password in Base64 for Basic Auth
-            String auth = config.getClientId() + ":" + config.getClientSecret();
-            String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.UTF_8));
-
             // Refreshing an Access Token
             // https://datatracker.ietf.org/doc/html/rfc6749#page-47
             var refreshToken = userProfile.refreshToken().get();
-            var content = Request.post(config.getIntrospectionPath())
-                    .addHeader("Content-Type", "application/x-www-form-urlencoded")
-                    .addHeader("Authorization", "Basic " + encodedAuth)
-                    .bodyForm(new BasicNameValuePair("grant_type", "refresh_token"),
-                            new BasicNameValuePair("token", refreshToken))
-                    .execute().returnContent().asString();
-
-            var json = JsonParser.parseString(content).getAsJsonObject();
+            var json = OAuthTokenRequest.refreshTokenGrant(
+                    config.getIntrospectionPath(),
+                    config.getClientId(),
+                    config.getClientSecret(),
+                    refreshToken);
             userProfile = UserProfile.fromJson(config, json);
         }
         if (userProfile.expired()) {
@@ -226,19 +220,11 @@ public class ServletOAuth extends OAuth {
      * https://datatracker.ietf.org/doc/html/rfc6749#section-4.4
      */
     private UserProfile authenticateClientCredentials(ClientCredentials creds) throws Exception {
-
-        // Encode username and password in Base64 for Basic Auth
-        String auth = creds.getClientId() + ":" + creds.getClientSecret();
-        String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.UTF_8));
-
-        var grantType = creds.getFlowType().getGrantType();
-        var content = Request.post(config.getTokenPath())
-                .addHeader("Content-Type", "application/x-www-form-urlencoded")
-                .addHeader("Authorization", "Basic " + encodedAuth)
-                .bodyForm(new BasicNameValuePair("grant_type", grantType))
-                .execute().returnContent().asString();
-
-        var json = JsonParser.parseString(content).getAsJsonObject();
+        var json = OAuthTokenRequest.clientCredentialsGrant(
+                config.getTokenPath(),
+                creds.getClientId(),
+                creds.getClientSecret(),
+                null);
         return UserProfile.fromJson(config, json);
     }
 
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/OAuthClientAuthenticationFactory.java b/core/camel-api/src/main/java/org/apache/camel/spi/OAuthClientAuthenticationFactory.java
new file mode 100644
index 000000000000..d9f816856f78
--- /dev/null
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/OAuthClientAuthenticationFactory.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.spi;
+
+import org.apache.camel.CamelContext;
+
+/**
+ * Factory for resolving OAuth 2.0 bearer tokens using the client_credentials grant.
+ * <p/>
+ * This requires camel-oauth on the classpath.
+ */
+public interface OAuthClientAuthenticationFactory {
+
+    /**
+     * Service factory key.
+     */
+    String FACTORY = "oauth-client-authentication-factory";
+
+    /**
+     * Resolves a bearer token using explicit configuration.
+     * <p/>
+     * Acquires a token from the configured token endpoint using the client_credentials grant. Tokens are cached if
+     * caching is enabled in the config.
+     *
+     * @param  config    the OAuth client configuration
+     * @return           the bearer token string
+     * @throws Exception if token acquisition fails
+     */
+    String resolveToken(OAuthClientConfig config) throws Exception;
+
+    /**
+     * Resolves a bearer token using a named profile from Camel properties.
+     * <p/>
+     * Properties are resolved from {@code camel.oauth.<profileName>.*}:
+     * <ul>
+     * <li>{@code camel.oauth.<profileName>.client-id} (required)</li>
+     * <li>{@code camel.oauth.<profileName>.client-secret} (required)</li>
+     * <li>{@code camel.oauth.<profileName>.token-endpoint} (required)</li>
+     * <li>{@code camel.oauth.<profileName>.scope} (optional)</li>
+     * <li>{@code camel.oauth.<profileName>.cache-tokens} (optional, default true)</li>
+     * <li>{@code camel.oauth.<profileName>.cached-tokens-default-expiry-seconds} (optional, default 3600)</li>
+     * <li>{@code camel.oauth.<profileName>.cached-tokens-expiration-margin-seconds} (optional, default 5)</li>
+     * </ul>
+     *
+     * @param  context     the CamelContext to resolve properties from
+     * @param  profileName the named profile (e.g., "keycloak", "azure")
+     * @return             the bearer token string
+     * @throws Exception   if required properties are missing or token acquisition fails
+     */
+    String resolveToken(CamelContext context, String profileName) throws Exception;
+
+    /**
+     * Resolves a bearer token using the default (unnamed) profile.
+     * <p/>
+     * Properties are resolved from {@code camel.oauth.*} directly (backward compatible with existing single-IdP
+     * configuration).
+     *
+     * @param  context   the CamelContext to resolve properties from
+     * @return           the bearer token string
+     * @throws Exception if required properties are missing or token acquisition fails
+     */
+    String resolveToken(CamelContext context) throws Exception;
+}
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/OAuthClientConfig.java b/core/camel-api/src/main/java/org/apache/camel/spi/OAuthClientConfig.java
new file mode 100644
index 000000000000..3de233754e6c
--- /dev/null
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/OAuthClientConfig.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.spi;
+
+/**
+ * Configuration for OAuth 2.0 Client Credentials grant.
+ * <p/>
+ * Used by {@link OAuthClientAuthenticationFactory} to create a {@link org.apache.camel.Processor} that acquires a
+ * bearer token and sets the {@code Authorization: Bearer <token>} header on the Exchange message.
+ */
+public class OAuthClientConfig {
+
+    private String clientId;
+    private String clientSecret;
+    private String tokenEndpoint;
+    private String scope;
+    private boolean cacheTokens = true;
+    private long cachedTokensDefaultExpirySeconds = 3600;
+    private long cachedTokensExpirationMarginSeconds = 5;
+
+    public String getClientId() {
+        return clientId;
+    }
+
+    public OAuthClientConfig setClientId(String clientId) {
+        this.clientId = clientId;
+        return this;
+    }
+
+    public String getClientSecret() {
+        return clientSecret;
+    }
+
+    public OAuthClientConfig setClientSecret(String clientSecret) {
+        this.clientSecret = clientSecret;
+        return this;
+    }
+
+    public String getTokenEndpoint() {
+        return tokenEndpoint;
+    }
+
+    public OAuthClientConfig setTokenEndpoint(String tokenEndpoint) {
+        this.tokenEndpoint = tokenEndpoint;
+        return this;
+    }
+
+    public String getScope() {
+        return scope;
+    }
+
+    public OAuthClientConfig setScope(String scope) {
+        this.scope = scope;
+        return this;
+    }
+
+    public boolean isCacheTokens() {
+        return cacheTokens;
+    }
+
+    public OAuthClientConfig setCacheTokens(boolean cacheTokens) {
+        this.cacheTokens = cacheTokens;
+        return this;
+    }
+
+    public long getCachedTokensDefaultExpirySeconds() {
+        return cachedTokensDefaultExpirySeconds;
+    }
+
+    public OAuthClientConfig setCachedTokensDefaultExpirySeconds(long cachedTokensDefaultExpirySeconds) {
+        this.cachedTokensDefaultExpirySeconds = cachedTokensDefaultExpirySeconds;
+        return this;
+    }
+
+    public long getCachedTokensExpirationMarginSeconds() {
+        return cachedTokensExpirationMarginSeconds;
+    }
+
+    public OAuthClientConfig setCachedTokensExpirationMarginSeconds(long cachedTokensExpirationMarginSeconds) {
+        this.cachedTokensExpirationMarginSeconds = cachedTokensExpirationMarginSeconds;
+        return this;
+    }
+}
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/OAuthHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/OAuthHelper.java
new file mode 100644
index 000000000000..6648c82d5328
--- /dev/null
+++ b/core/camel-support/src/main/java/org/apache/camel/support/OAuthHelper.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.support;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.OAuthClientAuthenticationFactory;
+
+/**
+ * Helper for resolving OAuth tokens via the {@link OAuthClientAuthenticationFactory} SPI.
+ * <p/>
+ * This requires camel-oauth on the classpath.
+ */
+public final class OAuthHelper {
+
+    private OAuthHelper() {
+    }
+
+    /**
+     * Resolves an OAuth bearer token using a named profile.
+     * <p/>
+     * The profile properties are resolved from {@code camel.oauth.<profileName>.*}.
+     *
+     * @param  context     the CamelContext
+     * @param  profileName the OAuth profile name
+     * @return             the bearer token string
+     * @throws Exception   if the factory is not found or token acquisition fails
+     */
+    public static String resolveOAuthToken(CamelContext context, String profileName) throws Exception {
+        OAuthClientAuthenticationFactory factory = ResolverHelper.resolveService(
+                context,
+                OAuthClientAuthenticationFactory.FACTORY,
+                OAuthClientAuthenticationFactory.class)
+                .orElseThrow(() -> new IllegalArgumentException(
+                        "Cannot find OAuthClientAuthenticationFactory. "
+                                                                + "Add camel-oauth to the classpath to use oauthProfile."));
+
+        return factory.resolveToken(context, profileName);
+    }
+}
diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/DoclingComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/DoclingComponentBuilderFactory.java
index 0f465090b60f..ddfac58453aa 100644
--- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/DoclingComponentBuilderFactory.java
+++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/DoclingComponentBuilderFactory.java
@@ -911,6 +911,24 @@ public interface DoclingComponentBuilderFactory {
             doSetProperty("maxFileSize", maxFileSize);
             return this;
         }
+    
+        /**
+         * OAuth profile name for obtaining an access token via the OAuth 2.0
+         * Client Credentials grant. When set, the token is acquired from the
+         * configured identity provider and used as authenticationToken.
+         * Requires camel-oauth on the classpath.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: security
+         * 
+         * @param oauthProfile the value to set
+         * @return the dsl builder
+         */
+        default DoclingComponentBuilder oauthProfile(java.lang.String oauthProfile) {
+            doSetProperty("oauthProfile", oauthProfile);
+            return this;
+        }
     }
 
     class DoclingComponentBuilderImpl
@@ -983,6 +1001,7 @@ public interface DoclingComponentBuilderFactory {
             case "authenticationScheme": getOrCreateConfiguration((DoclingComponent) component).setAuthenticationScheme((org.apache.camel.component.docling.AuthenticationScheme) value); return true;
             case "authenticationToken": getOrCreateConfiguration((DoclingComponent) component).setAuthenticationToken((java.lang.String) value); return true;
             case "maxFileSize": getOrCreateConfiguration((DoclingComponent) component).setMaxFileSize((long) value); return true;
+            case "oauthProfile": getOrCreateConfiguration((DoclingComponent) component).setOauthProfile((java.lang.String) value); return true;
             default: return false;
             }
         }
diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/HuggingfaceComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/HuggingfaceComponentBuilderFactory.java
index dd00dfac4608..1dbdec98feae 100644
--- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/HuggingfaceComponentBuilderFactory.java
+++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/HuggingfaceComponentBuilderFactory.java
@@ -408,6 +408,24 @@ public interface HuggingfaceComponentBuilderFactory {
             doSetProperty("healthCheckProducerEnabled", healthCheckProducerEnabled);
             return this;
         }
+    
+        /**
+         * OAuth profile name for obtaining an access token via the OAuth 2.0
+         * Client Credentials grant. When set, the token is acquired from the
+         * configured identity provider and used as authToken. Requires
+         * camel-oauth on the classpath.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: security
+         * 
+         * @param oauthProfile the value to set
+         * @return the dsl builder
+         */
+        default HuggingfaceComponentBuilder oauthProfile(java.lang.String oauthProfile) {
+            doSetProperty("oauthProfile", oauthProfile);
+            return this;
+        }
     }
 
     class HuggingfaceComponentBuilderImpl
@@ -450,6 +468,7 @@ public interface HuggingfaceComponentBuilderFactory {
             case "autowiredEnabled": ((HuggingFaceComponent) component).setAutowiredEnabled((boolean) value); return true;
             case "healthCheckConsumerEnabled": ((HuggingFaceComponent) component).setHealthCheckConsumerEnabled((boolean) value); return true;
             case "healthCheckProducerEnabled": ((HuggingFaceComponent) component).setHealthCheckProducerEnabled((boolean) value); return true;
+            case "oauthProfile": getOrCreateConfiguration((HuggingFaceComponent) component).setOauthProfile((java.lang.String) value); return true;
             default: return false;
             }
         }
diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/IbmWatsonxAiComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/IbmWatsonxAiComponentBuilderFactory.java
index 0ceef0c613a7..e4486ff24d0b 100644
--- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/IbmWatsonxAiComponentBuilderFactory.java
+++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/IbmWatsonxAiComponentBuilderFactory.java
@@ -594,6 +594,24 @@ public interface IbmWatsonxAiComponentBuilderFactory {
             doSetProperty("apiKey", apiKey);
             return this;
         }
+    
+        /**
+         * OAuth profile name for obtaining an access token via the OAuth 2.0
+         * Client Credentials grant. When set, the token is acquired from the
+         * configured identity provider and used as apiKey. Requires camel-oauth
+         * on the classpath.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: security
+         * 
+         * @param oauthProfile the value to set
+         * @return the dsl builder
+         */
+        default IbmWatsonxAiComponentBuilder oauthProfile(java.lang.String oauthProfile) {
+            doSetProperty("oauthProfile", oauthProfile);
+            return this;
+        }
     }
 
     class IbmWatsonxAiComponentBuilderImpl
@@ -649,6 +667,7 @@ public interface IbmWatsonxAiComponentBuilderFactory {
             case "timeout": getOrCreateConfiguration((WatsonxAiComponent) component).setTimeout((java.lang.Long) value); return true;
             case "verifySsl": getOrCreateConfiguration((WatsonxAiComponent) component).setVerifySsl((java.lang.Boolean) value); return true;
             case "apiKey": getOrCreateConfiguration((WatsonxAiComponent) component).setApiKey((java.lang.String) value); return true;
+            case "oauthProfile": getOrCreateConfiguration((WatsonxAiComponent) component).setOauthProfile((java.lang.String) value); return true;
             default: return false;
             }
         }
diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Langchain4jAgentComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Langchain4jAgentComponentBuilderFactory.java
index b4437aac5aaf..d53ca774315c 100644
--- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Langchain4jAgentComponentBuilderFactory.java
+++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Langchain4jAgentComponentBuilderFactory.java
@@ -180,10 +180,12 @@ public interface Langchain4jAgentComponentBuilderFactory {
     
         /**
          * MCP server definitions in the form of mcpServer..=. Supported
-         * properties: transportType (stdio or http, default: stdio), command
-         * (comma-separated, for stdio), url (for http), environment.= (for
-         * stdio), timeout (in seconds, default: 60), logRequests, logResponses.
-         * This is a multi-value option with prefix: mcpServer.
+         * properties: transportType (stdio, http, streamableHttp, or sse,
+         * default: stdio), command (comma-separated, for stdio), url (for
+         * http/sse), environment.= (for stdio), timeout (in seconds, default:
+         * 60), logRequests, logResponses, oauthProfile (OAuth profile for HTTP
+         * auth, requires camel-oauth). This is a multi-value option with
+         * prefix: mcpServer.
          * 
          * The option is a: &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
          * java.lang.Object&amp;gt;&lt;/code&gt; type.
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/DoclingEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/DoclingEndpointBuilderFactory.java
index 287d40952b66..0ee94f1e577f 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/DoclingEndpointBuilderFactory.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/DoclingEndpointBuilderFactory.java
@@ -693,6 +693,23 @@ public interface DoclingEndpointBuilderFactory {
             doSetProperty("maxFileSize", maxFileSize);
             return this;
         }
+        /**
+         * OAuth profile name for obtaining an access token via the OAuth 2.0
+         * Client Credentials grant. When set, the token is acquired from the
+         * configured identity provider and used as authenticationToken.
+         * Requires camel-oauth on the classpath.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         * 
+         * @param oauthProfile the value to set
+         * @return the dsl builder
+         */
+        default DoclingEndpointBuilder oauthProfile(String oauthProfile) {
+            doSetProperty("oauthProfile", oauthProfile);
+            return this;
+        }
     }
 
     /**
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/HuggingFaceEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/HuggingFaceEndpointBuilderFactory.java
index e2c418afacf4..d74a890ce022 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/HuggingFaceEndpointBuilderFactory.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/HuggingFaceEndpointBuilderFactory.java
@@ -399,6 +399,23 @@ public interface HuggingFaceEndpointBuilderFactory {
             doSetProperty("userRole", userRole);
             return this;
         }
+        /**
+         * OAuth profile name for obtaining an access token via the OAuth 2.0
+         * Client Credentials grant. When set, the token is acquired from the
+         * configured identity provider and used as authToken. Requires
+         * camel-oauth on the classpath.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         * 
+         * @param oauthProfile the value to set
+         * @return the dsl builder
+         */
+        default HuggingFaceEndpointBuilder oauthProfile(String oauthProfile) {
+            doSetProperty("oauthProfile", oauthProfile);
+            return this;
+        }
     }
 
     /**
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/LangChain4jAgentEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/LangChain4jAgentEndpointBuilderFactory.java
index b49ecec2a956..7152efe820e3 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/LangChain4jAgentEndpointBuilderFactory.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/LangChain4jAgentEndpointBuilderFactory.java
@@ -214,10 +214,12 @@ public interface LangChain4jAgentEndpointBuilderFactory {
         }
         /**
          * MCP server definitions in the form of mcpServer..=. Supported
-         * properties: transportType (stdio or http, default: stdio), command
-         * (comma-separated, for stdio), url (for http), environment.= (for
-         * stdio), timeout (in seconds, default: 60), logRequests, logResponses.
-         * This is a multi-value option with prefix: mcpServer.
+         * properties: transportType (stdio, http, streamableHttp, or sse,
+         * default: stdio), command (comma-separated, for stdio), url (for
+         * http/sse), environment.= (for stdio), timeout (in seconds, default:
+         * 60), logRequests, logResponses, oauthProfile (OAuth profile for HTTP
+         * auth, requires camel-oauth). This is a multi-value option with
+         * prefix: mcpServer.
          * 
          * The option is a: <code>java.util.Map&lt;java.lang.String,
          * java.lang.Object&gt;</code> type.
@@ -237,10 +239,12 @@ public interface LangChain4jAgentEndpointBuilderFactory {
         }
         /**
          * MCP server definitions in the form of mcpServer..=. Supported
-         * properties: transportType (stdio or http, default: stdio), command
-         * (comma-separated, for stdio), url (for http), environment.= (for
-         * stdio), timeout (in seconds, default: 60), logRequests, logResponses.
-         * This is a multi-value option with prefix: mcpServer.
+         * properties: transportType (stdio, http, streamableHttp, or sse,
+         * default: stdio), command (comma-separated, for stdio), url (for
+         * http/sse), environment.= (for stdio), timeout (in seconds, default:
+         * 60), logRequests, logResponses, oauthProfile (OAuth profile for HTTP
+         * auth, requires camel-oauth). This is a multi-value option with
+         * prefix: mcpServer.
          * 
          * The option is a: <code>java.util.Map&lt;java.lang.String,
          * java.lang.Object&gt;</code> type.
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/OpenAIEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/OpenAIEndpointBuilderFactory.java
index 9694588525eb..497eff805214 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/OpenAIEndpointBuilderFactory.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/OpenAIEndpointBuilderFactory.java
@@ -404,8 +404,9 @@ public interface OpenAIEndpointBuilderFactory {
          * using prefix notation:
          * mcpServer..transportType=stdiossestreamableHttp, mcpServer..command=
          * (stdio), mcpServer..args= (stdio), mcpServer..url=
-         * (sse/streamableHttp). This is a multi-value option with prefix:
-         * mcpServer.
+         * (sse/streamableHttp), mcpServer..oauthProfile= (OAuth profile for
+         * HTTP auth, requires camel-oauth). This is a multi-value option with
+         * prefix: mcpServer.
          * 
          * The option is a: <code>java.util.Map&lt;java.lang.String,
          * java.lang.Object&gt;</code> type.
@@ -428,8 +429,9 @@ public interface OpenAIEndpointBuilderFactory {
          * using prefix notation:
          * mcpServer..transportType=stdiossestreamableHttp, mcpServer..command=
          * (stdio), mcpServer..args= (stdio), mcpServer..url=
-         * (sse/streamableHttp). This is a multi-value option with prefix:
-         * mcpServer.
+         * (sse/streamableHttp), mcpServer..oauthProfile= (OAuth profile for
+         * HTTP auth, requires camel-oauth). This is a multi-value option with
+         * prefix: mcpServer.
          * 
          * The option is a: <code>java.util.Map&lt;java.lang.String,
          * java.lang.Object&gt;</code> type.
@@ -654,6 +656,25 @@ public interface OpenAIEndpointBuilderFactory {
             doSetProperty("userMessage", userMessage);
             return this;
         }
+        /**
+         * OAuth profile name for obtaining an access token via the OAuth 2.0
+         * Client Credentials grant. When set, the token is acquired from the
+         * configured identity provider and used instead of apiKey. Requires
+         * camel-oauth on the classpath. The profile properties are resolved
+         * from camel.oauth..client-id, camel.oauth..client-secret, and
+         * camel.oauth..token-endpoint.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         * 
+         * @param oauthProfile the value to set
+         * @return the dsl builder
+         */
+        default OpenAIEndpointBuilder oauthProfile(String oauthProfile) {
+            doSetProperty("oauthProfile", oauthProfile);
+            return this;
+        }
     }
 
     /**
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/WatsonxAiEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/WatsonxAiEndpointBuilderFactory.java
index cd98d93d0587..a0e818f11e46 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/WatsonxAiEndpointBuilderFactory.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/WatsonxAiEndpointBuilderFactory.java
@@ -654,6 +654,23 @@ public interface WatsonxAiEndpointBuilderFactory {
             doSetProperty("apiKey", apiKey);
             return this;
         }
+        /**
+         * OAuth profile name for obtaining an access token via the OAuth 2.0
+         * Client Credentials grant. When set, the token is acquired from the
+         * configured identity provider and used as apiKey. Requires camel-oauth
+         * on the classpath.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         * 
+         * @param oauthProfile the value to set
+         * @return the dsl builder
+         */
+        default WatsonxAiEndpointBuilder oauthProfile(String oauthProfile) {
+            doSetProperty("oauthProfile", oauthProfile);
+            return this;
+        }
     }
 
     /**
diff --git a/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties b/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties
index 151f88be7a3a..3ced2bc7689a 100644
--- a/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties
+++ b/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties
@@ -42,6 +42,7 @@ org.postgresql.Driver = org.postgresql:postgresql:${pgjdbc-driver-version}
 org.postgresql.ds.PGSimpleDataSource = org.postgresql:postgresql:${pgjdbc-driver-version}
 org.apache.camel.component.cxf.jaxws.CxfEndpoint = camel:cxf-soap
 org.apache.camel.component.cxf.jaxrs.CxfRsEndpoint = camel:cxf-rest
+META-INF/services/org/apache/camel/oauth-client-authentication-factory = camel:openapi-oauth
 META-INF/services/org/apache/camel/restapi/openapi = camel:openapi-java
 META-INF/services/org/apache/camel/modelxml-dumper = camel:xml-io
 META-INF/services/org/apache/camel/modelyaml-dumper = camel:yaml-io