Skip to content

Conversation

@codeflash-ai
Copy link
Contributor

@codeflash-ai codeflash-ai bot commented Nov 27, 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.


📄 97% (0.97x) speedup for config_contains_server_url in src/backend/base/langflow/api/v1/mcp_projects.py

⏱️ Runtime : 9.30 milliseconds 4.72 milliseconds (best of 66 runs)

📝 Explanation and details

The optimization achieves a 97% speedup by fundamentally changing how URL matching is performed in the _args_reference_urls function. The key change replaces an expensive any() generator expression with efficient set operations.

Primary Optimization:
The original code used any((url == last_arg) or (url in args_set) for url in urls) which performs individual comparisons for each URL. The optimized version uses bool(args_set.intersection(urls)) or last_arg in urls, leveraging Python's highly optimized C-level set intersection operation.

Performance Impact:

  • Original: 64.7ms spent in the critical line (93% of function time)
  • Optimized: 4.6ms spent in the critical line (49% of function time)
  • This represents a ~14x improvement on the bottleneck operation alone

Why This Works:
Set intersection (args_set.intersection(urls)) is implemented in C and processes multiple items simultaneously, while the generator expression processes URLs one-by-one in Python bytecode. The or last_arg in urls fallback handles the special case efficiently when no general intersection exists.

Minor Optimization:
The code also extracts server_config.get("args", []) into a variable to avoid repeated dictionary lookups, though this has minimal impact compared to the set intersection change.

Test Case Performance:
The optimization particularly excels with large-scale test cases involving many servers, URLs, or arguments, where set operations provide the most benefit over iterative comparisons. Basic functionality and edge cases maintain identical behavior while running significantly faster.

Correctness verification report:

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

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


# Dummy logger for testing (since lfx.log.logger is not available)
class DummyLogger:
    def debug(self, *args, **kwargs):
        pass
logger = DummyLogger()
from langflow.api.v1.mcp_projects import config_contains_server_url

# unit tests

# =========================
# 1. Basic Test Cases
# =========================

