Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions sdk/python/requirements/py3.10-ci-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2796,14 +2796,12 @@ matplotlib-inline==0.2.2 \
# via
# ipykernel
# ipython
mcp==2.0.0 \
--hash=sha256:0f440e735c13ece8bb19bc62cf0b86f4313448432fbb77d35e14034f4e050728 \
--hash=sha256:1cb4c75d2d2c7b8c1d756355e5d82a39f2822cc7f13e22a2051d7ca3592349d6
# via fastapi-mcp
mcp-types==2.0.0 \
--hash=sha256:6b2de797ca2797f568b79529e1b25948e34de511bcc0bd82fef1039a6d1b8eb0 \
--hash=sha256:d7d939b9285c9961ae8866ba75ef85da34d12bafe276efbf4eb6a131786d8379
# via mcp
mcp==1.29.0 \
--hash=sha256:52d01f334de1868cc3bb2d6604931126a67631f99a6c5d3b82ba47290315ec36 \
--hash=sha256:f5a075bb611f23d6f4d080c6a1699fa62772eebc562ba9e66b306ddde1c755f7
# via
# feast (pyproject.toml)
# fastapi-mcp
mdurl==0.1.2 \
--hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
--hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
Expand Down Expand Up @@ -7568,3 +7566,8 @@ zstandard==0.25.0 \
# via
# pyiceberg
# trino

httpx-sse==0.4.0 \
--hash=sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721 \
--hash=sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f
# via mcp
19 changes: 11 additions & 8 deletions sdk/python/requirements/py3.10-minimal-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1367,14 +1367,12 @@ markupsafe==3.0.3 \
--hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \
--hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50
# via jinja2
mcp==2.0.0 \
--hash=sha256:0f440e735c13ece8bb19bc62cf0b86f4313448432fbb77d35e14034f4e050728 \
--hash=sha256:1cb4c75d2d2c7b8c1d756355e5d82a39f2822cc7f13e22a2051d7ca3592349d6
# via fastapi-mcp
mcp-types==2.0.0 \
--hash=sha256:6b2de797ca2797f568b79529e1b25948e34de511bcc0bd82fef1039a6d1b8eb0 \
--hash=sha256:d7d939b9285c9961ae8866ba75ef85da34d12bafe276efbf4eb6a131786d8379
# via mcp
mcp==1.29.0 \
--hash=sha256:52d01f334de1868cc3bb2d6604931126a67631f99a6c5d3b82ba47290315ec36 \
--hash=sha256:f5a075bb611f23d6f4d080c6a1699fa62772eebc562ba9e66b306ddde1c755f7
# via
# feast (pyproject.toml)
# fastapi-mcp
mdurl==0.1.2 \
--hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
--hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
Expand Down Expand Up @@ -3398,3 +3396,8 @@ zipp==4.1.0 \
--hash=sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f \
--hash=sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602
# via importlib-metadata

httpx-sse==0.4.0 \
--hash=sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721 \
--hash=sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f
# via mcp
19 changes: 11 additions & 8 deletions sdk/python/requirements/py3.10-minimal-sdist-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1544,14 +1544,12 @@ markupsafe==3.0.3 \
--hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \
--hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50
# via jinja2
mcp==2.0.0 \
--hash=sha256:0f440e735c13ece8bb19bc62cf0b86f4313448432fbb77d35e14034f4e050728 \
--hash=sha256:1cb4c75d2d2c7b8c1d756355e5d82a39f2822cc7f13e22a2051d7ca3592349d6
# via fastapi-mcp
mcp-types==2.0.0 \
--hash=sha256:6b2de797ca2797f568b79529e1b25948e34de511bcc0bd82fef1039a6d1b8eb0 \
--hash=sha256:d7d939b9285c9961ae8866ba75ef85da34d12bafe276efbf4eb6a131786d8379
# via mcp
mcp==1.29.0 \
--hash=sha256:52d01f334de1868cc3bb2d6604931126a67631f99a6c5d3b82ba47290315ec36 \
--hash=sha256:f5a075bb611f23d6f4d080c6a1699fa62772eebc562ba9e66b306ddde1c755f7
# via
# feast (pyproject.toml)
# fastapi-mcp
mdurl==0.1.2 \
--hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
--hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
Expand Down Expand Up @@ -3675,6 +3673,11 @@ zipp==4.1.0 \
--hash=sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602
# via importlib-metadata

