Skip to main content
Glama
devrev

DevRev MCP Server

Official
by devrev

list_works

Retrieve and filter work items like issues and tickets from DevRev with options for type, state, dates, owners, and pagination.

Instructions

List all work items (issues, tickets) in DevRev

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
typeYesThe type of works to list
cursorNoThe cursor to use for pagination. If not provided, iteration begins from the first page. In the output you get next_cursor, use it and the correct mode to get the next or previous page. You can use these to loop through all the pages.
applies_to_partNoThe part IDs of the works to list
created_byNoThe user IDs of the creators of the works to list
owned_byNoThe user IDs of the owners of the works to list
stateNoThe state names of the works to list
modified_byNoThe user IDs of the users who modified the works to list
sla_summaryNoService Level Agreement summary filter on issues to list.
sort_byNoThe field (and the order) to sort the works by, in the sequence of the array elements
rev_orgsNoThe rev_org IDs of the customer rev_orgs filter on Issues and Tickets to list. Use this filter for issues and tickets that are related to a customer rev_org.
target_close_dateNo
target_start_dateNoThe target start date range can only be used for issues. Do not use this field for tickets.
actual_close_dateNo
actual_start_dateNoThe actual start date range can only be used for issues. Do not use this field for tickets.
created_dateNo
modified_dateNo
sprintNoUse this to filter on sprints.
custom_fieldsNoUse this to filter on the custom fields, which are not present in the input schema.
subtypeNoUse this to filter on the subtype of the work items.

