OBS MCP Server
by royshil
Verified
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { OBSWebSocketClient } from "../client.js";
import { z } from "zod";
export async function initialize(server: McpServer, client: OBSWebSocketClient): Promise<void> {
// GetSceneList tool
server.tool(
"obs-get-scene-list",
"Get a list of scenes in OBS",
{},
async () => {
try {
const sceneList = await client.sendRequest("GetSceneList");
return {
content: [
{
type: "text",
text: JSON.stringify(sceneList, null, 2)
}
]
};
} catch (error) {
return {
content: [
{
type: "text",
text: `Error getting scene list: ${error instanceof Error ? error.message : String(error)}`
}
],
isError: true
};
}
}
);
// GetCurrentProgramScene tool
server.tool(
"obs-get-current-scene",
"Get the current active scene in OBS",
{},
async () => {
try {
const currentScene = await client.sendRequest("GetCurrentProgramScene");
return {
content: [
{
type: "text",
text: `Current scene: ${currentScene.currentProgramSceneName}`
}
]
};
} catch (error) {
return {
content: [
{
type: "text",
text: `Error getting current scene: ${error instanceof Error ? error.message : String(error)}`
}
],
isError: true
};
}
}
);
// SetCurrentProgramScene tool
server.tool(
"obs-set-current-scene",
"Set the current active scene in OBS",
{
sceneName: z.string().describe("The name of the scene to set as current")
},
async ({ sceneName }) => {
try {
await client.sendRequest("SetCurrentProgramScene", { sceneName });
return {
content: [
{
type: "text",
text: `Successfully switched to scene: ${sceneName}`
}
]
};
} catch (error) {
return {
content: [
{
type: "text",
text: `Error setting current scene: ${error instanceof Error ? error.message : String(error)}`
}
],
isError: true
};
}
}
);
// GetCurrentPreviewScene tool (Studio Mode)
server.tool(
"obs-get-preview-scene",
"Get the current preview scene in OBS Studio Mode",
{},
async () => {
try {
const previewScene = await client.sendRequest("GetCurrentPreviewScene");
return {
content: [
{
type: "text",
text: `Preview scene: ${previewScene.currentPreviewSceneName}`
}
]
};
} catch (error) {
return {
content: [
{
type: "text",
text: `Error getting preview scene: ${error instanceof Error ? error.message : String(error)}`
}
],
isError: true
};
}
}
);
// SetCurrentPreviewScene tool (Studio Mode)
server.tool(
"obs-set-preview-scene",
"Set the current preview scene in OBS Studio Mode",
{
sceneName: z.string().describe("The name of the scene to set as preview")
},
async ({ sceneName }) => {
try {
await client.sendRequest("SetCurrentPreviewScene", { sceneName });
return {
content: [
{
type: "text",
text: `Successfully set preview scene to: ${sceneName}`
}
]
};
} catch (error) {
return {
content: [
{
type: "text",
text: `Error setting preview scene: ${error instanceof Error ? error.message : String(error)}`
}
],
isError: true
};
}
}
);
// CreateScene tool
server.tool(
"obs-create-scene",
"Create a new scene in OBS",
{
sceneName: z.string().describe("The name for the new scene")
},
async ({ sceneName }) => {
try {
await client.sendRequest("CreateScene", { sceneName });
return {
content: [
{
type: "text",
text: `Successfully created scene: ${sceneName}`
}
]
};
} catch (error) {
return {
content: [
{
type: "text",
text: `Error creating scene: ${error instanceof Error ? error.message : String(error)}`
}
],
isError: true
};
}
}
);
// RemoveScene tool
server.tool(
"obs-remove-scene",
"Remove a scene from OBS",
{
sceneName: z.string().describe("The name of the scene to remove")
},
async ({ sceneName }) => {
try {
await client.sendRequest("RemoveScene", { sceneName });
return {
content: [
{
type: "text",
text: `Successfully removed scene: ${sceneName}`
}
]
};
} catch (error) {
return {
content: [
{
type: "text",
text: `Error removing scene: ${error instanceof Error ? error.message : String(error)}`
}
],
isError: true
};
}
}
);
// TriggerStudioModeTransition tool
server.tool(
"obs-trigger-studio-transition",
"Trigger a transition from preview to program scene in Studio Mode",
{},
async () => {
try {
await client.sendRequest("TriggerStudioModeTransition");
return {
content: [
{
type: "text",
text: "Successfully triggered studio mode transition"
}
]
};
} catch (error) {
return {
content: [
{
type: "text",
text: `Error triggering studio transition: ${error instanceof Error ? error.message : String(error)}`
}
],
isError: true
};
}
}
);
}