构建你的第一个ChatGPT应用 | 使用Apps SDK的逐步教程

Wednesday, Nov 5, 2025 | 2 minute read | Updated at Wednesday, Nov 5, 2025

@
构建你的第一个ChatGPT应用 | 使用Apps SDK的逐步教程

当AI成为日常工作流程的核心,ChatGPT已成为数十亿用户的自然工具。然而直到现在,ChatGPT的重点主要是"对话",而不是"交互"。

如果你能在ChatGPT内直接与应用互动——比如预订酒店、设计演示文稿——全部在同一个界面中完成,会怎样?

这正是ChatGPT Apps带来的能力。

ChatGPT Apps SDK示意图

引言

借助全新的Apps SDK,开发者现在可以构建运行在ChatGPT内部的交互式、具备上下文能力的应用。

ChatGPT (MCP client) Our app (MCP server) =ChatGPT5 >

Dooi Shop find me woo jackets made from an Italian wool and cashmere blend. 步骤1:ChatGPT 触发我们的应用 步骤2:我们的 MCP 工具返回小部件+数据 u Dooi Shop Searched the best jackets “isonrpc : “2.0” “method”: “returnProduct”, “params”:{ ame: “Doljacket, “material”: “Cashmere”, “price”:190 } “id”:1

★★★ Cashmere - wool jacket Fabulous - 2,493 reviews Outer Mens Cashmere( Italian ★★★ 步骤3:内容将返回给ChatGPT

在本指南中,你将学习如何构建属于你的ChatGPT应用。我将带你走过每一步代码,并解释其工作原理。

完成后,你将拥有一个可在ChatGPT环境中动态展示组件(widgets)的可运行应用。

第0步:ChatGPT应用如何工作?

一个ChatGPT应用,本质上就是一个提供widget的MCP服务器。

ChatGPT应用的工作流程

如上图所示,流程从ChatGPT根据用户消息触发应用开始。用户的消息会被发送到应用。

应用随后会选择最匹配用户意图的MCP工具。例如,当用户提出"我想买衣服”,应用可能会选择名为ShowClothes的工具。

工具会返回widget与数据:

  • widget:显示在ChatGPT内的组件
  • data:ChatGPT可使用的结构化响应

第1步:安装FastApps

了解ChatGPT应用如何工作后,我们将开始实践。

我们会使用FastApps —— 一个开源框架,用于构建ChatGPT应用。

首先使用uv安装FastApps:

uv tool install fastapps
uv tool install --upgrade fastapps   # 更新到最新版本

第2步:初始化新应用

安装后,运行以下命令快速开始:

fastapps init my-app
cd my-app
fastapps dev

你会看到一个通过Cloudflare Tunnel自动生成的公共URL。

你的MCP服务器将暴露在/mcp路径下。

示例:

https://your-public-url.trycloudflare.com/mcp

第3步:测试你的应用

方案A:使用MCPJam Inspector测试

连接并测试你的服务器:

npx @mcpjam/inspector@latest

然后输入你的公共URL + /mcp

方案B:在ChatGPT内测试

  1. 打开ChatGPT → 设置 → Connectors
  2. 添加公共URL + /mcp
  3. 选择「No authentication」

第4步:创建更多Widgets

你可以随时新增组件:

fastapps create additional-widget

第5步:编辑你的Widget

你只需要修改两个目录:

1️⃣ server/tools/ — MCP工具

定义应用的逻辑与交互结构。

示例:

# server/tools/my_widget_tool.py
from fastapps import BaseWidget, Field, ConfigDict
from pydantic import BaseModel
from typing import Dict, Any

class MyWidgetInput(BaseModel):
    model_config = ConfigDict(populate_by_name=True)
    name: str = Field(default="World")

class MyWidgetTool(BaseWidget):
    identifier = "my-widget"
    title = "My Widget"
    input_schema = MyWidgetInput
    invoking = "Processing..."
    invoked = "Done!"

    widget_csp = {
        "connect_domains": [],
        "resource_domains": []
    }

    async def execute(self, input_data: MyWidgetInput) -> Dict[str, Any]:
        return {
            "name": input_data.name,
            "message": f"Hello, {input_data.name}!"
        }

每个MCP工具都包含定义其特性的属性。可通过下方表格了解其含义。如需更多细节,请参考FastApps文档。

必需类属性

属性 类型 描述 示例
identifier str 唯一widget标识,必须与widgets/目录下文件夹同名 "greeting"
title str 在ChatGPT界面展示的人类可读名称 "Show Greeting Widget"
input_schema Type[BaseModel] 输入参数定义,ChatGPT通过JSON schema判断如何调用工具 GreetingInput
invoking str 调用执行时显示的提示 "Preparing your greeting…"
invoked str 执行结束时显示的提示 "Greeting ready!"

可选属性

属性 类型 描述 示例
description str 说明工具用途,便于模型判断何时调用 "Display a personalized greeting widget"
widget_accessible bool 组件是否可从前端触发工具 True

2️⃣ widgets/ — 前端UI(React)

该目录包含在ChatGPT显示的UI组件。

示例:

// widgets/my-widget/index.jsx
import React from 'react';
import { useWidgetProps } from 'fastapps';

export default function MyWidget() {
  const props = useWidgetProps();

  return (
    <div style={{
      padding: '40px',
      textAlign: 'center',
      background: '#4A90E2',
      color: 'white',
      borderRadius: '12px'
    }}>
      <h1>{props.message}</h1>
      <p>Welcome, {props.name}!</p>
    </div>
  );
}

Widgets是React组件,并可通过特殊hooks与ChatGPT交互。如需更多细节,请参考FastApps文档。

第6步:部署你的ChatGPT应用

你可以直接通过CLI部署:

fastapps cloud deploy

按照CLI指引逐步操作即可。

结语

在本教程中,你学习了如何使用FastApps框架创建ChatGPT应用。

你已搭建了应用核心——MCP服务器,创建了widgets和工具,并通过CLI将其部署公开。

如果你想进一步了解从零开始构建应用的流程,可以参考这篇构建指南[Build Your First ChatGPT App](构建指南 Build Your First ChatGPT App),其中包含从Apps SDK到部署的完整步骤示例。

这一结构非常简单却功能强大。

只需少量代码,你就能构建一个可供所有人使用的完整ChatGPT应用。

© 2016 - 2025 Inkchron

Powered by Inkchron.

关于我

Hi,这里是笔墨拾光的博客。“笔墨拾光” 是我用来收纳日常经验的小角落标识~

我是职场搬砖人 + 生活折腾爱好者,在这里会记录工作里的避坑技巧、生活中的实用小招。欢迎你通过评论与我交流经验~。

© 2016 - 2025 Inkchron

Powered by Inkchron.