python3Packages.fastmcp: update, fix (#479412)

This commit is contained in:
Gaétan Lepage
2026-01-13 00:54:12 +00:00
committed by GitHub
7 changed files with 502 additions and 11 deletions
@@ -14,37 +14,45 @@
cyclopts,
exceptiongroup,
httpx,
jsonschema-path,
mcp,
openai,
openapi-core,
openapi-pydantic,
platformdirs,
py-key-value-aio,
pydantic,
pydocket,
pyperclip,
python-dotenv,
rich,
uvicorn,
websockets,
# tests
anthropic,
dirty-equals,
email-validator,
fastapi,
inline-snapshot,
lupa,
psutil,
pytest-asyncio,
pytest-httpx,
pytestCheckHook,
pytest-timeout,
}:
buildPythonPackage rec {
buildPythonPackage (finalAttrs: {
pname = "fastmcp";
version = "2.12.5";
version = "2.14.2";
pyproject = true;
src = fetchFromGitHub {
owner = "jlowin";
repo = "fastmcp";
tag = "v${version}";
hash = "sha256-F8NCp1Ku1EeI/YjbHuHcDYytTgqOFyLp+sZGBqayv6s=";
tag = "v${finalAttrs.version}";
hash = "sha256-JqDsHmhuRom4CPmQd0sMaBtgypHDtwVJ4I3fnOLjnd8=";
};
build-system = [
@@ -57,15 +65,22 @@ buildPythonPackage rec {
cyclopts
exceptiongroup
httpx
jsonschema-path
mcp
openapi-core
openapi-pydantic
platformdirs
py-key-value-aio
pydantic
pydocket
pyperclip
python-dotenv
rich
uvicorn
websockets
]
++ py-key-value-aio.optional-dependencies.disk
++ py-key-value-aio.optional-dependencies.keyring
++ py-key-value-aio.optional-dependencies.memory
++ pydantic.optional-dependencies.email;
optional-dependencies = {
@@ -74,27 +89,43 @@ buildPythonPackage rec {
pythonImportsCheck = [ "fastmcp" ];
pytestFlags = [
"--timeout=30"
];
nativeCheckInputs = [
anthropic
dirty-equals
email-validator
fastapi
inline-snapshot
lupa
psutil
pytest-asyncio
pytest-httpx
pytest-timeout
pytestCheckHook
writableTmpDirAsHomeHook
]
++ lib.concatAttrValues optional-dependencies
++ lib.concatAttrValues finalAttrs.passthru.optional-dependencies
++ inline-snapshot.optional-dependencies.dirty-equals;
disabledTests = [
# redis.exceptions.ResponseError: unknown command `evalsha`, with args beginning with:
"test_get_prompt_as_task_returns_prompt_task"
"test_prompt_task_server_generated_id"
"test_logging_middleware_with_payloads"
"test_structured_logging_middleware_produces_json"
# AssertionError: assert 'INFO' == 'DEBUG'
"test_temporary_settings"
# mcp.shared.exceptions.McpError: Connection closed
"test_log_file_captures_stderr_output_with_path"
"test_log_file_captures_stderr_output_with_textio"
"test_log_file_none_uses_default_behavior"
# RuntimeError: Client failed to connect: Connection closed
"test_keep_alive_maintains_session_across_multiple_calls"
"test_keep_alive_false_starts_new_session_across_multiple_calls"
@@ -110,6 +141,9 @@ buildPythonPackage rec {
"test_uv_transport_module"
"test_github_api_schema_performance"
# Hang forever
"test_nested_streamable_http_server_resolves_correctly"
# RuntimeError: Client failed to connect: Timed out while waiting for response
"test_timeout"
"test_timeout_tool_call_overrides_client_timeout_even_if_lower"
@@ -133,8 +167,6 @@ buildPythonPackage rec {
disabledTestPaths = lib.optionals stdenv.hostPlatform.isDarwin [
# RuntimeError: Server failed to start after 10 attempts
"tests/client/auth/test_oauth_client.py"
"tests/client/test_openapi_experimental.py"
"tests/client/test_openapi_legacy.py"
"tests/client/test_sse.py"
"tests/client/test_streamable_http.py"
"tests/server/auth/test_jwt_provider.py"
@@ -145,9 +177,9 @@ buildPythonPackage rec {
meta = {
description = "Fast, Pythonic way to build MCP servers and clients";
changelog = "https://github.com/jlowin/fastmcp/releases/tag/${src.tag}";
changelog = "https://github.com/jlowin/fastmcp/releases/tag/${finalAttrs.src.tag}";
homepage = "https://github.com/jlowin/fastmcp";
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [ GaetanLepage ];
};
}
})
@@ -0,0 +1,194 @@
{
lib,
stdenv,
buildPythonPackage,
fetchFromGitHub,
# build-system
uv-build,
# dependencies
beartype,
py-key-value-shared,
# optional-dependencies
# memory
cachetools,
# disk
diskcache,
pathvalidate,
# filetree
aiofile,
anyio,
# redis
redis,
# mongodb
pymongo,
# valkey
# valkey-glide,
# vault
hvac,
# types-hvac,
# memcached
aiomcache,
# elasticsearch
elasticsearch,
aiohttp,
# dynamodb
aioboto3,
types-aiobotocore-dynamodb,
# keyring
keyring,
# keyring-linux
dbus-python,
# pydantic
pydantic,
# rocksdb
rocksdict,
# duckdb
duckdb,
pytz,
# wrappers-encryption
cryptography,
# tests
bson,
docker,
dirty-equals,
inline-snapshot,
py-key-value-shared-test,
pytest-asyncio,
pytest-xdist,
pytestCheckHook,
}:
buildPythonPackage (finalAttrs: {
pname = "py-key-value-aio";
version = "0.3.0";
pyproject = true;
src = fetchFromGitHub {
owner = "strawgate";
repo = "py-key-value";
tag = finalAttrs.version;
hash = "sha256-4ji+GzJTv1QnC5n/OaL9vR65j8BQmJsVGGnjjuulDiU=";
};
sourceRoot = "${finalAttrs.src.name}/key-value/key-value-aio";
postPatch = ''
substituteInPlace pyproject.toml \
--replace-fail \
"uv_build>=0.8.2,<0.9.0" \
"uv_build"
'';
build-system = [
uv-build
];
dependencies = [
beartype
py-key-value-shared
];
optional-dependencies = {
memory = [
cachetools
];
disk = [
diskcache
pathvalidate
];
filetree = [
aiofile
anyio
];
redis = [
redis
];
mongodb = [
pymongo
];
valkey = [
# valkey-glide (unpackaged)
];
vault = [
hvac
# types-hvac (unpackaged)
];
memcached = [
aiomcache
];
elasticsearch = [
elasticsearch
aiohttp
];
dynamodb = [
aioboto3
types-aiobotocore-dynamodb
];
keyring = [
keyring
];
keyring-linux = [
keyring
dbus-python
];
pydantic = [
pydantic
];
rocksdb = [
rocksdict
];
duckdb = [
duckdb
pytz
];
wrappers-encryption = [
cryptography
];
};
pythonImportsCheck = [ "key_value.aio" ];
nativeCheckInputs = [
bson
dirty-equals
docker
duckdb
inline-snapshot
py-key-value-shared-test
pytest-asyncio
pytest-xdist
pytestCheckHook
]
++ finalAttrs.passthru.optional-dependencies.disk
++ finalAttrs.passthru.optional-dependencies.dynamodb
++ finalAttrs.passthru.optional-dependencies.elasticsearch
++ finalAttrs.passthru.optional-dependencies.filetree
++ finalAttrs.passthru.optional-dependencies.keyring
++ finalAttrs.passthru.optional-dependencies.memcached
++ finalAttrs.passthru.optional-dependencies.memory
++ finalAttrs.passthru.optional-dependencies.mongodb
++ finalAttrs.passthru.optional-dependencies.pydantic
++ finalAttrs.passthru.optional-dependencies.redis
++ finalAttrs.passthru.optional-dependencies.rocksdb
++ finalAttrs.passthru.optional-dependencies.wrappers-encryption;
disabledTestPaths = [
# ModuleNotFoundError: No module named 'bson.codec_options'
"tests/stores/mongodb/test_mongodb.py"
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
# keyring.errors.PasswordSetError: Can't store password on keychain: (-61, 'Unknown Error')
"tests/stores/keyring/test_keyring.py"
];
meta = {
description = "Async Key-Value";
homepage = "https://github.com/strawgate/py-key-value/tree/main/key-value/key-value-aio";
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [ GaetanLepage ];
};
})
@@ -0,0 +1,46 @@
{
lib,
buildPythonPackage,
fetchFromGitHub,
# build-system
uv-build,
}:
buildPythonPackage (finalAttrs: {
pname = "py-key-value-shared-test";
version = "0.3.0";
pyproject = true;
src = fetchFromGitHub {
owner = "strawgate";
repo = "py-key-value";
tag = finalAttrs.version;
hash = "sha256-4ji+GzJTv1QnC5n/OaL9vR65j8BQmJsVGGnjjuulDiU=";
};
sourceRoot = "${finalAttrs.src.name}/key-value/key-value-shared-test";
postPatch = ''
substituteInPlace pyproject.toml \
--replace-fail \
"uv_build>=0.8.2,<0.9.0" \
"uv_build"
'';
build-system = [
uv-build
];
pythonImportsCheck = [ "key_value.shared_test" ];
# No tests
doCheck = false;
meta = {
description = "Utils for key-value-shared";
homepage = "https://github.com/strawgate/py-key-value/tree/main/key-value/key-value-shared-test";
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [ GaetanLepage ];
};
})
@@ -0,0 +1,65 @@
{
lib,
buildPythonPackage,
fetchFromGitHub,
# build-system
uv-build,
# dependencies
beartype,
typing-extensions,
# tests
pytestCheckHook,
pytest-xdist,
inline-snapshot,
py-key-value-shared-test,
}:
buildPythonPackage (finalAttrs: {
pname = "py-key-value-shared";
version = "0.3.0";
pyproject = true;
src = fetchFromGitHub {
owner = "strawgate";
repo = "py-key-value";
tag = finalAttrs.version;
hash = "sha256-4ji+GzJTv1QnC5n/OaL9vR65j8BQmJsVGGnjjuulDiU=";
};
sourceRoot = "${finalAttrs.src.name}/key-value/key-value-shared";
postPatch = ''
substituteInPlace pyproject.toml \
--replace-fail \
"uv_build>=0.8.2,<0.9.0" \
"uv_build"
'';
build-system = [
uv-build
];
dependencies = [
beartype
typing-extensions
];
pythonImportsCheck = [ "key_value.shared" ];
nativeCheckInputs = [
inline-snapshot
py-key-value-shared-test
pytest-xdist
pytestCheckHook
];
meta = {
description = "Shared code between key-value-aio and key-value-sync";
homepage = "https://github.com/strawgate/py-key-value/tree/main/key-value/key-value-shared";
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [ GaetanLepage ];
};
})
@@ -0,0 +1,77 @@
{
lib,
buildPythonPackage,
fetchFromGitHub,
# build-system
hatch-vcs,
hatchling,
# dependencies
cloudpickle,
exceptiongroup,
fakeredis,
opentelemetry-api,
opentelemetry-exporter-prometheus,
opentelemetry-instrumentation,
prometheus-client,
py-key-value-aio,
python-json-logger,
redis,
rich,
typer,
typing-extensions,
}:
buildPythonPackage (finalAttrs: {
pname = "pydocket";
version = "0.16.3";
pyproject = true;
src = fetchFromGitHub {
owner = "chrisguidry";
repo = "docket";
tag = finalAttrs.version;
hash = "sha256-DNq+PUbh6SfazxkM7tbjEOXbh1VSJPM3jEkgn64XQ5g=";
};
build-system = [
hatch-vcs
hatchling
];
pythonRelaxDeps = [
"fakeredis"
"opentelemetry-exporter-prometheus"
"opentelemetry-instrumentation"
];
dependencies = [
cloudpickle
exceptiongroup
fakeredis
opentelemetry-api
opentelemetry-exporter-prometheus
opentelemetry-instrumentation
prometheus-client
py-key-value-aio
python-json-logger
redis
rich
typer
typing-extensions
]
++ py-key-value-aio.optional-dependencies.memory;
pythonImportsCheck = [ "docket" ];
# All tests require internet access
doCheck = false;
meta = {
description = "Distributed background task system for Python";
homepage = "https://github.com/chrisguidry/docket";
changelog = "https://github.com/chrisguidry/docket/releases/tag/${finalAttrs.src.tag}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ GaetanLepage ];
};
})
@@ -0,0 +1,67 @@
{
lib,
buildPythonPackage,
fetchFromGitHub,
rustPlatform,
pkgs,
# tests
pytestCheckHook,
}:
buildPythonPackage (finalAttrs: {
pname = "rocksdict";
version = "0.3.29";
pyproject = true;
src = fetchFromGitHub {
owner = "rocksdict";
repo = "RocksDict";
tag = "v${finalAttrs.version}";
fetchSubmodules = true;
hash = "sha256-yP+OAVioKOGPvcYM8s1TTNHzzaFxw1sUQDrWxmptuJo=";
};
cargoDeps = rustPlatform.fetchCargoVendor {
inherit (finalAttrs) src pname version;
hash = "sha256-E7DrHMla7af7IjPxS5EV2bWorXjHCsclnONVkkLAUrk=";
};
nativeBuildInputs = [
rustPlatform.cargoSetupHook
rustPlatform.maturinBuildHook
];
env = {
# libclang.so
LIBCLANG_PATH = "${lib.getLib pkgs.libclang}/lib";
};
maturinBuildFlags = [
# We disable LTO because it is incompatible with gcc
# LTO is only supported with clang. Either disable the `lto` feature or set
# `CC=/usr/bin/clang CXX=/usr/bin/clang++` environment variables.
# Disable all default features to get rid of "lto"
"--no-default-features"
# Manually re-enable bindgen-runtime
"--features bindgen-runtime"
];
pythonImportsCheck = [ "rocksdict" ];
nativeCheckInputs = [
pytestCheckHook
];
enabledTestPaths = [
"test"
];
meta = {
description = "Python fast on-disk dictionary / RocksDB & SpeeDB Python binding";
homepage = "https://github.com/rocksdict/RocksDict";
changelog = "https://github.com/rocksdict/RocksDict/releases/tag/${finalAttrs.src.tag}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ GaetanLepage ];
};
})
+10
View File
@@ -12814,6 +12814,12 @@ self: super: with self; {
py-improv-ble-client = callPackage ../development/python-modules/py-improv-ble-client { };
py-key-value-aio = callPackage ../development/python-modules/py-key-value-aio { };
py-key-value-shared = callPackage ../development/python-modules/py-key-value-shared { };
py-key-value-shared-test = callPackage ../development/python-modules/py-key-value-shared-test { };
py-libnuma = callPackage ../development/python-modules/py-libnuma { };
py-libzfs = callPackage ../development/python-modules/py-libzfs { };
@@ -13273,6 +13279,8 @@ self: super: with self; {
pydo = callPackage ../development/python-modules/pydo { };
pydocket = callPackage ../development/python-modules/pydocket { };
pydocstyle = callPackage ../development/python-modules/pydocstyle { };
pydocumentdb = callPackage ../development/python-modules/pydocumentdb { };
@@ -16603,6 +16611,8 @@ self: super: with self; {
rocketchat-api = callPackage ../development/python-modules/rocketchat-api { };
rocksdict = callPackage ../development/python-modules/rocksdict { };
roku = callPackage ../development/python-modules/roku { };
rokuecp = callPackage ../development/python-modules/rokuecp { };