MGMT-21086: support different protocols#38
Conversation
|
@rccrdpccl: This pull request references MGMT-21086 which is a valid jira issue. Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the task to target the "4.20.0" version, but no target version was set. DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
WalkthroughThe changes update the Changes
Estimated code review effort3 (~40 minutes) Suggested labels
Poem
✨ Finishing Touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
|
@rccrdpccl: This pull request references MGMT-21086 which is a valid jira issue. Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the task to target the "4.20.0" version, but no target version was set. DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (1)
server.py (1)
546-549: Fix docstring formatting issue.Remove the blank line after the docstring to satisfy pydocstyle requirements.
def list_tools() -> list[str]: """List all MCP tools.""" - tools = asyncio.run(mcp_server.get_tools()) return list(tools.keys())
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock
📒 Files selected for processing (2)
pyproject.toml(1 hunks)server.py(17 hunks)
🪛 GitHub Actions: Black
server.py
[error] 1-1: Black formatting check failed. The file would be reformatted. Run 'black server.py' to fix code style issues.
🪛 GitHub Actions: Pydocstyle
server.py
[error] 547-547: pydocstyle D202: No blank lines allowed after function docstring (found 1) in public function list_tools.
🪛 GitHub Actions: Python linter
server.py
[error] 67-67: pylint E1101: Instance of 'FastMCP' has no 'get_context' member (no-member)
[error] 94-94: pylint E1101: Instance of 'FastMCP' has no 'get_context' member (no-member)
[error] 34-34: pylint E1101: Module 'server' has no 'mcp' member (no-member)
[error] 95-95: pylint E1101: Module 'server' has no 'mcp' member (no-member)
[error] 224-224: pylint E1101: Module 'server' has no 'mcp' member (no-member)
🪛 GitHub Actions: Unit Tests
server.py
[error] 34-34: AttributeError: module 'server' has no attribute 'mcp' at setup of multiple TestTokenFunctions tests.
[error] 95-95: AttributeError: module 'server' has no attribute 'mcp' in test_get_offline_token_no_request.
[error] 224-224: AttributeError: module 'server' has no attribute 'mcp' in test_get_access_token_no_request_context.
[error] 265-265: TypeError: 'FunctionTool' object is not callable in test_cluster_info_success.
[error] 298-298: TypeError: 'FunctionTool' object is not callable in test_list_clusters_success.
[error] 318-318: TypeError: 'FunctionTool' object is not callable in test_cluster_events_success.
[error] 340-340: TypeError: 'FunctionTool' object is not callable in test_host_events_success.
[error] 370-370: TypeError: 'FunctionTool' object is not callable in test_cluster_iso_download_url_success.
[error] 424-424: TypeError: 'FunctionTool' object is not callable in test_cluster_iso_download_url_multiple_infraenvs.
[error] 464-464: TypeError: 'FunctionTool' object is not callable in test_cluster_iso_download_url_no_expiration.
[error] 496-496: TypeError: 'FunctionTool' object is not callable in test_cluster_iso_download_url_zero_expiration.
[error] 519-519: TypeError: 'FunctionTool' object is not callable in test_cluster_iso_download_url_no_infraenvs.
[error] 552-552: TypeError: 'FunctionTool' object is not callable in test_create_cluster_success.
[error] 581-581: TypeError: 'FunctionTool' object is not callable in test_set_cluster_vips_success.
[error] 602-602: TypeError: 'FunctionTool' object is not callable in test_install_cluster_success.
[error] 620-620: TypeError: 'FunctionTool' object is not callable in test_list_versions_success.
[error] 642-642: TypeError: 'FunctionTool' object is not callable in test_list_operator_bundles_success.
[error] 664-664: TypeError: 'FunctionTool' object is not callable in test_add_operator_bundle_to_cluster_success.
[error] 690-690: TypeError: 'FunctionTool' object is not callable in test_set_host_role_success.
[error] 715-715: TypeError: 'FunctionTool' object is not callable in test_cluster_credentials_download_url_success.
[error] 743-743: TypeError: 'FunctionTool' object is not callable in test_cluster_credentials_download_url_no_expiration.
[error] 773-773: TypeError: 'FunctionTool' object is not callable in test_cluster_credentials_download_url_zero_expiration.
🪛 GitHub Actions: Type checks
server.py
[error] 21-21: mypy: Need type annotation for "mcp_server" [var-annotated]
[error] 549-549: mypy: Argument 1 to "run" has incompatible type "Coroutine[Any, Any, dict[str, Tool]]"; expected "Coroutine[Any, Any, list[str]]" [arg-type]
[error] 554-554: mypy: Argument "transport" to "http_app" of "FastMCP" has incompatible type "str"; expected "Literal['http', 'streamable-http', 'sse']" [arg-type]
[error] 265-265: mypy: "FunctionTool" not callable [operator]
[error] 298-298: mypy: "FunctionTool" not callable [operator]
[error] 318-318: mypy: "FunctionTool" not callable [operator]
[error] 340-340: mypy: "FunctionTool" not callable [operator]
[error] 370-370: mypy: "FunctionTool" not callable [operator]
[error] 424-424: mypy: "FunctionTool" not callable [operator]
[error] 464-464: mypy: "FunctionTool" not callable [operator]
[error] 496-496: mypy: "FunctionTool" not callable [operator]
[error] 519-519: mypy: "FunctionTool" not callable [operator]
[error] 552-552: mypy: "FunctionTool" not callable [operator]
[error] 581-581: mypy: "FunctionTool" not callable [operator]
[error] 602-602: mypy: "FunctionTool" not callable [operator]
[error] 620-620: mypy: "FunctionTool" not callable [operator]
[error] 642-642: mypy: "FunctionTool" not callable [operator]
[error] 664-664: mypy: "FunctionTool" not callable [operator]
[error] 690-690: mypy: "FunctionTool" not callable [operator]
[error] 715-715: mypy: "FunctionTool" not callable [operator]
[error] 743-743: mypy: "FunctionTool" not callable [operator]
[error] 773-773: mypy: "FunctionTool" not callable [operator]
🪛 GitHub Actions: Pyright
server.py
[error] 67-67: Cannot access attribute "get_context" for class "FastMCP[Unknown]" (reportAttributeAccessIssue)
[error] 94-94: Cannot access attribute "get_context" for class "FastMCP[Unknown]" (reportAttributeAccessIssue)
[error] 549-549: Type "dict[str, Tool]" is not assignable to return type "list[str]" (reportReturnType)
[error] 554-554: Argument of type "str" cannot be assigned to parameter "transport" of type "Literal['http', 'streamable-http', 'sse']" in function "http_app" (reportArgumentType)
[error] 34-34: "mcp" is not a known attribute of module "server" (reportAttributeAccessIssue)
[error] 95-95: "mcp" is not a known attribute of module "server" (reportAttributeAccessIssue)
[error] 224-224: "mcp" is not a known attribute of module "server" (reportAttributeAccessIssue)
[error] 265-265: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 298-298: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 318-318: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 340-340: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 370-370: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 424-424: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 464-464: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 496-496: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 519-519: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 552-552: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 581-581: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 602-602: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 620-620: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 642-642: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 664-664: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 690-690: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 715-715: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 743-743: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 773-773: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
🧰 Additional context used
🪛 GitHub Actions: Black
server.py
[error] 1-1: Black formatting check failed. The file would be reformatted. Run 'black server.py' to fix code style issues.
🪛 GitHub Actions: Pydocstyle
server.py
[error] 547-547: pydocstyle D202: No blank lines allowed after function docstring (found 1) in public function list_tools.
🪛 GitHub Actions: Python linter
server.py
[error] 67-67: pylint E1101: Instance of 'FastMCP' has no 'get_context' member (no-member)
[error] 94-94: pylint E1101: Instance of 'FastMCP' has no 'get_context' member (no-member)
[error] 34-34: pylint E1101: Module 'server' has no 'mcp' member (no-member)
[error] 95-95: pylint E1101: Module 'server' has no 'mcp' member (no-member)
[error] 224-224: pylint E1101: Module 'server' has no 'mcp' member (no-member)
🪛 GitHub Actions: Unit Tests
server.py
[error] 34-34: AttributeError: module 'server' has no attribute 'mcp' at setup of multiple TestTokenFunctions tests.
[error] 95-95: AttributeError: module 'server' has no attribute 'mcp' in test_get_offline_token_no_request.
[error] 224-224: AttributeError: module 'server' has no attribute 'mcp' in test_get_access_token_no_request_context.
[error] 265-265: TypeError: 'FunctionTool' object is not callable in test_cluster_info_success.
[error] 298-298: TypeError: 'FunctionTool' object is not callable in test_list_clusters_success.
[error] 318-318: TypeError: 'FunctionTool' object is not callable in test_cluster_events_success.
[error] 340-340: TypeError: 'FunctionTool' object is not callable in test_host_events_success.
[error] 370-370: TypeError: 'FunctionTool' object is not callable in test_cluster_iso_download_url_success.
[error] 424-424: TypeError: 'FunctionTool' object is not callable in test_cluster_iso_download_url_multiple_infraenvs.
[error] 464-464: TypeError: 'FunctionTool' object is not callable in test_cluster_iso_download_url_no_expiration.
[error] 496-496: TypeError: 'FunctionTool' object is not callable in test_cluster_iso_download_url_zero_expiration.
[error] 519-519: TypeError: 'FunctionTool' object is not callable in test_cluster_iso_download_url_no_infraenvs.
[error] 552-552: TypeError: 'FunctionTool' object is not callable in test_create_cluster_success.
[error] 581-581: TypeError: 'FunctionTool' object is not callable in test_set_cluster_vips_success.
[error] 602-602: TypeError: 'FunctionTool' object is not callable in test_install_cluster_success.
[error] 620-620: TypeError: 'FunctionTool' object is not callable in test_list_versions_success.
[error] 642-642: TypeError: 'FunctionTool' object is not callable in test_list_operator_bundles_success.
[error] 664-664: TypeError: 'FunctionTool' object is not callable in test_add_operator_bundle_to_cluster_success.
[error] 690-690: TypeError: 'FunctionTool' object is not callable in test_set_host_role_success.
[error] 715-715: TypeError: 'FunctionTool' object is not callable in test_cluster_credentials_download_url_success.
[error] 743-743: TypeError: 'FunctionTool' object is not callable in test_cluster_credentials_download_url_no_expiration.
[error] 773-773: TypeError: 'FunctionTool' object is not callable in test_cluster_credentials_download_url_zero_expiration.
🪛 GitHub Actions: Type checks
server.py
[error] 21-21: mypy: Need type annotation for "mcp_server" [var-annotated]
[error] 549-549: mypy: Argument 1 to "run" has incompatible type "Coroutine[Any, Any, dict[str, Tool]]"; expected "Coroutine[Any, Any, list[str]]" [arg-type]
[error] 554-554: mypy: Argument "transport" to "http_app" of "FastMCP" has incompatible type "str"; expected "Literal['http', 'streamable-http', 'sse']" [arg-type]
[error] 265-265: mypy: "FunctionTool" not callable [operator]
[error] 298-298: mypy: "FunctionTool" not callable [operator]
[error] 318-318: mypy: "FunctionTool" not callable [operator]
[error] 340-340: mypy: "FunctionTool" not callable [operator]
[error] 370-370: mypy: "FunctionTool" not callable [operator]
[error] 424-424: mypy: "FunctionTool" not callable [operator]
[error] 464-464: mypy: "FunctionTool" not callable [operator]
[error] 496-496: mypy: "FunctionTool" not callable [operator]
[error] 519-519: mypy: "FunctionTool" not callable [operator]
[error] 552-552: mypy: "FunctionTool" not callable [operator]
[error] 581-581: mypy: "FunctionTool" not callable [operator]
[error] 602-602: mypy: "FunctionTool" not callable [operator]
[error] 620-620: mypy: "FunctionTool" not callable [operator]
[error] 642-642: mypy: "FunctionTool" not callable [operator]
[error] 664-664: mypy: "FunctionTool" not callable [operator]
[error] 690-690: mypy: "FunctionTool" not callable [operator]
[error] 715-715: mypy: "FunctionTool" not callable [operator]
[error] 743-743: mypy: "FunctionTool" not callable [operator]
[error] 773-773: mypy: "FunctionTool" not callable [operator]
🪛 GitHub Actions: Pyright
server.py
[error] 67-67: Cannot access attribute "get_context" for class "FastMCP[Unknown]" (reportAttributeAccessIssue)
[error] 94-94: Cannot access attribute "get_context" for class "FastMCP[Unknown]" (reportAttributeAccessIssue)
[error] 549-549: Type "dict[str, Tool]" is not assignable to return type "list[str]" (reportReturnType)
[error] 554-554: Argument of type "str" cannot be assigned to parameter "transport" of type "Literal['http', 'streamable-http', 'sse']" in function "http_app" (reportArgumentType)
[error] 34-34: "mcp" is not a known attribute of module "server" (reportAttributeAccessIssue)
[error] 95-95: "mcp" is not a known attribute of module "server" (reportAttributeAccessIssue)
[error] 224-224: "mcp" is not a known attribute of module "server" (reportAttributeAccessIssue)
[error] 265-265: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 298-298: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 318-318: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 340-340: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 370-370: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 424-424: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 464-464: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 496-496: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 519-519: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 552-552: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 581-581: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 602-602: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 620-620: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 642-642: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 664-664: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 690-690: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 715-715: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 743-743: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
[error] 773-773: Object of type "FunctionTool" is not callable; Attribute "call" is unknown (reportCallIssue)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Red Hat Konflux / assisted-service-mcp-saas-main-on-pull-request
🔇 Additional comments (3)
pyproject.toml (1)
9-9: LGTM! Dependency version update aligns with API changes.The fastmcp version update to >=2.10.6 properly supports the new import path and API usage changes in server.py.
server.py (2)
15-15: LGTM! Import path updated correctly.The import change from
mcp.server.fastmcptofastmcpaligns with the fastmcp >=2.10.6 API.
120-549: Update tests for FastMCPFunctionToolinvocationI didn’t find any test files calling the legacy decorated functions in this repo. To restore test compatibility with the new FastMCP API, update your tests to:
- Retrieve tools via the MCP server:
import asyncio tools = asyncio.run(mcp_server.get_tools())- Select the desired tool by name:
cluster_info = next(t for t in tools if t.name == "cluster_info")- Invoke it asynchronously instead of calling the function directly:
result = asyncio.run(cluster_info.invoke(cluster_id="…"))If your tests live outside
tests/or under a different path, locate them and apply the same pattern.
|
/hold |
101abcb to
02e691e
Compare
02e691e to
2fbe6e6
Compare
|
@rccrdpccl: This pull request references MGMT-21086 which is a valid jira issue. Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the task to target the "4.20.0" version, but no target version was set. DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
There was a problem hiding this comment.
Actionable comments posted: 2
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock
📒 Files selected for processing (3)
pyproject.toml(1 hunks)server.py(17 hunks)tests/test_server.py(29 hunks)
🧬 Code Graph Analysis (1)
tests/test_server.py (3)
server.py (6)
get_offline_token(46-75)get_access_token(78-116)list_clusters(148-177)create_cluster(289-335)install_cluster(375-400)add_operator_bundle_to_cluster(447-470)tests/test_assisted_service_api.py (1)
client(32-37)service_client/assisted_service_api.py (14)
get_cluster(98-137)list_clusters(139-161)get_events(163-225)list_infra_envs(263-298)get_infra_env_download_url(682-723)create_cluster(300-349)create_infra_env(351-390)update_cluster(392-441)install_cluster(443-473)get_openshift_versions(475-505)get_operator_bundles(507-529)add_operator_bundle_to_cluster(531-581)update_host(583-630)get_presigned_for_cluster_credentials(632-680)
🪛 GitHub Actions: Pydocstyle
tests/test_server.py
[error] 546-546: pydocstyle D202: No blank lines allowed after function docstring (found 1) in public function list_tools.
🪛 GitHub Actions: Type checks
tests/test_server.py
[error] 22-22: mypy: Need type annotation for "mcp_server" [var-annotated]
[error] 548-548: mypy: Argument 1 to "run" has incompatible type "Coroutine[Any, Any, dict[str, Tool]]"; expected "Coroutine[Any, Any, list[str]]" [arg-type]
[error] 553-553: mypy: Argument "transport" to "http_app" of "FastMCP" has incompatible type "str"; expected "Literal['http', 'streamable-http', 'sse']" [arg-type]
🪛 GitHub Actions: Pyright
tests/test_server.py
[error] 548-548: Pyright error: Type "dict[str, Tool]" is not assignable to return type "list[str]" (reportReturnType).
[error] 553-553: Pyright error: Argument of type "str" cannot be assigned to parameter "transport" of type "Literal['http', 'streamable-http', 'sse']" in function "http_app" (reportArgumentType).
[error] 247-247: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 247-247: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 247-247: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 247-247: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 281-281: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 281-281: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 281-281: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 281-281: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 302-302: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 302-302: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 302-302: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 302-302: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 326-326: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 326-326: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 326-326: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 326-326: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 359-359: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 359-359: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 359-359: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 359-359: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 422-422: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 422-422: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 422-422: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 422-422: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 461-461: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 461-461: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 461-461: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 461-461: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 498-498: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 498-498: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 498-498: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 498-498: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 524-524: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 524-524: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 524-524: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 524-524: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 569-569: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 569-569: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 569-569: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 569-569: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 608-608: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 608-608: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 608-608: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 608-608: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 631-631: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 631-631: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 631-631: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 631-631: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 652-652: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 652-652: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 652-652: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 652-652: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 676-676: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 676-676: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 676-676: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 676-676: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 700-700: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 700-700: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 700-700: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 700-700: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 727-727: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 727-727: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 727-727: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 727-727: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 756-756: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 756-756: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 756-756: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 756-756: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 785-785: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 785-785: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 785-785: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 785-785: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 817-817: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 817-817: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 817-817: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 817-817: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
✅ Files skipped from review due to trivial changes (1)
- pyproject.toml
🚧 Files skipped from review as they are similar to previous changes (1)
- server.py
🧰 Additional context used
🧬 Code Graph Analysis (1)
tests/test_server.py (3)
server.py (6)
get_offline_token(46-75)get_access_token(78-116)list_clusters(148-177)create_cluster(289-335)install_cluster(375-400)add_operator_bundle_to_cluster(447-470)tests/test_assisted_service_api.py (1)
client(32-37)service_client/assisted_service_api.py (14)
get_cluster(98-137)list_clusters(139-161)get_events(163-225)list_infra_envs(263-298)get_infra_env_download_url(682-723)create_cluster(300-349)create_infra_env(351-390)update_cluster(392-441)install_cluster(443-473)get_openshift_versions(475-505)get_operator_bundles(507-529)add_operator_bundle_to_cluster(531-581)update_host(583-630)get_presigned_for_cluster_credentials(632-680)
🪛 GitHub Actions: Pydocstyle
tests/test_server.py
[error] 546-546: pydocstyle D202: No blank lines allowed after function docstring (found 1) in public function list_tools.
🪛 GitHub Actions: Type checks
tests/test_server.py
[error] 22-22: mypy: Need type annotation for "mcp_server" [var-annotated]
[error] 548-548: mypy: Argument 1 to "run" has incompatible type "Coroutine[Any, Any, dict[str, Tool]]"; expected "Coroutine[Any, Any, list[str]]" [arg-type]
[error] 553-553: mypy: Argument "transport" to "http_app" of "FastMCP" has incompatible type "str"; expected "Literal['http', 'streamable-http', 'sse']" [arg-type]
🪛 GitHub Actions: Pyright
tests/test_server.py
[error] 548-548: Pyright error: Type "dict[str, Tool]" is not assignable to return type "list[str]" (reportReturnType).
[error] 553-553: Pyright error: Argument of type "str" cannot be assigned to parameter "transport" of type "Literal['http', 'streamable-http', 'sse']" in function "http_app" (reportArgumentType).
[error] 247-247: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 247-247: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 247-247: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 247-247: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 281-281: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 281-281: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 281-281: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 281-281: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 302-302: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 302-302: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 302-302: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 302-302: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 326-326: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 326-326: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 326-326: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 326-326: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 359-359: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 359-359: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 359-359: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 359-359: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 422-422: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 422-422: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 422-422: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 422-422: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 461-461: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 461-461: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 461-461: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 461-461: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 498-498: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 498-498: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 498-498: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 498-498: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 524-524: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 524-524: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 524-524: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 524-524: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 569-569: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 569-569: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 569-569: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 569-569: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 608-608: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 608-608: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 608-608: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 608-608: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 631-631: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 631-631: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 631-631: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 631-631: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 652-652: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 652-652: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 652-652: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 652-652: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 676-676: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 676-676: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 676-676: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 676-676: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 700-700: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 700-700: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 700-700: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 700-700: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 727-727: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 727-727: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 727-727: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 727-727: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 756-756: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 756-756: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 756-756: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 756-756: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 785-785: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 785-785: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 785-785: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 785-785: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
[error] 817-817: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 817-817: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 817-817: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 817-817: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
🔇 Additional comments (5)
tests/test_server.py (5)
7-7: LGTM! Appropriate imports for the refactored test approach.The addition of
Generatortype hint andClientimport aligns with the new testing pattern.Also applies to: 13-14
29-33: LGTM! Fixture correctly updated to match server implementation.The fixture properly mocks
get_http_headerswhich aligns with the refactored token retrieval logic inserver.py.
42-59: LGTM! Test correctly validates environment variable precedence.The test properly verifies that environment variables take precedence over HTTP headers for offline token retrieval.
367-431: Excellent test coverage for multiple infrastructure environments.The test thoroughly validates the handling of multiple infraenvs, including proper formatting of multiple URLs and verification of all API calls.
571-577: Confirm intentional hardcoding of “chatbot” tagBoth
server.py(in the call toclient.create_cluster(..., tags="chatbot")) andtests/test_server.py(assertingtags="chatbot") use a literal"chatbot"tag. Please verify that this hardcoded tag is intentional rather than a value that should be configurable.
If it should be configurable, extract it into a constant or configuration parameter and update both the implementation and tests accordingly.
| resp = await client.call_tool( | ||
| "cluster_info", {"cluster_id": cluster_id} | ||
| ) | ||
| assert resp.content[0].text == cluster.to_str() |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Apply type-safe content access pattern across all tests.
All test methods accessing resp.content[0].text have the same type safety issue. Consider creating a helper function to safely extract text content:
def get_text_content(resp: CallToolResult) -> str:
"""Safely extract text content from response."""
if not resp.content:
raise AssertionError("No content in response")
content = resp.content[0]
if not hasattr(content, 'text'):
raise AssertionError(f"Expected text content, got {type(content).__name__}")
return content.textThen use it consistently:
- assert resp.content[0].text == expected_result
+ assert get_text_content(resp) == expected_resultAlso applies to: 281-281, 302-302, 326-326, 359-359, 422-422, 461-461, 498-498, 524-524, 569-569, 608-608, 631-631, 652-652, 676-676, 700-700, 727-727, 756-756, 785-785, 817-817
🧰 Tools
🪛 GitHub Actions: Pyright
[error] 247-247: Pyright error: Cannot access attribute "text" for class "ImageContent" (reportAttributeAccessIssue).
[error] 247-247: Pyright error: Cannot access attribute "text" for class "AudioContent" (reportAttributeAccessIssue).
[error] 247-247: Pyright error: Cannot access attribute "text" for class "ResourceLink" (reportAttributeAccessIssue).
[error] 247-247: Pyright error: Cannot access attribute "text" for class "EmbeddedResource" (reportAttributeAccessIssue).
🤖 Prompt for AI Agents
In tests/test_server.py at lines 247, 281, 302, 326, 359, 422, 461, 498, 524,
569, 608, 631, 652, 676, 700, 727, 756, 785, and 817, the test code accesses
resp.content[0].text directly without type safety checks. To fix this, create a
helper function that safely extracts the text content from the response by
checking if resp.content is not empty and if the first content item has a 'text'
attribute, raising an AssertionError otherwise. Replace all direct accesses to
resp.content[0].text with calls to this helper function to ensure consistent and
safe content extraction across all tests.
e93d03e to
831f4f0
Compare
Signed-off-by: Riccardo Piccoli <rpiccoli@redhat.com>
831f4f0 to
341dc0e
Compare
|
@rccrdpccl: This pull request references MGMT-21086 which is a valid jira issue. Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the task to target the "4.20.0" version, but no target version was set. DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (1)
template.yaml (1)
16-18: Consider explicitly settingrequired: true(or clarifying why it's optional).Every deployment of assisted-service-mcp will now rely on a valid transport value at runtime.
Making the parameter required helps catch typos or empty overrides early during template processing rather than at application start-up.- - name: TRANSPORT - value: "sse" - description: "MCP transport type. Valid values: 'http', 'streamable-http', 'sse'. Defaults to 'sse'." + - name: TRANSPORT + value: "sse" + required: true # <-- add if the value must always be present + description: "MCP transport type. Valid values: 'http', 'streamable-http', 'sse'. Defaults to 'sse'."If the default of
"sse"is genuinely sufficient and the parameter should remain optional, feel free to ignore.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock
📒 Files selected for processing (4)
pyproject.toml(1 hunks)server.py(17 hunks)template.yaml(2 hunks)tests/test_server.py(29 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
- pyproject.toml
- tests/test_server.py
- server.py
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Red Hat Konflux / assisted-service-mcp-saas-main-on-pull-request
🔇 Additional comments (1)
template.yaml (1)
87-88: Verify downstream consumers pick up the newTRANSPORTenv-var.The container now receives
TRANSPORT=${TRANSPORT}. Double-check:
server.py(or equivalent) readsos.getenv("TRANSPORT", "sse")to keep the default.- CI / Helm charts / GitHub workflows that previously
kubectl execor parse logs don’t assume SSE-only behaviour.- Docs / run-books mention the new knob so operators know how to switch protocols.
No code change needed if these items are already covered.
|
@rccrdpccl: GitHub didn't allow me to request PR reviews from the following users: PTAL. Note that only openshift-assisted members and repo collaborators can review this PR, and authors cannot review their own PRs. DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. |
|
/lgtm |
|
/approve |
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: eranco74, rccrdpccl The full list of commands accepted by this bot can be found here. The pull request process is described here DetailsNeeds approval from an approver in each of these files:
Approvers can indicate their approval by writing |
|
/test ci/prow/images ci/prow/unit |
|
@zszabo-rh: The specified target(s) for Use DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. |
|
/test images unit |
f3d540c
into
openshift-assisted:master
|
Sorry, but this seems to be breaking chat. I tested locally and in the integration environment and both are broken currently. We'll sort out adding this back when we have time, but for now I think getting things working again is the priority. |
Add the possibility to support different protocols.
We can set the env var
TRANSPORTto "sse", "http" or "streamable-http".The default path for
sseis/sseand forstreamable-httpis/mcpWe kept the default to SSE to maintain the current behaviour.
Summary by CodeRabbit