diff --git a/Makefile b/Makefile index df95010..6a69aa6 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ # Install development dependencies install: - uv sync --dev + uv sync --all-extras --dev # Run tests with coverage test: diff --git a/pyproject.toml b/pyproject.toml index 9365cd9..89f02d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,14 +31,18 @@ dependencies = [ "numpy", "openai", "ipykernel", - "fastmcp>=2.12.2", - "click>=8.2.1", 'networkx', 'igraph', 'pyvis', 'zstandard', ] +[project.optional-dependencies] +mcp = [ + "fastmcp>=2.12.2", + "click>=8.2.1", +] + [project.scripts] tct-server = "main:main" diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index bab518f..0000000 --- a/requirements.txt +++ /dev/null @@ -1,13 +0,0 @@ -requests -jsons -pandas -seaborn -matplotlib -ipycytoscape -networkx -openai -ipykernel -PyYAML -ipywidgets -zstandard -igraph diff --git a/setup.py b/setup.py deleted file mode 100644 index 3af9951..0000000 --- a/setup.py +++ /dev/null @@ -1,32 +0,0 @@ -from setuptools import setup, find_packages - -setup( - name='TCT', - version='0.1.6', - packages=find_packages(), - install_requires=[ - # List your library's dependencies here - 'requests', - 'pandas', - 'seaborn', - 'matplotlib', - 'ipycytoscape', - 'networkx', - 'numpy', - 'openai', - 'PyYAML', - 'copy', - ], - entry_points={ - 'console_scripts': [ - # Define any command-line scripts here - ], - }, - url='https://github.com/NCATSTranslator/Translator_component_toolkit', - author='Guangrong Qin', - author_email='guangrong.qin@isbscience.org', - description='Translator Component Toolkit', - long_description=open('README.md').read(), - long_description_content_type='text/markdown', - license='MIT', -) diff --git a/tests/test_server.py b/tests/test_server.py index 43b3863..fd1df2e 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -1,5 +1,10 @@ """Simple tests for TCT MCP Server functionality.""" +import pytest + +# Skip this module entirely when the optional MCP extra (fastmcp) is not installed. +pytest.importorskip("fastmcp") + from TCT.server import mcp diff --git a/uv.lock b/uv.lock index 3f4c7e0..7eb6e9c 100644 --- a/uv.lock +++ b/uv.lock @@ -247,7 +247,7 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } wheels = [ @@ -318,7 +318,7 @@ resolution-markers = [ "python_full_version == '3.11.*'", ] dependencies = [ - { name = "numpy", version = "2.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.3.2", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } wheels = [ @@ -875,17 +875,17 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "colorama", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, - { name = "decorator", marker = "python_full_version < '3.11'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, - { name = "jedi", marker = "python_full_version < '3.11'" }, - { name = "matplotlib-inline", marker = "python_full_version < '3.11'" }, - { name = "pexpect", marker = "python_full_version < '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit", marker = "python_full_version < '3.11'" }, - { name = "pygments", marker = "python_full_version < '3.11'" }, - { name = "stack-data", marker = "python_full_version < '3.11'" }, - { name = "traitlets", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "exceptiongroup" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/85/31/10ac88f3357fc276dc8a64e8880c82e80e7459326ae1d0a211b40abf6665/ipython-8.37.0.tar.gz", hash = "sha256:ca815841e1a41a1e6b73a0b08f3038af9b2252564d01fc405356d34033012216", size = 5606088, upload-time = "2025-05-31T16:39:09.613Z" } wheels = [ @@ -901,17 +901,17 @@ resolution-markers = [ "python_full_version == '3.11.*'", ] dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, - { name = "decorator", marker = "python_full_version >= '3.11'" }, - { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.11'" }, - { name = "jedi", marker = "python_full_version >= '3.11'" }, - { name = "matplotlib-inline", marker = "python_full_version >= '3.11'" }, - { name = "pexpect", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit", marker = "python_full_version >= '3.11'" }, - { name = "pygments", marker = "python_full_version >= '3.11'" }, - { name = "stack-data", marker = "python_full_version >= '3.11'" }, - { name = "traitlets", marker = "python_full_version >= '3.11'" }, - { name = "typing-extensions", marker = "python_full_version == '3.11.*'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "ipython-pygments-lexers" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, + { name = "typing-extensions", marker = "python_full_version < '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6e/71/a86262bf5a68bf211bcc71fe302af7e05f18a2852fdc610a854d20d085e6/ipython-9.5.0.tar.gz", hash = "sha256:129c44b941fe6d9b82d36fc7a7c18127ddb1d6f02f78f867f402e2e3adde3113", size = 4389137, upload-time = "2025-08-29T12:15:21.519Z" } wheels = [ @@ -923,7 +923,7 @@ name = "ipython-pygments-lexers" version = "1.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pygments", marker = "python_full_version >= '3.11'" }, + { name = "pygments" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } wheels = [ @@ -2784,11 +2784,9 @@ wheels = [ [[package]] name = "tct" -version = "0.1.6" +version = "0.2.0" source = { editable = "." } dependencies = [ - { name = "click" }, - { name = "fastmcp" }, { name = "igraph" }, { name = "ipycytoscape" }, { name = "ipykernel" }, @@ -2806,6 +2804,12 @@ dependencies = [ { name = "zstandard" }, ] +[package.optional-dependencies] +mcp = [ + { name = "click" }, + { name = "fastmcp" }, +] + [package.dev-dependencies] dev = [ { name = "codespell" }, @@ -2817,8 +2821,8 @@ dev = [ [package.metadata] requires-dist = [ - { name = "click", specifier = ">=8.2.1" }, - { name = "fastmcp", specifier = ">=2.12.2" }, + { name = "click", marker = "extra == 'mcp'", specifier = ">=8.2.1" }, + { name = "fastmcp", marker = "extra == 'mcp'", specifier = ">=2.12.2" }, { name = "igraph" }, { name = "ipycytoscape" }, { name = "ipykernel" }, @@ -2833,6 +2837,7 @@ requires-dist = [ { name = "seaborn" }, { name = "zstandard" }, ] +provides-extras = ["mcp"] [package.metadata.requires-dev] dev = [