展示HN:经过两周的编码,三个月的OpenAI审核,我的ChatGPT应用上线了。

4作者: Aldipower2 个月前原帖
我运营着Tredict,这是一个我自2020年以来一直在构建的耐力运动训练平台。OpenAI在12月开放了ChatGPT应用目录,允许第三方提交,现在官方的Tredict应用已经上线。实际的编程工作花了我两周时间,但整个过程持续了三个月。 欢迎提问关于向OpenAI提交过程的任何问题(时间线、审核工作、他们的要求),我也可以分享我如何在iframe小部件中解决用户认证内容的问题,或者为什么我不得不移除某些工具以保持在OpenAI的健身/健康领域内。 通过几个简单的步骤,您可以使用免费的ChatGPT账户进行连接,然后让ChatGPT分析您的活动、重命名过去的训练或创建结构化的锻炼计划。计划中的锻炼会通过Tredict与Garmin、Coros、Wahoo、Suunto等设备同步。当您请求时,互动的Tredict视图会直接在聊天线程中打开,展示实际活动的图表、地图和指标,或者您刚刚创建的结构化锻炼。 我觉得这其中有两个有趣的地方: 这个应用使用的是MCP UI应用,而不仅仅是工具。Tredict的实际活动和计划视图在聊天中呈现为互动小部件。我迄今为止看到的大多数ChatGPT应用仅限于工具,使用小部件的模式仍然不常见。将用户认证内容放入这些小部件是最困难的部分。小部件运行在一个沙盒iframe中,无法访问用户的OAuth令牌,目前基本上没有相关的最佳实践文档。 ChatGPT在上下文窗口方面也比较节省,因此它往往会获取活动列表而跳过详细的指标,除非您主动提示。模糊的“告诉我关于我跑步的事”会得到一个浅显的回答,而“获取详细信息并给我一个详细评估”则会得到全面的分析。在多周计划创建方面,Claude与相同的MCP服务器的表现明显更好。使用Claude.ai,我可以构建跨越数周甚至数月的完整结构化训练计划,进行适当的周期化、混合运动类型和基于过去活动数据的个性化间歇。ChatGPT在这个范围内表现不佳。限制在于主机,而不是服务器。互动的MCP UI应用在Claude.ai中也能正常工作,因此相同的活动和计划小部件也能直接在聊天中呈现。 服务器位于 [https://www.tredict.com/api/mcp/v2](https://www.tredict.com/api/mcp/v2),并与任何MCP兼容的主机配合使用。老实说,它与Claude.ai的兼容性最好,这使得我的申请在Anthropic的连接器目录中待审核而没有反馈显得有些荒谬。如果有Anthropic的同事看到这条信息:我非常希望能得到状态更新,甚至是拒绝的理由。
查看原文
I run Tredict, an endurance sports training platform I&#x27;ve been building since 2020. OpenAI opened the ChatGPT App Directory to third-party submissions in December, and the official Tredict app is now live. The actual programming took me two weeks, but the entire process took three months.<p>AMA on the submission process to OpenAI (timeline, review effort, what they ask for), how I solved user-authenticated content inside the iframe widgets, or why I had to remove certain tools to stay on the fitness side of OpenAI&#x27;s fitness&#x2F;health line.<p><a href="https:&#x2F;&#x2F;www.tredict.com&#x2F;blog&#x2F;tredict_chatgpt_app&#x2F;" rel="nofollow">https:&#x2F;&#x2F;www.tredict.com&#x2F;blog&#x2F;tredict_chatgpt_app&#x2F;</a><p>Connect with a free ChatGPT account in a couple of clicks, then ask ChatGPT to analyse your activities, rename past sessions, or create structured workouts. Planned workouts sync to Garmin, Coros, Wahoo, Suunto and some more via Tredict. When you ask for it, an interactive Tredict view opens directly in the chat thread, showing the actual activity with charts, map and metrics, or the structured workout you just created.<p>Two things I find interesting about this:<p>The app uses MCP UI Apps, not just tools. Tredict&#x27;s actual activity and plan views render inside the chat as interactive widgets. Most ChatGPT apps I&#x27;ve seen so far are tool-only, the widget pattern is still uncommon. Getting user-authenticated content into those widgets was the hardest part. The widget runs in a sandboxed iframe that has no access to the user&#x27;s OAuth tokens, and there are basically no documented best practices for this yet.<p>ChatGPT is also frugal with its context window, so it tends to fetch the activity list and skip the detailed metrics unless you nudge it. A vague &quot;tell me about my run&quot; gets a shallow answer, while &quot;fetch the details and give me a detailed assessment&quot; gets the full analysis. For multi-week plan creation Claude with the same MCP server still works noticeably better. With Claude.ai I can build full structured training plans spanning weeks or even months, with proper periodisation, mixed sport types and individualised intervals based on past activity data. ChatGPT struggles with that scope. The limit sits with the host, not the server. The interactive MCP UI Apps also work in Claude.ai, so the same activity and plan widgets render directly in the chat there too.<p>Server lives at <a href="https:&#x2F;&#x2F;www.tredict.com&#x2F;api&#x2F;mcp&#x2F;v2" rel="nofollow">https:&#x2F;&#x2F;www.tredict.com&#x2F;api&#x2F;mcp&#x2F;v2</a> and works with any MCP-compatible host. Honestly it works best with Claude.ai, which makes it slightly absurd that my application to be listed in Anthropic&#x27;s connector directory has been pending without feedback for a while. If any Anthropic folks see this: would genuinely appreciate a status update or even a rejection with reason.