Skip to main content
Glama
propresenter-mcp

propresenter-mcp

by alxpark

propresenter-mcp

A comprehensive Model Context Protocol (MCP) server that provides complete control over ProPresenter presentations via the ProPresenter API. This server implements the full ProPresenter API specification with 231 endpoints organized into 27 API groups and exposed through modular client classes.

Official MCP Registry

Related MCP server: MADRIX MCP

Prerequisites

  • Node.js 18 or higher

  • ProPresenter 7 with API enabled

  • ProPresenter running and accessible on your network

Installation

  1. Clone this repository or download the source code

  2. Install dependencies:

npm install
  1. Build the project:

npm run build

Configuration

The server connects to ProPresenter using environment variables:

  • PROPRESENTER_URL - The URL of your ProPresenter instance (default: http://localhost:50000)

  • PROPRESENTER_PASSWORD - The API password (if configured in ProPresenter)

ProPresenter Setup

  1. Open ProPresenter preferences

  2. Go to the Network tab

  3. Enable "Network" and note the port number (default: 50000)

  4. Optionally set a password for API access

Usage

With Claude Desktop

Add this to your Claude Desktop configuration file:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "propresenter": {
      "command": "node",
      "args": ["/absolute/path/to/propresenter-mcp/build/index.js"],
      "env": {
        "PROPRESENTER_URL": "http://localhost:50000",
        "PROPRESENTER_PASSWORD": "your-password-if-needed"
      }
    }
  }
}

Replace /absolute/path/to/propresenter-mcp with the actual path to this project.

With VS Code

This server can be debugged directly in VS Code using the included MCP configuration.

  1. Open this project in VS Code

  2. The server is automatically configured for debugging via .vscode/mcp.json

  3. Use the MCP extension to test and debug the server

Example Commands

Once connected, you can ask Claude to control ProPresenter:

Status & Information:

  • "What version of ProPresenter is running?"

  • "Show me the status of all screens"

  • "What's the status of audience screens?"

  • "Get the current slide information"

Presentations:

  • "What presentation is currently active?"

  • "Trigger the presentation with UUID [uuid]"

  • "Go to the next slide"

  • "Go to slide number 5"

  • "Play the presentation timeline"

  • "Show me the chord chart"

  • "Get a thumbnail of slide 3"

Announcements:

  • "What announcement is currently active?"

  • "Trigger the next announcement cue"

  • "Show me the announcement timeline status"

  • "Go to announcement cue 2"

Audio & Media:

  • "List all audio playlists"

  • "Show me the contents of audio playlist [id]"

  • "Play the next song in the active playlist"

  • "Trigger the focused audio playlist"

  • "List all media playlists"

  • "Trigger media item [id] in playlist [playlist_id]"

Playlists:

  • "List all presentation playlists"

  • "Show me the active playlist"

  • "Focus the next playlist"

  • "Trigger the first item in the focused playlist"

  • "Create a new playlist called 'Sunday Service'"

Capture:

  • "What's the current capture status?"

  • "Start recording"

  • "Stop the capture"

  • "Show me available capture encodings for RTMP"

Clear:

  • "Clear the announcements layer"

  • "Show me all clear groups"

  • "Trigger the clear group [id]"

  • "Create a new clear group"

Library:

  • "List all my libraries"

  • "Show presentations in library [id]"

  • "Trigger presentation [id] from library [library_id]"

Looks:

  • "Show me all configured looks"

  • "What look is currently live?"

  • "Switch to look [id]"

  • "Create a new look"

Macros:

  • "List all macros"

  • "Trigger macro [id]"

  • "Show me all macro collections"

  • "Create a new macro"

Props:

  • "List all props"

  • "Trigger prop [id]"

  • "Clear prop [id]"

  • "Pause auto-clear for prop [id]"

  • "List all prop collections"

Stage:

  • "Show me the current stage message"

  • "Display stage message [message]"

  • "Hide the stage message"

  • "List all stage layouts"

  • "Set stage layout [layout_id] for screen [screen_id]"

