Skip to main content
Glama

openai-mcp-server

OpenAI API をあらゆる MCP クライアント(Claude Desktop、Claude Code、Cowork、Cursor、その他このプロトコルを話すあらゆるクライアント)に提供する MCP サーバーです。

9つのツールがあります: テキスト生成、チャット補完、モデル一覧取得、画像生成と編集、文字起こし、音声合成、埋め込み、モデレーションです。

なぜ存在するのか

Claude プラグインカタログには公式の OpenAI プラグインはありません。このサーバーはその同等品であり、あなたが所有し拡張できる通常のオープンソースプロジェクトとして構築されています。

Related MCP server: OpenAI Assistant MCP Server

ツール

ツール

説明

読み取り専用

openai_generate_text

Responses API によるテキスト生成 — 指示、推論努力量、JSON の強制、レスポンスチェーン

いいえ

openai_chat_completion

Chat Completions を用いて明示的なメッセージ履歴を送信

いいえ

openai_list_models

自分のキーで利用できるモデル ID 一覧を、フィルタリング・ページング付きで表示

はい

openai_generate_image

プロンプトから画像を生成してディスクに保存

いいえ

openai_edit_image

既存画像の編集・合成(任意でマスク指定可能)

いいえ

openai_transcribe_audio

ローカルの音声ファイルを文字起こし

いいえ

openai_text_to_speech

音声を合成して音声ファイルに書き出す

いいえ

openai_create_embeddings

セマンティック検索用にテキストを埋め込み、JSON に保存

いいえ

openai_moderate_content

OpenAI のモデレーションポリシーに照らしてテキストを判定

はい

すべてのツールは response_format: "markdown" | "json" を受け付けます。markdown は閲覧用、JSON は処理用です。また、すべてのツールが structuredContent を返すため、出力スキーマを理解するクライアントは解析なしで型付きデータを受け取れます。

要件

  • Node.js 20 以上

  • 利用可能なクォータを持つ OpenAI API キー

インストール

git clone <your-repo-url> openai-mcp-server
cd openai-mcp-server
npm install
npm run build

ビルドを確認します:

node dist/index.js --version   # prints 1.0.0
node dist/index.js --help      # lists all environment variables
{
  "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"
      }
    }
  }
}

MCP クライアントの設定

サーバーは stdio 上で MCP を話すため、クライアントはサブプロセスとしてサーバーを起動します。

Claude Desktop

claude_desktop_config.json を編集します:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

claude mcp add openai \
  --env OPENAI_API_KEY=sk-proj-... \
  -- node /absolute/path/to/openai-mcp-server/dist/index.js

その後、Claude Desktop を再起動します。

Claude Code

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/

その他の MCP クライアント

OPENAI_API_KEY を環境に設定した上で、node /absolute/path/to/dist/index.js をサーバーとして指定してください。

設定

必要になるのは OPENAI_API_KEY のみです。コピーして利用できるテンプレートは .env.example にあります。

変数

デフォルト

目的

OPENAI_API_KEY

—

必須。 あなたの OpenAI API キー

OPENAI_BASE_URL

OpenAI のデフォルト

代替エンドポイント (Azure、gateway、proxy)

OPENAI_ORG_ID

—

組織 ID

OPENAI_PROJECT_ID

—

プロジェクト ID

OPENAI_MCP_OUTPUT_DIR

<tmp>/openai-mcp

生成ファイルの書き出し先

OPENAI_MCP_ALLOWED_DIRS

出力ディレクトリのみ

サーバーが読み取りできる絶対ディレクトリ (コロン区切り)

OPENAI_MCP_TIMEOUT_MS

120000

リクエストごとのタイムアウト

OPENAI_MCP_MAX_RETRIES

2

一時的なエラーに対するリトライ回数

OPENAI_DEFAULT_TEXT_MODEL

gpt-5.6-terra

デフォルトのテキストモデル

OPENAI_DEFAULT_IMAGE_MODEL

gpt-image-2

デフォルトの画像モデル

OPENAI_DEFAULT_EMBEDDING_MODEL

text-embedding-3-small

デフォルトの埋め込みモデル

