openai-mcp-server
Provides tools for interacting with OpenAI's API, enabling text generation, chat completions, model discovery, image generation and editing, audio transcription, speech synthesis, embeddings, and content moderation.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@openai-mcp-serverList the models my API key can access."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
openai-mcp-server
An MCP server that puts the OpenAI API into any MCP client — Claude Desktop, Claude Code, Cowork, Cursor, or anything else that speaks the protocol.
Nine tools: text generation, chat completions, model discovery, image generation and editing, transcription, speech synthesis, embeddings, and moderation.
Why this exists
There is no official OpenAI plugin in the Claude plugin catalogue. This server is the equivalent, built as a normal open-source project you own and can extend.
Related MCP server: OpenAI Assistant MCP Server
Tools
Tool | What it does | Read-only |
| Generate text via the Responses API — instructions, reasoning effort, forced JSON, response chaining | no |
| Send an explicit message history via Chat Completions | no |
| List the model IDs your key can use, filtered and paginated | yes |
| Create images from a prompt, written to disk | no |
| Edit or combine existing images, optionally with a mask | no |
| Transcribe a local audio file | no |
| Synthesize speech to an audio file | no |
| Embed texts for semantic search, written to JSON | no |
| Check text against OpenAI's moderation policy | yes |
Every tool takes response_format: "markdown" | "json" — markdown for reading, JSON for processing. All tools also return structuredContent, so clients that understand output schemas get typed data without parsing.
Install
As a Claude Desktop extension (easiest)
Download openai-mcp-server-<version>.mcpb from the releases page, double-click it, and paste your API key into the field Claude Desktop shows. Nothing else to install — the bundle carries its dependencies and runs on Claude Desktop's own Node runtime, so the machine needs no Node, no toolchain and no hand-edited config file.
The same dialog also offers the output folder, the folders the server may read from, a default text model and an alternative API base URL. All of them are optional.
To build the bundle yourself:
npm install
npm run pack:mcpb # writes build/openai-mcp-server-<version>.mcpbFrom source
For Claude Code, Cursor or any other MCP client:
git clone https://github.com/piorkowskim79/openai-mcp-server.git
cd openai-mcp-server
npm install
npm run buildRequires Node.js 20 or newer and an OpenAI API key with available quota.
Verify the build:
node dist/index.js --version # prints 1.0.0
node dist/index.js --help # lists all environment variablesConfigure your MCP client
Skip this section if you installed the .mcpb extension — Claude Desktop wires it up for you.
The server speaks MCP over stdio, so the client launches it as a subprocess.
Claude Desktop
Edit claude_desktop_config.json:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"openai": {
"command": "node",
"args": ["/absolute/path/to/openai-mcp-server/dist/index.js"],
"env": {
"OPENAI_API_KEY": "sk-proj-...",
"OPENAI_MCP_OUTPUT_DIR": "/Users/you/openai-mcp-output"
}
}
}
}Restart Claude Desktop afterwards.
Claude Code
claude mcp add openai \
--env OPENAI_API_KEY=sk-proj-... \
-- node /absolute/path/to/openai-mcp-server/dist/index.jsAny other MCP client
Point it at node /absolute/path/to/dist/index.js with OPENAI_API_KEY in the environment.
Configuration
Only OPENAI_API_KEY is required. See .env.example for a copyable template.
Variable | Default | Purpose |
| — | Required. Your OpenAI API key |
| OpenAI's default | Alternative endpoint (Azure, gateway, proxy) |
| — | Organization ID |
| — | Project ID |
|
| Where generated files are written |
| output dir only | Colon-separated absolute dirs the server may read from |
|
| Per-request timeout |
|
| Retries for transient failures |
|
| Default text model |
|
| Default image model |
|
| Default embedding model |
|
| Default transcription model |
|
| Default speech model |
|
| Default moderation model |
Any positional argument is also treated as a readable directory and merged into OPENAI_MCP_ALLOWED_DIRS:
node dist/index.js /Users/you/Documents/audio /Users/you/PicturesThis exists because a bundle manifest expands a multi-value directory setting into several argv entries; a single colon-separated environment variable cannot express that list unambiguously. Arguments must be absolute paths.
Model IDs change. OpenAI adds, renames and retires models, and access differs per project. Every default is overridable, and openai_list_models reports what your key can actually reach — if a call fails with "model not found", start there.
Security model
Two deliberate constraints:
The filesystem is sandboxed. Tools that read local files (openai_edit_image, openai_transcribe_audio) accept only absolute paths inside OPENAI_MCP_ALLOWED_DIRS. Paths are canonicalised with realpath before the check, so symlinks and ../ traversal cannot escape. The output directory is always allowed; nothing else is, until you add it. Keep that list narrow.
Binary output never enters the conversation. Images, audio and embedding vectors are written to disk and only their paths are returned. A single base64 PNG or a 3072-float vector would otherwise flood the model's context window.
The API key is read from the environment only — it never appears in a tool argument, a log line, or an error message.
Examples
Ask your MCP client in plain language; it picks the tool.
"Use the OpenAI server to summarise this text in three sentences."
→ openai_generate_text
"Which OpenAI embedding models can I use?"
→ openai_list_models with filter="embedding"
"Generate a transparent PNG logo of a blue fox."
→ openai_generate_image with background="transparent"
"Transcribe ~/Documents/audio/interview.m4a in German."
→ openai_transcribe_audio with language="de" — requires that directory in OPENAI_MCP_ALLOWED_DIRS
"Embed these 40 product descriptions so I can cluster them."
→ openai_create_embeddings, then read the JSON file it reports
Development
npm run dev # watch mode via tsx
npm run typecheck # tsc --noEmit, strict
npm test # unit tests, no network calls
npm run build # compile to dist/
npm run pack:mcpb # build the Claude Desktop extension bundleThe test suite covers configuration parsing, the filesystem sandbox (including symlink escape and traversal), error formatting and response shaping. It never contacts the OpenAI API.
Project layout
manifest.json Claude Desktop extension manifest (tools, user config)
scripts/
└── pack-mcpb.sh builds the .mcpb bundle
src/
├── index.ts entry point, server assembly, CLI flags
├── config.ts environment parsing and validation
├── client.ts OpenAI client construction
├── constants.ts defaults, limits, response formats
├── errors.ts API errors → actionable agent messages
├── files.ts sandboxed read/write
├── format.ts tool result shaping, character limit
└── tools/
├── text.ts generate_text, chat_completion
├── models.ts list_models
├── images.ts generate_image, edit_image
├── audio.ts transcribe_audio, text_to_speech
└── analysis.ts create_embeddings, moderate_contentAdding a tool
Write a Zod schema with
.strict()and a.describe()on every field.Register it with
server.registerTool(name, config, handler)— includetitle,description,inputSchema,outputSchemaandannotations.Return via
toolResult(...)so markdown/JSON handling and the character limit stay consistent; catch errors witherrorResult(...).Add the registration call in
src/index.tsand a test intest/.
Troubleshooting
Symptom | Cause |
Client shows no tools | Wrong path in the config, or the project was not built ( |
| The key is missing from the client's |
| The path is outside |
| The model ID does not exist for your key — run |
| Retry later, or check billing on the project |
The server logs to stderr; stdout carries the JSON-RPC stream and must stay clean.
License
MIT — see LICENSE.
Available Tools
9 toolsopenai_chat_completionRun an OpenAI chat completionA
Send an explicit list of chat messages to an OpenAI model through the Chat Completions API.
Use this when you already hold a structured conversation history (system/user/assistant turns) and want it sent verbatim. For new single-prompt generations prefer openai_generate_text.
Args:
messages (array, required): [{ role: 'system'|'user'|'assistant'|'developer', content: string }], 1-200 entries
model (string): model ID, defaults to OPENAI_DEFAULT_TEXT_MODEL
max_completion_tokens (number): 1-200000
temperature (number): 0-2
top_p (number): 0-1
stop (string[]): up to 4 stop sequences
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "id": string, // completion ID "model": string, // model that served the request "finish_reason": string | null, // "stop", "length", "content_filter", ... "content": string, // assistant reply text "refusal": string | null, // set when the model declined "usage": { "input_tokens": number|null, "output_tokens": number|null, "total_tokens": number|null } }
Examples:
Use when: replaying a saved conversation with a new final user turn
Use when: you need a stop sequence to cut generation at a delimiter
Don't use when: chaining stored responses (use openai_generate_text with previous_response_id)
Error Handling:
"Error: OpenAI rejected the request as invalid" often means an unsupported parameter for that model, e.g. temperature on a reasoning-only model
| Name | Required | Description | Default |
|---|---|---|---|
| stop | No | Up to 4 strings that stop generation when produced | |
| model | No | Model ID. Defaults to OPENAI_DEFAULT_TEXT_MODEL. | |
| top_p | No | Nucleus sampling cutoff | |
| messages | Yes | Conversation history in chronological order | |
| temperature | No | Sampling temperature | |
| response_format | No | Output format: 'markdown' for a readable summary, 'json' for the full structured payload | markdown |
| max_completion_tokens | No | Upper bound on generated tokens |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| model | Yes | |
| usage | Yes | |
| content | Yes | |
| refusal | Yes | |
| finish_reason | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint false, idempotentHint false, destructiveHint false), so the description carries most of the burden. It adds genuinely useful behavioral context beyond annotations: the refusal field populated when the model declines, finish_reason values, nullability of usage tokens, and an error-handling note explaining that 'invalid request' usually means an unsupported parameter for that model. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but remarkably well structured: purpose, usage, args, returns, examples, error handling, with the most decision-relevant information front-loaded in the first two sentences. The Args and Returns blocks partially duplicate the 100%-covered schema and the output schema, which costs some efficiency, but every unique section (examples, error handling) earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with an output schema, the description covers all essentials: purpose, when to use and not use, parameter defaults, full return shape including edge cases (refusal, null usage), and the most common failure mode. Minor gaps remain — no mention of auth prerequisites or rate limits — but those are typically server-side concerns for an MCP wrapper.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The Args section essentially mirrors the schema's constraints (ranges, defaults, max items) without adding new semantic meaning; the schema's response_format description is actually richer than the description's terse version. The description adds no parameter insight beyond what structured data already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource: send an explicit list of chat messages through the Chat Completions API. It immediately distinguishes itself from the sibling openai_generate_text ('For new single-prompt generations prefer openai_generate_text'), so an agent can tell them apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use conditions (holding structured conversation history, needing verbatim replay, needing stop sequences), explicit when-not-to-use conditions (chaining stored responses), and names the alternative tool in each case. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_create_embeddingsCreate embeddings with OpenAIAIdempotent
Turn texts into embedding vectors for semantic search, clustering or deduplication.
By default the vectors are written to a JSON file and only the path plus metadata are returned, because a single vector holds up to 3072 floats. Set return_vectors=true for small batches when the numbers are needed directly.
Args:
texts (string[], required): 1-2048 texts to embed
model (string): embedding model ID, defaults to OPENAI_DEFAULT_EMBEDDING_MODEL
dimensions (number): shorten vectors (text-embedding-3 models only)
return_vectors (boolean): inline the vectors, max 5 texts (default false)
output_path (string): absolute path of the JSON file to write
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "model": string, "count": number, // number of vectors produced "dimensions": number, // length of each vector "file_path": string | null, // where the vectors were written "usage": { "input_tokens": number|null, "total_tokens": number|null }, "vectors": number[][] // present only when return_vectors is true }
The written JSON file has the shape: { "model": "text-embedding-3-small", "created_at": "2026-08-23T14:05:00.000Z", "count": 2, "dimensions": 1536, "items": [ { "index": 0, "text_preview": "…", "embedding": [0.0123, -0.0456] } ] }
Examples:
Use when: building a semantic index over documents -> texts=[...], then read the JSON file
Use when: comparing two sentences directly -> texts=[a, b], return_vectors=true
Don't use when: you just want a summary or classification (use openai_generate_text)
Error Handling:
"Error: return_vectors is only allowed for up to 5 texts" — lower the batch or read the file
"Error: OpenAI rejected the request as invalid" often means the model does not support the dimensions parameter
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Embedding model ID. Defaults to OPENAI_DEFAULT_EMBEDDING_MODEL. | |
| texts | Yes | The texts to embed, in order | |
| dimensions | No | Shorten the vectors to this many dimensions; supported by text-embedding-3 models | |
| output_path | No | Absolute path of the JSON file to write. Defaults to a timestamped file in OPENAI_MCP_OUTPUT_DIR. | |
| return_vectors | No | Return the raw vectors inline instead of only the file path. Allowed for at most 5 texts. | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| model | Yes | |
| usage | Yes | |
| vectors | No | |
| file_path | Yes | |
| dimensions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behavioral traits: vectors are written to a JSON file by default, only the path and metadata are returned by default, inline return is limited to 5 texts, and dimensions are only supported by text-embedding-3 models. It also explains likely error messages and how to handle them, which goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (summary, args, returns, examples, error handling) and front-loads the most important behavior. It is somewhat long and repeats some schema information in the Args list, but every section earns its place given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with output-schema support, the description is complete: it covers the return JSON shape, the written file shape, default output behavior, parameter constraints, example use cases, and error scenarios. An agent has everything needed to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds practical meaning beyond the schema: it explains why the default avoids inline vectors (a single vector holds up to 3072 floats), clarifies the max 5 texts for return_vectors, and connects the dimensions parameter to model compatibility. Some redundancy with the schema remains.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific action ('Turn texts into embedding vectors') and names the intended applications (semantic search, clustering, deduplication). It also differentiates from the sibling openai_generate_text by explicitly saying when not to use this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete 'Use when' scenarios, such as building a semantic index or comparing two sentences directly, and an explicit 'Don't use when' case pointing to openai_generate_text. This makes tool selection unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_edit_imageEdit an image with OpenAIA
Edit or extend existing images according to a text instruction, optionally restricted to a masked region.
Source images are read from disk (only from directories listed in OPENAI_MCP_ALLOWED_DIRS) and results are written back to disk.
Args:
prompt (string, required): the edit to apply
image_paths (string[], required): 1-4 absolute paths to source images
mask_path (string): absolute path to a PNG mask; transparent pixels mark the area to replace
model (string): image model ID, defaults to OPENAI_DEFAULT_IMAGE_MODEL
n (number): 1-4 variants (default 1)
size ('auto'|'1024x1024'|'1536x1024'|'1024x1536'|'512x512'|'256x256'): default 'auto'
output_dir (string): absolute target directory
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "model": string, "count": number, "images": [ { "index": number, "path": string, "bytes": number } ], "revised_prompt": string | null }
Examples:
Use when: "Replace the sky in photo.png with a sunset" -> image_paths=["/data/photo.png"], prompt="sunset sky"
Use when: combining several product shots into one scene -> image_paths=[...]
Don't use when: creating an image from scratch (use openai_generate_image)
Error Handling:
"Error: File not found" means the path does not exist
"Error: Access to ... is not permitted" means the file lives outside OPENAI_MCP_ALLOWED_DIRS
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | How many variants to produce | |
| size | No | Output resolution | auto |
| model | No | Image model ID. Defaults to OPENAI_DEFAULT_IMAGE_MODEL. | |
| prompt | Yes | Instruction describing the edit to apply | |
| mask_path | No | Optional absolute path to a PNG mask; transparent areas mark the region to replace | |
| output_dir | No | Absolute directory to write the results into | |
| image_paths | Yes | Absolute paths of the source images. Must live inside an allowed directory. | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| model | Yes | |
| images | Yes | |
| revised_prompt | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial context beyond the annotations (readOnlyHint=false, openWorldHint=true): files are read only from OPENAI_MCP_ALLOWED_DIRS, results are written back to disk, and an Error Handling section tells agents how to interpret 'File not found' versus permission failures. These details are actionable and not derivable from the annotations alone. No contradiction exists — the described file writes align with readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but well-organized with clear section headers (Args, Returns, Examples, Error Handling) and a front-loaded purpose sentence. The Args and Returns blocks partly duplicate the schema and output schema, which is mild redundancy, but the Examples and Error Handling sections earn their space since they encode behavior not present in structured data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with file I/O, the description covers purpose, parameter meanings, filesystem constraints, failure modes, and usage examples thoroughly. The remaining gap is minor: it never states what happens when output_dir is omitted (the default output location), and the 'Don't use when' guidance covers only one sibling despite several related ones.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The Arg list in the description largely restates what the schema already documents (ranges, defaults, enum values) rather than adding new semantic depth; a few phrases like 'absolute paths to source images' reinforce but do not extend the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb phrase ('Edit or extend existing images according to a text instruction, optionally restricted to a masked region') that clearly identifies the resource (existing images) and the operation. It differentiates from the sibling openai_generate_image by explicitly calling out that creating from scratch is a different tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete 'Use when' scenarios with realistic examples ('Replace the sky in photo.png with a sunset', 'combining several product shots into one scene') and an explicit 'Don't use when' with the named alternative (openai_generate_image). This is exactly the when/when-not/alternatives guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_generate_imageGenerate an image with OpenAIA
Create one or more images from a text prompt and write them to disk.
Images are never returned inline — the tool saves each file and reports its absolute path, so the agent's context stays small.
Args:
prompt (string, required): what the image should show
model (string): image model ID, defaults to OPENAI_DEFAULT_IMAGE_MODEL
n (number): 1-4 images (default 1)
size ('auto'|'1024x1024'|'1536x1024'|'1024x1536'|'512x512'|'256x256'): default 'auto'
quality ('auto'|'low'|'medium'|'high'): default 'auto'
background ('auto'|'transparent'|'opaque'): default 'auto'; 'transparent' needs png or webp
output_format ('png'|'jpeg'|'webp'): default 'png'
output_dir (string): absolute target directory, defaults to OPENAI_MCP_OUTPUT_DIR
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "model": string, "count": number, "images": [ { "index": number, "path": string, "bytes": number } ], "revised_prompt": string | null // prompt rewrite the model applied, when reported }
Examples:
Use when: "Draw a logo of a blue fox" -> prompt="minimalist blue fox logo, flat vector"
Use when: you need a transparent sticker -> background="transparent", output_format="png"
Don't use when: you want to modify an existing picture (use openai_edit_image)
Error Handling:
"Error: Access to ... is not permitted" means output_dir is outside OPENAI_MCP_ALLOWED_DIRS
"Error: OpenAI rejected the request as invalid" often means size or quality is unsupported by that model
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | How many images to generate | |
| size | No | Output resolution | auto |
| model | No | Image model ID. Defaults to OPENAI_DEFAULT_IMAGE_MODEL. | |
| prompt | Yes | Description of the image to create | |
| quality | No | Rendering quality; higher costs more and takes longer | auto |
| background | No | Background handling; "transparent" requires png or webp output | auto |
| output_dir | No | Absolute directory to write the images into. Defaults to OPENAI_MCP_OUTPUT_DIR. Must be inside an allowed directory. | |
| output_format | No | File format of the generated image | png |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| model | Yes | |
| images | Yes | |
| revised_prompt | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, so the write behavior is expected, but the description adds substantial context beyond that: images 'are never returned inline — the tool saves each file and reports its absolute path', the rationale ('agent's context stays small'), environment-variable defaults, and a dedicated Error Handling section explaining what specific error strings mean (allowed-dir violations, unsupported size/quality combinations). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The most important behavioral fact (saves to disk, never inline) is front-loaded in the first sentence. The remaining sections — Args, Returns, Examples, Error Handling — are each clearly headed and earn their place: the arg list is a fast reference, examples give actionable usage, and error strings turn failures into diagnosable conditions. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with an output schema and annotations, this description is complete: it explains the core behavior, the return shape (paths, byte counts, revised_prompt semantics), the allowed environment constraints, when not to use it, and how to interpret common failures. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real value: it flags the cross-parameter constraint that 'transparent' requires png/webp output, documents env-var defaults for model and output_dir, and ties size/quality to model-specific rejection in the error section. It consolidates all 9 params into a scan-friendly list with constraints, going slightly beyond the schema's per-parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair ('Create one or more images from a text prompt') plus the distinguishing behavior 'write them to disk'. It explicitly contrasts itself with openai_edit_image in the examples, so an agent can tell this tool apart from its closest sibling without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit 'Use when' examples with concrete prompt transformations, a conditional example (transparent sticker -> background='transparent', output_format='png'), and an explicit 'Don't use when' exclusion that names the alternative tool (openai_edit_image). This is exactly the when/when-not/alternatives guidance the rubric asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_generate_textGenerate text with OpenAIA
Generate text with an OpenAI model through the Responses API — OpenAI's current interface for single-turn and chained generation.
Use this as the default text tool. It supports plain prompting, system instructions, reasoning effort control, forced JSON output and multi-turn chaining via previous_response_id.
Args:
input (string, required): the prompt
model (string): model ID, defaults to OPENAI_DEFAULT_TEXT_MODEL
instructions (string): system-level steering
max_output_tokens (number): 1-200000
temperature (number): 0-2
top_p (number): 0-1
reasoning_effort ('minimal'|'low'|'medium'|'high'): effort for reasoning models
json_object (boolean): force a valid JSON object as output (default false)
previous_response_id (string): continue an earlier stored response
store (boolean): persist the response for later chaining (default false)
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "id": string, // response ID, usable as previous_response_id when store=true "model": string, // model that actually served the request "status": string | null, // e.g. "completed" or "incomplete" "output_text": string, // the generated text "usage": { "input_tokens": number|null, "output_tokens": number|null, "total_tokens": number|null } }
Examples:
Use when: "Summarise this contract clause" -> input=, instructions="Answer in German, max 3 sentences"
Use when: "Give me the result as JSON" -> json_object=true
Use when: continuing a stored conversation -> previous_response_id="resp_..."
Don't use when: you need to send an existing multi-message history verbatim (use openai_chat_completion)
Error Handling:
"Error: Not found" means the model ID does not exist for this key — call openai_list_models
"Error: Rate limit or quota exceeded" means retry later or lower the request rate
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | The prompt sent to the model | |
| model | No | Model ID, e.g. "gpt-5.6-sol". Defaults to OPENAI_DEFAULT_TEXT_MODEL. Call openai_list_models for the IDs this key can use. | |
| store | No | Persist the response on OpenAI servers so it can be referenced via previous_response_id | |
| top_p | No | Nucleus sampling cutoff; use either temperature or top_p, not both | |
| json_object | No | Force the model to emit a syntactically valid JSON object | |
| temperature | No | Sampling temperature, 0 = deterministic, 2 = very random | |
| instructions | No | System-level instructions that steer tone, role and constraints | |
| response_format | No | Output format: 'markdown' for a readable summary, 'json' for the full structured payload | markdown |
| reasoning_effort | No | How much internal reasoning a reasoning model should spend | |
| max_output_tokens | No | Upper bound on generated tokens | |
| previous_response_id | No | ID of a previous response to continue from; requires that the earlier call used store=true |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| model | Yes | |
| usage | Yes | |
| status | Yes | |
| output_text | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, but the description goes beyond by disclosing the exact response shape, store=true prerequisite for chaining, error handling for model-not-found and rate-limit cases, and the reasoning-effort option. It also warns that temperature and top_p are mutually exclusive in the schema description, which is beyond structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections (Description, Args, Returns, Examples, Error Handling), front-loaded with the key role. Slightly long but every section adds value; no filler. The Args section repeats schema info which is a minor redundancy given 100% schema coverage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 11 parameters, an output schema, and read/write annotations, the description fully covers usage: when to use, what result looks like, error handling, and the chaining prerequisite. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers all 11 parameters at 100%, so the description's param list mostly restates what the schema already documents. However it adds clarification that json_object forces valid JSON and notes the output format nuances (markdown vs json payload) that go beyond schema lines. With high schema coverage, the description's param details add marginal value; I credit the clear examples and error-handling mapping that clarify semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
We still have an explanation that after scoring format, but the argument is em empty. Describing the purpose of the empty "openai_generate_text" and "openai_generate_text" is an empty description that explains the purpose of generate_text. "Generate text with an OpenAI model through the Responses API" is a clear verb+resource description that distinguishes it from the sibling openai_chat_completion by naming its interface (Responses API) and scope (single-turn and chained generation). The description also explicitly states its role as the default text tool, which differentiates it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this as the default text tool' and gives four usage examples with conditions (including don't-use: use openai_chat_completion for verbatim message history). This is strong usage guidance that prevents both misuse and false negatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_list_modelsList available OpenAI modelsARead-onlyIdempotent
List the model IDs the configured API key has access to, optionally filtered by substring.
Call this before guessing a model ID — OpenAI adds, renames and retires models regularly, and access differs per project. The response also reports the model IDs this server uses by default for each capability.
Args:
filter (string): case-insensitive substring match on the model ID, e.g. "embedding"
limit (number): 1-200 (default 50)
offset (number): pagination offset (default 0)
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "total": number, // number of models matching the filter "count": number, // models in this response "offset": number, // current pagination offset "models": [ { "id": string, "owned_by": string, "created_at": string } // created_at is ISO 8601 UTC ], "has_more": boolean, "next_offset": number, // present only when has_more is true "defaults": { "text": string, "image": string, "embedding": string, "transcription": string, "speech": string, "moderation": string } }
Examples:
Use when: "Which embedding models can I use?" -> filter="embedding"
Use when: a generation failed with "model not found" -> call without filter and inspect the list
Don't use when: you only need the server's configured defaults for a single call — those are applied automatically
Error Handling:
"Error: Authentication failed" means OPENAI_API_KEY is invalid
An empty list with a filter set means no model ID contains that substring
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of models to return | |
| filter | No | Case-insensitive substring the model ID must contain, e.g. "embedding" or "image" | |
| offset | No | Number of matching models to skip, for pagination | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| total | Yes | |
| models | Yes | |
| offset | Yes | |
| defaults | Yes | |
| has_more | Yes | |
| next_offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/idempotentHint annotations, the description discloses that access differs per project, that the response includes the server's default model IDs per capability, and it explains how to interpret two error scenarios ('Authentication failed' and empty filtered results). This adds meaningful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured into purpose, arguments, return shape, examples, and error handling. It is detailed but every section serves a purpose and the most important usage guidance appears first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and four parameters fully documented in the schema, the description adds everything an agent still needs: when to call it, concrete example queries, pagination semantics, and error interpretation. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents all four parameters. The description restates the same parameter semantics and adds only a small filter example ('embedding'), which is useful but not a substantial addition beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List the model IDs the configured API key has access to, optionally filtered by substring.' This clearly separates it from the sibling generation tools and names the exact purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Call this before guessing a model ID' and gives concrete 'Use when' and 'Don't use when' examples, including the actual failure case 'model not found'. It also tells the agent not to use it when only server defaults are needed, since those are applied automatically.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_moderate_contentModerate content with OpenAIARead-onlyIdempotent
Check text against OpenAI's moderation policy and report which categories it triggers.
Use this before publishing or forwarding user-supplied text, or to explain why a generation was refused.
Args:
input (string, required): the text to check
model (string): moderation model ID, defaults to OPENAI_DEFAULT_MODERATION_MODEL
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "model": string, "flagged": boolean, // true when any category was triggered "flagged_categories": string[], // e.g. ["violence", "harassment/threatening"] "scores": { "": number } // confidence per category, 0.0-1.0 }
Examples:
Use when: "Is this user comment acceptable?" -> input=
Use when: auditing a batch of support messages before archiving them
Don't use when: you need a stylistic or factual review (use openai_generate_text)
Error Handling:
"Error: Not found" means the moderation model ID is wrong — call openai_list_models with filter="moderation"
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | The text to check | |
| model | No | Moderation model ID. Defaults to OPENAI_DEFAULT_MODERATION_MODEL. | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| model | Yes | |
| scores | Yes | |
| flagged | Yes | |
| flagged_categories | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: error handling for invalid model IDs, the returned JSON shape, and the meaning of the 'flagged' field. This goes beyond what annotations alone provide, though it doesn't discuss rate limits, latency, or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well organized with clear sections: purpose, usage guidance, arguments, return format, examples, and error handling. The most important information is front-loaded, and each section serves a distinct purpose without unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is fully self-contained for effective use. It covers the tool's purpose, when to use it, when not to use it, parameter defaults, return format, example use cases, and a common error scenario. With output schema, annotations, and full schema coverage, nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description mostly restates the same information, such as defaults for model and response_format. It adds minor practical context through examples but does not fundamentally expand parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Check text against OpenAI's moderation policy and report which categories it triggers.' It also distinguishes itself from siblings by explicitly saying not to use it for stylistic or factual review, which prevents confusion with openai_generate_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: before publishing or forwarding user-supplied text, and to explain why a generation was refused. It also gives concrete examples and names the alternative tool to use when moderation is not the need, making the decision boundary very clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_text_to_speechSynthesize speech with OpenAIA
Turn text into spoken audio and write the result to disk.
The audio is never returned inline — the tool reports the absolute path of the generated file.
Args:
input (string, required): the text to speak, up to 10,000 characters
voice (string): voice name, default "alloy"
model (string): speech model ID, defaults to OPENAI_DEFAULT_SPEECH_MODEL
instructions (string): delivery guidance such as "speak slowly and warmly"
format ('mp3'|'opus'|'aac'|'flac'|'wav'|'pcm'): default 'mp3'
speed (number): 0.25-4.0, default 1
output_path (string): absolute target file, defaults to a timestamped file in OPENAI_MCP_OUTPUT_DIR
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "model": string, "voice": string, "path": string, // absolute path of the written audio file "bytes": number, // file size "format": string // container that was written }
Examples:
Use when: "Read this paragraph aloud as an mp3" -> input=
Use when: you need a slower narration -> speed=0.85
Don't use when: you want a transcript of existing audio (use openai_transcribe_audio)
Error Handling:
"Error: Access to ... is not permitted" means output_path is outside OPENAI_MCP_ALLOWED_DIRS
"Error: OpenAI rejected the request as invalid" often means the voice name is unknown to that model
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | The text to speak | |
| model | No | Speech model ID. Defaults to OPENAI_DEFAULT_SPEECH_MODEL. | |
| speed | No | Playback speed multiplier | |
| voice | No | Voice name, e.g. "alloy", "ash", "coral", "sage", "verse", "marin", "cedar" | alloy |
| format | No | Audio container of the generated file | mp3 |
| output_path | No | Absolute file path to write the audio to. Defaults to a timestamped file in OPENAI_MCP_OUTPUT_DIR. | |
| instructions | No | Delivery guidance, e.g. "speak slowly and warmly" | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| bytes | Yes | |
| model | Yes | |
| voice | Yes | |
| format | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important non-obvious behavior beyond the annotations: the audio is never returned inline, the tool writes to disk and reports an absolute path, output_path restrictions produce a specific permission error, and invalid voice names cause a recognizable OpenAI rejection message. This adds meaningful context beyond readOnlyHint, destructiveHint, and openWorldHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but well organized with clear sections for behavior, arguments, returns, examples, and error handling. The most critical non-obvious fact—audio is never returned inline—is front-loaded. Minor redundancy with the schema keeps it from a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters, an output schema, and meaningful annotations, the description still covers everything an agent needs: all parameters and defaults, the return contract, example invocations, and common error conditions. Nothing critical is missing for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description adds value with the 10,000-character limit, output_path default behavior ('timestamped file in OPENAI_MCP_OUTPUT_DIR'), example instructions ('speak slowly and warmly'), and the returned JSON field meanings. Some redundancy exists with the schema, but the extra usage context is helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Turn text into spoken audio and write the result to disk.' It clearly differentiates from the transcription sibling by stating the direction of conversion, and the tool name/title align with the described behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit use-when examples such as 'Read this paragraph aloud as an mp3' and an explicit don't-use-when case: 'you want a transcript of existing audio (use openai_transcribe_audio).' This routes the agent to the correct sibling with little ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_transcribe_audioTranscribe audio with OpenAIAIdempotent
Transcribe a local audio file to text.
The file is read from disk (only from directories listed in OPENAI_MCP_ALLOWED_DIRS) and uploaded to OpenAI. Supported containers include mp3, mp4, m4a, wav, webm, flac and ogg; the API limit is 25 MB per file.
Args:
file_path (string, required): absolute path to the audio file
model (string): transcription model ID, defaults to OPENAI_DEFAULT_TRANSCRIPTION_MODEL
language (string): ISO-639-1 code such as "de" or "en"
prompt (string): vocabulary hint for names and jargon
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "model": string, "text": string, // full transcript "language": string | null, // detected or supplied language "duration_seconds": number | null, // audio length when reported "source_file": string // canonical path that was read }
Examples:
Use when: "What was said in this voice memo?" -> file_path="/data/memo.m4a"
Use when: transcribing a German interview -> language="de"
Don't use when: the file is a video you only want summarised — extract the audio track first
Error Handling:
"Error: File not found" means the path does not exist
"Error: Payload too large" means the file exceeds 25 MB — split it before retrying
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Transcription model ID. Defaults to OPENAI_DEFAULT_TRANSCRIPTION_MODEL. | |
| prompt | No | Optional hint with names, jargon or spelling conventions that appear in the audio | |
| language | No | ISO-639-1 code of the spoken language, e.g. "de". Improves accuracy and latency when known. | |
| file_path | Yes | Absolute path to the audio file (mp3, mp4, m4a, wav, webm, flac, ogg). Must be inside an allowed directory. | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | Yes | |
| model | Yes | |
| language | Yes | |
| source_file | Yes | |
| duration_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behaviors not visible in annotations: the file is read from disk only from OPENAI_MCP_ALLOWED_DIRS, it is uploaded to OpenAI, the 25 MB API limit applies, and specific error messages map to likely causes. These are practical behavioral details that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: a one-sentence purpose, then constraints, Args, return shape, usage examples, and error handling. Despite covering many aspects, each section earns its place and nothing feels redundant or tangential.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given five parameters, file-size limits, allowed-directory constraints, output format, and error handling, the description covers all necessary context for correct invocation. It also includes the return schema and practical examples, so an agent has everything needed to select and call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters. The description largely restates this information in the Args section, with the only notable addition being the 'vocabulary hint' interpretation of prompt. Since the schema carries the semantic load, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Transcribe a local audio file to text.' It differentiates itself from siblings like openai_text_to_speech and openai_generate_text by clearly indicating this tool consumes audio and produces text, while specifying supported audio formats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit use-when examples: 'What was said in this voice memo?' → file_path, and a German interview → language='de'. It also provides an explicit exclusion: 'Don't use when: the file is a video you only want summarised — extract the audio track first.' This is model behavior for routing agents to the correct tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v1.0.0- First observed
openai_chat_completion - First observed
openai_create_embeddings - First observed
openai_edit_image - First observed
openai_generate_image - First observed
openai_generate_text - First observed
openai_list_models - First observed
openai_moderate_content - First observed
openai_text_to_speech - First observed
openai_transcribe_audio
TDQS
Scored across 9 tools
Each tool maps to a distinct OpenAI capability (text, chat history, images, audio, embeddings, moderation, model discovery). openai_generate_text and openai_chat_completion are the only potentially confusable pair, but their descriptions clearly separate single-prompt/chaining from explicit message histories.
All tools share an openai_ prefix and snake_case, with mostly verb_noun names like generate_text, edit_image, list_models. openai_chat_completion and openai_text_to_speech break the verb_noun pattern slightly because they mirror API endpoint names, but the convention remains predictable.
9 tools is appropriate for an OpenAI API surface: one tool per major modality (text, image, audio, embeddings, moderation) plus model discovery. No tool feels redundant or missing at the count level.
The set covers text generation, chat completions, image generation/editing, transcription, speech synthesis, embeddings, and moderation, which are the core OpenAI workflows. Minor gaps exist—notably no vision/analysis of image inputs and no fine-tuning/batch management—but agents can accomplish typical tasks without dead ends.
Maintenance
Related MCP Connectors
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
Focused MCP server for OpenAI image/audio generation (v2.0.0). Wraps endpoints via HAPI CLI.
Authenticated MCP Agent (Openai)
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Related MCP Servers
- -licenseCqualityNot gradedmaintenanceEnables interaction with OpenAI-compatible APIs (like Ollama) through MCP tools. Provides access to chat completions, model listings, and embeddings generation from local or remote OpenAI-style endpoints.3-
- FlicenseBqualityDmaintenanceEnables interaction with OpenAI's Chat Completion and Assistants APIs, supporting assistant management, file operations, and direct queries to GPT models through standardized MCP tools.92-
- AlicenseBqualityDmaintenanceEnables MCP-compatible clients to leverage OpenAI's multimodal capabilities (vision, image generation, speech-to-text, text-to-speech) through file-oriented tools with a security-first architecture.101MIT
- FlicenseNot gradedqualityCmaintenanceA local MCP server exposing the OpenAI platform REST API as tools for file management, fine-tuning, inference, images, audio, batch processing, and organization usage/costs.-