Skip to content

Conversation

@codeflash-ai
Copy link
Contributor

@codeflash-ai codeflash-ai bot commented Nov 28, 2025

⚡️ This pull request contains optimizations for PR #10727

If you approve this dependent PR, these changes will be merged into the original PR branch feat/http-stream-mcp.

This PR will be automatically closed if the original PR is merged.


📄 62% (0.62x) speedup for remove_server_by_urls in src/backend/base/langflow/api/v1/mcp_projects.py

⏱️ Runtime : 32.0 milliseconds 19.8 milliseconds (best of 52 runs)

📝 Explanation and details

The optimized code achieves a 61% speedup through three key algorithmic improvements that reduce computational overhead:

1. Exception Handling Elimination in _normalize_url_list:

  • Original: Used try-except block with explicit error handling (51% of function time)
  • Optimized: Relies on Python's built-in list comprehension error handling
  • Impact: Eliminates exception overhead for the common case where input is already a valid sequence

2. Single-Pass Algorithm in _args_reference_urls (Primary Optimization):

  • Original: Made multiple passes through data - first creating args_strings list, then converting to set, then accessing last element (95% of function time spent in the final any() generator)
  • Optimized: Single loop that builds the set and tracks last_arg simultaneously, then uses efficient set intersection
  • Impact: Reduces O(n) list traversals from 3 to 1, and replaces expensive generator evaluation with fast set operations

3. Dictionary Access Optimization in remove_server_by_urls:

  • Original: Multiple config_data["mcpServers"] lookups and existence checks
  • Optimized: Single config_data.get("mcpServers") with cached reference
  • Impact: Eliminates redundant dictionary key lookups

Performance Analysis:
The line profiler shows the critical bottleneck was in _args_reference_urls (229ms → 47ms), specifically the any() generator expression that performed repeated string comparisons. The optimized version's set intersection (args_set & urls_set) leverages Python's highly optimized C implementation for set operations, making bulk URL matching significantly faster.

Test Case Benefits:

  • Large-scale tests (500+ servers) see the most improvement due to reduced algorithmic complexity
  • Mixed argument types benefit from the single-pass filtering
  • Multiple URL matching scenarios benefit from set intersection efficiency

The optimization maintains identical behavior while dramatically improving performance for scenarios with many servers and URLs, which appears to be the primary use case based on the test coverage.

Correctness verification report:

Test Status
⚙️ Existing Unit Tests 🔘 None Found
🌀 Generated Regression Tests 45 Passed
⏪ Replay Tests 🔘 None Found
🔎 Concolic Coverage Tests 🔘 None Found
📊 Tests Coverage 100.0%
🌀 Generated Regression Tests and Runtime
import copy
# function to test
from collections.abc import Sequence
from typing import Any

# imports
import pytest
from langflow.api.v1.mcp_projects import remove_server_by_urls

# unit tests

# -------------------- BASIC TEST CASES --------------------

def test_remove_single_server_by_exact_url():
    # Remove a server whose args match the given URL exactly (last argument)
    config = {
        "mcpServers": {
            "server1": {"args": ["--foo", "http://abc.com"]},
            "server2": {"args": ["--bar", "http://def.com"]},
        }
    }
    result, removed = remove_server_by_urls(copy.deepcopy(config), "http://abc.com")

def test_remove_multiple_servers_by_url_list():
    # Remove multiple servers whose args match any of the given URLs
    config = {
        "mcpServers": {
            "server1": {"args": ["--foo", "http://abc.com"]},
            "server2": {"args": ["--bar", "http://def.com"]},
            "server3": {"args": ["--baz", "http://ghi.com"]},
        }
    }
    urls = ["http://abc.com", "http://ghi.com"]
    result, removed = remove_server_by_urls(copy.deepcopy(config), urls)

def test_no_servers_match():
    # No servers should be removed if no args match the URLs
    config = {
        "mcpServers": {
            "server1": {"args": ["--foo", "http://abc.com"]},
            "server2": {"args": ["--bar", "http://def.com"]},
        }
    }
    result, removed = remove_server_by_urls(copy.deepcopy(config), "http://notfound.com")

