Skip to main content
Glama

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

openai_generate_text

Generate text via the Responses API — instructions, reasoning effort, forced JSON, response chaining

no

openai_chat_completion

Send an explicit message history via Chat Completions

no

openai_list_models

List the model IDs your key can use, filtered and paginated

yes

openai_generate_image

Create images from a prompt, written to disk

no

openai_edit_image

Edit or combine existing images, optionally with a mask

no

openai_transcribe_audio

Transcribe a local audio file

no

openai_text_to_speech

Synthesize speech to an audio file

no

openai_create_embeddings

Embed texts for semantic search, written to JSON

no

openai_moderate_content

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>.mcpb

From 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 build

Requires 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 variables

Configure 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.json

  • Windows: %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.js

Any 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

OPENAI_API_KEY

Required. Your OpenAI API key

OPENAI_BASE_URL

OpenAI's default

Alternative endpoint (Azure, gateway, proxy)

OPENAI_ORG_ID

Organization ID

OPENAI_PROJECT_ID

Project ID

OPENAI_MCP_OUTPUT_DIR

<tmp>/openai-mcp

Where generated files are written

OPENAI_MCP_ALLOWED_DIRS

output dir only

Colon-separated absolute dirs the server may read from

OPENAI_MCP_TIMEOUT_MS

120000

Per-request timeout

OPENAI_MCP_MAX_RETRIES

2

Retries for transient failures

OPENAI_DEFAULT_TEXT_MODEL

gpt-5.6-terra

Default text model

OPENAI_DEFAULT_IMAGE_MODEL

gpt-image-2

Default image model

OPENAI_DEFAULT_EMBEDDING_MODEL

text-embedding-3-small

Default embedding model

OPENAI_DEFAULT_TRANSCRIPTION_MODEL

gpt-transcribe

Default transcription model

OPENAI_DEFAULT_SPEECH_MODEL

gpt-4o-mini-tts

Default speech model

OPENAI_DEFAULT_MODERATION_MODEL

omni-moderation-latest

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/Pictures

This 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 bundle

The 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_content

Adding a tool

  1. Write a Zod schema with .strict() and a .describe() on every field.

  2. Register it with server.registerTool(name, config, handler) — include title, description, inputSchema, outputSchema and annotations.

  3. Return via toolResult(...) so markdown/JSON handling and the character limit stay consistent; catch errors with errorResult(...).

  4. Add the registration call in src/index.ts and a test in test/.

Troubleshooting

Symptom

Cause

Client shows no tools

Wrong path in the config, or the project was not built (npm run build)

Configuration error: OPENAI_API_KEY is not set (exit 78)

The key is missing from the client's env block

Error: Access to ... is not permitted

The path is outside OPENAI_MCP_ALLOWED_DIRS

Error: Not found on a generation

The model ID does not exist for your key — run openai_list_models

Error: Rate limit or quota exceeded

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 tools
openai_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

