How Plugin Categories Are Organized in the OpenAI Plugins Marketplace
The OpenAI Plugins marketplace uses a decentralized, data-driven system where each plugin declares its own category in its local manifest, and the marketplace dynamically aggregates these values from the master catalog files.
The openai/plugins repository powers the ChatGPT plugin ecosystem, organizing integrations through a flexible, self-describing category architecture. Rather than enforcing a rigid taxonomy through hard-coded enums, the marketplace allows each plugin to define its own category, creating dynamic groupings that evolve as new tools are added. Understanding how plugin categories are organized in the marketplace helps developers configure manifests correctly and enables power users to navigate the underlying data structures.
The Self-Declared Category Architecture
Manifest-Based Declaration
Each plugin defines its category within its local manifest file located at plugins/<plugin-name>/.codex-plugin/plugin.json. This JSON object contains a "category" key that accepts a free-form string value, such as "Communication" or "Developer Tools". Because the repository lacks a central enumeration or validation schema for categories, developers update this single field to reposition a plugin between sections or introduce new organizational concepts without modifying marketplace infrastructure.
Dynamic Aggregation
When the marketplace builds its browsing interface, collector scripts ingest the master catalogs and group plugins by their declared category strings. The UI renders familiar sections—including Productivity, Communication, Developer Tools, Finance, Data & Analytics, Creativity, Education & Research, Business & Operations, Security, and Other—based solely on the distinct values present in the dataset. No database migrations or deployment cycles are required to add a new category; the marketplace automatically surfaces new values as they appear in the source manifests.
The Master Catalog Files
The marketplace consumes two primary JSON files that serve different audiences but share an identical schema:
.agents/plugins/marketplace.json
This file powers the public-facing ChatGPT UI. It contains an array of plugin objects, each including the source path, policy settings, and the "category" field that determines the plugin’s placement in the browsing interface.
.agents/plugins/api_marketplace.json
This catalog serves the OpenAI Plugins API, consumed by developers programmatically. It mirrors the structure of the UI catalog but targets API consumers rather than end users.
Both files contain entries structured identically to this Slack example:
{
"name": "slack",
"source": { "source": "local", "path": "./plugins/slack" },
"policy": { "installation": "AVAILABLE", "authentication": "ON_INSTALL" },
"category": "Communication"
}
Working with Categories Programmatically
Extract Category Mappings with Python
Analyze how plugins distribute across categories by fetching the public marketplace manifest and aggregating the data:
import json
import urllib.request
# Load the public marketplace manifest
url = "https://raw.githubusercontent.com/openai/plugins/main/.agents/plugins/marketplace.json"
data = json.loads(urllib.request.urlopen(url).read())
# Build a mapping of category → plugins
categories = {}
for plug in data["plugins"]:
cat = plug.get("category", "Uncategorized")
categories.setdefault(cat, []).append(plug["name"])
# Pretty-print the categories
for cat, names in sorted(categories.items()):
print(f"{cat} ({len(names)} plugins):")
for n in names:
print(f" - {n}")
Query Individual Plugin Categories via CLI
Inspect a specific plugin's declared category using curl and jq:
PLUGIN="slack"
MANIFEST="plugins/$PLUGIN/.codex-plugin/plugin.json"
# Download the manifest and extract the category
curl -s "https://raw.githubusercontent.com/openai/plugins/main/$MANIFEST" \
| jq -r '.category'
# → Communication
Aggregate Unique Categories with Node.js
Generate a deduplicated list of all existing categories in the marketplace:
const https = require('https');
https.get(
'https://raw.githubusercontent.com/openai/plugins/main/.agents/plugins/marketplace.json',
res => {
let body = '';
res.on('data', chunk => (body += chunk));
res.on('end', () => {
const { plugins } = JSON.parse(body);
const categories = new Set(plugins.map(p => p.category));
console.log('Categories in the marketplace:');
console.log([...categories].join(', '));
});
}
);
Key Source Files for Category Management
Understanding the repository structure clarifies where category data originates and how it flows to end users:
plugins/<plugin-name>/.codex-plugin/plugin.json— The authoritative source for each plugin's category declaration..agents/plugins/marketplace.json— The public catalog consumed by the ChatGPT interface..agents/plugins/api_marketplace.json— The API-facing catalog for programmatic access.README.md— Repository documentation explaining marketplace structure and contribution guidelines.
Summary
- Plugin categories are self-declared in individual manifest files rather than maintained in a central taxonomy enumeration.
- The marketplace dynamically constructs category sections by reading
.agents/plugins/marketplace.jsonand grouping plugins by their"category"string values. - Two master catalogs exist: one for the ChatGPT UI (
.agents/plugins/marketplace.json) and one for the OpenAI Plugins API (.agents/plugins/api_marketplace.json), both following the same schema. - Common categories include Productivity, Communication, Developer Tools, Finance, Data & Analytics, and Security, though the system permits new categories to emerge organically through manifest updates.
Frequently Asked Questions
Where is the official list of allowed plugin categories?
There is no hard-coded enumeration or allow-list in the source code. The marketplace accepts any string value in the "category" field of plugins/<name>/.codex-plugin/plugin.json, dynamically aggregating unique values found in .agents/plugins/marketplace.json. The UI simply renders a section for every distinct string it encounters.
How do I change which category my plugin appears in?
Update the "category" field in your plugin's manifest file at .codex-plugin/plugin.json and submit a pull request to the openai/plugins repository. When the change merges into the main branch, the marketplace rebuilds its indices automatically from the updated master catalog files.
Why are there two marketplace.json files?
The repository maintains separate catalogs for different consumption patterns. .agents/plugins/marketplace.json serves the ChatGPT web interface and end users, while .agents/plugins/api_marketplace.json targets developers consuming the OpenAI Plugins API programmatically. Both files contain identical category metadata and plugin listings.
Can I create a new category that doesn't exist yet?
Yes. Since the system lacks a central taxonomy validator, entering a new category string in your plugin manifest effectively creates that category in the marketplace once the change is merged into the master catalog. The UI will render a new section header matching your declared string on the next marketplace build.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →