backlog-mcp 1.0.4__tar.gz → 1.0.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/PKG-INFO +1 -1
  2. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/app/main.py +1 -0
  3. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/app/tools/__init__.py +1 -0
  4. backlog_mcp-1.0.5/app/tools/update_issue_description.py +31 -0
  5. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/app/utils/ultils.py +53 -0
  6. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/pyproject.toml +1 -1
  7. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/uv.lock +1 -1
  8. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/.env.example +0 -0
  9. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/.gitignore +0 -0
  10. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/.mise.toml +0 -0
  11. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/README.md +0 -0
  12. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/app/__init__.py +0 -0
  13. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/app/constants/__init__.py +0 -0
  14. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/app/constants/constants.py +0 -0
  15. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/app/core/__init__.py +0 -0
  16. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/app/logging_config.py +0 -0
  17. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/app/models/__init__.py +0 -0
  18. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/app/models/models.py +0 -0
  19. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/app/server_settings.py +0 -0
  20. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/app/tools/get_issue_details.py +0 -0
  21. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/app/tools/get_user_issue_list.py +0 -0
  22. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/app/utils/__init__.py +0 -0
  23. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/app/utils/di.py +0 -0
  24. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/docs/mcp-installer-template.md +0 -0
  25. {backlog_mcp-1.0.4 → backlog_mcp-1.0.5}/scripts/install-backlog-mcp.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: backlog-mcp
3
- Version: 1.0.4
3
+ Version: 1.0.5
4
4
  Summary: A Model Context Protocol (MCP) server for Backlog project management integration
5
5
  Author-email: BaoNguyen <baonguyen@teqnological.asia>
6
6
  Requires-Python: <3.14,>=3.13
@@ -11,6 +11,7 @@ app = FastMCP(
11
11
  # Add tool for Backlog MCP
12
12
  app.add_tool(get_issue_details)
13
13
  app.add_tool(get_user_issue_list)
14
+ app.add_tool(update_issue_description)
14
15
 
15
16
 
16
17
  def main() -> int:
@@ -1,2 +1,3 @@
1
1
  from .get_issue_details import *
2
2
  from .get_user_issue_list import *
3
+ from .update_issue_description import *
@@ -0,0 +1,31 @@
1
+ from app.utils.di import create_backlog_context
2
+ from app.utils.ultils import update_issue_description_handler
3
+
4
+
5
+ async def update_issue_description(
6
+ issue_key: str,
7
+ description: str,
8
+ ):
9
+ """
10
+ Update the description of a Backlog issue.
11
+
12
+ Args:
13
+ issue_key (str): The key or ID of the Backlog issue to update.
14
+ description (str): The new description content for the issue.
15
+ """
16
+ try:
17
+ if not issue_key:
18
+ raise ValueError("Please provide an issue key.")
19
+ if not description:
20
+ raise ValueError("Please provide a description.")
21
+
22
+ ctx = create_backlog_context()
23
+ result = await update_issue_description_handler(
24
+ backlog_domain=ctx.backlog_domain,
25
+ api_key=ctx.api_key,
26
+ issue_key=issue_key,
27
+ description=description,
28
+ )
29
+ return result
30
+ except Exception as e:
31
+ raise e
@@ -300,3 +300,56 @@ async def get_current_user(backlog_domain: str, api_key: str) -> dict:
300
300
  raise ValueError(f"Failed to get current user: {e}") from e
301
301
  except Exception as e:
302
302
  raise ValueError(f"Unexpected error while getting current user: {e}") from e
303
+
304
+
305
+ async def update_issue_description_handler(
306
+ backlog_domain: str,
307
+ api_key: str,
308
+ issue_key: str,
309
+ description: str,
310
+ ):
311
+ """Update issue description via Backlog API.
312
+
313
+ Args:
314
+ backlog_domain (str): Backlog domain URL
315
+ api_key (str): API key for authentication
316
+ issue_key (str): Issue key or ID
317
+ description (str): New description content
318
+
319
+ Returns:
320
+ dict: Updated issue information
321
+ """
322
+ try:
323
+ url = f"{backlog_domain}api/v2/issues/{issue_key}"
324
+ params = {"apiKey": api_key}
325
+ data = {"description": description}
326
+
327
+ async with httpx.AsyncClient() as client:
328
+ response = await client.patch(
329
+ url,
330
+ params=params,
331
+ data=data,
332
+ headers={"Content-Type": "application/x-www-form-urlencoded"},
333
+ timeout=10.0
334
+ )
335
+ response.raise_for_status()
336
+ result = response.json()
337
+
338
+ result = {
339
+ "issueKey": result["issueKey"],
340
+ "summary": result["summary"],
341
+ "description": result["description"]
342
+ }
343
+
344
+ return result
345
+ except httpx.HTTPStatusError as e:
346
+ try:
347
+ body = e.response.json()
348
+ error_code = None
349
+ if "errors" in body and body["errors"]:
350
+ error_code = body["errors"][0].get("code")
351
+ raise ValueError(f"API error: {BacklogApiError.get_description_by_code(error_code)}") from e
352
+ except Exception:
353
+ raise ValueError("Failed to parse error response") from e
354
+ except Exception as e:
355
+ raise ValueError(f"Request failed: {str(e)}") from e
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "backlog-mcp"
3
- version = "1.0.4"
3
+ version = "1.0.5"
4
4
  description = "A Model Context Protocol (MCP) server for Backlog project management integration"
5
5
  authors = [{name = "BaoNguyen", email = "baonguyen@teqnological.asia"}]
6
6
  readme = "README.md"
@@ -34,7 +34,7 @@ wheels = [
34
34
 
35
35
  [[package]]
36
36
  name = "backlog-mcp"
37
- version = "1.0.3"
37
+ version = "1.0.4"
38
38
  source = { editable = "." }
39
39
  dependencies = [
40
40
  { name = "httpx" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes