diff --git a/packages/mcp/src/pipefy_mcp/tools/automation_tools.py b/packages/mcp/src/pipefy_mcp/tools/automation_tools.py index 159ab1d1..cfd613ee 100644 --- a/packages/mcp/src/pipefy_mcp/tools/automation_tools.py +++ b/packages/mcp/src/pipefy_mcp/tools/automation_tools.py @@ -21,6 +21,7 @@ ) from pipefy_mcp.tools.destructive_tool_guard import check_destructive_confirmation from pipefy_mcp.tools.graphql_error_helpers import enrich_permission_denied_error +from pipefy_mcp.tools.remote_profile import REMOTE from pipefy_mcp.tools.tool_context import get_pipefy_client from pipefy_mcp.tools.validation_helpers import ( mutation_error_if_not_optional_dict, @@ -46,6 +47,7 @@ class AutomationTools: def register(mcp: FastMCP) -> None: @mcp.tool( annotations=ToolAnnotations(readOnlyHint=True, destructiveHint=False), + meta=REMOTE, ) async def get_automation( ctx: Context, automation_id: PipefyId @@ -90,6 +92,7 @@ async def get_automation( @mcp.tool( annotations=ToolAnnotations(readOnlyHint=True, destructiveHint=False), + meta=REMOTE, ) async def get_automations( ctx: Context, @@ -145,6 +148,7 @@ async def get_automations( @mcp.tool( annotations=ToolAnnotations(readOnlyHint=True, destructiveHint=False), + meta=REMOTE, ) async def get_automation_actions( ctx: Context, @@ -189,6 +193,7 @@ async def get_automation_actions( @mcp.tool( annotations=ToolAnnotations(readOnlyHint=True, destructiveHint=False), + meta=REMOTE, ) async def get_automation_events( ctx: Context, pipe_id: PipefyId @@ -223,6 +228,7 @@ async def get_automation_events( @mcp.tool( annotations=ToolAnnotations(readOnlyHint=True, destructiveHint=False), + meta=REMOTE, ) async def get_automation_event_attributes(ctx: Context) -> dict[str, Any]: """List the official **event-scoped** ``field_map.value`` token catalog. diff --git a/packages/mcp/src/pipefy_mcp/tools/observability_tools.py b/packages/mcp/src/pipefy_mcp/tools/observability_tools.py index 882d9d87..b010f228 100644 --- a/packages/mcp/src/pipefy_mcp/tools/observability_tools.py +++ b/packages/mcp/src/pipefy_mcp/tools/observability_tools.py @@ -162,6 +162,7 @@ async def get_ai_agent_log_details( @mcp.tool( annotations=ToolAnnotations(readOnlyHint=True), + meta=REMOTE, ) async def get_automation_logs( automation_id: PipefyId, @@ -213,6 +214,7 @@ async def get_automation_logs( @mcp.tool( annotations=ToolAnnotations(readOnlyHint=True), + meta=REMOTE, ) async def get_automation_logs_by_repo( repo_id: PipefyId, @@ -319,6 +321,7 @@ async def get_agents_usage( @mcp.tool( annotations=ToolAnnotations(readOnlyHint=True), + meta=REMOTE, ) async def get_automations_usage( organization_uuid: PipefyId, @@ -417,6 +420,7 @@ async def get_ai_credit_usage( @mcp.tool( annotations=ToolAnnotations(readOnlyHint=True), + meta=REMOTE, ) async def get_automation_execution_metrics( organization_id: PipefyId, @@ -562,6 +566,7 @@ async def export_automation_jobs( @mcp.tool( annotations=ToolAnnotations(readOnlyHint=True), + meta=REMOTE, ) async def get_automation_jobs_export( export_id: PipefyId, @@ -595,6 +600,7 @@ async def get_automation_jobs_export( @mcp.tool( annotations=ToolAnnotations(readOnlyHint=True), + meta=REMOTE, ) async def get_automation_jobs_export_csv( export_id: PipefyId, diff --git a/packages/mcp/tests/tools/test_remote_profile.py b/packages/mcp/tests/tools/test_remote_profile.py index 97adba7f..7c6c2298 100644 --- a/packages/mcp/tests/tools/test_remote_profile.py +++ b/packages/mcp/tests/tools/test_remote_profile.py @@ -65,6 +65,21 @@ "get_llm_provider_dependencies", "get_default_llm_provider", "validate_llm_provider_access", + # traditional automation reads (#439): read/log tools that reach the API + # with the request-scoped bearer and are governed by API permissions; no + # filesystem or per-user process-global settings reads. The export CSV + # tool downloads in-memory (no local file) with per-call size caps. + "get_automation", + "get_automations", + "get_automation_actions", + "get_automation_events", + "get_automation_event_attributes", + "get_automation_execution_metrics", + "get_automation_logs", + "get_automation_logs_by_repo", + "get_automations_usage", + "get_automation_jobs_export", + "get_automation_jobs_export_csv", } )