getConversation(conversation_id) → full message tree once the reply finishes
sendMessage no longer needs model / parentMessageId — the chatgpt-web
adapter drives the live SPA, so the page picks the active model and threads
the new turn for you. Pass prompt only.
Operations
Operation
Intent
Key Input
Key Output
Notes
getProfile
authenticated user info
—
id, name, email
entry point
listConversations
recent conversations
limit?, cursor?
items[].id, title, cursor
paginated (cursor)
getConversation
full conversation detail
conversationId ← listConversations | sendMessage
mapping (message tree), current_node
tree structure
searchConversations
search past conversations
query
items[].conversation_id, snippet
paginated (offset cursor)
getModels
available models
—
models[].slug, title
entry point
sendMessage
send message, get reply
prompt
conversation_id, response_text, sse_event_count
WRITE; SPA-driven adapter
Quick Start
# Get user profile
openweb chatgpt exec getProfile '{}'
# List recent conversations
openweb chatgpt exec listConversations '{"limit": 10}'
# Get a conversation
openweb chatgpt exec getConversation '{"conversationId": "<id>"}'
# Search conversations
openweb chatgpt exec searchConversations '{"query": "python"}'
# Get available models
openweb chatgpt exec getModels '{}'
# Send a message (SPA-driven)
openweb chatgpt exec sendMessage '{"prompt": "Summarize the OpenWeb readme."}'
Known Limitations
sendMessage.response_text may come back empty. Playwright's
Response.text() resolves before the SSE stream finishes, so the adapter
often captures only the opening frames. conversation_id is reliable —
follow up with getConversation to read the assembled reply. Fix path:
switch the adapter to a CDP Network.dataReceived listener that buffers
frames until the stream closes.
sendMessage requires a managed browser session. Runs through the
live chatgpt.com SPA so the page can solve OpenAI's Sentinel
chat-requirements + SHA3-512 proof-of-work challenge. There is no Node
fallback. See DOC.md § Adapter pattern for the full rationale.
Read ops still use Node transport (exchange_chain → Bearer). Only
sendMessage is adapter-driven.
1---2name: chatgpt3description: ChatGPT4---5# ChatGPT67## Overview8ChatGPT backend API — OpenAI's conversational AI interface. Content platform archetype.910## Workflows1112### Browse conversations131. `listConversations` → pick conversation → `conversationId`142. `getConversation(conversationId)` → full message tree1516### Search and read171. `searchConversations(query)` → results with `conversationId`182. `getConversation(conversationId)` → full message tree1920### Send a message211. `sendMessage({ prompt })` → SPA-driven send → `{ conversation_id, response_text }`222. `getConversation(conversation_id)` → full message tree once the reply finishes2324`sendMessage` no longer needs `model` / `parentMessageId` — the chatgpt-web25adapter drives the live SPA, so the page picks the active model and threads26the new turn for you. Pass `prompt` only.2728## Operations2930| Operation | Intent | Key Input | Key Output | Notes |31|-----------|--------|-----------|------------|-------|32| getProfile | authenticated user info | — | id, name, email | entry point |33| listConversations | recent conversations | limit?, cursor? | items[].id, title, cursor | paginated (cursor) |34| getConversation | full conversation detail | conversationId ← listConversations \| sendMessage | mapping (message tree), current_node | tree structure |35| searchConversations | search past conversations | query | items[].conversation_id, snippet | paginated (offset cursor) |36| getModels | available models | — | models[].slug, title | entry point |37| sendMessage | send message, get reply | prompt | conversation_id, response_text, sse_event_count | WRITE; SPA-driven adapter |3839## Quick Start4041```bash42# Get user profile43openweb chatgpt exec getProfile '{}'4445# List recent conversations46openweb chatgpt exec listConversations '{"limit": 10}'4748# Get a conversation49openweb chatgpt exec getConversation '{"conversationId": "<id>"}'5051# Search conversations52openweb chatgpt exec searchConversations '{"query": "python"}'5354# Get available models55openweb chatgpt exec getModels '{}'5657# Send a message (SPA-driven)58openweb chatgpt exec sendMessage '{"prompt": "Summarize the OpenWeb readme."}'59```6061## Known Limitations6263- **`sendMessage.response_text` may come back empty.** Playwright's64 `Response.text()` resolves before the SSE stream finishes, so the adapter65 often captures only the opening frames. `conversation_id` is reliable —66 follow up with `getConversation` to read the assembled reply. Fix path:67 switch the adapter to a CDP `Network.dataReceived` listener that buffers68 frames until the stream closes.69- **`sendMessage` requires a managed browser session.** Runs through the70 live chatgpt.com SPA so the page can solve OpenAI's Sentinel71 chat-requirements + SHA3-512 proof-of-work challenge. There is no Node72 fallback. See `DOC.md` § Adapter pattern for the full rationale.73- **Read ops still use Node transport** (`exchange_chain` → Bearer). Only74 `sendMessage` is adapter-driven.
Run npx skillmds@latest add spike-faye-lei/chatgpt in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
ChatGPT It is listed under Coding & Dev Tools on SkillMD.
This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
spike-faye-lei (@spike-faye-lei) published this skill. Their other Agent Skills are listed on their SkillMD profile.