httpx-sse==0.4.0 \
--hash=sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721 \
--hash=sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f
# via mcp

# The following packages were excluded from the output:
# milvus-lite
# pymilvus
Expand Down
19 changes: 11 additions & 8 deletions sdk/python/requirements/py3.11-ci-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2896,14 +2896,12 @@ matplotlib-inline==0.2.2 \
# via
# ipykernel
# ipython
mcp==2.0.0 \
--hash=sha256:0f440e735c13ece8bb19bc62cf0b86f4313448432fbb77d35e14034f4e050728 \
--hash=sha256:1cb4c75d2d2c7b8c1d756355e5d82a39f2822cc7f13e22a2051d7ca3592349d6
# via fastapi-mcp
mcp-types==2.0.0 \
--hash=sha256:6b2de797ca2797f568b79529e1b25948e34de511bcc0bd82fef1039a6d1b8eb0 \
--hash=sha256:d7d939b9285c9961ae8866ba75ef85da34d12bafe276efbf4eb6a131786d8379
# via mcp
mcp==1.29.0 \
--hash=sha256:52d01f334de1868cc3bb2d6604931126a67631f99a6c5d3b82ba47290315ec36 \
--hash=sha256:f5a075bb611f23d6f4d080c6a1699fa62772eebc562ba9e66b306ddde1c755f7
# via
# feast (pyproject.toml)
# fastapi-mcp
mdurl==0.1.2 \
--hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
--hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
Expand Down Expand Up @@ -7799,3 +7797,8 @@ zstandard==0.25.0 \
# via
# pyiceberg
# trino

httpx-sse==0.4.0 \
--hash=sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721 \
--hash=sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f
# via mcp
19 changes: 11 additions & 8 deletions sdk/python/requirements/py3.11-minimal-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1361,14 +1361,12 @@ markupsafe==3.0.3 \
--hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \
--hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50
# via jinja2
mcp==2.0.0 \
--hash=sha256:0f440e735c13ece8bb19bc62cf0b86f4313448432fbb77d35e14034f4e050728 \
--hash=sha256:1cb4c75d2d2c7b8c1d756355e5d82a39f2822cc7f13e22a2051d7ca3592349d6
# via fastapi-mcp
mcp-types==2.0.0 \
--hash=sha256:6b2de797ca2797f568b79529e1b25948e34de511bcc0bd82fef1039a6d1b8eb0 \
--hash=sha256:d7d939b9285c9961ae8866ba75ef85da34d12bafe276efbf4eb6a131786d8379
# via mcp
mcp==1.29.0 \
--hash=sha256:52d01f334de1868cc3bb2d6604931126a67631f99a6c5d3b82ba47290315ec36 \
--hash=sha256:f5a075bb611f23d6f4d080c6a1699fa62772eebc562ba9e66b306ddde1c755f7
# via
# feast (pyproject.toml)
# fastapi-mcp
mdurl==0.1.2 \
--hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
--hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
Expand Down Expand Up @@ -3401,3 +3399,8 @@ zipp==4.1.0 \
--hash=sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f \
--hash=sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602
# via importlib-metadata

httpx-sse==0.4.0 \
--hash=sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721 \
--hash=sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f
# via mcp
19 changes: 11 additions & 8 deletions sdk/python/requirements/py3.11-minimal-sdist-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1536,14 +1536,12 @@ markupsafe==3.0.3 \
--hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \
--hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50
# via jinja2
mcp==2.0.0 \
--hash=sha256:0f440e735c13ece8bb19bc62cf0b86f4313448432fbb77d35e14034f4e050728 \
--hash=sha256:1cb4c75d2d2c7b8c1d756355e5d82a39f2822cc7f13e22a2051d7ca3592349d6
# via fastapi-mcp
mcp-types==2.0.0 \
--hash=sha256:6b2de797ca2797f568b79529e1b25948e34de511bcc0bd82fef1039a6d1b8eb0 \
--hash=sha256:d7d939b9285c9961ae8866ba75ef85da34d12bafe276efbf4eb6a131786d8379
# via mcp
mcp==1.29.0 \
--hash=sha256:52d01f334de1868cc3bb2d6604931126a67631f99a6c5d3b82ba47290315ec36 \
--hash=sha256:f5a075bb611f23d6f4d080c6a1699fa62772eebc562ba9e66b306ddde1c755f7
# via
# feast (pyproject.toml)
# fastapi-mcp
mdurl==0.1.2 \
--hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
--hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
Expand Down Expand Up @@ -3670,6 +3668,11 @@ zipp==4.1.0 \
--hash=sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602
# via importlib-metadata

