Enforce policies on every tool call to the Propresenter MCP Server. 177 tools with suggested default rules ready to customise.
Last updated:
This policy includes sensible default rules. Download it, adjust the limits to match your use case, and run with Intercept.
# 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 Server documentation: https://github.com/alxpark/propresenter-mcp
This policy includes suggested default rules for common use cases. Adjust rate limits, add argument validation, or remove rules you don't need.
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
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.
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.
177 tools across 4 categories: Destructive, Execute, Read, Write. 103 are read-only. 74 can modify, create, or delete data.
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.
Open source. One binary. Zero dependencies.
npx -y @policylayer/intercept