diff --git a/pyproject.toml b/pyproject.toml index fd1fd8b..18a773e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,11 +1,12 @@ [project] name = "mcp-server-appwrite" -version = "0.1.3" +version = "0.1.4" description = "MCP (Model Context Protocol) server for Appwrite" readme = "README.md" requires-python = ">=3.12" dependencies = [ "appwrite>=9.0.2", + "docstring-parser>=0.16", "mcp[cli]>=1.3.0", ] diff --git a/src/mcp_server_appwrite/server.py b/src/mcp_server_appwrite/server.py index 33a9700..8679068 100644 --- a/src/mcp_server_appwrite/server.py +++ b/src/mcp_server_appwrite/server.py @@ -125,7 +125,7 @@ async def _run(): write_stream, InitializationOptions( server_name="appwrite", - server_version="0.1.3", + server_version="0.1.4", capabilities=server.get_capabilities( notification_options=NotificationOptions(), experimental_capabilities={}, diff --git a/src/mcp_server_appwrite/service.py b/src/mcp_server_appwrite/service.py index 5c5c765..de3382d 100644 --- a/src/mcp_server_appwrite/service.py +++ b/src/mcp_server_appwrite/service.py @@ -1,6 +1,7 @@ from typing import Any, get_type_hints, Dict, List, Optional, Union import inspect from mcp.types import Tool +from docstring_parser import parse class Service(): """Base class for all Appwrite services""" @@ -86,7 +87,7 @@ def list_tools(self) -> Dict[str, Dict]: # Get the overridden name if it exists tool_name = self._method_name_overrides.get(name, f"{self.service_name}_{name}") - docstring = (original_func.__doc__ or "No description available").strip() + docstring = parse(original_func.__doc__) signature = inspect.signature(original_func) type_hints = get_type_hints(original_func) @@ -100,13 +101,17 @@ def list_tools(self) -> Dict[str, Dict]: param_type = type_hints.get(param_name, str) properties[param_name] = self.python_type_to_json_schema(param_type) properties[param_name]["description"] = f"Parameter '{param_name}'" + + for doc_param in docstring.params: + if doc_param.arg_name == param_name: + properties[param_name]["description"] = doc_param.description if param.default is param.empty: required.append(param_name) tool_definition = Tool( name=tool_name, - description=f"{docstring}", + description=f"{docstring.short_description or "No description available"}", inputSchema={ "type": "object", "properties": properties, diff --git a/uv.lock b/uv.lock index d2491b1..174934a 100644 --- a/uv.lock +++ b/uv.lock @@ -102,6 +102,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] +[[package]] +name = "docstring-parser" +version = "0.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/08/12/9c22a58c0b1e29271051222d8906257616da84135af9ed167c9e28f85cb3/docstring_parser-0.16.tar.gz", hash = "sha256:538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e", size = 26565 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/7c/e9fcff7623954d86bdc17782036cbf715ecab1bec4847c008557affe1ca8/docstring_parser-0.16-py3-none-any.whl", hash = "sha256:bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637", size = 36533 }, +] + [[package]] name = "h11" version = "0.14.0" @@ -196,16 +205,18 @@ cli = [ [[package]] name = "mcp-server-appwrite" -version = "0.1.3" +version = "0.1.4" source = { editable = "." } dependencies = [ { name = "appwrite" }, + { name = "docstring-parser" }, { name = "mcp", extra = ["cli"] }, ] [package.metadata] requires-dist = [ { name = "appwrite", specifier = ">=9.0.2" }, + { name = "docstring-parser", specifier = ">=0.16" }, { name = "mcp", extras = ["cli"], specifier = ">=1.3.0" }, ]