httpx-sse==0.4.0 \
--hash=sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721 \
--hash=sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f
# via mcp

# The following packages were excluded from the output:
# milvus-lite
# pymilvus
Expand Down
19 changes: 11 additions & 8 deletions sdk/python/requirements/py3.12-ci-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2905,14 +2905,12 @@ matplotlib-inline==0.2.2 \
# via
# ipykernel
# ipython
mcp==2.0.0 \
--hash=sha256:0f440e735c13ece8bb19bc62cf0b86f4313448432fbb77d35e14034f4e050728 \
--hash=sha256:1cb4c75d2d2c7b8c1d756355e5d82a39f2822cc7f13e22a2051d7ca3592349d6
# via fastapi-mcp
mcp-types==2.0.0 \
--hash=sha256:6b2de797ca2797f568b79529e1b25948e34de511bcc0bd82fef1039a6d1b8eb0 \
--hash=sha256:d7d939b9285c9961ae8866ba75ef85da34d12bafe276efbf4eb6a131786d8379
# via mcp
mcp==1.29.0 \
--hash=sha256:52d01f334de1868cc3bb2d6604931126a67631f99a6c5d3b82ba47290315ec36 \
--hash=sha256:f5a075bb611f23d6f4d080c6a1699fa62772eebc562ba9e66b306ddde1c755f7
# via
# feast (pyproject.toml)
# fastapi-mcp
mdurl==0.1.2 \
--hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
--hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
Expand Down Expand Up @@ -7779,3 +7777,8 @@ zstandard==0.25.0 \
# via
# pyiceberg
# trino

httpx-sse==0.4.0 \
--hash=sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721 \
--hash=sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f
# via mcp
19 changes: 11 additions & 8 deletions sdk/python/requirements/py3.12-minimal-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1353,14 +1353,12 @@ markupsafe==3.0.3 \
--hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \
--hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50
# via jinja2
mcp==2.0.0 \
--hash=sha256:0f440e735c13ece8bb19bc62cf0b86f4313448432fbb77d35e14034f4e050728 \
--hash=sha256:1cb4c75d2d2c7b8c1d756355e5d82a39f2822cc7f13e22a2051d7ca3592349d6
# via fastapi-mcp
mcp-types==2.0.0 \
--hash=sha256:6b2de797ca2797f568b79529e1b25948e34de511bcc0bd82fef1039a6d1b8eb0 \
--hash=sha256:d7d939b9285c9961ae8866ba75ef85da34d12bafe276efbf4eb6a131786d8379
# via mcp
mcp==1.29.0 \
--hash=sha256:52d01f334de1868cc3bb2d6604931126a67631f99a6c5d3b82ba47290315ec36 \
--hash=sha256:f5a075bb611f23d6f4d080c6a1699fa62772eebc562ba9e66b306ddde1c755f7
# via
# feast (pyproject.toml)
# fastapi-mcp
mdurl==0.1.2 \
--hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
--hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
Expand Down Expand Up @@ -3361,3 +3359,8 @@ yarl==1.24.5 \
--hash=sha256:ff405d91509d88e8d44129cd87b18d70acd1f0c1aeabd7bc3c46792b1fe2acba \
--hash=sha256:ffcd54362564dc1a30fb74d8b8a6e5a6b11ebd5e27266adc3b7427a21a6c9104
# via aiohttp

