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
-[](https://github.com/openSUSE/mcp-bugzilla/actions/workflows/tests.yml)
+[](https://github.com/openSUSE/mcp-bugzilla/actions/workflows/checks.yml)
+[](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
-[](https://github.com/openSUSE/mcp-bugzilla/actions/workflows/tests.yml)
+[](https://github.com/openSUSE/mcp-bugzilla/actions/workflows/checks.yml)
+[](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.