How Plugins Are Categorized in the OpenAI Marketplace: A Technical Guide
The OpenAI Marketplace groups each plugin by a single, human-readable category declared in the plugin's manifest file, aggregating these declarations into a fixed taxonomy that powers search, filtering, and UI organization.
The openai/plugins repository defines a strict categorization system that controls how plugins appear in the OpenAI Marketplace. Each plugin declares its category within a JSON manifest located in the plugin directory, and the marketplace aggregates these declarations into a central catalogue. Understanding this taxonomy is essential for developers building integrations or analyzing the plugin ecosystem.
Where Category Data Is Stored
Individual Plugin Manifests
Every plugin ships a manifest file—typically located at .codex-plugin/plugin.json or .app.json—that contains a "category" field. For example, in plugins/zoom/.codex-plugin/plugin.json, the manifest declares:
"category": "Communication"
This value is set by the plugin author and determines where the plugin appears in the marketplace taxonomy. Similarly, plugins/stripe/.codex-plugin/plugin.json uses "category": "Finance", while plugins/hugging-face/.codex-plugin/plugin.json declares "Developer Tools".
The Central Marketplace Catalogue
The marketplace aggregates all plugins into a single catalogue file located at .agents/plugins/marketplace.json. This JSON file maps each plugin name to its declared category. The entry for the Zoom plugin appears as:
"name": "zoom", "category": "Communication"
The UI reads from this central file to render category groupings and search filters.
The Fixed Category Taxonomy
The OpenAI Marketplace uses a fixed set of categories that serve as the official taxonomy. These categories are not computed dynamically but are explicitly declared by authors and validated against the marketplace schema. The current categories observed in the source tree include:
- Communication: zoom, gmail, slack, teams, outlook-email, fireflies
- Productivity: linear, atlassian-rovo, sharepoint, outlook-calendar, clickup
- Developer Tools: hugging-face, vercel, netlify, coderabbit, supabase
- Finance: stripe, alpaca, binance, quickbooks, taxdown
- Data & Analytics: posthog, amplitude, mixpanel, omni-analytics
- Creativity: canva, remotion, hyperframes, shutterstock
- Education & Research: zotero, readwise, life-science-research
- Travel: finn, weatherpromise
- Business & Operations: zoominfo, outreach, docusign, hubspot
- Security: codex-security
- Other: cogedim
How to Read and Query Category Data
Developers can programmatically access category information using the marketplace catalogue or individual manifest files.
Python: Group Plugins by Category
The following script loads .agents/plugins/marketplace.json and organizes plugins by their declared categories:
import json
from collections import defaultdict
from pathlib import Path
# Load the marketplace JSON (the path is relative to the repo root)
marketplace_path = Path(" .agents/plugins/marketplace.json")
data = json.loads(marketplace_path.read_text())
# Build a dict {category: [plugin names]}
by_category = defaultdict(list)
for entry in data["plugins"]:
cat = entry.get("category", "Uncategorized")
by_category[cat].append(entry["name"])
# Print the categories and the first few plugins in each
for cat, plugins in by_category.items():
print(f"{cat}: {', '.join(plugins[:5])}")
Node.js: Extract Category from a Single Plugin
To read a specific plugin's category directly from its manifest:
const fs = require('fs');
const path = require('path');
function getCategory(pluginName) {
const manifestPath = path.join(
__dirname,
'plugins',
pluginName,
'.codex-plugin',
'plugin.json'
);
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
return manifest.interface?.category || manifest.category;
}
// Example: get the category for the Zoom plugin
console.log('Zoom category →', getCategory('zoom'));
Shell: Filter by Category
Use jq to list all plugins in a specific category from the command line:
jq -r '.plugins[] | select(.category=="Developer Tools") | .name' \
.agents/plugins/marketplace.json
Summary
- Categories are declared in individual plugin manifests at
.codex-plugin/plugin.jsonusing the"category"field. - The central catalogue at
.agents/plugins/marketplace.jsonaggregates all plugin-category mappings. - The taxonomy is fixed and includes Communication, Productivity, Developer Tools, Finance, and other human-readable labels.
- Developers can query categories programmatically using Python, Node.js, or shell tools against the JSON files in the
openai/pluginsrepository.
Frequently Asked Questions
Where is the category defined for an OpenAI plugin?
The category is defined in the plugin's manifest file, typically located at plugins/{name}/.codex-plugin/plugin.json. The "category" field contains a human-readable string such as "Communication" or "Developer Tools" that determines the plugin's placement in the marketplace UI.
Can a plugin belong to multiple categories?
No, each plugin is assigned to exactly one category. The marketplace schema uses a single "category" value per plugin entry in the central catalogue, and the UI groups plugins accordingly without supporting multi-category tagging.
How does the marketplace UI use the category field?
The UI reads the aggregated data from .agents/plugins/marketplace.json to generate filtered views and search facets. When a user selects a category filter, the interface displays only plugins whose manifest-declared category matches the selected value.
Is the category list extensible or fixed?
The category taxonomy is fixed and serves as the official schema for the marketplace. While plugin authors select from this predefined list, they cannot create arbitrary new categories; the marketplace validates entries against the established Communication, Productivity, Developer Tools, and other defined groups.
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 →