Skip to main content
Glama

get_attachment_by_filename

Retrieve a specific JIRA attachment by providing an issue key and filename. Optionally save the attachment directly to disk for easy access.

Instructions

根据问题ID和文件名获取JIRA附件

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
filenameYes
issue_keyYes
save_to_diskNo

Implementation Reference

  • The primary MCP tool handler for 'get_attachment_by_filename'. It retrieves a JIRA attachment by issue key and filename using the REST API, downloads the content, handles encoding based on MIME type (base64 for binary/images, text for text files), optionally saves to local disk, and returns structured data.
    @mcp.tool( description="根据问题ID和文件名获取JIRA附件", ) def get_attachment_by_filename( issue_key: str, filename: str, save_to_disk: bool = True, ) -> Dict[str, Any]: """根据问题ID和文件名获取JIRA附件. Args: issue_key: JIRA问题键 filename: 附件文件名 save_to_disk: 是否保存到本地磁盘 Returns: Dict[str, Any]: 附件内容 """ logger.info(f"根据文件名获取附件: issue={issue_key}, filename={filename}") try: # 使用JIRA REST API直接获取问题附件 client = get_jira_client() # 获取问题详情 issue_url = f"{jira_settings.server_url}/rest/api/2/issue/{issue_key}" response = client._session.get(issue_url) if response.status_code != 200: return {"error": f"获取问题失败: {response.text}"} issue_data = response.json() # 检查附件 attachments = issue_data.get("fields", {}).get("attachment", []) if not attachments: return {"error": f"问题 {issue_key} 没有附件"} # 查找指定文件名的附件 attachment = None for att in attachments: if att.get("filename") == filename: attachment = att break if not attachment: return {"error": f"未找到名为 {filename} 的附件"} # 获取附件内容 attachment_url = attachment.get("content") if not attachment_url: return {"error": "附件URL不存在"} # 下载附件 response = client._session.get(attachment_url) if response.status_code != 200: return {"error": f"下载附件失败: {response.text}"} content = response.content mime_type = attachment.get("mimeType", "application/octet-stream") result = { "id": attachment.get("id"), "filename": filename, "size": len(content), "content_type": mime_type, "created": attachment.get("created"), } # 如果要保存到磁盘 if save_to_disk: file_path = get_attachment_path(issue_key, filename) with open(file_path, "wb") as f: f.write(content) result["local_path"] = file_path # 处理不同的内容类型 if mime_type.startswith("image/"): # 对于图片,返回Base64编码 result["content"] = base64.b64encode(content).decode('utf-8') result["encoding"] = "base64" elif mime_type.startswith("text/"): # 对于文本文件,直接返回文本内容 try: result["content"] = content.decode('utf-8') result["encoding"] = "text" except UnicodeDecodeError: # 如果解码失败,回退到Base64 result["content"] = base64.b64encode(content).decode('utf-8') result["encoding"] = "base64" else: # 对于其他类型,返回Base64编码 result["content"] = base64.b64encode(content).decode('utf-8') result["encoding"] = "base64" return result except Exception as e: logger.error(f"获取问题 {issue_key} 的附件 {filename} 失败: {str(e)}") return {"error": str(e)}
  • Helper function used by the tool to determine the local filesystem path for saving attachments, creating directories as needed.
    def get_attachment_path(issue_key: str, filename: str) -> str: """获取附件在本地文件系统中的保存路径.""" # 创建问题专属目录 issue_dir = os.path.join(ATTACHMENTS_DIR, issue_key) os.makedirs(issue_dir, exist_ok=True) return os.path.join(issue_dir, filename)
  • Helper function to lazily initialize and return the global JIRA client instance used by the tool.
    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
  • The @mcp.tool decorator registers this function as an MCP tool with the given description.
    @mcp.tool( description="根据问题ID和文件名获取JIRA附件", )

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