scmcp-shared 0.3.7__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 (172) hide show
  1. scmcp_shared/__init__.py +1 -3
  2. scmcp_shared/agent.py +80 -0
  3. scmcp_shared/backend.py +44 -0
  4. scmcp_shared/cli.py +76 -37
  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/tool.py +11 -0
  19. scmcp_shared/schema/util.py +57 -72
  20. scmcp_shared/server/__init__.py +0 -12
  21. scmcp_shared/server/auto.py +54 -0
  22. scmcp_shared/server/code.py +3 -0
  23. scmcp_shared/server/preset/__init__.py +14 -0
  24. scmcp_shared/server/{io.py → preset/io.py} +26 -22
  25. scmcp_shared/server/{pl.py → preset/pl.py} +162 -78
  26. scmcp_shared/server/{pp.py → preset/pp.py} +127 -65
  27. scmcp_shared/server/{tl.py → preset/tl.py} +142 -79
  28. scmcp_shared/server/{util.py → preset/util.py} +123 -66
  29. scmcp_shared/util.py +109 -38
  30. scmcp_shared/vector_db/decoupler.lance/_transactions/0-9499b1b5-85d4-44c2-8f05-1bcce87fe4ef.txn +3 -0
  31. scmcp_shared/vector_db/decoupler.lance/_transactions/1-1632e7a3-4427-4077-8d03-57437144443d.txn +0 -0
  32. scmcp_shared/vector_db/decoupler.lance/_transactions/10-dcf66479-eafb-4193-9358-198154aea1c1.txn +0 -0
  33. scmcp_shared/vector_db/decoupler.lance/_transactions/11-2c6ddc17-49f5-47b5-8764-753297cf9e1b.txn +0 -0
  34. scmcp_shared/vector_db/decoupler.lance/_transactions/12-f079d0a2-9c1c-4e7a-abf6-3e3c4cddac11.txn +0 -0
  35. scmcp_shared/vector_db/decoupler.lance/_transactions/13-5bda9382-a06e-493d-85cb-e066172778ce.txn +0 -0
  36. scmcp_shared/vector_db/decoupler.lance/_transactions/14-6f9c669f-25e2-4096-b7ea-9b421a37e110.txn +0 -0
  37. scmcp_shared/vector_db/decoupler.lance/_transactions/15-2068cca9-31e8-45a3-86d1-bcb8924c72b9.txn +0 -0
  38. scmcp_shared/vector_db/decoupler.lance/_transactions/16-72356bb2-5c98-424e-97aa-a92fa3453da6.txn +0 -0
  39. scmcp_shared/vector_db/decoupler.lance/_transactions/17-9baa67ce-f6d3-478c-9511-20d01988d4d5.txn +0 -0
  40. scmcp_shared/vector_db/decoupler.lance/_transactions/18-b9f2e28e-c4c5-4ce7-bf58-402d53a39558.txn +0 -0
  41. scmcp_shared/vector_db/decoupler.lance/_transactions/19-d199d9f9-7990-4ec0-adde-e98c1c927202.txn +0 -0
  42. scmcp_shared/vector_db/decoupler.lance/_transactions/2-3827747c-095e-41cb-af69-3814bab3a588.txn +0 -0
  43. scmcp_shared/vector_db/decoupler.lance/_transactions/20-31c197a3-7a23-472f-a7e3-056c0ff11e3a.txn +0 -0
  44. scmcp_shared/vector_db/decoupler.lance/_transactions/21-066e3024-36f8-4557-83ae-d2f338ec045c.txn +0 -0
  45. scmcp_shared/vector_db/decoupler.lance/_transactions/22-1d1ccbe5-7c4c-4882-986a-c61ec2f7925e.txn +0 -0
  46. scmcp_shared/vector_db/decoupler.lance/_transactions/23-b2c41628-b2d6-49f1-81b5-3cd9100894b4.txn +0 -0
  47. scmcp_shared/vector_db/decoupler.lance/_transactions/24-e43e2e8d-9dd8-479f-b63c-d147e737c49f.txn +0 -0
  48. scmcp_shared/vector_db/decoupler.lance/_transactions/25-188708e9-5ee1-4b5c-8e13-45dec8efd60d.txn +0 -0
  49. scmcp_shared/vector_db/decoupler.lance/_transactions/26-4f4b6316-5680-4b31-8dd6-215cce66d7b5.txn +0 -0
  50. scmcp_shared/vector_db/decoupler.lance/_transactions/27-c1855f86-abab-44ef-9e61-1312dffc9b06.txn +0 -0
  51. scmcp_shared/vector_db/decoupler.lance/_transactions/28-650d2be0-e977-4177-b457-b733eea8b6ea.txn +0 -0
  52. scmcp_shared/vector_db/decoupler.lance/_transactions/29-e47751d8-0e44-46da-82bd-4836b00a8431.txn +0 -0
  53. scmcp_shared/vector_db/decoupler.lance/_transactions/3-518fc9b8-67de-48f7-94c8-f2398c63dbc5.txn +0 -0
  54. scmcp_shared/vector_db/decoupler.lance/_transactions/30-0db3ea0f-deca-4b5b-9d70-9fb5f741f90c.txn +0 -0
  55. scmcp_shared/vector_db/decoupler.lance/_transactions/31-ef76f0bb-bcfa-4031-b3ad-94b51ee818a9.txn +0 -0
  56. scmcp_shared/vector_db/decoupler.lance/_transactions/32-a763e0f1-5c8d-460f-a455-0c6f6c4f1450.txn +0 -0
  57. scmcp_shared/vector_db/decoupler.lance/_transactions/33-30bce2aa-8e6f-4f42-a323-c420133aa20f.txn +0 -0
  58. scmcp_shared/vector_db/decoupler.lance/_transactions/34-f91ec2f9-d34b-4fcf-8bc7-564c28e50538.txn +0 -0
  59. scmcp_shared/vector_db/decoupler.lance/_transactions/35-7f36a75c-96a7-4868-a4db-5d5f78ecf850.txn +0 -0
  60. scmcp_shared/vector_db/decoupler.lance/_transactions/36-f2df7f99-a37c-458a-958d-7eb5e81eee18.txn +0 -0
  61. scmcp_shared/vector_db/decoupler.lance/_transactions/37-e0af7415-955b-4167-8705-fa9ddb643e9a.txn +0 -0
  62. scmcp_shared/vector_db/decoupler.lance/_transactions/38-6c24a9f0-ce71-4dda-8193-479aa23c5456.txn +0 -0
  63. scmcp_shared/vector_db/decoupler.lance/_transactions/39-72b8a20c-3112-4cf1-8b05-b74a2c02c3f2.txn +0 -0
  64. scmcp_shared/vector_db/decoupler.lance/_transactions/4-42904942-5a79-4f28-90ce-35a4ae8c40d1.txn +0 -0
  65. scmcp_shared/vector_db/decoupler.lance/_transactions/40-95ac7526-6a2e-4914-9654-288c41bff370.txn +0 -0
  66. scmcp_shared/vector_db/decoupler.lance/_transactions/41-13430464-5e62-4aa8-9709-513693a75095.txn +0 -0
  67. scmcp_shared/vector_db/decoupler.lance/_transactions/42-cbb1ad83-a906-4540-bc37-4db158eac618.txn +0 -0
  68. scmcp_shared/vector_db/decoupler.lance/_transactions/43-3c246401-d742-49a9-b24d-cfc457685461.txn +0 -0
  69. scmcp_shared/vector_db/decoupler.lance/_transactions/44-11315c14-ecf4-4e3d-8690-46d57cb3e8c0.txn +0 -0
  70. scmcp_shared/vector_db/decoupler.lance/_transactions/45-7bbf4bc6-96d4-425a-afa2-34aec7121c85.txn +0 -0
  71. scmcp_shared/vector_db/decoupler.lance/_transactions/5-82dda0b4-7838-4f04-90f3-4b1e932c6891.txn +0 -0
  72. scmcp_shared/vector_db/decoupler.lance/_transactions/6-c78352d8-16ba-4814-bd7f-74b8c0c5efe7.txn +0 -0
  73. scmcp_shared/vector_db/decoupler.lance/_transactions/7-bb882b35-63f3-4c52-870f-6a64e3ac7f3c.txn +0 -0
  74. scmcp_shared/vector_db/decoupler.lance/_transactions/8-fc84ad1b-1b59-4822-8fc7-70f4eb18f6d9.txn +0 -0
  75. scmcp_shared/vector_db/decoupler.lance/_transactions/9-3404dcf1-bb17-40e6-9e5d-d9942dff90b2.txn +0 -0
  76. scmcp_shared/vector_db/decoupler.lance/_versions/1.manifest +0 -0
  77. scmcp_shared/vector_db/decoupler.lance/_versions/10.manifest +0 -0
  78. scmcp_shared/vector_db/decoupler.lance/_versions/11.manifest +0 -0
  79. scmcp_shared/vector_db/decoupler.lance/_versions/12.manifest +0 -0
  80. scmcp_shared/vector_db/decoupler.lance/_versions/13.manifest +0 -0
  81. scmcp_shared/vector_db/decoupler.lance/_versions/14.manifest +0 -0
  82. scmcp_shared/vector_db/decoupler.lance/_versions/15.manifest +0 -0
  83. scmcp_shared/vector_db/decoupler.lance/_versions/16.manifest +0 -0
  84. scmcp_shared/vector_db/decoupler.lance/_versions/17.manifest +0 -0
  85. scmcp_shared/vector_db/decoupler.lance/_versions/18.manifest +0 -0
  86. scmcp_shared/vector_db/decoupler.lance/_versions/19.manifest +0 -0
  87. scmcp_shared/vector_db/decoupler.lance/_versions/2.manifest +0 -0
  88. scmcp_shared/vector_db/decoupler.lance/_versions/20.manifest +0 -0
  89. scmcp_shared/vector_db/decoupler.lance/_versions/21.manifest +0 -0
  90. scmcp_shared/vector_db/decoupler.lance/_versions/22.manifest +0 -0
  91. scmcp_shared/vector_db/decoupler.lance/_versions/23.manifest +0 -0
  92. scmcp_shared/vector_db/decoupler.lance/_versions/24.manifest +0 -0
  93. scmcp_shared/vector_db/decoupler.lance/_versions/25.manifest +0 -0
  94. scmcp_shared/vector_db/decoupler.lance/_versions/26.manifest +0 -0
  95. scmcp_shared/vector_db/decoupler.lance/_versions/27.manifest +0 -0
  96. scmcp_shared/vector_db/decoupler.lance/_versions/28.manifest +0 -0
  97. scmcp_shared/vector_db/decoupler.lance/_versions/29.manifest +0 -0
  98. scmcp_shared/vector_db/decoupler.lance/_versions/3.manifest +0 -0
  99. scmcp_shared/vector_db/decoupler.lance/_versions/30.manifest +0 -0
  100. scmcp_shared/vector_db/decoupler.lance/_versions/31.manifest +0 -0
  101. scmcp_shared/vector_db/decoupler.lance/_versions/32.manifest +0 -0
  102. scmcp_shared/vector_db/decoupler.lance/_versions/33.manifest +0 -0
  103. scmcp_shared/vector_db/decoupler.lance/_versions/34.manifest +0 -0
  104. scmcp_shared/vector_db/decoupler.lance/_versions/35.manifest +0 -0
  105. scmcp_shared/vector_db/decoupler.lance/_versions/36.manifest +0 -0
  106. scmcp_shared/vector_db/decoupler.lance/_versions/37.manifest +0 -0
  107. scmcp_shared/vector_db/decoupler.lance/_versions/38.manifest +0 -0
  108. scmcp_shared/vector_db/decoupler.lance/_versions/39.manifest +0 -0
  109. scmcp_shared/vector_db/decoupler.lance/_versions/4.manifest +0 -0
  110. scmcp_shared/vector_db/decoupler.lance/_versions/40.manifest +0 -0
  111. scmcp_shared/vector_db/decoupler.lance/_versions/41.manifest +0 -0
  112. scmcp_shared/vector_db/decoupler.lance/_versions/42.manifest +0 -0
  113. scmcp_shared/vector_db/decoupler.lance/_versions/43.manifest +0 -0
  114. scmcp_shared/vector_db/decoupler.lance/_versions/44.manifest +0 -0
  115. scmcp_shared/vector_db/decoupler.lance/_versions/45.manifest +0 -0
  116. scmcp_shared/vector_db/decoupler.lance/_versions/46.manifest +0 -0
  117. scmcp_shared/vector_db/decoupler.lance/_versions/5.manifest +0 -0
  118. scmcp_shared/vector_db/decoupler.lance/_versions/6.manifest +0 -0
  119. scmcp_shared/vector_db/decoupler.lance/_versions/7.manifest +0 -0
  120. scmcp_shared/vector_db/decoupler.lance/_versions/8.manifest +0 -0
  121. scmcp_shared/vector_db/decoupler.lance/_versions/9.manifest +0 -0
  122. scmcp_shared/vector_db/decoupler.lance/data/0cc94dc3-2ca3-403c-a9df-59753f24b3f2.lance +0 -0
  123. scmcp_shared/vector_db/decoupler.lance/data/254a1a71-cdd2-4cca-b7ec-a50540fed62c.lance +0 -0
  124. scmcp_shared/vector_db/decoupler.lance/data/2574d216-5f05-4794-9e1c-986fafde6ab4.lance +0 -0
  125. scmcp_shared/vector_db/decoupler.lance/data/26c7bbe7-5f97-4453-b065-123b764448b3.lance +0 -0
  126. scmcp_shared/vector_db/decoupler.lance/data/286595a6-88f6-4b05-861e-e4f607a6fcdb.lance +0 -0
  127. scmcp_shared/vector_db/decoupler.lance/data/33219b1a-7575-46ef-bb64-2bdbde1e692b.lance +0 -0
  128. scmcp_shared/vector_db/decoupler.lance/data/344ad7dd-98bb-41de-b347-2f17bf5735cb.lance +0 -0
  129. scmcp_shared/vector_db/decoupler.lance/data/395b1ecb-68fe-4dd3-a770-4b3ed393ae0c.lance +0 -0
  130. scmcp_shared/vector_db/decoupler.lance/data/3db97f4c-9c35-44b7-9042-82b4006c5a22.lance +0 -0
  131. scmcp_shared/vector_db/decoupler.lance/data/4540246e-b0bb-4f4d-8f98-60a64f1c42ed.lance +0 -0
  132. scmcp_shared/vector_db/decoupler.lance/data/4643dbc0-9e45-4b63-81e1-e06cf9bddcec.lance +0 -0
  133. scmcp_shared/vector_db/decoupler.lance/data/4f28eb52-d409-43f2-ae17-d1826f209006.lance +0 -0
  134. scmcp_shared/vector_db/decoupler.lance/data/4fda4a22-35f0-4897-b4c5-6cedefba66e6.lance +0 -0
  135. scmcp_shared/vector_db/decoupler.lance/data/51ee77b6-ab24-44c0-916e-b81ff3912731.lance +0 -0
  136. scmcp_shared/vector_db/decoupler.lance/data/539d15c9-e88b-400c-9ab7-08f5e8dca10d.lance +0 -0
  137. scmcp_shared/vector_db/decoupler.lance/data/54007132-91f5-4909-8678-c471ef4d100f.lance +0 -0
  138. scmcp_shared/vector_db/decoupler.lance/data/546d88ec-0d5c-42bb-bccc-3271f3f183a4.lance +0 -0
  139. scmcp_shared/vector_db/decoupler.lance/data/6912ad8a-343c-4ca1-b1b7-4300125e688e.lance +0 -0
  140. scmcp_shared/vector_db/decoupler.lance/data/6b72e4f7-3051-40a4-a492-6d9eff1c647d.lance +0 -0
  141. scmcp_shared/vector_db/decoupler.lance/data/6d7ee320-ae1c-4e49-8ce5-c85971b11ce6.lance +0 -0
  142. scmcp_shared/vector_db/decoupler.lance/data/6ea47b70-69d4-43e9-b2c6-442fe50e4dd1.lance +0 -0
  143. scmcp_shared/vector_db/decoupler.lance/data/72adb5ed-bf11-4d06-b146-0272d333db08.lance +0 -0
  144. scmcp_shared/vector_db/decoupler.lance/data/745907df-e261-4f4b-a757-2c01c058bf27.lance +0 -0
  145. scmcp_shared/vector_db/decoupler.lance/data/78988307-4c66-4ad7-b295-7463ecd53609.lance +0 -0
  146. scmcp_shared/vector_db/decoupler.lance/data/798ce305-6d60-4f28-b82a-e1f647907abf.lance +0 -0
  147. scmcp_shared/vector_db/decoupler.lance/data/7c159cce-2741-442b-9c63-f44bf2996718.lance +0 -0
  148. scmcp_shared/vector_db/decoupler.lance/data/7cd7a818-e68b-4fa8-bad3-23b60c386670.lance +0 -0
  149. scmcp_shared/vector_db/decoupler.lance/data/7ec553ed-0c7a-4bac-99b2-2ad976b40466.lance +0 -0
  150. scmcp_shared/vector_db/decoupler.lance/data/83efdc85-d990-4762-b69a-fb1c3938f60f.lance +0 -0
  151. scmcp_shared/vector_db/decoupler.lance/data/8c1613b3-8d69-49c5-bfd0-a021bb516faf.lance +0 -0
  152. scmcp_shared/vector_db/decoupler.lance/data/95cd1b22-1f93-4133-9841-de21549ad8c5.lance +0 -0
  153. scmcp_shared/vector_db/decoupler.lance/data/9a2ea5d4-087e-4d3a-b64b-6c568b8a0010.lance +0 -0
  154. scmcp_shared/vector_db/decoupler.lance/data/b1c47dc6-450a-4dca-b465-badb6a3619c2.lance +0 -0
  155. scmcp_shared/vector_db/decoupler.lance/data/b21d183a-c51d-463b-932e-9beb2e0da9aa.lance +0 -0
  156. scmcp_shared/vector_db/decoupler.lance/data/b2598625-8683-4c33-be40-6f1a7555dc2c.lance +0 -0
  157. scmcp_shared/vector_db/decoupler.lance/data/b7297b39-1fc5-4886-be21-708b369bef59.lance +0 -0
  158. scmcp_shared/vector_db/decoupler.lance/data/b7d90085-5bd6-48f9-8a73-17eb7cf556fa.lance +0 -0
  159. scmcp_shared/vector_db/decoupler.lance/data/b988ceee-57fc-423b-8e67-5729086c6946.lance +0 -0
  160. scmcp_shared/vector_db/decoupler.lance/data/bfd68ea6-ddf4-44bb-aa87-2669f0462f7d.lance +0 -0
  161. scmcp_shared/vector_db/decoupler.lance/data/cb8ac58e-0e59-4391-95ab-6195e71b9625.lance +0 -0
  162. scmcp_shared/vector_db/decoupler.lance/data/d0f10434-afb5-49c5-9e77-d39a4f8cca94.lance +0 -0
  163. scmcp_shared/vector_db/decoupler.lance/data/d3f89fec-5795-4e11-8c15-bc2206a7fae2.lance +0 -0
  164. scmcp_shared/vector_db/decoupler.lance/data/e063c8a4-5ef1-4933-a049-b41049d9be5f.lance +0 -0
  165. scmcp_shared/vector_db/decoupler.lance/data/e2348b24-f290-4fe2-a6c8-e98009ae4c1b.lance +0 -0
  166. scmcp_shared/vector_db/decoupler.lance/data/e5d3f893-6763-40dc-9d02-04e2f56a4883.lance +0 -0
  167. {scmcp_shared-0.3.7.dist-info → scmcp_shared-0.5.0.dist-info}/METADATA +3 -1
  168. scmcp_shared-0.5.0.dist-info/RECORD +171 -0
  169. scmcp_shared/server/base.py +0 -148
  170. scmcp_shared-0.3.7.dist-info/RECORD +0 -21
  171. {scmcp_shared-0.3.7.dist-info → scmcp_shared-0.5.0.dist-info}/WHEEL +0 -0
  172. {scmcp_shared-0.3.7.dist-info → scmcp_shared-0.5.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,11 @@
1
+ from pydantic import BaseModel, Field
2
+ from typing import List
3
+
4
+
5
+ class Tool(BaseModel):
6
+ name: str = Field(description="The name of the tool")
7
+ description: str = Field(description="The description of the tool")
8
+
9
+
10
+ class ToolList(BaseModel):
11
+ tools: List[Tool]
@@ -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
@@ -0,0 +1,54 @@
1
+ from fastmcp import FastMCP
2
+ from fastmcp.server.dependencies import get_context
3
+ from ..agent import select_tool
4
+ from pydantic import Field
5
+
6
+ auto_mcp = FastMCP("SmartMCP-select-Server")
7
+
8
+
9
+ @auto_mcp.tool(tags={"auto"})
10
+ def search_tool(
11
+ task: str = Field(
12
+ description="The tasks or questions that needs to be solved using available tools"
13
+ ),
14
+ ):
15
+ """search the tools and get tool parameters that can be used to solve the user's tasks or questions"""
16
+ ctx = get_context()
17
+ fastmcp = ctx.fastmcp
18
+ all_tools = fastmcp._tool_manager._all_tools
19
+ auto_tools = fastmcp._tool_manager._tools
20
+ fastmcp._tool_manager._tools = all_tools
21
+ query = f"<task>{task}</task>\n"
22
+ for name in all_tools:
23
+ tool = all_tools[name]
24
+ query += f"<Tool>\n<name>{name}</name>\n<description>{tool.description}</description>\n</Tool>\n"
25
+
26
+ results = select_tool(query)
27
+ tool_list = []
28
+ for tool in results:
29
+ tool = tool.model_dump()
30
+ tool["parameters"] = all_tools[tool["name"]].parameters
31
+ tool_list.append(tool)
32
+ fastmcp._tool_manager._tools = auto_tools
33
+ return tool_list
34
+
35
+
36
+ @auto_mcp.tool(tags={"auto"})
37
+ async def run_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"),
40
+ ):
41
+ """run the tool with the given name and parameters. Only start call the tool when last tool is finished."""
42
+ ctx = get_context()
43
+ fastmcp = ctx.fastmcp
44
+ all_tools = fastmcp._tool_manager._all_tools
45
+ auto_tools = fastmcp._tool_manager._tools
46
+ fastmcp._tool_manager._tools = all_tools
47
+
48
+ try:
49
+ result = await fastmcp._tool_manager.call_tool(name, parameter)
50
+ except Exception as e:
51
+ fastmcp._tool_manager._tools = auto_tools
52
+ result = {"error": str(e)}
53
+
54
+ return result
@@ -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