Skip to main content
Glama
yuezheng2006

Personal JIRA MCP

by yuezheng2006

search_issues

Search JIRA issues using JQL queries to find specific work items, filter results, and retrieve detailed information for project management.

Instructions

搜索JIRA问题列表

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
jqlYes
max_resultsNo
start_atNo

Implementation Reference

  • The primary handler for the 'search_issues' MCP tool. Registered via @mcp.tool decorator with description. Takes JQL query, max_results, and start_at parameters. Uses JIRA client to search issues, formats them with format_issue helper, and returns a dictionary with total count and list of issues.
    @mcp.tool(
        description="搜索JIRA问题列表",
    )
    def search_issues(
        jql: str,
        max_results: int = 50,
        start_at: int = 0
    ) -> Dict[str, Any]:
        """搜索JIRA问题.
        
        Args:
            jql: JQL查询字符串
            max_results: 最大返回结果数
            start_at: 起始索引
        
        Returns:
            Dict[str, Any]: 搜索结果
        """
        logger.info(f"搜索问题: JQL={jql}, max_results={max_results}, start_at={start_at}")
        try:
            client = get_jira_client()
            issues = client.search_issues(jql_str=jql, maxResults=max_results, startAt=start_at)
            
            return {
                "total": issues.total,
                "issues": [format_issue(issue) for issue in issues],
                "start_at": start_at,
                "max_results": max_results,
            }
        except Exception as e:
            logger.error(f"搜索问题失败: {str(e)}")
            return {"error": str(e)}
  • Helper function used by search_issues to convert raw JIRA issue objects into structured JSON-friendly dictionaries, including fields like summary, status, project, assignee, attachments, and custom fields.
    def format_issue(issue) -> Dict[str, Any]:
        """格式化JIRA问题为JSON友好格式."""
        fields = issue.fields
        
        result = {
            "id": issue.id,
            "key": issue.key,
            "self": issue.self,
            "summary": fields.summary,
            "description": fields.description or "",
            "status": {
                "id": fields.status.id,
                "name": fields.status.name,
                "description": fields.status.description,
            },
            "project": {
                "id": fields.project.id,
                "key": fields.project.key,
                "name": fields.project.name,
            },
            "created": fields.created,
            "updated": fields.updated,
        }
        
        # 添加可选字段
        if hasattr(fields, "assignee") and fields.assignee:
            result["assignee"] = {
                "name": fields.assignee.name,
                "display_name": fields.assignee.displayName,
                "email": getattr(fields.assignee, "emailAddress", ""),
            }
        
        if hasattr(fields, "reporter") and fields.reporter:
            result["reporter"] = {
                "name": fields.reporter.name,
                "display_name": fields.reporter.displayName,
                "email": getattr(fields.reporter, "emailAddress", ""),
            }
        
        if hasattr(fields, "issuetype") and fields.issuetype:
            result["issue_type"] = {
                "id": fields.issuetype.id,
                "name": fields.issuetype.name,
                "description": fields.issuetype.description,
            }
        
        if hasattr(fields, "priority") and fields.priority:
            result["priority"] = {
                "id": fields.priority.id,
                "name": fields.priority.name,
            }
        
        if hasattr(fields, "components") and fields.components:
            result["components"] = [
                {"id": c.id, "name": c.name} for c in fields.components
            ]
        
        if hasattr(fields, "labels") and fields.labels:
            result["labels"] = fields.labels
        
        # 处理附件 - JIRA API 使用 "attachment" 字段
        if hasattr(fields, "attachment") and fields.attachment:
            result["attachments"] = [
                {
                    "id": attachment.id,
                    "filename": attachment.filename,
                    "size": attachment.size,
                    "content_type": attachment.mimeType,
                    "created": attachment.created,
                    "url": attachment.content
                }
                for attachment in fields.attachment
            ]
        
        # 获取自定义字段
        for field_name in dir(fields):
            if field_name.startswith("customfield_"):
                value = getattr(fields, field_name)
                if value is not None:
                    result[field_name] = value
        
        return result
  • Helper function for lazy initialization and retrieval of the global JIRA client instance, used by search_issues to perform the actual API calls.
    def get_jira_client() -> JIRA:
        """获取JIRA客户端实例."""
        global jira_client
        if jira_client is None:
            auth = get_jira_auth()
            jira_client = JIRA(server=jira_settings.server_url, basic_auth=auth)
        return jira_client

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

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