← Files VoiceLabsARCHIVED FILE

.codex-plugin/plugin.json

8.25 KB · Nov 7, 2026 · 12:12 UTC

↓ Download file

See the change to this file →

{
  "author": {
    "name": "14930398 Canada Inc."
  },
  "description": "VoiceLabs is a browser-based voice studio for text-to-speech and transcription. The VoiceLabs plugin lets ChatGPT work with your voice library directly: list the voice profiles on your account, provision a built-in preset voice when one is missing, generate spoken audio from text, transcribe an audio clip to text, browse your saved captures, and check the status of a generation you started earlier.\n\nAccess is granted through OAuth 2.1 with a consent screen that shows exactly which scopes you are approving: voice:read for browsing your library, voice:generate for producing audio and transcripts. You can revoke a connection at any time from Connected Apps in the VoiceLabs app, which invalidates both the stored consent and any live access tokens. Voice cloning is deliberately excluded from this surface. The plugin can only provision VoiceLabs' own preset voices, because uploading samples of a real person's voice requires a consent an agent cannot hold on your behalf.\n\nGenerated audio is returned as a short-lived signed link rather than a permanent public URL, and every tool call is recorded on the account's audit trail with its outcome.",
  "interface": {
    "capabilities": [],
    "category": "Creativity",
    "defaultPrompt": [
      "What voices do I have in my VoiceLabs library?",
      "Read this aloud in my Studio Narrator voice: The tide came in before anyone noticed.",
      "Transcribe the audio clip I just attached and save it to my captures."
    ],
    "developerName": "14930398 Canada Inc.",
    "displayName": "VoiceLabs",
    "longDescription": "VoiceLabs is a browser-based voice studio for text-to-speech and transcription. The VoiceLabs plugin lets ChatGPT work with your voice library directly: list the voice profiles on your account, provision a built-in preset voice when one is missing, generate spoken audio from text, transcribe an audio clip to text, browse your saved captures, and check the status of a generation you started earlier.\n\nAccess is granted through OAuth 2.1 with a consent screen that shows exactly which scopes you are approving: voice:read for browsing your library, voice:generate for producing audio and transcripts. You can revoke a connection at any time from Connected Apps in the VoiceLabs app, which invalidates both the stored consent and any live access tokens. Voice cloning is deliberately excluded from this surface. The plugin can only provision VoiceLabs' own preset voices, because uploading samples of a real person's voice requires a consent an agent cannot hold on your behalf.\n\nGenerated audio is returned as a short-lived signed link rather than a permanent public URL, and every tool call is recorded on the account's audit trail with its outcome.",
    "privacyPolicyURL": "https://voicelabs.now/privacy",
    "shortDescription": "Text to speech and transcripts",
    "supportURL": "https://voicelabs.now/support",
    "termsOfServiceURL": "https://voicelabs.now/terms",
    "websiteURL": "https://voicelabs.now/",
    "logo": "./assets/logo.png",
    "logoDark": "./assets/logo-dark.png",
    "composerIcon": "./assets/icon.png",
    "composerIconDark": "./assets/icon-dark.png"
  },
  "name": "app-6a7ae345f2dc8191bd52864d8358632a",
  "version": "1.0.1",
  "mcpServers": "./.mcp.json",
  "extensions": {
    "com.openai": {
      "review": {
        "test_cases": {
          "positive": [
            {
              "description": "Tool list after consent",
              "prompt": "What tools do you have from VoiceLabs?",
              "tools_triggered": "tools/list",
              "expected_behavior": "Exactly six tools are listed: list_voice_profiles, list_captures and get_generation (read-only), ensure_voice_profile (idempotent), speak and transcribe. Every tool carries all four behaviour annotations, including openWorldHint set to false, because the tools talk only to VoiceLabs' own per-account engine. If a scope was declined on the consent screen, the tools it covers are absent from this list entirely rather than failing at call time."
            },
            {
              "description": "Browse the seeded voice library",
              "prompt": "What voices do I have in my VoiceLabs library?",
              "tools_triggered": "list_voice_profiles",
              "expected_behavior": "Three profiles come back with a total of 3: Studio Narrator, Morning Briefing and Tutorial Explainer, each with language, default engine, voice type preset and a non-zero generation count. The response carries no emptyState block; that block appears only on a genuinely empty account."
            },
            {
              "description": "Idempotent profile provisioning",
              "prompt": "Create a built-in preset voice profile called Reviewer Narrator, then create it again with exactly the same name.",
              "tools_triggered": "ensure_voice_profile (called twice with the same name)",
              "expected_behavior": "The first call returns a new profile id with created set to true and voiceType preset. The second call with identical arguments returns the same id with created set to false, so nothing is duplicated. This demonstrates the idempotentHint annotation. The tool provisions only VoiceLabs' own built-in preset voices; it cannot create a cloned voice."
            },
            {
              "description": "Generate speech and fetch audio",
              "prompt": "Read this aloud in my Studio Narrator voice: The quick brown fox jumps over the lazy dog. Then tell me when it is ready and give me the audio link.",
              "tools_triggered": "speak, get_generation",
              "expected_behavior": "speak returns immediately with a generationId, status generating and a null audioUrl \u2014 that is success, not a failure, because synthesis is asynchronous. Polling get_generation flips the status to completed within a few seconds and returns a signed audio link on app.voicelabs.now that plays a real WAV; the link is scoped to that one generation and expires after roughly 15 minutes, so a later 403 or 404 is the link expiring rather than a broken tool. If an account's generation allowance for the period were ever used up, speak would instead return a structured QUOTA_EXCEEDED result stating the limit reached and when it resets in neutral terms, with nothing generated; the reviewer account has ample headroom, so this should not appear."
            },
            {
              "description": "Transcribe a clip and list captures",
              "prompt": "Transcribe the audio clip I just attached, then show me my most recent VoiceLabs captures.",
              "tools_triggered": "transcribe, list_captures",
              "expected_behavior": "transcribe is synchronous and returns a captureId, the transcript of the words actually spoken, the language and the duration in milliseconds. list_captures then shows that same capture at the top of the list with a matching transcript and source file, above the five seeded captures, newest first with pagination via limit and offset. Audio is passed as base64 capped at 10 MiB of base64 text; anything larger is refused as a clean INVALID_REQUEST before upload."
            }
          ],
          "negative": [
            {
              "description": "Music or sound-effect generation",
              "prompt": "Compose a 30 second background music bed for my podcast intro.",
              "expected_behavior": ""
            },
            {
              "description": "Transcribing media at a public URL",
              "prompt": "Transcribe the audio from this YouTube link for me.",
              "expected_behavior": ""
            },
            {
              "description": "Audio editing, mixing and export",
              "prompt": "Trim my last recording, mix music under it, and export it as an MP3 file.",
              "expected_behavior": ""
            }
          ]
        },
        "demo_recording_url": "https://drive.google.com/file/d/1nDadWkdN4eRo0QlyBKedH19-MBeii4xG/view",
        "commerce": false,
        "commerce_description": ""
      },
      "publication": {
        "countries": [],
        "release_notes": "Logo refresh: the listing icons are replaced with the official 1024px brand logo. No change to the MCP server, tools, OAuth or test account."
      }
    }
  },
  "apps": "./.app.json"
}

SHA-256: 97d26c30c38dbacfe61f78386fa335dcb0b8f185fc58379ba0ce6e6da5565241