diff --git a/docs/_static/llama-stack-spec.html b/docs/_static/llama-stack-spec.html
index 33befc95e..cdbba5dd1 100644
--- a/docs/_static/llama-stack-spec.html
+++ b/docs/_static/llama-stack-spec.html
@@ -6742,6 +6742,9 @@
},
{
"$ref": "#/components/schemas/OpenAIResponseInputToolFunction"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIResponseInputToolMCP"
}
],
"discriminator": {
@@ -6749,7 +6752,8 @@
"mapping": {
"web_search": "#/components/schemas/OpenAIResponseInputToolWebSearch",
"file_search": "#/components/schemas/OpenAIResponseInputToolFileSearch",
- "function": "#/components/schemas/OpenAIResponseInputToolFunction"
+ "function": "#/components/schemas/OpenAIResponseInputToolFunction",
+ "mcp": "#/components/schemas/OpenAIResponseInputToolMCP"
}
}
},
@@ -6839,6 +6843,110 @@
],
"title": "OpenAIResponseInputToolFunction"
},
+ "OpenAIResponseInputToolMCP": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "const": "mcp",
+ "default": "mcp"
+ },
+ "server_label": {
+ "type": "string"
+ },
+ "server_url": {
+ "type": "string"
+ },
+ "headers": {
+ "type": "object",
+ "additionalProperties": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ },
+ {
+ "type": "array"
+ },
+ {
+ "type": "object"
+ }
+ ]
+ }
+ },
+ "require_approval": {
+ "oneOf": [
+ {
+ "type": "string",
+ "const": "always"
+ },
+ {
+ "type": "string",
+ "const": "never"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "always": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "never": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "additionalProperties": false,
+ "title": "ApprovalFilter"
+ }
+ ],
+ "default": "never"
+ },
+ "allowed_tools": {
+ "oneOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "object",
+ "properties": {
+ "tool_names": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "additionalProperties": false,
+ "title": "AllowedToolsFilter"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "type",
+ "server_label",
+ "server_url",
+ "require_approval"
+ ],
+ "title": "OpenAIResponseInputToolMCP"
+ },
"OpenAIResponseInputToolWebSearch": {
"type": "object",
"properties": {
diff --git a/docs/_static/llama-stack-spec.yaml b/docs/_static/llama-stack-spec.yaml
index cae6331b0..1b368762f 100644
--- a/docs/_static/llama-stack-spec.yaml
+++ b/docs/_static/llama-stack-spec.yaml
@@ -4762,12 +4762,14 @@ components:
- $ref: '#/components/schemas/OpenAIResponseInputToolWebSearch'
- $ref: '#/components/schemas/OpenAIResponseInputToolFileSearch'
- $ref: '#/components/schemas/OpenAIResponseInputToolFunction'
+ - $ref: '#/components/schemas/OpenAIResponseInputToolMCP'
discriminator:
propertyName: type
mapping:
web_search: '#/components/schemas/OpenAIResponseInputToolWebSearch'
file_search: '#/components/schemas/OpenAIResponseInputToolFileSearch'
function: '#/components/schemas/OpenAIResponseInputToolFunction'
+ mcp: '#/components/schemas/OpenAIResponseInputToolMCP'
OpenAIResponseInputToolFileSearch:
type: object
properties:
@@ -4822,6 +4824,66 @@ components:
- type
- name
title: OpenAIResponseInputToolFunction
+ OpenAIResponseInputToolMCP:
+ type: object
+ properties:
+ type:
+ type: string
+ const: mcp
+ default: mcp
+ server_label:
+ type: string
+ server_url:
+ type: string
+ headers:
+ type: object
+ additionalProperties:
+ oneOf:
+ - type: 'null'
+ - type: boolean
+ - type: number
+ - type: string
+ - type: array
+ - type: object
+ require_approval:
+ oneOf:
+ - type: string
+ const: always
+ - type: string
+ const: never
+ - type: object
+ properties:
+ always:
+ type: array
+ items:
+ type: string
+ never:
+ type: array
+ items:
+ type: string
+ additionalProperties: false
+ title: ApprovalFilter
+ default: never
+ allowed_tools:
+ oneOf:
+ - type: array
+ items:
+ type: string
+ - type: object
+ properties:
+ tool_names:
+ type: array
+ items:
+ type: string
+ additionalProperties: false
+ title: AllowedToolsFilter
+ additionalProperties: false
+ required:
+ - type
+ - server_label
+ - server_url
+ - require_approval
+ title: OpenAIResponseInputToolMCP
OpenAIResponseInputToolWebSearch:
type: object
properties:
diff --git a/llama_stack/apis/agents/openai_responses.py b/llama_stack/apis/agents/openai_responses.py
index dcf0c7f9c..bb463bd57 100644
--- a/llama_stack/apis/agents/openai_responses.py
+++ b/llama_stack/apis/agents/openai_responses.py
@@ -186,8 +186,31 @@ class OpenAIResponseInputToolFileSearch(BaseModel):
# TODO: add filters
+class ApprovalFilter(BaseModel):
+ always: list[str] | None = None
+ never: list[str] | None = None
+
+
+class AllowedToolsFilter(BaseModel):
+ tool_names: list[str] | None = None
+
+
+@json_schema_type
+class OpenAIResponseInputToolMCP(BaseModel):
+ type: Literal["mcp"] = "mcp"
+ server_label: str
+ server_url: str
+ headers: dict[str, Any] | None = None
+
+ require_approval: Literal["always"] | Literal["never"] | ApprovalFilter = "never"
+ allowed_tools: list[str] | AllowedToolsFilter | None = None
+
+
OpenAIResponseInputTool = Annotated[
- OpenAIResponseInputToolWebSearch | OpenAIResponseInputToolFileSearch | OpenAIResponseInputToolFunction,
+ OpenAIResponseInputToolWebSearch
+ | OpenAIResponseInputToolFileSearch
+ | OpenAIResponseInputToolFunction
+ | OpenAIResponseInputToolMCP,
Field(discriminator="type"),
]
register_schema(OpenAIResponseInputTool, name="OpenAIResponseInputTool")