rowan-mcp 1.0.1__py3-none-any.whl → 1.0.2__py3-none-any.whl
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.
Potentially problematic release.
This version of rowan-mcp might be problematic. Click here for more details.
- rowan_mcp/__init__.py +1 -1
- rowan_mcp/functions/pka.py +4 -53
- {rowan_mcp-1.0.1.dist-info → rowan_mcp-1.0.2.dist-info}/METADATA +9 -1
- {rowan_mcp-1.0.1.dist-info → rowan_mcp-1.0.2.dist-info}/RECORD +6 -6
- {rowan_mcp-1.0.1.dist-info → rowan_mcp-1.0.2.dist-info}/WHEEL +0 -0
- {rowan_mcp-1.0.1.dist-info → rowan_mcp-1.0.2.dist-info}/entry_points.txt +0 -0
rowan_mcp/__init__.py
CHANGED
rowan_mcp/functions/pka.py
CHANGED
|
@@ -15,7 +15,7 @@ if not hasattr(rowan, 'api_key') or not rowan.api_key:
|
|
|
15
15
|
api_key = os.getenv("ROWAN_API_KEY")
|
|
16
16
|
if api_key:
|
|
17
17
|
rowan.api_key = api_key
|
|
18
|
-
logger.info("
|
|
18
|
+
logger.info("Rowan API key configured")
|
|
19
19
|
else:
|
|
20
20
|
logger.error("No ROWAN_API_KEY found in environment")
|
|
21
21
|
|
|
@@ -39,7 +39,7 @@ def rowan_pka(
|
|
|
39
39
|
|
|
40
40
|
Args:
|
|
41
41
|
name: Name for the calculation
|
|
42
|
-
molecule: Molecule SMILES string
|
|
42
|
+
molecule: Molecule SMILES string
|
|
43
43
|
folder_uuid: UUID of folder to organize calculation in
|
|
44
44
|
blocking: Whether to wait for completion (default: True)
|
|
45
45
|
ping_interval: How often to check status in seconds (default: 5)
|
|
@@ -57,56 +57,7 @@ def rowan_pka(
|
|
|
57
57
|
ping_interval=ping_interval
|
|
58
58
|
)
|
|
59
59
|
|
|
60
|
-
|
|
61
|
-
if blocking:
|
|
62
|
-
# We waited for completion - format actual results
|
|
63
|
-
status = result.get('status', result.get('object_status', 'Unknown'))
|
|
64
|
-
|
|
65
|
-
if status == 2: # Completed successfully
|
|
66
|
-
formatted = f" pKa calculation for '{name}' completed successfully!\n\n"
|
|
67
|
-
elif status == 3: # Failed
|
|
68
|
-
formatted = f" pKa calculation for '{name}' failed!\n\n"
|
|
69
|
-
else:
|
|
70
|
-
formatted = f" pKa calculation for '{name}' finished with status {status}\n\n"
|
|
71
|
-
|
|
72
|
-
formatted += f" Molecule: {molecule}\n"
|
|
73
|
-
formatted += f" Job UUID: {result.get('uuid', 'N/A')}\n"
|
|
74
|
-
formatted += f" Status: {status}\n"
|
|
75
|
-
|
|
76
|
-
# Try to extract pKa results
|
|
77
|
-
if isinstance(result, dict) and 'object_data' in result and result['object_data']:
|
|
78
|
-
data = result['object_data']
|
|
79
|
-
|
|
80
|
-
# Extract pKa values
|
|
81
|
-
if 'strongest_acid' in data:
|
|
82
|
-
if data['strongest_acid'] is not None:
|
|
83
|
-
formatted += f" Strongest Acid pKa: {data['strongest_acid']:.2f}\n"
|
|
84
|
-
else:
|
|
85
|
-
formatted += f" Strongest Acid pKa: N/A (no acidic sites found)\n"
|
|
86
|
-
|
|
87
|
-
if 'strongest_base' in data:
|
|
88
|
-
if data['strongest_base'] is not None:
|
|
89
|
-
formatted += f" Strongest Base pKa: {data['strongest_base']:.2f}\n"
|
|
90
|
-
else:
|
|
91
|
-
formatted += f" Strongest Base pKa: N/A (no basic sites found)\n"
|
|
92
|
-
if 'pka_values' in data and isinstance(data['pka_values'], list):
|
|
93
|
-
formatted += f" All pKa values: {', '.join([f'{val:.2f}' for val in data['pka_values']])}\n"
|
|
94
|
-
|
|
95
|
-
# Additional properties if available
|
|
96
|
-
if 'ionizable_sites' in data:
|
|
97
|
-
formatted += f" Ionizable sites found: {data['ionizable_sites']}\n"
|
|
98
|
-
|
|
99
|
-
# Basic guidance
|
|
100
|
-
if status == 2:
|
|
101
|
-
formatted += f"\n Use rowan_workflow_management(action='retrieve', workflow_uuid='{result.get('uuid')}') for detailed data\n"
|
|
102
|
-
else:
|
|
103
|
-
# Non-blocking mode - just submission confirmation
|
|
104
|
-
formatted = f" pKa calculation for '{name}' submitted!\n\n"
|
|
105
|
-
formatted += f" Molecule: {molecule}\n"
|
|
106
|
-
formatted += f" Job UUID: {result.get('uuid', 'N/A')}\n"
|
|
107
|
-
formatted += f" Status: {result.get('status', 'Submitted')}\n"
|
|
108
|
-
|
|
109
|
-
return formatted
|
|
60
|
+
return str(result)
|
|
110
61
|
|
|
111
62
|
except Exception as e:
|
|
112
63
|
error_response = {
|
|
@@ -125,7 +76,7 @@ def test_rowan_pka():
|
|
|
125
76
|
name="test_pka_water",
|
|
126
77
|
molecule="O"
|
|
127
78
|
)
|
|
128
|
-
print("
|
|
79
|
+
print("pKa test successful")
|
|
129
80
|
print(f"Result: {result}")
|
|
130
81
|
return True
|
|
131
82
|
except Exception as e:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rowan-mcp
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.2
|
|
4
4
|
Summary: Model Context Protocol server for Rowan computational chemistry platform
|
|
5
5
|
Project-URL: Homepage, https://github.com/k-yenko/rowan-mcp
|
|
6
6
|
Author-email: Katherine Yenko <katherineayenko@gmail.com>
|
|
@@ -225,3 +225,11 @@ uv publish
|
|
|
225
225
|
# Or publish to TestPyPI first
|
|
226
226
|
uv publish --index-url https://test.pypi.org/simple/
|
|
227
227
|
```
|
|
228
|
+
|
|
229
|
+
To update the dxt file:
|
|
230
|
+
```bash
|
|
231
|
+
# After updating the PyPI package, update all changed tools/functions
|
|
232
|
+
|
|
233
|
+
# Then update the desktop extension
|
|
234
|
+
dxt pack rowan-dxt
|
|
235
|
+
```
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
rowan_mcp/__init__.py,sha256=
|
|
1
|
+
rowan_mcp/__init__.py,sha256=VDEcimR-BO3hPSxH-0R-dDQBCR2AKvWllMBaiVV2Zfc,376
|
|
2
2
|
rowan_mcp/__main__.py,sha256=I7wCpoCPLrCx_tWozFBtCtnoL65lmgDiZnEumj3vijM,388
|
|
3
3
|
rowan_mcp/server.py,sha256=47MsJchxzqRVd4mFQXR81wYXBX8B8fFUkl7wDYB5uMs,7702
|
|
4
4
|
rowan_mcp/functions/admet.py,sha256=m_RD7OJ8GDocEInHw4zOmk4tBf2mWBGTL3LVt-vo_mU,2438
|
|
@@ -19,7 +19,7 @@ rowan_mcp/functions/molecular_dynamics.py,sha256=yzA03LeFv8K59Cg1SAnavWwmodl4_KW
|
|
|
19
19
|
rowan_mcp/functions/molecule_lookup.py,sha256=Ff3ARljNbLlGgSinREl6OFxoJ-HVXtbXPxy-r_6CMKs,1467
|
|
20
20
|
rowan_mcp/functions/multistage_opt.py,sha256=lWwgXZgpXnWsjgonkA1toks4t01Cdxo822xmT2EOssM,6185
|
|
21
21
|
rowan_mcp/functions/pdb_handler.py,sha256=EnhRqxStnke5kiSnDaWOzcJT8fAHW6VVIhTaH6ODkWE,6241
|
|
22
|
-
rowan_mcp/functions/pka.py,sha256=
|
|
22
|
+
rowan_mcp/functions/pka.py,sha256=9Ne2mBxX1wryyVJm-T66o6_KPfARHnab6sKqLXpt3oU,2335
|
|
23
23
|
rowan_mcp/functions/redox_potential.py,sha256=NXU1sEkMqI-2-LD9qv7qaBhkmAvwU3dFGLQ988DG4cc,13114
|
|
24
24
|
rowan_mcp/functions/scan.py,sha256=LWr6YKwCG3gv0ZtyCbPaJ81NlQyFTHFZ4WnXvSRxmVg,24235
|
|
25
25
|
rowan_mcp/functions/scan_analyzer.py,sha256=vnAokCFOxYbv3Px3p9dEIxQXL7ot6UMjeUfMb_ZF6Ug,13479
|
|
@@ -28,7 +28,7 @@ rowan_mcp/functions/spin_states.py,sha256=NG7uJjTi_Fx-E4Qr7RzjNhfFmKlHfIGMD0Uhyo
|
|
|
28
28
|
rowan_mcp/functions/system_management.py,sha256=UwdKD46FNEJh1zEPpvFW7-JBD6g8x-xSbmH7lrcubx0,20089
|
|
29
29
|
rowan_mcp/functions/tautomers.py,sha256=oXFUpMgCVtXy2JnyCb8G04vYj_anJj4WThD26ZGOsZ0,2694
|
|
30
30
|
rowan_mcp/functions/workflow_management.py,sha256=EqXRqj0EuJz7h2igqOHBpq23Qyo-KT9geWp39URacxw,21130
|
|
31
|
-
rowan_mcp-1.0.
|
|
32
|
-
rowan_mcp-1.0.
|
|
33
|
-
rowan_mcp-1.0.
|
|
34
|
-
rowan_mcp-1.0.
|
|
31
|
+
rowan_mcp-1.0.2.dist-info/METADATA,sha256=YnmsMhwW2K0VHeU30HuBNOV-vCKo1eoqGdBpw50XxtQ,6425
|
|
32
|
+
rowan_mcp-1.0.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
33
|
+
rowan_mcp-1.0.2.dist-info/entry_points.txt,sha256=QkmK3GHkTNA6gqyTIFrl2V2eVBm-VBdRAlDNsvi4Rl0,52
|
|
34
|
+
rowan_mcp-1.0.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|