OPENAI_DEFAULT_TRANSCRIPTION_MODEL

gpt-transcribe

デフォルトの文字起こしモデル

OPENAI_DEFAULT_SPEECH_MODEL

gpt-4o-mini-tts

デフォルトの音声合成モデル

OPENAI_DEFAULT_MODERATION_MODEL

omni-moderation-latest

デフォルトのモデレーションモデル

モデル ID は変わります。 OpenAI はモデルの追加・名前変更・廃止を行い、アクセスはプロジェクトごとに異なります。どのデフォルトも上書き可能であり、openai_list_models はあなたのキーが実際に利用可能なモデルを報告します — 「model not found」で呼び出しに失敗した場合は、まずそこを確認してください。

セキュリティモデル

意図的に2つの制約を課しています:

ファイルシステムはサンドボックス化されています。 ローカルファイルを読むツール (openai_edit_image、openai_transcribe_audio) は、OPENAI_MCP_ALLOWED_DIRS 内の絶対パスのみを受け付けます。パスはチェック前に realpath で正規化されるため、シンボリックリンクや ../ による遷移で外に抜け出すことはできません。出力ディレクトリは常に許可されますが、それ以外はあなたが追加するまで許可されません。このリストは狭く維持してください。

バイナリ出力が会話に入り込むことはありません。 画像・音声・埋め込みベクトルはディスクに保存され、返されるのは同じパスのみです。base64 PNG 1枚や3072個の float ベクトルが返されると、モデルのコンテキストウィンドウを圧迫してしまうからです。

API キーは環境変数からのみ読み取られます — ツールの引数、ログ行、エラーメッセージに現れることは決してありません。

例

MCP クライアントに自然言語で指示すると、クライアントがツールを選択します。

「OpenAI サーバーを使って、このテキストを3文で要約してください。」

→ OpenAI generate_code_text

「どの OpenAI 埋め込みモデルを使えますか?」

→ openai_list_models(filter="embedding" 指定)

「青いキツネの透明な PNG ロゴを生成してください。」

→ openai_generate_image(background="transparent" 指定)

「~/Documents/audio/interview.m4a をドイツ語で文字起こして。」

→ openai_transcribe_audio(language="de" 指定) — そのディレクトリが OPENAI_MCP_ALLOWED_DIRS に含まれている必要があります

「これらの40個の製品説明を埋め込みして、クラスタリングできるようにして。」

→ openai_create_embeddings を使用後、報告された JSON ファイルを読み取ります

開発

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

テストスイートは、設定ファイルの解析、ファイルシステムサンドボックス (シンボリックリンクによる任意脱出やトラバーサルを含む)、エラーフォーマット、レスポンス整形をカバーしています。OpenAI API には一切接続しません。

プロジェクト構成

GXP7

ツールの追加方法

  1. 各フィールドに対して .strict() と .describe() を持つ Zod スキーマを記述します。

  2. server.registerTool(name, config, handler) で登録します — title、description、inputSchema、outputSchema、annotations を含めます。

  3. Markdown/JSON の処理と文字数制限を一貫させるために toolResult(...) でレスポンスを返し、エラーは errorResult(...) で catch します。

  4. 登録呼び出しを src/index.ts に、テストを test/ に追加します。

トラブルシューティング

症状

原因

クライアントにツールが表示されない

設定のパスが間違っている、またはプロジェクトが未ビルド (npm run build)

Configuration error: OPENAI_API_KEY is not set (終了コード 78)

クライアントの env ブロックにキーが存在しない

Error: Access は許可されていません

パスが OPENAI_TIMEOUT_DIR の外にある

生成時に Error: Not found

あなたのキーにはモデル ID が存在しない — openai_list_models を実行

Error: Rate limit or quota exceeded

後で再試行するか、プロジェクトの課金状態を確認

サーバーログは stderr に出力されます。stdout は JSON-RPC ストリームを通しますので、常にクリーンである必要があります。

ライセンス

MIT — 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

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

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

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

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

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

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

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

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

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

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

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

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"

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

Output 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

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

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

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

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

ActivityStale
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
    D
    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.
    -