How to secure Propresenter →

Propresenter MCP Policy

Enforce policies on every tool call to the Propresenter MCP Server. 177 tools with suggested default rules ready to customise.

Last updated:

74 can modify or destroy data
103 read-only
177 tools total
Read (103) Write / Execute (60) Destructive / Financial (14)

This policy includes sensible default rules. Download it, adjust the limits to match your use case, and run with Intercept.

terminal

# Download policy with default rules

curl -o io-github-alxpark-propresenter-mcp.yaml https://raw.githubusercontent.com/policylayer/intercept/main/policies/io-github-alxpark-propresenter-mcp.yaml

# Run with Intercept

intercept --policy io-github-alxpark-propresenter-mcp.yaml -- npx -y @@alxpark/propresenter-mcp
READ 103 tools
Read announcement_focus_active Read announcement_get_active Read announcement_get_slide_index Read announcement_get_timeline_status Read announcement_timeline_operation Read audio_focus_active_playlist Read audio_focus_next_playlist Read audio_focus_playlist Read audio_focus_previous_playlist Read audio_get_active_playlist Read audio_get_focused_playlist Read audio_get_playlist Read audio_get_playlist_updates Read audio_get_playlists Read capture_get_encodings Read capture_get_settings Read capture_get_status Read find_my_mouse Read focus_active_presentation Read focus_next_presentation Read focus_presentation Read focus_previous_presentation Read focused_timeline_operation Read get_active_presentation Read get_active_slide_index Read get_chord_chart Read get_chord_chart_updates Read get_focused_presentation Read get_focused_timeline_status Read get_presentation Read get_presentation_thumbnail Read get_propresenter_version Read get_timeline_status Read global_groups_get_all 2/5 Read library_get Read library_get_libraries Read looks_get Read looks_get_all 2/5 Read looks_get_current Read macros_get Read macros_get_all 2/5 Read masks_get Read masks_get_all 2/5 Read masks_get_thumbnail Read messages_get Read messages_get_all 2/5 Read playlists_focus Read playlists_focus_active_announcement Read playlists_focus_active_presentation Read playlists_focus_next Read playlists_focus_previous Read playlists_get Read playlists_get_active Read playlists_get_active_announcement_thumbnail Read playlists_get_active_presentation_thumbnail Read playlists_get_all 2/5 Read playlists_get_focused Read playlists_get_focused_next Read playlists_get_focused_previous Read playlists_get_thumbnail Read playlists_get_updates Read presentation_timeline_operation Read props_get Read props_get_all 2/5 Read props_get_collection Read props_get_collections Read props_get_thumbnail Read stage_get_layout_map Read stage_get_layout_thumbnail Read stage_get_layouts Read stage_get_message Read stage_get_screen_layout Read stage_get_screens Read stage_hide_message Read stage_show_message Read status_get_audience Read status_get_layers Read status_get_screens Read status_get_slide Read status_get_stage Read status_post_updates Read status_set_audience Read status_set_stage Read themes_get Read themes_get_all 2/5 Read themes_get_slide Read themes_get_slide_thumbnail Read timeline_operation Read timers_get Read timers_get_all 2/5 Read timers_get_current Read timers_get_system_time Read timers_get_video_countdown Read timers_increment Read timers_operate_all 2/5 Read transport_get_auto_advance Read transport_get_current Read transport_get_time Read transport_go_to_end Read transport_pause Read transport_play Read transport_skip_backward Read transport_skip_forward
EXECUTE 47 tools
Execute announcement_trigger_active 3/5 Execute announcement_trigger_cue 3/5 Execute announcement_trigger_next 3/5 Execute announcement_trigger_previous 3/5 Execute audio_trigger_active_next 3/5 Execute audio_trigger_active_playlist 3/5 Execute audio_trigger_active_previous 3/5 Execute audio_trigger_focused_next 3/5 Execute audio_trigger_focused_playlist 3/5 Execute audio_trigger_focused_previous 3/5 Execute audio_trigger_playlist 3/5 Execute audio_trigger_playlist_item 3/5 Execute capture_operation 3/5 Execute library_trigger_presentation 3/5 Execute library_trigger_presentation_cue 3/5 Execute looks_trigger 3/5 Execute macros_trigger 3/5 Execute messages_trigger 3/5 Execute playlists_trigger 3/5 Execute playlists_trigger_active_announcement 3/5 Execute playlists_trigger_active_announcement_item 3/5 Execute playlists_trigger_active_presentation 3/5 Execute playlists_trigger_active_presentation_item 3/5 Execute playlists_trigger_focused 3/5 Execute playlists_trigger_focused_item 3/5 Execute playlists_trigger_focused_next 3/5 Execute playlists_trigger_focused_previous 3/5 Execute playlists_trigger_item 3/5 Execute playlists_trigger_next 3/5 Execute playlists_trigger_previous 3/5 Execute props_trigger 3/5 Execute timers_start 3/5 Execute timers_stop 3/5 Execute trigger_active_group 3/5 Execute trigger_active_presentation 3/5 Execute trigger_focused_cue 3/5 Execute trigger_focused_group 3/5 Execute trigger_focused_next 3/5 Execute trigger_focused_presentation 3/5 Execute trigger_focused_previous 3/5 Execute trigger_next_slide 3/5 Execute trigger_presentation 3/5 Execute trigger_presentation_cue 3/5 Execute trigger_presentation_group 3/5 Execute trigger_presentation_next 3/5 Execute trigger_presentation_previous 3/5 Execute trigger_previous_slide 3/5

