openboost-cli 2.0.0__tar.gz → 2.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. {openboost_cli-2.0.0/src/openboost_cli.egg-info → openboost_cli-2.0.1}/PKG-INFO +2 -2
  2. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/README.md +1 -1
  3. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/pyproject.toml +1 -1
  4. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/__init__.py +6 -6
  5. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/cli/main.py +1 -1
  6. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/mcp_client.py +19 -18
  7. {openboost_cli-2.0.0 → openboost_cli-2.0.1/src/openboost_cli.egg-info}/PKG-INFO +2 -2
  8. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/tests/test_cli.py +1 -1
  9. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/tests/test_config.py +10 -4
  10. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/tests/test_mcp_client.py +33 -25
  11. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/LICENSE +0 -0
  12. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/setup.cfg +0 -0
  13. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/cli/__init__.py +0 -0
  14. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/cli/interactive.py +0 -0
  15. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/client.py +0 -0
  16. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/coerce_args.py +0 -0
  17. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/config.py +0 -0
  18. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/parse_result.py +0 -0
  19. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/registry.py +0 -0
  20. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/__init__.py +0 -0
  21. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/amazon/__init__.py +0 -0
  22. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/amazon/amz_category_query.json +0 -0
  23. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/amazon/amz_hot_amz_hot_cat_tree.json +0 -0
  24. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/amazon/amz_hot_amz_hot_list.json +0 -0
  25. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/amazon/amz_market_price.json +0 -0
  26. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/amazon/amz_product_selection.json +0 -0
  27. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/amazon/amz_review_query.json +0 -0
  28. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/amazon/amz_sales_query.json +0 -0
  29. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/amazon/amz_sku_query.json +0 -0
  30. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/__init__.py +0 -0
  31. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_abstract_image.json +0 -0
  32. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_abstract_translated.json +0 -0
  33. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_bibliography.json +0 -0
  34. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_claim_data.json +0 -0
  35. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_claim_translated.json +0 -0
  36. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_description.json +0 -0
  37. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_description_translated.json +0 -0
  38. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_family.json +0 -0
  39. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_fulltext_image.json +0 -0
  40. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_image_search_multiple.json +0 -0
  41. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_image_search_single.json +0 -0
  42. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_legal_status.json +0 -0
  43. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_pdf.json +0 -0
  44. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_query_count.json +0 -0
  45. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_query_search.json +0 -0
  46. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_query_search_with_agg.json +0 -0
  47. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/patent/patent_semantic_search.json +0 -0
  48. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/__init__.py +0 -0
  49. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tk_expert_sale_show.json +0 -0
  50. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_commodity_detail.json +0 -0
  51. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_commodity_expert_draw_expert_trend.json +0 -0
  52. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_commodity_get_commodity_cat_tree.json +0 -0
  53. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_commodity_info_list.json +0 -0
  54. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_commodity_sales_trend.json +0 -0
  55. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_commodity_statistics_get_category_statistics.json +0 -0
  56. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_commodity_statistics_get_expert_statistics.json +0 -0
  57. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_commodity_statistics_get_price_statistics.json +0 -0
  58. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_commodity_statistics_get_total_statistics.json +0 -0
  59. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_commodity_voice_analyze.json +0 -0
  60. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_expert_basic_analyze.json +0 -0
  61. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_expert_category_analyze.json +0 -0
  62. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_expert_detail.json +0 -0
  63. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_expert_fans_analyze.json +0 -0
  64. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_expert_fans_portrait.json +0 -0
  65. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_expert_info_list.json +0 -0
  66. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_sale_channel_sale_channel.json +0 -0
  67. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_shop_commodity_account_list.json +0 -0
  68. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_shop_detail.json +0 -0
  69. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_shop_info_list.json +0 -0
  70. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_shop_market_info.json +0 -0
  71. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_shop_sales_trend.json +0 -0
  72. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_video_content.json +0 -0
  73. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_video_detail.json +0 -0
  74. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_video_info_list.json +0 -0
  75. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_video_new_video_summary.json +0 -0
  76. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_video_script_diy_query.json +0 -0
  77. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_video_voice_read.json +0 -0
  78. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas/tiktok/tt_video_voice_summary.json +0 -0
  79. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli/schemas_loader.py +0 -0
  80. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli.egg-info/SOURCES.txt +0 -0
  81. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli.egg-info/dependency_links.txt +0 -0
  82. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli.egg-info/entry_points.txt +0 -0
  83. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli.egg-info/requires.txt +0 -0
  84. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/src/openboost_cli.egg-info/top_level.txt +0 -0
  85. {openboost_cli-2.0.0 → openboost_cli-2.0.1}/tests/test_schemas_and_parsing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openboost-cli
3
- Version: 2.0.0
3
+ Version: 2.0.1
4
4
  Summary: Unified CLI and Python client for OpenBoost TikTok, Patent, and Amazon MCP servers.
5
5
  Author: OpenBoost CLI
6
6
  License-Expression: MIT
@@ -56,7 +56,7 @@ openboost config set --secret-key "your-secret-key"
56
56
 
57
57
  ```bash
58
58
  openboost config set --mcp amazon --secret-key "your-secret-key"
59
- openboost config set --mcp amazon --base-url "http://mcp.microdata-inc.com/mcp-servers/proboost-amazon-mcp"
59
+ openboost config set --mcp amazon --base-url "http://mcp.microdata-inc.com/mcp-servers/openboost-all-mcp/sse"
60
60
  ```
61
61
 
62
62
  默认配置文件位于:
@@ -34,7 +34,7 @@ openboost config set --secret-key "your-secret-key"
34
34
 
35
35
  ```bash
36
36
  openboost config set --mcp amazon --secret-key "your-secret-key"
37
- openboost config set --mcp amazon --base-url "http://mcp.microdata-inc.com/mcp-servers/proboost-amazon-mcp"
37
+ openboost config set --mcp amazon --base-url "http://mcp.microdata-inc.com/mcp-servers/openboost-all-mcp/sse"
38
38
  ```
39
39
 
40
40
  默认配置文件位于:
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "openboost-cli"
7
- version = "2.0.0"
7
+ version = "2.0.1"
8
8
  description = "Unified CLI and Python client for OpenBoost TikTok, Patent, and Amazon MCP servers."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -1,12 +1,12 @@
1
1
  """Unified OpenBoost MCP CLI and Python client."""
2
2
 
3
- __version__ = "2.0.0"
3
+ __version__ = "2.0.1"
4
4
 
5
- DEFAULT_BASE_URLS = {
6
- "tiktok": "http://mcp.microdata-inc.com/mcp-servers/proboost-tiktok-mcp",
7
- "patent": "http://mcp.microdata-inc.com/mcp-servers/proboost-patent-mcp",
8
- "amazon": "http://mcp.microdata-inc.com/mcp-servers/proboost-amazon-mcp",
9
- }
5
+ DEFAULT_BASE_URLS = {
6
+ "tiktok": "http://mcp.microdata-inc.com/mcp-servers/openboost-all-mcp/sse",
7
+ "patent": "http://mcp.microdata-inc.com/mcp-servers/openboost-all-mcp/sse",
8
+ "amazon": "http://mcp.microdata-inc.com/mcp-servers/openboost-all-mcp/sse",
9
+ }
10
10
 
11
11
  MCP_LABELS = {
12
12
  "tiktok": "TikTok",
@@ -71,7 +71,7 @@ amazon_app.add_typer(amazon_hot_app, name="hot")
71
71
  _state: dict[str, str | None] = {"secret_key": None, "base_url": None}
72
72
 
73
73
  KeyOpt = Annotated[Optional[str], typer.Option("--key", "-k", help="secret-key")]
74
- BaseUrlOpt = Annotated[Optional[str], typer.Option("--base-url", "-u", help="MCP Streamable HTTP URL")]
74
+ BaseUrlOpt = Annotated[Optional[str], typer.Option("--base-url", "-u", help="MCP SSE URL")]
75
75
  McpArg = Annotated[str, typer.Argument(help="MCP 名称: tiktok / patent / amazon")]
76
76
  CountryOpt = Annotated[str, typer.Option("--country-region", "--country", help="国家/地区,如 美国")]
77
77
  CurrentOpt = Annotated[Optional[int], typer.Option("--current", help="当前页码")]
@@ -4,11 +4,9 @@ import asyncio
4
4
  from datetime import timedelta
5
5
  from typing import Any
6
6
 
7
- import httpx
8
- from mcp import ClientSession
9
- from mcp import types as mtypes
10
- from mcp.client.streamable_http import streamable_http_client
11
- from mcp.shared._httpx_utils import create_mcp_http_client
7
+ from mcp import ClientSession
8
+ from mcp import types as mtypes
9
+ from mcp.client.sse import sse_client
12
10
 
13
11
  from openboost_cli.config import effective_secret_and_base, normalize_mcp_name
14
12
  from openboost_cli.parse_result import decode_embedded_payload
@@ -31,19 +29,22 @@ async def invoke_tool_async(
31
29
  *,
32
30
  connect_timeout_sec: float = 30,
33
31
  read_timeout_sec: float = 300,
34
- ) -> mtypes.CallToolResult:
35
- headers = {"secret-key": secret_key}
36
- timeout = httpx.Timeout(connect_timeout_sec, read=read_timeout_sec, write=30, pool=30)
37
-
38
- async with create_mcp_http_client(headers=headers, timeout=timeout) as client:
39
- async with streamable_http_client(base_url, http_client=client) as (read, write, _get_id):
40
- async with ClientSession(read, write) as session:
41
- await session.initialize()
42
- return await session.call_tool(
43
- tool_name,
44
- arguments,
45
- read_timeout_seconds=timedelta(seconds=read_timeout_sec),
46
- )
32
+ ) -> mtypes.CallToolResult:
33
+ headers = {"secret-key": secret_key}
34
+
35
+ async with sse_client(
36
+ base_url,
37
+ headers=headers,
38
+ timeout=connect_timeout_sec,
39
+ sse_read_timeout=read_timeout_sec,
40
+ ) as (read, write):
41
+ async with ClientSession(read, write) as session:
42
+ await session.initialize()
43
+ return await session.call_tool(
44
+ tool_name,
45
+ arguments,
46
+ read_timeout_seconds=timedelta(seconds=read_timeout_sec),
47
+ )
47
48
 
48
49
 
49
50
  class McpClient:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openboost-cli
3
- Version: 2.0.0
3
+ Version: 2.0.1
4
4
  Summary: Unified CLI and Python client for OpenBoost TikTok, Patent, and Amazon MCP servers.
5
5
  Author: OpenBoost CLI
6
6
  License-Expression: MIT
@@ -56,7 +56,7 @@ openboost config set --secret-key "your-secret-key"
56
56
 
57
57
  ```bash
58
58
  openboost config set --mcp amazon --secret-key "your-secret-key"
59
- openboost config set --mcp amazon --base-url "http://mcp.microdata-inc.com/mcp-servers/proboost-amazon-mcp"
59
+ openboost config set --mcp amazon --base-url "http://mcp.microdata-inc.com/mcp-servers/openboost-all-mcp/sse"
60
60
  ```
61
61
 
62
62
  默认配置文件位于:
@@ -29,7 +29,7 @@ def test_version() -> None:
29
29
  result = runner.invoke(cli.app, ["version"])
30
30
 
31
31
  assert result.exit_code == 0
32
- assert "2.0.0" in result.output
32
+ assert "2.0.1" in result.output
33
33
 
34
34
 
35
35
  def test_list_reports_all_bundled_tools() -> None:
@@ -4,10 +4,16 @@ import json
4
4
  from pathlib import Path
5
5
 
6
6
  from openboost_cli import DEFAULT_BASE_URLS
7
- from openboost_cli.config import config_path, effective_secret_and_base, load_config, mask_secret, update_config
8
-
9
-
10
- def test_config_uses_only_openboost_names(monkeypatch, tmp_path: Path) -> None:
7
+ from openboost_cli.config import config_path, effective_secret_and_base, load_config, mask_secret, update_config
8
+
9
+
10
+ def test_default_mcp_urls_use_unified_openboost_sse_endpoint() -> None:
11
+ expected = "http://mcp.microdata-inc.com/mcp-servers/openboost-all-mcp/sse"
12
+
13
+ assert set(DEFAULT_BASE_URLS.values()) == {expected}
14
+
15
+
16
+ def test_config_uses_only_openboost_names(monkeypatch, tmp_path: Path) -> None:
11
17
  path = tmp_path / "openboost.json"
12
18
  monkeypatch.setenv("OPENBOOST_CONFIG", str(path))
13
19
  monkeypatch.setenv("PROBOOST_SECRET_KEY", "ignored-old-secret")
@@ -1,8 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
- from contextlib import asynccontextmanager
5
- from datetime import timedelta
4
+ from datetime import timedelta
6
5
  from types import SimpleNamespace
7
6
 
8
7
  import pytest
@@ -62,21 +61,30 @@ def test_python_client_raises_mcp_error(monkeypatch: pytest.MonkeyPatch) -> None
62
61
  client.call_tool("patent_query_count", {"query_text": "test"})
63
62
 
64
63
 
65
- def test_invoke_tool_uses_existing_mcp_protocol(monkeypatch: pytest.MonkeyPatch) -> None:
66
- observed = {}
67
- http_client = object()
68
-
69
- @asynccontextmanager
70
- async def fake_create_mcp_http_client(*, headers, timeout):
71
- observed["headers"] = headers
72
- observed["timeout"] = timeout
73
- yield http_client
74
-
75
- @asynccontextmanager
76
- async def fake_streamable_http_client(base_url, *, http_client):
77
- observed["base_url"] = base_url
78
- observed["http_client"] = http_client
79
- yield "read", "write", lambda: None
64
+ def test_invoke_tool_uses_sse_protocol(monkeypatch: pytest.MonkeyPatch) -> None:
65
+ observed = {}
66
+
67
+ class FakeSseClient:
68
+ def __init__(self, base_url, *, headers, timeout, sse_read_timeout):
69
+ observed["base_url"] = base_url
70
+ observed["headers"] = headers
71
+ observed["timeout"] = timeout
72
+ observed["sse_read_timeout"] = sse_read_timeout
73
+
74
+ async def __aenter__(self):
75
+ return "read", "write"
76
+
77
+ async def __aexit__(self, exc_type, exc, tb):
78
+ return False
79
+
80
+ def fake_sse_client(base_url, *, headers, timeout, sse_read_timeout):
81
+ observed["base_url"] = base_url
82
+ return FakeSseClient(
83
+ base_url,
84
+ headers=headers,
85
+ timeout=timeout,
86
+ sse_read_timeout=sse_read_timeout,
87
+ )
80
88
 
81
89
  class FakeSession:
82
90
  def __init__(self, read, write):
@@ -95,9 +103,8 @@ def test_invoke_tool_uses_existing_mcp_protocol(monkeypatch: pytest.MonkeyPatch)
95
103
  observed["call"] = (name, arguments, read_timeout_seconds)
96
104
  return text_result('{"ok": true}')
97
105
 
98
- monkeypatch.setattr(mcp_client, "create_mcp_http_client", fake_create_mcp_http_client)
99
- monkeypatch.setattr(mcp_client, "streamable_http_client", fake_streamable_http_client)
100
- monkeypatch.setattr(mcp_client, "ClientSession", FakeSession)
106
+ monkeypatch.setattr(mcp_client, "sse_client", fake_sse_client)
107
+ monkeypatch.setattr(mcp_client, "ClientSession", FakeSession)
101
108
 
102
109
  result = asyncio.run(
103
110
  mcp_client.invoke_tool_async(
@@ -110,11 +117,12 @@ def test_invoke_tool_uses_existing_mcp_protocol(monkeypatch: pytest.MonkeyPatch)
110
117
  )
111
118
  )
112
119
 
113
- assert result.isError is False
114
- assert observed["headers"] == {"secret-key": "test-secret"}
115
- assert observed["base_url"] == "http://mcp.example/server"
116
- assert observed["http_client"] is http_client
117
- assert observed["initialized"] is True
120
+ assert result.isError is False
121
+ assert observed["headers"] == {"secret-key": "test-secret"}
122
+ assert observed["base_url"] == "http://mcp.example/server"
123
+ assert observed["timeout"] == 12
124
+ assert observed["sse_read_timeout"] == 34
125
+ assert observed["initialized"] is True
118
126
  assert observed["call"] == (
119
127
  "existing_tool_name",
120
128
  {"existingField": "value"},
File without changes
File without changes