Messages:

  • "Show me all messages"

  • "Display message [id]"

  • "Hide message [id]"

  • "Create a new message"

Timers:

  • "List all timers"

  • "Start timer [id]"

  • "Stop timer [id]"

  • "Reset the sermon timer"

  • "Create a countdown timer"

  • "Get the current system time"

Themes:

  • "List all themes"

  • "Show me details of theme [id]"

  • "Get theme slide [slide_id] from theme [theme_id]"

Transport:

  • "Play the presentation layer"

  • "Pause the audio layer"

  • "Skip forward 30 seconds on the announcement layer"

  • "Go to the end of the presentation"

  • "Get the current playback time"

Masks:

  • "List all masks"

  • "Show me details of mask [id]"

Triggers:

  • "Trigger the next cue"

  • "Trigger the previous media item"

Development

Build

npm run build

Watch Mode

npm run watch

API Reference

This server implements the complete ProPresenter API documented at https://openapi.propresenter.com/

API Coverage

  • Total Endpoints: 231 REST API endpoints

  • API Groups: 27 functional groups

  • Client Modules: 18 TypeScript client classes

  • Tool Definitions: 18 MCP tool modules

  • Handler Modules: 18 request handler modules

  • HTTP Methods: Full support for GET, POST, PUT, DELETE operations

  • Architecture: Complete three-layer implementation (clients → tools → handlers)

See api/api.md for complete API documentation with all 231 endpoints organized by group.

Troubleshooting

Connection Issues:

  • Verify ProPresenter is running and the API is enabled

  • Check that the URL and port are correct

  • Ensure no firewall is blocking the connection

  • Verify the password if authentication is enabled

Server Not Starting:

  • Make sure you've built the project with npm run build

  • Check that Node.js 18+ is installed

  • Verify all dependencies are installed with npm install

Available Tools

177 tools
announcement_focus_activeA

Focus the currently active announcement presentation

Inputs: no named parameters.

announcement_get_activeA

Get the currently active announcement presentation

Inputs: no named parameters.

announcement_get_slide_indexA

Get the index of the current slide within the active announcement

Inputs: no named parameters.

announcement_get_timeline_statusB

Get the current timeline status of the active announcement

Inputs: no named parameters.

announcement_timeline_operationB

Perform timeline operation (play, pause, rewind) on active announcement

Inputs: operation (required).

announcement_trigger_activeA

Retrigger the currently active announcement (starts from beginning)

Inputs: no named parameters.

announcement_trigger_cueA

Trigger a specific cue by index in the active announcement

Inputs: index (required).

announcement_trigger_nextA

Trigger the next cue in the active announcement

Inputs: no named parameters.

announcement_trigger_previousA

Trigger the previous cue in the active announcement

Inputs: no named parameters.

audio_focus_active_playlistB

Focus the active audio playlist

Inputs: no named parameters.

audio_focus_next_playlistC

Focus the next audio playlist

Inputs: no named parameters.

audio_focus_playlistC

Focus a specific audio playlist

Inputs: playlistId (required).

audio_focus_previous_playlistB

Focus the previous audio playlist

Inputs: no named parameters.

audio_get_active_playlistA

Get the currently active audio playlist

Inputs: no named parameters.

audio_get_focused_playlistB

Get the currently focused audio playlist

Inputs: no named parameters.

audio_get_playlistB

Get all items in a specific audio playlist

Inputs: playlistId (required), start.

audio_get_playlistsB

Get a list of all configured audio playlists

Inputs: no named parameters.

audio_get_playlist_updatesA

Subscribe to updates for a specific audio playlist (chunked response)

Inputs: playlistId (required).

audio_trigger_active_nextB

Trigger the next item in the active playlist

Inputs: no named parameters.

audio_trigger_active_playlistA

Trigger the active audio playlist (restart from beginning)

Inputs: no named parameters.

audio_trigger_active_previousB

Trigger the previous item in the active playlist

Inputs: no named parameters.

audio_trigger_focused_nextA

Trigger the next item in the focused playlist

Inputs: no named parameters.

audio_trigger_focused_playlistC

