Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-bugzilla-mcp for 
openSUSE:Factory checked in at 2026-06-23 17:43:28
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-bugzilla-mcp (Old)
 and      /work/SRC/openSUSE:Factory/.python-bugzilla-mcp.new.1956 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-bugzilla-mcp"

Tue Jun 23 17:43:28 2026 rev:2 rq:1361364 version:0.15.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-bugzilla-mcp/python-bugzilla-mcp.changes  
2026-06-19 17:39:42.087904829 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-bugzilla-mcp.new.1956/python-bugzilla-mcp.changes
        2026-06-23 17:46:12.013455064 +0200
@@ -1,0 +2,5 @@
+Tue Jun 23 10:37:18 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to version 0.15.1
+
+-------------------------------------------------------------------

Old:
----
  mcp_bugzilla-0.14.0.tar.gz

New:
----
  mcp_bugzilla-0.15.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-bugzilla-mcp.spec ++++++
--- /var/tmp/diff_new_pack.uaW7v2/_old  2026-06-23 17:46:12.689478632 +0200
+++ /var/tmp/diff_new_pack.uaW7v2/_new  2026-06-23 17:46:12.693478772 +0200
@@ -19,13 +19,13 @@
 # upstream requires Python >= 3.13
 %define pythons python313
 Name:           python-bugzilla-mcp
-Version:        0.14.0
+Version:        0.15.1
 Release:        0
 Summary:        Model Context Protocol server for Bugzilla
 License:        Apache-2.0
 URL:            https://github.com/mcp-bugzilla/mcp-bugzilla
 Source:         
https://files.pythonhosted.org/packages/source/m/mcp-bugzilla/mcp_bugzilla-%{version}.tar.gz
-BuildRequires:  %{python_module fastmcp >= 3.4.0}
+BuildRequires:  %{python_module fastmcp >= 3.4.2}
 BuildRequires:  %{python_module httpx-retries >= 0.5.0}
 BuildRequires:  %{python_module pip}
 BuildRequires:  %{python_module uv-build}
@@ -34,7 +34,7 @@
 BuildRequires:  python-rpm-macros
 Requires(post): update-alternatives
 Requires(postun): update-alternatives
-Requires:       python-fastmcp >= 3.4.0
+Requires:       python-fastmcp >= 3.4.2
 Requires:       python-httpx-retries >= 0.5.0
 BuildArch:      noarch
 %python_subpackages

++++++ mcp_bugzilla-0.14.0.tar.gz -> mcp_bugzilla-0.15.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mcp_bugzilla-0.14.0/PKG-INFO 
new/mcp_bugzilla-0.15.1/PKG-INFO
--- old/mcp_bugzilla-0.14.0/PKG-INFO    1970-01-01 01:00:00.000000000 +0100
+++ new/mcp_bugzilla-0.15.1/PKG-INFO    1970-01-01 01:00:00.000000000 +0100
@@ -1,8 +1,8 @@
 Metadata-Version: 2.3
 Name: mcp-bugzilla
-Version: 0.14.0
+Version: 0.15.1
 Summary: MCP server for Bugzilla
-Requires-Dist: fastmcp==3.4.0
+Requires-Dist: fastmcp==3.4.2
 Requires-Dist: httpx-retries>=0.5.0
 Requires-Dist: pytest ; extra == 'dev'
 Requires-Dist: pytest-asyncio ; extra == 'dev'
@@ -13,7 +13,8 @@
 
 # Bugzilla Model Context Protocol (MCP) Server
 
