propresenter-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@propresenter-mcp Go to the next slide and reset the sermon timer"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
Prerequisites
Node.js 18 or higher
ProPresenter 7 with API enabled
ProPresenter running and accessible on your network
Installation
Clone this repository or download the source code
Install dependencies:
npm installBuild the project:
npm run buildConfiguration
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
Open ProPresenter preferences
Go to the Network tab
Enable "Network" and note the port number (default: 50000)
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.
Open this project in VS Code
The server is automatically configured for debugging via
.vscode/mcp.jsonUse 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 buildWatch Mode
npm run watchAPI 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 buildCheck that Node.js 18+ is installed
Verify all dependencies are installed with
npm install
Available Tools
177 toolsannouncement_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
Scored across 177 tools
Most tools have distinct purposes with clear resource-action pairs, but there is some overlap in timeline operations (e.g., timeline_operation, presentation_timeline_operation, focused_timeline_operation) and triggering functions across different contexts (active, focused, specific presentations) that could cause confusion. The descriptions help differentiate, but the sheer number of similar tools increases ambiguity.
Tool names follow a highly consistent verb_noun pattern throughout, with clear prefixes for resource types (e.g., announcement_, audio_, messages_) and consistent use of snake_case. This predictability makes it easy to understand the tool's purpose and domain at a glance.
With 177 tools, the count is excessive for an MCP server, even for a complex domain like ProPresenter. This many tools will overwhelm agents, increase cognitive load, and likely include redundancies that could be consolidated into fewer, more general tools.
The tool set provides comprehensive coverage of ProPresenter's functionality, including CRUD operations for resources like messages, props, and playlists, lifecycle management for presentations and announcements, status monitoring, and control over various layers and components. No obvious gaps are present for the intended domain.
Related MCP Connectors
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
The official Planning Center MCP server for interacting with your ministry's data.
MCP server for generating rough-draft project plans from natural-language prompts.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.