Trigger the focused audio playlist

Inputs: no named parameters.

audio_trigger_focused_previousB

Trigger the previous item in the focused playlist

Inputs: no named parameters.

audio_trigger_playlistC

Trigger a specific audio playlist

Inputs: playlistId (required).

audio_trigger_playlist_itemC

Trigger a specific item in a specific playlist

Inputs: playlistId (required), itemId (required).

capture_get_encodingsB

Get available capture encodings for a specific type

Inputs: type (required).

capture_get_settingsB

Get the current capture settings

Inputs: no named parameters.

capture_get_statusB

Get the current capture status and capture time

Inputs: no named parameters.

capture_operationB

Perform a capture operation (start or stop)

Inputs: operation (required).

clear_get_groupB

Get details of a specific clear group

Inputs: id (required).

clear_get_groupsA

Get a list of all configured clear groups

Inputs: no named parameters.

clear_layerC

Clear a specific layer (audio, props, messages, announcements, slide, media, video_input)

Inputs: layer (required).

clear_trigger_groupC

Trigger a specific clear group

Inputs: id (required).

find_my_mouseA

Trigger the find my mouse feature to highlight the cursor on all screens

Inputs: no named parameters.

focus_active_presentationB

Focus the currently active presentation

Inputs: no named parameters.

focused_timeline_operationB

Perform timeline operation (play, pause, rewind) on focused presentation

Inputs: operation (required).

focus_next_presentationC

Focus the next presentation

Inputs: no named parameters.

focus_presentationA

Focus a presentation without triggering it

Inputs: presentationUuid (required).

focus_previous_presentationB

Focus the previous presentation

Inputs: no named parameters.

get_active_presentationC

Get the currently active presentation

Inputs: no named parameters.

get_active_slide_indexA

Get the index of the current slide within the active presentation

Inputs: no named parameters.

get_chord_chartB

Get the current chord chart information

Inputs: no named parameters.

get_chord_chart_updatesD

Get chord chart updates

Inputs: no named parameters.

get_focused_presentationB

Get the currently focused presentation

Inputs: no named parameters.

get_focused_timeline_statusB

Get the current timeline status of the focused presentation

Inputs: no named parameters.

get_presentationA

Get details of a specific presentation by UUID

Inputs: presentationUuid (required).

get_presentation_thumbnailB

Get a thumbnail for a specific slide in a presentation

Inputs: presentationUuid (required), index (required), quality.

get_propresenter_versionA

Get the ProPresenter version and build information

Inputs: no named parameters.

get_timeline_statusA

Get the current timeline status of the active presentation

Inputs: no named parameters.

global_groups_get_allA

Get all global groups configured in ProPresenter

Inputs: no named parameters.

library_getB

Get all items in a specific library

Inputs: libraryId (required).

library_get_librariesA

Get a list of all configured libraries

Inputs: no named parameters.

library_trigger_presentationB

Trigger the first cue of a presentation in a library

Inputs: libraryId (required), presentationId (required).

library_trigger_presentation_cueC

Trigger a specific cue of a presentation in a library

Inputs: libraryId (required), presentationId (required), index (required).

looks_getB

Get details of a specific audience look

Inputs: id (required).

looks_get_allA

Get a list of all configured audience looks (except the live look)

Inputs: no named parameters.

looks_get_currentA

Get the details of the currently live audience look

Inputs: no named parameters.

looks_triggerB

Trigger a specific audience look to make it live/current

Inputs: id (required).

macros_getA

Get details of a specific macro

Inputs: id (required).

macros_get_allB

Get a list of all configured macros

Inputs: no named parameters.

macros_triggerC

Trigger a specific macro

Inputs: id (required).

masks_getB

Get details of a specific mask

Inputs: id (required).

masks_get_allA

Get all masks in the library

Inputs: no named parameters.

masks_get_thumbnailB

Get thumbnail for a specific mask

Inputs: id (required).

messages_clearB

Clear (hide) a specific message

Inputs: messageId (required).

messages_createB

Create a new message

Inputs: message (required).