This policy includes suggested default rules for common use cases. Adjust rate limits, add argument validation, or remove rules you don't need.

io-github-alxpark-propresenter-mcp.yaml
version: "1"
description: "Policy for @alxpark/propresenter-mcp"
# Set to "deny" to reject tool calls not listed below
default: "allow"

tools:
    # -- Destructive Tools ----------------------------------------
    # clear_get_group: Get details of a specific clear group
    clear_get_group:
        rules:
          - action: deny
            on_deny: "Destructive operation blocked by policy"
    # clear_get_groups: Get a list of all configured clear groups
    clear_get_groups:
        rules:
          - action: deny
            on_deny: "Destructive operation blocked by policy"
    # clear_layer: Clear a specific layer (audio, props, messages, announcements, slide, media, video_input)
    clear_layer:
        rules:
          - action: deny
            on_deny: "Destructive operation blocked by policy"
    # clear_trigger_group: Trigger a specific clear group
    clear_trigger_group:
        rules:
          - action: deny
            on_deny: "Destructive operation blocked by policy"
    # messages_clear: Clear (hide) a specific message
    messages_clear:
        rules:
          - action: deny
            on_deny: "Destructive operation blocked by policy"
    # messages_delete: Delete a specific message
    messages_delete:
        rules:
          - action: deny
            on_deny: "Destructive operation blocked by policy"
    # props_clear: Clear a specific prop from display
    props_clear:
        rules:
          - action: deny
            on_deny: "Destructive operation blocked by policy"
    # props_delete: Delete a specific prop
    props_delete:
        rules:
          - action: deny
            on_deny: "Destructive operation blocked by policy"
    # props_delete_collection: Delete a specific prop collection
    props_delete_collection:
        rules:
          - action: deny
            on_deny: "Destructive operation blocked by policy"
    # props_pause_auto_clear: Pause auto-clear for a specific prop
    props_pause_auto_clear:
        rules:
          - action: deny
            on_deny: "Destructive operation blocked by policy"
    # stage_delete_layout: Delete a specific stage layout
    stage_delete_layout:
        rules:
          - action: deny
            on_deny: "Destructive operation blocked by policy"
    # timers_operation: Perform a specific operation on a timer (start, stop, reset)
    timers_operation:
        rules:
          - action: deny
            on_deny: "Destructive operation blocked by policy"
    # timers_reset: Reset a specific timer
    timers_reset:
        rules:
          - action: deny
            on_deny: "Destructive operation blocked by policy"
    # transport_cancel_auto_advance: Cancel auto-advance for presentation or announcement layer
    transport_cancel_auto_advance:
        rules:
          - action: deny
            on_deny: "Destructive operation blocked by policy"

    # -- Execute Tools ----------------------------------------
    # announcement_trigger_active: Retrigger the currently active announcement (starts from beginning)
    announcement_trigger_active:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # announcement_trigger_cue: Trigger a specific cue by index in the active announcement
    announcement_trigger_cue:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # announcement_trigger_next: Trigger the next cue in the active announcement
    announcement_trigger_next:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # announcement_trigger_previous: Trigger the previous cue in the active announcement
    announcement_trigger_previous:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # audio_trigger_active_next: Trigger the next item in the active playlist
    audio_trigger_active_next:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # audio_trigger_active_playlist: Trigger the active audio playlist (restart from beginning)
    audio_trigger_active_playlist:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # audio_trigger_active_previous: Trigger the previous item in the active playlist
    audio_trigger_active_previous:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # audio_trigger_focused_next: Trigger the next item in the focused playlist
    audio_trigger_focused_next:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # audio_trigger_focused_playlist: Trigger the focused audio playlist
    audio_trigger_focused_playlist:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # audio_trigger_focused_previous: Trigger the previous item in the focused playlist
    audio_trigger_focused_previous:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # audio_trigger_playlist: Trigger a specific audio playlist
    audio_trigger_playlist:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # audio_trigger_playlist_item: Trigger a specific item in a specific playlist
    audio_trigger_playlist_item:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # capture_operation: Perform a capture operation (start or stop)
    capture_operation:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # library_trigger_presentation: Trigger the first cue of a presentation in a library
    library_trigger_presentation:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # library_trigger_presentation_cue: Trigger a specific cue of a presentation in a library
    library_trigger_presentation_cue:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # looks_trigger: Trigger a specific audience look to make it live/current
    looks_trigger:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # macros_trigger: Trigger a specific macro
    macros_trigger:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # messages_trigger: Trigger (show) a specific message with optional token values
    messages_trigger:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # playlists_trigger: Trigger a specific playlist
    playlists_trigger:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # playlists_trigger_active_announcement: Trigger the active announcement in the playlist
    playlists_trigger_active_announcement:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # playlists_trigger_active_announcement_item: Trigger a specific announcement item in the active playlist
    playlists_trigger_active_announcement_item:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # playlists_trigger_active_presentation: Trigger the active presentation in the playlist
    playlists_trigger_active_presentation:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # playlists_trigger_active_presentation_item: Trigger a specific presentation item in the active playlist
    playlists_trigger_active_presentation_item:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # playlists_trigger_focused: Trigger the focused playlist item
    playlists_trigger_focused:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # playlists_trigger_focused_item: Trigger a specific item in the focused playlist
    playlists_trigger_focused_item:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # playlists_trigger_focused_next: Trigger the next item in the focused playlist
    playlists_trigger_focused_next:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # playlists_trigger_focused_previous: Trigger the previous item in the focused playlist
    playlists_trigger_focused_previous:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # playlists_trigger_item: Trigger a specific item in a playlist
    playlists_trigger_item:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # playlists_trigger_next: Trigger the next item in a specific playlist
    playlists_trigger_next:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # playlists_trigger_previous: Trigger the previous item in a specific playlist
    playlists_trigger_previous:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # props_trigger: Trigger a specific prop to display
    props_trigger:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # timers_start: Start a specific timer
    timers_start:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # timers_stop: Stop a specific timer
    timers_stop:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # trigger_active_group: Trigger a specific group in the active presentation
    trigger_active_group:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # trigger_active_presentation: Retrigger the currently active presentation (starts from beginning)
    trigger_active_presentation:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # trigger_focused_cue: Trigger a specific cue by index in the focused presentation
    trigger_focused_cue:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # trigger_focused_group: Trigger a specific group in the focused presentation
    trigger_focused_group:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # trigger_focused_next: Trigger the next cue in the focused presentation
    trigger_focused_next:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # trigger_focused_presentation: Trigger the currently focused presentation
    trigger_focused_presentation:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # trigger_focused_previous: Trigger the previous slide in the focused presentation
    trigger_focused_previous:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # trigger_next_slide: Trigger the next cue in the current presentation
    trigger_next_slide:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # trigger_presentation: Trigger a specific presentation by UUID, optionally starting at a specific slide index
    trigger_presentation:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # trigger_presentation_cue: Trigger a specific cue by index in a presentation by UUID
    trigger_presentation_cue:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # trigger_presentation_group: Trigger a specific group in a presentation by UUID
    trigger_presentation_group:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # trigger_presentation_next: Trigger the next cue in a specific presentation by UUID
    trigger_presentation_next:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # trigger_presentation_previous: Trigger the previous cue in a specific presentation by UUID
    trigger_presentation_previous:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true
    # trigger_previous_slide: Trigger the previous cue in the current presentation
    trigger_previous_slide:
        rules:
          - action: allow
            rate_limit: 10/hour
            validate:
              required_args: true

    # -- Write Tools ----------------------------------------
    # messages_create: Create a new message
    messages_create:
        rules:
          - action: allow
            rate_limit: 30/hour
    # messages_update: Update an existing message
    messages_update:
        rules:
          - action: allow
            rate_limit: 30/hour
    # playlists_create: Create a new playlist
    playlists_create:
        rules:
          - action: allow
            rate_limit: 30/hour
    # playlists_create_under: Create a new playlist under an existing playlist
    playlists_create_under:
        rules:
          - action: allow
            rate_limit: 30/hour
    # playlists_set: Update the contents of a specific playlist
    playlists_set:
        rules:
          - action: allow
            rate_limit: 30/hour
    # props_create_collection: Create a new prop collection
    props_create_collection:
        rules:
          - action: allow
            rate_limit: 30/hour
    # props_resume_auto_clear: Resume auto-clear for a specific prop
    props_resume_auto_clear:
        rules:
          - action: allow
            rate_limit: 30/hour
    # props_set: Update a specific prop
    props_set:
        rules:
          - action: allow
            rate_limit: 30/hour
    # props_set_collection: Update a specific prop collection
    props_set_collection:
        rules:
          - action: allow
            rate_limit: 30/hour
    # stage_set_layout_map: Set the stage layout map configuration
    stage_set_layout_map:
        rules:
          - action: allow
            rate_limit: 30/hour
    # stage_set_screen_layout: Set the layout for a specific stage screen
    stage_set_screen_layout:
        rules:
          - action: allow
            rate_limit: 30/hour
    # themes_set_slide: Update a specific slide in a theme
    themes_set_slide:
        rules:
          - action: allow
            rate_limit: 30/hour
    # transport_set_time: Set the playback time of the specified layer
    transport_set_time:
        rules:
          - action: allow
            rate_limit: 30/hour

    # -- Read Tools ----------------------------------------
    # announcement_focus_active: Focus the currently active announcement presentation
    announcement_focus_active:
        rules:
          - action: allow
            rate_limit: 60/minute
    # announcement_get_active: Get the currently active announcement presentation
    announcement_get_active:
        rules:
          - action: allow
            rate_limit: 60/minute
    # announcement_get_slide_index: Get the index of the current slide within the active announcement
    announcement_get_slide_index:
        rules:
          - action: allow
            rate_limit: 60/minute
    # announcement_get_timeline_status: Get the current timeline status of the active announcement
    announcement_get_timeline_status:
        rules:
          - action: allow
            rate_limit: 60/minute
    # announcement_timeline_operation: Perform timeline operation (play, pause, rewind) on active announcement
    announcement_timeline_operation:
        rules:
          - action: allow
            rate_limit: 60/minute
    # audio_focus_active_playlist: Focus the active audio playlist
    audio_focus_active_playlist:
        rules:
          - action: allow
            rate_limit: 60/minute
    # audio_focus_next_playlist: Focus the next audio playlist
    audio_focus_next_playlist:
        rules:
          - action: allow
            rate_limit: 60/minute
    # audio_focus_playlist: Focus a specific audio playlist
    audio_focus_playlist:
        rules:
          - action: allow
            rate_limit: 60/minute
    # audio_focus_previous_playlist: Focus the previous audio playlist
    audio_focus_previous_playlist:
        rules:
          - action: allow
            rate_limit: 60/minute
    # audio_get_active_playlist: Get the currently active audio playlist
    audio_get_active_playlist:
        rules:
          - action: allow
            rate_limit: 60/minute
    # audio_get_focused_playlist: Get the currently focused audio playlist
    audio_get_focused_playlist:
        rules:
          - action: allow
            rate_limit: 60/minute
    # audio_get_playlist: Get all items in a specific audio playlist
    audio_get_playlist:
        rules:
          - action: allow
            rate_limit: 60/minute
    # audio_get_playlist_updates: Subscribe to updates for a specific audio playlist (chunked response)
    audio_get_playlist_updates:
        rules:
          - action: allow
            rate_limit: 60/minute
    # audio_get_playlists: Get a list of all configured audio playlists
    audio_get_playlists:
        rules:
          - action: allow
            rate_limit: 60/minute
    # capture_get_encodings: Get available capture encodings for a specific type
    capture_get_encodings:
        rules:
          - action: allow
            rate_limit: 60/minute
    # capture_get_settings: Get the current capture settings
    capture_get_settings:
        rules:
          - action: allow
            rate_limit: 60/minute
    # capture_get_status: Get the current capture status and capture time
    capture_get_status:
        rules:
          - action: allow
            rate_limit: 60/minute
    # find_my_mouse: Trigger the find my mouse feature to highlight the cursor on all screens
    find_my_mouse:
        rules:
          - action: allow
            rate_limit: 60/minute
    # focus_active_presentation: Focus the currently active presentation
    focus_active_presentation:
        rules:
          - action: allow
            rate_limit: 60/minute
    # focus_next_presentation: Focus the next presentation
    focus_next_presentation:
        rules:
          - action: allow
            rate_limit: 60/minute
    # focus_presentation: Focus a presentation without triggering it
    focus_presentation:
        rules:
          - action: allow
            rate_limit: 60/minute
    # focus_previous_presentation: Focus the previous presentation
    focus_previous_presentation:
        rules:
          - action: allow
            rate_limit: 60/minute
    # focused_timeline_operation: Perform timeline operation (play, pause, rewind) on focused presentation
    focused_timeline_operation:
        rules:
          - action: allow
            rate_limit: 60/minute
    # get_active_presentation: Get the currently active presentation
    get_active_presentation:
        rules:
          - action: allow
            rate_limit: 60/minute
    # get_active_slide_index: Get the index of the current slide within the active presentation
    get_active_slide_index:
        rules:
          - action: allow
            rate_limit: 60/minute
    # get_chord_chart: Get the current chord chart information
    get_chord_chart:
        rules:
          - action: allow
            rate_limit: 60/minute
    # get_chord_chart_updates: Get chord chart updates
    get_chord_chart_updates:
        rules:
          - action: allow
            rate_limit: 60/minute
    # get_focused_presentation: Get the currently focused presentation
    get_focused_presentation:
        rules:
          - action: allow
            rate_limit: 60/minute
    # get_focused_timeline_status: Get the current timeline status of the focused presentation
    get_focused_timeline_status:
        rules:
          - action: allow
            rate_limit: 60/minute
    # get_presentation: Get details of a specific presentation by UUID
    get_presentation:
        rules:
          - action: allow
            rate_limit: 60/minute
    # get_presentation_thumbnail: Get a thumbnail for a specific slide in a presentation
    get_presentation_thumbnail:
        rules:
          - action: allow
            rate_limit: 60/minute
    # get_propresenter_version: Get the ProPresenter version and build information
    get_propresenter_version:
        rules:
          - action: allow
            rate_limit: 60/minute
    # get_timeline_status: Get the current timeline status of the active presentation
    get_timeline_status:
        rules:
          - action: allow
            rate_limit: 60/minute
    # global_groups_get_all: Get all global groups configured in ProPresenter
    global_groups_get_all:
        rules:
          - action: allow
            rate_limit: 60/minute
    # library_get: Get all items in a specific library
    library_get:
        rules:
          - action: allow
            rate_limit: 60/minute
    # library_get_libraries: Get a list of all configured libraries
    library_get_libraries:
        rules:
          - action: allow
            rate_limit: 60/minute
    # looks_get: Get details of a specific audience look
    looks_get:
        rules:
          - action: allow
            rate_limit: 60/minute
    # looks_get_all: Get a list of all configured audience looks (except the live look)
    looks_get_all:
        rules:
          - action: allow
            rate_limit: 60/minute
    # looks_get_current: Get the details of the currently live audience look
    looks_get_current:
        rules:
          - action: allow
            rate_limit: 60/minute
    # macros_get: Get details of a specific macro
    macros_get:
        rules:
          - action: allow
            rate_limit: 60/minute
    # macros_get_all: Get a list of all configured macros
    macros_get_all:
        rules:
          - action: allow
            rate_limit: 60/minute
    # masks_get: Get details of a specific mask
    masks_get:
        rules:
          - action: allow
            rate_limit: 60/minute
    # masks_get_all: Get all masks in the library
    masks_get_all:
        rules:
          - action: allow
            rate_limit: 60/minute
    # masks_get_thumbnail: Get thumbnail for a specific mask
    masks_get_thumbnail:
        rules:
          - action: allow
            rate_limit: 60/minute
    # messages_get: Get details of a specific message
    messages_get:
        rules:
          - action: allow
            rate_limit: 60/minute
    # messages_get_all: Get a list of all messages
    messages_get_all:
        rules:
          - action: allow
            rate_limit: 60/minute
    # playlists_focus: Focus a specific playlist without triggering it
    playlists_focus:
        rules:
          - action: allow
            rate_limit: 60/minute
    # playlists_focus_active_announcement: Focus the active announcement playlist
    playlists_focus_active_announcement:
        rules:
          - action: allow
            rate_limit: 60/minute
    # playlists_focus_active_presentation: Focus the active presentation playlist
    playlists_focus_active_presentation:
        rules:
          - action: allow
            rate_limit: 60/minute
    # playlists_focus_next: Focus the next playlist
    playlists_focus_next:
        rules:
          - action: allow
            rate_limit: 60/minute
    # playlists_focus_previous: Focus the previous playlist
    playlists_focus_previous:
        rules:
          - action: allow
            rate_limit: 60/minute
    # playlists_get: Get details of a specific playlist
    playlists_get:
        rules:
          - action: allow
            rate_limit: 60/minute
    # playlists_get_active: Get the currently active playlist
    playlists_get_active:
        rules:
          - action: allow
            rate_limit: 60/minute
    # playlists_get_active_announcement_thumbnail: Get thumbnail for active playlist announcement item
    playlists_get_active_announcement_thumbnail:
        rules:
          - action: allow
            rate_limit: 60/minute
    # playlists_get_active_presentation_thumbnail: Get thumbnail for active playlist presentation item
    playlists_get_active_presentation_thumbnail:
        rules:
          - action: allow
            rate_limit: 60/minute
    # playlists_get_all: Get all playlists in the library
    playlists_get_all:
        rules:
          - action: allow
            rate_limit: 60/minute
    # playlists_get_focused: Get the currently focused playlist
    playlists_get_focused:
        rules:
          - action: allow
            rate_limit: 60/minute
    # playlists_get_focused_next: Get the next item in the focused playlist
    playlists_get_focused_next:
        rules:
          - action: allow
            rate_limit: 60/minute
    # playlists_get_focused_previous: Get the previous item in the focused playlist
    playlists_get_focused_previous:
        rules:
          - action: allow
            rate_limit: 60/minute
    # playlists_get_thumbnail: Get thumbnail for a specific playlist item
    playlists_get_thumbnail:
        rules:
          - action: allow
            rate_limit: 60/minute
    # playlists_get_updates: Get updates for a specific playlist
    playlists_get_updates:
        rules:
          - action: allow
            rate_limit: 60/minute
    # presentation_timeline_operation: Perform timeline operation on a specific presentation by UUID
    presentation_timeline_operation:
        rules:
          - action: allow
            rate_limit: 60/minute
    # props_get: Get details of a specific prop
    props_get:
        rules:
          - action: allow
            rate_limit: 60/minute
    # props_get_all: Get all props in the library
    props_get_all:
        rules:
          - action: allow
            rate_limit: 60/minute
    # props_get_collection: Get details of a specific prop collection
    props_get_collection:
        rules:
          - action: allow
            rate_limit: 60/minute
    # props_get_collections: Get all prop collections
    props_get_collections:
        rules:
          - action: allow
            rate_limit: 60/minute
    # props_get_thumbnail: Get thumbnail for a specific prop
    props_get_thumbnail:
        rules:
          - action: allow
            rate_limit: 60/minute
    # stage_get_layout_map: Get the current stage layout map configuration
    stage_get_layout_map:
        rules:
          - action: allow
            rate_limit: 60/minute
    # stage_get_layout_thumbnail: Get thumbnail for a specific stage layout
    stage_get_layout_thumbnail:
        rules:
          - action: allow
            rate_limit: 60/minute
    # stage_get_layouts: Get all available stage layouts
    stage_get_layouts:
        rules:
          - action: allow
            rate_limit: 60/minute
    # stage_get_message: Get the current stage message
    stage_get_message:
        rules:
          - action: allow
            rate_limit: 60/minute
    # stage_get_screen_layout: Get the layout for a specific stage screen
    stage_get_screen_layout:
        rules:
          - action: allow
            rate_limit: 60/minute
    # stage_get_screens: Get all stage screens and their configurations
    stage_get_screens:
        rules:
          - action: allow
            rate_limit: 60/minute
    # stage_hide_message: Hide the current stage message
    stage_hide_message:
        rules:
          - action: allow
            rate_limit: 60/minute
    # stage_show_message: Show a message on stage screens
    stage_show_message:
        rules:
          - action: allow
            rate_limit: 60/minute
    # status_get_audience: Get the status of audience screens
    status_get_audience:
        rules:
          - action: allow
            rate_limit: 60/minute
    # status_get_layers: Get the status of all layers
    status_get_layers:
        rules:
          - action: allow
            rate_limit: 60/minute
    # status_get_screens: Get the current status of all screens in ProPresenter
    status_get_screens:
        rules:
          - action: allow
            rate_limit: 60/minute
    # status_get_slide: Get the current slide status information
    status_get_slide:
        rules:
          - action: allow
            rate_limit: 60/minute
    # status_get_stage: Get the status of stage screens
    status_get_stage:
        rules:
          - action: allow
            rate_limit: 60/minute
    # status_post_updates: Subscribe to status updates with specific configuration
    status_post_updates:
        rules:
          - action: allow
            rate_limit: 60/minute
    # status_set_audience: Set the configuration of audience screens
    status_set_audience:
        rules:
          - action: allow
            rate_limit: 60/minute
    # status_set_stage: Set the configuration of stage screens
    status_set_stage:
        rules:
          - action: allow
            rate_limit: 60/minute
    # themes_get: Get details of a specific theme
    themes_get:
        rules:
          - action: allow
            rate_limit: 60/minute
    # themes_get_all: Get all themes in the library
    themes_get_all:
        rules:
          - action: allow
            rate_limit: 60/minute
    # themes_get_slide: Get a specific slide from a theme
    themes_get_slide:
        rules:
          - action: allow
            rate_limit: 60/minute
    # themes_get_slide_thumbnail: Get thumbnail for a specific theme slide
    themes_get_slide_thumbnail:
        rules:
          - action: allow
            rate_limit: 60/minute
    # timeline_operation: Perform timeline operation (play, pause, rewind) on active presentation
    timeline_operation:
        rules:
          - action: allow
            rate_limit: 60/minute
    # timers_get: Get details of a specific timer
    timers_get:
        rules:
          - action: allow
            rate_limit: 60/minute
    # timers_get_all: Get all timers and their current states
    timers_get_all:
        rules:
          - action: allow
            rate_limit: 60/minute
    # timers_get_current: Get the current/active timer
    timers_get_current:
        rules:
          - action: allow
            rate_limit: 60/minute
    # timers_get_system_time: Get the current system time from ProPresenter
    timers_get_system_time:
        rules:
          - action: allow
            rate_limit: 60/minute
    # timers_get_video_countdown: Get the video countdown timer information
    timers_get_video_countdown:
        rules:
          - action: allow
            rate_limit: 60/minute
    # timers_increment: Increment a specific timer by a duration
    timers_increment:
        rules:
          - action: allow
            rate_limit: 60/minute
    # timers_operate_all: Perform an operation on all timers simultaneously
    timers_operate_all:
        rules:
          - action: allow
            rate_limit: 60/minute
    # transport_get_auto_advance: Get auto-advance status for presentation or announcement layer
    transport_get_auto_advance:
        rules:
          - action: allow
            rate_limit: 60/minute
    # transport_get_current: Get the current content on the specified layer
    transport_get_current:
        rules:
          - action: allow
            rate_limit: 60/minute
    # transport_get_time: Get the current playback time of the specified layer
    transport_get_time:
        rules:
          - action: allow
            rate_limit: 60/minute
    # transport_go_to_end: Go to the end of content in the specified layer
    transport_go_to_end:
        rules:
          - action: allow
            rate_limit: 60/minute
    # transport_pause: Pause the specified layer (presentation, announcement, or audio)
    transport_pause:
        rules:
          - action: allow
            rate_limit: 60/minute
    # transport_play: Play the specified layer (presentation, announcement, or audio)
    transport_play:
        rules:
          - action: allow
            rate_limit: 60/minute
    # transport_skip_backward: Skip backward in the specified layer by a given time
    transport_skip_backward:
        rules:
          - action: allow
            rate_limit: 60/minute
    # transport_skip_forward: Skip forward in the specified layer by a given time
    transport_skip_forward:
        rules:
          - action: allow
            rate_limit: 60/minute
