跳至主要内容

使用 MCP 客户端

在 ChatGPT 中打开

MCP 应用不必将每个交互都保留在其嵌入视图中。它可以向对话发送信息,在用户更改 UI 时保持模型知情,或请求客户端处理框架外的内容。

同一路由也可以在正常浏览器中打开。通过检查是否存在 MCP 主机来开始每个客户端交互。

从视图继续对话​

考虑一个库存应用,其中用户选择一个仓库,然后询问 AI 审查其库存。按钮可以将该请求作为下一个用户消息发送:

Paragraph warehouse = new Paragraph("仓库: BER");
Button review = new Button("审查库存");

review.addClickListener(event -> McpHost.ifPresent(host ->
host.sendMessage("审查 " + warehouse.getText() + " 的当前库存")));

McpHost.ifPresent 仅在视图连接到 MCP 客户端时运行回调。在正常浏览器中,按钮没有主机端效果。

保持模型知情​

并非每个 UI 更改都应创建另一个消息。当选择的仓库或过滤器更改时,应用可以替换其对模型贡献的上下文:

McpHost host = McpHost.getCurrent();
if (host != null) {
PendingResult<Void> result = host.updateModelContext(
Map.of("warehouse", warehouse.getText(), "source", "inventory-app"));

result.exceptionally(error -> {
warehouse.setText("共享失败: " + error.getMessage());
return null;
});
}

更新的状态在不向对话添加可见消息的情况下可用于后续模型响应。主机调用是异步的,并返回一个 PendingResult,因此在处理完成或失败时无需阻塞 webforJ UI 线程。

离开嵌入视图​

某些工作属于应用框架外。当用户需要在外部页面继续时使用 openLink。当当前内容需要不同的展示时,例如全屏显示详细表格时,使用 requestDisplayMode。客户端决定是否能满足这两个请求。

保持浏览器体验完整

将主机集成视为一种增强。无论在浏览器中运行还是连接的客户端不支持请求的能力,该路由都应保持有用。

跟踪对话中的变化​

客户端可以在渲染后继续与应用程序进行交互。例如,当工具调用被取消时,视图可以清除加载状态,并在对话上下文发生变化时刷新说明文本:

McpHost.ifPresent(host -> {
host.onToolCancelled(event ->
warehouse.setText("库存请求已取消。"));
host.onHostContextChanged(event ->
warehouse.setText("对话上下文已变化。"));
});

仅注册视图所需的监听器,不要假设每个客户端都会发送每个事件。请查看 McpHost Javadoc 以获取可用的请求、事件、有效载荷和方法签名。