messages_deleteB

Delete a specific message

Inputs: messageId (required).

messages_getB

Get details of a specific message

Inputs: messageId (required).

messages_get_allB

Get a list of all messages

Inputs: no named parameters.

messages_triggerB

Trigger (show) a specific message with optional token values

Inputs: messageId (required), tokens.

messages_updateC

Update an existing message

Inputs: messageId (required), message (required).

playlists_createC

Create a new playlist

Inputs: name (required), type (required).

playlists_create_underB

Create a new playlist under an existing playlist

Inputs: playlistId (required), name (required), type (required).

playlists_focusA

Focus a specific playlist without triggering it

Inputs: playlistId (required).

playlists_focus_active_announcementB

Focus the active announcement playlist

Inputs: no named parameters.

playlists_focus_active_presentationD

Focus the active presentation playlist

Inputs: no named parameters.

playlists_focus_nextC

Focus the next playlist

Inputs: no named parameters.

playlists_focus_previousB

Focus the previous playlist

Inputs: no named parameters.

playlists_getB

Get details of a specific playlist

Inputs: playlistId (required).

playlists_get_activeC

Get the currently active playlist

Inputs: no named parameters.

playlists_get_active_announcement_thumbnailC

Get thumbnail for active playlist announcement item

Inputs: index (required), cueIndex (required).

playlists_get_active_presentation_thumbnailB

Get thumbnail for active playlist presentation item

Inputs: index (required), cueIndex (required).

playlists_get_allB

Get all playlists in the library

Inputs: no named parameters.

playlists_get_focusedA

Get the currently focused playlist

Inputs: no named parameters.

playlists_get_focused_nextB

Get the next item in the focused playlist

Inputs: no named parameters.

playlists_get_focused_previousA

Get the previous item in the focused playlist

Inputs: no named parameters.

playlists_get_thumbnailB

Get thumbnail for a specific playlist item

Inputs: playlistId (required), index (required), cueIndex (required).

playlists_get_updatesC

Get updates for a specific playlist

Inputs: playlistId (required).

playlists_setC

Update the contents of a specific playlist

Inputs: playlistId (required), contents (required).

playlists_triggerC

Trigger a specific playlist

Inputs: playlistId (required).

playlists_trigger_active_announcementB

Trigger the active announcement in the playlist

Inputs: no named parameters.

playlists_trigger_active_announcement_itemB

Trigger a specific announcement item in the active playlist

Inputs: index (required).

playlists_trigger_active_presentationA

Trigger the active presentation in the playlist

Inputs: no named parameters.

playlists_trigger_active_presentation_itemB

Trigger a specific presentation item in the active playlist

Inputs: index (required).

playlists_trigger_focusedC

Trigger the focused playlist item

Inputs: no named parameters.

playlists_trigger_focused_itemB

Trigger a specific item in the focused playlist

Inputs: index (required).

playlists_trigger_focused_nextA

Trigger the next item in the focused playlist

Inputs: no named parameters.

playlists_trigger_focused_previousA

Trigger the previous item in the focused playlist

Inputs: no named parameters.

playlists_trigger_itemC

Trigger a specific item in a playlist

Inputs: playlistId (required), index (required).

playlists_trigger_nextC

Trigger the next item in a specific playlist

Inputs: playlistId (required).

playlists_trigger_previousB

Trigger the previous item in a specific playlist

Inputs: playlistId (required).

presentation_timeline_operationC

Perform timeline operation on a specific presentation by UUID

Inputs: presentationUuid (required), operation (required).

props_clearB

Clear a specific prop from display

Inputs: id (required).

props_create_collectionC

Create a new prop collection

Inputs: name (required).

props_deleteB

Delete a specific prop

Inputs: id (required).

props_delete_collectionB

Delete a specific prop collection

Inputs: id (required).

props_getC

Get details of a specific prop

Inputs: id (required).

props_get_allA

Get all props in the library

Inputs: no named parameters.

props_get_collectionB

Get details of a specific prop collection

Inputs: id (required).

props_get_collectionsA

Get all prop collections

