fenix-mcp 1.8.0__py3-none-any.whl → 1.9.0__py3-none-any.whl

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.
fenix_mcp/__init__.py CHANGED
@@ -8,4 +8,4 @@ Fênix Cloud MCP Server (Python edition).
8
8
  __all__ = ["__version__"]
9
9
 
10
10
 
11
- __version__ = "1.8.0"
11
+ __version__ = "1.9.0"
@@ -622,18 +622,66 @@ class KnowledgeTool(Tool):
622
622
 
623
623
  items = await self._service.work_bulk_create({"items": payload.work_items})
624
624
 
625
- # Format response with summary
626
- type_counts: Dict[str, int] = {}
627
- for item in items:
628
- item_type = item.get("item_type", "unknown")
629
- type_counts[item_type] = type_counts.get(item_type, 0) + 1
630
-
625
+ # Format response as hierarchical tree
631
626
  lines = [f"✅ **{len(items)} work items created**", ""]
627
+
628
+ # Build tree structure
629
+ items_by_id: Dict[str, Dict[str, Any]] = {}
630
+ children_map: Dict[str, List[str]] = {}
631
+ root_ids: List[str] = []
632
+
632
633
  for item in items:
634
+ item_id = item.get("id", "")
635
+ items_by_id[item_id] = item
636
+ parent_id = item.get("parent_id")
637
+ if parent_id and parent_id in items_by_id:
638
+ if parent_id not in children_map:
639
+ children_map[parent_id] = []
640
+ children_map[parent_id].append(item_id)
641
+ else:
642
+ root_ids.append(item_id)
643
+
644
+ def format_tree_node(
645
+ item_id: str, prefix: str = "", is_last: bool = True
646
+ ) -> List[str]:
647
+ """Format a node and its children as tree lines."""
648
+ node_lines: List[str] = []
649
+ item = items_by_id.get(item_id, {})
633
650
  key = item.get("key", "")
634
651
  title = item.get("title", "Untitled")
635
652
  item_type = item.get("item_type", "unknown")
636
- lines.append(f"- [{key}] {title} ({item_type})")
653
+
654
+ # Determine connector
655
+ if prefix == "":
656
+ connector = ""
657
+ child_prefix = ""
658
+ else:
659
+ connector = "└── " if is_last else "├── "
660
+ child_prefix = prefix + (" " if is_last else "│ ")
661
+
662
+ node_lines.append(f"{prefix}{connector}{item_type}: {key} - {title}")
663
+
664
+ # Process children
665
+ child_ids = children_map.get(item_id, [])
666
+ for i, child_id in enumerate(child_ids):
667
+ is_last_child = i == len(child_ids) - 1
668
+ node_lines.extend(
669
+ format_tree_node(child_id, child_prefix, is_last_child)
670
+ )
671
+
672
+ return node_lines
673
+
674
+ # Format root items and their children
675
+ for i, root_id in enumerate(root_ids):
676
+ lines.extend(format_tree_node(root_id))
677
+ if i < len(root_ids) - 1:
678
+ lines.append("") # Add blank line between root trees
679
+
680
+ # Summary by type
681
+ type_counts: Dict[str, int] = {}
682
+ for item in items:
683
+ item_type = item.get("item_type", "unknown")
684
+ type_counts[item_type] = type_counts.get(item_type, 0) + 1
637
685
 
638
686
  lines.append("")
639
687
  lines.append("**Summary by type:**")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fenix-mcp
3
- Version: 1.8.0
3
+ Version: 1.9.0
4
4
  Summary: Fênix Cloud MCP server implemented in Python
5
5
  Author: Fenix Inc
6
6
  Requires-Python: >=3.10
@@ -1,4 +1,4 @@
1
- fenix_mcp/__init__.py,sha256=1rPPMWBN4_kt19tylpYO9VURpib6wyxuNU5d3n6gYfk,180
1
+ fenix_mcp/__init__.py,sha256=RSnCE2xWQoxMXMLP8m8560qoiZO8pwVWFgICK-rSnDw,180
2
2
  fenix_mcp/main.py,sha256=iJV-9btNMDJMObvcn7wBQdbLLKjkYCQ1ANGEwHGHlMU,2857
