feat: add MCP tool integration
This commit is contained in:
@@ -19,8 +19,10 @@ ModelType = Literal["LLM", "ASR", "TTS", "Realtime", "Embedding", "Agent"]
|
||||
AssistantType = Literal["prompt", "workflow", "dify", "fastgpt", "opencode"]
|
||||
TurnEndStrategy = Literal["silence", "smart_turn"]
|
||||
KnowledgeRetrievalMode = Literal["automatic", "on_demand"]
|
||||
ToolType = Literal["end_call", "http"]
|
||||
ToolType = Literal["end_call", "http", "mcp"]
|
||||
ToolStatus = Literal["active", "archived", "draft"]
|
||||
McpServerStatus = Literal["active", "archived", "draft"]
|
||||
McpTransport = Literal["streamable_http"]
|
||||
ToolParameterType = Literal["string", "number", "integer", "boolean", "object", "array"]
|
||||
ToolParameterLocation = Literal["path", "query", "body", "header"]
|
||||
DynamicVariableType = Literal["string", "number", "boolean"]
|
||||
@@ -219,8 +221,22 @@ class HttpToolDefinition(CamelModel):
|
||||
config: HttpToolConfig
|
||||
|
||||
|
||||
class McpToolConfig(CamelModel):
|
||||
remote_tool_name: str = Field(min_length=1, max_length=255)
|
||||
input_schema: dict[str, Any] = Field(default_factory=dict)
|
||||
schema_hash: str = ""
|
||||
dynamic_variable_assignments: dict[str, str] = Field(default_factory=dict)
|
||||
|
||||
|
||||
class McpToolDefinition(CamelModel):
|
||||
schema_version: int = 1
|
||||
type: Literal["mcp"] = "mcp"
|
||||
config: McpToolConfig
|
||||
|
||||
|
||||
ToolDefinition = Annotated[
|
||||
Union[EndCallToolDefinition, HttpToolDefinition], Field(discriminator="type")
|
||||
Union[EndCallToolDefinition, HttpToolDefinition, McpToolDefinition],
|
||||
Field(discriminator="type"),
|
||||
]
|
||||
|
||||
|
||||
@@ -231,14 +247,49 @@ class ToolUpsert(CamelModel):
|
||||
definition: ToolDefinition
|
||||
secrets: dict[str, Any] = Field(default_factory=dict)
|
||||
status: ToolStatus = "active"
|
||||
mcp_server_id: str | None = None
|
||||
|
||||
|
||||
class ToolOut(ToolUpsert):
|
||||
id: str
|
||||
type: ToolType
|
||||
remote_tool_name: str | None = None
|
||||
updated_at: str | None = None
|
||||
|
||||
|
||||
# ---------- MCP Server ----------
|
||||
class McpServerUpsert(CamelModel):
|
||||
name: str = Field(min_length=1, max_length=128)
|
||||
description: str = Field(default="", max_length=2048)
|
||||
transport: McpTransport = "streamable_http"
|
||||
url: str = Field(min_length=1, max_length=2048)
|
||||
timeout_seconds: int = Field(default=30, ge=1, le=120)
|
||||
headers: dict[str, str] = Field(default_factory=dict)
|
||||
secret_headers: dict[str, str] = Field(default_factory=dict)
|
||||
status: McpServerStatus = "active"
|
||||
|
||||
@field_validator("url")
|
||||
@classmethod
|
||||
def validate_url(cls, value: str) -> str:
|
||||
if not value.startswith(("http://", "https://")):
|
||||
raise ValueError("MCP Server URL 必须使用 http:// 或 https://")
|
||||
return value
|
||||
|
||||
|
||||
class McpServerOut(McpServerUpsert):
|
||||
id: str
|
||||
tool_count: int = 0
|
||||
last_synced_at: str | None = None
|
||||
updated_at: str | None = None
|
||||
|
||||
|
||||
class McpSyncResult(CamelModel):
|
||||
server: McpServerOut
|
||||
created: int
|
||||
updated: int
|
||||
tools: list[ToolOut]
|
||||
|
||||
|
||||
# ---------- 知识库 ----------
|
||||
class KnowledgeBaseUpsert(CamelModel):
|
||||
name: str
|
||||
|
||||
Reference in New Issue
Block a user