def test_empty_mcpServers():
    # If mcpServers is empty, nothing should be removed
    config = {"mcpServers": {}}
    result, removed = remove_server_by_urls(copy.deepcopy(config), "http://abc.com")

def test_no_mcpServers_key():
    # If config_data has no "mcpServers", nothing should be removed
    config = {"otherKey": 123}
    result, removed = remove_server_by_urls(copy.deepcopy(config), "http://abc.com")

def test_remove_by_url_in_args_not_last():
    # Should remove if URL is present anywhere in args (not just last)
    config = {
        "mcpServers": {
            "server1": {"args": ["http://abc.com", "--foo"]},
            "server2": {"args": ["--bar", "http://def.com"]},
        }
    }
    result, removed = remove_server_by_urls(copy.deepcopy(config), "http://abc.com")

def test_remove_by_url_last_arg():
    # Should remove if URL is the last arg
    config = {
        "mcpServers": {
            "server1": {"args": ["--foo", "http://abc.com"]},
        }
    }
    result, removed = remove_server_by_urls(copy.deepcopy(config), "http://abc.com")

def test_remove_by_url_anywhere_in_args():
    # Should remove if URL is present anywhere in args (set membership)
    config = {
        "mcpServers": {
            "server1": {"args": ["--foo", "http://abc.com"]},
            "server2": {"args": ["http://abc.com", "--bar"]},
        }
    }
    result, removed = remove_server_by_urls(copy.deepcopy(config), "http://abc.com")

# -------------------- EDGE TEST CASES --------------------

def test_empty_url_list():
    # If URLs is an empty list, nothing should be removed
    config = {
        "mcpServers": {
            "server1": {"args": ["--foo", "http://abc.com"]},
        }
    }
    result, removed = remove_server_by_urls(copy.deepcopy(config), [])

def test_args_is_empty():
    # If a server's args is empty, it should not be removed
    config = {
        "mcpServers": {
            "server1": {"args": []},
            "server2": {"args": ["--foo", "http://abc.com"]},
        }
    }
    result, removed = remove_server_by_urls(copy.deepcopy(config), "http://abc.com")

def test_args_is_none():
    # If a server's args is None, it should not be removed
    config = {
        "mcpServers": {
            "server1": {"args": None},
            "server2": {"args": ["--foo", "http://abc.com"]},
        }
    }
    result, removed = remove_server_by_urls(copy.deepcopy(config), "http://abc.com")

def test_args_contains_non_str():
    # Non-string args should be ignored
    config = {
        "mcpServers": {
            "server1": {"args": [123, "http://abc.com"]},
            "server2": {"args": ["--foo", 456]},
        }
    }
    result, removed = remove_server_by_urls(copy.deepcopy(config), "http://abc.com")


def test_args_with_duplicate_urls():
    # If args contains the URL multiple times, still only remove once
    config = {
        "mcpServers": {
            "server1": {"args": ["http://abc.com", "http://abc.com"]},
        }
    }
    result, removed = remove_server_by_urls(copy.deepcopy(config), "http://abc.com")

def test_remove_server_with_mixed_arg_types():
    # Args contains a mix of strings and non-strings, only strings are checked
    config = {
        "mcpServers": {
            "server1": {"args": [None, "http://abc.com", 42]},
            "server2": {"args": [False, "--foo", "http://def.com"]},
        }
    }
    result, removed = remove_server_by_urls(copy.deepcopy(config), "http://abc.com")

def test_type_error_on_invalid_urls():
    # Passing a completely invalid type for urls should raise TypeError
    config = {
        "mcpServers": {
            "server1": {"args": ["--foo", "http://abc.com"]},
        }
    }
    with pytest.raises(TypeError):
        remove_server_by_urls(copy.deepcopy(config), object())


def test_remove_nothing_if_args_key_missing():
    # If a server has no 'args' key, should not be removed
    config = {
        "mcpServers": {
            "server1": {},
            "server2": {"args": ["--foo", "http://abc.com"]},
        }
    }
    result, removed = remove_server_by_urls(copy.deepcopy(config), "http://abc.com")

# -------------------- LARGE SCALE TEST CASES --------------------