Implementation Reference

  • The handler logic for executing the 'list_works' tool. It processes input arguments to build a filter payload for the DevRev API 'works.list' endpoint and handles the response.
    elif name == "list_works":
        payload = {}
        payload["issue"] = {}
        payload["ticket"] = {}
        
        type = arguments.get("type")
        if not type:
            raise ValueError("Missing type parameter")
        payload["type"] = type
    
        cursor = arguments.get("cursor")
        if cursor:
            payload["cursor"] = cursor["next_cursor"]
            payload["mode"] = cursor["mode"]
    
        applies_to_part = arguments.get("applies_to_part")
        if applies_to_part:
            payload["applies_to_part"] = applies_to_part
    
        created_by = arguments.get("created_by")
        if created_by:
            payload["created_by"] = created_by
    
        modified_by = arguments.get("modified_by")
        if modified_by:
            payload["modified_by"] = modified_by
    
        owned_by = arguments.get("owned_by")
        if owned_by:
            payload["owned_by"] = owned_by
    
        state = arguments.get("state")
        if state:
            payload["state"] = state
    
        custom_fields = arguments.get("custom_fields")
        if custom_fields:
            payload["custom_fields"] = {}
            for custom_field in custom_fields:
                payload["custom_fields"]["tnt__" + custom_field["name"]] = custom_field["value"]
    
        sla_summary = arguments.get("sla_summary")
        if sla_summary:
            payload["issue"]["sla_summary"] = {"target_time": {"type": "range", "after": sla_summary["after"], "before": sla_summary["before"]}}
        
        sort_by = arguments.get("sort_by")
        if sort_by:
            payload["sort_by"] = sort_by
    
        rev_orgs = arguments.get("rev_orgs")
        if rev_orgs and rev_orgs != []:
            if 'ticket' in type:
                payload["ticket"]["rev_org"] = rev_orgs
    
            if 'issue' in type:
                payload["issue"]["rev_orgs"] = rev_orgs
    
        subtype = arguments.get("subtype")
        if subtype:
            if 'ticket' in type:
                payload["ticket"]["subtype"] = subtype
            
            if 'issue' in type:
                payload["issue"]["subtype"] = subtype
    
        target_close_date = arguments.get("target_close_date")
        if target_close_date:
            payload["target_close_date"] = {"type": "range", "after": target_close_date["after"], "before": target_close_date["before"]}
        
        target_start_date = arguments.get("target_start_date")
        if target_start_date:
            if 'issue' in type:
                payload["issue"]["target_start_date"] = {"type": "range", "after": target_start_date["after"], "before": target_start_date["before"]}
    
        actual_close_date = arguments.get("actual_close_date")
        if actual_close_date:
            payload["actual_close_date"] = {"type": "range", "after": actual_close_date["after"], "before": actual_close_date["before"]}
    
        actual_start_date = arguments.get("actual_start_date")
        if actual_start_date:
            if 'issue' in type:
                payload["issue"]["actual_start_date"] = {"type": "range", "after": actual_start_date["after"], "before": actual_start_date["before"]}
    
        created_date = arguments.get("created_date")
        if created_date:
            payload["created_date"] = {"type": "range", "after": created_date["after"], "before": created_date["before"]}
    
        modified_date = arguments.get("modified_date")
        if modified_date:
            payload["modified_date"] = {"type": "range", "after": modified_date["after"], "before": modified_date["before"]}
    
        sprint = arguments.get("sprint")
        if sprint:
            payload["issue"]["sprint"] = sprint
    
        if payload["issue"] == {}:
            payload.pop("issue")
    
        if payload["ticket"] == {}:
            payload.pop("ticket")
    
        response = make_devrev_request(
            "works.list",
            payload
        )
    
        if response.status_code != 200:
            error_text = response.text
            return [
                types.TextContent(
                    type="text",
                    text=f"List works failed with status {response.status_code}: {error_text}"
                )
            ]
        return [
            types.TextContent(
                type="text",
                text=f"Works listed successfully: {response.json()}"
            )
        ]
  • JSON Schema defining the input parameters for the 'list_works' tool, including various filters for listing work items.
    types.Tool(
        name="list_works",
        description="List all work items (issues, tickets) in DevRev",
        inputSchema={
            "type": "object",
            "properties": {
                "type": {"type": "array", "items": {"type": "string", "enum": ["issue", "ticket"]}, "description": "The type of works to list"},
                "cursor": {
                    "type": "object",
                    "properties": {
                        "next_cursor": {"type": "string", "description": "The cursor to use for pagination. If not provided, iteration begins from the first page."},
                        "mode": {"type": "string", "enum": ["after", "before"], "description": "The mode to iterate after the cursor or before the cursor ."},
                    },
                    "required": ["next_cursor", "mode"],
                    "description": "The cursor to use for pagination. If not provided, iteration begins from the first page. In the output you get next_cursor, use it and the correct mode to get the next or previous page. You can use these to loop through all the pages."
                },
                "applies_to_part": {"type": "array", "items": {"type": "string"}, "description": "The part IDs of the works to list"},
                "created_by": {"type": "array", "items": {"type": "string"}, "description": "The user IDs of the creators of the works to list"},
                "owned_by": {"type": "array", "items": {"type": "string"}, "description": "The user IDs of the owners of the works to list"},
                "state": {"type": "array", "items": {"type": "string", "enum": ["open", "closed", "in_progress"]}, "description": "The state names of the works to list"},
                "modified_by": {"type": "array", "items": {"type": "string"}, "description": "The user IDs of the users who modified the works to list"},
                "sla_summary": {
                    "type": "object",
                    "properties": {
                        "after": {"type": "string", "description": "The start date of the SLA summary range, for example: 2025-06-03T00:00:00Z"},
                        "before": {"type": "string", "description": "The end date of the SLA summary range, for example: 2025-06-03T00:00:00Z"},
                    },
                    "required": ["after", "before"],
                    "description": "Service Level Agreement summary filter on issues to list."
                },
                "sort_by": {"type": "array", "items": {"type": "string", "enum": ["target_start_date:asc", "target_start_date:desc", "target_close_date:asc", "target_close_date:desc", "actual_start_date:asc", "actual_start_date:desc", "actual_close_date:asc", "actual_close_date:desc", "created_date:asc", "created_date:desc"]}, "description": "The field (and the order) to sort the works by, in the sequence of the array elements"},
                "rev_orgs": {"type": "array", "items": {"type": "string"}, "description": "The rev_org IDs of the customer rev_orgs filter on Issues and Tickets to list. Use this filter for issues and tickets that are related to a customer rev_org."},
                "target_close_date": {
                    "type": "object", 
                    "properties": {
                        "after": {"type": "string", "description": "The start date of the target close date range, for example: 2025-06-03T00:00:00Z"},
                        "before": {"type": "string", "description": "The end date of the target close date range, for example: 2025-06-03T00:00:00Z"},
                    }, 
                    "required": ["after", "before"]
                },
                "target_start_date": {
                    "type": "object",
                    "properties": {
                        "after": {"type": "string", "description": "The start date of the target start date range, for example: 2025-06-03T00:00:00Z"},
                        "before": {"type": "string", "description": "The end date of the target start date range, for example: 2025-06-03T00:00:00Z"},
                    }, 
                    "description": "The target start date range can only be used for issues. Do not use this field for tickets.",
                    "required": ["after", "before"]
                },
                "actual_close_date": {
                    "type": "object",
                    "properties": {
                        "after": {"type": "string", "description": "The start date of the actual close date range, for example: 2025-06-03T00:00:00Z"},
                        "before": {"type": "string", "description": "The end date of the actual close date range, for example: 2025-06-03T00:00:00Z"},
                    }, 
                    "required": ["after", "before"]
                },
                "actual_start_date": {
                    "type": "object",
                    "properties": {
                        "after": {"type": "string", "description": "The start date of the actual start date range, for example: 2025-06-03T00:00:00Z"},
                        "before": {"type": "string", "description": "The end date of the actual start date range, for example: 2025-06-03T00:00:00Z"},
                    }, 
                    "description": "The actual start date range can only be used for issues. Do not use this field for tickets.",
                    "required": ["after", "before"]
                },
                "created_date": {
                    "type": "object",
                    "properties": {
                        "after": {"type": "string", "description": "The start date of the created date range, for example: 2025-06-03T00:00:00Z"},
                        "before": {"type": "string", "description": "The end date of the created date range, for example: 2025-06-03T00:00:00Z"},
                    }, 
                    "required": ["after", "before"]
                },
                "modified_date": {
                    "type": "object",
                    "properties": {
                        "after": {"type": "string", "description": "The start date of the modified date range, for example: 2025-06-03T00:00:00Z"},
                        "before": {"type": "string", "description": "The end date of the modified date range, for example: 2025-06-03T00:00:00Z"},
                    }, 
                    "required": ["after", "before"]
                },
                "sprint": {
                    "type": "array",
                    "items": {
                        "type": "string",
                        "description": "The DevRev ID of the sprint to filter on. In DevRev a sprint is a vista group item. You will get these IDs from the response of get vista tool."
                    },
                    "description": "Use this to filter on sprints."
                },
                "custom_fields": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "name": {"type": "string", "description": "The name of the custom field. All the characters in the name should be lowercase and words separated by underscores. For example: 'custom_field_name'"},
                            "value": {"type": "array", "items": {"type": "string"}, "description": "The value of the custom field"}
                        },
                        "required": ["name", "value"]
                    },
                    "description": "Use this to filter on the custom fields, which are not present in the input schema."
                },
                "subtype": {
                    "type": "array",
                    "items": {
                        "type": "string",
                        "description": "The DevRev value of the subtype to filter on. Remember to always use the list_subtypes tool to check the correct DevRev values of subtypes."
                    },
                    "description": "Use this to filter on the subtype of the work items."
                }
            },
            "required": ["type"],
        },
    ),
  • The tool is registered by being included in the list returned by the handle_list_tools() function, decorated with @server.list_tools().
    types.Tool(
        name="list_works",
        description="List all work items (issues, tickets) in DevRev",
        inputSchema={
            "type": "object",
            "properties": {
                "type": {"type": "array", "items": {"type": "string", "enum": ["issue", "ticket"]}, "description": "The type of works to list"},
                "cursor": {
                    "type": "object",
                    "properties": {
                        "next_cursor": {"type": "string", "description": "The cursor to use for pagination. If not provided, iteration begins from the first page."},
                        "mode": {"type": "string", "enum": ["after", "before"], "description": "The mode to iterate after the cursor or before the cursor ."},
                    },
                    "required": ["next_cursor", "mode"],
                    "description": "The cursor to use for pagination. If not provided, iteration begins from the first page. In the output you get next_cursor, use it and the correct mode to get the next or previous page. You can use these to loop through all the pages."
                },
                "applies_to_part": {"type": "array", "items": {"type": "string"}, "description": "The part IDs of the works to list"},
                "created_by": {"type": "array", "items": {"type": "string"}, "description": "The user IDs of the creators of the works to list"},
                "owned_by": {"type": "array", "items": {"type": "string"}, "description": "The user IDs of the owners of the works to list"},
                "state": {"type": "array", "items": {"type": "string", "enum": ["open", "closed", "in_progress"]}, "description": "The state names of the works to list"},
                "modified_by": {"type": "array", "items": {"type": "string"}, "description": "The user IDs of the users who modified the works to list"},
                "sla_summary": {
                    "type": "object",
                    "properties": {
                        "after": {"type": "string", "description": "The start date of the SLA summary range, for example: 2025-06-03T00:00:00Z"},
                        "before": {"type": "string", "description": "The end date of the SLA summary range, for example: 2025-06-03T00:00:00Z"},
                    },
                    "required": ["after", "before"],
                    "description": "Service Level Agreement summary filter on issues to list."
                },
                "sort_by": {"type": "array", "items": {"type": "string", "enum": ["target_start_date:asc", "target_start_date:desc", "target_close_date:asc", "target_close_date:desc", "actual_start_date:asc", "actual_start_date:desc", "actual_close_date:asc", "actual_close_date:desc", "created_date:asc", "created_date:desc"]}, "description": "The field (and the order) to sort the works by, in the sequence of the array elements"},
                "rev_orgs": {"type": "array", "items": {"type": "string"}, "description": "The rev_org IDs of the customer rev_orgs filter on Issues and Tickets to list. Use this filter for issues and tickets that are related to a customer rev_org."},
                "target_close_date": {
                    "type": "object", 
                    "properties": {
                        "after": {"type": "string", "description": "The start date of the target close date range, for example: 2025-06-03T00:00:00Z"},
                        "before": {"type": "string", "description": "The end date of the target close date range, for example: 2025-06-03T00:00:00Z"},
                    }, 
                    "required": ["after", "before"]
                },
                "target_start_date": {
                    "type": "object",
                    "properties": {
                        "after": {"type": "string", "description": "The start date of the target start date range, for example: 2025-06-03T00:00:00Z"},
                        "before": {"type": "string", "description": "The end date of the target start date range, for example: 2025-06-03T00:00:00Z"},
                    }, 
                    "description": "The target start date range can only be used for issues. Do not use this field for tickets.",
                    "required": ["after", "before"]
                },
                "actual_close_date": {
                    "type": "object",
                    "properties": {
                        "after": {"type": "string", "description": "The start date of the actual close date range, for example: 2025-06-03T00:00:00Z"},
                        "before": {"type": "string", "description": "The end date of the actual close date range, for example: 2025-06-03T00:00:00Z"},
                    }, 
                    "required": ["after", "before"]
                },
                "actual_start_date": {
                    "type": "object",
                    "properties": {
                        "after": {"type": "string", "description": "The start date of the actual start date range, for example: 2025-06-03T00:00:00Z"},
                        "before": {"type": "string", "description": "The end date of the actual start date range, for example: 2025-06-03T00:00:00Z"},
                    }, 
                    "description": "The actual start date range can only be used for issues. Do not use this field for tickets.",
                    "required": ["after", "before"]
                },
                "created_date": {
                    "type": "object",
                    "properties": {
                        "after": {"type": "string", "description": "The start date of the created date range, for example: 2025-06-03T00:00:00Z"},
                        "before": {"type": "string", "description": "The end date of the created date range, for example: 2025-06-03T00:00:00Z"},
                    }, 
                    "required": ["after", "before"]
                },
                "modified_date": {
                    "type": "object",
                    "properties": {
                        "after": {"type": "string", "description": "The start date of the modified date range, for example: 2025-06-03T00:00:00Z"},
                        "before": {"type": "string", "description": "The end date of the modified date range, for example: 2025-06-03T00:00:00Z"},
                    }, 
                    "required": ["after", "before"]
                },
                "sprint": {
                    "type": "array",
                    "items": {
                        "type": "string",
                        "description": "The DevRev ID of the sprint to filter on. In DevRev a sprint is a vista group item. You will get these IDs from the response of get vista tool."
                    },
                    "description": "Use this to filter on sprints."
                },
                "custom_fields": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "name": {"type": "string", "description": "The name of the custom field. All the characters in the name should be lowercase and words separated by underscores. For example: 'custom_field_name'"},
                            "value": {"type": "array", "items": {"type": "string"}, "description": "The value of the custom field"}
                        },
                        "required": ["name", "value"]
                    },
                    "description": "Use this to filter on the custom fields, which are not present in the input schema."
                },
                "subtype": {
                    "type": "array",
                    "items": {
                        "type": "string",
                        "description": "The DevRev value of the subtype to filter on. Remember to always use the list_subtypes tool to check the correct DevRev values of subtypes."
                    },
                    "description": "Use this to filter on the subtype of the work items."
                }
            },
            "required": ["type"],
        },
    ),
  • Utility function used by the handler to make authenticated POST requests to the DevRev API.
    def make_devrev_request(endpoint: str, payload: Dict[str, Any]) -> requests.Response:
        """
        Make an authenticated request to the DevRev API.
        
        Args:
            endpoint: The API endpoint path (e.g., "works.get" or "search.hybrid")
            payload: The JSON payload to send
        
        Returns:
            requests.Response object
        
        Raises:
            ValueError: If DEVREV_API_KEY environment variable is not set
        """
        api_key = os.environ.get("DEVREV_API_KEY")
        if not api_key:
            raise ValueError("DEVREV_API_KEY environment variable is not set")
    
        headers = {
            "Authorization": f"{api_key}",
            "Content-Type": "application/json",
        }
        
        return requests.post(
            f"https://api.devrev.ai/{endpoint}",
            headers=headers,
            json=payload
        ) 
