scmcp-shared 0.4.0__py3-none-any.whl → 0.5.0__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.
Files changed (171) hide show
  1. scmcp_shared/__init__.py +1 -3
  2. scmcp_shared/agent.py +58 -8
  3. scmcp_shared/backend.py +44 -0
  4. scmcp_shared/cli.py +75 -46
  5. scmcp_shared/kb.py +38 -0
  6. scmcp_shared/logging_config.py +6 -8
  7. scmcp_shared/mcp_base.py +184 -0
  8. scmcp_shared/schema/io.py +101 -59
  9. scmcp_shared/schema/pl.py +386 -490
  10. scmcp_shared/schema/pp.py +514 -265
  11. scmcp_shared/schema/preset/__init__.py +15 -0
  12. scmcp_shared/schema/preset/io.py +103 -0
  13. scmcp_shared/schema/preset/pl.py +843 -0
  14. scmcp_shared/schema/preset/pp.py +616 -0
  15. scmcp_shared/schema/preset/tl.py +917 -0
  16. scmcp_shared/schema/preset/util.py +123 -0
  17. scmcp_shared/schema/tl.py +355 -407
  18. scmcp_shared/schema/util.py +57 -72
  19. scmcp_shared/server/__init__.py +0 -12
  20. scmcp_shared/server/auto.py +10 -8
  21. scmcp_shared/server/code.py +3 -0
  22. scmcp_shared/server/preset/__init__.py +14 -0
  23. scmcp_shared/server/{io.py → preset/io.py} +26 -22
  24. scmcp_shared/server/{pl.py → preset/pl.py} +162 -78
  25. scmcp_shared/server/{pp.py → preset/pp.py} +123 -65
  26. scmcp_shared/server/{tl.py → preset/tl.py} +142 -79
  27. scmcp_shared/server/{util.py → preset/util.py} +123 -66
  28. scmcp_shared/util.py +109 -38
  29. scmcp_shared/vector_db/decoupler.lance/_transactions/0-9499b1b5-85d4-44c2-8f05-1bcce87fe4ef.txn +3 -0
  30. scmcp_shared/vector_db/decoupler.lance/_transactions/1-1632e7a3-4427-4077-8d03-57437144443d.txn +0 -0
  31. scmcp_shared/vector_db/decoupler.lance/_transactions/10-dcf66479-eafb-4193-9358-198154aea1c1.txn +0 -0
  32. scmcp_shared/vector_db/decoupler.lance/_transactions/11-2c6ddc17-49f5-47b5-8764-753297cf9e1b.txn +0 -0
  33. scmcp_shared/vector_db/decoupler.lance/_transactions/12-f079d0a2-9c1c-4e7a-abf6-3e3c4cddac11.txn +0 -0
  34. scmcp_shared/vector_db/decoupler.lance/_transactions/13-5bda9382-a06e-493d-85cb-e066172778ce.txn +0 -0
  35. scmcp_shared/vector_db/decoupler.lance/_transactions/14-6f9c669f-25e2-4096-b7ea-9b421a37e110.txn +0 -0
  36. scmcp_shared/vector_db/decoupler.lance/_transactions/15-2068cca9-31e8-45a3-86d1-bcb8924c72b9.txn +0 -0
  37. scmcp_shared/vector_db/decoupler.lance/_transactions/16-72356bb2-5c98-424e-97aa-a92fa3453da6.txn +0 -0
  38. scmcp_shared/vector_db/decoupler.lance/_transactions/17-9baa67ce-f6d3-478c-9511-20d01988d4d5.txn +0 -0
  39. scmcp_shared/vector_db/decoupler.lance/_transactions/18-b9f2e28e-c4c5-4ce7-bf58-402d53a39558.txn +0 -0
  40. scmcp_shared/vector_db/decoupler.lance/_transactions/19-d199d9f9-7990-4ec0-adde-e98c1c927202.txn +0 -0
  41. scmcp_shared/vector_db/decoupler.lance/_transactions/2-3827747c-095e-41cb-af69-3814bab3a588.txn +0 -0
  42. scmcp_shared/vector_db/decoupler.lance/_transactions/20-31c197a3-7a23-472f-a7e3-056c0ff11e3a.txn +0 -0
  43. scmcp_shared/vector_db/decoupler.lance/_transactions/21-066e3024-36f8-4557-83ae-d2f338ec045c.txn +0 -0
  44. scmcp_shared/vector_db/decoupler.lance/_transactions/22-1d1ccbe5-7c4c-4882-986a-c61ec2f7925e.txn +0 -0
  45. scmcp_shared/vector_db/decoupler.lance/_transactions/23-b2c41628-b2d6-49f1-81b5-3cd9100894b4.txn +0 -0
  46. scmcp_shared/vector_db/decoupler.lance/_transactions/24-e43e2e8d-9dd8-479f-b63c-d147e737c49f.txn +0 -0
  47. scmcp_shared/vector_db/decoupler.lance/_transactions/25-188708e9-5ee1-4b5c-8e13-45dec8efd60d.txn +0 -0
  48. scmcp_shared/vector_db/decoupler.lance/_transactions/26-4f4b6316-5680-4b31-8dd6-215cce66d7b5.txn +0 -0
  49. scmcp_shared/vector_db/decoupler.lance/_transactions/27-c1855f86-abab-44ef-9e61-1312dffc9b06.txn +0 -0
  50. scmcp_shared/vector_db/decoupler.lance/_transactions/28-650d2be0-e977-4177-b457-b733eea8b6ea.txn +0 -0
  51. scmcp_shared/vector_db/decoupler.lance/_transactions/29-e47751d8-0e44-46da-82bd-4836b00a8431.txn +0 -0
  52. scmcp_shared/vector_db/decoupler.lance/_transactions/3-518fc9b8-67de-48f7-94c8-f2398c63dbc5.txn +0 -0
  53. scmcp_shared/vector_db/decoupler.lance/_transactions/30-0db3ea0f-deca-4b5b-9d70-9fb5f741f90c.txn +0 -0
  54. scmcp_shared/vector_db/decoupler.lance/_transactions/31-ef76f0bb-bcfa-4031-b3ad-94b51ee818a9.txn +0 -0
  55. scmcp_shared/vector_db/decoupler.lance/_transactions/32-a763e0f1-5c8d-460f-a455-0c6f6c4f1450.txn +0 -0
  56. scmcp_shared/vector_db/decoupler.lance/_transactions/33-30bce2aa-8e6f-4f42-a323-c420133aa20f.txn +0 -0
  57. scmcp_shared/vector_db/decoupler.lance/_transactions/34-f91ec2f9-d34b-4fcf-8bc7-564c28e50538.txn +0 -0
  58. scmcp_shared/vector_db/decoupler.lance/_transactions/35-7f36a75c-96a7-4868-a4db-5d5f78ecf850.txn +0 -0
  59. scmcp_shared/vector_db/decoupler.lance/_transactions/36-f2df7f99-a37c-458a-958d-7eb5e81eee18.txn +0 -0
  60. scmcp_shared/vector_db/decoupler.lance/_transactions/37-e0af7415-955b-4167-8705-fa9ddb643e9a.txn +0 -0
  61. scmcp_shared/vector_db/decoupler.lance/_transactions/38-6c24a9f0-ce71-4dda-8193-479aa23c5456.txn +0 -0
  62. scmcp_shared/vector_db/decoupler.lance/_transactions/39-72b8a20c-3112-4cf1-8b05-b74a2c02c3f2.txn +0 -0
  63. scmcp_shared/vector_db/decoupler.lance/_transactions/4-42904942-5a79-4f28-90ce-35a4ae8c40d1.txn +0 -0
  64. scmcp_shared/vector_db/decoupler.lance/_transactions/40-95ac7526-6a2e-4914-9654-288c41bff370.txn +0 -0
  65. scmcp_shared/vector_db/decoupler.lance/_transactions/41-13430464-5e62-4aa8-9709-513693a75095.txn +0 -0
  66. scmcp_shared/vector_db/decoupler.lance/_transactions/42-cbb1ad83-a906-4540-bc37-4db158eac618.txn +0 -0
  67. scmcp_shared/vector_db/decoupler.lance/_transactions/43-3c246401-d742-49a9-b24d-cfc457685461.txn +0 -0
  68. scmcp_shared/vector_db/decoupler.lance/_transactions/44-11315c14-ecf4-4e3d-8690-46d57cb3e8c0.txn +0 -0
  69. scmcp_shared/vector_db/decoupler.lance/_transactions/45-7bbf4bc6-96d4-425a-afa2-34aec7121c85.txn +0 -0
  70. scmcp_shared/vector_db/decoupler.lance/_transactions/5-82dda0b4-7838-4f04-90f3-4b1e932c6891.txn +0 -0
  71. scmcp_shared/vector_db/decoupler.lance/_transactions/6-c78352d8-16ba-4814-bd7f-74b8c0c5efe7.txn +0 -0
  72. scmcp_shared/vector_db/decoupler.lance/_transactions/7-bb882b35-63f3-4c52-870f-6a64e3ac7f3c.txn +0 -0
  73. scmcp_shared/vector_db/decoupler.lance/_transactions/8-fc84ad1b-1b59-4822-8fc7-70f4eb18f6d9.txn +0 -0
  74. scmcp_shared/vector_db/decoupler.lance/_transactions/9-3404dcf1-bb17-40e6-9e5d-d9942dff90b2.txn +0 -0
  75. scmcp_shared/vector_db/decoupler.lance/_versions/1.manifest +0 -0
  76. scmcp_shared/vector_db/decoupler.lance/_versions/10.manifest +0 -0
  77. scmcp_shared/vector_db/decoupler.lance/_versions/11.manifest +0 -0
  78. scmcp_shared/vector_db/decoupler.lance/_versions/12.manifest +0 -0
  79. scmcp_shared/vector_db/decoupler.lance/_versions/13.manifest +0 -0
  80. scmcp_shared/vector_db/decoupler.lance/_versions/14.manifest +0 -0
  81. scmcp_shared/vector_db/decoupler.lance/_versions/15.manifest +0 -0
  82. scmcp_shared/vector_db/decoupler.lance/_versions/16.manifest +0 -0
  83. scmcp_shared/vector_db/decoupler.lance/_versions/17.manifest +0 -0
  84. scmcp_shared/vector_db/decoupler.lance/_versions/18.manifest +0 -0
  85. scmcp_shared/vector_db/decoupler.lance/_versions/19.manifest +0 -0
  86. scmcp_shared/vector_db/decoupler.lance/_versions/2.manifest +0 -0
  87. scmcp_shared/vector_db/decoupler.lance/_versions/20.manifest +0 -0
  88. scmcp_shared/vector_db/decoupler.lance/_versions/21.manifest +0 -0
  89. scmcp_shared/vector_db/decoupler.lance/_versions/22.manifest +0 -0
  90. scmcp_shared/vector_db/decoupler.lance/_versions/23.manifest +0 -0
  91. scmcp_shared/vector_db/decoupler.lance/_versions/24.manifest +0 -0
  92. scmcp_shared/vector_db/decoupler.lance/_versions/25.manifest +0 -0
  93. scmcp_shared/vector_db/decoupler.lance/_versions/26.manifest +0 -0
  94. scmcp_shared/vector_db/decoupler.lance/_versions/27.manifest +0 -0
  95. scmcp_shared/vector_db/decoupler.lance/_versions/28.manifest +0 -0
  96. scmcp_shared/vector_db/decoupler.lance/_versions/29.manifest +0 -0
  97. scmcp_shared/vector_db/decoupler.lance/_versions/3.manifest +0 -0
  98. scmcp_shared/vector_db/decoupler.lance/_versions/30.manifest +0 -0
  99. scmcp_shared/vector_db/decoupler.lance/_versions/31.manifest +0 -0
  100. scmcp_shared/vector_db/decoupler.lance/_versions/32.manifest +0 -0
  101. scmcp_shared/vector_db/decoupler.lance/_versions/33.manifest +0 -0
  102. scmcp_shared/vector_db/decoupler.lance/_versions/34.manifest +0 -0
  103. scmcp_shared/vector_db/decoupler.lance/_versions/35.manifest +0 -0
  104. scmcp_shared/vector_db/decoupler.lance/_versions/36.manifest +0 -0
  105. scmcp_shared/vector_db/decoupler.lance/_versions/37.manifest +0 -0
  106. scmcp_shared/vector_db/decoupler.lance/_versions/38.manifest +0 -0
  107. scmcp_shared/vector_db/decoupler.lance/_versions/39.manifest +0 -0
  108. scmcp_shared/vector_db/decoupler.lance/_versions/4.manifest +0 -0
  109. scmcp_shared/vector_db/decoupler.lance/_versions/40.manifest +0 -0
  110. scmcp_shared/vector_db/decoupler.lance/_versions/41.manifest +0 -0
  111. scmcp_shared/vector_db/decoupler.lance/_versions/42.manifest +0 -0
  112. scmcp_shared/vector_db/decoupler.lance/_versions/43.manifest +0 -0
  113. scmcp_shared/vector_db/decoupler.lance/_versions/44.manifest +0 -0
  114. scmcp_shared/vector_db/decoupler.lance/_versions/45.manifest +0 -0
  115. scmcp_shared/vector_db/decoupler.lance/_versions/46.manifest +0 -0
  116. scmcp_shared/vector_db/decoupler.lance/_versions/5.manifest +0 -0
  117. scmcp_shared/vector_db/decoupler.lance/_versions/6.manifest +0 -0
  118. scmcp_shared/vector_db/decoupler.lance/_versions/7.manifest +0 -0
  119. scmcp_shared/vector_db/decoupler.lance/_versions/8.manifest +0 -0
  120. scmcp_shared/vector_db/decoupler.lance/_versions/9.manifest +0 -0
  121. scmcp_shared/vector_db/decoupler.lance/data/0cc94dc3-2ca3-403c-a9df-59753f24b3f2.lance +0 -0
  122. scmcp_shared/vector_db/decoupler.lance/data/254a1a71-cdd2-4cca-b7ec-a50540fed62c.lance +0 -0
  123. scmcp_shared/vector_db/decoupler.lance/data/2574d216-5f05-4794-9e1c-986fafde6ab4.lance +0 -0
  124. scmcp_shared/vector_db/decoupler.lance/data/26c7bbe7-5f97-4453-b065-123b764448b3.lance +0 -0
  125. scmcp_shared/vector_db/decoupler.lance/data/286595a6-88f6-4b05-861e-e4f607a6fcdb.lance +0 -0
  126. scmcp_shared/vector_db/decoupler.lance/data/33219b1a-7575-46ef-bb64-2bdbde1e692b.lance +0 -0
  127. scmcp_shared/vector_db/decoupler.lance/data/344ad7dd-98bb-41de-b347-2f17bf5735cb.lance +0 -0
  128. scmcp_shared/vector_db/decoupler.lance/data/395b1ecb-68fe-4dd3-a770-4b3ed393ae0c.lance +0 -0
  129. scmcp_shared/vector_db/decoupler.lance/data/3db97f4c-9c35-44b7-9042-82b4006c5a22.lance +0 -0
  130. scmcp_shared/vector_db/decoupler.lance/data/4540246e-b0bb-4f4d-8f98-60a64f1c42ed.lance +0 -0
  131. scmcp_shared/vector_db/decoupler.lance/data/4643dbc0-9e45-4b63-81e1-e06cf9bddcec.lance +0 -0
  132. scmcp_shared/vector_db/decoupler.lance/data/4f28eb52-d409-43f2-ae17-d1826f209006.lance +0 -0
  133. scmcp_shared/vector_db/decoupler.lance/data/4fda4a22-35f0-4897-b4c5-6cedefba66e6.lance +0 -0
  134. scmcp_shared/vector_db/decoupler.lance/data/51ee77b6-ab24-44c0-916e-b81ff3912731.lance +0 -0
  135. scmcp_shared/vector_db/decoupler.lance/data/539d15c9-e88b-400c-9ab7-08f5e8dca10d.lance +0 -0
  136. scmcp_shared/vector_db/decoupler.lance/data/54007132-91f5-4909-8678-c471ef4d100f.lance +0 -0
  137. scmcp_shared/vector_db/decoupler.lance/data/546d88ec-0d5c-42bb-bccc-3271f3f183a4.lance +0 -0
  138. scmcp_shared/vector_db/decoupler.lance/data/6912ad8a-343c-4ca1-b1b7-4300125e688e.lance +0 -0
  139. scmcp_shared/vector_db/decoupler.lance/data/6b72e4f7-3051-40a4-a492-6d9eff1c647d.lance +0 -0
  140. scmcp_shared/vector_db/decoupler.lance/data/6d7ee320-ae1c-4e49-8ce5-c85971b11ce6.lance +0 -0
  141. scmcp_shared/vector_db/decoupler.lance/data/6ea47b70-69d4-43e9-b2c6-442fe50e4dd1.lance +0 -0
  142. scmcp_shared/vector_db/decoupler.lance/data/72adb5ed-bf11-4d06-b146-0272d333db08.lance +0 -0
  143. scmcp_shared/vector_db/decoupler.lance/data/745907df-e261-4f4b-a757-2c01c058bf27.lance +0 -0
  144. scmcp_shared/vector_db/decoupler.lance/data/78988307-4c66-4ad7-b295-7463ecd53609.lance +0 -0
  145. scmcp_shared/vector_db/decoupler.lance/data/798ce305-6d60-4f28-b82a-e1f647907abf.lance +0 -0
  146. scmcp_shared/vector_db/decoupler.lance/data/7c159cce-2741-442b-9c63-f44bf2996718.lance +0 -0
  147. scmcp_shared/vector_db/decoupler.lance/data/7cd7a818-e68b-4fa8-bad3-23b60c386670.lance +0 -0
  148. scmcp_shared/vector_db/decoupler.lance/data/7ec553ed-0c7a-4bac-99b2-2ad976b40466.lance +0 -0
  149. scmcp_shared/vector_db/decoupler.lance/data/83efdc85-d990-4762-b69a-fb1c3938f60f.lance +0 -0
  150. scmcp_shared/vector_db/decoupler.lance/data/8c1613b3-8d69-49c5-bfd0-a021bb516faf.lance +0 -0
  151. scmcp_shared/vector_db/decoupler.lance/data/95cd1b22-1f93-4133-9841-de21549ad8c5.lance +0 -0
  152. scmcp_shared/vector_db/decoupler.lance/data/9a2ea5d4-087e-4d3a-b64b-6c568b8a0010.lance +0 -0
  153. scmcp_shared/vector_db/decoupler.lance/data/b1c47dc6-450a-4dca-b465-badb6a3619c2.lance +0 -0
  154. scmcp_shared/vector_db/decoupler.lance/data/b21d183a-c51d-463b-932e-9beb2e0da9aa.lance +0 -0
  155. scmcp_shared/vector_db/decoupler.lance/data/b2598625-8683-4c33-be40-6f1a7555dc2c.lance +0 -0
  156. scmcp_shared/vector_db/decoupler.lance/data/b7297b39-1fc5-4886-be21-708b369bef59.lance +0 -0
  157. scmcp_shared/vector_db/decoupler.lance/data/b7d90085-5bd6-48f9-8a73-17eb7cf556fa.lance +0 -0
  158. scmcp_shared/vector_db/decoupler.lance/data/b988ceee-57fc-423b-8e67-5729086c6946.lance +0 -0
  159. scmcp_shared/vector_db/decoupler.lance/data/bfd68ea6-ddf4-44bb-aa87-2669f0462f7d.lance +0 -0
  160. scmcp_shared/vector_db/decoupler.lance/data/cb8ac58e-0e59-4391-95ab-6195e71b9625.lance +0 -0
  161. scmcp_shared/vector_db/decoupler.lance/data/d0f10434-afb5-49c5-9e77-d39a4f8cca94.lance +0 -0
  162. scmcp_shared/vector_db/decoupler.lance/data/d3f89fec-5795-4e11-8c15-bc2206a7fae2.lance +0 -0
  163. scmcp_shared/vector_db/decoupler.lance/data/e063c8a4-5ef1-4933-a049-b41049d9be5f.lance +0 -0
  164. scmcp_shared/vector_db/decoupler.lance/data/e2348b24-f290-4fe2-a6c8-e98009ae4c1b.lance +0 -0
  165. scmcp_shared/vector_db/decoupler.lance/data/e5d3f893-6763-40dc-9d02-04e2f56a4883.lance +0 -0
  166. {scmcp_shared-0.4.0.dist-info → scmcp_shared-0.5.0.dist-info}/METADATA +2 -1
  167. scmcp_shared-0.5.0.dist-info/RECORD +171 -0
  168. scmcp_shared/server/base.py +0 -148
  169. scmcp_shared-0.4.0.dist-info/RECORD +0 -24
  170. {scmcp_shared-0.4.0.dist-info → scmcp_shared-0.5.0.dist-info}/WHEEL +0 -0
  171. {scmcp_shared-0.4.0.dist-info → scmcp_shared-0.5.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,22 +1,22 @@
1
- import os
2
- import inspect
3
- from functools import partial
4
1
  import scanpy as sc
5
- from fastmcp import FastMCP, Context
6
2
  from fastmcp.tools.tool import Tool
7
3
  from fastmcp.exceptions import ToolError
8
- from ..schema.pl import *
9
- from ..schema import AdataInfo
10
- from pathlib import Path
11
- from ..util import forward_request, sc_like_plot, get_ads
12
- from .base import BaseMCP
4
+ from scmcp_shared.schema.preset.pl import *
5
+ from scmcp_shared.schema.preset import AdataInfo
6
+ from scmcp_shared.util import forward_request, sc_like_plot, get_ads
7
+ from scmcp_shared.mcp_base import BaseMCP
13
8
 
14
9
 
15
10
  class ScanpyPlottingMCP(BaseMCP):
16
- def __init__(self, include_tools: list = None, exclude_tools: list = None, AdataInfo: AdataInfo = AdataInfo):
11
+ def __init__(
12
+ self,
13
+ include_tools: list = None,
14
+ exclude_tools: list = None,
15
+ AdataInfo: AdataInfo = AdataInfo,
16
+ ):
17
17
  """
18
18
  Initialize ScanpyPreprocessingMCP with optional tool filtering.
19
-
19
+
20
20
  Args:
21
21
  include_tools (list, optional): List of tool names to include. If None, all tools are included.
22
22
  exclude_tools (list, optional): List of tool names to exclude. If None, no tools are excluded.
@@ -25,7 +25,7 @@ class ScanpyPlottingMCP(BaseMCP):
25
25
  super().__init__("ScanpyMCP-PL-Server", include_tools, exclude_tools, AdataInfo)
26
26
 
27
27
  def _tool_pca(self):
28
- def _pca(request: PCAParams, adinfo: self.AdataInfo=self.AdataInfo()):
28
+ def _pca(request: PCAParam, adinfo: self.AdataInfo = self.AdataInfo()):
29
29
  """Scatter plot in PCA coordinates. default figure for PCA plot"""
30
30
  try:
31
31
  if (res := forward_request("pl_pca", request, adinfo)) is not None:
@@ -36,14 +36,17 @@ class ScanpyPlottingMCP(BaseMCP):
36
36
  except ToolError as e:
37
37
  raise ToolError(e)
38
38
  except Exception as e:
39
- if hasattr(e, '__context__') and e.__context__:
39
+ if hasattr(e, "__context__") and e.__context__:
40
40
  raise ToolError(e.__context__)
41
41
  else:
42
42
  raise ToolError(e)
43
- return Tool.from_function(_pca, name="pca")
43
+
44
+ return Tool.from_function(_pca, name="pca", enabled=True)
44
45
 
45
46
  def _tool_diffmap(self):
46
- def _diffmap(request: DiffusionMapParams, adinfo: self.AdataInfo=self.AdataInfo()):
47
+ def _diffmap(
48
+ request: DiffusionMapParam, adinfo: self.AdataInfo = self.AdataInfo()
49
+ ):
47
50
  """Plot diffusion map embedding of cells."""
48
51
  try:
49
52
  if (res := forward_request("pl_diffmap", request, adinfo)) is not None:
@@ -54,14 +57,15 @@ class ScanpyPlottingMCP(BaseMCP):
54
57
  except ToolError as e:
55
58
  raise ToolError(e)
56
59
  except Exception as e:
57
- if hasattr(e, '__context__') and e.__context__:
60
+ if hasattr(e, "__context__") and e.__context__:
58
61
  raise ToolError(e.__context__)
59
62
  else:
60
63
  raise ToolError(e)
61
- return Tool.from_function(_diffmap, name="diffmap")
64
+
65
+ return Tool.from_function(_diffmap, name="diffmap", enabled=True)
62
66
 
63
67
  def _tool_violin(self):
64
- def _violin(request: ViolinParams, adinfo: self.AdataInfo=self.AdataInfo()):
68
+ def _violin(request: ViolinParam, adinfo: self.AdataInfo = self.AdataInfo()):
65
69
  """Plot violin plot of one or more variables."""
66
70
  try:
67
71
  if (res := forward_request("pl_violin", request, adinfo)) is not None:
@@ -70,54 +74,65 @@ class ScanpyPlottingMCP(BaseMCP):
70
74
  fig_path = sc_like_plot(sc.pl.violin, adata, request, adinfo)
71
75
  return {"figpath": fig_path}
72
76
  except KeyError as e:
73
- raise ToolError(f"doest found {e} in current sampleid with adtype {adinfo.adtype}")
77
+ raise ToolError(
78
+ f"doest found {e} in current sampleid with adtype {adinfo.adtype}"
79
+ )
74
80
  except ToolError as e:
75
81
  raise ToolError(e)
76
82
  except Exception as e:
77
- if hasattr(e, '__context__') and e.__context__:
83
+ if hasattr(e, "__context__") and e.__context__:
78
84
  raise ToolError(e.__context__)
79
85
  else:
80
86
  raise ToolError(e)
81
- return Tool.from_function(_violin, name="violin")
87
+
88
+ return Tool.from_function(_violin, name="violin", enabled=True)
82
89
 
83
90
  def _tool_stacked_violin(self):
84
- def _stacked_violin(request: StackedViolinParams, adinfo: self.AdataInfo=self.AdataInfo()):
91
+ def _stacked_violin(
92
+ request: StackedViolinParam, adinfo: self.AdataInfo = self.AdataInfo()
93
+ ):
85
94
  """Plot stacked violin plots. Makes a compact image composed of individual violin plots stacked on top of each other."""
86
95
  try:
87
- if (res := forward_request("pl_stacked_violin", request, adinfo)) is not None:
88
- return res
96
+ if (
97
+ res := forward_request("pl_stacked_violin", request, adinfo)
98
+ ) is not None:
99
+ return res
89
100
  adata = get_ads().get_adata(adinfo=adinfo)
90
101
  fig_path = sc_like_plot(sc.pl.stacked_violin, adata, request, adinfo)
91
102
  return {"figpath": fig_path}
92
103
  except ToolError as e:
93
104
  raise ToolError(e)
94
105
  except Exception as e:
95
- if hasattr(e, '__context__') and e.__context__:
106
+ if hasattr(e, "__context__") and e.__context__:
96
107
  raise ToolError(e.__context__)
97
108
  else:
98
109
  raise ToolError(e)
99
- return Tool.from_function(_stacked_violin, name="stacked_violin")
110
+
111
+ return Tool.from_function(_stacked_violin, name="stacked_violin", enabled=True)
100
112
 
101
113
  def _tool_heatmap(self):
102
- async def _heatmap(request: HeatmapParams, adinfo: self.AdataInfo=self.AdataInfo()):
114
+ async def _heatmap(
115
+ request: HeatmapParam, adinfo: self.AdataInfo = self.AdataInfo()
116
+ ):
103
117
  """Heatmap of the expression values of genes."""
104
118
  try:
105
119
  if (res := forward_request("pl_heatmap", request, adinfo)) is not None:
106
- return res
120
+ return res
107
121
  adata = get_ads().get_adata(adinfo=adinfo)
108
122
  fig_path = sc_like_plot(sc.pl.heatmap, adata, request, adinfo)
109
123
  return {"figpath": fig_path}
110
124
  except ToolError as e:
111
125
  raise ToolError(e)
112
126
  except Exception as e:
113
- if hasattr(e, '__context__') and e.__context__:
127
+ if hasattr(e, "__context__") and e.__context__:
114
128
  raise ToolError(e.__context__)
115
129
  else:
116
130
  raise ToolError(e)
117
- return Tool.from_function(_heatmap, name="heatmap")
131
+
132
+ return Tool.from_function(_heatmap, name="heatmap", enabled=True)
118
133
 
119
134
  def _tool_dotplot(self):
120
- def _dotplot(request: DotplotParams, adinfo: self.AdataInfo=self.AdataInfo()):
135
+ def _dotplot(request: DotplotParam, adinfo: self.AdataInfo = self.AdataInfo()):
121
136
  """Plot dot plot of expression values per gene for each group."""
122
137
  try:
123
138
  if (res := forward_request("pl_dotplot", request, adinfo)) is not None:
@@ -128,17 +143,22 @@ class ScanpyPlottingMCP(BaseMCP):
128
143
  except ToolError as e:
129
144
  raise ToolError(e)
130
145
  except Exception as e:
131
- if hasattr(e, '__context__') and e.__context__:
146
+ if hasattr(e, "__context__") and e.__context__:
132
147
  raise ToolError(e.__context__)
133
148
  else:
134
149
  raise ToolError(e)
135
- return Tool.from_function(_dotplot, name="dotplot")
150
+
151
+ return Tool.from_function(_dotplot, name="dotplot", enabled=True)
136
152
 
137
153
  def _tool_matrixplot(self):
138
- def _matrixplot(request: MatrixplotParams, adinfo: self.AdataInfo=self.AdataInfo()):
154
+ def _matrixplot(
155
+ request: MatrixplotParam, adinfo: self.AdataInfo = self.AdataInfo()
156
+ ):
139
157
  """matrixplot, Create a heatmap of the mean expression values per group of each var_names."""
140
158
  try:
141
- if (res := forward_request("pl_matrixplot", request, adinfo)) is not None:
159
+ if (
160
+ res := forward_request("pl_matrixplot", request, adinfo)
161
+ ) is not None:
142
162
  return res
143
163
  adata = get_ads().get_adata(adinfo=adinfo)
144
164
  fig_path = sc_like_plot(sc.pl.matrixplot, adata, request, adinfo)
@@ -146,17 +166,22 @@ class ScanpyPlottingMCP(BaseMCP):
146
166
  except ToolError as e:
147
167
  raise ToolError(e)
148
168
  except Exception as e:
149
- if hasattr(e, '__context__') and e.__context__:
169
+ if hasattr(e, "__context__") and e.__context__:
150
170
  raise ToolError(e.__context__)
151
171
  else:
152
172
  raise ToolError(e)
153
- return Tool.from_function(_matrixplot, name="matrixplot")
173
+
174
+ return Tool.from_function(_matrixplot, name="matrixplot", enabled=True)
154
175
 
155
176
  def _tool_tracksplot(self):
156
- def _tracksplot(request: TracksplotParams, adinfo: self.AdataInfo=self.AdataInfo()):
177
+ def _tracksplot(
178
+ request: TracksplotParam, adinfo: self.AdataInfo = self.AdataInfo()
179
+ ):
157
180
  """tracksplot, compact plot of expression of a list of genes."""
158
181
  try:
159
- if (res := forward_request("pl_tracksplot", request, adinfo)) is not None:
182
+ if (
183
+ res := forward_request("pl_tracksplot", request, adinfo)
184
+ ) is not None:
160
185
  return res
161
186
  adata = get_ads().get_adata(adinfo=adinfo)
162
187
  fig_path = sc_like_plot(sc.pl.tracksplot, adata, request, adinfo)
@@ -164,71 +189,93 @@ class ScanpyPlottingMCP(BaseMCP):
164
189
  except ToolError as e:
165
190
  raise ToolError(e)
166
191
  except Exception as e:
167
- if hasattr(e, '__context__') and e.__context__:
192
+ if hasattr(e, "__context__") and e.__context__:
168
193
  raise ToolError(e.__context__)
169
194
  else:
170
195
  raise ToolError(e)
196
+
171
197
  return Tool.from_function(_tracksplot, name="tracksplot")
172
198
 
173
199
  def _tool_scatter(self):
174
- def _scatter(request: EnhancedScatterParams, adinfo: self.AdataInfo=self.AdataInfo()):
200
+ def _scatter(
201
+ request: EnhancedScatterParam, adinfo: self.AdataInfo = self.AdataInfo()
202
+ ):
175
203
  """Plot a scatter plot of two variables, Scatter plot along observations or variables axes."""
176
204
  try:
177
205
  if (res := forward_request("pl_scatter", request, adinfo)) is not None:
178
- return res
206
+ return res
179
207
  adata = get_ads().get_adata(adinfo=adinfo)
180
208
  fig_path = sc_like_plot(sc.pl.scatter, adata, request, adinfo)
181
209
  return {"figpath": fig_path}
182
210
  except ToolError as e:
183
211
  raise ToolError(e)
184
212
  except Exception as e:
185
- if hasattr(e, '__context__') and e.__context__:
213
+ if hasattr(e, "__context__") and e.__context__:
186
214
  raise ToolError(e.__context__)
187
215
  else:
188
216
  raise ToolError(e)
189
- return Tool.from_function(_scatter, name="scatter")
217
+
218
+ return Tool.from_function(_scatter, name="scatter", enabled=True)
190
219
 
191
220
  def _tool_embedding(self):
192
- def _embedding(request: EmbeddingParams, adinfo: self.AdataInfo=self.AdataInfo()):
221
+ def _embedding(
222
+ request: EmbeddingParam, adinfo: self.AdataInfo = self.AdataInfo()
223
+ ):
193
224
  """Scatter plot for user specified embedding basis (e.g. umap, tsne, etc)."""
194
225
  try:
195
- if (res := forward_request("pl_embedding", request, adinfo)) is not None:
196
- return res
226
+ if (
227
+ res := forward_request("pl_embedding", request, adinfo)
228
+ ) is not None:
229
+ return res
197
230
  adata = get_ads().get_adata(adinfo=adinfo)
198
231
  fig_path = sc_like_plot(sc.pl.embedding, adata, request, adinfo)
199
232
  return {"figpath": fig_path}
200
233
  except KeyError as e:
201
- raise ToolError(f"doest found {e} in current sampleid with adtype {adinfo.adtype}")
234
+ raise ToolError(
235
+ f"doest found {e} in current sampleid with adtype {adinfo.adtype}"
236
+ )
202
237
  except Exception as e:
203
- if hasattr(e, '__context__') and e.__context__:
238
+ if hasattr(e, "__context__") and e.__context__:
204
239
  raise ToolError(e.__context__)
205
240
  else:
206
241
  raise ToolError(e)
207
- return Tool.from_function(_embedding, name="embedding")
242
+
243
+ return Tool.from_function(_embedding, name="embedding", enabled=True)
208
244
 
209
245
  def _tool_embedding_density(self):
210
- def _embedding_density(request: EmbeddingDensityParams, adinfo: self.AdataInfo=self.AdataInfo()):
246
+ def _embedding_density(
247
+ request: EmbeddingDensityParam, adinfo: self.AdataInfo = self.AdataInfo()
248
+ ):
211
249
  """Plot the density of cells in an embedding."""
212
250
  try:
213
- if (res := forward_request("pl_embedding_density", request, adinfo)) is not None:
214
- return res
251
+ if (
252
+ res := forward_request("pl_embedding_density", request, adinfo)
253
+ ) is not None:
254
+ return res
215
255
  adata = get_ads().get_adata(adinfo=adinfo)
216
256
  fig_path = sc_like_plot(sc.pl.embedding_density, adata, request, adinfo)
217
257
  return {"figpath": fig_path}
218
258
  except ToolError as e:
219
259
  raise ToolError(e)
220
260
  except Exception as e:
221
- if hasattr(e, '__context__') and e.__context__:
261
+ if hasattr(e, "__context__") and e.__context__:
222
262
  raise ToolError(e.__context__)
223
263
  else:
224
264
  raise ToolError(e)
225
- return Tool.from_function(_embedding_density, name="embedding_density")
265
+
266
+ return Tool.from_function(
267
+ _embedding_density, name="embedding_density", enabled=True
268
+ )
226
269
 
227
270
  def _tool_rank_genes_groups(self):
228
- def _rank_genes_groups(request: RankGenesGroupsParams, adinfo: self.AdataInfo=self.AdataInfo()):
271
+ def _rank_genes_groups(
272
+ request: RankGenesGroupsParam, adinfo: self.AdataInfo = self.AdataInfo()
273
+ ):
229
274
  """Plot ranking of genes based on differential expression."""
230
275
  try:
231
- if (res := forward_request("pl_rank_genes_groups", request, adinfo)) is not None:
276
+ if (
277
+ res := forward_request("pl_rank_genes_groups", request, adinfo)
278
+ ) is not None:
232
279
  return res
233
280
  adata = get_ads().get_adata(adinfo=adinfo)
234
281
  fig_path = sc_like_plot(sc.pl.rank_genes_groups, adata, request, adinfo)
@@ -236,35 +283,54 @@ class ScanpyPlottingMCP(BaseMCP):
236
283
  except ToolError as e:
237
284
  raise ToolError(e)
238
285
  except Exception as e:
239
- if hasattr(e, '__context__') and e.__context__:
286
+ if hasattr(e, "__context__") and e.__context__:
240
287
  raise ToolError(e.__context__)
241
288
  else:
242
289
  raise ToolError(e)
243
- return Tool.from_function(_rank_genes_groups, name="rank_genes_groups")
290
+
291
+ return Tool.from_function(
292
+ _rank_genes_groups, name="rank_genes_groups", enabled=True
293
+ )
244
294
 
245
295
  def _tool_rank_genes_groups_dotplot(self):
246
- def _rank_genes_groups_dotplot(request: RankGenesGroupsDotplotParams, adinfo: self.AdataInfo=self.AdataInfo()):
296
+ def _rank_genes_groups_dotplot(
297
+ request: RankGenesGroupsDotplotParam,
298
+ adinfo: self.AdataInfo = self.AdataInfo(),
299
+ ):
247
300
  """Plot ranking of genes(DEGs) using dotplot visualization. Defualt plot DEGs for rank_genes_groups tool"""
248
301
  try:
249
- if (res := forward_request("pl_rank_genes_groups_dotplot", request, adinfo)) is not None:
302
+ if (
303
+ res := forward_request(
304
+ "pl_rank_genes_groups_dotplot", request, adinfo
305
+ )
306
+ ) is not None:
250
307
  return res
251
308
  adata = get_ads().get_adata(adinfo=adinfo)
252
- fig_path = sc_like_plot(sc.pl.rank_genes_groups_dotplot, adata, request, adinfo)
309
+ fig_path = sc_like_plot(
310
+ sc.pl.rank_genes_groups_dotplot, adata, request, adinfo
311
+ )
253
312
  return {"figpath": fig_path}
254
313
  except ToolError as e:
255
314
  raise ToolError(e)
256
315
  except Exception as e:
257
- if hasattr(e, '__context__') and e.__context__:
316
+ if hasattr(e, "__context__") and e.__context__:
258
317
  raise ToolError(e.__context__)
259
318
  else:
260
319
  raise ToolError(e)
261
- return Tool.from_function(_rank_genes_groups_dotplot, name="rank_genes_groups_dotplot")
320
+
321
+ return Tool.from_function(
322
+ _rank_genes_groups_dotplot, name="rank_genes_groups_dotplot", enabled=True
323
+ )
262
324
 
263
325
  def _tool_clustermap(self):
264
- def _clustermap(request: ClusterMapParams, adinfo: self.AdataInfo=self.AdataInfo()):
326
+ def _clustermap(
327
+ request: ClusterMapParam, adinfo: self.AdataInfo = self.AdataInfo()
328
+ ):
265
329
  """Plot hierarchical clustering of cells and genes."""
266
330
  try:
267
- if (res := forward_request("pl_clustermap", request, adinfo)) is not None:
331
+ if (
332
+ res := forward_request("pl_clustermap", request, adinfo)
333
+ ) is not None:
268
334
  return res
269
335
  adata = get_ads().get_adata(adinfo=adinfo)
270
336
  fig_path = sc_like_plot(sc.pl.clustermap, adata, request, adinfo)
@@ -272,45 +338,63 @@ class ScanpyPlottingMCP(BaseMCP):
272
338
  except ToolError as e:
273
339
  raise ToolError(e)
274
340
  except Exception as e:
275
- if hasattr(e, '__context__') and e.__context__:
341
+ if hasattr(e, "__context__") and e.__context__:
276
342
  raise ToolError(e.__context__)
277
343
  else:
278
344
  raise ToolError(e)
279
- return Tool.from_function(_clustermap, name="clustermap")
345
+
346
+ return Tool.from_function(_clustermap, name="clustermap", enabled=True)
280
347
 
281
348
  def _tool_highly_variable_genes(self):
282
- def _highly_variable_genes(request: HighlyVariableGenesParams, adinfo: self.AdataInfo=self.AdataInfo()):
349
+ def _highly_variable_genes(
350
+ request: HighlyVariableGenesParam, adinfo: self.AdataInfo = self.AdataInfo()
351
+ ):
283
352
  """plot highly variable genes; Plot dispersions or normalized variance versus means for genes."""
284
353
  try:
285
- if (res := forward_request("pl_highly_variable_genes", request, adinfo)) is not None:
354
+ if (
355
+ res := forward_request("pl_highly_variable_genes", request, adinfo)
356
+ ) is not None:
286
357
  return res
287
358
  adata = get_ads().get_adata(adinfo=adinfo)
288
- fig_path = sc_like_plot(sc.pl.highly_variable_genes, adata, request, adinfo)
359
+ fig_path = sc_like_plot(
360
+ sc.pl.highly_variable_genes, adata, request, adinfo
361
+ )
289
362
  return {"figpath": fig_path}
290
363
  except ToolError as e:
291
364
  raise ToolError(e)
292
365
  except Exception as e:
293
- if hasattr(e, '__context__') and e.__context__:
366
+ if hasattr(e, "__context__") and e.__context__:
294
367
  raise ToolError(e.__context__)
295
368
  else:
296
369
  raise ToolError(e)
297
- return Tool.from_function(_highly_variable_genes, name="highly_variable_genes")
370
+
371
+ return Tool.from_function(
372
+ _highly_variable_genes, name="highly_variable_genes", enabled=True
373
+ )
298
374
 
299
375
  def _tool_pca_variance_ratio(self):
300
- def _pca_variance_ratio(request: PCAVarianceRatioParams, adinfo: self.AdataInfo=self.AdataInfo()):
376
+ def _pca_variance_ratio(
377
+ request: PCAVarianceRatioParam, adinfo: self.AdataInfo = self.AdataInfo()
378
+ ):
301
379
  """Plot the PCA variance ratio to visualize explained variance."""
302
380
  try:
303
- if (res := forward_request("pl_pca_variance_ratio", request, adinfo)) is not None:
381
+ if (
382
+ res := forward_request("pl_pca_variance_ratio", request, adinfo)
383
+ ) is not None:
304
384
  return res
305
385
  adata = get_ads().get_adata(adinfo=adinfo)
306
- fig_path = sc_like_plot(sc.pl.pca_variance_ratio, adata, request, adinfo)
386
+ fig_path = sc_like_plot(
387
+ sc.pl.pca_variance_ratio, adata, request, adinfo
388
+ )
307
389
  return {"figpath": fig_path}
308
390
  except ToolError as e:
309
391
  raise ToolError(e)
310
392
  except Exception as e:
311
- if hasattr(e, '__context__') and e.__context__:
393
+ if hasattr(e, "__context__") and e.__context__:
312
394
  raise ToolError(e.__context__)
313
395
  else:
314
396
  raise ToolError(e)
315
- return Tool.from_function(_pca_variance_ratio, name="pca_variance_ratio")
316
397
 
398
+ return Tool.from_function(
399
+ _pca_variance_ratio, name="pca_variance_ratio", enabled=True
400
+ )