OBS MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| OBS_HOST | No | The hostname of the OBS WebSocket server | localhost |
| OBS_PORT | No | The port of the OBS WebSocket server | 4455 |
| OBS_PASSWORD | No | The password for the OBS WebSocket server (if set) |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_scene_collection_listA | List all scene collections and the currently active one. |
| set_current_scene_collectionA | Switch to a scene collection by name. Blocks until the switch completes. |
| create_scene_collectionA | Create a new scene collection and switch to it. |
| get_profile_listA | List all profiles and the currently active one. |
| set_current_profileB | Switch to a profile by name. |
| create_profileA | Create a new profile and switch to it. |
| remove_profileA | Remove a profile. If it's the active one, OBS switches away first. |
| get_profile_parameterA | Read a raw parameter from the current profile's .ini configuration. Args: category: Config category, e.g. "Output". name: Parameter name within that category. |
| set_profile_parameterA | Write a raw parameter into the current profile's .ini configuration. Advanced/low-level — prefer a dedicated request when one exists. Args: category: Config category, e.g. "Output". name: Parameter name within that category. value: New value, or None to delete the parameter. |
| get_video_settingsA | Current canvas/output resolution and FPS (as a fraction — divide fpsNumerator by fpsDenominator for the true FPS). |
| set_video_settingsA | Change canvas/output resolution and/or FPS. Width/height fields must be set in pairs (can't change baseWidth without baseHeight, etc). Range 1-4096 for all resolution fields. |
| get_stream_service_settingsB | Current stream destination service type and settings (server/key etc). |
| set_stream_service_settingsA | Set the stream destination. For a plain custom RTMP target, use service_type="rtmp_custom" and settings={"server": "...", "key": "..."}. Args: service_type: e.g. "rtmp_custom" or "rtmp_common". settings: Service-specific settings object. |
| get_record_directoryA | Current output directory for recordings. |
| set_record_directoryA | Set the output directory recordings are written to. Args: path: Absolute directory path. |
| get_source_filter_kind_listA | List every filter kind this OBS install supports (noise_suppress_filter, noise_gate_filter, compressor_filter, color_filter, chroma_key_filter, etc). |
| get_source_filter_listA | List all filters on a source (input or scene), in chain order. Args: source_name: Name of the source. |
| get_source_filter_default_settingsD | Default settings object for a filter kind. |
| create_source_filterA | Add a new filter to a source. Args: source_name: Name of the source to add the filter to. filter_name: Name for the new filter. filter_kind: Filter kind (see get_source_filter_kind_list). filter_settings: Optional initial settings. |
| remove_source_filterB | Remove a filter from a source. |
| set_source_filter_nameC | Rename a filter. |
| get_source_filterB | Get a filter's enabled state, chain index, kind, and settings. |
| set_source_filter_indexA | Reorder a filter within a source's filter chain. Args: source_name: Name of the source. filter_name: Name of the filter to move. filter_index: New position, >= 0 (0 = first in chain). |
| set_source_filter_settingsA | Configure a filter's parameters. Args: source_name: Name of the source. filter_name: Name of the filter. filter_settings: Settings object. overlay: True = merge on top of current settings, False = reset to defaults first. |
| set_source_filter_enabledB | Enable or disable a filter without removing it. |
| get_versionA | OBS/obs-websocket version info, platform, and the full list of requests available on this connection (availableRequests). |
| get_statsA | Live perf stats: CPU/memory usage, active FPS, render/output skipped frames, disk space. Use to check for dropped-frame problems mid-stream. |
| broadcast_custom_eventA | Broadcast a CustomEvent to all subscribed obs-websocket clients. Args: event_data: Arbitrary JSON payload delivered to receivers. |
| call_vendor_requestC | Call a request registered by a third-party OBS plugin/script vendor. Args: vendor_name: Unique vendor name registered by the plugin. request_type: The vendor's request type to call. request_data: Optional payload for the vendor request. |
| get_hotkey_listA | List all hotkey names in OBS. Best-effort — hotkey requests are less reliable than dedicated requests when one exists for the same action. |
| trigger_hotkey_by_nameA | Trigger a hotkey by its name (see get_hotkey_list). Args: hotkey_name: Name of the hotkey to trigger. context_name: Optional hotkey context name. |
| trigger_hotkey_by_key_sequenceC | Trigger a hotkey by simulating a key press + modifiers. Args: key_id: OBS key ID (see obs-studio's obs-hotkeys.h for the list). shift/control/alt/command: Modifier keys to hold. |
| get_persistent_dataC | Get a value from an OBS persistent-data "slot". Args: realm: "OBS_WEBSOCKET_DATA_REALM_GLOBAL" or "OBS_WEBSOCKET_DATA_REALM_PROFILE". slot_name: Name of the slot to read. |
| set_persistent_dataA | Set a value in an OBS persistent-data "slot" — useful for storing state the AI needs to remember across tool calls (e.g. giveaway winners). Args: realm: "OBS_WEBSOCKET_DATA_REALM_GLOBAL" or "OBS_WEBSOCKET_DATA_REALM_PROFILE". slot_name: Name of the slot to write. slot_value: Any JSON-serializable value. |
| get_input_listA | List all inputs (sources like mic, capture card, browser source, etc). Args: input_kind: Optional — restrict to one kind (see get_input_kind_list). |
| get_input_kind_listA | List every input kind (source type) this OBS install can create. |
| get_special_inputsA | Names of the built-in special audio inputs: Desktop Audio 1/2, Mic/Aux 1-4. Use these names to control the default audio channels. |
| create_inputA | Create a new input and add it as a scene item to a scene. Args: input_name: Name for the new input. input_kind: Kind of input to create (see get_input_kind_list). scene_name: Scene to add it to. input_settings: Optional initial settings object. scene_item_enabled: Whether the new scene item starts visible. |
| remove_inputA | Delete an input. Removes all its scene items too. Args: input_name: Name of the input to remove. |
| set_input_nameB | Rename an input. Args: input_name: Current name. new_input_name: New name. |
| get_input_default_settingsA | Default settings object for an input kind — overlay get_input_settings on top of this to reconstruct the full effective settings. |
| get_input_settingsB | Current (non-default) settings of an input, plus its kind. Args: input_name: Name of the input. |
| set_input_settingsA | Set an input's settings. Args: input_name: Name of the input. input_settings: Settings object to apply. overlay: True = merge on top of current settings, False = reset to defaults first then apply. |
| get_input_muteB | Get an input's mute state. |
| set_input_muteC | Mute or unmute an input. |
| toggle_input_muteC | Toggle an input's mute state. |
| get_input_volumeA | Get an input's volume as both a linear multiplier and dB. |
| set_input_volumeA | Set an input's volume — pass exactly one of volume_db or volume_mul. Args: input_name: Name of the input. volume_db: Volume in dB, range -100..26. volume_mul: Volume as a linear multiplier, range 0..20. |
| get_input_audio_balanceA | Get an input's stereo balance (0.0 full left .. 1.0 full right, 0.5 center). |
| set_input_audio_balanceA | Set an input's stereo balance. Args: input_name: Name of the input. balance: 0.0 (full left) to 1.0 (full right), 0.5 = center. |
| get_input_audio_sync_offsetA | Get an input's audio sync offset in milliseconds (can be negative). |
| set_input_audio_sync_offsetA | Set an input's audio sync offset — use to fix audio/video drift. Args: input_name: Name of the input. offset_ms: Offset in milliseconds, range -950..20000. |
| get_input_audio_monitor_typeA | Get an input's monitoring mode (none / monitor-only / monitor-and-output). |
| set_input_audio_monitor_typeA | Set an input's monitoring mode. Args: input_name: Name of the input. monitor_type: One of OBS_MONITORING_TYPE_NONE, OBS_MONITORING_TYPE_MONITOR_ONLY, OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT. |
| get_input_audio_tracksB | Get which of the 6 audio mixer tracks this input is routed to. |
| set_input_audio_tracksA | Set which audio mixer tracks an input is routed to. Args: input_name: Name of the input. audio_tracks: Object like {"1": true, "2": false, ...} for tracks 1-6. |
| get_input_deinterlace_modeA | Get an input's deinterlace mode. Async inputs only (capture cards, etc). |
| set_input_deinterlace_modeA | Set an input's deinterlace mode. Args: input_name: Name of the input. mode: One of OBS_DEINTERLACE_MODE_DISABLE, _DISCARD, _RETRO, _BLEND, _BLEND_2X, _LINEAR, _LINEAR_2X, _YADIF, _YADIF_2X. |
| get_input_deinterlace_field_orderA | Get an input's deinterlace field order. Async inputs only. |
| set_input_deinterlace_field_orderA | Set an input's deinterlace field order. Args: input_name: Name of the input. field_order: OBS_DEINTERLACE_FIELD_ORDER_TOP or _BOTTOM. |
| get_input_properties_list_property_itemsA | Get the items of a dynamic list property on an input — e.g. the available displays for a display-capture source. Args: input_name: Name of the input. property_name: Name of the list property. |
| press_input_properties_buttonA | Press a button in an input's properties — e.g. "refreshnocache" to reload a browser source. Args: input_name: Name of the input. property_name: Name of the button property to press. |
| get_media_input_statusB | Playback state (playing/paused/stopped/buffering/ended/error), duration, and cursor position of a media source. |
| set_media_input_cursorA | Seek a media source to an absolute position. No bounds checking. Args: input_name: Name of the media input. cursor_ms: Position in milliseconds. |
| offset_media_input_cursorA | Seek a media source relative to its current position. No bounds checking. Args: input_name: Name of the media input. offset_ms: Milliseconds to offset by (negative = seek backward). |
| trigger_media_input_actionA | Trigger a transport action on a media source. Args: input_name: Name of the media input. action: One of OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PLAY, _PAUSE, _STOP, _RESTART, _NEXT, _PREVIOUS. |
| get_virtual_cam_statusB | Whether the virtual camera output is active. |
| toggle_virtual_camB | Toggle the virtual camera on/off. |
| start_virtual_camB | Start the virtual camera. |
| stop_virtual_camA | Stop the virtual camera. |
| get_replay_buffer_statusB | Whether the replay buffer is active. |
| toggle_replay_bufferA | Toggle the replay buffer on/off. |
| start_replay_bufferB | Start the replay buffer. |
| stop_replay_bufferA | Stop the replay buffer. |
| save_replay_bufferA | Save the last N seconds from the replay buffer to disk — the "instant replay" clip-save action. |
| get_last_replay_buffer_replayB | File path of the last replay buffer save. |
| get_output_listA | List every registered OBS output (stream, record, virtualcam, replay buffer, and any plugin-added outputs). |
| get_output_statusA | Detailed status of a named output: active/reconnecting, timecode, duration, congestion, bytes sent, frame counts. |
| toggle_outputB | Toggle a named output on/off. |
| start_outputC | Start a named output. |
| stop_outputB | Stop a named output. |
| get_output_settingsC | Get a named output's settings object. |
| set_output_settingsB | Set a named output's settings object. |
| clean_audio_inputA | Set up a standard mic-cleanup filter chain in one call: Noise Gate -> Noise Suppression -> Compressor, in that order (order matters — gate first cuts room noise between words, suppression reduces steady background hiss while you're talking, compressor evens out what's left). Skips any filter kind that already exists on the input by that name instead of duplicating it. Removing a stage later is a normal remove_source_filter call — this only handles the one-shot setup. Args: input_name: Name of the mic/audio input to clean up. gate/suppression/compressor: Which stages to add (all on by default). gate_open_threshold_db: Gate opens above this level. Should sit slightly below your voice level. Default -26 dB. gate_close_threshold_db: Gate closes below this level. Should sit above the room's noise floor, 5-8 dB below open threshold. Default -32 dB. suppression_method: "rnnoise" (better quality, default) or "speex" (lighter weight, older). compressor_ratio: Compression ratio, 1.0-32.0. Default 3.0 (gentle). compressor_threshold_db: Level compression kicks in at, -60..0 dB. Default -18 dB. |
| diagnose_av_healthA | Diagnose why a stream/recording might be dropping frames or stuttering — pulls GetStats + GetStreamStatus + GetRecordStatus in one call and interprets the ratios instead of leaving the AI to fetch three things and do the arithmetic itself. The three numbers that actually matter, and what each one means:
These thresholds are heuristics, not authoritative OBS cutoffs — a few skipped frames right after starting a stream is normal; this flags sustained skip ratios worth investigating, not noise. |
| get_scene_item_listA | List every scene item (placed source) in a scene. |
| get_group_scene_item_listA | Like get_scene_item_list, but for a group (OBS groups are broken under the hood — prefer nested scenes over groups where possible). |
| get_scene_item_idA | Find a scene item's numeric ID by the source name it references. Args: scene_name: Scene or group to search. source_name: Name of the source to find. search_offset: Matches to skip. -1 = last (topmost) match. |
| get_scene_item_sourceB | Get the source name/UUID a scene item references. |
| create_scene_itemA | Add an existing source to a scene as a new scene item. Args: scene_name: Scene to add the item to. source_name: Existing source (input) to place. scene_item_enabled: Whether it starts visible. |
| remove_scene_itemA | Remove a scene item from a scene (does not delete the underlying source). |
| duplicate_scene_itemA | Duplicate a scene item, copying its transform/crop, optionally into a different scene. Args: scene_name: Scene the item is currently in. scene_item_id: Numeric ID of the item to duplicate. destination_scene_name: Target scene; defaults to the source scene. |
| get_scene_item_transformC | Get a scene item's position, scale, rotation, and crop. |
| set_scene_item_transformA | Set a scene item's position/scale/rotation/crop. Args: scene_name: Scene the item is in. scene_item_id: Numeric ID of the item. transform: Object with any of positionX/positionY, rotation, scaleX/scaleY, alignment, boundsType/boundsAlignment/ boundsWidth/boundsHeight, cropLeft/Right/Top/Bottom. |
| get_scene_item_enabledA | Get whether a scene item is currently visible (shown/hidden, not mute). |
| set_scene_item_enabledA | Show or hide a scene item. Args: scene_name: Scene the item is in. scene_item_id: Numeric ID of the item. enabled: True = visible, False = hidden. |
| get_scene_item_lockedA | Get a scene item's lock state (locked items can't be moved/resized in the UI). |
| set_scene_item_lockedB | Lock or unlock a scene item. |
| get_scene_item_indexA | Get a scene item's stacking position (0 = bottom of the source list). |
| set_scene_item_indexA | Reorder a scene item's stacking position (z-order). Args: scene_name: Scene the item is in. scene_item_id: Numeric ID of the item. index: New position, >= 0 (0 = bottom of the source list). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/xDarkzx/OBS_MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server