def test_empty_config_returns_false():
    # No servers at all
    config = {}
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_no_mcpServers_key_returns_false():
    # config has no 'mcpServers' key
    config = {"otherKey": 123}
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_empty_mcpServers_returns_false():
    # 'mcpServers' is empty
    config = {"mcpServers": {}}
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_single_server_args_match_last_arg():
    # The last arg matches the URL
    config = {
        "mcpServers": {
            "server1": {"args": ["foo", "bar", "http://example.com"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_single_server_args_match_any_arg():
    # Any arg matches the URL, not just the last
    config = {
        "mcpServers": {
            "server1": {"args": ["http://example.com", "bar", "baz"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_multiple_servers_one_matches():
    # Only one server matches
    config = {
        "mcpServers": {
            "server1": {"args": ["foo", "bar"]},
            "server2": {"args": ["baz", "http://example.com"]},
            "server3": {"args": ["qux"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_multiple_servers_none_match():
    # None of the servers match
    config = {
        "mcpServers": {
            "server1": {"args": ["foo", "bar"]},
            "server2": {"args": ["baz", "quux"]},
        }
    }
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_url_as_list_and_string_equivalent():
    # Passing a single string or a list with that string yields same result
    config = {
        "mcpServers": {
            "server1": {"args": ["foo", "http://example.com", "baz"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://example.com")
    codeflash_output = config_contains_server_url(config, ["http://example.com"])

def test_multiple_urls_one_matches():
    # Multiple URLs, only one matches
    config = {
        "mcpServers": {
            "server1": {"args": ["foo", "bar", "http://foo.com"]},
            "server2": {"args": ["baz", "http://example.com"]},
        }
    }
    urls = ["http://foo.com", "http://notfound.com"]
    codeflash_output = config_contains_server_url(config, urls)

def test_multiple_urls_none_match():
    # Multiple URLs, none match
    config = {
        "mcpServers": {
            "server1": {"args": ["foo", "bar"]},
            "server2": {"args": ["baz", "quux"]},
        }
    }
    urls = ["http://foo.com", "http://bar.com"]
    codeflash_output = config_contains_server_url(config, urls)

# =========================
# 2. Edge Test Cases
# =========================

def test_args_is_none():
    # args is None
    config = {
        "mcpServers": {
            "server1": {"args": None}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_args_is_empty_list():
    # args is an empty list
    config = {
        "mcpServers": {
            "server1": {"args": []}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_args_contains_non_string_types():
    # args contains ints, dicts, etc. Only strings are checked
    config = {
        "mcpServers": {
            "server1": {"args": [42, {"url": "http://example.com"}, "http://example.com"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_args_all_non_strings():
    # args contains no strings at all
    config = {
        "mcpServers": {
            "server1": {"args": [1, 2, 3, {"foo": "bar"}]}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_urls_is_empty_list():
    # urls is empty list
    config = {
        "mcpServers": {
            "server1": {"args": ["http://example.com"]}
        }
    }
    codeflash_output = config_contains_server_url(config, [])

def test_urls_is_none_raises():
    # urls is None should raise TypeError
    config = {
        "mcpServers": {
            "server1": {"args": ["http://example.com"]}
        }
    }
    with pytest.raises(TypeError):
        config_contains_server_url(config, None)

def test_urls_is_int_raises():
    # urls is an int should raise TypeError
    config = {
        "mcpServers": {
            "server1": {"args": ["http://example.com"]}
        }
    }
    with pytest.raises(TypeError):
        config_contains_server_url(config, 123)

def test_args_is_string():
    # args is a string (not a list), should not match
    config = {
        "mcpServers": {
            "server1": {"args": "http://example.com"}
        }
    }
    # Since _args_reference_urls expects a sequence, this will treat each char as an arg, so will not match
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_server_config_missing_args_key():
    # server config has no 'args' key
    config = {
        "mcpServers": {
            "server1": {"foo": "bar"}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_server_config_args_is_dict():
    # args is a dict, should be ignored
    config = {
        "mcpServers": {
            "server1": {"args": {"url": "http://example.com"}}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_server_config_args_is_tuple():
    # args is a tuple, should work
    config = {
        "mcpServers": {
            "server1": {"args": ("foo", "bar", "http://example.com")}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_urls_contains_non_string_types():
    # urls contains ints and strings, should coerce to string and match
    config = {
        "mcpServers": {
            "server1": {"args": ["foo", "123"]}
        }
    }
    codeflash_output = config_contains_server_url(config, [123, "bar"])

def test_url_is_empty_string():
    # url is an empty string
    config = {
        "mcpServers": {
            "server1": {"args": ["", "foo"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "")

def test_args_is_empty_string():
    # args contains an empty string, url is empty string
    config = {
        "mcpServers": {
            "server1": {"args": ["", "foo"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "")

def test_args_and_urls_both_empty_strings():
    # Both are empty strings
    config = {
        "mcpServers": {
            "server1": {"args": [""]}
        }
    }
    codeflash_output = config_contains_server_url(config, "")

def test_args_with_duplicate_urls():
    # args contains duplicates, should still match
    config = {
        "mcpServers": {
            "server1": {"args": ["foo", "http://example.com", "http://example.com"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_urls_with_duplicates():
    # urls contains duplicates, should still match
    config = {
        "mcpServers": {
            "server1": {"args": ["foo", "http://example.com"]}
        }
    }
    codeflash_output = config_contains_server_url(config, ["http://example.com", "http://example.com"])

# =========================
# 3. Large Scale Test Cases
# =========================

def test_large_number_of_servers_one_match():
    # 500 servers, only one matches
    config = {
        "mcpServers": {
            f"server{i}": {"args": ["foo", f"bar{i}"]} for i in range(500)
        }
    }
    # Add a matching server
    config["mcpServers"]["server123"]["args"].append("http://example.com")
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_large_number_of_servers_none_match():
    # 500 servers, none match
    config = {
        "mcpServers": {
            f"server{i}": {"args": ["foo", f"bar{i}"]} for i in range(500)
        }
    }
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_large_number_of_urls_one_match():
    # One server, 500 urls, only one matches
    urls = [f"http://foo{i}.com" for i in range(499)] + ["http://example.com"]
    config = {
        "mcpServers": {
            "server1": {"args": ["foo", "bar", "http://example.com"]}
        }
    }
    codeflash_output = config_contains_server_url(config, urls)

def test_large_number_of_urls_none_match():
    # One server, 500 urls, none match
    urls = [f"http://foo{i}.com" for i in range(500)]
    config = {
        "mcpServers": {
            "server1": {"args": ["foo", "bar", "baz"]}
        }
    }
    codeflash_output = config_contains_server_url(config, urls)

def test_large_args_list_match_last():
    # args list of 999 elements, last is the url
    args = [f"foo{i}" for i in range(998)] + ["http://example.com"]
    config = {
        "mcpServers": {
            "server1": {"args": args}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_large_args_list_match_any():
    # args list of 999 elements, match is in the middle
    args = [f"foo{i}" for i in range(500)] + ["http://example.com"] + [f"foo{i}" for i in range(498)]
    config = {
        "mcpServers": {
            "server1": {"args": args}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://example.com")

def test_large_args_and_urls_both_large():
    # 500 servers, each with 2 args, 500 urls, only one match
    urls = [f"http://foo{i}.com" for i in range(499)] + ["http://example.com"]
    config = {
        "mcpServers": {
            f"server{i}": {"args": ["foo", f"http://foo{i}.com"]} for i in range(500)
        }
    }
    # Add one matching arg to one server
    config["mcpServers"]["server250"]["args"].append("http://example.com")
    codeflash_output = config_contains_server_url(config, urls)
# 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 config_contains_server_url

# unit tests

# -------------------------------
# Basic Test Cases
# -------------------------------

def test_single_server_single_url_match():
    # One server, one URL, args contains the URL
    config = {
        "mcpServers": {
            "srv1": {"args": ["--foo", "http://myserver.com"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://myserver.com")

def test_single_server_single_url_no_match():
    # One server, one URL, args does not contain the URL
    config = {
        "mcpServers": {
            "srv1": {"args": ["--foo", "http://otherserver.com"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://myserver.com")

def test_multiple_servers_one_matches():
    # Two servers, only one contains the URL
    config = {
        "mcpServers": {
            "srv1": {"args": ["--foo", "http://otherserver.com"]},
            "srv2": {"args": ["--bar", "http://myserver.com"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://myserver.com")

def test_multiple_servers_none_match():
    # Two servers, neither contains the URL
    config = {
        "mcpServers": {
            "srv1": {"args": ["--foo", "http://foo.com"]},
            "srv2": {"args": ["--bar", "http://bar.com"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://myserver.com")

def test_multiple_urls_one_matches():
    # One server, multiple URLs, one matches
    config = {
        "mcpServers": {
            "srv1": {"args": ["--foo", "http://bar.com"]}
        }
    }
    urls = ["http://foo.com", "http://bar.com", "http://baz.com"]
    codeflash_output = config_contains_server_url(config, urls)

def test_multiple_urls_none_match():
    # One server, multiple URLs, none match
    config = {
        "mcpServers": {
            "srv1": {"args": ["--foo", "http://notfound.com"]}
        }
    }
    urls = ["http://foo.com", "http://bar.com"]
    codeflash_output = config_contains_server_url(config, urls)

def test_args_with_non_string_types():
    # Args contains non-string types, only string args are checked
    config = {
        "mcpServers": {
            "srv1": {"args": ["--foo", 123, None, "http://bar.com"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://bar.com")

def test_args_all_non_string_types():
    # Args contains only non-string types
    config = {
        "mcpServers": {
            "srv1": {"args": [123, None, 45.6]}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://bar.com")

def test_empty_args_list():
    # Args list is empty
    config = {
        "mcpServers": {
            "srv1": {"args": []}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://foo.com")

def test_missing_args_key():
    # Args key is missing entirely
    config = {
        "mcpServers": {
            "srv1": {}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://foo.com")

# -------------------------------
# Edge Test Cases
# -------------------------------

def test_empty_config():
    # Config is empty dict
    config = {}
    codeflash_output = config_contains_server_url(config, "http://foo.com")

def test_no_mcpServers_key():
    # Config has no "mcpServers" key
    config = {"otherKey": 42}
    codeflash_output = config_contains_server_url(config, "http://foo.com")

def test_empty_mcpServers_dict():
    # "mcpServers" is present but empty
    config = {"mcpServers": {}}
    codeflash_output = config_contains_server_url(config, "http://foo.com")

def test_urls_is_empty_list():
    # URLs is an empty list
    config = {
        "mcpServers": {
            "srv1": {"args": ["http://foo.com"]}
        }
    }
    codeflash_output = config_contains_server_url(config, [])

def test_urls_is_empty_string():
    # URLs is an empty string (should match only if "" is in args)
    config = {
        "mcpServers": {
            "srv1": {"args": ["", "http://foo.com"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "")

def test_args_is_none():
    # Args is None
    config = {
        "mcpServers": {
            "srv1": {"args": None}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://foo.com")

def test_urls_is_non_string_sequence():
    # URLs is a list of non-strings (should coerce to str)
    config = {
        "mcpServers": {
            "srv1": {"args": ["123"]}
        }
    }
    codeflash_output = config_contains_server_url(config, [123])

def test_urls_is_mixed_types():
    # URLs is a list with mixed types
    config = {
        "mcpServers": {
            "srv1": {"args": ["foo", "456"]}
        }
    }
    codeflash_output = config_contains_server_url(config, ["foo", 456])

def test_args_is_string():
    # Args is a string, not a list (should not match)
    config = {
        "mcpServers": {
            "srv1": {"args": "http://foo.com"}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://foo.com")

def test_args_is_empty_string():
    # Args is an empty string
    config = {
        "mcpServers": {
            "srv1": {"args": ""}
        }
    }
    codeflash_output = config_contains_server_url(config, "")

def test_urls_is_none():
    # URLs is None (should raise TypeError)
    config = {
        "mcpServers": {
            "srv1": {"args": ["foo"]}
        }
    }
    with pytest.raises(TypeError):
        config_contains_server_url(config, None)

def test_urls_is_int():
    # URLs is an int (should raise TypeError)
    config = {
        "mcpServers": {
            "srv1": {"args": ["123"]}
        }
    }
    with pytest.raises(TypeError):
        config_contains_server_url(config, 123)

def test_args_is_dict():
    # Args is a dict (should not match)
    config = {
        "mcpServers": {
            "srv1": {"args": {"foo": "bar"}}
        }
    }
    codeflash_output = config_contains_server_url(config, "foo")



def test_args_contains_duplicates():
    # Args contains duplicate URLs, only one needed to match
    config = {
        "mcpServers": {
            "srv1": {"args": ["http://foo.com", "http://foo.com"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://foo.com")

def test_last_arg_matching():
    # Only the last arg matches the URL
    config = {
        "mcpServers": {
            "srv1": {"args": ["a", "b", "http://foo.com"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://foo.com")

def test_url_matches_in_middle_of_args():
    # URL matches in the middle of the args, not last
    config = {
        "mcpServers": {
            "srv1": {"args": ["http://foo.com", "b", "c"]}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://foo.com")

def test_url_matches_last_arg_and_set():
    # URL matches both last arg and in set
    config = {
        "mcpServers": {
            "srv1": {"args": ["foo", "bar", "baz"]}
        }
    }
    codeflash_output = config_contains_server_url(config, ["baz"])

# -------------------------------
# Large Scale Test Cases
# -------------------------------

def test_large_number_of_servers_one_match():
    # 500 servers, only one contains the matching URL
    config = {
        "mcpServers": {
            f"srv{i}": {"args": [f"http://server{i}.com"]} for i in range(500)
        }
    }
    # Add the matching URL to the last server
    config["mcpServers"]["srv499"]["args"].append("http://target.com")
    codeflash_output = config_contains_server_url(config, "http://target.com")

def test_large_number_of_servers_none_match():
    # 500 servers, none contain the matching URL
    config = {
        "mcpServers": {
            f"srv{i}": {"args": [f"http://server{i}.com"]} for i in range(500)
        }
    }
    codeflash_output = config_contains_server_url(config, "http://notfound.com")

def test_large_number_of_urls_one_match():
    # One server, 500 URLs, only one matches
    config = {
        "mcpServers": {
            "srv1": {"args": ["foo", "bar", "http://special.com"]}
        }
    }
    urls = [f"http://url{i}.com" for i in range(499)] + ["http://special.com"]
    codeflash_output = config_contains_server_url(config, urls)

def test_large_number_of_urls_none_match():
    # One server, 500 URLs, none match
    config = {
        "mcpServers": {
            "srv1": {"args": ["foo", "bar", "baz"]}
        }
    }
    urls = [f"http://url{i}.com" for i in range(500)]
    codeflash_output = config_contains_server_url(config, urls)

def test_large_args_list_match_last():
    # One server, 500 args, last arg matches
    args = ["foo"] * 499 + ["http://target.com"]
    config = {
        "mcpServers": {
            "srv1": {"args": args}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://target.com")

def test_large_args_list_match_in_middle():
    # One server, 500 args, match in the middle
    args = ["foo"] * 250 + ["http://target.com"] + ["bar"] * 249
    config = {
        "mcpServers": {
            "srv1": {"args": args}
        }
    }
    codeflash_output = config_contains_server_url(config, "http://target.com")

def test_large_args_and_urls_both_large():
    # 100 servers, each with 10 args, 1000 URLs, only one match
    config = {
        "mcpServers": {
            f"srv{i}": {"args": [f"foo{i}_{j}" for j in range(10)]} for i in range(100)
        }
    }
    # Insert a match in one server's args
    config["mcpServers"]["srv42"]["args"].append("http://special.com")
    urls = [f"http://url{i}.com" for i in range(999)] + ["http://special.com"]
    codeflash_output = config_contains_server_url(config, urls)

def test_large_args_and_urls_none_match():
    # 100 servers, each with 10 args, 1000 URLs, no matches
    config = {
        "mcpServers": {
            f"srv{i}": {"args": [f"foo{i}_{j}" for j in range(10)]} for i in range(100)
        }
    }
    urls = [f"http://url{i}.com" for i in range(1000)]
    codeflash_output = config_contains_server_url(config, urls)
# 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-27T04.36.16 and push.

Codeflash

HzaRashid and others added 5 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 optimization achieves a **97% speedup** by fundamentally changing how URL matching is performed in the `_args_reference_urls` function. The key change replaces an expensive `any()` generator expression with efficient set operations.

**Primary Optimization:**
The original code used `any((url == last_arg) or (url in args_set) for url in urls)` which performs individual comparisons for each URL. The optimized version uses `bool(args_set.intersection(urls)) or last_arg in urls`, leveraging Python's highly optimized C-level set intersection operation.

**Performance Impact:**
- **Original**: 64.7ms spent in the critical line (93% of function time)
- **Optimized**: 4.6ms spent in the critical line (49% of function time) 
- This represents a ~14x improvement on the bottleneck operation alone

**Why This Works:**
Set intersection (`args_set.intersection(urls)`) is implemented in C and processes multiple items simultaneously, while the generator expression processes URLs one-by-one in Python bytecode. The `or last_arg in urls` fallback handles the special case efficiently when no general intersection exists.

**Minor Optimization:**
The code also extracts `server_config.get("args", [])` into a variable to avoid repeated dictionary lookups, though this has minimal impact compared to the set intersection change.

**Test Case Performance:**
The optimization particularly excels with large-scale test cases involving many servers, URLs, or arguments, where set operations provide the most benefit over iterative comparisons. Basic functionality and edge cases maintain identical behavior while running significantly faster.
@codeflash-ai codeflash-ai bot added the ⚡️ codeflash Optimization PR opened by Codeflash AI label Nov 27, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 27, 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.

Tip

📝 Customizable high-level summaries are now available in beta!

You can now customize how CodeRabbit generates the high-level summary in your pull requests — including its content, structure, tone, and formatting.

  • Provide your own instructions using the high_level_summary_instructions setting.
  • Format the summary however you like (bullet lists, tables, multi-section layouts, contributor stats, etc.).
  • Use high_level_summary_in_walkthrough to move the summary from the description to the walkthrough section.

Example instruction:

"Divide the high-level summary into five sections:

  1. 📝 Description — Summarize the main change in 50–60 words, explaining what was done.
  2. 📓 References — List relevant issues, discussions, documentation, or related PRs.
  3. 📦 Dependencies & Requirements — Mention any new/updated dependencies, environment variable changes, or configuration updates.
  4. 📊 Contributor Summary — Include a Markdown table showing contributions:
    | Contributor | Lines Added | Lines Removed | Files Changed |
  5. ✔️ Additional Notes — Add any extra reviewer context.
    Keep each section concise (under 200 words) and use bullet or numbered lists for clarity."

Note: This feature is currently in beta for Pro-tier users, and pricing will be announced later.


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 27, 2025
@codecov
Copy link

codecov bot commented Nov 27, 2025

Codecov Report

❌ Patch coverage is 0% with 3 lines in your changes missing coverage. Please review.
✅ Project coverage is 32.65%. Comparing base (e6168d8) to head (2251fc0).

Files with missing lines Patch % Lines
src/backend/base/langflow/api/v1/mcp_projects.py 0.00% 3 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@                   Coverage Diff                    @@
##           feat/http-stream-mcp   #10748      +/-   ##
========================================================
- Coverage                 32.66%   32.65%   -0.01%     
========================================================
  Files                      1368     1368              
  Lines                     63685    63686       +1     
  Branches                   9367     9367              
========================================================
- Hits                      20801    20798       -3     
- Misses                    41854    41858       +4     
  Partials                   1030     1030              
Flag Coverage Δ
backend 51.92% <0.00%> (-0.03%) ⬇️
lfx 40.05% <ø> (ø)

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

Files with missing lines Coverage Δ
src/backend/base/langflow/api/v1/mcp_projects.py 34.95% <0.00%> (-0.05%) ⬇️

... and 3 files with indirect coverage changes

🚀 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 5 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