add model context protocol provider (#665)

# What does this PR do?
Changes:
* Adds a new API to discover tools available on a runtime
* Adds a new model context protocol provider


## Test Plan

```
# clone python sdk for mcp and start the simple-tool server
uv run mcp-simple-tool --transport sse --port 56000

curl -X POST 'http://localhost:5000/alpha/toolgroups/register' \
-H 'Content-Type: application/json' \
-d '{
  "tool_group": { "name": "simple_mcp_group",
    "type": "model_context_protocol",
    "endpoint": {"uri": "http://localhost:56000/sse"}
  },
  "provider_id": "model-context-protocol"
}'

curl -X POST 'http://localhost:5000/alpha/tool-runtime/invoke' \
-H 'Content-Type: application/json' \
-d '{
    "tool_id": "fetch",
    "args": {
        "url": "http://google.com/"
    }
}'

```
This commit is contained in:
Dinesh Yeduguru 2024-12-19 16:14:23 -08:00 committed by GitHub
parent dc21e14f64
commit e95c168bc0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 160 additions and 10 deletions

View file

@ -26,11 +26,11 @@ class ToolParameter(BaseModel):
@json_schema_type
class Tool(Resource):
type: Literal[ResourceType.tool.value] = ResourceType.tool.value
name: str
tool_group: str
description: str
parameters: List[ToolParameter]
provider_id: Optional[str] = None
metadata: Optional[Dict[str, Any]] = None
tool_prompt_format: Optional[ToolPromptFormat] = Field(
default=ToolPromptFormat.json
)
@ -55,12 +55,14 @@ class MCPToolGroup(BaseModel):
"""
type: Literal["model_context_protocol"] = "model_context_protocol"
name: str
endpoint: URL
@json_schema_type
class UserDefinedToolGroup(BaseModel):
type: Literal["user_defined"] = "user_defined"
name: str
tools: List[ToolDef]
@ -87,7 +89,6 @@ class Tools(Protocol):
@webmethod(route="/toolgroups/register", method="POST")
async def register_tool_group(
self,
name: str,
tool_group: ToolGroup,
provider_id: Optional[str] = None,
) -> None:
@ -115,6 +116,9 @@ class Tools(Protocol):
class ToolRuntime(Protocol):
tool_store: ToolStore
@webmethod(route="/tool-runtime/discover", method="POST")
async def discover_tools(self, tool_group: ToolGroup) -> List[Tool]: ...
@webmethod(route="/tool-runtime/invoke", method="POST")
async def invoke_tool(
self, tool_id: str, args: Dict[str, Any]