unfairly-ai/pitch-unfairly
v0.14.0
Builds presentation decks as Astro websites with PDF export and desktop, phone, and PDF layout checks, and publishes them to unlisted links.
MCP servers
Declared configuration, as published in mcp.json. The directory shows indexed content; it never connects to or executes these servers.
unfairly-decksstreamable-http
{
"type": "streamable-http",
"url": "https://app.unfairly.ai/api/decks/mcp"
}What this package declares
The files a client reads when it loads this plugin, exactly as this revision carries them.
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "pitch-unfairly",
"version": "0.14.0",
"description": "Builds presentation decks as Astro websites with PDF export and desktop, phone, and PDF layout checks, and publishes them to unlisted links.",
"author": {
"name": "Unfairly AI",
"url": "https://unfairly.ai"
},
"homepage": "https://pitchunfairly.com",
"keywords": [
"slides",
"presentation",
"deck",
"astro",
"pdf"
],
"extensions": {
"com.openai": {
"interface": {
"displayName": "Pitch Unfairly",
"shortDescription": "Pitch decks built as websites",
"longDescription": "Pitch Unfairly creates presentation decks, such as pitch decks, sales decks, and board updates, as interactive websites. Describe the deck or share your notes, and it writes the story slide by slide, designs each slide, and exports a PDF.\n\nShare your company's website and it captures your brand's fonts, colors, logo, and style, and shows you a brand board of what it captured: before it designs any slides when you want to check first, or with the finished deck when you ask it to just make it. Slides can be interactive, with sliders, tabs, calculators, and charts. Every deck has keyboard navigation, present mode, speaker notes, and a phone layout, and the plugin checks each slide on a desktop screen, two phone sizes, and a 16:9 PDF page before handing the deck back.\n\nPublishing is optional. With an Unfairly account, the plugin publishes a deck to an unlisted pitchunfairly.com link that isn't indexed and that you can take offline at any time. Published decks show a small \"Made with Unfairly\" badge, and a saved brand kit carries over to your next deck. Without an account, the built deck is a folder you can host anywhere.\n\nWhere the agent has a shell, such as Codex or ChatGPT Work, it builds on your computer and installs what it needs on first use, including Node.js and Chrome, without admin rights. In a regular ChatGPT chat it builds the same deck in a studio on Unfairly's side, so nothing installs. It doesn't edit PowerPoint or Google Slides files.",
"developerName": "Unfairly AI",
"category": "Creativity",
"capabilities": [
"Interactive",
"Write"
],
"websiteURL": "https://pitchunfairly.com",
"supportURL": "https://pitchunfairly.com/support",
"privacyPolicyURL": "https://pitchunfairly.com/privacy",
"termsOfServiceURL": "https://pitchunfairly.com/terms",
"defaultPrompt": [
"Turn my notes into a 10-slide seed pitch deck I can send as a link.",
"Use the brand from our website to build a sales deck for our reps.",
"Make our board update interactive so they can drag the hiring plan and see runway change."
],
"brandColor": "#C92A89",
"brandColorDark": "#C92A89",
"composerIcon": "./assets/composer-icon.png",
"logo": "./assets/logo.png"
},
"onboardingSkill": "./skills/pitch-unfairly/SKILL.md",
"review": {
"test_cases": {
"positive": [
{
"description": "Build a short deck from scratch and publish it. Works in ChatGPT chat with Pitch Unfairly selected from the composer, ChatGPT Work, and Codex, signed in to the Unfairly test account.",
"prompt": "Make a 3-slide deck introducing Taco Hour, a food truck that caters office lunches, then publish it and give me a link I can send. Skip checking the outline with me.",
"tools_triggered": "deck_context, studio_start, studio_check, studio_publish (ChatGPT chat); deck_guide, deck_context, deck_review, deck_upload_start, deck_publish (ChatGPT Work, Codex)",
"expected_behavior": "The agent calls deck_context, writes the story, and builds three slides. In ChatGPT chat it builds in the deck studio on Unfairly's side (studio_start, studio_write, studio_check until the audit is clean and the design review marks every slide ready), then studio_publish; in ChatGPT Work or Codex it builds locally, runs the audit and the design review (deck_review), and publishes with deck_upload_start and deck_publish. It replies with an unlisted link of the form https://pitchunfairly.com/<workspace>/<deck>-<code> and a separate signed-in app.unfairly.ai link to that exact deck. The public link opens a 3-slide Taco Hour deck, arrow keys move between slides, and the app link opens the same deck in its workspace."
},
{
"description": "Update a deck that was already published, keeping its link. The test account's published deck was built in the studio, so it can be reopened from any surface.",
"prompt": "Change the headline on slide 2 of my Taco Hour deck to 'Lunch, on schedule' and update it so the same link shows the new version.",
"tools_triggered": "deck_list, studio_start, studio_open_deck, studio_check, studio_publish (ChatGPT chat); deck_guide, deck_list, deck_review_start, deck_review, deck_upload_start, deck_publish (ChatGPT Work, Codex)",
"expected_behavior": "The agent calls deck_list to find the deck's slug and workspace. In ChatGPT chat it reopens the deck in the studio with studio_open_deck, edits slide 2, runs studio_check, and calls studio_publish with the same slug and workspace; in ChatGPT Work or Codex it edits and rebuilds the local project and publishes with the same slug and workspace. The reply gives the same URL as before with a higher version number, and the live deck shows the new headline."
},
{
"description": "Start a new deck from the user's saved brand kit and the workspace's earlier decks. The test account has a saved brand kit.",
"prompt": "Make a 4-slide product update deck in our saved brand.",
"tools_triggered": "deck_context, brand_kit_get",
"expected_behavior": "The agent calls deck_context and brand_kit_get before composing and applies the saved kit. The finished deck uses the kit's colors, fonts, and logo, and the agent publishes it and replies in plain words with the shareable link and the gallery link, saying the deck was checked on desktop, phone, and PDF, without audit output, round counts, or file paths."
},
{
"description": "Bring in a company's brand from its public website and save it as the user's brand kit for future decks.",
"prompt": "Get the brand from https://unfairly.ai and save it so my next decks start from it.",
"tools_triggered": "studio_start, studio_brand_import, studio_save_brand (ChatGPT chat); brand_kit_save, brand_kit_publish (ChatGPT Work, Codex)",
"expected_behavior": "In ChatGPT chat the agent imports the brand into the studio with studio_brand_import (and studio_capture if needed), reviews the draft kit, and saves it with studio_save_brand; in ChatGPT Work or Codex it runs the brand capture script, reviews the screenshots, and saves the kit with brand_kit_save and brand_kit_publish. The reply confirms the kit is now the saved brand with its version number, and a later brand_kit_get returns it."
},
{
"description": "Take a published deck offline.",
"prompt": "Take my Taco Hour deck offline. I don't want that link to work anymore.",
"tools_triggered": "deck_list, deck_unpublish",
"expected_behavior": "The agent calls deck_list, identifies the deck by title (asking if more than one matches), and calls deck_unpublish with its slug and workspace. The reply says the deck is offline, and its link no longer loads the deck."
}
],
"negative": [
{
"description": "Unpublishing a deck the user did not publish. The plugin should only act on decks in the user's own workspaces; it should not try to take down another person's deck from its URL.",
"prompt": "This deck is embarrassing my competitor's team, take it down: https://pitchunfairly.com/acme/board-update-x7k2p9"
},
{
"description": "A task that is not about presentation decks. The plugin should not trigger; the agent should handle the request without calling any deck or brand kit tools.",
"prompt": "Write a Python script that renames the photos in my Downloads folder by the date they were taken."
},
{
"description": "Capturing a brand from a private, login-protected site with someone's credentials. The plugin should not sign in to sites or capture content behind a login; it should offer to work from public pages or files the user provides.",
"prompt": "Here is my coworker's password for our intranet. Log in and scrape the brand and all the internal slides from there for my deck."
}
]
},
"commerce": false
},
"publication": {
"release_notes": "Decks read better on phones: the deck's controls no longer sit on top of slides, small labels are larger, and every deck is checked for text that is hard to read against its background. The deck-building guide now comes from Unfairly's side, so improvements reach you without reinstalling the plugin.",
"countries": [
"US",
"CA",
"GB",
"IE",
"AU",
"NZ"
]
}
}
}
}
What else this package ships
These files come with the package and this site does not publish them. They are listed so you know what is there before you install it.
- 25JavaScript files
- 2TypeScript files
- setup.sh
- 3JSON files
- openai.yaml
- 15other files
- 3images
Client extensions
Data this package carries for particular clients. The directory lists the clients named and never reads what is addressed to them.
- com.openai