git: 2adbbb824d6c - main - misc/py-fastmcp: New port: Fast, Pythonic way to build MCP servers and clients

From: Yuri Victorovich <yuri_at_FreeBSD.org>
Date: Sun, 31 Aug 2025 19:10:07 UTC
The branch main has been updated by yuri:

URL: https://cgit.FreeBSD.org/ports/commit/?id=2adbbb824d6c539bfb4f6e6b15396fe26352baeb

commit 2adbbb824d6c539bfb4f6e6b15396fe26352baeb
Author:     Yuri Victorovich <yuri@FreeBSD.org>
AuthorDate: 2025-08-31 19:09:51 +0000
Commit:     Yuri Victorovich <yuri@FreeBSD.org>
CommitDate: 2025-08-31 19:10:03 +0000

    misc/py-fastmcp: New port: Fast, Pythonic way to build MCP servers and clients
---
 misc/Makefile             |  1 +
 misc/py-fastmcp/Makefile  | 55 +++++++++++++++++++++++++++++++++++++++++++++++
 misc/py-fastmcp/distinfo  |  3 +++
 misc/py-fastmcp/pkg-descr | 11 ++++++++++
 4 files changed, 70 insertions(+)

diff --git a/misc/Makefile b/misc/Makefile
index 14d64ffcb9cf..9b542d4f7d8a 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -443,6 +443,7 @@
     SUBDIR += py-ezc3d
     SUBDIR += py-facenet-pytorch
     SUBDIR += py-fast-histogram
+    SUBDIR += py-fastmcp
     SUBDIR += py-fastscapelib
     SUBDIR += py-files-to-prompt
     SUBDIR += py-fleep
diff --git a/misc/py-fastmcp/Makefile b/misc/py-fastmcp/Makefile
new file mode 100644
index 000000000000..ddf4d502f680
--- /dev/null
+++ b/misc/py-fastmcp/Makefile
@@ -0,0 +1,55 @@
+PORTNAME=	fastmcp
+DISTVERSION=	2.12.0
+CATEGORIES=	misc python # machine-learning
+MASTER_SITES=	PYPI # no tarball
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}
+
+MAINTAINER=	yuri@FreeBSD.org
+COMMENT=	Fast, Pythonic way to build MCP servers and clients
+WWW=		https://gofastmcp.com/getting-started/welcome \
+		https://github.com/jlowin/fastmcp
+
+LICENSE=	APACHE20
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}hatchling>0:devel/py-hatchling@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}uv-dynamic-versioning>=0.7.0:devel/py-uv-dynamic-versioning@${PY_FLAVOR}
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}authlib>=1.5.2:security/py-authlib@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}cyclopts>=3.0.0:devel/py-cyclopts@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}exceptiongroup>=1.2.2:devel/py-exceptiongroup@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}httpx>=0.28.1:www/py-httpx@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}mcp>0:misc/py-mcp@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}openai>=1.95.1:misc/py-openai@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}openapi-core>=0.19.5:devel/py-openapi-core@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}openapi-pydantic>=0.5.1:devel/py-openapi-pydantic@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}pydantic2>0:devel/py-pydantic2@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}pyperclip>0:devel/py-pyperclip@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}python-dotenv>=1.1.0:www/py-python-dotenv@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}rich>=13.9.4:textproc/py-rich@${PY_FLAVOR}
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}websockets>=15.0.1:devel/py-websockets@${PY_FLAVOR}
+TEST_DEPENDS=	${PYTHON_PKGNAMEPREFIX}dirty-equals>=0.9.0:devel/py-dirty-equals@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}fastapi>=0.115.12:www/py-fastapi@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}ipython>=8.12.3:devel/ipython@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}psutil>0:sysutils/py-psutil@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}pytest-asyncio>=0.23.5:devel/py-pytest-asyncio@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}pytest-cov>0:devel/py-pytest-cov@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}pytest-env>0:devel/py-pytest-env@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}pytest-httpx>0:devel/py-pytest-httpx@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}pytest-timeout>0:devel/py-pytest-timeout@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}pytest-xdist>=3.6.1:devel/py-pytest-xdist@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}pytest>=8.3.3:devel/py-pytest@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}ruff>0:devel/py-ruff@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}ty>0:devel/py-ty@${PY_FLAVOR}
+
+USES=		python
+USE_PYTHON=	pep517 autoplist pytest
+
+BINARY_ALIAS=	python=${PYTHON_CMD}
+
+TEST_ENV=	${MAKE_ENV} PYTHONPATH=${STAGEDIR}${PYTHONPREFIX_SITELIBDIR}
+
+NO_ARCH=	yes
+
+# tests as of 2.12.0: 54 failed, 2580 passed, 14 xfailed, 1 xpassed, 8 warnings, 1 error in 298.28s (0:04:58), see https://github.com/jlowin/fastmcp/issues/1690
+
+.include <bsd.port.mk>
diff --git a/misc/py-fastmcp/distinfo b/misc/py-fastmcp/distinfo
new file mode 100644
index 000000000000..2f441e4f2fc0
--- /dev/null
+++ b/misc/py-fastmcp/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1756659840
+SHA256 (fastmcp-2.12.0.tar.gz) = c7d6ec0fe3fa8d10061d08b40ebf6a4f916034a47ff3188dfd81c25e143ac18e
+SIZE (fastmcp-2.12.0.tar.gz) = 5241089
diff --git a/misc/py-fastmcp/pkg-descr b/misc/py-fastmcp/pkg-descr
new file mode 100644
index 000000000000..61c726c5cef5
--- /dev/null
+++ b/misc/py-fastmcp/pkg-descr
@@ -0,0 +1,11 @@
+xFormers is a Toolbox to Accelerate Research on Transformers.
+
+xFormers is:
+* Customizable building blocks: Independent/customizable building blocks that
+  can be used without boilerplate code. The components are domain-agnostic and
+  xFormers is used by researchers in vision, NLP and more.
+* Research first: xFormers contains bleeding-edge components, that are not yet
+  available in mainstream libraries like PyTorch.
+* Built with efficiency in mind: Because speed of iteration matters, components
+  are as fast and memory-efficient as possible. xFormers contains its own CUDA
+  kernels, but dispatches to other libraries when relevant.