3
3
  fenix_mcp/application/presenters.py,sha256=fGME54PdCDhTBhXO-JUB9yLdBHiE1aeXLTC2fCuxnxM,689
4
4
  fenix_mcp/application/tool_base.py,sha256=YJk7aSVGjXEvAkXrOHOuUjCFhYni9NPKFyPKiZqkrCc,4235
@@ -7,7 +7,7 @@ fenix_mcp/application/tools/__init__.py,sha256=Gi1YvYh-KdL9HD8gLVrknHrxiKKEOhHBE
7
7
  fenix_mcp/application/tools/health.py,sha256=m5DxhoRbdwl6INzd6PISxv1NAv-ljCrezsr773VB0wE,834
8
8
  fenix_mcp/application/tools/initialize.py,sha256=YfsE3fVYiqGEwvaI_jg5-0K7pGURXxpB3WNwETmGBPc,5499
9
9
  fenix_mcp/application/tools/intelligence.py,sha256=fXfjBwAQmZCn3Zc8BqFnQFAJkpd9JsfOPa_uXJj-bMU,15778
10
- fenix_mcp/application/tools/knowledge.py,sha256=TOXyiXzEzeq_IiLTJ9kR_o8Kgc2oDmnQOQVvDPimAAA,58408
10
+ fenix_mcp/application/tools/knowledge.py,sha256=LfyDhjoy3utxZ-AHvcRYsimNd9KFTfIkH0Sc8aCvykQ,60358
11
11
  fenix_mcp/application/tools/productivity.py,sha256=wyJ7-2VqgI2cdrliBD_ejwNvQhN1DecpXSQVrCxcUpQ,11231
12
12
  fenix_mcp/application/tools/user_config.py,sha256=O5AVg7IUKL9uIoUoBSFovBDHl9jofhKWzhFK7CnKi4s,6470
13
13
  fenix_mcp/domain/initialization.py,sha256=AZhdSNITQ7O3clELBuqGvjJc-c8pFKc7zQz-XR2xXPc,6933
@@ -22,8 +22,8 @@ fenix_mcp/infrastructure/logging.py,sha256=bHrWlSi_0HshRe3--BK_5nzUszW-gh37q6jsd
22
22
  fenix_mcp/infrastructure/fenix_api/client.py,sha256=GZrrWiUGxMaFM7kT7M8YYeWN1X5EetaJg6Co1-RBI0o,28457
23
23
  fenix_mcp/interface/mcp_server.py,sha256=5UM2NJuNbwHkmCEprIFataJ5nFZiO8efTtP_oW3_iX0,2331
24
24
  fenix_mcp/interface/transports.py,sha256=PxdhfjH8UMl03f7nuCLc-M6tMx6-Y-btVz_mSqXKrSI,8138
25
- fenix_mcp-1.8.0.dist-info/METADATA,sha256=I9_mtSYu17C0GPL2tEyygd3L3giTE8wo-rq88IQP0Os,7260
26
- fenix_mcp-1.8.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
27
- fenix_mcp-1.8.0.dist-info/entry_points.txt,sha256=o52x_YHBupEd-1Z1GSfUjv3gJrx5_I-EkHhCgt1WBaE,49
28
- fenix_mcp-1.8.0.dist-info/top_level.txt,sha256=2G1UtKpwjaIGQyE7sRoHecxaGLeuexfjrOUjv9DDKh4,10
29
- fenix_mcp-1.8.0.dist-info/RECORD,,
25
+ fenix_mcp-1.9.0.dist-info/METADATA,sha256=A9gBNunNWduimqMBaYWovCv674-R9i9wVvXcB6bzAoQ,7260
26
+ fenix_mcp-1.9.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
27
+ fenix_mcp-1.9.0.dist-info/entry_points.txt,sha256=o52x_YHBupEd-1Z1GSfUjv3gJrx5_I-EkHhCgt1WBaE,49
28
+ fenix_mcp-1.9.0.dist-info/top_level.txt,sha256=2G1UtKpwjaIGQyE7sRoHecxaGLeuexfjrOUjv9DDKh4,10
29
+ fenix_mcp-1.9.0.dist-info/RECORD,,