Diarize

Live

API KEY

TRANSCRIPTION

Every audio recording, speaker-attributed transcript, and diarized segment your team processes lives in Diarize. Diarize MCP gives your agent authenticated access to transcription jobs scoped to the user who authorized it.

  • Acts as the user: Access and write actions stay tied to the Diarize account that authorized the agent.
  • Credentials stay vaulted: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: User permissions enforced. 90-day audit trail.
Diarize
agent · Acme Q3
Run
Transcribe this meeting and tell me who spoke the most.
S
diarize_transcribe
1.4s
Transcription agent
Transcript complete (41m 22s, 4 speakers). Sarah 38%, Marcus 29%, Jennifer 22%, Unknown 11%. 847 utterances, 94.2% confidence.
Sources: 1 audio file, 4 speakers, 41m 22s
diarizemcp
1 transcript
18:29
Message Claude...

Tools your transcription agent reaches for on Diarize, scoped per user.

CALL ANY TOOL
Submit audio for diarization, retrieve speaker-attributed transcripts, and query per-speaker segments.
diarize_transcribe
Transcribe audio
Submit an audio file or URL for transcription with speaker diarization.
Parameters
Name
Type
Required
Description
audio_url
string
Required
URL of audio file to transcribe
num_speakers
integer
Optional
Expected number of speakers (hint)
language
string
Optional
BCP-47 language code, e.g. en-US
webhook_url
string
Optional
Callback URL when transcription completes
diarize_transcript_get
Get transcript
diarize_transcripts_list
List transcripts
diarize_speakers_get
Get speaker segments
diarize_transcript_delete
Delete transcript
Build your Agent
Drop the toolkit in, point it at the user, and your transcription agent can use Diarize from the first run.
import { ScalekitClient } from "@scalekit-sdk/node";
import { DynamicStructuredTool } from "@langchain/core/tools";
import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { z } from "zod";

const sk = new ScalekitClient(envUrl, clientId, clientSecret);

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["diarize"], toolNames: ["diarize_transcribe", "diarize_transcript_get", "diarize_transcripts_list"] },
pageSize: 100,
});

const lcTools = tools.map((t) => new DynamicStructuredTool({
name: t.tool.definition.name,
description: t.tool.definition.description,
schema: z.object({}).passthrough(),
func: async (args) => {
const { data } = await sk.tools.executeTool({
toolName: t.tool.definition.name,
identifier: "user_123",
params: args,
});
return JSON.stringify(data);
},
}));

const agent = createReactAgent({ llm, tools: lcTools });
import { ScalekitClient } from "@scalekit-sdk/node";
import OpenAI from "openai";

const sk = new ScalekitClient(envUrl, clientId, clientSecret);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["diarize"], toolNames: ["diarize_transcribe", "diarize_transcript_get", "diarize_transcripts_list"] },
pageSize: 100,
});

const llmTools = tools.map((t) => ({
type: "function",
function: {
name: t.tool.definition.name,
description: t.tool.definition.description,
parameters: t.tool.definition.input_schema,
},
}));

const resp = await openai.responses.create({
model: "gpt-4o", input: prompt, tools: llmTools,
});
import { ScalekitClient } from "@scalekit-sdk/node";
import Anthropic from "@anthropic-ai/sdk";

const sk = new ScalekitClient(envUrl, clientId, clientSecret);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["diarize"], toolNames: ["diarize_transcribe", "diarize_transcript_get", "diarize_transcripts_list"] },
pageSize: 100,
});

const llmTools = tools.map((t) => ({
name: t.tool.definition.name,
description: t.tool.definition.description,
input_schema: t.tool.definition.input_schema,
}));

const msg = await anthropic.messages.create({
model: "claude-sonnet-4-6", max_tokens: 1024,
tools: llmTools,
messages: [{ role: "user", content: prompt }],
});
import { Agent } from "@google/adk/agents";
import {
MCPToolset, StreamableHTTPConnectionParams,
} from "@google/adk/tools/mcp";

const toolset = new MCPToolset({
connectionParams: new StreamableHTTPConnectionParams({
url: "https://mcp.scalekit.com/diarize",
headers: { Authorization: `Bearer ${userScopedToken}` },
}),
});

const agent = new Agent({
name: "agent", model: "gemini-2.0-flash",
tools: await toolset.getTools(),
});
Try these prompts
Paste any prompt into your agent to start using Diarize.
Transcribe & retrieve
Copy the prompt
Copied
Transcribe audio at [URL].
Copy the prompt
Copied
Get the transcript for [transcript_id].
Copy the prompt
Copied
List all completed transcripts.
Copy the prompt
Copied
Show transcripts created this week.
Speaker analysis
Copy the prompt
Copied
Who spoke the most in transcript [id]?
Copy the prompt
Copied
Get all segments for speaker [speaker_id].
Copy the prompt
Copied
What was the total talk time per speaker?
Copy the prompt
Copied
Find moments where [speaker] mentioned [topic].
Pipeline & cleanup
Copy the prompt
Copied
List transcripts still processing.
Copy the prompt
Copied
Delete transcript [id] and its audio.
Copy the prompt
Copied
Which transcripts failed in the last 24 hours?
Copy the prompt
Copied
Batch transcribe: [URL1], [URL2], [URL3].
SEE HOW AUTH WORKS
Users authorize Diarize once. Their credentials stay vaulted, every call is checked, and every action is logged.
1
Authorize
Your user connects
Diarize
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
Diarize
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
Diarize
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
Diarize
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
Same per-user auth pattern across other transcription agents and MCP connectors. Working code, live demos, fork what fits.
SALES
Sales call prep agent
Pull Granola notes and Attio contact history to draft a pre-call brief before every sales meeting. Zero rep input.
SALES
Deal intelligence agent
Combine Gong, Attio, and Slack signals to surface deal risks and next-best actions. Updated after every call.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
Other connector libraries treat auth as a demo afterthought. Scalekit starts with user identity, scope enforcement, and audit.
01.
Transcripts attributed to the wrong account
A shared Diarize API key looks fine in a demo. In production, every transcription job and speaker segment is attributed to a service account. User-level quota and data isolation break. Scalekit resolves the user's key so jobs run under the right identity.
// shared API key
key = "diarize_shared_xxx"
audit → bot_service_account
quota_filter → broken

// scalekit · per-user
key = resolve(user_id)
audit → user_abc
scope → enforced ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Diarize today. Others 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
Frequently Asked Questions
Does the agent access Diarize as the user or as a shared key?
As the user. Each workspace member authorizes once and Scalekit resolves their credential at request time. Audit logs attribute every action to that user, not a shared service account.
Where is the Diarize api key stored?
Can I limit what the agent is allowed to do in Diarize?
What happens when a user revokes Diarize access?
Are audio files stored on Diarize servers after transcription completes?
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"": {
""diarize"": {
""url"": ""https://mcp.scalekit.com/diarize"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.diarize]
url = ""https://mcp.scalekit.com/diarize""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""diarize"": {
""url"": ""https://mcp.scalekit.com/diarize"",
""type"": ""http""
}
}
}