OpenAI MCP server for AI agents

Live

BEARER TOKEN

LLM OPS

AI

OpenAI gives your agent the OpenAI platform: run batch jobs and evals, manage fine-tuning jobs, build and search vector stores, manage conversations and code interpreter containers, and read stored responses and chat completions.

  • Per-user credentials: each call uses the actual user's access token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
OpenAI
agent · Acme Q3
Run
How did last night's fine-tuning job go?
S
openai_fine_tuning_job_get
103ms
LLM ops agent
The job succeeded at 2:40am and produced a new fine-tuned model. No errors were reported.
Sources: 1 fine-tuning job
openai
1 job
18:29
Message Claude...

Tools your LLM ops agent reaches for on OpenAI, scoped per user.

CALL ANY TOOL
62 tools for LLM ops in OpenAI: create and track batch jobs, run evals, manage fine-tuning jobs, build and search vector stores, manage conversations and code interpreter containers, and read stored responses, completions, and files.
openai_batch_cancel
Cancel batch
Cancel an in-progress batch job. Returns the batch with status cancelling; it moves to cancelled within about 10 minutes, and any partial results stay in its output file. Use this to stop a batch that is no longer needed. Use openai_batch_get to watch it reach cancelled.
Parameters
Name
Type
Required
Description
batch_id
string
Required
ID of the batch to cancel. Get it from openai_batch_list. Example: batch_abc123.
openai_batch_create
Create batch
openai_batch_get
Get batch
openai_batch_list
List batch
openai_chat_completion_message_list
List chat completion message
openai_chat_completion_update
Update chat completion
openai_container_file_content_get
Get container file content
openai_container_file_create
Create container file
openai_container_get
Get container
openai_container_list
List container
openai_conversation_item_create
Create conversation item
openai_conversation_item_get
Get conversation item
openai_eval_list
List eval
openai_eval_run_create
Create eval run
openai_eval_run_get
Get eval run
openai_eval_run_output_item_list
List eval run output item
openai_eval_update
Update eval
openai_file_content_get
Get file content
openai_fine_tuning_job_cancel
Cancel fine tuning job
openai_fine_tuning_job_checkpoint_list
List fine tuning job checkpoint
openai_fine_tuning_job_get
Get fine tuning job
openai_fine_tuning_job_list
List fine tuning job
openai_fine_tuning_job_pause
Pause fine tuning job
openai_fine_tuning_job_resume
Resume fine tuning job
openai_response_get
Get response
openai_response_input_item_list
List response input item
openai_vector_store_create
Create vector store
openai_vector_store_file_content_get
Get vector store file content
openai_vector_store_file_list
List vector store file
openai_vector_store_search
Search vector store

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// OpenAI tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["openai"], toolNames: [
    "openai_vector_store_create",
    "openai_vector_store_file_create",
    "openai_vector_store_search"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Build a Help Center vector store from these files and search it for our refund policy" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["openai"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Build a Help Center vector store from these files and search it for our refund policy" }],
  tools,
});

// Execute the tool call with the user's vaulted OpenAI access token
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["openai"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Build a Help Center vector store from these files and search it for our refund policy" }],
  tools,
});

// Tool call runs with the user's vaulted OpenAI access token
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["openai"] }, pageSize: 100,
});

const agent = new Agent({
  name: "llm_ops_agent",
  model: "gemini-2.5-pro",
  instruction: "OpenAI tools scoped to this user",
  tools,
});

await agent.run("Build a Help Center vector store from these files and search it for our refund policy");
Try these prompts
Copy any prompt into your agent. Each maps directly to a OpenAI tool. Click to copy, paste into your agent, done.
Batches and fine-tuning
Copy the prompt
Copied
Start a batch job from the uploaded requests file on the chat completions endpoint.
Copy the prompt
Copied
Show the status and request counts of yesterday's batch.
Copy the prompt
Copied
Pause the fine-tuning job that is running now.
Evals
Copy the prompt
Copied
List our evals and their testing criteria.
Copy the prompt
Copied
Start a new run of the support answers eval.
Copy the prompt
Copied
Show the failing items from the last eval run.
Vector stores and history
Copy the prompt
Copied
Create a vector store called Help Center from these uploaded files.
Copy the prompt
Copied
Search the Help Center vector store for our refund policy.
Copy the prompt
Copied
List the stored chat completions from last week.
SEE HOW AUTH WORKS
Each user connects their own OpenAI access token once, and Scalekit sends it with every call. Access tokens stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
OpenAI
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
OpenAI
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
OpenAI
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
OpenAI
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other AI and LLM connectors.
Engineering Teams
DevOps assistant agent
Polls GitHub for failing checks and stale PRs, opens Linear issues for the ones that need work, and posts a daily digest to Slack. It acts as the engineer, not a shared service account.
Engineering Teams
Engineering standup agent
Pulls commits from GitHub and GitLab, tracks issue movement in Jira, and posts a per-engineer standup brief to Slack. Each engineer's activity is read on their own delegated OAuth.
Test other agents
See the same per-user auth pattern across other AI and LLM connectors.
ENGINEERING
DevOps assistant agent
Poll GitHub for failing checks and stale pull requests, open Linear issues for the ones that need work, and digest to Slack.
ENGINEERING
Engineering standup agent
Pull commits from GitHub and GitLab, track Jira issue movement, and post a per-engineer standup brief to Slack.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared OpenAI access token looks fine in a demo. In production every batch job and fine-tune looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared key
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
OpenAI today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access OpenAI as the user or through a shared access token?
As the user. Each user connects their own OpenAI access token once, and Scalekit sends it with every call. Audit logs attribute every batch job, eval, and fine-tune to that user, not a shared service account.
Where is the OpenAI access token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. To rotate it, the user reconnects with a new access token. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in OpenAI?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example the get and list tools for batches, evals, and vector stores without openai_batch_create or openai_fine_tuning_job_create, which start new jobs. No OpenAI tool deletes data. Scalekit also enforces scope checks before every API call.
What happens when a user revokes OpenAI access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
What can the agent read from past OpenAI calls?
Stored responses with openai_response_get and their input items, Chat Completions stored with store set to true through openai_chat_completion_list, and conversation items. openai_response_input_token_count counts the input tokens a Responses request would use without generating one.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""openai"": {
""url"": ""https://mcp.scalekit.com/openai"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.openai]
url = ""https://mcp.scalekit.com/openai""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""openai"": {
""url"": ""https://mcp.scalekit.com/openai"",
""type"": ""http""
}
}
}