Skip to main content
Glama
javerthl

ServiceNow MCP Server

by javerthl

update_scrum_task

Modify an existing scrum task in ServiceNow to update details like priority, hours, assignment, state, or descriptions for accurate project tracking.

Instructions

Update an existing scrum task in ServiceNow

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
assigned_toNoUser assigned to the scrum task
assignment_groupNoGroup assigned to the scrum task
descriptionNoDetailed description of the scrum task
hoursNoActual Hours for the scrum task
planned_hoursNoPlanned hours for the scrum task
priorityNoPriority of scrum task (1 is Critical, 2 is High, 3 is Moderate, 4 is Low)
remaining_hoursNoRemaining hours for the scrum task
scrum_task_idYesScrum Task ID or sys_id
short_descriptionNoShort description of the scrum task
stateNoState of scrum task (-6 is Draft,1 is Ready, 2 is Work in progress, 3 is Complete, 4 is Cancelled)
typeNoType of scrum task (1 is Analysis, 2 is Coding, 3 is Documentation, 4 is Testing)
work_notesNoWork notes to add to the scrum task

Implementation Reference

  • The core handler function that executes the 'update_scrum_task' tool. It validates input parameters using UpdateScrumTaskParams, prepares a PUT request to the ServiceNow rm_scrum_task table API, and returns the result.
    def update_scrum_task(
        auth_manager: AuthManager,
        server_config: ServerConfig,
        params: Dict[str, Any],
    ) -> Dict[str, Any]:
        """
        Update an existing scrum task in ServiceNow.
    
        Args:
            auth_manager: The authentication manager.
            server_config: The server configuration.
            params: The parameters for updating the scrum task.
    
        Returns:
            The updated scrum task.
        """
        # Unwrap and validate parameters
        result = _unwrap_and_validate_params(
            params, 
            UpdateScrumTaskParams,
            required_fields=["scrum_task_id"]
        )
        
        if not result["success"]:
            return result
        
        validated_params = result["params"]
        
        # Prepare the request data
        data = {}
    
        # Add optional fields if provided
        if validated_params.short_description:
            data["short_description"] = validated_params.short_description
        if validated_params.priority:
            data["priority"] = validated_params.priority
        if validated_params.planned_hours:
            data["planned_hours"] = validated_params.planned_hours
        if validated_params.remaining_hours:
            data["remaining_hours"] = validated_params.remaining_hours
        if validated_params.hours:
            data["hours"] = validated_params.hours
        if validated_params.description:
            data["description"] = validated_params.description
        if validated_params.type:
            data["type"] = validated_params.type
        if validated_params.state:
            data["state"] = validated_params.state
        if validated_params.assignment_group:
            data["assignment_group"] = validated_params.assignment_group
        if validated_params.assigned_to:
            data["assigned_to"] = validated_params.assigned_to
        if validated_params.work_notes:
            data["work_notes"] = validated_params.work_notes
        
        # Get the instance URL
        instance_url = _get_instance_url(auth_manager, server_config)
        if not instance_url:
            return {
                "success": False,
                "message": "Cannot find instance_url in either server_config or auth_manager",
            }
        
        # Get the headers
        headers = _get_headers(auth_manager, server_config)
        if not headers:
            return {
                "success": False,
                "message": "Cannot find get_headers method in either auth_manager or server_config",
            }
        
        # Add Content-Type header
        headers["Content-Type"] = "application/json"
        
        # Make the API request
        url = f"{instance_url}/api/now/table/rm_scrum_task/{validated_params.scrum_task_id}"
        
        try:
            response = requests.put(url, json=data, headers=headers)
            response.raise_for_status()
            
            result = response.json()
            
            return {
                "success": True,
                "message": "Scrum Task updated successfully",
                "scrum_task": result["result"],
            }
        except requests.exceptions.RequestException as e:
            logger.error(f"Error updating scrum task: {e}")
            return {
                "success": False,
                "message": f"Error updating scrum task: {str(e)}",
            }
  • Pydantic model defining the input schema/parameters for the update_scrum_task tool, including required scrum_task_id and various optional fields for updating the task.
    class UpdateScrumTaskParams(BaseModel):
        """Parameters for updating a scrum task."""
    
        scrum_task_id: str = Field(..., description="Scrum Task ID or sys_id")
        short_description: Optional[str] = Field(None, description="Short description of the scrum task")
        priority: Optional[str] = Field(None, description="Priority of scrum task (1 is Critical, 2 is High, 3 is Moderate, 4 is Low)")
        planned_hours: Optional[int] = Field(None, description="Planned hours for the scrum task")
        remaining_hours: Optional[int] = Field(None, description="Remaining hours for the scrum task")
        hours: Optional[int] = Field(None, description="Actual Hours for the scrum task")
        description: Optional[str] = Field(None, description="Detailed description of the scrum task")
        type: Optional[str] = Field(None, description="Type of scrum task (1 is Analysis, 2 is Coding, 3 is Documentation, 4 is Testing)")
        state: Optional[str] = Field(None, description="State of scrum task (-6 is Draft,1 is Ready, 2 is Work in progress, 3 is Complete, 4 is Cancelled)")
        assignment_group: Optional[str] = Field(None, description="Group assigned to the scrum task")
        assigned_to: Optional[str] = Field(None, description="User assigned to the scrum task")
        work_notes: Optional[str] = Field(None, description="Work notes to add to the scrum task")
  • The tool registration entry in get_tool_definitions() dictionary, mapping 'update_scrum_task' to its handler (aliased import), schema, return type, description, and serialization method.
    "update_scrum_task": (
        update_scrum_task_tool,
        UpdateScrumTaskParams,
        str,
        "Update an existing scrum task in ServiceNow",
        "str",
    ),
  • Import statements that bring in the handler function (aliased as update_scrum_task_tool) and schema (UpdateScrumTaskParams) from scrum_task_tools.py for use in tool registration.
    from servicenow_mcp.tools.scrum_task_tools import (
        CreateScrumTaskParams,
        UpdateScrumTaskParams,
        ListScrumTasksParams,
    )
    from servicenow_mcp.tools.scrum_task_tools import (
        create_scrum_task as create_scrum_task_tool,
        update_scrum_task as update_scrum_task_tool,
        list_scrum_tasks as list_scrum_tasks_tool,
    )
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden but offers minimal behavioral insight. It states it's an update operation, implying mutation, but doesn't disclose critical details like required permissions, whether changes are reversible, error handling, or rate limits. This leaves significant gaps for a tool that modifies data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, straightforward sentence with no wasted words. It's front-loaded with the core action and resource, making it highly efficient and easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (12 parameters, mutation operation) and lack of annotations or output schema, the description is insufficient. It doesn't explain what the tool returns, error conditions, or behavioral nuances, leaving the agent with incomplete information for safe and effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with each parameter well-documented in the schema itself (e.g., priority values explained as '1 is Critical, 2 is High...'). The description adds no additional parameter semantics beyond the schema, so it meets the baseline for high coverage without compensating value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the action ('Update') and resource ('existing scrum task in ServiceNow'), which is clear but basic. It doesn't distinguish this tool from other update tools like 'update_story' or 'update_epic' in the sibling list, nor does it specify what aspects can be updated beyond the generic term.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. For example, it doesn't mention prerequisites like needing an existing scrum task ID or differentiate from 'create_scrum_task' for new tasks. The description lacks any context about appropriate scenarios or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/javerthl/servicenow-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server