def test_large_number_of_servers_removal():
    # Test with 1000 servers, half of which match the URL
    config = {
        "mcpServers": {
            f"server{i}": {"args": ["--foo", f"http://url{i%2}.com"]}
            for i in range(1000)
        }
    }
    # Only servers with even indices (url0) should be removed
    result, removed = remove_server_by_urls(copy.deepcopy(config), "http://url0.com")
    for name in removed:
        pass
    for i in range(1000):
        name = f"server{i}"
        if i % 2 == 0:
            pass
        else:
            pass

def test_large_number_of_urls():
    # Test with 1000 unique URLs, each matching one server
    config = {
        "mcpServers": {
            f"server{i}": {"args": ["--foo", f"http://url{i}.com"]}
            for i in range(1000)
        }
    }
    urls = [f"http://url{i}.com" for i in range(1000)]
    result, removed = remove_server_by_urls(copy.deepcopy(config), urls)

def test_large_config_no_removal():
    # Large config, but no matching URLs
    config = {
        "mcpServers": {
            f"server{i}": {"args": ["--foo", f"http://url{i}.com"]}
            for i in range(1000)
        }
    }
    urls = ["http://notfound.com"]
    result, removed = remove_server_by_urls(copy.deepcopy(config), urls)

def test_large_config_some_args_missing():
    # Some servers have missing or None args
    config = {
        "mcpServers": {
            f"server{i}": {"args": ["--foo", f"http://url{i}.com"]} if i % 3 == 0 else
            ({"args": None} if i % 3 == 1 else {})
            for i in range(300)
        }
    }
    urls = [f"http://url{i}.com" for i in range(0, 300, 3)]
    result, removed = remove_server_by_urls(copy.deepcopy(config), urls)
    for i in range(0, 300, 3):
        pass
    for i in range(1, 300):
        if i % 3 != 0:
            pass
# codeflash_output is used to check that the output of the original code is the same as that of the optimized code.
#------------------------------------------------
from collections.abc import Sequence
from typing import Any

# imports
import pytest
from langflow.api.v1.mcp_projects import remove_server_by_urls


# --- Function to test (copied as per instructions) ---
# Minimal stub for logger to avoid import error (since we don't test logging)
class DummyLogger:
    def debug(self, *args, **kwargs):
        pass
logger = DummyLogger()
from langflow.api.v1.mcp_projects import remove_server_by_urls

# --- Unit tests ---

# -------- BASIC TEST CASES --------

def test_remove_single_server_by_exact_url():
    # Remove one server with exact URL match in last arg
    config = {
        "mcpServers": {
            "serverA": {"args": ["foo", "bar", "http://remove.me"]},
            "serverB": {"args": ["baz", "qux", "http://keep.me"]},
        }
    }
    updated, removed = remove_server_by_urls(config, "http://remove.me")

def test_remove_multiple_servers_by_url_list():
    # Remove several servers by matching any URL in list
    config = {
        "mcpServers": {
            "server1": {"args": ["http://foo.com", "http://bar.com"]},
            "server2": {"args": ["http://baz.com", "http://qux.com"]},
            "server3": {"args": ["http://bar.com", "http://baz.com"]},
        }
    }
    urls = ["http://bar.com", "http://baz.com"]
    updated, removed = remove_server_by_urls(config, urls)

def test_no_server_removed_if_no_match():
    # No server should be removed if URLs don't match
    config = {
        "mcpServers": {
            "serverA": {"args": ["foo", "bar", "http://keep.me"]},
            "serverB": {"args": ["baz", "qux", "http://also.keep.me"]},
        }
    }
    updated, removed = remove_server_by_urls(config, "http://notfound.me")

def test_remove_server_with_url_in_middle_of_args():
    # Remove server if URL is anywhere in args
    config = {
        "mcpServers": {
            "serverA": {"args": ["foo", "http://remove.me", "bar"]},
            "serverB": {"args": ["baz", "qux", "http://keep.me"]},
        }
    }
    updated, removed = remove_server_by_urls(config, "http://remove.me")

def test_remove_server_with_url_as_last_arg():
    # Remove server if URL is last arg
    config = {
        "mcpServers": {
            "serverA": {"args": ["foo", "bar", "http://remove.me"]},
            "serverB": {"args": ["baz", "qux", "http://keep.me"]},
        }
    }
    updated, removed = remove_server_by_urls(config, ["http://remove.me"])

