Skip to content
Merged
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
11 changes: 10 additions & 1 deletion src/codeweaver/server/mcp/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,10 @@ def _setup_server[TransportT: Literal["stdio", "streamable-http"]](
run_args = mutable_args.pop("run_args", {})
# Remove transport from args - it's not a FastMCP constructor parameter
mutable_args.pop("transport", None)
# FastMCP v3: include_tags/exclude_tags are no longer constructor parameters.
# Extract them here and apply via app.enable()/app.disable() after construction.
include_tags: set[str] | None = mutable_args.pop("include_tags", None)
exclude_tags: set[str] | None = mutable_args.pop("exclude_tags", None)

# Always use default middleware classes for this transport
from codeweaver.server.mcp.middleware import default_middleware_for_transport
Expand All @@ -315,6 +319,11 @@ def _setup_server[TransportT: Literal["stdio", "streamable-http"]](
)
app = register_tools(app)
app = register_middleware(app, cast(list[type[McpMiddleware]], middleware), middleware_opts)
# FastMCP v3: Apply tag-based visibility filtering using the new enable()/disable() API
if exclude_tags:
app.disable(tags=exclude_tags)
if include_tags:
app.enable(tags=include_tags, only=True)
if is_http:
from codeweaver.server.mcp.state import CwMcpHttpState

Expand Down Expand Up @@ -355,7 +364,7 @@ async def create_stdio_server(
http_settings = DictView(FastMcpServerSettingsDict(**cast(dict, http_settings)))
else:
http_settings = _get_fastmcp_settings_map(http=True)
run_args = http_settings.get("run_args", {})
run_args = http_settings.get("run_args", {})
resolved_host = host or run_args.get("host", LOCALHOST)
resolved_port = port or run_args.get("port", DEFAULT_MCP_PORT)
url = f"http://{resolved_host}:{resolved_port}{http_settings.get('path', MCP_ENDPOINT)}"
Expand Down
3 changes: 1 addition & 2 deletions tests/unit/core/types/test_chunk_embeddings_properties.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,10 @@

import pytest

from codeweaver.core.utils.generation import uuid7

from codeweaver.core import CodeChunk, Span
from codeweaver.core.metadata import ChunkKind, ExtCategory
from codeweaver.core.types import ChunkEmbeddings, CodeWeaverSparseEmbedding, EmbeddingBatchInfo
from codeweaver.core.utils.generation import uuid7


@pytest.fixture
Expand Down
3 changes: 1 addition & 2 deletions tests/unit/core/types/test_embedding_batch_info_intent.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@

import pytest

from codeweaver.core.utils.generation import uuid7

from codeweaver.core.types import CodeWeaverSparseEmbedding, EmbeddingBatchInfo, EmbeddingKind
from codeweaver.core.utils.generation import uuid7


@pytest.mark.unit
Expand Down
5 changes: 4 additions & 1 deletion tests/unit/test_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
#
# SPDX-License-Identifier: MIT OR Apache-2.0

from unittest.mock import patch
import signal

from unittest.mock import patch

import pytest

from codeweaver.main import _setup_signal_handler


def test_setup_signal_handler_first_interrupt():
"""Test that the first interrupt raises KeyboardInterrupt."""
with patch("signal.signal") as mock_signal:
Expand Down
Loading
Loading