diff --git a/src/mcp_obsidian/obsidian.py b/src/mcp_obsidian/obsidian.py index ae99698..d711492 100644 --- a/src/mcp_obsidian/obsidian.py +++ b/src/mcp_obsidian/obsidian.py @@ -204,36 +204,54 @@ class Obsidian(): return self._safe_call(call_fn) - def get_recent_changes(self, limit: int = 10, days: int = None, extensions: list = None) -> Any: + def get_recent_changes(self, limit: int = 10, days: int = 90, extensions: list = None) -> Any: """Get recently modified files in the vault. Args: limit: Maximum number of files to return (default: 10) - days: Only include files modified within this many days (optional) + days: Only include files modified within this many days (default: 90) extensions: Only include files with these extensions (optional) Returns: List of recently modified files with metadata """ - url = f"{self.get_base_url()}/vault/recent" - params = {"limit": limit} + # Build the DQL query based on parameters + query_lines = ["TABLE file.mtime"] + # Add WHERE clauses + where_clauses = [] if days is not None: - params["days"] = days + where_clauses.append(f"file.mtime >= date(today) - dur({days} days)") - if extensions is not None: - params["extensions"] = ",".join(extensions) + if extensions: + ext_list = ", ".join(f'"{ext}"' for ext in extensions) + where_clauses.append(f"file.ext IN ({ext_list})") + + if where_clauses: + query_lines.append(f"WHERE {' AND '.join(where_clauses)}") + + # Add sorting and limit + query_lines.append("SORT file.mtime DESC") + query_lines.append(f"LIMIT {limit}") + + # Join with proper DQL line breaks + dql_query = "\n".join(query_lines) + + # Make the request to search endpoint + url = f"{self.get_base_url()}/search/" + headers = self._get_headers() | { + 'Content-Type': 'application/vnd.olrapi.dataview.dql+txt' + } def call_fn(): - response = requests.get( - url, - headers=self._get_headers(), - params=params, - verify=self.verify_ssl, + response = requests.post( + url, + headers=headers, + data=dql_query.encode('utf-8'), + verify=self.verify_ssl, timeout=self.timeout ) response.raise_for_status() - return response.json() return self._safe_call(call_fn)