mcp-wip旨在革新强大的AI引擎与实际UI组件之间的连接。通过mcp-wip,您的大模型可以直接选择由MCP服务器提供的清晰声明性清单指定的组件。组件实现保持技术无关性,使前端能够通过简单的自定义桥梁轻松集成任何框架。该协议设计为MCP标准的扩展,允许无缝集成到您自己的MCP服务器中。
<p align="center"> <video src="https://github.com/user-attachments/assets/10d421f9-b6c2-4791-978c-68ac9aafef72"></video> </p>这是一个早期开发阶段的实验项目。请将其视为Alpha版。欢迎对该项目的所有贡献!
mcp-wip?MCP-WIP提供了一种统一的方法,让大模型根据用户请求智能地选择和实例化UI组件。系统使用**检索增强生成(RAG)**将用户意图与适当的组件(由标准声明性清单描述)匹配,从而在对话式AI和交互式UI组件之间提供无缝集成。
该项目遵循模块化架构,主要分为三个组件:
┌─────────────────────────────────────────────────────────────┐
│ 前端(技术无关性) |
│ 组件渲染器及UI │
└──────────────────────────┬──────────────────────────────────┘
│ HTTP REST API
┌──────────────────────────▼──────────────────────────────────┐
│ MCPWIPClient │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ • 聊天编排 │ │
│ │ • 基于RAG的组件检索 │ │
│ │ • 大模型集成(兼容OpenAI) │ │
│ │ • 会话内存管理 │ │
│ │ • 工具调用(代理行为) │ │
│ └────────────────────────────────────────────────────────┘ │
└──────────────────────────┬──────────────────────────────────┘
│ Stdio传输(或可流式传输HTTP)
┌──────────────────────────▼──────────────────────────────────┐
│ MCPWIPServer (FastMCP) │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ • 自定义工具 │ │
│ │ • 资源模板 │ │
│ │ • 作为资源的组件清单 │ │
│ └────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
sdks/react)uv 包管理器克隆仓库
git clone <仓库地址>
cd mcp-wip
安装Python依赖项
# 使用uv
uv sync
# 使用fastapi路由
uv sync --extra fastapi
# 使用memvid rag
uv sync --extra rag
# 直接同步所有依赖项
uv sync --all-extras
安装React SDK依赖项(用于前端)
cd sdks/react
npm install
系统采用模块化方法,客户端通过StdioTransport运行服务器作为子进程:
uv run -m example.main
此单一命令:
example/resources/widgets/中的组件初始化MCPWIPServerhttp://localhost:9000/wip/暴露REST API端点GET /wip/start-session - 开始新的聊天会话POST /wip/chat - 发送消息并获取AI响应及组件选择POST /wip/context-injection - 注入组件上下文到对话GET /wip/manifest - 获取所有可用组件清单POST /wip/call-tool/{tool_name} - 调用特定服务器工具您可以启动示例前端:
cd example/chat
npm run dev
React演示前端旨在成为增强型聊天界面的试点,设计超越了标准的对话UI。它展示了动态组件初始化和交互——让您看到如何在聊天会话期间加载、渲染和控制组件。该界面处理将组件上下文注入回MCP-WIP后端,使大模型能够访问用户在组件中所做的操作信息。
本项目的中心思想是将传统的UI(由可重用组件如表单、选择器或卡片构建)与自然对话交互相结合,实现“对话式组件”。这种混合方法为最终用户提供灵活性,可以与基于表单的工具和自然语言代理进行交互,实现无缝、强大的协作工作流程。
core/mcp_server/)服务器模块负责组件注册和自定义工具。
您可以像这样定义新组件:
new_widget = WidgetManifest(
uri="wip://image-carousel",
input_parameters_schema={
"type": "object",
"properties": {
"ids": {
"type": "array",
"items": {"type": "string"},
"description": "每个图像URL对应的唯一标识符列表。",
},
},
"required": ["ids"],
"additionalProperties": False,
"description": "渲染图像轮播所需的参数,将ID与图像URL及其可选字幕关联。",
},
capabilities=["全屏", "菜单"],
description="""此组件帮助用户以交互式轮播的形式查看多个产品图像,
提供增强的用户界面以详细探索项目。通过允许用户轻松浏览不同产品的视图或变体,
改善了体验。图像轮播特别适用于展示项目各种选项的画廊,
或在目录或作品集中从多个角度展示产品布局。""",
use_cases_hints="当用户请求查看产品或一组产品的详细信息时应选择此组件。",
version="1.0.0",
name="图像轮播",
)
MCP-WIP清单URI必须采用"wip://...."格式才能正确检索
from fastmcp import FastMCP
from core.mcp_server.server import MCPWIPServer
# 创建FastMCP服务器
server = FastMCP("mcp-wip-server")
"""
在这里您可以添加工具、资源和提示,就像在FastMCP中一样
通过@tool、@prompt和@resource装饰器
更多信息,请参阅FastMCP文档或example/server.py
"""
# 使用保存在widget目录中的JSON清单初始化MCPWIPServer
mcp_server = MCPWIPServer(
input_dir="example/resources/widgets",
server=server,
load_from_directory=True
)
# 可选地以这种方式添加更多清单
mcp_server.add_manifest_json_resource(new_widget) # 来自前面示例的新组件
if __name__=="__main__":
# 作为进程运行(用于StdioTransport)
mcp_server.run_as_process()
core/mcp_client/)客户端协调大模型交互和组件选择。
from fastmcp.client import StdioTransport
from openai import AsyncOpenAI
from core.mcp_client.client import MCPWIPClient
# 设置传输以与自定义服务器通信
# example.server 应替换为您自己的MCPWIPServer的Python文件
transport = StdioTransport(
"uv",
args=["run", "-m", "example.server", "--transport", "stdio"]
)
# 初始化大模型客户端
llm_client = AsyncOpenAI(
api_key=os.getenv("GROQ_API_KEY"),
base_url="https://api.groq.com/openai/v1"
)
# 初始化MCPWIPClient
wip_client = MCPWIPClient(
llm_client=llm_client,
mcp_server_transport=transport,
system_prompt=SYSTEM_PROMPT, # 如果需要自定义系统提示(推荐)
rag=rag, # 可选:BaseRAG实例,您可以使用预定义的或自己的
model="openai/gpt-oss-20b"
)
# 运行一轮聊天
messages = await wip_client.run_chat_turn(
user_message="显示我10月的日历",
session_id="session-123"
)
# 响应包括ToolMessage和AssistantMessage
# AssistantMessage是一个JSON格式化的字符串,如下结构
run_chat_turn的响应将包含一个JSON格式化的字符串形式的AssistantMessage,其字段如下:
{
"uri": "wip://使用的组件",
"parameters": [
{"name": "参数1", "value": "某个值"}
],
"text": "自由文本回复"
}
uri将是"",parameters将是[],text将包含AI的回答。所有响应严格遵循此JSON结构,输出为字符串。
rag/)RAG模块提供了智能组件检索。 您可以继承抽象的BaseRAG类以集成您偏好的RAG解决方案。在项目中,借助memvid库实现了简单的内存解决方案,无需额外的矢量数据库。
有关使用示例,请参阅example/main.py。
如果没有提供RAG,所有组件都会在每次轮次中暴露给大模型。对于小型组件目录(< 20个组件),这效果很好。
组件定义为具有以下结构的JSON清单:
{
"uri": "wip://组件名称",
"input_parameters_schema": {
"type": "object",
"properties": {
"param1": {"type": "string"}
}
},
"capabilities": ["显示", "交互"],
"name": "组件名称",
"description": "组件功能的详细描述",
"use_cases_hints": "何时使用此组件",
"version": "1.0.0"
}
在您的组件清单已在MCP-WIP服务器上注册后,可以在您喜欢的前端框架中实现实际的组件逻辑,使用提供的SDK(目前唯一可用的是React,但将添加更多)。
组件结构:
import type { WidgetProps, WidgetComponent } from '@mcp-wip/react-widget-sdk';
const MyWidget: WidgetComponent = ({ parameters }) => {
return <div>组件内容</div>;
};
// 必需元数据
MyWidget.widgetName = "我的组件";
MyWidget.description = "组件描述";
MyWidget.visualization = "both"; // "small" | "both" | "独立"
MyWidget.getIcon = () => <span>🎯</span>;
// 可选生命周期方法
MyWidget.initWidget = (parameters, setParams) => { /* 异步设置 */ };
MyWidget.getWidgetContext = () => { /* 返回当前状态 */ };
MyWidget.setWidgetContext = (prevParams) => { /* 处理上下文更新 */ };
注册组件:
import { registerWidgets } from '@mcp-wip/react-widget-sdk';
registerWidgets({
'wip://my-widget': MyWidget,
'wip://image-carousel': ImageCarouselWidget,
});
渲染组件:
import { WidgetRenderer } from '@mcp-wip/react-widget-sdk';
<WidgetRenderer
uri="wip://image-carousel"
parameters={[{ name: "ids", value: ["sku123"] }]}
/>
POST /wip/chat {
"uri": "wip://stock-level-inspector",
"parameters": [{"name": "sku", "value": "SKU-123"}],
"text": ""
}
StockVisualizer组件,并实例化它get_stock工具获取SKU "SKU-123"的库存可用性(由MCPWIPClient处理)StockVisualizer在下一次用户请求之前将其上下文传递回MCPWIPClient会话mcp-wip/
├── core/
│ ├── mcp_client/ # 客户端编排逻辑
│ │ ├── client.py # 主MCPWIPClient类
│ │ ├── memory_handler.py # 会话内存管理
│ │ └── models.py # Pydantic模型
│ └── mcp_server/ # 服务器逻辑
│ ├── server.py # 主MCPWIPServer类
│ └── models.py # 组件清单模型
├── api/
│ ├── routes.py # FastAPI路由
│ └── models.py # API请求/响应模型
├── rag/
│ ├── base.py # 基础RAG接口
│ └── memvid_rag.py # Memvid实现
├── example/
│ ├── main.py # 主入口点
│ ├── server.py # 服务器配置
│ ├── resources/ # 组件清单和RAG数据
│ └── chat/ # React前端
├── sdks/
│ └── react/ # React组件SDK
└── utils/
└── widget_json_converter.py
欢迎任何形式的帮助!
有关详细的API文档,请参阅每个模块中的内联文档字符串。