def test_remove_server_with_multiple_urls_in_args():
    # Remove server if any arg matches any URL
    config = {
        "mcpServers": {
            "serverA": {"args": ["foo", "http://remove.me", "bar"]},
            "serverB": {"args": ["baz", "http://also.remove.me", "qux"]},
            "serverC": {"args": ["baz", "qux", "http://keep.me"]},
        }
    }
    updated, removed = remove_server_by_urls(config, ["http://remove.me", "http://also.remove.me"])

# -------- EDGE TEST CASES --------

def test_empty_config_data():
    # No mcpServers key
    config = {}
    updated, removed = remove_server_by_urls(config, "http://remove.me")

def test_empty_mcpServers_dict():
    # mcpServers is empty
    config = {"mcpServers": {}}
    updated, removed = remove_server_by_urls(config, "http://remove.me")

def test_empty_urls_list():
    # Empty URL list should remove nothing
    config = {
        "mcpServers": {
            "serverA": {"args": ["foo", "bar", "http://remove.me"]},
        }
    }
    updated, removed = remove_server_by_urls(config, [])


def test_server_with_no_args_key():
    # If args key is missing, server should not be removed
    config = {
        "mcpServers": {
            "serverA": {"foo": "bar"},
            "serverB": {"args": ["http://remove.me"]},
        }
    }
    updated, removed = remove_server_by_urls(config, "http://remove.me")

def test_server_with_args_none():
    # If args is None, server should not be removed
    config = {
        "mcpServers": {
            "serverA": {"args": None},
            "serverB": {"args": ["http://remove.me"]},
        }
    }
    updated, removed = remove_server_by_urls(config, "http://remove.me")

def test_server_with_args_not_list():
    # If args is not a list but a string, should handle gracefully
    config = {
        "mcpServers": {
            "serverA": {"args": "http://remove.me"},
            "serverB": {"args": ["http://keep.me"]},
        }
    }
    updated, removed = remove_server_by_urls(config, "http://remove.me")

def test_urls_as_integer_should_raise_typeerror():
    # If URLs is an integer, should raise TypeError
    config = {
        "mcpServers": {
            "serverA": {"args": ["http://remove.me"]},
        }
    }
    with pytest.raises(TypeError):
        remove_server_by_urls(config, 123)

def test_urls_as_mixed_types():
    # URLs as a list of mixed types, should coerce to str and match
    config = {
        "mcpServers": {
            "serverA": {"args": ["foo", "bar", "123"]},
            "serverB": {"args": ["baz", "qux", "456"]},
        }
    }
    updated, removed = remove_server_by_urls(config, [123, 456])

def test_server_with_args_mixed_types():
    # Server args contain mixed types, only string args are considered
    config = {
        "mcpServers": {
            "serverA": {"args": ["foo", 123, "http://remove.me", None]},
            "serverB": {"args": ["baz", "qux", "http://keep.me"]},
        }
    }
    updated, removed = remove_server_by_urls(config, "http://remove.me")

def test_server_with_args_empty_list():
    # Server args is empty list, should not be removed
    config = {
        "mcpServers": {
            "serverA": {"args": []},
            "serverB": {"args": ["http://remove.me"]},
        }
    }
    updated, removed = remove_server_by_urls(config, "http://remove.me")

def test_server_with_args_all_non_strings():
    # Server args contains only non-string types
    config = {
        "mcpServers": {
            "serverA": {"args": [1, 2, 3]},
            "serverB": {"args": ["http://remove.me"]},
        }
    }
    updated, removed = remove_server_by_urls(config, "http://remove.me")

def test_server_with_args_last_arg_matches_url():
    # Only last arg matches URL
    config = {
        "mcpServers": {
            "serverA": {"args": ["foo", "bar", "http://remove.me"]},
            "serverB": {"args": ["baz", "qux", "http://keep.me"]},
        }
    }
    updated, removed = remove_server_by_urls(config, "http://remove.me")

def test_server_with_args_url_is_subset_of_arg():
    # URL is substring of an arg, should not match
    config = {
        "mcpServers": {
            "serverA": {"args": ["foo", "bar", "http://remove.me/extra"]},
            "serverB": {"args": ["baz", "qux", "http://keep.me"]},
        }
    }
    updated, removed = remove_server_by_urls(config, "http://remove.me")