httpx-sse==0.4.0 \
--hash=sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721 \
--hash=sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f
# via mcp
19 changes: 11 additions & 8 deletions sdk/python/requirements/py3.12-minimal-sdist-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1528,14 +1528,12 @@ markupsafe==3.0.3 \
--hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \
--hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50
# via jinja2
mcp==2.0.0 \
--hash=sha256:0f440e735c13ece8bb19bc62cf0b86f4313448432fbb77d35e14034f4e050728 \
--hash=sha256:1cb4c75d2d2c7b8c1d756355e5d82a39f2822cc7f13e22a2051d7ca3592349d6
# via fastapi-mcp
mcp-types==2.0.0 \
--hash=sha256:6b2de797ca2797f568b79529e1b25948e34de511bcc0bd82fef1039a6d1b8eb0 \
--hash=sha256:d7d939b9285c9961ae8866ba75ef85da34d12bafe276efbf4eb6a131786d8379
# via mcp
mcp==1.29.0 \
--hash=sha256:52d01f334de1868cc3bb2d6604931126a67631f99a6c5d3b82ba47290315ec36 \
--hash=sha256:f5a075bb611f23d6f4d080c6a1699fa62772eebc562ba9e66b306ddde1c755f7
# via
# feast (pyproject.toml)
# fastapi-mcp
mdurl==0.1.2 \
--hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
--hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
Expand Down Expand Up @@ -3630,6 +3628,11 @@ yarl==1.24.5 \
--hash=sha256:ffcd54362564dc1a30fb74d8b8a6e5a6b11ebd5e27266adc3b7427a21a6c9104
# via aiohttp

httpx-sse==0.4.0 \
--hash=sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721 \
--hash=sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f
# via mcp

# The following packages were excluded from the output:
# milvus-lite
# pymilvus
Expand Down
12 changes: 9 additions & 3 deletions sdk/python/tests/unit/infra/feature_servers/test_mcp_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from pydantic import ValidationError

import feast.api.registry.rest.rest_registry_server # noqa: F401
from feast.feature_store import FeatureStore
from feast.infra.mcp_servers.mcp_config import McpFeatureServerConfig
from feast.infra.mcp_servers.mcp_server import _resolve_schema_references_safe
Expand Down Expand Up @@ -394,12 +395,13 @@ class TestRestRegistryServerMCP(unittest.TestCase):
"""Test MCP integration in RestRegistryServer."""

@patch("fastapi_mcp.FastApiMCP")
@patch("feast.api.registry.rest.rest_registry_server.RegistryServer")
@patch("feast.api.registry.rest.rest_registry_server.RestRegistryServer._init_auth")
@patch(
"feast.api.registry.rest.rest_registry_server.RestRegistryServer._register_routes"
)
def test_mcp_mounted_when_enabled(
self, mock_register, mock_auth, mock_fast_api_mcp
self, mock_register, mock_auth, mock_grpc, mock_fast_api_mcp
):
"""Test that MCP is mounted on RestRegistryServer when registry.mcp.enabled is True."""
from feast.api.registry.rest.rest_registry_server import RestRegistryServer
Expand All @@ -418,11 +420,12 @@ def test_mcp_mounted_when_enabled(
mock_fast_api_mcp.assert_called_once_with(server.app, name="feast-registry-mcp")
mock_mcp_instance.mount_sse.assert_called_once()

@patch("feast.api.registry.rest.rest_registry_server.RegistryServer")
@patch("feast.api.registry.rest.rest_registry_server.RestRegistryServer._init_auth")
@patch(
"feast.api.registry.rest.rest_registry_server.RestRegistryServer._register_routes"
)
def test_mcp_not_mounted_when_disabled(self, mock_register, mock_auth):
def test_mcp_not_mounted_when_disabled(self, mock_register, mock_auth, mock_grpc):
"""Test that MCP is not mounted when registry.mcp.enabled is False."""
from feast.api.registry.rest.rest_registry_server import RestRegistryServer

Expand All @@ -436,11 +439,14 @@ def test_mcp_not_mounted_when_disabled(self, mock_register, mock_auth):
RestRegistryServer(mock_store)
mock_fast_api_mcp.assert_not_called()

@patch("feast.api.registry.rest.rest_registry_server.RegistryServer")
@patch("feast.api.registry.rest.rest_registry_server.RestRegistryServer._init_auth")
@patch(
"feast.api.registry.rest.rest_registry_server.RestRegistryServer._register_routes"
)
def test_mcp_not_mounted_when_mcp_config_absent(self, mock_register, mock_auth):
def test_mcp_not_mounted_when_mcp_config_absent(
self, mock_register, mock_auth, mock_grpc
):
"""Test that MCP is not mounted when registry.mcp is None."""
from feast.api.registry.rest.rest_registry_server import RestRegistryServer

Expand Down
Loading