fenix-mcp 0.5.8__tar.gz → 0.5.10__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.
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/PKG-INFO +1 -1
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/__init__.py +1 -1
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/application/tools/intelligence.py +35 -2
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/application/tools/productivity.py +2 -2
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp.egg-info/PKG-INFO +1 -1
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/README.md +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/application/presenters.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/application/tool_base.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/application/tool_registry.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/application/tools/__init__.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/application/tools/health.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/application/tools/initialize.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/application/tools/knowledge.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/application/tools/user_config.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/domain/initialization.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/domain/intelligence.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/domain/knowledge.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/domain/productivity.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/domain/user_config.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/infrastructure/config.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/infrastructure/context.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/infrastructure/fenix_api/client.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/infrastructure/http_client.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/infrastructure/logging.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/interface/mcp_server.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/interface/transports.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp/main.py +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp.egg-info/SOURCES.txt +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp.egg-info/dependency_links.txt +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp.egg-info/entry_points.txt +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp.egg-info/requires.txt +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/fenix_mcp.egg-info/top_level.txt +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/pyproject.toml +0 -0
- {fenix_mcp-0.5.8 → fenix_mcp-0.5.10}/setup.cfg +0 -0
|
@@ -6,7 +6,7 @@ from __future__ import annotations
|
|
|
6
6
|
from enum import Enum
|
|
7
7
|
from typing import Any, Dict, List, Optional
|
|
8
8
|
|
|
9
|
-
from pydantic import Field
|
|
9
|
+
from pydantic import Field, field_validator
|
|
10
10
|
|
|
11
11
|
from fenix_mcp.application.presenters import text
|
|
12
12
|
from fenix_mcp.application.tool_base import Tool, ToolRequest
|
|
@@ -83,7 +83,40 @@ class IntelligenceRequest(ToolRequest):
|
|
|
83
83
|
default=False,
|
|
84
84
|
description="Retornar metadata completa das memórias? Defina true para incluir o campo bruto.",
|
|
85
85
|
)
|
|
86
|
-
tags: Optional[List[str]] = Field(
|
|
86
|
+
tags: Optional[List[str]] = Field(
|
|
87
|
+
default=None,
|
|
88
|
+
description="Tags da memória como array JSON de strings.",
|
|
89
|
+
json_schema_extra={"example": ["tag1", "tag2", "tag3"]},
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
@field_validator("tags", mode="before")
|
|
93
|
+
@classmethod
|
|
94
|
+
def validate_tags(cls, v: Any) -> Optional[List[str]]:
|
|
95
|
+
"""Validate and normalize tags field."""
|
|
96
|
+
if v is None or v == "":
|
|
97
|
+
return None
|
|
98
|
+
|
|
99
|
+
# If it's already a list, return as is
|
|
100
|
+
if isinstance(v, (list, tuple, set)):
|
|
101
|
+
return [str(item).strip() for item in v if str(item).strip()]
|
|
102
|
+
|
|
103
|
+
# If it's a string, try to parse as JSON
|
|
104
|
+
if isinstance(v, str):
|
|
105
|
+
try:
|
|
106
|
+
import json
|
|
107
|
+
|
|
108
|
+
parsed = json.loads(v)
|
|
109
|
+
if isinstance(parsed, list):
|
|
110
|
+
return [str(item).strip() for item in parsed if str(item).strip()]
|
|
111
|
+
except (json.JSONDecodeError, TypeError):
|
|
112
|
+
pass
|
|
113
|
+
|
|
114
|
+
# If JSON parsing fails, treat as comma-separated string
|
|
115
|
+
return [item.strip() for item in v.split(",") if item.strip()]
|
|
116
|
+
|
|
117
|
+
# For any other type, convert to string and wrap in list
|
|
118
|
+
return [str(v).strip()] if str(v).strip() else None
|
|
119
|
+
|
|
87
120
|
limit: int = Field(default=20, ge=1, le=100, description="Limite de resultados.")
|
|
88
121
|
offset: int = Field(default=0, ge=0, description="Offset para paginação.")
|
|
89
122
|
query: Optional[str] = Field(default=None, description="Termo de busca.")
|
|
@@ -66,8 +66,8 @@ class ProductivityRequest(ToolRequest):
|
|
|
66
66
|
content: Optional[str] = Field(
|
|
67
67
|
default=None, description="Conteúdo em Markdown (obrigatório em create)."
|
|
68
68
|
)
|
|
69
|
-
status: Optional[str] = Field(default=
|
|
70
|
-
priority: Optional[str] = Field(default=
|
|
69
|
+
status: Optional[str] = Field(default=None, description="Status do TODO.")
|
|
70
|
+
priority: Optional[str] = Field(default=None, description="Prioridade do TODO.")
|
|
71
71
|
category: Optional[str] = Field(default=None, description="Categoria opcional.")
|
|
72
72
|
tags: Optional[List[str]] = Field(default=None, description="Lista de tags.")
|
|
73
73
|
due_date: Optional[str] = Field(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|