[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-openai-openai-platform-api-key":3,"mdc--a1yuij-key":37,"related-repo-openai-openai-platform-api-key":1160,"related-org-openai-openai-platform-api-key":1280},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"openai-platform-api-key","configure OpenAI platform API keys","Use when Codex is asked to build, run, test, debug, or configure an OpenAI-backed or provider-unspecified AI app, UI, script, CLI, generator, or tool, especially requests phrased only as \"using AI\" or generators driven by forms\u002Fuser input; also use for OPENAI_API_KEY or sk-proj setup. Treat this as the credential gate: inspect safely, ask reuse-vs-new before API work, and never expose plaintext.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"openai","OpenAI","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fopenai.png",[12,16,19,20,23],{"name":13,"slug":14,"type":15},"Security","security","tag",{"name":17,"slug":18,"type":15},"LLM","llm",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"AI Infrastructure","ai-infrastructure",{"name":24,"slug":25,"type":15},"API Development","api-development",3992,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fplugins","2026-05-07T05:55:41.14768",null,465,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"OpenAI Plugins","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fplugins\u002Ftree\u002FHEAD\u002Fplugins\u002Fopenai-developers\u002Fskills\u002Fopenai-platform-api-key","---\nname: openai-platform-api-key\ndescription: 'Use when Codex is asked to build, run, test, debug, or configure an OpenAI-backed or provider-unspecified AI app, UI, script, CLI, generator, or tool, especially requests phrased only as \"using AI\" or generators driven by forms\u002Fuser input; also use for OPENAI_API_KEY or sk-proj setup. Treat this as the credential gate: inspect safely, ask reuse-vs-new before API work, and never expose plaintext.'\n---\n\n# OpenAI API Key\n\nUse this skill only in Codex local\u002Fapp sessions. Create keys through the secure OpenAI Platform connector, keep plaintext out of normal tool output, and write secrets only to a confirmed local destination.\n\n## When To Use\n\nUse this skill as the credential gate for API-backed work, not as the app, docs, or frontend implementation skill.\n\nUse it when:\n\n- The user asks for an OpenAI API key, `OPENAI_API_KEY`, or an `sk-proj` key.\n- Codex will build, implement, run, test, debug, or configure an app, script, CLI, generator, UI, or tool that calls the OpenAI API, even before a live request and even if a usable key already exists.\n- The user asks Codex to build, implement, run, or configure an app, script, CLI, generator, or tool that uses AI to produce outputs from user input.\n- The user asks for an AI-powered app or UI that generates output from one or more input fields, forms, prompts, files, or other user-provided values.\n- The user says \"using AI\" in an app\u002Fscript\u002Fbuild request and does not name a different provider.\n\nDo not use it when:\n\n- The user only wants documentation, citations, model or API guidance, conceptual explanation, or code examples without asking Codex to build, run, configure, or debug an API-backed artifact.\n- The user asks for a static frontend, visual mockup, design concept, or placeholder UI with no API-backed behavior.\n- The user only asks Codex to write a one-off output directly and no app, script, generator, or API-backed tool is being built or run.\n- The user names a different AI provider for the artifact.\n\nIf API access is needed and no usable key is found, offer secure key provisioning instead of leaving only placeholder docs or manual setup steps.\n\n## Coordination With Implementation Skills\n\nWhen another implementation skill also applies, run this skill first only to inspect credentials safely and send the credential decision message. Until reuse-existing-key vs create-new-key is resolved, it outranks design-first and implementation-first flows, including `build-web-apps:frontend-app-builder`; do not design UI, choose architecture, inspect API examples, write code, or run smoke tests. After the user answers, hand off to the appropriate implementation, docs, or frontend skill.\n\n## Safety Rules\n\n- Never request, print, summarize, quote, or paste a plaintext API key.\n- Never inspect credentials with commands that can print secret values, such as `cat .env*`, `grep OPENAI_API_KEY .env*`, or `rg OPENAI_API_KEY .env*`. Use silent exit-status checks or redacted summaries only.\n- Use the Platform connector `open_codex_api_key_setup` tool when it is available. Do not send local workspace paths, env-file paths, or target arrays to the picker.\n- Do not use the ChatGPT-only browser\u002Fwidget `_start_api_key_setup` flow from Codex.\n- Only pass public JWK material (`kty`, `n`, `e`) to the connector.\n- Before creating a key or writing any secret, obtain explicit confirmation. Prefer the hosted Platform picker plus local destination confirmation when it is available; if it is unavailable, fall back to a typed local destination question, then wait.\n- Prefer ignored or untracked env files. In git repos, avoid tracked targets unless the user explicitly confirms that choice.\n- The local helper may handle plaintext in memory and write it to the confirmed file. Its stdout\u002Fstderr must not include the key.\n- When decrypting in a repo, pass the repo root as `--workspace`; the helper refuses symlink targets and targets outside that workspace.\n- Keep user-facing messages concise. Unless the user asks or a failure requires it, say only that Codex will create the key securely and write it to the confirmed env file.\n- Do not narrate deterministic mechanics such as helper discovery, encryption, decryption, RSA, JWKs, ciphertext, temporary files, cleanup, permissions checks, or redacted verification unless an error requires user action.\n- Report only safe metadata: path, env var name, key name, org\u002Fproject names, and whether an existing env var was updated.\n\n## Mandatory First Step\n\nBefore editing, testing, running, debugging, or configuring any code that calls the OpenAI API:\n\n1. Inspect for a usable `OPENAI_API_KEY` without printing it.\n2. Unless the user explicitly asked for a new key, ask whether to reuse an existing key or create a new one. If none exists, ask whether to create one.\n3. Stop until the user answers.\n\nThis applies even if:\n\n- a usable key already exists\n- no live API call will be made\n- no secret will be written\n- the task is \"just create a script\"\n\nFinding an existing key is not permission to proceed. It only changes the question you ask.\n\nThe credential decision is a hard stop. Before the user answers, do not create directories, scaffold files, draft implementation plans, wire API-dependent code, run smoke tests, or give placeholder\u002Fmanual key setup instructions. The only allowed pre-gate work is safe repo convention discovery and credential presence checks that do not print secrets.\n\n## Credential Decision Messages\n\nRequired progress updates before or during credential inspection may be brief and limited to saying that Codex is checking credentials or opening secure key setup. They must not describe implementation plans, architecture, file choices, local destination details, or credential conclusions before the credential decision or picker handoff.\n\nAfter inspecting credentials, the next substantive user-facing message must be the credential decision message. Do not send another substantive message before this decision.\n\nUse one of these branches:\n\n- Existing usable key found, and the user did not explicitly ask for a new key: make clear that the OpenAI API will power the app, script, or project, say that an existing usable `OPENAI_API_KEY` was found without revealing it, then ask whether to reuse that key or create a new one.\n- No usable key found: make clear that the OpenAI API will power the app, script, or project, say that no usable `OPENAI_API_KEY` was found, then ask whether to create one securely.\n- User explicitly asked for a new key: skip the reuse question and open the Platform picker directly when available.\n\nAfter sending the credential decision message, stop until the user answers.\n\n## Workflow\n\n1. Inspect before acting:\n   - look for a usable key without printing secret values in the current environment and likely local env files such as `.env.local`, `.env`, and ignored framework-specific env files\n   - inspect env files only with no-output checks that reveal presence\u002Fabsence, never with commands that echo matching lines or whole files\n   - check README\u002Fsetup docs, `OPENAI_BASE_URL`, and framework env docs for repo conventions separately from secret-bearing env files\n   - prefer ignored or untracked env files; avoid tracked targets unless the user explicitly confirms that choice\n   - default to `.env.local` and `OPENAI_API_KEY` when no stronger convention exists\n2. Based on that inspection:\n   - for tasks that will call the OpenAI API, when asking this up-front question, mention that the OpenAI API will power the app, script, or project before mentioning whether an existing key was found in the environment or local env files\n   - if the user explicitly asked for a new key, no reuse decision is needed\n   - otherwise, before building, implementing, running, testing, debugging, or configuring an app or script that calls the OpenAI API, ask up front whether to reuse an existing usable key or create a new one\n   - if no usable key exists, ask whether to create one before building the rest of the app\n   - ask this up front even before any live request; after asking, stop without adding an app plan, file list, code sketch, manual `OPENAI_API_KEY` instructions, or fallback placeholder setup\n   - do not silently reuse a detected key for implementation, verification, smoke tests, or other live requests just because the user did not ask about credentials\n   - treat requests to create or configure a key as ambiguous unless the user says they want a new key\n   - if the user chooses reuse and a persistent file write is still needed, confirm the destination file\u002Fenv var before writing\n3. When creation is the chosen path, confirm the destination file\u002Fenv var before writing. If the user has not already explicitly asked for a new key, ask whether to create one first.\n   - Prefer the hosted Platform picker:\n     - use `tool_search` to load `open_codex_api_key_setup`\n     - call `open_codex_api_key_setup` directly with no arguments (`{}`). Do not send a key name, local paths, workspace arguments, or target arrays. The picker collects the key name, automatically loads organization\u002Fproject choices, and sends a later widget-authored follow-up with the confirmed key name plus selected opaque ids\n     - after `open_codex_api_key_setup` returns without an error, end the current turn immediately and wait for the widget-generated follow-up prompt. Do not inspect or interpret the launch payload, search for connector contract details, run local-save steps, make another tool call, or send any non-empty user-facing message, including a picker-open confirmation, in that turn\n   - After the widget follow-up, or if the picker tool is unavailable or fails before the widget opens, choose the best local env-file target from repo conventions, defaulting to `.env.local` and `OPENAI_API_KEY`.\n   - Use `tool_search` to load the OpenAI Developers MCP `confirm_openai_api_key_local_destination` tool. If available, call it with the absolute workspace root, the recommended env-file target, and `OPENAI_API_KEY`. The form shows the recommended location and lets the user replace it before continuing.\n   - If the local destination tool returns `approved`, use its returned `targetPath` exactly and do not ask a second destination question. If it is declined or canceled, stop.\n   - If the local destination tool is unavailable, ask exactly one short question and stop: `Save the new key to \u003Cpath>? Reply yes to continue, another workspace-relative env-file path to change it, or decline.` If the user declines, stop; otherwise use the confirmed path.\n   - Silently check whether the selected target is tracked. If it is tracked, stop and obtain explicit confirmation that a secret will be written there. In this local fallback, do not claim the user selected an explicit organization\u002Fproject target.\n4. After confirmation, run the app tool preflight:\n   - use `tool_search` to load `create_encrypted_openai_api_key`\n   - if missing and `tool_suggest` is available, suggest installing connector `connector_2de447f3f15448ebab48783d7e4f5d81`\n   - if unavailable or auth fails, ask the user to connect OpenAI Platform from `\u002Fapps` or the `$` app picker, then retry `tool_search` after they finish\n5. Run `prepare`, keep `private_key_path`, and send only `recipient_public_key_jwk` to the connector.\n6. Call `create_encrypted_openai_api_key` with the confirmed key name plus the picker-confirmed `organization_id` and `project_id` when the picker path was used. In the text-only fallback, omit those fields so the connector preserves its default organization\u002Fproject behavior.\n7. Run `decrypt` with the encrypted ciphertext, confirmed target path, env var name, and repo root as `--workspace`.\n8. Verify by running the relevant project command when practical. Do not reveal or inspect the secret value directly.\n\n## Helper\n\nUse the helper by absolute path. `prepare` creates the temporary private key file plus a request JSON containing only the public JWK and requested key name:\n\n```bash\nnode \"\u003Cplugin root>\u002Fscripts\u002Fopenai-platform-api-key.mjs\" prepare --name \"Codex\"\n```\n\nAfter the connector returns `encrypted_api_key.ciphertext`, decrypt and write the key locally:\n\n```bash\nnode \"\u003Cplugin root>\u002Fscripts\u002Fopenai-platform-api-key.mjs\" decrypt \\\n  --private-key \"\u003Cprivate key path from prepare>\" \\\n  --ciphertext \"\u003Cencrypted_api_key.ciphertext from connector result>\" \\\n  --target \"\u003Cconfirmed env file path>\" \\\n  --workspace \"\u003Crepo root>\" \\\n  --env-name OPENAI_API_KEY\n```\n\nThe decrypt command updates or appends the env var, prints only safe write metadata, and refuses symlink or out-of-workspace targets.\n\n## References\n\n- `references\u002Fevals.md`: trigger and routing eval cases for this skill.\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,51,57,64,69,74,121,126,149,154,160,173,179,312,318,323,349,354,377,382,387,393,398,403,408,440,445,451,879,885,897,961,974,1129,1134,1140,1154],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"openai-api-key",[48],{"type":49,"value":50},"text","OpenAI API Key",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55],{"type":49,"value":56},"Use this skill only in Codex local\u002Fapp sessions. Create keys through the secure OpenAI Platform connector, keep plaintext out of normal tool output, and write secrets only to a confirmed local destination.",{"type":43,"tag":58,"props":59,"children":61},"h2",{"id":60},"when-to-use",[62],{"type":49,"value":63},"When To Use",{"type":43,"tag":52,"props":65,"children":66},{},[67],{"type":49,"value":68},"Use this skill as the credential gate for API-backed work, not as the app, docs, or frontend implementation skill.",{"type":43,"tag":52,"props":70,"children":71},{},[72],{"type":49,"value":73},"Use it when:",{"type":43,"tag":75,"props":76,"children":77},"ul",{},[78,101,106,111,116],{"type":43,"tag":79,"props":80,"children":81},"li",{},[82,84,91,93,99],{"type":49,"value":83},"The user asks for an OpenAI API key, ",{"type":43,"tag":85,"props":86,"children":88},"code",{"className":87},[],[89],{"type":49,"value":90},"OPENAI_API_KEY",{"type":49,"value":92},", or an ",{"type":43,"tag":85,"props":94,"children":96},{"className":95},[],[97],{"type":49,"value":98},"sk-proj",{"type":49,"value":100}," key.",{"type":43,"tag":79,"props":102,"children":103},{},[104],{"type":49,"value":105},"Codex will build, implement, run, test, debug, or configure an app, script, CLI, generator, UI, or tool that calls the OpenAI API, even before a live request and even if a usable key already exists.",{"type":43,"tag":79,"props":107,"children":108},{},[109],{"type":49,"value":110},"The user asks Codex to build, implement, run, or configure an app, script, CLI, generator, or tool that uses AI to produce outputs from user input.",{"type":43,"tag":79,"props":112,"children":113},{},[114],{"type":49,"value":115},"The user asks for an AI-powered app or UI that generates output from one or more input fields, forms, prompts, files, or other user-provided values.",{"type":43,"tag":79,"props":117,"children":118},{},[119],{"type":49,"value":120},"The user says \"using AI\" in an app\u002Fscript\u002Fbuild request and does not name a different provider.",{"type":43,"tag":52,"props":122,"children":123},{},[124],{"type":49,"value":125},"Do not use it when:",{"type":43,"tag":75,"props":127,"children":128},{},[129,134,139,144],{"type":43,"tag":79,"props":130,"children":131},{},[132],{"type":49,"value":133},"The user only wants documentation, citations, model or API guidance, conceptual explanation, or code examples without asking Codex to build, run, configure, or debug an API-backed artifact.",{"type":43,"tag":79,"props":135,"children":136},{},[137],{"type":49,"value":138},"The user asks for a static frontend, visual mockup, design concept, or placeholder UI with no API-backed behavior.",{"type":43,"tag":79,"props":140,"children":141},{},[142],{"type":49,"value":143},"The user only asks Codex to write a one-off output directly and no app, script, generator, or API-backed tool is being built or run.",{"type":43,"tag":79,"props":145,"children":146},{},[147],{"type":49,"value":148},"The user names a different AI provider for the artifact.",{"type":43,"tag":52,"props":150,"children":151},{},[152],{"type":49,"value":153},"If API access is needed and no usable key is found, offer secure key provisioning instead of leaving only placeholder docs or manual setup steps.",{"type":43,"tag":58,"props":155,"children":157},{"id":156},"coordination-with-implementation-skills",[158],{"type":49,"value":159},"Coordination With Implementation Skills",{"type":43,"tag":52,"props":161,"children":162},{},[163,165,171],{"type":49,"value":164},"When another implementation skill also applies, run this skill first only to inspect credentials safely and send the credential decision message. Until reuse-existing-key vs create-new-key is resolved, it outranks design-first and implementation-first flows, including ",{"type":43,"tag":85,"props":166,"children":168},{"className":167},[],[169],{"type":49,"value":170},"build-web-apps:frontend-app-builder",{"type":49,"value":172},"; do not design UI, choose architecture, inspect API examples, write code, or run smoke tests. After the user answers, hand off to the appropriate implementation, docs, or frontend skill.",{"type":43,"tag":58,"props":174,"children":176},{"id":175},"safety-rules",[177],{"type":49,"value":178},"Safety Rules",{"type":43,"tag":75,"props":180,"children":181},{},[182,187,216,229,242,269,274,279,284,297,302,307],{"type":43,"tag":79,"props":183,"children":184},{},[185],{"type":49,"value":186},"Never request, print, summarize, quote, or paste a plaintext API key.",{"type":43,"tag":79,"props":188,"children":189},{},[190,192,198,200,206,208,214],{"type":49,"value":191},"Never inspect credentials with commands that can print secret values, such as ",{"type":43,"tag":85,"props":193,"children":195},{"className":194},[],[196],{"type":49,"value":197},"cat .env*",{"type":49,"value":199},", ",{"type":43,"tag":85,"props":201,"children":203},{"className":202},[],[204],{"type":49,"value":205},"grep OPENAI_API_KEY .env*",{"type":49,"value":207},", or ",{"type":43,"tag":85,"props":209,"children":211},{"className":210},[],[212],{"type":49,"value":213},"rg OPENAI_API_KEY .env*",{"type":49,"value":215},". Use silent exit-status checks or redacted summaries only.",{"type":43,"tag":79,"props":217,"children":218},{},[219,221,227],{"type":49,"value":220},"Use the Platform connector ",{"type":43,"tag":85,"props":222,"children":224},{"className":223},[],[225],{"type":49,"value":226},"open_codex_api_key_setup",{"type":49,"value":228}," tool when it is available. Do not send local workspace paths, env-file paths, or target arrays to the picker.",{"type":43,"tag":79,"props":230,"children":231},{},[232,234,240],{"type":49,"value":233},"Do not use the ChatGPT-only browser\u002Fwidget ",{"type":43,"tag":85,"props":235,"children":237},{"className":236},[],[238],{"type":49,"value":239},"_start_api_key_setup",{"type":49,"value":241}," flow from Codex.",{"type":43,"tag":79,"props":243,"children":244},{},[245,247,253,254,260,261,267],{"type":49,"value":246},"Only pass public JWK material (",{"type":43,"tag":85,"props":248,"children":250},{"className":249},[],[251],{"type":49,"value":252},"kty",{"type":49,"value":199},{"type":43,"tag":85,"props":255,"children":257},{"className":256},[],[258],{"type":49,"value":259},"n",{"type":49,"value":199},{"type":43,"tag":85,"props":262,"children":264},{"className":263},[],[265],{"type":49,"value":266},"e",{"type":49,"value":268},") to the connector.",{"type":43,"tag":79,"props":270,"children":271},{},[272],{"type":49,"value":273},"Before creating a key or writing any secret, obtain explicit confirmation. Prefer the hosted Platform picker plus local destination confirmation when it is available; if it is unavailable, fall back to a typed local destination question, then wait.",{"type":43,"tag":79,"props":275,"children":276},{},[277],{"type":49,"value":278},"Prefer ignored or untracked env files. In git repos, avoid tracked targets unless the user explicitly confirms that choice.",{"type":43,"tag":79,"props":280,"children":281},{},[282],{"type":49,"value":283},"The local helper may handle plaintext in memory and write it to the confirmed file. Its stdout\u002Fstderr must not include the key.",{"type":43,"tag":79,"props":285,"children":286},{},[287,289,295],{"type":49,"value":288},"When decrypting in a repo, pass the repo root as ",{"type":43,"tag":85,"props":290,"children":292},{"className":291},[],[293],{"type":49,"value":294},"--workspace",{"type":49,"value":296},"; the helper refuses symlink targets and targets outside that workspace.",{"type":43,"tag":79,"props":298,"children":299},{},[300],{"type":49,"value":301},"Keep user-facing messages concise. Unless the user asks or a failure requires it, say only that Codex will create the key securely and write it to the confirmed env file.",{"type":43,"tag":79,"props":303,"children":304},{},[305],{"type":49,"value":306},"Do not narrate deterministic mechanics such as helper discovery, encryption, decryption, RSA, JWKs, ciphertext, temporary files, cleanup, permissions checks, or redacted verification unless an error requires user action.",{"type":43,"tag":79,"props":308,"children":309},{},[310],{"type":49,"value":311},"Report only safe metadata: path, env var name, key name, org\u002Fproject names, and whether an existing env var was updated.",{"type":43,"tag":58,"props":313,"children":315},{"id":314},"mandatory-first-step",[316],{"type":49,"value":317},"Mandatory First Step",{"type":43,"tag":52,"props":319,"children":320},{},[321],{"type":49,"value":322},"Before editing, testing, running, debugging, or configuring any code that calls the OpenAI API:",{"type":43,"tag":324,"props":325,"children":326},"ol",{},[327,339,344],{"type":43,"tag":79,"props":328,"children":329},{},[330,332,337],{"type":49,"value":331},"Inspect for a usable ",{"type":43,"tag":85,"props":333,"children":335},{"className":334},[],[336],{"type":49,"value":90},{"type":49,"value":338}," without printing it.",{"type":43,"tag":79,"props":340,"children":341},{},[342],{"type":49,"value":343},"Unless the user explicitly asked for a new key, ask whether to reuse an existing key or create a new one. If none exists, ask whether to create one.",{"type":43,"tag":79,"props":345,"children":346},{},[347],{"type":49,"value":348},"Stop until the user answers.",{"type":43,"tag":52,"props":350,"children":351},{},[352],{"type":49,"value":353},"This applies even if:",{"type":43,"tag":75,"props":355,"children":356},{},[357,362,367,372],{"type":43,"tag":79,"props":358,"children":359},{},[360],{"type":49,"value":361},"a usable key already exists",{"type":43,"tag":79,"props":363,"children":364},{},[365],{"type":49,"value":366},"no live API call will be made",{"type":43,"tag":79,"props":368,"children":369},{},[370],{"type":49,"value":371},"no secret will be written",{"type":43,"tag":79,"props":373,"children":374},{},[375],{"type":49,"value":376},"the task is \"just create a script\"",{"type":43,"tag":52,"props":378,"children":379},{},[380],{"type":49,"value":381},"Finding an existing key is not permission to proceed. It only changes the question you ask.",{"type":43,"tag":52,"props":383,"children":384},{},[385],{"type":49,"value":386},"The credential decision is a hard stop. Before the user answers, do not create directories, scaffold files, draft implementation plans, wire API-dependent code, run smoke tests, or give placeholder\u002Fmanual key setup instructions. The only allowed pre-gate work is safe repo convention discovery and credential presence checks that do not print secrets.",{"type":43,"tag":58,"props":388,"children":390},{"id":389},"credential-decision-messages",[391],{"type":49,"value":392},"Credential Decision Messages",{"type":43,"tag":52,"props":394,"children":395},{},[396],{"type":49,"value":397},"Required progress updates before or during credential inspection may be brief and limited to saying that Codex is checking credentials or opening secure key setup. They must not describe implementation plans, architecture, file choices, local destination details, or credential conclusions before the credential decision or picker handoff.",{"type":43,"tag":52,"props":399,"children":400},{},[401],{"type":49,"value":402},"After inspecting credentials, the next substantive user-facing message must be the credential decision message. Do not send another substantive message before this decision.",{"type":43,"tag":52,"props":404,"children":405},{},[406],{"type":49,"value":407},"Use one of these branches:",{"type":43,"tag":75,"props":409,"children":410},{},[411,423,435],{"type":43,"tag":79,"props":412,"children":413},{},[414,416,421],{"type":49,"value":415},"Existing usable key found, and the user did not explicitly ask for a new key: make clear that the OpenAI API will power the app, script, or project, say that an existing usable ",{"type":43,"tag":85,"props":417,"children":419},{"className":418},[],[420],{"type":49,"value":90},{"type":49,"value":422}," was found without revealing it, then ask whether to reuse that key or create a new one.",{"type":43,"tag":79,"props":424,"children":425},{},[426,428,433],{"type":49,"value":427},"No usable key found: make clear that the OpenAI API will power the app, script, or project, say that no usable ",{"type":43,"tag":85,"props":429,"children":431},{"className":430},[],[432],{"type":49,"value":90},{"type":49,"value":434}," was found, then ask whether to create one securely.",{"type":43,"tag":79,"props":436,"children":437},{},[438],{"type":49,"value":439},"User explicitly asked for a new key: skip the reuse question and open the Platform picker directly when available.",{"type":43,"tag":52,"props":441,"children":442},{},[443],{"type":49,"value":444},"After sending the credential decision message, stop until the user answers.",{"type":43,"tag":58,"props":446,"children":448},{"id":447},"workflow",[449],{"type":49,"value":450},"Workflow",{"type":43,"tag":324,"props":452,"children":453},{},[454,524,579,729,800,829,856,874],{"type":43,"tag":79,"props":455,"children":456},{},[457,459],{"type":49,"value":458},"Inspect before acting:\n",{"type":43,"tag":75,"props":460,"children":461},{},[462,482,487,500,505],{"type":43,"tag":79,"props":463,"children":464},{},[465,467,473,474,480],{"type":49,"value":466},"look for a usable key without printing secret values in the current environment and likely local env files such as ",{"type":43,"tag":85,"props":468,"children":470},{"className":469},[],[471],{"type":49,"value":472},".env.local",{"type":49,"value":199},{"type":43,"tag":85,"props":475,"children":477},{"className":476},[],[478],{"type":49,"value":479},".env",{"type":49,"value":481},", and ignored framework-specific env files",{"type":43,"tag":79,"props":483,"children":484},{},[485],{"type":49,"value":486},"inspect env files only with no-output checks that reveal presence\u002Fabsence, never with commands that echo matching lines or whole files",{"type":43,"tag":79,"props":488,"children":489},{},[490,492,498],{"type":49,"value":491},"check README\u002Fsetup docs, ",{"type":43,"tag":85,"props":493,"children":495},{"className":494},[],[496],{"type":49,"value":497},"OPENAI_BASE_URL",{"type":49,"value":499},", and framework env docs for repo conventions separately from secret-bearing env files",{"type":43,"tag":79,"props":501,"children":502},{},[503],{"type":49,"value":504},"prefer ignored or untracked env files; avoid tracked targets unless the user explicitly confirms that choice",{"type":43,"tag":79,"props":506,"children":507},{},[508,510,515,517,522],{"type":49,"value":509},"default to ",{"type":43,"tag":85,"props":511,"children":513},{"className":512},[],[514],{"type":49,"value":472},{"type":49,"value":516}," and ",{"type":43,"tag":85,"props":518,"children":520},{"className":519},[],[521],{"type":49,"value":90},{"type":49,"value":523}," when no stronger convention exists",{"type":43,"tag":79,"props":525,"children":526},{},[527,529],{"type":49,"value":528},"Based on that inspection:\n",{"type":43,"tag":75,"props":530,"children":531},{},[532,537,542,547,552,564,569,574],{"type":43,"tag":79,"props":533,"children":534},{},[535],{"type":49,"value":536},"for tasks that will call the OpenAI API, when asking this up-front question, mention that the OpenAI API will power the app, script, or project before mentioning whether an existing key was found in the environment or local env files",{"type":43,"tag":79,"props":538,"children":539},{},[540],{"type":49,"value":541},"if the user explicitly asked for a new key, no reuse decision is needed",{"type":43,"tag":79,"props":543,"children":544},{},[545],{"type":49,"value":546},"otherwise, before building, implementing, running, testing, debugging, or configuring an app or script that calls the OpenAI API, ask up front whether to reuse an existing usable key or create a new one",{"type":43,"tag":79,"props":548,"children":549},{},[550],{"type":49,"value":551},"if no usable key exists, ask whether to create one before building the rest of the app",{"type":43,"tag":79,"props":553,"children":554},{},[555,557,562],{"type":49,"value":556},"ask this up front even before any live request; after asking, stop without adding an app plan, file list, code sketch, manual ",{"type":43,"tag":85,"props":558,"children":560},{"className":559},[],[561],{"type":49,"value":90},{"type":49,"value":563}," instructions, or fallback placeholder setup",{"type":43,"tag":79,"props":565,"children":566},{},[567],{"type":49,"value":568},"do not silently reuse a detected key for implementation, verification, smoke tests, or other live requests just because the user did not ask about credentials",{"type":43,"tag":79,"props":570,"children":571},{},[572],{"type":49,"value":573},"treat requests to create or configure a key as ambiguous unless the user says they want a new key",{"type":43,"tag":79,"props":575,"children":576},{},[577],{"type":49,"value":578},"if the user chooses reuse and a persistent file write is still needed, confirm the destination file\u002Fenv var before writing",{"type":43,"tag":79,"props":580,"children":581},{},[582,584],{"type":49,"value":583},"When creation is the chosen path, confirm the destination file\u002Fenv var before writing. If the user has not already explicitly asked for a new key, ask whether to create one first.\n",{"type":43,"tag":75,"props":585,"children":586},{},[587,645,663,690,711,724],{"type":43,"tag":79,"props":588,"children":589},{},[590,592],{"type":49,"value":591},"Prefer the hosted Platform picker:\n",{"type":43,"tag":75,"props":593,"children":594},{},[595,613,633],{"type":43,"tag":79,"props":596,"children":597},{},[598,600,606,608],{"type":49,"value":599},"use ",{"type":43,"tag":85,"props":601,"children":603},{"className":602},[],[604],{"type":49,"value":605},"tool_search",{"type":49,"value":607}," to load ",{"type":43,"tag":85,"props":609,"children":611},{"className":610},[],[612],{"type":49,"value":226},{"type":43,"tag":79,"props":614,"children":615},{},[616,618,623,625,631],{"type":49,"value":617},"call ",{"type":43,"tag":85,"props":619,"children":621},{"className":620},[],[622],{"type":49,"value":226},{"type":49,"value":624}," directly with no arguments (",{"type":43,"tag":85,"props":626,"children":628},{"className":627},[],[629],{"type":49,"value":630},"{}",{"type":49,"value":632},"). Do not send a key name, local paths, workspace arguments, or target arrays. The picker collects the key name, automatically loads organization\u002Fproject choices, and sends a later widget-authored follow-up with the confirmed key name plus selected opaque ids",{"type":43,"tag":79,"props":634,"children":635},{},[636,638,643],{"type":49,"value":637},"after ",{"type":43,"tag":85,"props":639,"children":641},{"className":640},[],[642],{"type":49,"value":226},{"type":49,"value":644}," returns without an error, end the current turn immediately and wait for the widget-generated follow-up prompt. Do not inspect or interpret the launch payload, search for connector contract details, run local-save steps, make another tool call, or send any non-empty user-facing message, including a picker-open confirmation, in that turn",{"type":43,"tag":79,"props":646,"children":647},{},[648,650,655,656,661],{"type":49,"value":649},"After the widget follow-up, or if the picker tool is unavailable or fails before the widget opens, choose the best local env-file target from repo conventions, defaulting to ",{"type":43,"tag":85,"props":651,"children":653},{"className":652},[],[654],{"type":49,"value":472},{"type":49,"value":516},{"type":43,"tag":85,"props":657,"children":659},{"className":658},[],[660],{"type":49,"value":90},{"type":49,"value":662},".",{"type":43,"tag":79,"props":664,"children":665},{},[666,668,673,675,681,683,688],{"type":49,"value":667},"Use ",{"type":43,"tag":85,"props":669,"children":671},{"className":670},[],[672],{"type":49,"value":605},{"type":49,"value":674}," to load the OpenAI Developers MCP ",{"type":43,"tag":85,"props":676,"children":678},{"className":677},[],[679],{"type":49,"value":680},"confirm_openai_api_key_local_destination",{"type":49,"value":682}," tool. If available, call it with the absolute workspace root, the recommended env-file target, and ",{"type":43,"tag":85,"props":684,"children":686},{"className":685},[],[687],{"type":49,"value":90},{"type":49,"value":689},". The form shows the recommended location and lets the user replace it before continuing.",{"type":43,"tag":79,"props":691,"children":692},{},[693,695,701,703,709],{"type":49,"value":694},"If the local destination tool returns ",{"type":43,"tag":85,"props":696,"children":698},{"className":697},[],[699],{"type":49,"value":700},"approved",{"type":49,"value":702},", use its returned ",{"type":43,"tag":85,"props":704,"children":706},{"className":705},[],[707],{"type":49,"value":708},"targetPath",{"type":49,"value":710}," exactly and do not ask a second destination question. If it is declined or canceled, stop.",{"type":43,"tag":79,"props":712,"children":713},{},[714,716,722],{"type":49,"value":715},"If the local destination tool is unavailable, ask exactly one short question and stop: ",{"type":43,"tag":85,"props":717,"children":719},{"className":718},[],[720],{"type":49,"value":721},"Save the new key to \u003Cpath>? Reply yes to continue, another workspace-relative env-file path to change it, or decline.",{"type":49,"value":723}," If the user declines, stop; otherwise use the confirmed path.",{"type":43,"tag":79,"props":725,"children":726},{},[727],{"type":49,"value":728},"Silently check whether the selected target is tracked. If it is tracked, stop and obtain explicit confirmation that a secret will be written there. In this local fallback, do not claim the user selected an explicit organization\u002Fproject target.",{"type":43,"tag":79,"props":730,"children":731},{},[732,734],{"type":49,"value":733},"After confirmation, run the app tool preflight:\n",{"type":43,"tag":75,"props":735,"children":736},{},[737,753,772],{"type":43,"tag":79,"props":738,"children":739},{},[740,741,746,747],{"type":49,"value":599},{"type":43,"tag":85,"props":742,"children":744},{"className":743},[],[745],{"type":49,"value":605},{"type":49,"value":607},{"type":43,"tag":85,"props":748,"children":750},{"className":749},[],[751],{"type":49,"value":752},"create_encrypted_openai_api_key",{"type":43,"tag":79,"props":754,"children":755},{},[756,758,764,766],{"type":49,"value":757},"if missing and ",{"type":43,"tag":85,"props":759,"children":761},{"className":760},[],[762],{"type":49,"value":763},"tool_suggest",{"type":49,"value":765}," is available, suggest installing connector ",{"type":43,"tag":85,"props":767,"children":769},{"className":768},[],[770],{"type":49,"value":771},"connector_2de447f3f15448ebab48783d7e4f5d81",{"type":43,"tag":79,"props":773,"children":774},{},[775,777,783,785,791,793,798],{"type":49,"value":776},"if unavailable or auth fails, ask the user to connect OpenAI Platform from ",{"type":43,"tag":85,"props":778,"children":780},{"className":779},[],[781],{"type":49,"value":782},"\u002Fapps",{"type":49,"value":784}," or the ",{"type":43,"tag":85,"props":786,"children":788},{"className":787},[],[789],{"type":49,"value":790},"$",{"type":49,"value":792}," app picker, then retry ",{"type":43,"tag":85,"props":794,"children":796},{"className":795},[],[797],{"type":49,"value":605},{"type":49,"value":799}," after they finish",{"type":43,"tag":79,"props":801,"children":802},{},[803,805,811,813,819,821,827],{"type":49,"value":804},"Run ",{"type":43,"tag":85,"props":806,"children":808},{"className":807},[],[809],{"type":49,"value":810},"prepare",{"type":49,"value":812},", keep ",{"type":43,"tag":85,"props":814,"children":816},{"className":815},[],[817],{"type":49,"value":818},"private_key_path",{"type":49,"value":820},", and send only ",{"type":43,"tag":85,"props":822,"children":824},{"className":823},[],[825],{"type":49,"value":826},"recipient_public_key_jwk",{"type":49,"value":828}," to the connector.",{"type":43,"tag":79,"props":830,"children":831},{},[832,834,839,841,847,848,854],{"type":49,"value":833},"Call ",{"type":43,"tag":85,"props":835,"children":837},{"className":836},[],[838],{"type":49,"value":752},{"type":49,"value":840}," with the confirmed key name plus the picker-confirmed ",{"type":43,"tag":85,"props":842,"children":844},{"className":843},[],[845],{"type":49,"value":846},"organization_id",{"type":49,"value":516},{"type":43,"tag":85,"props":849,"children":851},{"className":850},[],[852],{"type":49,"value":853},"project_id",{"type":49,"value":855}," when the picker path was used. In the text-only fallback, omit those fields so the connector preserves its default organization\u002Fproject behavior.",{"type":43,"tag":79,"props":857,"children":858},{},[859,860,866,868,873],{"type":49,"value":804},{"type":43,"tag":85,"props":861,"children":863},{"className":862},[],[864],{"type":49,"value":865},"decrypt",{"type":49,"value":867}," with the encrypted ciphertext, confirmed target path, env var name, and repo root as ",{"type":43,"tag":85,"props":869,"children":871},{"className":870},[],[872],{"type":49,"value":294},{"type":49,"value":662},{"type":43,"tag":79,"props":875,"children":876},{},[877],{"type":49,"value":878},"Verify by running the relevant project command when practical. Do not reveal or inspect the secret value directly.",{"type":43,"tag":58,"props":880,"children":882},{"id":881},"helper",[883],{"type":49,"value":884},"Helper",{"type":43,"tag":52,"props":886,"children":887},{},[888,890,895],{"type":49,"value":889},"Use the helper by absolute path. ",{"type":43,"tag":85,"props":891,"children":893},{"className":892},[],[894],{"type":49,"value":810},{"type":49,"value":896}," creates the temporary private key file plus a request JSON containing only the public JWK and requested key name:",{"type":43,"tag":898,"props":899,"children":904},"pre",{"className":900,"code":901,"language":902,"meta":903,"style":903},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","node \"\u003Cplugin root>\u002Fscripts\u002Fopenai-platform-api-key.mjs\" prepare --name \"Codex\"\n","bash","",[905],{"type":43,"tag":85,"props":906,"children":907},{"__ignoreMap":903},[908],{"type":43,"tag":909,"props":910,"children":913},"span",{"class":911,"line":912},"line",1,[914,920,926,932,937,942,947,951,956],{"type":43,"tag":909,"props":915,"children":917},{"style":916},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[918],{"type":49,"value":919},"node",{"type":43,"tag":909,"props":921,"children":923},{"style":922},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[924],{"type":49,"value":925}," \"",{"type":43,"tag":909,"props":927,"children":929},{"style":928},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[930],{"type":49,"value":931},"\u003Cplugin root>\u002Fscripts\u002Fopenai-platform-api-key.mjs",{"type":43,"tag":909,"props":933,"children":934},{"style":922},[935],{"type":49,"value":936},"\"",{"type":43,"tag":909,"props":938,"children":939},{"style":928},[940],{"type":49,"value":941}," prepare",{"type":43,"tag":909,"props":943,"children":944},{"style":928},[945],{"type":49,"value":946}," --name",{"type":43,"tag":909,"props":948,"children":949},{"style":922},[950],{"type":49,"value":925},{"type":43,"tag":909,"props":952,"children":953},{"style":928},[954],{"type":49,"value":955},"Codex",{"type":43,"tag":909,"props":957,"children":958},{"style":922},[959],{"type":49,"value":960},"\"\n",{"type":43,"tag":52,"props":962,"children":963},{},[964,966,972],{"type":49,"value":965},"After the connector returns ",{"type":43,"tag":85,"props":967,"children":969},{"className":968},[],[970],{"type":49,"value":971},"encrypted_api_key.ciphertext",{"type":49,"value":973},", decrypt and write the key locally:",{"type":43,"tag":898,"props":975,"children":977},{"className":900,"code":976,"language":902,"meta":903,"style":903},"node \"\u003Cplugin root>\u002Fscripts\u002Fopenai-platform-api-key.mjs\" decrypt \\\n  --private-key \"\u003Cprivate key path from prepare>\" \\\n  --ciphertext \"\u003Cencrypted_api_key.ciphertext from connector result>\" \\\n  --target \"\u003Cconfirmed env file path>\" \\\n  --workspace \"\u003Crepo root>\" \\\n  --env-name OPENAI_API_KEY\n",[978],{"type":43,"tag":85,"props":979,"children":980},{"__ignoreMap":903},[981,1011,1037,1063,1089,1115],{"type":43,"tag":909,"props":982,"children":983},{"class":911,"line":912},[984,988,992,996,1000,1005],{"type":43,"tag":909,"props":985,"children":986},{"style":916},[987],{"type":49,"value":919},{"type":43,"tag":909,"props":989,"children":990},{"style":922},[991],{"type":49,"value":925},{"type":43,"tag":909,"props":993,"children":994},{"style":928},[995],{"type":49,"value":931},{"type":43,"tag":909,"props":997,"children":998},{"style":922},[999],{"type":49,"value":936},{"type":43,"tag":909,"props":1001,"children":1002},{"style":928},[1003],{"type":49,"value":1004}," decrypt",{"type":43,"tag":909,"props":1006,"children":1008},{"style":1007},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1009],{"type":49,"value":1010}," \\\n",{"type":43,"tag":909,"props":1012,"children":1014},{"class":911,"line":1013},2,[1015,1020,1024,1029,1033],{"type":43,"tag":909,"props":1016,"children":1017},{"style":928},[1018],{"type":49,"value":1019},"  --private-key",{"type":43,"tag":909,"props":1021,"children":1022},{"style":922},[1023],{"type":49,"value":925},{"type":43,"tag":909,"props":1025,"children":1026},{"style":928},[1027],{"type":49,"value":1028},"\u003Cprivate key path from prepare>",{"type":43,"tag":909,"props":1030,"children":1031},{"style":922},[1032],{"type":49,"value":936},{"type":43,"tag":909,"props":1034,"children":1035},{"style":1007},[1036],{"type":49,"value":1010},{"type":43,"tag":909,"props":1038,"children":1040},{"class":911,"line":1039},3,[1041,1046,1050,1055,1059],{"type":43,"tag":909,"props":1042,"children":1043},{"style":928},[1044],{"type":49,"value":1045},"  --ciphertext",{"type":43,"tag":909,"props":1047,"children":1048},{"style":922},[1049],{"type":49,"value":925},{"type":43,"tag":909,"props":1051,"children":1052},{"style":928},[1053],{"type":49,"value":1054},"\u003Cencrypted_api_key.ciphertext from connector result>",{"type":43,"tag":909,"props":1056,"children":1057},{"style":922},[1058],{"type":49,"value":936},{"type":43,"tag":909,"props":1060,"children":1061},{"style":1007},[1062],{"type":49,"value":1010},{"type":43,"tag":909,"props":1064,"children":1066},{"class":911,"line":1065},4,[1067,1072,1076,1081,1085],{"type":43,"tag":909,"props":1068,"children":1069},{"style":928},[1070],{"type":49,"value":1071},"  --target",{"type":43,"tag":909,"props":1073,"children":1074},{"style":922},[1075],{"type":49,"value":925},{"type":43,"tag":909,"props":1077,"children":1078},{"style":928},[1079],{"type":49,"value":1080},"\u003Cconfirmed env file path>",{"type":43,"tag":909,"props":1082,"children":1083},{"style":922},[1084],{"type":49,"value":936},{"type":43,"tag":909,"props":1086,"children":1087},{"style":1007},[1088],{"type":49,"value":1010},{"type":43,"tag":909,"props":1090,"children":1092},{"class":911,"line":1091},5,[1093,1098,1102,1107,1111],{"type":43,"tag":909,"props":1094,"children":1095},{"style":928},[1096],{"type":49,"value":1097},"  --workspace",{"type":43,"tag":909,"props":1099,"children":1100},{"style":922},[1101],{"type":49,"value":925},{"type":43,"tag":909,"props":1103,"children":1104},{"style":928},[1105],{"type":49,"value":1106},"\u003Crepo root>",{"type":43,"tag":909,"props":1108,"children":1109},{"style":922},[1110],{"type":49,"value":936},{"type":43,"tag":909,"props":1112,"children":1113},{"style":1007},[1114],{"type":49,"value":1010},{"type":43,"tag":909,"props":1116,"children":1118},{"class":911,"line":1117},6,[1119,1124],{"type":43,"tag":909,"props":1120,"children":1121},{"style":928},[1122],{"type":49,"value":1123},"  --env-name",{"type":43,"tag":909,"props":1125,"children":1126},{"style":928},[1127],{"type":49,"value":1128}," OPENAI_API_KEY\n",{"type":43,"tag":52,"props":1130,"children":1131},{},[1132],{"type":49,"value":1133},"The decrypt command updates or appends the env var, prints only safe write metadata, and refuses symlink or out-of-workspace targets.",{"type":43,"tag":58,"props":1135,"children":1137},{"id":1136},"references",[1138],{"type":49,"value":1139},"References",{"type":43,"tag":75,"props":1141,"children":1142},{},[1143],{"type":43,"tag":79,"props":1144,"children":1145},{},[1146,1152],{"type":43,"tag":85,"props":1147,"children":1149},{"className":1148},[],[1150],{"type":49,"value":1151},"references\u002Fevals.md",{"type":49,"value":1153},": trigger and routing eval cases for this skill.",{"type":43,"tag":1155,"props":1156,"children":1157},"style",{},[1158],{"type":49,"value":1159},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1161,"total":1279},[1162,1181,1197,1209,1229,1251,1267],{"slug":1163,"name":1163,"fn":1164,"description":1165,"org":1166,"tags":1167,"stars":26,"repoUrl":27,"updatedAt":1180},"accessibility-and-inclusive-visualization","make data visualizations accessible","Make data visualizations accessible and inclusive. Use when the user needs chart or diagram accessibility guidance, text alternatives for complex visuals, color and contrast review, keyboard support, reduced-motion behavior for animation or parallax, or an accessibility QA workflow for exported figures, UML-like diagrams, and dashboards.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1168,1171,1174,1177],{"name":1169,"slug":1170,"type":15},"Accessibility","accessibility",{"name":1172,"slug":1173,"type":15},"Charts","charts",{"name":1175,"slug":1176,"type":15},"Data Visualization","data-visualization",{"name":1178,"slug":1179,"type":15},"Design","design","2026-06-30T19:00:57.102",{"slug":1182,"name":1182,"fn":1183,"description":1184,"org":1185,"tags":1186,"stars":26,"repoUrl":27,"updatedAt":1196},"agent-browser","automate browser interactions for agents","Browser automation CLI for AI agents. Use when the user needs to interact with websites, verify dev server output, test web apps, navigate pages, fill forms, click buttons, take screenshots, extract data, or automate any browser task. Also triggers when a dev server starts so you can verify it visually.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1187,1190,1193],{"name":1188,"slug":1189,"type":15},"Agents","agents",{"name":1191,"slug":1192,"type":15},"Browser Automation","browser-automation",{"name":1194,"slug":1195,"type":15},"Testing","testing","2026-04-06T18:41:03.44016",{"slug":1198,"name":1198,"fn":1199,"description":1200,"org":1201,"tags":1202,"stars":26,"repoUrl":27,"updatedAt":1208},"agent-browser-verify","verify dev server output with automated browser","Automated browser verification for dev servers. Triggers when a dev server starts to run a visual gut-check with agent-browser — verifies the page loads, checks for console errors, validates key UI elements, and reports pass\u002Ffail before continuing.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1203,1204,1207],{"name":1191,"slug":1192,"type":15},{"name":1205,"slug":1206,"type":15},"Local Development","local-development",{"name":1194,"slug":1195,"type":15},"2026-04-06T18:41:17.526867",{"slug":1210,"name":1210,"fn":1211,"description":1212,"org":1213,"tags":1214,"stars":26,"repoUrl":27,"updatedAt":1228},"agents-sdk","build AI agents on Cloudflare Workers","Build AI agents on Cloudflare Workers using the Agents SDK. Load when creating stateful agents, durable workflows, real-time WebSocket apps, scheduled tasks, MCP servers, or chat applications. Covers Agent class, state management, callable RPC, Workflows integration, and React hooks. Biases towards retrieval from Cloudflare docs over pre-trained knowledge.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1215,1216,1219,1222,1225],{"name":1188,"slug":1189,"type":15},{"name":1217,"slug":1218,"type":15},"Cloudflare Workers","cloudflare-workers",{"name":1220,"slug":1221,"type":15},"SDK","sdk",{"name":1223,"slug":1224,"type":15},"Serverless","serverless",{"name":1226,"slug":1227,"type":15},"WebSockets","websockets","2026-04-06T18:39:51.717063",{"slug":1230,"name":1230,"fn":1231,"description":1232,"org":1233,"tags":1234,"stars":26,"repoUrl":27,"updatedAt":1250},"ai-elements","build chat UIs with AI Elements","AI Elements component library guidance — pre-built React components for AI interfaces built on shadcn\u002Fui. Use when building chat UIs, message displays, tool call rendering, streaming responses, reasoning panels, or any AI-native interface with the AI SDK.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1235,1238,1241,1244,1247],{"name":1236,"slug":1237,"type":15},"Frontend","frontend",{"name":1239,"slug":1240,"type":15},"React","react",{"name":1242,"slug":1243,"type":15},"shadcn\u002Fui","shadcn-ui",{"name":1245,"slug":1246,"type":15},"UI Components","ui-components",{"name":1248,"slug":1249,"type":15},"Vercel","vercel","2026-04-06T18:40:59.619419",{"slug":1252,"name":1252,"fn":1253,"description":1254,"org":1255,"tags":1256,"stars":26,"repoUrl":27,"updatedAt":1266},"ai-gateway","configure Vercel AI Gateway","Vercel AI Gateway expert guidance. Use when configuring model routing, provider failover, cost tracking, or managing multiple AI providers through a unified API.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1257,1258,1261,1262,1265],{"name":21,"slug":22,"type":15},{"name":1259,"slug":1260,"type":15},"Cost Optimization","cost-optimization",{"name":17,"slug":18,"type":15},{"name":1263,"slug":1264,"type":15},"Performance","performance",{"name":1248,"slug":1249,"type":15},"2026-04-06T18:40:44.377464",{"slug":1268,"name":1268,"fn":1269,"description":1270,"org":1271,"tags":1272,"stars":26,"repoUrl":27,"updatedAt":1278},"ai-generation-persistence","implement persistence patterns for AI generations","AI generation persistence patterns — unique IDs, addressable URLs, database storage, and cost tracking for every LLM generation",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1273,1274,1277],{"name":1259,"slug":1260,"type":15},{"name":1275,"slug":1276,"type":15},"Database","database",{"name":17,"slug":18,"type":15},"2026-04-06T18:41:08.513425",600,{"items":1281,"total":1475},[1282,1303,1326,1343,1356,1373,1392,1404,1418,1432,1444,1459],{"slug":1283,"name":1283,"fn":1284,"description":1285,"org":1286,"tags":1287,"stars":1300,"repoUrl":1301,"updatedAt":1302},"prior-auth-packet-builder","build healthcare prior authorization packets","Build a concise prior authorization packet from local case files and payer policy docs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1288,1291,1294,1297],{"name":1289,"slug":1290,"type":15},"Documents","documents",{"name":1292,"slug":1293,"type":15},"Healthcare","healthcare",{"name":1295,"slug":1296,"type":15},"Insurance","insurance",{"name":1298,"slug":1299,"type":15},"Regulatory Compliance","regulatory-compliance",28169,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fopenai-agents-python","2026-04-16T05:11:39.180399",{"slug":1304,"name":1304,"fn":1305,"description":1306,"org":1307,"tags":1308,"stars":1323,"repoUrl":1324,"updatedAt":1325},"aspnet-core","build ASP.NET Core web applications","Build, review, refactor, or architect ASP.NET Core web applications using current official guidance for .NET web development. Use when working on Blazor Web Apps, Razor Pages, MVC, Minimal APIs, controller-based Web APIs, SignalR, gRPC, middleware, dependency injection, configuration, authentication, authorization, testing, performance, deployment, or ASP.NET Core upgrades.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1309,1312,1314,1317,1320],{"name":1310,"slug":1311,"type":15},".NET","dotnet",{"name":1313,"slug":1304,"type":15},"ASP.NET Core",{"name":1315,"slug":1316,"type":15},"Blazor","blazor",{"name":1318,"slug":1319,"type":15},"C#","csharp",{"name":1321,"slug":1322,"type":15},"Web Development","web-development",23787,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fskills","2026-04-12T05:07:02.819491",{"slug":1327,"name":1327,"fn":1328,"description":1329,"org":1330,"tags":1331,"stars":1323,"repoUrl":1324,"updatedAt":1342},"chatgpt-apps","build ChatGPT Apps SDK applications","Build, scaffold, refactor, and troubleshoot ChatGPT Apps SDK applications that combine an MCP server and widget UI. Use when Codex needs to design tools, register UI resources, wire the MCP Apps bridge or ChatGPT compatibility APIs, apply Apps SDK metadata or CSP or domain settings, or produce a docs-aligned project scaffold. Prefer a docs-first workflow by invoking the openai-docs skill or OpenAI developer docs MCP tools before generating code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1332,1335,1338,1341],{"name":1333,"slug":1334,"type":15},"Apps SDK","apps-sdk",{"name":1336,"slug":1337,"type":15},"ChatGPT","chatgpt",{"name":1339,"slug":1340,"type":15},"MCP","mcp",{"name":9,"slug":8,"type":15},"2026-04-12T05:07:05.468097",{"slug":1344,"name":1344,"fn":1345,"description":1346,"org":1347,"tags":1348,"stars":1323,"repoUrl":1324,"updatedAt":1355},"cli-creator","build CLIs from API docs","Build a composable CLI for Codex from API docs, an OpenAPI spec, existing curl examples, an SDK, a web app, an admin tool, or a local script. Use when the user wants Codex to create a command-line tool that can run from any repo, expose composable read\u002Fwrite commands, return stable JSON, manage auth, and pair with a companion skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1349,1350,1353],{"name":24,"slug":25,"type":15},{"name":1351,"slug":1352,"type":15},"CLI","cli",{"name":955,"slug":1354,"type":15},"codex","2026-04-12T05:07:04.132762",{"slug":1357,"name":1357,"fn":1358,"description":1359,"org":1360,"tags":1361,"stars":1323,"repoUrl":1324,"updatedAt":1372},"cloudflare-deploy","deploy projects to Cloudflare","Deploy applications and infrastructure to Cloudflare using Workers, Pages, and related platform services. Use when the user asks to deploy, host, publish, or set up a project on Cloudflare.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1362,1365,1368,1369],{"name":1363,"slug":1364,"type":15},"Cloudflare","cloudflare",{"name":1366,"slug":1367,"type":15},"Cloudflare Pages","cloudflare-pages",{"name":1217,"slug":1218,"type":15},{"name":1370,"slug":1371,"type":15},"Deployment","deployment","2026-04-12T05:07:14.275118",{"slug":1374,"name":1374,"fn":1375,"description":1376,"org":1377,"tags":1378,"stars":1323,"repoUrl":1324,"updatedAt":1391},"define-goal","define and set measurable project goals","Help the user define a concrete, measurable goal before starting work, especially when they ask to use the goal tool, create a goal, set an objective, clarify success criteria, or turn a fuzzy intention into a quantitative outcome. Use this skill for goal creation and goal refinement only; it does not manage durable snapshots, decision logs, or long-running execution artifacts.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1379,1382,1385,1388],{"name":1380,"slug":1381,"type":15},"Productivity","productivity",{"name":1383,"slug":1384,"type":15},"Project Management","project-management",{"name":1386,"slug":1387,"type":15},"Strategy","strategy",{"name":1389,"slug":1390,"type":15},"Task Management","task-management","2026-05-23T06:17:16.870838",{"slug":1393,"name":1393,"fn":1394,"description":1395,"org":1396,"tags":1397,"stars":1323,"repoUrl":1324,"updatedAt":1403},"figma","translate Figma designs into code","Use the Figma MCP server to fetch design context, screenshots, variables, and assets from Figma, and to translate Figma nodes into production code. Trigger when a task involves Figma URLs, node IDs, design-to-code implementation, or Figma MCP setup and troubleshooting.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1398,1399,1401,1402],{"name":1178,"slug":1179,"type":15},{"name":1400,"slug":1393,"type":15},"Figma",{"name":1236,"slug":1237,"type":15},{"name":1339,"slug":1340,"type":15},"2026-04-12T05:06:47.939943",{"slug":1405,"name":1405,"fn":1406,"description":1407,"org":1408,"tags":1409,"stars":1323,"repoUrl":1324,"updatedAt":1417},"figma-code-connect-components","connect Figma designs to code components","Connects Figma design components to code components using Code Connect mapping tools. Use when user says \"code connect\", \"connect this component to code\", \"map this component\", \"link component to code\", \"create code connect mapping\", or wants to establish mappings between Figma designs and code implementations. For canvas writes via `use_figma`, use `figma-use`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1410,1411,1414,1415,1416],{"name":1178,"slug":1179,"type":15},{"name":1412,"slug":1413,"type":15},"Design System","design-system",{"name":1400,"slug":1393,"type":15},{"name":1236,"slug":1237,"type":15},{"name":1245,"slug":1246,"type":15},"2026-05-10T05:59:52.971881",{"slug":1419,"name":1419,"fn":1420,"description":1421,"org":1422,"tags":1423,"stars":1323,"repoUrl":1324,"updatedAt":1431},"figma-create-design-system-rules","generate design system rules from Figma","Generates custom design system rules for the user's codebase. Use when user says \"create design system rules\", \"generate rules for my project\", \"set up design rules\", \"customize design system guidelines\", or wants to establish project-specific conventions for Figma-to-code workflows. Requires Figma MCP server connection.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1424,1425,1426,1429,1430],{"name":1178,"slug":1179,"type":15},{"name":1412,"slug":1413,"type":15},{"name":1427,"slug":1428,"type":15},"Documentation","documentation",{"name":1400,"slug":1393,"type":15},{"name":1236,"slug":1237,"type":15},"2026-05-16T06:07:47.821474",{"slug":1433,"name":1433,"fn":1434,"description":1435,"org":1436,"tags":1437,"stars":1323,"repoUrl":1324,"updatedAt":1443},"figma-implement-design","translate Figma designs into application code","Translates Figma designs into production-ready application code with 1:1 visual fidelity. Use when implementing UI code from Figma files, when user mentions \"implement design\", \"generate code\", \"implement component\", provides Figma URLs, or asks to build components matching Figma specs. For Figma canvas writes via `use_figma`, use `figma-use`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1438,1439,1440,1441,1442],{"name":1178,"slug":1179,"type":15},{"name":1400,"slug":1393,"type":15},{"name":1236,"slug":1237,"type":15},{"name":1245,"slug":1246,"type":15},{"name":1321,"slug":1322,"type":15},"2026-05-16T06:07:40.583615",{"slug":1445,"name":1445,"fn":1446,"description":1447,"org":1448,"tags":1449,"stars":1323,"repoUrl":1324,"updatedAt":1458},"hatch-pet","create animated pets for Codex","Create, repair, validate, visually QA, and package Codex-compatible animated pets and pet spritesheets from character art, generated images, company or prospect brand cues, or visual references. Use when a user wants a lightweight-worker Codex pet workflow, a non-pixel custom pet style, a prospect or company mascot pet, or a full 8x9 animated pet atlas with transparent unused cells, QA contact sheets, and pet.json packaging. This skill composes the installed $imagegen system skill for visual generation and uses bundled scripts for deterministic spritesheet assembly.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1450,1453,1454,1457],{"name":1451,"slug":1452,"type":15},"Animation","animation",{"name":955,"slug":1354,"type":15},{"name":1455,"slug":1456,"type":15},"Creative","creative",{"name":1178,"slug":1179,"type":15},"2026-05-02T05:31:48.48485",{"slug":1460,"name":1460,"fn":1461,"description":1462,"org":1463,"tags":1464,"stars":1323,"repoUrl":1324,"updatedAt":1474},"imagegen","generate and edit raster images","Generate or edit raster images when the task benefits from AI-created bitmap visuals such as photos, illustrations, textures, sprites, mockups, or transparent-background cutouts. Use when Codex should create a brand-new image, transform an existing image, or derive visual variants from references, and the output should be a bitmap asset rather than repo-native code or vector. Do not use when the task is better handled by editing existing SVG\u002Fvector\u002Fcode-native assets, extending an established icon or logo system, or building the visual directly in HTML\u002FCSS\u002Fcanvas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1465,1466,1467,1470,1473],{"name":1455,"slug":1456,"type":15},{"name":1178,"slug":1179,"type":15},{"name":1468,"slug":1469,"type":15},"Image Generation","image-generation",{"name":1471,"slug":1472,"type":15},"Images","images",{"name":9,"slug":8,"type":15},"2026-05-15T06:23:24.312127",675]