Skip to main content
Glama

Mnemosyne MCP

by MumuTW
relationships.py7.97 kB
""" 關係數據模型定義 定義了知識圖譜中的邊(關係)類型,如 CALLS, CONTAINS, DEPENDS_ON 等。 """ import uuid from datetime import datetime from enum import Enum from typing import Any, Dict, Optional from pydantic import BaseModel, ConfigDict, Field, field_validator class RelationshipType(str, Enum): """關係類型枚舉""" CALLS = "CALLS" CONTAINS = "CONTAINS" DEPENDS_ON = "DEPENDS_ON" INHERITS_FROM = "INHERITS_FROM" IMPLEMENTS = "IMPLEMENTS" IMPORTS = "IMPORTS" DEFINES = "DEFINES" USES = "USES" APPLIES_TO = "APPLIES_TO" # 用於約束關係 # Atlassian 相關關係類型 BELONGS_TO = "BELONGS_TO" ASSIGNED_TO = "ASSIGNED_TO" AUTHORED = "AUTHORED" MENTIONS = "MENTIONS" LINKS_TO = "LINKS_TO" REFERENCES = "REFERENCES" class BaseRelationship(BaseModel): """ 基礎關係模型 所有圖譜邊的基礎類,提供通用的屬性和方法。 """ id: str = Field(default_factory=lambda: str(uuid.uuid4()), description="關係唯一標識符") relationship_type: RelationshipType = Field(description="關係類型") source_id: str = Field(description="源節點ID") target_id: str = Field(description="目標節點ID") # 時間屬性 created_at: datetime = Field(default_factory=datetime.now, description="創建時間") updated_at: datetime = Field(default_factory=datetime.now, description="更新時間") # 有效期(用於時間版本控制) valid_from: Optional[datetime] = Field(default=None, description="有效開始時間") valid_to: Optional[datetime] = Field(default=None, description="有效結束時間") # 擴展屬性 extra: Dict[str, Any] = Field(default_factory=dict, description="擴展屬性") model_config = ConfigDict(use_enum_values=True) @field_validator("valid_to") @classmethod def validate_valid_period(cls, v: Optional[datetime], info) -> Optional[datetime]: """驗證有效期""" if v and info.data.get("valid_from"): if v <= info.data["valid_from"]: raise ValueError("valid_to must be after valid_from") return v def to_graph_properties(self) -> Dict[str, Any]: """轉換為圖資料庫屬性格式""" props = self.model_dump(exclude={"extra", "source_id", "target_id"}) props.update(self.extra) return props @property def is_active(self) -> bool: """檢查關係是否當前有效""" now = datetime.now() if self.valid_from and now < self.valid_from: return False if self.valid_to and now >= self.valid_to: return False return True class CallsRelationship(BaseRelationship): """ 函數調用關係 表示一個函數調用另一個函數的關係。 """ relationship_type: RelationshipType = Field( default=RelationshipType.CALLS, frozen=True ) # 調用特性 call_type: str = Field( default="direct", description="調用類型:direct, indirect, recursive" ) call_count: Optional[int] = Field(default=None, description="調用次數(靜態分析)") is_conditional: bool = Field(default=False, description="是否為條件調用") # 調用位置 call_line: Optional[int] = Field(default=None, description="調用所在行號") call_column: Optional[int] = Field(default=None, description="調用所在列號") # 調用上下文 context: Optional[str] = Field(default=None, description="調用上下文") class ContainsRelationship(BaseRelationship): """ 包含關係 表示一個實體包含另一個實體的關係,如文件包含函數。 """ relationship_type: RelationshipType = Field( default=RelationshipType.CONTAINS, frozen=True ) # 包含特性 container_type: str = Field(description="容器類型:file, class, package") position: Optional[int] = Field(default=None, description="在容器中的位置") # 可見性 visibility: str = Field( default="public", description="可見性:public, private, protected" ) class DependsOnRelationship(BaseRelationship): """ 依賴關係 表示一個實體依賴另一個實體的關係。 """ relationship_type: RelationshipType = Field( default=RelationshipType.DEPENDS_ON, frozen=True ) # 依賴特性 dependency_type: str = Field(description="依賴類型:import, inheritance, composition") is_optional: bool = Field(default=False, description="是否為可選依賴") # 版本約束 version_constraint: Optional[str] = Field(default=None, description="版本約束") # 依賴強度 strength: str = Field(default="strong", description="依賴強度:weak, strong, critical") class InheritsFromRelationship(BaseRelationship): """ 繼承關係 表示類繼承關係。 """ relationship_type: RelationshipType = Field( default=RelationshipType.INHERITS_FROM, frozen=True ) # 繼承特性 inheritance_type: str = Field(default="single", description="繼承類型:single, multiple") is_abstract: bool = Field(default=False, description="是否為抽象繼承") # 繼承順序(用於多重繼承) inheritance_order: Optional[int] = Field(default=None, description="繼承順序") class ImplementsRelationship(BaseRelationship): """ 實現關係 表示類實現介面的關係。 """ relationship_type: RelationshipType = Field( default=RelationshipType.IMPLEMENTS, frozen=True ) # 實現特性 is_complete: bool = Field(default=True, description="是否完全實現") # 實現的方法列表 implemented_methods: list[str] = Field(default_factory=list, description="已實現的方法") missing_methods: list[str] = Field(default_factory=list, description="未實現的方法") class ImportsRelationship(BaseRelationship): """ 導入關係 表示模組導入關係。 """ relationship_type: RelationshipType = Field( default=RelationshipType.IMPORTS, frozen=True ) # 導入特性 import_type: str = Field(description="導入類型:module, from, star") alias: Optional[str] = Field(default=None, description="導入別名") # 導入的具體項目 imported_items: list[str] = Field(default_factory=list, description="導入的具體項目") # 導入位置 import_line: Optional[int] = Field(default=None, description="導入語句所在行號") class UsesRelationship(BaseRelationship): """ 使用關係 表示一個實體使用另一個實體的關係。 """ relationship_type: RelationshipType = Field( default=RelationshipType.USES, frozen=True ) # 使用特性 usage_type: str = Field(description="使用類型:variable, type, annotation") usage_context: Optional[str] = Field(default=None, description="使用上下文") # 使用頻率 usage_count: Optional[int] = Field(default=None, description="使用次數") class AppliesToRelationship(BaseRelationship): """ 應用關係 表示約束或規則應用到實體的關係。 """ relationship_type: RelationshipType = Field( default=RelationshipType.APPLIES_TO, frozen=True ) # 應用特性 constraint_type: str = Field(description="約束類型") severity: str = Field( default="medium", description="嚴重程度:low, medium, high, critical" ) # 約束狀態 constraint_active: bool = Field(default=True, description="約束是否激活") last_checked: Optional[datetime] = Field(default=None, description="最後檢查時間") # 違規信息 violation_count: int = Field(default=0, description="違規次數") last_violation: Optional[datetime] = Field(default=None, description="最後違規時間")

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/MumuTW/Mnemosyne-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server