Skip to main content
Glama
yuezheng2006

Personal JIRA MCP

by yuezheng2006

create_issue

Create JIRA issues directly from AI assistants by specifying project key, summary, and optional details like description, issue type, and assignee.

Instructions

创建JIRA问题

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
project_keyYes
summaryYes
descriptionNo
issue_typeNoTask
priorityNo
assigneeNo
labelsNo

Implementation Reference

  • The create_issue tool handler, registered via @mcp.tool decorator. Constructs JIRA issue fields based on input parameters and uses the JIRA client to create the issue, then formats and returns the result.
    @mcp.tool(
        description="创建JIRA问题",
    )
    def create_issue(
        project_key: str,
        summary: str,
        description: str = "",
        issue_type: str = "Task",
        priority: Optional[str] = None,
        assignee: Optional[str] = None,
        labels: Optional[List[str]] = None,
    ) -> Dict[str, Any]:
        """创建JIRA问题.
        
        Args:
            project_key: 项目键
            summary: 问题概要
            description: 问题描述
            issue_type: 问题类型
            priority: 优先级
            assignee: 经办人
            labels: 标签列表
        
        Returns:
            Dict[str, Any]: 创建的问题详情
        """
        logger.info(f"创建问题: project={project_key}, summary={summary}")
        
        try:
            # 构建问题字段
            fields = {
                "project": {"key": project_key},
                "summary": summary,
                "issuetype": {"name": issue_type},
            }
            
            if description:
                fields["description"] = description
                
            if priority:
                fields["priority"] = {"name": priority}
                
            if assignee:
                fields["assignee"] = {"name": assignee}
                
            if labels:
                fields["labels"] = labels
            
            # 创建问题
            client = get_jira_client()
            issue = client.create_issue(fields=fields)
            return format_issue(issue)
        except Exception as e:
            logger.error(f"创建问题失败: {str(e)}")
            return {"error": str(e)}
  • Helper function used by create_issue to format the created JIRA issue into a JSON-friendly dictionary, including various fields like status, project, assignee, attachments, etc.
    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 to lazily initialize and return the JIRA client instance, used in create_issue.
    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