ParametersJSON Schema
NameRequiredDescriptionDefault
stopNoUp to 4 strings that stop generation when produced
modelNoModel ID. Defaults to OPENAI_DEFAULT_TEXT_MODEL.
top_pNoNucleus sampling cutoff
messagesYesConversation history in chronological order
temperatureNoSampling temperature
response_formatNoOutput format: 'markdown' for a readable summary, 'json' for the full structured payloadmarkdown
max_completion_tokensNoUpper bound on generated tokens

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
modelYes
usageYes
contentYes
refusalYes
finish_reasonYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 OpenAIA
Idempotent

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

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNoEmbedding model ID. Defaults to OPENAI_DEFAULT_EMBEDDING_MODEL.
textsYesThe texts to embed, in order
dimensionsNoShorten the vectors to this many dimensions; supported by text-embedding-3 models
output_pathNoAbsolute path of the JSON file to write. Defaults to a timestamped file in OPENAI_MCP_OUTPUT_DIR.
return_vectorsNoReturn the raw vectors inline instead of only the file path. Allowed for at most 5 texts.
response_formatNoOutput format: 'markdown' or 'json'markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
modelYes
usageYes
vectorsNo
file_pathYes
dimensionsYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nNoHow many variants to produce
sizeNoOutput resolutionauto
modelNoImage model ID. Defaults to OPENAI_DEFAULT_IMAGE_MODEL.
promptYesInstruction describing the edit to apply
mask_pathNoOptional absolute path to a PNG mask; transparent areas mark the region to replace
output_dirNoAbsolute directory to write the results into
image_pathsYesAbsolute paths of the source images. Must live inside an allowed directory.
response_formatNoOutput format: 'markdown' or 'json'markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
modelYes
imagesYes
revised_promptYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nNoHow many images to generate
sizeNoOutput resolutionauto
modelNoImage model ID. Defaults to OPENAI_DEFAULT_IMAGE_MODEL.
promptYesDescription of the image to create
qualityNoRendering quality; higher costs more and takes longerauto
backgroundNoBackground handling; "transparent" requires png or webp outputauto
output_dirNoAbsolute directory to write the images into. Defaults to OPENAI_MCP_OUTPUT_DIR. Must be inside an allowed directory.
output_formatNoFile format of the generated imagepng
response_formatNoOutput format: 'markdown' or 'json'markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
modelYes
imagesYes
revised_promptYes

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
inputYesThe prompt sent to the model
modelNoModel ID, e.g. "gpt-5.6-sol". Defaults to OPENAI_DEFAULT_TEXT_MODEL. Call openai_list_models for the IDs this key can use.
storeNoPersist the response on OpenAI servers so it can be referenced via previous_response_id
top_pNoNucleus sampling cutoff; use either temperature or top_p, not both
json_objectNoForce the model to emit a syntactically valid JSON object
temperatureNoSampling temperature, 0 = deterministic, 2 = very random
instructionsNoSystem-level instructions that steer tone, role and constraints
response_formatNoOutput format: 'markdown' for a readable summary, 'json' for the full structured payloadmarkdown
reasoning_effortNoHow much internal reasoning a reasoning model should spend
max_output_tokensNoUpper bound on generated tokens
previous_response_idNoID of a previous response to continue from; requires that the earlier call used store=true

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
modelYes
usageYes
statusYes
output_textYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 modelsA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of models to return
filterNoCase-insensitive substring the model ID must contain, e.g. "embedding" or "image"
offsetNoNumber of matching models to skip, for pagination
response_formatNoOutput format: 'markdown' or 'json'markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
totalYes
modelsYes
offsetYes
defaultsYes
has_moreYes
next_offsetNo

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 OpenAIA
Read-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"

ParametersJSON Schema
NameRequiredDescriptionDefault
inputYesThe text to check
modelNoModeration model ID. Defaults to OPENAI_DEFAULT_MODERATION_MODEL.
response_formatNoOutput format: 'markdown' or 'json'markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
modelYes
scoresYes
flaggedYes
flagged_categoriesYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
inputYesThe text to speak
modelNoSpeech model ID. Defaults to OPENAI_DEFAULT_SPEECH_MODEL.
speedNoPlayback speed multiplier
voiceNoVoice name, e.g. "alloy", "ash", "coral", "sage", "verse", "marin", "cedar"alloy
formatNoAudio container of the generated filemp3
output_pathNoAbsolute file path to write the audio to. Defaults to a timestamped file in OPENAI_MCP_OUTPUT_DIR.
instructionsNoDelivery guidance, e.g. "speak slowly and warmly"
response_formatNoOutput format: 'markdown' or 'json'markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
pathYes
bytesYes
modelYes
voiceYes
formatYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 OpenAIA
Idempotent

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

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNoTranscription model ID. Defaults to OPENAI_DEFAULT_TRANSCRIPTION_MODEL.
promptNoOptional hint with names, jargon or spelling conventions that appear in the audio
languageNoISO-639-1 code of the spoken language, e.g. "de". Improves accuracy and latency when known.
file_pathYesAbsolute path to the audio file (mp3, mp4, m4a, wav, webm, flac, ogg). Must be inside an allowed directory.
response_formatNoOutput format: 'markdown' or 'json'markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
modelYes
languageYes
source_fileYes
duration_secondsYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 9 tool updatesv1.0.0
    • First observedopenai_chat_completion
    • First observedopenai_create_embeddings
    • First observedopenai_edit_image
    • First observedopenai_generate_image
    • First observedopenai_generate_text
    • First observedopenai_list_models
    • First observedopenai_moderate_content
    • First observedopenai_text_to_speech
    • First observedopenai_transcribe_audio

TDQS

A4.4/5.0

Scored across 9 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • -
    license
    C
    quality
    Not graded
    maintenance
    Enables 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
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    A 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.
    -