Behavior2/5

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

With no annotations provided, the description carries full burden for behavioral disclosure but only states the basic action. It doesn't mention pagination behavior (though hinted in schema), rate limits, authentication requirements, or what the output looks like. For a complex list tool with 19 parameters, this is inadequate.

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, efficient sentence that states the core purpose without unnecessary words. It's appropriately sized and front-loaded, with every word earning its place.

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 tool's complexity (19 parameters, no output schema, no annotations), the description is insufficient. It doesn't explain the filtering capabilities, pagination behavior, or return format, leaving significant gaps for the agent to understand how to effectively use this tool.

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?

Schema description coverage is 79%, which is high, so the baseline is 3. The description adds no parameter-specific information beyond what's in the schema, so it doesn't compensate for the 21% coverage gap but doesn't degrade from the baseline either.

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

Purpose4/5

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

The description clearly states the verb ('List') and resource ('all work items (issues, tickets) in DevRev'), providing a specific purpose. However, it doesn't distinguish this tool from potential sibling list/search tools (like 'search' or 'list_parts'), which prevents a perfect score.

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?

The description provides no guidance on when to use this tool versus alternatives like 'search' or 'get_work'. There's no mention of prerequisites, limitations, or typical use cases, leaving the agent without contextual usage information.

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/devrev/mcp-server'

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