Can an AI agent delete data through the Propresenter MCP server? +

Yes. The Propresenter server exposes 14 destructive tools including clear_get_group, clear_get_groups, clear_layer. These permanently remove resources with no undo. Intercept blocks destructive tools by default so they never reach the upstream server.

How do I prevent bulk modifications through Propresenter? +

The Propresenter server has 13 write tools including messages_create, messages_update, playlists_create. Set rate limits in your policy file -- for example, rate_limit: 10/hour prevents an agent from making more than 10 modifications per hour. Intercept enforces this at the transport layer.

How many tools does the Propresenter MCP server expose? +

177 tools across 4 categories: Destructive, Execute, Read, Write. 103 are read-only. 74 can modify, create, or delete data.

How do I add Intercept to my Propresenter setup? +

One line change. Instead of running the Propresenter server directly, prefix it with Intercept: intercept -c io-github-alxpark-propresenter-mcp.yaml -- npx -y @@alxpark/propresenter-mcp. Download a pre-built policy from policylayer.com/policies/io-github-alxpark-propresenter-mcp and adjust the limits to match your use case.

Enforce policies on Propresenter

Open source. One binary. Zero dependencies.

npx -y @policylayer/intercept
github.com/policylayer/intercept →
// GET IN TOUCH

Have a question or want to learn more? Send us a message.

Message sent.

We'll get back to you soon.