openai-mcp-server
openai-mcp-server
OpenAI API をあらゆる MCP クライアント(Claude Desktop、Claude Code、Cowork、Cursor、その他このプロトコルを話すあらゆるクライアント)に提供する MCP サーバーです。
9つのツールがあります: テキスト生成、チャット補完、モデル一覧取得、画像生成と編集、文字起こし、音声合成、埋め込み、モデレーションです。
なぜ存在するのか
Claude プラグインカタログには公式の OpenAI プラグインはありません。このサーバーはその同等品であり、あなたが所有し拡張できる通常のオープンソースプロジェクトとして構築されています。
Related MCP server: OpenAI Assistant MCP Server
ツール
ツール | 説明 | 読み取り専用 |
| Responses API によるテキスト生成 — 指示、推論努力量、JSON の強制、レスポンスチェーン | いいえ |
| Chat Completions を用いて明示的なメッセージ履歴を送信 | いいえ |
| 自分のキーで利用できるモデル ID 一覧を、フィルタリング・ページング付きで表示 | はい |
| プロンプトから画像を生成してディスクに保存 | いいえ |
| 既存画像の編集・合成(任意でマスク指定可能) | いいえ |
| ローカルの音声ファイルを文字起こし | いいえ |
| 音声を合成して音声ファイルに書き出す | いいえ |
| セマンティック検索用にテキストを埋め込み、JSON に保存 | いいえ |
| 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.jsonWindows:
%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 キー |
| OpenAI のデフォルト | 代替エンドポイント (Azure、gateway、proxy) |
| — | 組織 ID |
| — | プロジェクト ID |
|
| 生成ファイルの書き出し先 |
| 出力ディレクトリのみ | サーバーが読み取りできる絶対ディレクトリ (コロン区切り) |
|
| リクエストごとのタイムアウト |
|
| 一時的なエラーに対するリトライ回数 |
|
| デフォルトのテキストモデル |
|
| デフォルトの画像モデル |
|
| デフォルトの埋め込みモデル |
|
| デフォルトの文字起こしモデル |
|
| デフォルトの音声合成モデル |
|
| デフォルトのモデレーションモデル |
モデル 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
ツールの追加方法
各フィールドに対して
.strict()と.describe()を持つ Zod スキーマを記述します。server.registerTool(name, config, handler)で登録します —title、description、inputSchema、outputSchema、annotationsを含めます。Markdown/JSON の処理と文字数制限を一貫させるために
toolResult(...)でレスポンスを返し、エラーはerrorResult(...)で catch します。登録呼び出しを
src/index.tsに、テストをtest/に追加します。
トラブルシューティング
症状 | 原因 |
クライアントにツールが表示されない | 設定のパスが間違っている、またはプロジェクトが未ビルド ( |
| クライアントの |
| パスが |
生成時に | あなたのキーにはモデル ID が存在しない — |
| 後で再試行するか、プロジェクトの課金状態を確認 |
サーバーログは stderr に出力されます。stdout は JSON-RPC ストリームを通しますので、常にクリーンである必要があります。
ライセンス
MIT — LICENSE を参照してください。
Available Tools
9 toolsopenai_chat_completionRun an OpenAI chat completionA
Send an explicit list of chat messages to an OpenAI model through the Chat Completions API.
Use this when you already hold a structured conversation history (system/user/assistant turns) and want it sent verbatim. For new single-prompt generations prefer openai_generate_text.
Args:
messages (array, required): [{ role: 'system'|'user'|'assistant'|'developer', content: string }], 1-200 entries
model (string): model ID, defaults to OPENAI_DEFAULT_TEXT_MODEL
max_completion_tokens (number): 1-200000
temperature (number): 0-2
top_p (number): 0-1
stop (string[]): up to 4 stop sequences
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "id": string, // completion ID "model": string, // model that served the request "finish_reason": string | null, // "stop", "length", "content_filter", ... "content": string, // assistant reply text "refusal": string | null, // set when the model declined "usage": { "input_tokens": number|null, "output_tokens": number|null, "total_tokens": number|null } }
Examples:
Use when: replaying a saved conversation with a new final user turn
Use when: you need a stop sequence to cut generation at a delimiter
Don't use when: chaining stored responses (use openai_generate_text with previous_response_id)
Error Handling:
"Error: OpenAI rejected the request as invalid" often means an unsupported parameter for that model, e.g. temperature on a reasoning-only model
| Name | Required | Description | Default |
|---|---|---|---|
| stop | No | Up to 4 strings that stop generation when produced | |
| model | No | Model ID. Defaults to OPENAI_DEFAULT_TEXT_MODEL. | |
| top_p | No | Nucleus sampling cutoff | |
| messages | Yes | Conversation history in chronological order | |
| temperature | No | Sampling temperature | |
| response_format | No | Output format: 'markdown' for a readable summary, 'json' for the full structured payload | markdown |
| max_completion_tokens | No | Upper bound on generated tokens |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| model | Yes | |
| usage | Yes | |
| content | Yes | |
| refusal | Yes | |
| finish_reason | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint false, idempotentHint false, destructiveHint false), so the description carries most of the burden. It adds genuinely useful behavioral context beyond annotations: the refusal field populated when the model declines, finish_reason values, nullability of usage tokens, and an error-handling note explaining that 'invalid request' usually means an unsupported parameter for that model. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but remarkably well structured: purpose, usage, args, returns, examples, error handling, with the most decision-relevant information front-loaded in the first two sentences. The Args and Returns blocks partially duplicate the 100%-covered schema and the output schema, which costs some efficiency, but every unique section (examples, error handling) earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with an output schema, the description covers all essentials: purpose, when to use and not use, parameter defaults, full return shape including edge cases (refusal, null usage), and the most common failure mode. Minor gaps remain — no mention of auth prerequisites or rate limits — but those are typically server-side concerns for an MCP wrapper.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The Args section essentially mirrors the schema's constraints (ranges, defaults, max items) without adding new semantic meaning; the schema's response_format description is actually richer than the description's terse version. The description adds no parameter insight beyond what structured data already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource: send an explicit list of chat messages through the Chat Completions API. It immediately distinguishes itself from the sibling openai_generate_text ('For new single-prompt generations prefer openai_generate_text'), so an agent can tell them apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use conditions (holding structured conversation history, needing verbatim replay, needing stop sequences), explicit when-not-to-use conditions (chaining stored responses), and names the alternative tool in each case. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_create_embeddingsCreate embeddings with OpenAIAIdempotent
Turn texts into embedding vectors for semantic search, clustering or deduplication.
By default the vectors are written to a JSON file and only the path plus metadata are returned, because a single vector holds up to 3072 floats. Set return_vectors=true for small batches when the numbers are needed directly.
Args:
texts (string[], required): 1-2048 texts to embed
model (string): embedding model ID, defaults to OPENAI_DEFAULT_EMBEDDING_MODEL
dimensions (number): shorten vectors (text-embedding-3 models only)
return_vectors (boolean): inline the vectors, max 5 texts (default false)
output_path (string): absolute path of the JSON file to write
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "model": string, "count": number, // number of vectors produced "dimensions": number, // length of each vector "file_path": string | null, // where the vectors were written "usage": { "input_tokens": number|null, "total_tokens": number|null }, "vectors": number[][] // present only when return_vectors is true }
The written JSON file has the shape: { "model": "text-embedding-3-small", "created_at": "2026-08-23T14:05:00.000Z", "count": 2, "dimensions": 1536, "items": [ { "index": 0, "text_preview": "…", "embedding": [0.0123, -0.0456] } ] }
Examples:
Use when: building a semantic index over documents -> texts=[...], then read the JSON file
Use when: comparing two sentences directly -> texts=[a, b], return_vectors=true
Don't use when: you just want a summary or classification (use openai_generate_text)
Error Handling:
"Error: return_vectors is only allowed for up to 5 texts" — lower the batch or read the file
"Error: OpenAI rejected the request as invalid" often means the model does not support the dimensions parameter
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Embedding model ID. Defaults to OPENAI_DEFAULT_EMBEDDING_MODEL. | |
| texts | Yes | The texts to embed, in order | |
| dimensions | No | Shorten the vectors to this many dimensions; supported by text-embedding-3 models | |
| output_path | No | Absolute path of the JSON file to write. Defaults to a timestamped file in OPENAI_MCP_OUTPUT_DIR. | |
| return_vectors | No | Return the raw vectors inline instead of only the file path. Allowed for at most 5 texts. | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| model | Yes | |
| usage | Yes | |
| vectors | No | |
| file_path | Yes | |
| dimensions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behavioral traits: vectors are written to a JSON file by default, only the path and metadata are returned by default, inline return is limited to 5 texts, and dimensions are only supported by text-embedding-3 models. It also explains likely error messages and how to handle them, which goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (summary, args, returns, examples, error handling) and front-loads the most important behavior. It is somewhat long and repeats some schema information in the Args list, but every section earns its place given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with output-schema support, the description is complete: it covers the return JSON shape, the written file shape, default output behavior, parameter constraints, example use cases, and error scenarios. An agent has everything needed to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds practical meaning beyond the schema: it explains why the default avoids inline vectors (a single vector holds up to 3072 floats), clarifies the max 5 texts for return_vectors, and connects the dimensions parameter to model compatibility. Some redundancy with the schema remains.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific action ('Turn texts into embedding vectors') and names the intended applications (semantic search, clustering, deduplication). It also differentiates from the sibling openai_generate_text by explicitly saying when not to use this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete 'Use when' scenarios, such as building a semantic index or comparing two sentences directly, and an explicit 'Don't use when' case pointing to openai_generate_text. This makes tool selection unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_edit_imageEdit an image with OpenAIA
Edit or extend existing images according to a text instruction, optionally restricted to a masked region.
Source images are read from disk (only from directories listed in OPENAI_MCP_ALLOWED_DIRS) and results are written back to disk.
Args:
prompt (string, required): the edit to apply
image_paths (string[], required): 1-4 absolute paths to source images
mask_path (string): absolute path to a PNG mask; transparent pixels mark the area to replace
model (string): image model ID, defaults to OPENAI_DEFAULT_IMAGE_MODEL
n (number): 1-4 variants (default 1)
size ('auto'|'1024x1024'|'1536x1024'|'1024x1536'|'512x512'|'256x256'): default 'auto'
output_dir (string): absolute target directory
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "model": string, "count": number, "images": [ { "index": number, "path": string, "bytes": number } ], "revised_prompt": string | null }
Examples:
Use when: "Replace the sky in photo.png with a sunset" -> image_paths=["/data/photo.png"], prompt="sunset sky"
Use when: combining several product shots into one scene -> image_paths=[...]
Don't use when: creating an image from scratch (use openai_generate_image)
Error Handling:
"Error: File not found" means the path does not exist
"Error: Access to ... is not permitted" means the file lives outside OPENAI_MCP_ALLOWED_DIRS
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | How many variants to produce | |
| size | No | Output resolution | auto |
| model | No | Image model ID. Defaults to OPENAI_DEFAULT_IMAGE_MODEL. | |
| prompt | Yes | Instruction describing the edit to apply | |
| mask_path | No | Optional absolute path to a PNG mask; transparent areas mark the region to replace | |
| output_dir | No | Absolute directory to write the results into | |
| image_paths | Yes | Absolute paths of the source images. Must live inside an allowed directory. | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| model | Yes | |
| images | Yes | |
| revised_prompt | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial context beyond the annotations (readOnlyHint=false, openWorldHint=true): files are read only from OPENAI_MCP_ALLOWED_DIRS, results are written back to disk, and an Error Handling section tells agents how to interpret 'File not found' versus permission failures. These details are actionable and not derivable from the annotations alone. No contradiction exists — the described file writes align with readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but well-organized with clear section headers (Args, Returns, Examples, Error Handling) and a front-loaded purpose sentence. The Args and Returns blocks partly duplicate the schema and output schema, which is mild redundancy, but the Examples and Error Handling sections earn their space since they encode behavior not present in structured data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with file I/O, the description covers purpose, parameter meanings, filesystem constraints, failure modes, and usage examples thoroughly. The remaining gap is minor: it never states what happens when output_dir is omitted (the default output location), and the 'Don't use when' guidance covers only one sibling despite several related ones.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The Arg list in the description largely restates what the schema already documents (ranges, defaults, enum values) rather than adding new semantic depth; a few phrases like 'absolute paths to source images' reinforce but do not extend the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb phrase ('Edit or extend existing images according to a text instruction, optionally restricted to a masked region') that clearly identifies the resource (existing images) and the operation. It differentiates from the sibling openai_generate_image by explicitly calling out that creating from scratch is a different tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete 'Use when' scenarios with realistic examples ('Replace the sky in photo.png with a sunset', 'combining several product shots into one scene') and an explicit 'Don't use when' with the named alternative (openai_generate_image). This is exactly the when/when-not/alternatives guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_generate_imageGenerate an image with OpenAIA
Create one or more images from a text prompt and write them to disk.
Images are never returned inline — the tool saves each file and reports its absolute path, so the agent's context stays small.
Args:
prompt (string, required): what the image should show
model (string): image model ID, defaults to OPENAI_DEFAULT_IMAGE_MODEL
n (number): 1-4 images (default 1)
size ('auto'|'1024x1024'|'1536x1024'|'1024x1536'|'512x512'|'256x256'): default 'auto'
quality ('auto'|'low'|'medium'|'high'): default 'auto'
background ('auto'|'transparent'|'opaque'): default 'auto'; 'transparent' needs png or webp
output_format ('png'|'jpeg'|'webp'): default 'png'
output_dir (string): absolute target directory, defaults to OPENAI_MCP_OUTPUT_DIR
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "model": string, "count": number, "images": [ { "index": number, "path": string, "bytes": number } ], "revised_prompt": string | null // prompt rewrite the model applied, when reported }
Examples:
Use when: "Draw a logo of a blue fox" -> prompt="minimalist blue fox logo, flat vector"
Use when: you need a transparent sticker -> background="transparent", output_format="png"
Don't use when: you want to modify an existing picture (use openai_edit_image)
Error Handling:
"Error: Access to ... is not permitted" means output_dir is outside OPENAI_MCP_ALLOWED_DIRS
"Error: OpenAI rejected the request as invalid" often means size or quality is unsupported by that model
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | How many images to generate | |
| size | No | Output resolution | auto |
| model | No | Image model ID. Defaults to OPENAI_DEFAULT_IMAGE_MODEL. | |
| prompt | Yes | Description of the image to create | |
| quality | No | Rendering quality; higher costs more and takes longer | auto |
| background | No | Background handling; "transparent" requires png or webp output | auto |
| output_dir | No | Absolute directory to write the images into. Defaults to OPENAI_MCP_OUTPUT_DIR. Must be inside an allowed directory. | |
| output_format | No | File format of the generated image | png |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| model | Yes | |
| images | Yes | |
| revised_prompt | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, so the write behavior is expected, but the description adds substantial context beyond that: images 'are never returned inline — the tool saves each file and reports its absolute path', the rationale ('agent's context stays small'), environment-variable defaults, and a dedicated Error Handling section explaining what specific error strings mean (allowed-dir violations, unsupported size/quality combinations). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The most important behavioral fact (saves to disk, never inline) is front-loaded in the first sentence. The remaining sections — Args, Returns, Examples, Error Handling — are each clearly headed and earn their place: the arg list is a fast reference, examples give actionable usage, and error strings turn failures into diagnosable conditions. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with an output schema and annotations, this description is complete: it explains the core behavior, the return shape (paths, byte counts, revised_prompt semantics), the allowed environment constraints, when not to use it, and how to interpret common failures. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real value: it flags the cross-parameter constraint that 'transparent' requires png/webp output, documents env-var defaults for model and output_dir, and ties size/quality to model-specific rejection in the error section. It consolidates all 9 params into a scan-friendly list with constraints, going slightly beyond the schema's per-parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair ('Create one or more images from a text prompt') plus the distinguishing behavior 'write them to disk'. It explicitly contrasts itself with openai_edit_image in the examples, so an agent can tell this tool apart from its closest sibling without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit 'Use when' examples with concrete prompt transformations, a conditional example (transparent sticker -> background='transparent', output_format='png'), and an explicit 'Don't use when' exclusion that names the alternative tool (openai_edit_image). This is exactly the when/when-not/alternatives guidance the rubric asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_generate_textGenerate text with OpenAIA
Generate text with an OpenAI model through the Responses API — OpenAI's current interface for single-turn and chained generation.
Use this as the default text tool. It supports plain prompting, system instructions, reasoning effort control, forced JSON output and multi-turn chaining via previous_response_id.
Args:
input (string, required): the prompt
model (string): model ID, defaults to OPENAI_DEFAULT_TEXT_MODEL
instructions (string): system-level steering
max_output_tokens (number): 1-200000
temperature (number): 0-2
top_p (number): 0-1
reasoning_effort ('minimal'|'low'|'medium'|'high'): effort for reasoning models
json_object (boolean): force a valid JSON object as output (default false)
previous_response_id (string): continue an earlier stored response
store (boolean): persist the response for later chaining (default false)
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "id": string, // response ID, usable as previous_response_id when store=true "model": string, // model that actually served the request "status": string | null, // e.g. "completed" or "incomplete" "output_text": string, // the generated text "usage": { "input_tokens": number|null, "output_tokens": number|null, "total_tokens": number|null } }
Examples:
Use when: "Summarise this contract clause" -> input=, instructions="Answer in German, max 3 sentences"
Use when: "Give me the result as JSON" -> json_object=true
Use when: continuing a stored conversation -> previous_response_id="resp_..."
Don't use when: you need to send an existing multi-message history verbatim (use openai_chat_completion)
Error Handling:
"Error: Not found" means the model ID does not exist for this key — call openai_list_models
"Error: Rate limit or quota exceeded" means retry later or lower the request rate
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | The prompt sent to the model | |
| model | No | Model ID, e.g. "gpt-5.6-sol". Defaults to OPENAI_DEFAULT_TEXT_MODEL. Call openai_list_models for the IDs this key can use. | |
| store | No | Persist the response on OpenAI servers so it can be referenced via previous_response_id | |
| top_p | No | Nucleus sampling cutoff; use either temperature or top_p, not both | |
| json_object | No | Force the model to emit a syntactically valid JSON object | |
| temperature | No | Sampling temperature, 0 = deterministic, 2 = very random | |
| instructions | No | System-level instructions that steer tone, role and constraints | |
| response_format | No | Output format: 'markdown' for a readable summary, 'json' for the full structured payload | markdown |
| reasoning_effort | No | How much internal reasoning a reasoning model should spend | |
| max_output_tokens | No | Upper bound on generated tokens | |
| previous_response_id | No | ID of a previous response to continue from; requires that the earlier call used store=true |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| model | Yes | |
| usage | Yes | |
| status | Yes | |
| output_text | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, but the description goes beyond by disclosing the exact response shape, store=true prerequisite for chaining, error handling for model-not-found and rate-limit cases, and the reasoning-effort option. It also warns that temperature and top_p are mutually exclusive in the schema description, which is beyond structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections (Description, Args, Returns, Examples, Error Handling), front-loaded with the key role. Slightly long but every section adds value; no filler. The Args section repeats schema info which is a minor redundancy given 100% schema coverage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 11 parameters, an output schema, and read/write annotations, the description fully covers usage: when to use, what result looks like, error handling, and the chaining prerequisite. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers all 11 parameters at 100%, so the description's param list mostly restates what the schema already documents. However it adds clarification that json_object forces valid JSON and notes the output format nuances (markdown vs json payload) that go beyond schema lines. With high schema coverage, the description's param details add marginal value; I credit the clear examples and error-handling mapping that clarify semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
We still have an explanation that after scoring format, but the argument is em empty. Describing the purpose of the empty "openai_generate_text" and "openai_generate_text" is an empty description that explains the purpose of generate_text. "Generate text with an OpenAI model through the Responses API" is a clear verb+resource description that distinguishes it from the sibling openai_chat_completion by naming its interface (Responses API) and scope (single-turn and chained generation). The description also explicitly states its role as the default text tool, which differentiates it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this as the default text tool' and gives four usage examples with conditions (including don't-use: use openai_chat_completion for verbatim message history). This is strong usage guidance that prevents both misuse and false negatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_list_modelsList available OpenAI modelsARead-onlyIdempotent
List the model IDs the configured API key has access to, optionally filtered by substring.
Call this before guessing a model ID — OpenAI adds, renames and retires models regularly, and access differs per project. The response also reports the model IDs this server uses by default for each capability.
Args:
filter (string): case-insensitive substring match on the model ID, e.g. "embedding"
limit (number): 1-200 (default 50)
offset (number): pagination offset (default 0)
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "total": number, // number of models matching the filter "count": number, // models in this response "offset": number, // current pagination offset "models": [ { "id": string, "owned_by": string, "created_at": string } // created_at is ISO 8601 UTC ], "has_more": boolean, "next_offset": number, // present only when has_more is true "defaults": { "text": string, "image": string, "embedding": string, "transcription": string, "speech": string, "moderation": string } }
Examples:
Use when: "Which embedding models can I use?" -> filter="embedding"
Use when: a generation failed with "model not found" -> call without filter and inspect the list
Don't use when: you only need the server's configured defaults for a single call — those are applied automatically
Error Handling:
"Error: Authentication failed" means OPENAI_API_KEY is invalid
An empty list with a filter set means no model ID contains that substring
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of models to return | |
| filter | No | Case-insensitive substring the model ID must contain, e.g. "embedding" or "image" | |
| offset | No | Number of matching models to skip, for pagination | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| total | Yes | |
| models | Yes | |
| offset | Yes | |
| defaults | Yes | |
| has_more | Yes | |
| next_offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/idempotentHint annotations, the description discloses that access differs per project, that the response includes the server's default model IDs per capability, and it explains how to interpret two error scenarios ('Authentication failed' and empty filtered results). This adds meaningful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured into purpose, arguments, return shape, examples, and error handling. It is detailed but every section serves a purpose and the most important usage guidance appears first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and four parameters fully documented in the schema, the description adds everything an agent still needs: when to call it, concrete example queries, pagination semantics, and error interpretation. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents all four parameters. The description restates the same parameter semantics and adds only a small filter example ('embedding'), which is useful but not a substantial addition beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List the model IDs the configured API key has access to, optionally filtered by substring.' This clearly separates it from the sibling generation tools and names the exact purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Call this before guessing a model ID' and gives concrete 'Use when' and 'Don't use when' examples, including the actual failure case 'model not found'. It also tells the agent not to use it when only server defaults are needed, since those are applied automatically.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_moderate_contentModerate content with OpenAIARead-onlyIdempotent
Check text against OpenAI's moderation policy and report which categories it triggers.
Use this before publishing or forwarding user-supplied text, or to explain why a generation was refused.
Args:
input (string, required): the text to check
model (string): moderation model ID, defaults to OPENAI_DEFAULT_MODERATION_MODEL
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "model": string, "flagged": boolean, // true when any category was triggered "flagged_categories": string[], // e.g. ["violence", "harassment/threatening"] "scores": { "": number } // confidence per category, 0.0-1.0 }
Examples:
Use when: "Is this user comment acceptable?" -> input=
Use when: auditing a batch of support messages before archiving them
Don't use when: you need a stylistic or factual review (use openai_generate_text)
Error Handling:
"Error: Not found" means the moderation model ID is wrong — call openai_list_models with filter="moderation"
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | The text to check | |
| model | No | Moderation model ID. Defaults to OPENAI_DEFAULT_MODERATION_MODEL. | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| model | Yes | |
| scores | Yes | |
| flagged | Yes | |
| flagged_categories | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: error handling for invalid model IDs, the returned JSON shape, and the meaning of the 'flagged' field. This goes beyond what annotations alone provide, though it doesn't discuss rate limits, latency, or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well organized with clear sections: purpose, usage guidance, arguments, return format, examples, and error handling. The most important information is front-loaded, and each section serves a distinct purpose without unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is fully self-contained for effective use. It covers the tool's purpose, when to use it, when not to use it, parameter defaults, return format, example use cases, and a common error scenario. With output schema, annotations, and full schema coverage, nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description mostly restates the same information, such as defaults for model and response_format. It adds minor practical context through examples but does not fundamentally expand parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Check text against OpenAI's moderation policy and report which categories it triggers.' It also distinguishes itself from siblings by explicitly saying not to use it for stylistic or factual review, which prevents confusion with openai_generate_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: before publishing or forwarding user-supplied text, and to explain why a generation was refused. It also gives concrete examples and names the alternative tool to use when moderation is not the need, making the decision boundary very clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_text_to_speechSynthesize speech with OpenAIA
Turn text into spoken audio and write the result to disk.
The audio is never returned inline — the tool reports the absolute path of the generated file.
Args:
input (string, required): the text to speak, up to 10,000 characters
voice (string): voice name, default "alloy"
model (string): speech model ID, defaults to OPENAI_DEFAULT_SPEECH_MODEL
instructions (string): delivery guidance such as "speak slowly and warmly"
format ('mp3'|'opus'|'aac'|'flac'|'wav'|'pcm'): default 'mp3'
speed (number): 0.25-4.0, default 1
output_path (string): absolute target file, defaults to a timestamped file in OPENAI_MCP_OUTPUT_DIR
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "model": string, "voice": string, "path": string, // absolute path of the written audio file "bytes": number, // file size "format": string // container that was written }
Examples:
Use when: "Read this paragraph aloud as an mp3" -> input=
Use when: you need a slower narration -> speed=0.85
Don't use when: you want a transcript of existing audio (use openai_transcribe_audio)
Error Handling:
"Error: Access to ... is not permitted" means output_path is outside OPENAI_MCP_ALLOWED_DIRS
"Error: OpenAI rejected the request as invalid" often means the voice name is unknown to that model
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | The text to speak | |
| model | No | Speech model ID. Defaults to OPENAI_DEFAULT_SPEECH_MODEL. | |
| speed | No | Playback speed multiplier | |
| voice | No | Voice name, e.g. "alloy", "ash", "coral", "sage", "verse", "marin", "cedar" | alloy |
| format | No | Audio container of the generated file | mp3 |
| output_path | No | Absolute file path to write the audio to. Defaults to a timestamped file in OPENAI_MCP_OUTPUT_DIR. | |
| instructions | No | Delivery guidance, e.g. "speak slowly and warmly" | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| bytes | Yes | |
| model | Yes | |
| voice | Yes | |
| format | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important non-obvious behavior beyond the annotations: the audio is never returned inline, the tool writes to disk and reports an absolute path, output_path restrictions produce a specific permission error, and invalid voice names cause a recognizable OpenAI rejection message. This adds meaningful context beyond readOnlyHint, destructiveHint, and openWorldHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but well organized with clear sections for behavior, arguments, returns, examples, and error handling. The most critical non-obvious fact—audio is never returned inline—is front-loaded. Minor redundancy with the schema keeps it from a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters, an output schema, and meaningful annotations, the description still covers everything an agent needs: all parameters and defaults, the return contract, example invocations, and common error conditions. Nothing critical is missing for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description adds value with the 10,000-character limit, output_path default behavior ('timestamped file in OPENAI_MCP_OUTPUT_DIR'), example instructions ('speak slowly and warmly'), and the returned JSON field meanings. Some redundancy exists with the schema, but the extra usage context is helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Turn text into spoken audio and write the result to disk.' It clearly differentiates from the transcription sibling by stating the direction of conversion, and the tool name/title align with the described behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit use-when examples such as 'Read this paragraph aloud as an mp3' and an explicit don't-use-when case: 'you want a transcript of existing audio (use openai_transcribe_audio).' This routes the agent to the correct sibling with little ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openai_transcribe_audioTranscribe audio with OpenAIAIdempotent
Transcribe a local audio file to text.
The file is read from disk (only from directories listed in OPENAI_MCP_ALLOWED_DIRS) and uploaded to OpenAI. Supported containers include mp3, mp4, m4a, wav, webm, flac and ogg; the API limit is 25 MB per file.
Args:
file_path (string, required): absolute path to the audio file
model (string): transcription model ID, defaults to OPENAI_DEFAULT_TRANSCRIPTION_MODEL
language (string): ISO-639-1 code such as "de" or "en"
prompt (string): vocabulary hint for names and jargon
response_format ('markdown'|'json'): default 'markdown'
Returns (JSON format): { "model": string, "text": string, // full transcript "language": string | null, // detected or supplied language "duration_seconds": number | null, // audio length when reported "source_file": string // canonical path that was read }
Examples:
Use when: "What was said in this voice memo?" -> file_path="/data/memo.m4a"
Use when: transcribing a German interview -> language="de"
Don't use when: the file is a video you only want summarised — extract the audio track first
Error Handling:
"Error: File not found" means the path does not exist
"Error: Payload too large" means the file exceeds 25 MB — split it before retrying
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Transcription model ID. Defaults to OPENAI_DEFAULT_TRANSCRIPTION_MODEL. | |
| prompt | No | Optional hint with names, jargon or spelling conventions that appear in the audio | |
| language | No | ISO-639-1 code of the spoken language, e.g. "de". Improves accuracy and latency when known. | |
| file_path | Yes | Absolute path to the audio file (mp3, mp4, m4a, wav, webm, flac, ogg). Must be inside an allowed directory. | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | Yes | |
| model | Yes | |
| language | Yes | |
| source_file | Yes | |
| duration_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behaviors not visible in annotations: the file is read from disk only from OPENAI_MCP_ALLOWED_DIRS, it is uploaded to OpenAI, the 25 MB API limit applies, and specific error messages map to likely causes. These are practical behavioral details that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: a one-sentence purpose, then constraints, Args, return shape, usage examples, and error handling. Despite covering many aspects, each section earns its place and nothing feels redundant or tangential.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given five parameters, file-size limits, allowed-directory constraints, output format, and error handling, the description covers all necessary context for correct invocation. It also includes the return schema and practical examples, so an agent has everything needed to select and call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters. The description largely restates this information in the Args section, with the only notable addition being the 'vocabulary hint' interpretation of prompt. Since the schema carries the semantic load, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Transcribe a local audio file to text.' It differentiates itself from siblings like openai_text_to_speech and openai_generate_text by clearly indicating this tool consumes audio and produces text, while specifying supported audio formats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit use-when examples: 'What was said in this voice memo?' → file_path, and a German interview → language='de'. It also provides an explicit exclusion: 'Don't use when: the file is a video you only want summarised — extract the audio track first.' This is model behavior for routing agents to the correct tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v1.0.0- First observed
openai_chat_completion - First observed
openai_create_embeddings - First observed
openai_edit_image - First observed
openai_generate_image - First observed
openai_generate_text - First observed
openai_list_models - First observed
openai_moderate_content - First observed
openai_text_to_speech - First observed
openai_transcribe_audio
TDQS
Scored across 9 tools
Each tool maps to a distinct OpenAI capability (text, chat history, images, audio, embeddings, moderation, model discovery). openai_generate_text and openai_chat_completion are the only potentially confusable pair, but their descriptions clearly separate single-prompt/chaining from explicit message histories.
All tools share an openai_ prefix and snake_case, with mostly verb_noun names like generate_text, edit_image, list_models. openai_chat_completion and openai_text_to_speech break the verb_noun pattern slightly because they mirror API endpoint names, but the convention remains predictable.
9 tools is appropriate for an OpenAI API surface: one tool per major modality (text, image, audio, embeddings, moderation) plus model discovery. No tool feels redundant or missing at the count level.
The set covers text generation, chat completions, image generation/editing, transcription, speech synthesis, embeddings, and moderation, which are the core OpenAI workflows. Minor gaps exist—notably no vision/analysis of image inputs and no fine-tuning/batch management—but agents can accomplish typical tasks without dead ends.
Maintenance
Related MCP Connectors
MCP server for OpenAI API (chat completions, image generation, embeddings) via AceDataCloud
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
Generate AI video, images and audio, and browse your history, from any MCP client.
Focused MCP server for OpenAI image/audio generation (v2.0.0). Wraps endpoints via HAPI CLI.
Related MCP Servers
- -licenseCqualityNot gradedmaintenanceEnables interaction with OpenAI-compatible APIs (like Ollama) through MCP tools. Provides access to chat completions, model listings, and embeddings generation from local or remote OpenAI-style endpoints.3-
- FlicenseBqualityDmaintenanceEnables interaction with OpenAI's Chat Completion and Assistants APIs, supporting assistant management, file operations, and direct queries to GPT models through standardized MCP tools.92-
- AlicenseBqualityDmaintenanceEnables MCP-compatible clients to leverage OpenAI's multimodal capabilities (vision, image generation, speech-to-text, text-to-speech) through file-oriented tools with a security-first architecture.101MIT
- FlicenseNot gradedqualityDmaintenanceA 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.-