def test_server_with_duplicate_urls_in_args():
    # Server args contains duplicate URLs, should still be removed
    config = {
        "mcpServers": {
            "serverA": {"args": ["http://remove.me", "http://remove.me"]},
            "serverB": {"args": ["baz", "qux", "http://keep.me"]},
        }
    }
    updated, removed = remove_server_by_urls(config, "http://remove.me")

# -------- LARGE SCALE TEST CASES --------

def test_large_number_of_servers_and_urls():
    # Remove servers from a large config with many servers and URLs
    n_servers = 500
    n_urls = 10
    urls_to_remove = [f"http://remove{i}.me" for i in range(n_urls)]
    config = {
        "mcpServers": {
            f"server{i}": {"args": ["foo", "bar", urls_to_remove[i % n_urls]]}
            for i in range(n_servers)
        }
    }
    updated, removed = remove_server_by_urls(config, urls_to_remove)

def test_large_number_of_servers_no_match():
    # Large config, none should be removed
    n_servers = 500
    config = {
        "mcpServers": {
            f"server{i}": {"args": ["foo", "bar", f"http://keep{i}.me"]}
            for i in range(n_servers)
        }
    }
    urls_to_remove = ["http://remove.me"]
    updated, removed = remove_server_by_urls(config, urls_to_remove)

def test_large_number_of_urls_some_matches():
    # Large URL list, only some match
    n_servers = 100
    n_urls = 100
    urls_to_remove = [f"http://remove{i}.me" for i in range(n_urls)]
    config = {
        "mcpServers": {
            f"server{i}": {"args": ["foo", "bar", f"http://remove{i}.me"]}
            for i in range(n_servers)
        }
    }
    updated, removed = remove_server_by_urls(config, urls_to_remove)

def test_large_config_with_mixed_args_types():
    # Large config, servers with mixed args types
    n_servers = 100
    urls_to_remove = ["http://remove.me"]
    config = {
        "mcpServers": {
            f"server{i}": {"args": ["foo", 123, "http://remove.me", None]} if i % 2 == 0
            else {"args": ["foo", "bar", f"http://keep{i}.me"]}
            for i in range(n_servers)
        }
    }
    updated, removed = remove_server_by_urls(config, urls_to_remove)
    for i in range(n_servers):
        name = f"server{i}"
        if i % 2 == 0:
            pass
        else:
            pass

def test_large_config_with_some_servers_missing_args():
    # Large config, some servers missing 'args'
    n_servers = 100
    urls_to_remove = ["http://remove.me"]
    config = {
        "mcpServers": {
            f"server{i}": {"args": ["foo", "bar", "http://remove.me"]} if i % 3 == 0
            else {"foo": "bar"}
            for i in range(n_servers)
        }
    }
    updated, removed = remove_server_by_urls(config, urls_to_remove)
    # Only servers with args and matching URL should be removed
    expected_removed = {f"server{i}" for i in range(n_servers) if i % 3 == 0}
    for i in range(n_servers):
        name = f"server{i}"
        if i % 3 == 0:
            pass
        else:
            pass
# codeflash_output is used to check that the output of the original code is the same as that of the optimized code.

To edit these changes git checkout codeflash/optimize-pr10727-2025-11-28T04.49.35 and push.

Codeflash

HzaRashid and others added 9 commits November 27, 2025 04:01
fix tests

refactor mcp and mcp_projects

backwards compat with SSE transport

provide streamable http option for json mcp config

remove streamable_http mgmt and update tests
The optimized code achieves a **61% speedup** through three key algorithmic improvements that reduce computational overhead:

**1. Exception Handling Elimination in `_normalize_url_list`:**
- **Original:** Used try-except block with explicit error handling (51% of function time)
- **Optimized:** Relies on Python's built-in list comprehension error handling
- **Impact:** Eliminates exception overhead for the common case where input is already a valid sequence

**2. Single-Pass Algorithm in `_args_reference_urls` (Primary Optimization):**
- **Original:** Made multiple passes through data - first creating `args_strings` list, then converting to set, then accessing last element (95% of function time spent in the final `any()` generator)
- **Optimized:** Single loop that builds the set and tracks `last_arg` simultaneously, then uses efficient set intersection
- **Impact:** Reduces O(n) list traversals from 3 to 1, and replaces expensive generator evaluation with fast set operations

