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
20 changes: 10 additions & 10 deletions redisvl/mcp/filters.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
from __future__ import annotations

from typing import Any, Iterable, Optional
from typing import Any, Dict, Iterable, List, Optional, Union

from redisvl.mcp.errors import MCPErrorCode, RedisVLMCPError
from redisvl.query.filter import FilterExpression, Num, Tag, Text
from redisvl.schema import IndexSchema


def parse_filter(
value: Optional[str | dict[str, Any]], schema: IndexSchema
) -> Optional[str | FilterExpression]:
value: Optional[Union[str, Dict[str, Any]]], schema: IndexSchema
) -> Optional[Union[str, FilterExpression]]:
"""Parse an MCP filter value into a RedisVL filter representation."""
if value is None:
return None
Expand All @@ -24,7 +22,7 @@ def parse_filter(
return _parse_expression(value, schema)


def _parse_expression(value: dict[str, Any], schema: IndexSchema) -> FilterExpression:
def _parse_expression(value: Dict[str, Any], schema: IndexSchema) -> FilterExpression:
logical_keys = [key for key in ("and", "or", "not") if key in value]
if logical_keys:
if len(logical_keys) != 1 or len(value) != 1:
Expand Down Expand Up @@ -53,7 +51,7 @@ def _parse_expression(value: dict[str, Any], schema: IndexSchema) -> FilterExpre
retryable=False,
)

expressions: list[FilterExpression] = []
expressions: List[FilterExpression] = []
for child in children:
if not isinstance(child, dict):
raise RedisVLMCPError(
Expand Down Expand Up @@ -205,7 +203,7 @@ def _require_string(value: Any, field_name: str, op: str) -> str:
return value


def _require_string_list(value: Any, field_name: str, op: str) -> list[str]:
def _require_string_list(value: Any, field_name: str, op: str) -> List[str]:
if not isinstance(value, list) or not value:
raise RedisVLMCPError(
f"filter value for field '{field_name}' and operator '{op}' must be a non-empty array",
Expand All @@ -216,7 +214,7 @@ def _require_string_list(value: Any, field_name: str, op: str) -> list[str]:
return strings


def _require_number(value: Any, field_name: str, op: str) -> int | float:
def _require_number(value: Any, field_name: str, op: str) -> Union[int, float]:
if isinstance(value, bool) or not isinstance(value, (int, float)):
raise RedisVLMCPError(
f"filter value for field '{field_name}' and operator '{op}' must be numeric",
Expand All @@ -226,7 +224,9 @@ def _require_number(value: Any, field_name: str, op: str) -> int | float:
return value


def _require_number_list(value: Any, field_name: str, op: str) -> list[int | float]:
def _require_number_list(
value: Any, field_name: str, op: str
) -> List[Union[int, float]]:
if not isinstance(value, list) or not value:
raise RedisVLMCPError(
f"filter value for field '{field_name}' and operator '{op}' must be a non-empty array",
Expand Down
6 changes: 4 additions & 2 deletions redisvl/mcp/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
from redisvl.index import AsyncSearchIndex
from redisvl.mcp.config import MCPConfig, load_mcp_config
from redisvl.mcp.settings import MCPSettings
from redisvl.mcp.tools.search import register_search_tool
from redisvl.mcp.tools.upsert import register_upsert_tool
from redisvl.redis.connection import RedisConnectionFactory, is_version_gte
from redisvl.schema import IndexSchema

Expand Down Expand Up @@ -181,9 +183,9 @@ def _register_tools(self) -> None:
if self._tools_registered or not hasattr(self, "tool"):
return

from redisvl.mcp.tools.search import register_search_tool

register_search_tool(self)
if not self.mcp_settings.read_only:
register_upsert_tool(self)
self._tools_registered = True

@staticmethod
Expand Down
3 changes: 2 additions & 1 deletion redisvl/mcp/tools/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from redisvl.mcp.tools.search import search_records
from redisvl.mcp.tools.upsert import upsert_records

__all__ = ["search_records"]
__all__ = ["search_records", "upsert_records"]
Loading
Loading