-[![Tests](https://github.com/openSUSE/mcp-bugzilla/actions/workflows/tests.yml/badge.svg)](https://github.com/openSUSE/mcp-bugzilla/actions/workflows/tests.yml)
+[![checks](https://github.com/openSUSE/mcp-bugzilla/actions/workflows/checks.yml/badge.svg)](https://github.com/openSUSE/mcp-bugzilla/actions/workflows/checks.yml)
+[![release](https://github.com/openSUSE/mcp-bugzilla/actions/workflows/release.yml/badge.svg)](https://github.com/openSUSE/mcp-bugzilla/actions/workflows/release.yml)
 
 A robust MCP server that provides seamless interaction with Bugzilla instances 
through the Model Context Protocol. This server exposes a comprehensive set of 
tools and prompts, enabling AI models and other MCP clients to efficiently 
query bug information, manage comments, and leverage Bugzilla's powerful 
quicksearch capabilities.
 
@@ -119,6 +120,31 @@
   + **Returns**: A dictionary containing the updated bug fields including 
status `CLOSED`, resolution `DUPLICATE`, and `dupe_of` reference
   + **Example**: `mark_as_duplicate(12345, 789012, comment="Same root cause as 
the original report")`
 
+* **`create_bug(product, component, summary, version, description, 
op_sys="All", platform="All", priority=None, severity=None, cc=None, 
custom_fields=None)`**: Files a new bug.
+
+  + **Parameters**:
+    - `product`, `component`, `summary`, `version`, `description`: Required 
core fields
+    - `op_sys`, `platform`: Default to `All`
+    - `priority`, `severity`: Optional, instance-specific values
+    - `cc`: Optional list of email addresses to CC
+    - `custom_fields`: Optional dict of extra/custom fields (e.g. 
`{"cf_fixed_in": "1.2.3"}`)
+  + **Returns**: A dictionary with the new bug `id`. If the Bugzilla instance 
mandates additional fields, its error message is surfaced so you can retry with 
them.
+  + **Example**: `create_bug("MyProduct", "general", "App crashes on launch", 
"unspecified", "Steps to reproduce: ...")`
+
+* **`add_attachment(bug_id, file_name, summary, data, 
content_type="text/plain", is_patch=False, is_private=False, comment="")`**: 
Attaches a file to a bug.
+
+  + **Parameters**:
+    - `bug_id`: The bug to attach to
+    - `file_name`: File name shown in Bugzilla
+    - `summary`: Short description of the attachment
+    - `data`: The attachment content, **base64-encoded**
+    - `content_type`: MIME type (ignored when `is_patch=True`)
+    - `is_patch`: Mark the attachment as a patch
+    - `is_private`: Restrict to the insider group
+    - `comment`: Optional comment added alongside the attachment
+  + **Returns**: A dictionary with the created attachment `ids`
+  + **Example**: `add_attachment(12345, "crash.log", "Crash log", "aGVsbG8=", 
content_type="text/plain")`
+
 #### Bug Search
 
 - **`bugs_quicksearch(query: str, status: str = "ALL", include_fields: str = 
"...", limit: int = 50, offset: int = 0)`**: Executes a search for bugs using 
Bugzilla's powerful [quicksearch 
syntax](https://bugzilla.readthedocs.io/en/latest/using/finding.html#quicksearch).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mcp_bugzilla-0.14.0/README.md 
new/mcp_bugzilla-0.15.1/README.md
--- old/mcp_bugzilla-0.14.0/README.md   1970-01-01 01:00:00.000000000 +0100
+++ new/mcp_bugzilla-0.15.1/README.md   1970-01-01 01:00:00.000000000 +0100
@@ -1,6 +1,7 @@
 # Bugzilla Model Context Protocol (MCP) Server
 
-[![Tests](https://github.com/openSUSE/mcp-bugzilla/actions/workflows/tests.yml/badge.svg)](https://github.com/openSUSE/mcp-bugzilla/actions/workflows/tests.yml)
+[![checks](https://github.com/openSUSE/mcp-bugzilla/actions/workflows/checks.yml/badge.svg)](https://github.com/openSUSE/mcp-bugzilla/actions/workflows/checks.yml)
+[![release](https://github.com/openSUSE/mcp-bugzilla/actions/workflows/release.yml/badge.svg)](https://github.com/openSUSE/mcp-bugzilla/actions/workflows/release.yml)
 
 A robust MCP server that provides seamless interaction with Bugzilla instances 
through the Model Context Protocol. This server exposes a comprehensive set of 
tools and prompts, enabling AI models and other MCP clients to efficiently 
query bug information, manage comments, and leverage Bugzilla's powerful 
quicksearch capabilities.
 
@@ -106,6 +107,31 @@
   + **Returns**: A dictionary containing the updated bug fields including 
status `CLOSED`, resolution `DUPLICATE`, and `dupe_of` reference
   + **Example**: `mark_as_duplicate(12345, 789012, comment="Same root cause as 
the original report")`
 
+* **`create_bug(product, component, summary, version, description, 
op_sys="All", platform="All", priority=None, severity=None, cc=None, 
custom_fields=None)`**: Files a new bug.
+
+  + **Parameters**:
+    - `product`, `component`, `summary`, `version`, `description`: Required 
core fields
+    - `op_sys`, `platform`: Default to `All`
+    - `priority`, `severity`: Optional, instance-specific values
+    - `cc`: Optional list of email addresses to CC
+    - `custom_fields`: Optional dict of extra/custom fields (e.g. 
`{"cf_fixed_in": "1.2.3"}`)
+  + **Returns**: A dictionary with the new bug `id`. If the Bugzilla instance 
mandates additional fields, its error message is surfaced so you can retry with 
them.
+  + **Example**: `create_bug("MyProduct", "general", "App crashes on launch", 
"unspecified", "Steps to reproduce: ...")`
+
+* **`add_attachment(bug_id, file_name, summary, data, 
content_type="text/plain", is_patch=False, is_private=False, comment="")`**: 
Attaches a file to a bug.
+
+  + **Parameters**:
+    - `bug_id`: The bug to attach to
+    - `file_name`: File name shown in Bugzilla
+    - `summary`: Short description of the attachment
+    - `data`: The attachment content, **base64-encoded**
+    - `content_type`: MIME type (ignored when `is_patch=True`)
+    - `is_patch`: Mark the attachment as a patch
+    - `is_private`: Restrict to the insider group
+    - `comment`: Optional comment added alongside the attachment
+  + **Returns**: A dictionary with the created attachment `ids`
+  + **Example**: `add_attachment(12345, "crash.log", "Crash log", "aGVsbG8=", 
content_type="text/plain")`
+
 #### Bug Search
 
 - **`bugs_quicksearch(query: str, status: str = "ALL", include_fields: str = 
"...", limit: int = 50, offset: int = 0)`**: Executes a search for bugs using 
Bugzilla's powerful [quicksearch 
syntax](https://bugzilla.readthedocs.io/en/latest/using/finding.html#quicksearch).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mcp_bugzilla-0.14.0/pyproject.toml 
new/mcp_bugzilla-0.15.1/pyproject.toml
--- old/mcp_bugzilla-0.14.0/pyproject.toml      1970-01-01 01:00:00.000000000 
+0100
+++ new/mcp_bugzilla-0.15.1/pyproject.toml      1970-01-01 01:00:00.000000000 
+0100
@@ -1,12 +1,12 @@
 [project]
 name = "mcp-bugzilla"
-version = "0.14.0"
+version = "0.15.1"
 description = "MCP server for Bugzilla"
 readme = "README.md"
 requires-python = ">=3.13"
 
 dependencies = [
-    "fastmcp==3.4.0",
+    "fastmcp==3.4.2",
     "httpx-retries>=0.5.0",
 ]
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mcp_bugzilla-0.14.0/src/mcp_bugzilla/mcp_utils.py 
new/mcp_bugzilla-0.15.1/src/mcp_bugzilla/mcp_utils.py
--- old/mcp_bugzilla-0.14.0/src/mcp_bugzilla/mcp_utils.py       1970-01-01 
01:00:00.000000000 +0100
+++ new/mcp_bugzilla-0.15.1/src/mcp_bugzilla/mcp_utils.py       1970-01-01 
01:00:00.000000000 +0100
@@ -322,3 +322,57 @@
         mcp_log.info("[BZ-RES] Bug updated successfully")
         mcp_log.debug(f"[BZ-RES] {data}")
         return data
+
+    async def create_bug(self, fields: dict[str, Any]) -> dict[str, Any]:
+        """Create a new bug from the given field mapping.
+
+        Bugzilla requires at least product, component, summary, version and
+        description; instances may mandate more. The raw Bugzilla error (e.g.
+        a missing required field) is surfaced to the caller.
+        """
+        url = "/bug"
+        mcp_log.info(f"[BZ-REQ] POST {self.api_url}{url} json={fields}")
+
+        try:
+            r = await self.client.post(url, json=fields)
+            r.raise_for_status()
+        except httpx.HTTPStatusError as e:
+            mcp_log.error(
+                f"[BZ-RES] Failed: {e.response.status_code} {e.response.text}"
+            )
+            raise
+        except httpx.RequestError as e:
+            mcp_log.error(f"[BZ-RES] Network Error: {e}")
+            raise
+
+        data = r.json()
+        mcp_log.info(f"[BZ-RES] Created bug {data.get('id')}")
+        mcp_log.debug(f"[BZ-RES] {data}")
+        return data
+
+    async def add_attachment(
+        self, bug_id: int, payload: dict[str, Any]
+    ) -> dict[str, Any]:
+        """Attach a file to a bug. ``payload['data']`` is base64-encoded."""
+        url = f"/bug/{bug_id}/attachment"
+        # Don't log the (possibly large / binary) base64 blob.
+        mcp_log.info(
+            f"[BZ-REQ] POST {self.api_url}{url} 
file_name={payload.get('file_name')!r}"
+        )
+
+        try:
+            r = await self.client.post(url, json=payload)
+            r.raise_for_status()
+        except httpx.HTTPStatusError as e:
+            mcp_log.error(
+                f"[BZ-RES] Failed: {e.response.status_code} {e.response.text}"
+            )
+            raise
+        except httpx.RequestError as e:
+            mcp_log.error(f"[BZ-RES] Network Error: {e}")
+            raise
+
+        data = r.json()
+        mcp_log.info(f"[BZ-RES] Attachment(s) {data.get('ids')} added to bug 
{bug_id}")
+        mcp_log.debug(f"[BZ-RES] {data}")
+        return data
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mcp_bugzilla-0.14.0/src/mcp_bugzilla/server.py 
new/mcp_bugzilla-0.15.1/src/mcp_bugzilla/server.py
--- old/mcp_bugzilla-0.14.0/src/mcp_bugzilla/server.py  1970-01-01 
01:00:00.000000000 +0100
+++ new/mcp_bugzilla-0.15.1/src/mcp_bugzilla/server.py  1970-01-01 
01:00:00.000000000 +0100
@@ -520,6 +520,130 @@
         raise ToolError(f"Failed to mark as duplicate\n{e}")
 
 
[email protected](
+    annotations={
+        "readOnlyHint": False,
+        "destructiveHint": False,
+        "openWorldHint": True,
+    },
+    tags={"write"},
+)
+async def create_bug(
+    product: str,
+    component: str,
+    summary: str,
+    version: str,
+    description: str,
+    op_sys: str = "All",
+    platform: str = "All",
+    priority: Optional[str] = None,
+    severity: Optional[str] = None,
+    cc: Optional[list[str]] = None,
+    custom_fields: Optional[dict[str, Any]] = None,
+    bz: Bugzilla = Depends(get_bz),
+) -> dict[str, Any]:
+    """Create a new bug. Returns the new bug id on success.
+
+    Required fields: product, component, summary, version, description. Some
+    Bugzilla instances mandate additional fields; the raw Bugzilla error is
+    surfaced when that happens (inspect it and retry with the missing field).
+
+    Args:
+        product: Product the bug is filed against
+        component: Component within the product
+        summary: One-line bug summary
+        version: Affected product version (e.g. "unspecified")
+        description: Initial bug description (the first comment)
+        op_sys: Operating system (default "All")
+        platform: Hardware platform (default "All")
+        priority: Optional priority (e.g. P1..P5 / high..low, 
instance-specific)
+        severity: Optional severity (e.g. critical, normal, minor)
+        cc: Optional list of email addresses to CC
+        custom_fields: Optional dict of extra/custom fields, e.g. {"cf_foo": 
"bar"}
+    """
+    mcp_log.info(
+        f"[LLM-REQ] create_bug(product={product!r}, component={component!r}, "
+        f"summary={summary!r}, version={version!r})"
+    )
+
+    fields: dict[str, Any] = {
+        "product": product,
+        "component": component,
+        "summary": summary,
+        "version": version,
+        "description": description,
+        "op_sys": op_sys,
+        "platform": platform,
+    }
+    if priority:
+        fields["priority"] = priority
+    if severity:
+        fields["severity"] = severity
+    if cc:
+        fields["cc"] = cc
+    if custom_fields:
+        fields.update(custom_fields)
+
+    try:
+        return await bz.create_bug(fields)
+    except Exception as e:
+        raise ToolError(f"Failed to create bug\n{e}")
+
+
[email protected](
+    annotations={
+        "readOnlyHint": False,
+        "destructiveHint": False,
+        "openWorldHint": True,
+    },
+    tags={"write"},
+)
+async def add_attachment(
+    bug_id: int,
+    file_name: str,
+    summary: str,
+    data: str,
+    content_type: str = "text/plain",
+    is_patch: bool = False,
+    is_private: bool = False,
+    comment: str = "",
+    bz: Bugzilla = Depends(get_bz),
+) -> dict[str, Any]:
+    """Attach a file to a bug. Returns the created attachment id(s).
+
+    Args:
+        bug_id: Bug to attach the file to
+        file_name: File name shown in Bugzilla
+        summary: Short description of the attachment
+        data: The attachment content, **base64-encoded** (binary-safe)
+        content_type: MIME type (ignored by Bugzilla when is_patch=True)
+        is_patch: Mark the attachment as a patch
+        is_private: Restrict the attachment to the insider group
+        comment: Optional comment to add alongside the attachment
+    """
+    mcp_log.info(
+        f"[LLM-REQ] add_attachment(bug_id={bug_id}, file_name={file_name!r}, "
+        f"is_patch={is_patch}, is_private={is_private})"
+    )
+
+    payload: dict[str, Any] = {
+        "ids": [bug_id],
+        "file_name": file_name,
+        "summary": summary,
+        "data": data,
+        "content_type": content_type,
+        "is_patch": is_patch,
+        "is_private": is_private,
+    }
+    if comment:
+        payload["comment"] = comment
+
+    try:
+        return await bz.add_attachment(bug_id, payload)
+    except Exception as e:
+        raise ToolError(f"Failed to add attachment\n{e}")
+
+
 def disable_components_selectively():
     """
     Disables MCP components based on environment variables.

Reply via email to