Skip to main content
Glama
vparlapalli490

ServiceNow MCP Server

update_change_request

Modify an existing ServiceNow change request by updating fields like description, state, risk, impact, assignment group, dates, or work notes to reflect current status and requirements.

Instructions

Update an existing change request in ServiceNow

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
change_idYesChange request ID or sys_id
short_descriptionNoShort description of the change request
descriptionNoDetailed description of the change request
stateNoState of the change request
riskNoRisk level of the change
impactNoImpact of the change
categoryNoCategory of the change
assignment_groupNoGroup assigned to the change
start_dateNoPlanned start date (YYYY-MM-DD HH:MM:SS)
end_dateNoPlanned end date (YYYY-MM-DD HH:MM:SS)
work_notesNoWork notes to add to the change request

Implementation Reference

  • The main handler function for the update_change_request tool. It validates input parameters using Pydantic, prepares the update data, constructs the ServiceNow API URL, and performs a PUT request to update the change request.
    def update_change_request(
        auth_manager: AuthManager,
        server_config: ServerConfig,
        params: Dict[str, Any],
    ) -> Dict[str, Any]:
        """
        Update an existing change request in ServiceNow.
    
        Args:
            auth_manager: The authentication manager.
            server_config: The server configuration.
            params: The parameters for updating the change request.
    
        Returns:
            The updated change request.
        """
        # Unwrap and validate parameters
        result = _unwrap_and_validate_params(
            params, 
            UpdateChangeRequestParams, 
            required_fields=["change_id"]
        )
        
        if not result["success"]:
            return result
        
        validated_params = result["params"]
        
        # Prepare the request data
        data = {}
        
        # Add fields if provided
        if validated_params.short_description:
            data["short_description"] = validated_params.short_description
        if validated_params.description:
            data["description"] = validated_params.description
        if validated_params.state:
            data["state"] = validated_params.state
        if validated_params.risk:
            data["risk"] = validated_params.risk
        if validated_params.impact:
            data["impact"] = validated_params.impact
        if validated_params.category:
            data["category"] = validated_params.category
        if validated_params.assignment_group:
            data["assignment_group"] = validated_params.assignment_group
        if validated_params.start_date:
            data["start_date"] = validated_params.start_date
        if validated_params.end_date:
            data["end_date"] = validated_params.end_date
        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/change_request/{validated_params.change_id}"
        
        try:
            response = requests.put(url, json=data, headers=headers)
            response.raise_for_status()
            
            result = response.json()
            
            return {
                "success": True,
                "message": "Change request updated successfully",
                "change_request": result["result"],
            }
        except requests.exceptions.RequestException as e:
            logger.error(f"Error updating change request: {e}")
            return {
                "success": False,
                "message": f"Error updating change request: {str(e)}",
            }
  • Pydantic BaseModel defining the input schema for the update_change_request tool, including required change_id and optional fields for updating the change request.
    class UpdateChangeRequestParams(BaseModel):
        """Parameters for updating a change request."""
    
        change_id: str = Field(..., description="Change request ID or sys_id")
        short_description: Optional[str] = Field(None, description="Short description of the change request")
        description: Optional[str] = Field(None, description="Detailed description of the change request")
        state: Optional[str] = Field(None, description="State of the change request")
        risk: Optional[str] = Field(None, description="Risk level of the change")
        impact: Optional[str] = Field(None, description="Impact of the change")
        category: Optional[str] = Field(None, description="Category of the change")
        assignment_group: Optional[str] = Field(None, description="Group assigned to the change")
        start_date: Optional[str] = Field(None, description="Planned start date (YYYY-MM-DD HH:MM:SS)")
        end_date: Optional[str] = Field(None, description="Planned end date (YYYY-MM-DD HH:MM:SS)")
        work_notes: Optional[str] = Field(None, description="Work notes to add to the change request")
  • Registration of the update_change_request tool in the central tool_definitions dictionary used by the MCP server, mapping the tool name to its handler function, input schema, return type, description, and serialization method.
    "update_change_request": (
        update_change_request_tool,
        UpdateChangeRequestParams,
        str,
        "Update an existing change request in ServiceNow",
        "str",
    ),
  • Shared helper function used by the handler (and other tools) to unwrap, validate required fields, and parse input parameters against the Pydantic schema.
    def _unwrap_and_validate_params(params: Any, model_class: Type[T], required_fields: List[str] = None) -> Dict[str, Any]:
        """
        Helper function to unwrap and validate parameters.
        
        Args:
            params: The parameters to unwrap and validate.
            model_class: The Pydantic model class to validate against.
            required_fields: List of required field names.
            
        Returns:
            A tuple of (success, result) where result is either the validated parameters or an error message.
        """
        # Handle case where params might be wrapped in another dictionary
        if isinstance(params, dict) and len(params) == 1 and "params" in params and isinstance(params["params"], dict):
            logger.warning("Detected params wrapped in a 'params' key. Unwrapping...")
            params = params["params"]
        
        # Handle case where params might be a Pydantic model object
        if not isinstance(params, dict):
            try:
                # Try to convert to dict if it's a Pydantic model
                logger.warning("Params is not a dictionary. Attempting to convert...")
                params = params.dict() if hasattr(params, "dict") else dict(params)
            except Exception as e:
                logger.error(f"Failed to convert params to dictionary: {e}")
                return {
                    "success": False,
                    "message": f"Invalid parameters format. Expected a dictionary, got {type(params).__name__}",
                }
        
        # Validate required parameters are present
        if required_fields:
            for field in required_fields:
                if field not in params:
                    return {
                        "success": False,
                        "message": f"Missing required parameter '{field}'",
                    }
        
        try:
            # Validate parameters against the model
            validated_params = model_class(**params)
            return {
                "success": True,
                "params": validated_params,
            }
        except Exception as e:
            logger.error(f"Error validating parameters: {e}")
            return {
                "success": False,
                "message": f"Error validating parameters: {str(e)}",
            }

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/vparlapalli490/MCP'

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