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,99 +1,93 @@
1
+ from pydantic import Field, BaseModel
2
+ from typing import Optional, List, Dict, Any, Literal
1
3
 
2
- from pydantic import (
3
- Field,
4
- ValidationInfo,
5
- computed_field,
6
- field_validator,
7
- model_validator,BaseModel
8
- )
9
- from typing import Optional, Union, List, Dict, Any, Callable, Collection, Literal
10
4
 
11
-
12
-
13
- class MarkVarParams(BaseModel):
5
+ class MarkVarParam(BaseModel):
14
6
  """Determine or mark if each gene meets specific conditions and store results in adata.var as boolean values"""
15
-
7
+
16
8
  var_name: str = Field(
17
9
  default=None,
18
- description="Column name that will be added to adata.var, do not set if user does not ask"
10
+ description="Column name that will be added to adata.var, do not set if user does not ask",
19
11
  )
20
12
  pattern_type: Optional[Literal["startswith", "endswith", "contains"]] = Field(
21
13
  default=None,
22
- description="Pattern matching type (startswith/endswith/contains), it should be None when gene_class is not None"
23
- )
14
+ description="Pattern matching type (startswith/endswith/contains), it should be None when gene_class is not None",
15
+ )
24
16
  patterns: Optional[str] = Field(
25
17
  default=None,
26
- description="gene pattern to match, must be a string, it should be None when gene_class is not None"
18
+ description="gene pattern to match, must be a string, it should be None when gene_class is not None",
27
19
  )
28
-
20
+
29
21
  gene_class: Optional[Literal["mitochondrion", "ribosomal", "hemoglobin"]] = Field(
30
- default=None,
31
- description="Gene class type (Mitochondrion/Ribosomal/Hemoglobin)"
22
+ default=None, description="Gene class type (Mitochondrion/Ribosomal/Hemoglobin)"
32
23
  )
33
24
 
34
25
 
35
- class ListVarParams(BaseModel):
36
- """ListVarModel"""
26
+ class ListVarParam(BaseModel):
27
+ """ListVarModel"""
28
+
29
+ pass
30
+
31
+
32
+ class ListObsParam(BaseModel):
33
+ """ListObsModel"""
34
+
37
35
  pass
38
36
 
39
- class ListObsParams(BaseModel):
40
- """ListObsModel"""
41
- pass
42
37
 
43
- class VarNamesParams(BaseModel):
44
- """ListObsModel"""
45
- var_names: List[str] = Field(
46
- default=None,
47
- description="gene names."
48
- )
38
+ class VarNamesParam(BaseModel):
39
+ """ListObsModel"""
40
+
41
+ var_names: List[str] = Field(default=None, description="gene names.")
49
42
 
50
43
 
51
- class ConcatBaseParams(BaseModel):
44
+ class ConcatBaseParam(BaseModel):
52
45
  """Model for concatenating AnnData objects"""
