diff --git a/nextcloud_mcp_server/app.py b/nextcloud_mcp_server/app.py index 6f359fe..e66fa65 100644 --- a/nextcloud_mcp_server/app.py +++ b/nextcloud_mcp_server/app.py @@ -12,6 +12,7 @@ from nextcloud_mcp_server.server import ( configure_notes_tools, configure_tables_tools, configure_webdav_tools, + configure_contacts_tools, ) setup_logging() @@ -56,6 +57,7 @@ configure_notes_tools(mcp) configure_tables_tools(mcp) configure_webdav_tools(mcp) configure_calendar_tools(mcp) +configure_contacts_tools(mcp) def run(): diff --git a/nextcloud_mcp_server/client/__init__.py b/nextcloud_mcp_server/client/__init__.py index d641a4d..b17162e 100644 --- a/nextcloud_mcp_server/client/__init__.py +++ b/nextcloud_mcp_server/client/__init__.py @@ -5,6 +5,7 @@ from httpx import AsyncClient, Auth, BasicAuth, Request, Response from ..controllers.notes_search import NotesSearchController from .calendar import CalendarClient +from .contacts import ContactsClient from .notes import NotesClient from .tables import TablesClient from .webdav import WebDAVClient @@ -43,6 +44,7 @@ class NextcloudClient: self.webdav = WebDAVClient(self._client, username) self.tables = TablesClient(self._client, username) self.calendar = CalendarClient(self._client, username) + self.contacts = ContactsClient(self._client, username) # Initialize controllers self._notes_search = NotesSearchController() diff --git a/nextcloud_mcp_server/server/__init__.py b/nextcloud_mcp_server/server/__init__.py index 925c987..f3b510b 100644 --- a/nextcloud_mcp_server/server/__init__.py +++ b/nextcloud_mcp_server/server/__init__.py @@ -2,10 +2,12 @@ from .calendar import configure_calendar_tools from .notes import configure_notes_tools from .tables import configure_tables_tools from .webdav import configure_webdav_tools +from .contacts import configure_contacts_tools __all__ = [ "configure_calendar_tools", "configure_notes_tools", "configure_tables_tools", "configure_webdav_tools", + "configure_contacts_tools", ] diff --git a/pyproject.toml b/pyproject.toml index 6113df5..da11b60 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,8 @@ dependencies = [ "mcp[cli] (>=1.10,<1.11)", "httpx (>=0.28.1,<0.29.0)", "pillow (>=11.2.1,<12.0.0)", - "icalendar (>=6.0.0,<7.0.0)" + "icalendar (>=6.0.0,<7.0.0)", + "pythonvcard4>=0.2.0", ] [tool.pytest.ini_options] diff --git a/uv.lock b/uv.lock index a2ba43b..defd8fe 100644 --- a/uv.lock +++ b/uv.lock @@ -512,6 +512,7 @@ dependencies = [ { name = "icalendar" }, { name = "mcp", extra = ["cli"] }, { name = "pillow" }, + { name = "pythonvcard4" }, ] [package.dev-dependencies] @@ -530,6 +531,7 @@ requires-dist = [ { name = "icalendar", specifier = ">=6.0.0,<7.0.0" }, { name = "mcp", extras = ["cli"], specifier = ">=1.10,<1.11" }, { name = "pillow", specifier = ">=11.2.1,<12.0.0" }, + { name = "pythonvcard4", specifier = ">=0.2.0" }, ] [package.metadata.requires-dev] @@ -843,6 +845,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" }, ] +[[package]] +name = "pythonvcard4" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/04/02d5952a9d8cbcb9e62b4fc4f6f842e8d43aead6e307f83e6fd6f7352fbd/pythonvcard4-0.2.0.tar.gz", hash = "sha256:236bba2769e459645cfa776407ff07856aced45b437116bf40ddb39bbcefdb6d", size = 5530, upload-time = "2025-04-26T23:18:48.963Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/2f/ee10d88bbe12e4e9e06f81589d999687038e5cd5fec6c05aed57c50aede6/pythonvcard4-0.2.0-py3-none-any.whl", hash = "sha256:dce31355dd50aee537f8883de86f301510e407bc1755a68ec8d5055b64f5c660", size = 5890, upload-time = "2025-04-26T23:18:48.2Z" }, +] + [[package]] name = "pyyaml" version = "6.0.2"