Inputs: no named parameters.

props_get_thumbnailB

Get thumbnail for a specific prop

Inputs: id (required).

props_pause_auto_clearB

Pause auto-clear for a specific prop

Inputs: id (required).

props_resume_auto_clearB

Resume auto-clear for a specific prop

Inputs: id (required).

props_setC

Update a specific prop

Inputs: id (required), prop (required).

props_set_collectionC

Update a specific prop collection

Inputs: id (required), collection (required).

props_triggerC

Trigger a specific prop to display

Inputs: id (required).

stage_delete_layoutB

Delete a specific stage layout

Inputs: id (required).

stage_get_layout_mapA

Get the current stage layout map configuration

Inputs: no named parameters.

stage_get_layoutsA

Get all available stage layouts

Inputs: no named parameters.

stage_get_layout_thumbnailB

Get thumbnail for a specific stage layout

Inputs: id (required).

stage_get_messageB

Get the current stage message

Inputs: no named parameters.

stage_get_screen_layoutB

Get the layout for a specific stage screen

Inputs: id (required).

stage_get_screensB

Get all stage screens and their configurations

Inputs: no named parameters.

stage_hide_messageB

Hide the current stage message

Inputs: no named parameters.

stage_set_layout_mapB

Set the stage layout map configuration

Inputs: layoutMap (required).

stage_set_screen_layoutB

Set the layout for a specific stage screen

Inputs: id (required), layoutId (required).

stage_show_messageC

Show a message on stage screens

Inputs: message (required).

status_get_audienceB

Get the status of audience screens

Inputs: no named parameters.

status_get_layersA

Get the status of all layers

Inputs: no named parameters.

status_get_screensB

Get the current status of all screens in ProPresenter

Inputs: no named parameters.

status_get_slideC

Get the current slide status information

Inputs: no named parameters.

status_get_stageB

Get the status of stage screens

Inputs: no named parameters.

status_post_updatesC

Subscribe to status updates with specific configuration

Inputs: updates (required).

status_set_audienceC

Set the configuration of audience screens

Inputs: screens (required).

status_set_stageC

Set the configuration of stage screens

Inputs: screens (required).

themes_getA

Get details of a specific theme

Inputs: id (required).

themes_get_allA

Get all themes in the library

Inputs: no named parameters.

themes_get_slideB

Get a specific slide from a theme

Inputs: id (required), themeSlide (required).

themes_get_slide_thumbnailB

Get thumbnail for a specific theme slide

Inputs: id (required), themeSlide (required).

themes_set_slideB

Update a specific slide in a theme

Inputs: id (required), themeSlide (required), slideData (required).

timeline_operationC

Perform timeline operation (play, pause, rewind) on active presentation

Inputs: operation (required).

timers_getC

Get details of a specific timer

Inputs: timerId (required).

timers_get_allA

Get all timers and their current states

Inputs: no named parameters.

timers_get_currentB

Get the current/active timer

Inputs: no named parameters.

timers_get_system_timeA

Get the current system time from ProPresenter

Inputs: no named parameters.

timers_get_video_countdownC

Get the video countdown timer information

Inputs: no named parameters.

timers_incrementC

Increment a specific timer by a duration

Inputs: timerId (required), duration (required).

timers_operate_allB

Perform an operation on all timers simultaneously

Inputs: operation (required).

timers_operationC

Perform a specific operation on a timer (start, stop, reset)

Inputs: timerId (required), operation (required).

timers_resetC

Reset a specific timer

Inputs: timerId (required).

timers_startB

Start a specific timer

Inputs: timerId (required).

timers_stopB

Stop a specific timer

Inputs: timerId (required).

transport_cancel_auto_advanceB

Cancel auto-advance for presentation or announcement layer

Inputs: layer (required).

transport_get_auto_advanceA

Get auto-advance status for presentation or announcement layer

Inputs: layer (required).

transport_get_currentC

Get the current content on the specified layer

Inputs: layer (required).

transport_get_timeB

Get the current playback time of the specified layer

Inputs: layer (required).

transport_go_to_endB

