feat: add MCP tool integration

This commit is contained in:
Xin Wang
2026-07-18 00:00:06 +08:00
parent bdf3d3dd9c
commit e39bb48ba8
21 changed files with 1641 additions and 62 deletions

View File

@@ -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