53
-
54
- axis: Literal['obs', 0, 'var', 1] = Field(
55
- default='obs',
56
- description="Which axis to concatenate along. 'obs' or 0 for observations, 'var' or 1 for variables."
46
+
47
+ axis: Literal["obs", 0, "var", 1] = Field(
48
+ default="obs",
49
+ description="Which axis to concatenate along. 'obs' or 0 for observations, 'var' or 1 for variables.",
57
50
  )
58
- join: Literal['inner', 'outer'] = Field(
59
- default='inner',
60
- description="How to align values when concatenating. If 'outer', the union of the other axis is taken. If 'inner', the intersection."
51
+ join: Literal["inner", "outer"] = Field(
52
+ default="inner",
53
+ description="How to align values when concatenating. If 'outer', the union of the other axis is taken. If 'inner', the intersection.",
61
54
  )
62
- merge: Optional[Literal['same', 'unique', 'first', 'only']] = Field(
55
+ merge: Optional[Literal["same", "unique", "first", "only"]] = Field(
63
56
  default=None,
64
- description="How elements not aligned to the axis being concatenated along are selected."
57
+ description="How elements not aligned to the axis being concatenated along are selected.",
65
58
  )
66
- uns_merge: Optional[Literal['same', 'unique', 'first', 'only']] = Field(
59
+ uns_merge: Optional[Literal["same", "unique", "first", "only"]] = Field(
67
60
  default=None,
68
- description="How the elements of .uns are selected. Uses the same set of strategies as the merge argument, except applied recursively."
61
+ description="How the elements of .uns are selected. Uses the same set of strategies as the merge argument, except applied recursively.",
69
62
  )
70
63
  label: Optional[str] = Field(
71
64
  default=None,
72
- description="label different adata, Column in axis annotation (i.e. .obs or .var) to place batch information in. "
65
+ description="label different adata, Column in axis annotation (i.e. .obs or .var) to place batch information in. ",
73
66
  )
74
67
  keys: Optional[List[str]] = Field(
75
68
  default=None,
76
- description="Names for each object being added. These values are used for column values for label or appended to the index if index_unique is not None."
69
+ description="Names for each object being added. These values are used for column values for label or appended to the index if index_unique is not None.",
77
70
  )
78
71
  index_unique: Optional[str] = Field(
79
72
  default=None,
80
- description="Whether to make the index unique by using the keys. If provided, this is the delimiter between '{orig_idx}{index_unique}{key}'."
73
+ description="Whether to make the index unique by using the keys. If provided, this is the delimiter between '{orig_idx}{index_unique}{key}'.",
81
74
  )
82
75
  fill_value: Optional[Any] = Field(
83
76
  default=None,
84
- description="When join='outer', this is the value that will be used to fill the introduced indices."
77
+ description="When join='outer', this is the value that will be used to fill the introduced indices.",
85
78
  )
86
79
  pairwise: bool = Field(
87
80
  default=False,
88
- description="Whether pairwise elements along the concatenated dimension should be included."
81
+ description="Whether pairwise elements along the concatenated dimension should be included.",
89
82
  )
90
83
 
91
84
 
92
- class DPTIROOTParams(BaseModel):
85
+ class DPTIROOTParam(BaseModel):
93
86
  """Input schema for setting the root cell for diffusion pseudotime."""
87
+
94
88
  diffmap_key: str = Field(
95
89
  default="X_diffmap",
96
- description="Key for diffusion map coordinates stored in adata.obsm."
90
+ description="Key for diffusion map coordinates stored in adata.obsm.",
97
91
  )
98
92
  dimension: int = Field(
99
93
  description="Dimension index to use for finding the root cell."
@@ -103,36 +97,27 @@ class DPTIROOTParams(BaseModel):
103
97
  )
104
98
 
105
99
 
106
- class CelltypeMapCellTypeParams(BaseModel):
100
+ class CelltypeMapCellTypeParam(BaseModel):
107
101
  """Input schema for mapping cluster IDs to cell type names."""
108
- cluster_key: str = Field(
109
- description="Key in adata.obs containing cluster IDs."
110
- )
111
- added_key: str = Field(
112
- description="Key to add to adata.obs for cell type names."
113
- )
102
+
103
+ cluster_key: str = Field(description="Key in adata.obs containing cluster IDs.")
104
+ added_key: str = Field(description="Key to add to adata.obs for cell type names.")
114
105
  mapping: Dict[str, str] = Field(
115
106
  default=None,
116
- description="Mapping Dictionary from cluster IDs to cell type names."
107
+ description="Mapping Dictionary from cluster IDs to cell type names.",
117
108
  )
118
109
  new_names: Optional[List[str]] = Field(
119
- default=None,
120
- description="a list of new cell type names."
110
+ default=None, description="a list of new cell type names."
121
111
  )
122
-
123
112
 
124
113
 
125
- class AddLayerParams(BaseModel):
114
+ class AddLayerParam(BaseModel):
126
115
  """Input schema for adding a layer to AnnData object."""
127
- layer_name: str = Field(
128
- description="Name of the layer to add to adata.layers."
129
- )
130
-
131
116
 
132
- class QueryOpLogParams(BaseModel):
133
- """QueryOpLogModel"""
134
- n: int = Field(
135
- default=10,
136
- description="Number of operations to return."
137
- )
138
-
117
+ layer_name: str = Field(description="Name of the layer to add to adata.layers.")
118
+
119
+
120
+ class QueryOpLogParam(BaseModel):
121
+ """QueryOpLogModel"""
122
+
123
+ n: int = Field(default=10, description="Number of operations to return.")
@@ -1,13 +1 @@
1
1
  from __future__ import annotations
2
-
3
- from collections.abc import Iterable, AsyncIterator
4
- from typing import Any, Dict, List, Optional
5
- from contextlib import asynccontextmanager
6
- import asyncio
7
-
8
- from .base import BaseMCP,AdataState,BaseMCPManager
9
- from .io import ScanpyIOMCP, io_mcp
10
- from .util import ScanpyUtilMCP
11
- from .pl import ScanpyPlottingMCP
12
- from .pp import ScanpyPreprocessingMCP
13
- from .tl import ScanpyToolsMCP
@@ -6,16 +6,18 @@ from pydantic import Field
6
6
  auto_mcp = FastMCP("SmartMCP-select-Server")
7
7
 
8
8
 
9
- @auto_mcp.tool()
9
+ @auto_mcp.tool(tags={"auto"})
10
10
  def search_tool(
11
- task: str= Field(description="The tasks or questions that needs to be solved using available tools")
11
+ task: str = Field(
12
+ description="The tasks or questions that needs to be solved using available tools"
13
+ ),
12
14
  ):
13
- """search the tools that can be used to solve the user's tasks or questions"""
15
+ """search the tools and get tool parameters that can be used to solve the user's tasks or questions"""
14
16
  ctx = get_context()
15
17
  fastmcp = ctx.fastmcp
16
18
  all_tools = fastmcp._tool_manager._all_tools
17
19
  auto_tools = fastmcp._tool_manager._tools
18
- fastmcp._tool_manager._tools = all_tools
20
+ fastmcp._tool_manager._tools = all_tools
19
21
  query = f"<task>{task}</task>\n"
20
22
  for name in all_tools:
21
23
  tool = all_tools[name]
@@ -31,17 +33,17 @@ def search_tool(
31
33
  return tool_list
32
34
 
33
35
 
34
- @auto_mcp.tool()
36
+ @auto_mcp.tool(tags={"auto"})
35
37
  async def run_tool(
36
- name: str= Field(description="The name of the tool to run"),
37
- parameter: dict = Field(description="The parameters to pass to the tool")
38
+ name: str = Field(description="The name of the tool to run"),
39
+ parameter: dict = Field(description="The parameters to pass to the tool"),
38
40
  ):
39
41
  """run the tool with the given name and parameters. Only start call the tool when last tool is finished."""
40
42
  ctx = get_context()
41
43
  fastmcp = ctx.fastmcp
42
44
  all_tools = fastmcp._tool_manager._all_tools
43
45
  auto_tools = fastmcp._tool_manager._tools
44
- fastmcp._tool_manager._tools = all_tools
46
+ fastmcp._tool_manager._tools = all_tools
45
47
 
46
48
  try:
47
49
  result = await fastmcp._tool_manager.call_tool(name, parameter)
@@ -0,0 +1,3 @@
1
+ from abcoder.server import nb_mcp
2
+
3
+ __all__ = ["nb_mcp"]
@@ -0,0 +1,14 @@
1
+ from .io import ScanpyIOMCP, io_mcp
2
+ from .pl import ScanpyPlottingMCP
3
+ from .pp import ScanpyPreprocessingMCP
4
+ from .tl import ScanpyToolsMCP
5
+ from .util import ScanpyUtilMCP
6
+
7
+ __all__ = [
8
+ "io_mcp",
9
+ "ScanpyIOMCP",
10
+ "ScanpyPlottingMCP",
11
+ "ScanpyPreprocessingMCP",
12
+ "ScanpyToolsMCP",
13
+ "ScanpyUtilMCP",
14
+ ]
@@ -1,23 +1,25 @@
1
- import os
2
- import inspect
3
1
  from pathlib import Path
4
2
  import scanpy as sc
5
- from fastmcp import FastMCP, Context
6
3
  from fastmcp.tools.tool import Tool
7
4
  from fastmcp.exceptions import ToolError
8
- from ..schema import AdataInfo
9
- from ..schema.io import *
10
- from ..util import filter_args, forward_request, get_ads, generate_msg
11
- from .base import BaseMCP
5
+ from scmcp_shared.schema.preset import AdataInfo
6
+ from scmcp_shared.schema.preset.io import *
7
+ from scmcp_shared.util import filter_args, forward_request, get_ads
8
+ from scmcp_shared.mcp_base import BaseMCP
12
9
 
13
10
 
14
11
  class ScanpyIOMCP(BaseMCP):
15
- def __init__(self, include_tools: list = None, exclude_tools: list = None, AdataInfo = AdataInfo):
12
+ def __init__(
13
+ self,
14
+ include_tools: list = None,
15
+ exclude_tools: list = None,
16
+ AdataInfo=AdataInfo,
17
+ ):
16
18
  """Initialize ScanpyIOMCP with optional tool filtering."""
17
19
  super().__init__("SCMCP-IO-Server", include_tools, exclude_tools, AdataInfo)
18
20
 
19
21
  def _tool_read(self):
20
- def _read(request: ReadParams, adinfo: self.AdataInfo=self.AdataInfo()):
22
+ def _read(request: ReadParam, adinfo: self.AdataInfo = self.AdataInfo()):
21
23
  """
22
24
  Read data from 10X directory or various file formats (h5ad, 10x, text files, etc.).
23
25
  """
@@ -34,7 +36,7 @@ class ScanpyIOMCP(BaseMCP):
34
36
  elif file.is_file():
35
37
  func_kwargs = filter_args(request, sc.read)
36
38
  adata = sc.read(**func_kwargs)
37
- if not kwargs.get("transpose", True):
39
+ if kwargs.get("transpose", False):
38
40
  adata = adata.T
39
41
  else:
40
42
  raise FileNotFoundError(f"{kwargs['filename']} does not exist")
@@ -44,7 +46,7 @@ class ScanpyIOMCP(BaseMCP):
44
46
  ads.active_id = adinfo.sampleid
45
47
  else:
46
48
  ads.active_id = f"adata{len(ads.adata_dic[adinfo.adtype])}"
47
-
49
+
48
50
  adata.layers["counts"] = adata.X
49
51
  adata.var_names_make_unique()
50
52
  adata.obs_names_make_unique()
@@ -52,30 +54,31 @@ class ScanpyIOMCP(BaseMCP):
52
54
  ads.set_adata(adata, adinfo=adinfo)
53
55
  return [
54
56
  {
55
- "sampleid": adinfo.sampleid or ads.active_id,
56
- "adtype": adinfo.adtype,
57
+ "sampleid": adinfo.sampleid or ads.active_id,
58
+ "adtype": adinfo.adtype,
57
59
  "adata": adata,
58
60
  "adata.obs_names[:10]": adata.obs_names[:10],
59
61
  "adata.var_names[:10]": adata.var_names[:10],
60
- "notice": "check obs_names and var_names. transpose the data if needed"
62
+ "notice": "check obs_names and var_names. transpose the data if needed",
61
63
  }
62
- ]
64
+ ]
63
65
  except ToolError as e:
64
66
  raise ToolError(e)
65
67
  except Exception as e:
66
- if hasattr(e, '__context__') and e.__context__:
68
+ if hasattr(e, "__context__") and e.__context__:
67
69
  raise ToolError(e.__context__)
68
70
  else:
69
71
  raise ToolError(e)
70
- return Tool.from_function(_read, name="read")
72
+
73
+ return Tool.from_function(_read, name="read", enabled=True)
71
74
 
72
75
  def _tool_write(self):
73
- def _write(request: WriteParams, adinfo: self.AdataInfo=self.AdataInfo()):
76
+ def _write(request: WriteParam, adinfo: self.AdataInfo = self.AdataInfo()):
74
77
  """save adata into a file."""
75
78
  try:
76
79
  res = forward_request("io_write", request, adinfo)
77
80
  if res is not None:
78
- return res
81
+ return res
79
82
  ads = get_ads()
80
83
  adata = ads.get_adata(adinfo=adinfo)
81
84
  kwargs = request.model_dump()
@@ -84,12 +87,13 @@ class ScanpyIOMCP(BaseMCP):
84
87
  except ToolError as e:
85
88
  raise ToolError(e)
86
89
  except Exception as e:
87
- if hasattr(e, '__context__') and e.__context__:
90
+ if hasattr(e, "__context__") and e.__context__:
88
91
  raise ToolError(e.__context__)
89
92
  else:
90
93
  raise ToolError(e)
91
- return Tool.from_function(_write, name="write")
94
+
95
+ return Tool.from_function(_write, name="write", enabled=True)
92
96
 
93
97
 
94
98
  # Create an instance of the class
95
- io_mcp = ScanpyIOMCP().mcp
99
+ io_mcp = ScanpyIOMCP().mcp