**3. Dictionary Access Optimization in `remove_server_by_urls`:**
- **Original:** Multiple `config_data["mcpServers"]` lookups and existence checks
- **Optimized:** Single `config_data.get("mcpServers")` with cached reference
- **Impact:** Eliminates redundant dictionary key lookups

**Performance Analysis:**
The line profiler shows the critical bottleneck was in `_args_reference_urls` (229ms → 47ms), specifically the `any()` generator expression that performed repeated string comparisons. The optimized version's set intersection (`args_set & urls_set`) leverages Python's highly optimized C implementation for set operations, making bulk URL matching significantly faster.

**Test Case Benefits:**
- Large-scale tests (500+ servers) see the most improvement due to reduced algorithmic complexity
- Mixed argument types benefit from the single-pass filtering
- Multiple URL matching scenarios benefit from set intersection efficiency

The optimization maintains identical behavior while dramatically improving performance for scenarios with many servers and URLs, which appears to be the primary use case based on the test coverage.
@codeflash-ai codeflash-ai bot added the ⚡️ codeflash Optimization PR opened by Codeflash AI label Nov 28, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 28, 2025

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions bot added the community Pull Request from an external contributor label Nov 28, 2025
@codecov
Copy link

codecov bot commented Nov 28, 2025

Codecov Report

❌ Patch coverage is 53.84615% with 18 lines in your changes missing coverage. Please review.
✅ Project coverage is 32.38%. Comparing base (0ddfed3) to head (f8ea91b).
⚠️ Report is 14 commits behind head on feat/http-stream-mcp.

Files with missing lines Patch % Lines
...frontend/src/customization/utils/custom-mcp-url.ts 0.00% 12 Missing ⚠️
...ages/MainPage/pages/homePage/hooks/useMcpServer.ts 54.54% 1 Missing and 4 partials ⚠️
...ontrollers/API/queries/mcp/use-get-composer-url.ts 0.00% 1 Missing ⚠️

❌ Your project check has failed because the head coverage (40.05%) is below the target coverage (60.00%). You can increase the head coverage or adjust the target coverage.

Additional details and impacted files

Impacted file tree graph

@@                  Coverage Diff                  @@
##           feat/http-stream-mcp   #10773   +/-   ##
=====================================================
  Coverage                 32.38%   32.38%           
=====================================================
  Files                      1368     1368           
  Lines                     63412    63381   -31     
  Branches                   9373     9383   +10     
=====================================================
- Hits                      20537    20529    -8     
+ Misses                    41843    41817   -26     
- Partials                   1032     1035    +3     
Flag Coverage Δ
lfx 40.05% <100.00%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
...ackend/base/langflow/api/utils/mcp/config_utils.py 80.11% <ø> (-0.68%) ⬇️
src/backend/base/langflow/api/v1/mcp.py 48.23% <ø> (-1.21%) ⬇️
src/backend/base/langflow/api/v1/mcp_projects.py 22.61% <ø> (-0.28%) ⬇️
src/backend/base/langflow/api/v1/projects.py 29.55% <ø> (-0.13%) ⬇️
src/backend/base/langflow/api/v1/schemas.py 96.04% <ø> (ø)
src/backend/base/langflow/main.py 65.41% <ø> (ø)
...controllers/API/queries/mcp/use-patch-flows-mcp.ts 0.00% <ø> (ø)
...ntrollers/API/queries/mcp/use-patch-install-mcp.ts 0.00% <ø> (ø)
...ages/homePage/components/McpAutoInstallContent.tsx 80.00% <100.00%> (ø)
...nPage/pages/homePage/components/McpJsonContent.tsx 84.44% <100.00%> (+1.11%) ⬆️
... and 6 more
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@HzaRashid HzaRashid force-pushed the feat/http-stream-mcp branch 4 times, most recently from d053266 to 9f7014d Compare December 3, 2025 22:26
Base automatically changed from feat/http-stream-mcp to main December 8, 2025 21:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

⚡️ codeflash Optimization PR opened by Codeflash AI community Pull Request from an external contributor

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants