cnhkmcp 1.4.6__tar.gz → 1.4.8__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 (82) hide show
  1. {cnhkmcp-1.4.6/cnhkmcp.egg-info → cnhkmcp-1.4.8}/PKG-INFO +1 -1
  2. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/__init__.py +1 -1
  3. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/mcp/346/226/207/344/273/266/350/256/272/345/235/233/347/211/2102_/345/246/202/346/236/234/345/216/237/347/211/210/345/220/257/345/212/250/344/270/215/344/272/206/346/265/217/350/247/210/345/231/250/345/260/261/350/257/225/350/277/231/344/270/252//350/256/251AI/350/257/273/350/277/231/344/270/252/346/226/207/346/241/243/346/235/245/345/255/246/344/274/232/344/270/213/350/275/275/346/265/217/350/247/210/345/231/250.md +8 -0
  4. {cnhkmcp-1.4.6/cnhkmcp/untracked → cnhkmcp-1.4.8/cnhkmcp/untracked/mcp/346/226/207/344/273/266/350/256/272/345/235/233/347/211/2102_/345/246/202/346/236/234/345/216/237/347/211/210/345/220/257/345/212/250/344/270/215/344/272/206/346/265/217/350/247/210/345/231/250/345/260/261/350/257/225/350/277/231/344/270/252}//351/205/215/347/275/256/345/211/215/350/277/220/350/241/214/346/210/221_/345/256/211/350/243/205/345/277/205/350/246/201/344/276/235/350/265/226/345/214/205.py +30 -5
  5. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/platform_functions.py +9 -6
  6. {cnhkmcp-1.4.6/cnhkmcp/untracked/mcp/346/226/207/344/273/266/350/256/272/345/235/233/347/211/2102_/345/246/202/346/236/234/345/216/237/347/211/210/345/220/257/345/212/250/344/270/215/344/272/206/346/265/217/350/247/210/345/231/250/345/260/261/350/257/225/350/277/231/344/270/252 → cnhkmcp-1.4.8/cnhkmcp/untracked}//351/205/215/347/275/256/345/211/215/350/277/220/350/241/214/346/210/221_/345/256/211/350/243/205/345/277/205/350/246/201/344/276/235/350/265/226/345/214/205.py +30 -5
  7. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8/cnhkmcp.egg-info}/PKG-INFO +1 -1
  8. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/setup.py +1 -1
  9. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/LICENSE +0 -0
  10. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/MANIFEST.in +0 -0
  11. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/README.md +0 -0
  12. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/.gitignore +0 -0
  13. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/MODULAR_STRUCTURE.md +0 -0
  14. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/README.md +0 -0
  15. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/__pycache__/app.cpython-313.pyc +0 -0
  16. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/blueprints/__init__.py +0 -0
  17. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/blueprints/__pycache__/__init__.cpython-313.pyc +0 -0
  18. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/blueprints/__pycache__/feature_engineering.cpython-313.pyc +0 -0
  19. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/blueprints/__pycache__/idea_house.cpython-313.pyc +0 -0
  20. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/blueprints/__pycache__/inspiration_house.cpython-313.pyc +0 -0
  21. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/blueprints/__pycache__/paper_analysis.cpython-313.pyc +0 -0
  22. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/blueprints/__pycache__/simulator.cpython-313.pyc +0 -0
  23. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/blueprints/__pycache__/unified_tools.cpython-313.pyc +0 -0
  24. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/blueprints/__pycache__/wqb_simulator.cpython-313.pyc +0 -0
  25. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/blueprints/feature_engineering.py +0 -0
  26. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/blueprints/idea_house.py +0 -0
  27. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/blueprints/inspiration_house.py +0 -0
  28. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/blueprints/paper_analysis.py +0 -0
  29. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/custom_templates/templates.json +0 -0
  30. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/hkSimulator/ace_lib.py +0 -0
  31. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/hkSimulator/autosimulator.py +0 -0
  32. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/hkSimulator/helpful_functions.py +0 -0
  33. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/mirror_config.txt +0 -0
  34. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/operaters.csv +0 -0
  35. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/requirements.txt +0 -0
  36. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/run_app.bat +0 -0
  37. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/run_app.sh +0 -0
  38. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/setup_tsinghua.bat +0 -0
  39. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/setup_tsinghua.sh +0 -0
  40. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/simulator/__pycache__/simulator_wqb.cpython-313.pyc +0 -0
  41. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/simulator/alpha_submitter.py +0 -0
  42. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/simulator/simulator_wqb.py +0 -0
  43. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/ssrn-3332513.pdf +0 -0
  44. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/static/brain.js +0 -0
  45. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/static/decoder.js +0 -0
  46. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/static/feature_engineering.js +0 -0
  47. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/static/idea_house.js +0 -0
  48. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/static/inspiration_house.js +0 -0
  49. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/static/paper_analysis.js +0 -0
  50. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/static/script.js +0 -0
  51. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/static/simulator.js +0 -0
  52. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/static/styles.css +0 -0
  53. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/templates/feature_engineering.html +0 -0
  54. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/templates/idea_house.html +0 -0
  55. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/templates/index.html +0 -0
  56. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/templates/inspiration_house.html +0 -0
  57. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/templates/paper_analysis.html +0 -0
  58. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP/templates/simulator.html +0 -0
  59. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/APP//350/277/220/350/241/214/346/211/223/345/274/200/346/210/221.py" +0 -0
  60. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/__pycache__/forum_functions.cpython-313.pyc +0 -0
  61. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/arXiv_API_Tool_Manual.md +0 -0
  62. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/arxiv_api.py +0 -0
  63. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/forum_functions.py +0 -0
  64. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/mcp/346/226/207/344/273/266/350/256/272/345/235/233/347/211/2102_/345/246/202/346/236/234/345/216/237/347/211/210/345/220/257/345/212/250/344/270/215/344/272/206/346/265/217/350/247/210/345/231/250/345/260/261/350/257/225/350/277/231/344/270/252/forum_functions.py" +0 -0
  65. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/mcp/346/226/207/344/273/266/350/256/272/345/235/233/347/211/2102_/345/246/202/346/236/234/345/216/237/347/211/210/345/220/257/345/212/250/344/270/215/344/272/206/346/265/217/350/247/210/345/231/250/345/260/261/350/257/225/350/277/231/344/270/252/platform_functions.py" +0 -0
  66. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/mcp/346/226/207/344/273/266/350/256/272/345/235/233/347/211/2102_/345/246/202/346/236/234/345/216/237/347/211/210/345/220/257/345/212/250/344/270/215/344/272/206/346/265/217/350/247/210/345/231/250/345/260/261/350/257/225/350/277/231/344/270/252/user_config.json" +0 -0
  67. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/sample_mcp_config.json +0 -0
  68. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked/user_config.json +0 -0
  69. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked//347/244/272/344/276/213/345/217/202/350/200/203/346/226/207/346/241/243_BRAIN_Alpha_Test_Requirements_and_Tips.md" +0 -0
  70. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked//347/244/272/344/276/213/345/267/245/344/275/234/346/265/201_Alpha_explaination_workflow.md" +0 -0
  71. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked//347/244/272/344/276/213/345/267/245/344/275/234/346/265/201_BRAIN_6_Tips_Datafield_Exploration_Guide.md" +0 -0
  72. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked//347/244/272/344/276/213/345/267/245/344/275/234/346/265/201_BRAIN_Alpha_Improvement_Workflow.md" +0 -0
  73. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked//347/244/272/344/276/213/345/267/245/344/275/234/346/265/201_Dataset_Exploration_Expert_Manual.md" +0 -0
  74. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp/untracked//347/244/272/344/276/213/345/267/245/344/275/234/346/265/201_daily_report_workflow.md" +0 -0
  75. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp.egg-info/SOURCES.txt +0 -0
  76. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp.egg-info/dependency_links.txt +0 -0
  77. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp.egg-info/entry_points.txt +0 -0
  78. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp.egg-info/not-zip-safe +0 -0
  79. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp.egg-info/requires.txt +0 -0
  80. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/cnhkmcp.egg-info/top_level.txt +0 -0
  81. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/requirements.txt +0 -0
  82. {cnhkmcp-1.4.6 → cnhkmcp-1.4.8}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cnhkmcp
3
- Version: 1.4.6
3
+ Version: 1.4.8
4
4
  Summary: A comprehensive Model Context Protocol (MCP) server for quantitative trading platform integration
5
5
  Home-page: https://github.com/cnhk/cnhkmcp
6
6
  Author: CNHK
@@ -50,7 +50,7 @@ from .untracked.forum_functions import (
50
50
  read_full_forum_post
51
51
  )
52
52
 
53
- __version__ = "1.4.6"
53
+ __version__ = "1.4.8"
54
54
  __author__ = "CNHK"
55
55
  __email__ = "cnhk@example.com"
56
56
 
@@ -16,6 +16,14 @@ This means Playwright cannot find the Chrome browser executable in its default s
16
16
 
17
17
  The solution is to download the Chrome `.deb` package, extract the executable, and then point your Playwright script to it.
18
18
 
19
+ ### Step 0: pip install playwright
20
+
21
+ Before you begin, make sure you have Playwright installed. You can install it using pip:
22
+
23
+ ```bash
24
+ pip install playwright
25
+ ```
26
+
19
27
  ### Step 1: Download the Chrome `.deb` Package
20
28
 
21
29
  You can download the latest stable version of Google Chrome for Debian/Ubuntu-based systems using `wget`:
@@ -75,12 +75,24 @@ def is_version_sufficient(installed: str, required: str) -> bool:
75
75
 
76
76
 
77
77
  def install_package(spec: str) -> Tuple[bool, str]:
78
- """Install a package spec using pip. Returns (success, output)."""
79
- cmd = [sys.executable, "-m", "pip", "install", spec]
78
+ """Install a package spec using pip. Streams output live and returns (success, output)."""
79
+ # Use -v for verbose pip output; capture stdout/stderr while streaming to console
80
+ cmd = [sys.executable, "-m", "pip", "install", "-v", spec]
80
81
  try:
81
- completed = subprocess.run(cmd, capture_output=True, text=True)
82
- out = completed.stdout + "\n" + completed.stderr
83
- success = completed.returncode == 0
82
+ proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
83
+ output_lines = []
84
+ if proc.stdout:
85
+ for line in proc.stdout:
86
+ output_lines.append(line)
87
+ # print each pip line as it arrives for visibility
88
+ try:
89
+ print(line.rstrip())
90
+ except Exception:
91
+ # fallback: print raw line
92
+ print(line)
93
+ proc.wait()
94
+ out = "".join(output_lines)
95
+ success = proc.returncode == 0
84
96
  return success, out
85
97
  except Exception as e:
86
98
  return False, str(e)
@@ -113,10 +125,21 @@ def main():
113
125
  if needs_install:
114
126
  print(f"-> {name}: {action} via pip ({spec})")
115
127
  success, output = install_package(spec)
128
+ # Attempt to read installed version after install
129
+ installed_after = None
130
+ if success:
131
+ try:
132
+ installed_after = importlib.metadata.version(name)
133
+ except Exception:
134
+ installed_after = None
135
+ if installed_after:
136
+ print(f" -> {name} now installed as: {installed_after}")
137
+
116
138
  results.append({
117
139
  "name": name,
118
140
  "spec": spec,
119
141
  "installed_version_before": installed_ver,
142
+ "installed_version_after": installed_after,
120
143
  "action": action,
121
144
  "success": success,
122
145
  "output": output
@@ -152,6 +175,8 @@ def main():
152
175
  print("-----")
153
176
  print(f"Package: {f['name']}")
154
177
  print(f"Spec: {f['spec']}")
178
+ print(f"Installed before: {f.get('installed_version_before')}")
179
+ print(f"Installed after: {f.get('installed_version_after')}")
155
180
  print("Output:")
156
181
  print(f.get("output", "(no output)"))
157
182
 
@@ -371,7 +371,9 @@ class BrainApiClient:
371
371
  print("Alpha done simulating, getting alpha details")
372
372
  alpha_id = simulation_progress.json()["alpha"]
373
373
  alpha = self.session.get("https://api.worldquantbrain.com/alphas/" + alpha_id)
374
- return alpha.json()
374
+ result = alpha.json()
375
+ result['note'] = "if you got a negative alpha sharpe, you can just add a minus sign in front of the last line of the Alpha to flip then think the next step."
376
+ return result
375
377
 
376
378
  except Exception as e:
377
379
  self.log(f"❌ Failed to create simulation: {str(e)}", "ERROR")
@@ -1822,7 +1824,7 @@ async def create_simulation(
1822
1824
  result = await brain_client.create_simulation(simulation_data)
1823
1825
  return result
1824
1826
  except Exception as e:
1825
- return {"error": str(e)}
1827
+ return {"error": str(e), "note":", you need to call three mcp tools get_operators, get_platform_setting_options and get_datafields to check whether you correctly use the operators, setting the simulation settings, and existing data fields."}
1826
1828
 
1827
1829
  # get_simulation_status MCP tool removed as requested
1828
1830
  # wait_for_simulation MCP tool removed as requested
@@ -2588,7 +2590,7 @@ async def create_multiSim(
2588
2590
  response = brain_client.session.post(f"{brain_client.base_url}/simulations", json=multisimulation_data)
2589
2591
 
2590
2592
  if response.status_code != 201:
2591
- return {"error": f"Failed to create multisimulation. Status: {response.status_code}"}
2593
+ return {"error": f"Failed to create multisimulation. Status: {response.status_code},, you need to call three mcp tools get_operators, get_platform_setting_options and get_datafields to check whether you correctly use the operators, setting the simulation settings, and existing data fields."}
2592
2594
 
2593
2595
  # Get multisimulation location
2594
2596
  location = response.headers.get('Location', '')
@@ -2599,7 +2601,7 @@ async def create_multiSim(
2599
2601
  return await _wait_for_multisimulation_completion(location, len(alpha_expressions))
2600
2602
 
2601
2603
  except Exception as e:
2602
- return {"error": f"Error creating multisimulation: {str(e)}"}
2604
+ return {"error": f"Error creating multisimulation: {str(e)}, , you need to call three mcp tools get_operators, get_platform_setting_options and get_datafields to check whether you correctly use the operators, setting the simulation settings, and existing data fields."}
2603
2605
 
2604
2606
  async def _wait_for_multisimulation_completion(location: str, expected_children: int) -> Dict[str, Any]:
2605
2607
  """Wait for multisimulation to complete and return results"""
@@ -2714,11 +2716,12 @@ async def _wait_for_multisimulation_completion(location: str, expected_children:
2714
2716
  'total_created': len(alpha_results),
2715
2717
  'multisimulation_id': location.split('/')[-1],
2716
2718
  'multisimulation_location': location,
2717
- 'alpha_results': alpha_results
2719
+ 'alpha_results': alpha_results,
2720
+ 'note': "if you got a negative alpha sharpe, you can just add a minus sign in front of the last line of the Alpha to flip then think the next step."
2718
2721
  }
2719
2722
 
2720
2723
  except Exception as e:
2721
- return {"error": f"Error waiting for multisimulation completion: {str(e)}"}
2724
+ return {"error": f"Error waiting for multisimulation completion: {str(e)}, you need to call three mcp tools get_operators, get_platform_setting_options and get_datafields to check whether you correctly use the operators, setting the simulation settings, and existing data fields."}
2722
2725
 
2723
2726
  @mcp.tool()
2724
2727
  async def get_daily_and_quarterly_payment(email: str = "", password: str = "") -> Dict[str, Any]:
@@ -75,12 +75,24 @@ def is_version_sufficient(installed: str, required: str) -> bool:
75
75
 
76
76
 
77
77
  def install_package(spec: str) -> Tuple[bool, str]:
78
- """Install a package spec using pip. Returns (success, output)."""
79
- cmd = [sys.executable, "-m", "pip", "install", spec]
78
+ """Install a package spec using pip. Streams output live and returns (success, output)."""
79
+ # Use -v for verbose pip output; capture stdout/stderr while streaming to console
80
+ cmd = [sys.executable, "-m", "pip", "install", "-v", spec]
80
81
  try:
81
- completed = subprocess.run(cmd, capture_output=True, text=True)
82
- out = completed.stdout + "\n" + completed.stderr
83
- success = completed.returncode == 0
82
+ proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
83
+ output_lines = []
84
+ if proc.stdout:
85
+ for line in proc.stdout:
86
+ output_lines.append(line)
87
+ # print each pip line as it arrives for visibility
88
+ try:
89
+ print(line.rstrip())
90
+ except Exception:
91
+ # fallback: print raw line
92
+ print(line)
93
+ proc.wait()
94
+ out = "".join(output_lines)
95
+ success = proc.returncode == 0
84
96
  return success, out
85
97
  except Exception as e:
86
98
  return False, str(e)
@@ -113,10 +125,21 @@ def main():
113
125
  if needs_install:
114
126
  print(f"-> {name}: {action} via pip ({spec})")
115
127
  success, output = install_package(spec)
128
+ # Attempt to read installed version after install
129
+ installed_after = None
130
+ if success:
131
+ try:
132
+ installed_after = importlib.metadata.version(name)
133
+ except Exception:
134
+ installed_after = None
135
+ if installed_after:
136
+ print(f" -> {name} now installed as: {installed_after}")
137
+
116
138
  results.append({
117
139
  "name": name,
118
140
  "spec": spec,
119
141
  "installed_version_before": installed_ver,
142
+ "installed_version_after": installed_after,
120
143
  "action": action,
121
144
  "success": success,
122
145
  "output": output
@@ -152,6 +175,8 @@ def main():
152
175
  print("-----")
153
176
  print(f"Package: {f['name']}")
154
177
  print(f"Spec: {f['spec']}")
178
+ print(f"Installed before: {f.get('installed_version_before')}")
179
+ print(f"Installed after: {f.get('installed_version_after')}")
155
180
  print("Output:")
156
181
  print(f.get("output", "(no output)"))
157
182
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cnhkmcp
3
- Version: 1.4.6
3
+ Version: 1.4.8
4
4
  Summary: A comprehensive Model Context Protocol (MCP) server for quantitative trading platform integration
5
5
  Home-page: https://github.com/cnhk/cnhkmcp
6
6
  Author: CNHK
@@ -13,7 +13,7 @@ def read_requirements():
13
13
 
14
14
  setup(
15
15
  name="cnhkmcp",
16
- version="1.4.6",
16
+ version="1.4.8",
17
17
  author="CNHK",
18
18
  author_email="cnhk@example.com",
19
19
  description="A comprehensive Model Context Protocol (MCP) server for quantitative trading platform integration",
File without changes
File without changes
File without changes
File without changes
File without changes