|
12 | 12 | AllowedToolsFilter, |
13 | 13 | OpenAIResponseInputToolChoiceAllowedTools, |
14 | 14 | ) |
| 15 | +from llama_stack_api.openai_responses import ApprovalFilter as LlamaStackApprovalFilter |
15 | 16 | from llama_stack_api.openai_responses import ( |
16 | 17 | OpenAIResponseInputTool as InputTool, |
17 | 18 | ) |
|
60 | 61 |
|
61 | 62 | import constants |
62 | 63 | from models.api.requests import QueryRequest |
63 | | -from models.config import ByokRag, ModelContextProtocolServer |
| 64 | +from models.config import ApprovalFilter, ByokRag, ModelContextProtocolServer |
64 | 65 | from utils.responses import ( |
65 | 66 | _build_chunk_attributes, |
66 | 67 | _merge_tools, |
@@ -405,6 +406,50 @@ async def test_get_mcp_tools_without_auth(self, mocker: MockerFixture) -> None: |
405 | 406 | assert tools_no_auth[0].server_label == "fs" |
406 | 407 | assert tools_no_auth[0].server_url == "http://localhost:3000" |
407 | 408 | assert tools_no_auth[0].headers is None |
| 409 | + assert all(tool.require_approval == "never" for tool in tools_no_auth) |
| 410 | + |
| 411 | + @pytest.mark.asyncio |
| 412 | + async def test_get_mcp_tools_require_approval_always( |
| 413 | + self, mocker: MockerFixture |
| 414 | + ) -> None: |
| 415 | + """Test get_mcp_tools passes require_approval='always' from config.""" |
| 416 | + server = ModelContextProtocolServer( |
| 417 | + name="strict", |
| 418 | + url="http://localhost:3000", |
| 419 | + provider_id="mcp", |
| 420 | + require_approval="always", |
| 421 | + ) |
| 422 | + mock_config = mocker.Mock() |
| 423 | + mock_config.mcp_servers = [server] |
| 424 | + mocker.patch("utils.responses.configuration", mock_config) |
| 425 | + |
| 426 | + tools = await get_mcp_tools(token=None) |
| 427 | + assert len(tools) == 1 |
| 428 | + assert tools[0].require_approval == "always" |
| 429 | + |
| 430 | + @pytest.mark.asyncio |
| 431 | + async def test_get_mcp_tools_require_approval_filter( |
| 432 | + self, mocker: MockerFixture |
| 433 | + ) -> None: |
| 434 | + """Test get_mcp_tools translates ApprovalFilter to Llama Stack format.""" |
| 435 | + server = ModelContextProtocolServer( |
| 436 | + name="github", |
| 437 | + url="http://localhost:3000", |
| 438 | + provider_id="mcp", |
| 439 | + require_approval=ApprovalFilter( |
| 440 | + always=["create_issue"], |
| 441 | + never=["list_repos"], |
| 442 | + ), |
| 443 | + ) |
| 444 | + mock_config = mocker.Mock() |
| 445 | + mock_config.mcp_servers = [server] |
| 446 | + mocker.patch("utils.responses.configuration", mock_config) |
| 447 | + |
| 448 | + tools = await get_mcp_tools(token=None) |
| 449 | + assert len(tools) == 1 |
| 450 | + assert isinstance(tools[0].require_approval, LlamaStackApprovalFilter) |
| 451 | + assert tools[0].require_approval.always == ["create_issue"] |
| 452 | + assert tools[0].require_approval.never == ["list_repos"] |
408 | 453 |
|
409 | 454 | @pytest.mark.asyncio |
410 | 455 | async def test_get_mcp_tools_with_kubernetes_auth( |
|
0 commit comments