Go to the end of content in the specified layer

Inputs: layer (required), time.

transport_pauseB

Pause the specified layer (presentation, announcement, or audio)

Inputs: layer (required).

transport_playA

Play the specified layer (presentation, announcement, or audio)

Inputs: layer (required).

transport_set_timeB

Set the playback time of the specified layer

Inputs: layer (required), time (required).

transport_skip_backwardB

Skip backward in the specified layer by a given time

Inputs: layer (required), time (required).

transport_skip_forwardB

Skip forward in the specified layer by a given time

Inputs: layer (required), time (required).

trigger_active_groupC

Trigger a specific group in the active presentation

Inputs: groupId (required).

trigger_active_presentationA

Retrigger the currently active presentation (starts from beginning)

Inputs: no named parameters.

trigger_focused_cueC

Trigger a specific cue by index in the focused presentation

Inputs: index (required).

trigger_focused_groupC

Trigger a specific group in the focused presentation

Inputs: groupId (required).

trigger_focused_nextA

Trigger the next cue in the focused presentation

Inputs: no named parameters.

trigger_focused_presentationC

Trigger the currently focused presentation

Inputs: no named parameters.

trigger_focused_previousA

Trigger the previous slide in the focused presentation

Inputs: no named parameters.

trigger_next_slideB

Trigger the next cue in the current presentation

Inputs: no named parameters.

trigger_presentationA

Trigger a specific presentation by UUID, optionally starting at a specific slide index

Inputs: presentationUuid (required), index.

trigger_presentation_cueA

Trigger a specific cue by index in a presentation by UUID

Inputs: presentationUuid (required), index (required).

trigger_presentation_groupB

Trigger a specific group in a presentation by UUID

Inputs: presentationUuid (required), groupId (required).

trigger_presentation_nextA

Trigger the next cue in a specific presentation by UUID

Inputs: presentationUuid (required).

trigger_presentation_previousA

Trigger the previous cue in a specific presentation by UUID

Inputs: presentationUuid (required).

trigger_previous_slideC

Trigger the previous cue in the current presentation

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.7/5.0

    Scored across 177 tools

    Disambiguation2/5

    Many tools have overlapping functionality, such as multiple 'trigger' variants (e.g., trigger_next_slide, trigger_focused_next, trigger_presentation_next) that are difficult to distinguish. The large number of similar operations across different categories (presentation, playlist, audio, announcement) without clear boundaries causes confusion.

    Naming Consistency4/5

    Tool names consistently use snake_case and follow a predictable category_action_detail pattern (e.g., announcement_focus_active, audio_get_playlists). There are a few outliers like 'find_my_mouse' that break the pattern, but overall the naming is very systematic.

    Tool Count2/5

    With 177 tools, the surface is excessively fine-grained. Many tools could be combined with parameters (e.g., a single 'trigger' tool with type and action parameters). This high count overwhelms agents and suggests poor scoping for the intended purpose.

    Completeness4/5

    The tool set covers extensive functionality for ProPresenter, including presentations, playlists, audio, announcements, props, messages, timers, stage, and transport. Minor gaps may exist (e.g., moving playlist items), but overall it provides comprehensive coverage for the domain.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      C
      maintenance
      A comprehensive MCP server providing full control over ProPresenter presentations, media, playlists, and stage displays via the ProPresenter API. It implements over 200 endpoints to enable detailed automation and interaction through natural language commands.
      100
      82 npm
      MIT
    • A
      license
      D
      quality
      D
      maintenance
      Enables AI-driven control of MADRIX LED lighting software, providing over 100 tools for storage, layer, cue list, timeline, audio, output, and color management via the MADRIX Remote HTTP interface.
      100
      5
      Apache 2.0
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to control DaVinci Resolve Studio through the official Scripting API, with full API coverage plus workflow helpers for editing, grading, Fusion, Fairlight, and project lifecycle tasks. Includes a compound tool mode for low context usage, a granular 341-tool mode, a local control panel, and an optional advanced offline server for working with Resolve project files.
      6,532 npm
      MIT