feat: Split read/write scopes into app:read/write scopes

This commit is contained in:
Chris Coutinho
2025-10-24 04:38:49 +02:00
parent d55e5708c7
commit d452684535
45 changed files with 1630 additions and 952 deletions
+16 -16
View File
@@ -19,7 +19,7 @@ logger = logging.getLogger(__name__)
def configure_calendar_tools(mcp: FastMCP):
# Calendar tools
@mcp.tool()
@require_scopes("nc:read")
@require_scopes("calendar:read")
async def nc_calendar_list_calendars(ctx: Context) -> ListCalendarsResponse:
"""List all available calendars for the user"""
client = get_client(ctx)
@@ -29,7 +29,7 @@ def configure_calendar_tools(mcp: FastMCP):
return ListCalendarsResponse(calendars=calendars, total_count=len(calendars))
@mcp.tool()
@require_scopes("nc:write")
@require_scopes("calendar:write")
async def nc_calendar_create_event(
calendar_name: str,
title: str,
@@ -105,7 +105,7 @@ def configure_calendar_tools(mcp: FastMCP):
return await client.calendar.create_event(calendar_name, event_data)
@mcp.tool()
@require_scopes("nc:read")
@require_scopes("calendar:read")
async def nc_calendar_list_events(
calendar_name: str,
ctx: Context,
@@ -207,7 +207,7 @@ def configure_calendar_tools(mcp: FastMCP):
return events
@mcp.tool()
@require_scopes("nc:read")
@require_scopes("calendar:read")
async def nc_calendar_get_event(
calendar_name: str,
event_uid: str,
@@ -219,7 +219,7 @@ def configure_calendar_tools(mcp: FastMCP):
return event_data
@mcp.tool()
@require_scopes("nc:write")
@require_scopes("calendar:write")
async def nc_calendar_update_event(
calendar_name: str,
event_uid: str,
@@ -292,7 +292,7 @@ def configure_calendar_tools(mcp: FastMCP):
)
@mcp.tool()
@require_scopes("nc:write")
@require_scopes("calendar:write")
async def nc_calendar_delete_event(
calendar_name: str,
event_uid: str,
@@ -303,7 +303,7 @@ def configure_calendar_tools(mcp: FastMCP):
return await client.calendar.delete_event(calendar_name, event_uid)
@mcp.tool()
@require_scopes("nc:write")
@require_scopes("calendar:write")
async def nc_calendar_create_meeting(
title: str,
date: str,
@@ -369,7 +369,7 @@ def configure_calendar_tools(mcp: FastMCP):
return await client.calendar.create_event(calendar_name, event_data)
@mcp.tool()
@require_scopes("nc:read")
@require_scopes("calendar:read")
async def nc_calendar_get_upcoming_events(
ctx: Context,
calendar_name: str = "", # Empty = all calendars
@@ -419,7 +419,7 @@ def configure_calendar_tools(mcp: FastMCP):
return all_events[:limit]
@mcp.tool()
@require_scopes("nc:read")
@require_scopes("calendar:read")
async def nc_calendar_find_availability(
duration_minutes: int,
ctx: Context,
@@ -499,7 +499,7 @@ def configure_calendar_tools(mcp: FastMCP):
)
@mcp.tool()
@require_scopes("nc:write")
@require_scopes("calendar:write")
async def nc_calendar_bulk_operations(
operation: str, # "update", "delete", "move"
ctx: Context,
@@ -748,7 +748,7 @@ def configure_calendar_tools(mcp: FastMCP):
}
@mcp.tool()
@require_scopes("nc:write")
@require_scopes("calendar:write")
async def nc_calendar_manage_calendar(
action: str, # "create", "delete", "update", "list"
ctx: Context,
@@ -817,7 +817,7 @@ def configure_calendar_tools(mcp: FastMCP):
# ============= Todo/Task Tools =============
@mcp.tool()
@require_scopes("nc:read")
@require_scopes("todo:read", "calendar:read")
async def nc_calendar_list_todos(
calendar_name: str,
ctx: Context,
@@ -862,7 +862,7 @@ def configure_calendar_tools(mcp: FastMCP):
)
@mcp.tool()
@require_scopes("nc:write")
@require_scopes("todo:write", "calendar:read")
async def nc_calendar_create_todo(
calendar_name: str,
summary: str,
@@ -905,7 +905,7 @@ def configure_calendar_tools(mcp: FastMCP):
return await client.calendar.create_todo(calendar_name, todo_data)
@mcp.tool()
@require_scopes("nc:write")
@require_scopes("todo:write", "calendar:read")
async def nc_calendar_update_todo(
calendar_name: str,
todo_uid: str,
@@ -965,7 +965,7 @@ def configure_calendar_tools(mcp: FastMCP):
return await client.calendar.update_todo(calendar_name, todo_uid, todo_data)
@mcp.tool()
@require_scopes("nc:write")
@require_scopes("todo:write", "calendar:read")
async def nc_calendar_delete_todo(
calendar_name: str,
todo_uid: str,
@@ -985,7 +985,7 @@ def configure_calendar_tools(mcp: FastMCP):
return await client.calendar.delete_todo(calendar_name, todo_uid)
@mcp.tool()
@require_scopes("nc:read")
@require_scopes("todo:read", "calendar:read")
async def nc_calendar_search_todos(
ctx: Context,
status: Optional[str] = None,