Files
semenshi-m c6951c21f6 Python: Add MCP-based skills discovery (McpSkillsSource) (#6169)
* Add MCP-based skills discovery (McpSkill, McpSkillsSource, McpSkillResource)

Implement Agent Skills discovery over MCP following the SEP-2640 convention:
- McpSkillsSource: reads skill://index.json to discover skills served by an MCP server
- McpSkill: lazily fetches SKILL.md content via resources/read on demand
- McpSkillResource: wraps MCP resource results (text and binary)
- Path traversal protection in get_resource for defense in depth
- Samples for Foundry Toolbox and standalone MCP skills server
- Comprehensive unit tests (514 lines)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Address PR review comments: rename to MCP* convention, fix error handling and samples

- Rename McpSkill/McpSkillResource/McpSkillsSource to MCPSkill/MCPSkillResource/MCPSkillsSource
- Add data-URI prefix stripping for blob resource decoding
- Let non-McpError exceptions propagate from get_resource()
- Fix contradictory test comment
- Use interactive input() in mcp_based_skill sample
- Remove misleading sample output block

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Restore debug logging for McpError in get_resource()

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Use AzureCliCredential in Foundry toolbox skills sample for consistency

Replace DefaultAzureCredential with AzureCliCredential to match the
credential convention used in all other samples.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Use MCPStreamableHTTPTool in MCP skills sample

Replace raw mcp library imports (ClientSession, streamable_http_client)
with the framework's MCPStreamableHTTPTool to keep MCP server connections
consistent regardless of whether skills are enabled.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Branch on McpError.error.code so only not-found errors return empty

Previously _try_read_index() and get_resource() swallowed every McpError
as 'no skills available', making auth failures, server crashes, and
connection drops indistinguishable from a server that simply has no
skills.

Now only two codes are treated as not-found:
- -32002 (MCP-spec Resource not found)
- -32601 (METHOD_NOT_FOUND — server lacks resources/read)

All other McpError codes and non-McpError exceptions propagate with a
warning log, surfacing real failures visibly.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add tests for non-McpError and non-not-found error propagation in MCP skills

Cover the re-raise branch in MCPSkill.get_resource for plain
ConnectionError/TimeoutError, the generic McpError (code 0) propagation
on get_resource, and TimeoutError propagation in _try_read_index.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Revert "Use MCPStreamableHTTPTool in MCP skills sample"

This reverts commit f31ed0ded9.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Introduce MCP_SKILLS experimental feature for MCP skill classes

Add a separate MCP_SKILLS feature ID to ExperimentalFeature enum and
use it for MCPSkillResource, MCPSkill, and MCPSkillsSource, since their
promotion timeline is partly outside of our control.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
c6951c21f6 · 2026-06-03 18:09:50 +00:00
History
..

Foundry Provider Samples

This folder contains Azure AI Foundry and Foundry Local samples for Agent Framework.

FoundryAgent Samples

File Description
foundry_agent_basic.py Foundry Agent basic example
foundry_agent_custom_client.py Foundry Agent custom client configuration
foundry_agent_hosted.py Foundry Agent for hosted agents
foundry_agent_with_function_tools.py Foundry Agent with local function tools

FoundryChatClient Samples

File Description
foundry_chat_client.py Foundry Chat Client with project endpoint example
foundry_chat_client_basic.py Foundry Chat Client basic example
foundry_chat_client_code_interpreter_files.py Foundry Chat Client with code interpreter and files
foundry_chat_client_image_analysis.py Foundry Chat Client with image analysis
foundry_chat_client_with_code_interpreter.py Foundry Chat Client with code interpreter
foundry_chat_client_with_explicit_settings.py Foundry Chat Client with explicit settings
foundry_chat_client_with_file_search.py Foundry Chat Client with file search
foundry_chat_client_with_function_tools.py Foundry Chat Client with function tools
foundry_chat_client_with_hosted_mcp.py Foundry Chat Client with hosted MCP
foundry_chat_client_with_local_mcp.py Foundry Chat Client with local MCP
foundry_chat_client_with_session.py Foundry Chat Client with session management
foundry_chat_client_with_toolbox.py Foundry Chat Client connected to a toolbox via its MCP endpoint using MCPStreamableHTTPTool
foundry_chat_client_with_toolbox_skills.py Foundry Chat Client that discovers MCP-based skills from a Foundry Toolbox endpoint via MCPSkillsSource (uses an Azure AD bearer token and the toolbox preview header)

FoundryLocalClient Samples

Prerequisites

  1. Install Foundry Local and required local runtime components.

  2. Install the connector package:

    pip install agent-framework-foundry-local --pre
    
File Description
foundry_local_agent.py Basic Foundry Local agent usage with streaming and non-streaming responses, plus function tool calling.

Environment Variables

  • FOUNDRY_LOCAL_MODEL: Optional model alias/ID to use by default when model is not passed to FoundryLocalClient.