-
Notifications
You must be signed in to change notification settings - Fork 906
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[1/n] Add MCP types to the SDK #320
Conversation
from .server import MCPServer | ||
|
||
|
||
class MCPUtil: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this is the same as the other MCPUtil class
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah sorry deleted in the end of stack.
@abc.abstractmethod | ||
async def list_tools(self) -> list[MCPTool]: | ||
"""List the tools available on the server.""" | ||
pass | ||
|
||
@abc.abstractmethod | ||
async def call_tool(self, tool_name: str, arguments: dict[str, Any] | None) -> CallToolResult: | ||
"""Invoke a tool on the server.""" | ||
pass |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what do you think about making these just return our Tool
class? ie. the MCPServer is responsible for doing the conversion
this is an MCPServer class specifically for integrating with our SDK, so it can use our types
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah good question. I considered that, but I actually think MCP servers should be shared between frameworks. I talked to @dsp-ant and plan to make a PR to the MCP repo to make this part of their SDK, so then this import would just be an alias to mcp.client.MCPServer
.
### Summary: 1. Add the MCP dep for python 3.10, since it doesn't support 3.9 and below 2. Create MCPServer, which is the agents SDK representation of an MCP server 3. Create implementations for HTTP-SSE and StdIO servers, directly copying the [MCP SDK example](https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/clients/simple-chatbot/mcp_simple_chatbot/main.py) 4. Add a util to transform MCP tools into Agent SDK tools Note: I added optional caching support to the servers. That way, if you happen to know a server's tools don't change, you can just cache them. ### Test Plan: Checks pass. I added tests at the end of the stack.
### Summary: This enables users to **use** MCP inside the SDK. 1. You add a list of MCP servers to `Agent`, via `mcp_server=[...]` 2. When an agent runs, we look up its MCP tools and add them to the list of tools. 3. When a tool call occurs, we call the relevant MCP server. Notes: 1. There's some refactoring to make sure we send the full list of tools to the Runner/Model etc. 2. Right now, you could have a locally defined tool that conflicts with an MCP defined tool. I didn't add errors for that, will do in a followup. ### Test Plan: See unit tests. Also has an end to end example next PR. --- [//]: # (BEGIN SAPLING FOOTER) * #324 * #322 * __->__ #321 * #320
Summary:
Note: I added optional caching support to the servers. That way, if you happen to know a server's tools don't change, you can just cache them.
Test Plan:
Checks pass. I added tests at the end of the stack.
#324
#322
#321
-> #320
#319