c6a0e90250
* Python: correct MCP tool argument filtering documentation The documentation for MCPTool's outbound argument filtering did not match its behavior. The comment on _prepare_call_kwargs stated that framework runtime kwargs are "stripped so it is never forwarded to the MCP server", and packages/core/AGENTS.md repeated the same claim. In practice, runtime kwargs (FunctionInvocationContext.kwargs, seeded from function_invocation_kwargs) are merged with the model-supplied arguments in _call_tool_with_runtime_kwargs before the filter runs, so provenance is no longer distinguishable at that point. The allowlist is built from the tool's declared inputSchema.properties as advertised by the server, plus names opted in through additional_tool_argument_names. A runtime kwarg is therefore forwarded whenever the server declares a property of the same name, without the model supplying it. Update the comments, docstrings and docs to describe the actual rule, and point each transport at its appropriate channel for values that should not become tool arguments (env for stdio, header_provider for streamable HTTP). Also narrow the docstring of test_call_tool_forwards_only_declared_arguments, which claimed more than it asserts (it covers undeclared names only), and add a companion test pinning the declared-name behavior so the documented rule stays verifiable. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: address review feedback on MCP argument filtering docs Corrects and tightens the documentation added in the previous commit. - header_provider does not withhold values from the outbound argument filter; it reads the runtime kwargs without consuming them. The earlier wording recommended it as a way to keep a value out of tool arguments, which is wrong. Replaced in four places with the pattern that does work: source the credential outside function_invocation_kwargs, for example by reading a ContextVar inside the provider, which still allows a different value per request. - Note the _meta key and the framework denylist as exceptions wherever the docs say server-declared names are forwarded. - Rework test_call_tool_forwards_runtime_kwargs_the_server_declares to invoke the generated FunctionTool with a FunctionInvocationContext, so it exercises the real runtime-kwargs path instead of calling call_tool directly. Verified by mutation: removing the merge in _call_tool_with_runtime_kwargs now fails the test. - Add a test covering the recommended ContextVar pattern. - Condense the transport docstring notes, which had grown into three near-duplicate blocks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
MCP (Model Context Protocol) Examples
This folder contains examples demonstrating how to work with MCP using Agent Framework.
What is MCP?
The Model Context Protocol (MCP) is an open standard for connecting AI agents to data sources and tools. It enables secure, controlled access to local and remote resources through a standardized protocol.
Examples
| Sample | File | Description |
|---|---|---|
| Agent as MCP Server | agent_as_mcp_server.py |
Shows how to expose an Agent Framework agent as an MCP server that other AI applications can connect to |
| API Key Authentication | mcp_api_key_auth.py |
Demonstrates API key authentication with MCP servers using header_provider, runtime invocation kwargs, and a command-line API key argument |
| GitHub Integration with PAT | mcp_github_pat.py |
Demonstrates connecting to GitHub's MCP server using Personal Access Token (PAT) authentication |
| Long-Running Task | mcp_long_running_task.py |
Demonstrates transparent SEP-2663 long-running task handling for MCP tools that advertise taskSupport=required. Self-spawns a stdio MCP child server |
| Progressive Disclosure | mcp_progressive_disclosure.py |
Demonstrates use_progressive_disclosure, always_load, allowed_tools, and prefixed list_mcp_tools / load_tool / unload_tool names. load_tool and unload_tool can accept one tool name or multiple names. Self-spawns a stdio MCP child server |
| Sampling Approval | mcp_sampling_approval.py |
Demonstrates gating server-initiated sampling/createMessage requests with a sampling_approval_callback, plus the sampling_max_tokens and sampling_max_requests guardrails. MCP sampling is denied by default |
Prerequisites
Most samples in this folder use OpenAI:
OPENAI_API_KEYenvironment variableOPENAI_CHAT_MODELenvironment variable
Run mcp_api_key_auth.py with the MCP API key as the first command-line argument.
mcp_progressive_disclosure.py self-spawns its demo MCP stdio server; no separate MCP server setup is required.
For mcp_github_pat.py:
GITHUB_PAT- Your GitHub Personal Access Token (create at https://github.com/settings/tokens)
For mcp_long_running_task.py (uses Azure OpenAI via Entra-ID):
- Run
az loginonce AZURE_OPENAI_ENDPOINT- your Azure OpenAI resource endpoint, e.g.https://<resource>.openai.azure.com/AZURE_OPENAI_CHAT_MODEL(orAZURE_OPENAI_MODEL) - the deployment name (e.g.gpt-4o-mini)