@wentorai/research-plugins 1.3.1 → 1.4.0

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 (437) hide show
  1. package/README.md +32 -56
  2. package/curated/analysis/README.md +1 -13
  3. package/curated/domains/README.md +1 -5
  4. package/curated/literature/README.md +1 -10
  5. package/curated/research/README.md +1 -18
  6. package/curated/tools/README.md +1 -12
  7. package/curated/writing/README.md +1 -5
  8. package/index.ts +88 -5
  9. package/openclaw.plugin.json +3 -12
  10. package/package.json +3 -5
  11. package/skills/analysis/dataviz/SKILL.md +1 -1
  12. package/skills/analysis/dataviz/color-accessibility-guide/SKILL.md +1 -1
  13. package/skills/analysis/dataviz/geospatial-viz-guide/SKILL.md +1 -1
  14. package/skills/analysis/dataviz/interactive-viz-guide/SKILL.md +1 -1
  15. package/skills/analysis/dataviz/network-visualization-guide/SKILL.md +1 -1
  16. package/skills/analysis/dataviz/publication-figures-guide/SKILL.md +1 -1
  17. package/skills/analysis/econometrics/SKILL.md +1 -1
  18. package/skills/analysis/econometrics/causal-inference-guide/SKILL.md +1 -1
  19. package/skills/analysis/econometrics/iv-regression-guide/SKILL.md +1 -1
  20. package/skills/analysis/econometrics/mostly-harmless-guide/SKILL.md +3 -10
  21. package/skills/analysis/econometrics/panel-data-analyst/SKILL.md +1 -1
  22. package/skills/analysis/econometrics/panel-data-guide/SKILL.md +1 -1
  23. package/skills/analysis/econometrics/stata-accounting-guide/SKILL.md +1 -1
  24. package/skills/analysis/econometrics/stata-analyst-guide/SKILL.md +1 -1
  25. package/skills/analysis/econometrics/time-series-guide/SKILL.md +1 -1
  26. package/skills/analysis/statistics/SKILL.md +2 -2
  27. package/skills/analysis/statistics/bayesian-statistics-guide/SKILL.md +1 -1
  28. package/skills/analysis/statistics/meta-analysis-guide/SKILL.md +2 -2
  29. package/skills/analysis/statistics/nonparametric-tests-guide/SKILL.md +1 -1
  30. package/skills/analysis/statistics/power-analysis-guide/SKILL.md +1 -1
  31. package/skills/analysis/statistics/sem-guide/SKILL.md +1 -1
  32. package/skills/analysis/statistics/survival-analysis-guide/SKILL.md +1 -1
  33. package/skills/analysis/wrangling/SKILL.md +1 -1
  34. package/skills/analysis/wrangling/data-cleaning-pipeline/SKILL.md +1 -1
  35. package/skills/analysis/wrangling/missing-data-handling/SKILL.md +1 -1
  36. package/skills/analysis/wrangling/questionnaire-design-guide/SKILL.md +1 -1
  37. package/skills/analysis/wrangling/stata-data-cleaning/SKILL.md +1 -1
  38. package/skills/analysis/wrangling/survey-data-processing/SKILL.md +1 -1
  39. package/skills/analysis/wrangling/text-mining-guide/SKILL.md +1 -1
  40. package/skills/domains/ai-ml/SKILL.md +3 -2
  41. package/skills/domains/ai-ml/computer-vision-guide/SKILL.md +1 -1
  42. package/skills/domains/ai-ml/generative-ai-guide/SKILL.md +1 -0
  43. package/skills/domains/ai-ml/huggingface-api/SKILL.md +251 -0
  44. package/skills/domains/ai-ml/llm-evaluation-guide/SKILL.md +1 -1
  45. package/skills/domains/ai-ml/prompt-engineering-research/SKILL.md +1 -1
  46. package/skills/domains/ai-ml/reinforcement-learning-guide/SKILL.md +1 -1
  47. package/skills/domains/ai-ml/transformer-architecture-guide/SKILL.md +1 -1
  48. package/skills/domains/biomedical/SKILL.md +9 -2
  49. package/skills/domains/biomedical/alphafold-api/SKILL.md +227 -0
  50. package/skills/domains/biomedical/biothings-api/SKILL.md +296 -0
  51. package/skills/domains/biomedical/clinical-research-guide/SKILL.md +1 -1
  52. package/skills/domains/biomedical/clinicaltrials-api-v2/SKILL.md +216 -0
  53. package/skills/domains/biomedical/enrichr-api/SKILL.md +264 -0
  54. package/skills/domains/biomedical/ensembl-rest-api/SKILL.md +204 -0
  55. package/skills/domains/biomedical/epidemiology-guide/SKILL.md +1 -1
  56. package/skills/domains/biomedical/genomics-analysis-guide/SKILL.md +1 -1
  57. package/skills/domains/biomedical/medical-data-api/SKILL.md +197 -0
  58. package/skills/domains/biomedical/medical-imaging-guide/SKILL.md +1 -1
  59. package/skills/domains/biomedical/pdb-structure-api/SKILL.md +219 -0
  60. package/skills/domains/business/SKILL.md +2 -3
  61. package/skills/domains/business/innovation-management-guide/SKILL.md +1 -1
  62. package/skills/domains/business/market-analysis-guide/SKILL.md +1 -1
  63. package/skills/domains/business/operations-research-guide/SKILL.md +1 -1
  64. package/skills/domains/business/strategic-management-guide/SKILL.md +1 -1
  65. package/skills/domains/chemistry/SKILL.md +3 -2
  66. package/skills/domains/chemistry/catalysis-hub-api/SKILL.md +171 -0
  67. package/skills/domains/chemistry/molecular-dynamics-guide/SKILL.md +1 -1
  68. package/skills/domains/chemistry/retrosynthesis-guide/SKILL.md +1 -1
  69. package/skills/domains/chemistry/spectroscopy-analysis-guide/SKILL.md +1 -1
  70. package/skills/domains/cs/SKILL.md +1 -1
  71. package/skills/domains/cs/algorithms-complexity-guide/SKILL.md +1 -1
  72. package/skills/domains/cs/distributed-systems-guide/SKILL.md +1 -1
  73. package/skills/domains/cs/formal-verification-guide/SKILL.md +1 -1
  74. package/skills/domains/cs/software-engineering-research/SKILL.md +1 -1
  75. package/skills/domains/ecology/SKILL.md +1 -1
  76. package/skills/domains/ecology/biodiversity-data-guide/SKILL.md +1 -1
  77. package/skills/domains/ecology/conservation-biology-guide/SKILL.md +1 -1
  78. package/skills/domains/ecology/species-distribution-guide/SKILL.md +1 -1
  79. package/skills/domains/economics/SKILL.md +1 -1
  80. package/skills/domains/economics/behavioral-economics-guide/SKILL.md +1 -1
  81. package/skills/domains/economics/development-economics-guide/SKILL.md +1 -1
  82. package/skills/domains/education/SKILL.md +2 -3
  83. package/skills/domains/education/assessment-design-guide/SKILL.md +1 -1
  84. package/skills/domains/education/curriculum-design-guide/SKILL.md +1 -1
  85. package/skills/domains/education/educational-research-methods/SKILL.md +1 -1
  86. package/skills/domains/education/learning-science-guide/SKILL.md +1 -1
  87. package/skills/domains/education/mooc-analytics-guide/SKILL.md +1 -1
  88. package/skills/domains/finance/SKILL.md +1 -1
  89. package/skills/domains/finance/financial-data-analysis/SKILL.md +1 -1
  90. package/skills/domains/finance/portfolio-optimization-guide/SKILL.md +1 -1
  91. package/skills/domains/finance/quantitative-finance-guide/SKILL.md +1 -1
  92. package/skills/domains/finance/risk-modeling-guide/SKILL.md +1 -1
  93. package/skills/domains/geoscience/SKILL.md +1 -1
  94. package/skills/domains/geoscience/climate-modeling-guide/SKILL.md +1 -1
  95. package/skills/domains/geoscience/climate-science-guide/SKILL.md +1 -1
  96. package/skills/domains/geoscience/gis-remote-sensing-guide/SKILL.md +1 -1
  97. package/skills/domains/geoscience/satellite-remote-sensing/SKILL.md +1 -1
  98. package/skills/domains/geoscience/seismology-data-guide/SKILL.md +1 -1
  99. package/skills/domains/humanities/SKILL.md +1 -1
  100. package/skills/domains/humanities/digital-humanities-guide/SKILL.md +1 -1
  101. package/skills/domains/humanities/ethical-philosophy-guide/SKILL.md +1 -1
  102. package/skills/domains/humanities/philosophy-research-guide/SKILL.md +1 -1
  103. package/skills/domains/law/SKILL.md +3 -2
  104. package/skills/domains/law/legal-nlp-guide/SKILL.md +1 -1
  105. package/skills/domains/law/legal-research-guide/SKILL.md +1 -1
  106. package/skills/domains/law/patent-analysis-guide/SKILL.md +1 -1
  107. package/skills/domains/law/regulatory-compliance-guide/SKILL.md +1 -1
  108. package/skills/domains/law/uk-legislation-api/SKILL.md +179 -0
  109. package/skills/domains/math/SKILL.md +1 -1
  110. package/skills/domains/math/numerical-methods-guide/SKILL.md +1 -1
  111. package/skills/domains/math/symbolic-computation-guide/SKILL.md +1 -1
  112. package/skills/domains/math/topology-data-analysis/SKILL.md +1 -1
  113. package/skills/domains/pharma/SKILL.md +1 -1
  114. package/skills/domains/pharma/clinical-pharmacology-guide/SKILL.md +1 -1
  115. package/skills/domains/pharma/clinical-trial-design-guide/SKILL.md +1 -1
  116. package/skills/domains/pharma/drug-development-guide/SKILL.md +1 -1
  117. package/skills/domains/pharma/drug-target-interaction/SKILL.md +1 -1
  118. package/skills/domains/pharma/pharmacovigilance-guide/SKILL.md +1 -1
  119. package/skills/domains/physics/SKILL.md +1 -1
  120. package/skills/domains/physics/astrophysics-data-guide/SKILL.md +1 -1
  121. package/skills/domains/physics/computational-physics-guide/SKILL.md +1 -1
  122. package/skills/domains/physics/particle-physics-guide/SKILL.md +1 -1
  123. package/skills/domains/physics/quantum-computing-guide/SKILL.md +1 -1
  124. package/skills/domains/social-science/SKILL.md +1 -1
  125. package/skills/domains/social-science/network-analysis-guide/SKILL.md +1 -1
  126. package/skills/domains/social-science/social-research-methods/SKILL.md +1 -1
  127. package/skills/domains/social-science/survey-research-guide/SKILL.md +1 -1
  128. package/skills/literature/discovery/SKILL.md +1 -1
  129. package/skills/literature/discovery/citation-alert-guide/SKILL.md +1 -1
  130. package/skills/literature/discovery/conference-proceedings-guide/SKILL.md +1 -1
  131. package/skills/literature/discovery/literature-mapping-guide/SKILL.md +1 -1
  132. package/skills/literature/discovery/rss-paper-feeds/SKILL.md +1 -1
  133. package/skills/literature/discovery/semantic-scholar-recs-guide/SKILL.md +1 -1
  134. package/skills/literature/discovery/zotero-arxiv-daily-guide/SKILL.md +3 -3
  135. package/skills/literature/fulltext/SKILL.md +3 -2
  136. package/skills/literature/fulltext/arxiv-latex-source/SKILL.md +195 -0
  137. package/skills/literature/fulltext/interlibrary-loan-guide/SKILL.md +1 -1
  138. package/skills/literature/fulltext/open-access-guide/SKILL.md +1 -1
  139. package/skills/literature/fulltext/open-access-mining-guide/SKILL.md +1 -1
  140. package/skills/literature/fulltext/preprint-servers-guide/SKILL.md +1 -1
  141. package/skills/literature/metadata/SKILL.md +1 -1
  142. package/skills/literature/metadata/altmetrics-guide/SKILL.md +1 -1
  143. package/skills/literature/metadata/doi-resolution-guide/SKILL.md +1 -1
  144. package/skills/literature/metadata/h-index-guide/SKILL.md +1 -1
  145. package/skills/literature/metadata/journal-metrics-guide/SKILL.md +1 -1
  146. package/skills/literature/metadata/orcid-integration-guide/SKILL.md +1 -1
  147. package/skills/literature/search/SKILL.md +2 -3
  148. package/skills/literature/search/arxiv-batch-reporting/SKILL.md +2 -2
  149. package/skills/literature/search/boolean-search-guide/SKILL.md +1 -1
  150. package/skills/literature/search/citation-chaining-guide/SKILL.md +1 -1
  151. package/skills/literature/search/database-comparison-guide/SKILL.md +1 -1
  152. package/skills/literature/search/deep-literature-search/SKILL.md +2 -2
  153. package/skills/literature/search/google-scholar-guide/SKILL.md +1 -1
  154. package/skills/literature/search/mesh-terms-guide/SKILL.md +1 -1
  155. package/skills/literature/search/systematic-search-strategy/SKILL.md +1 -1
  156. package/skills/research/automation/SKILL.md +1 -1
  157. package/skills/research/automation/data-collection-automation/SKILL.md +1 -1
  158. package/skills/research/automation/datagen-research-guide/SKILL.md +1 -0
  159. package/skills/research/automation/mle-agent-guide/SKILL.md +1 -0
  160. package/skills/research/automation/paper-to-agent-guide/SKILL.md +1 -0
  161. package/skills/research/automation/research-workflow-automation/SKILL.md +1 -1
  162. package/skills/research/deep-research/SKILL.md +1 -1
  163. package/skills/research/deep-research/auto-deep-research-guide/SKILL.md +1 -0
  164. package/skills/research/deep-research/meta-synthesis-guide/SKILL.md +1 -1
  165. package/skills/research/deep-research/scoping-review-guide/SKILL.md +1 -1
  166. package/skills/research/deep-research/systematic-review-guide/SKILL.md +1 -1
  167. package/skills/research/funding/SKILL.md +1 -1
  168. package/skills/research/funding/eu-horizon-guide/SKILL.md +1 -1
  169. package/skills/research/funding/grant-budget-guide/SKILL.md +1 -1
  170. package/skills/research/funding/grant-writing-guide/SKILL.md +1 -1
  171. package/skills/research/funding/nsf-grant-guide/SKILL.md +1 -1
  172. package/skills/research/funding/open-science-guide/SKILL.md +1 -1
  173. package/skills/research/methodology/SKILL.md +2 -2
  174. package/skills/research/methodology/action-research-guide/SKILL.md +1 -1
  175. package/skills/research/methodology/claude-scientific-guide/SKILL.md +1 -0
  176. package/skills/research/methodology/experimental-design-guide/SKILL.md +1 -1
  177. package/skills/research/methodology/grounded-theory-guide/SKILL.md +1 -1
  178. package/skills/research/methodology/mixed-methods-guide/SKILL.md +1 -1
  179. package/skills/research/methodology/qualitative-research-guide/SKILL.md +2 -2
  180. package/skills/research/methodology/research-paper-kb/SKILL.md +2 -2
  181. package/skills/research/methodology/research-town-guide/SKILL.md +3 -3
  182. package/skills/research/methodology/scientify-idea-generation/SKILL.md +1 -1
  183. package/skills/research/paper-review/SKILL.md +2 -2
  184. package/skills/research/paper-review/automated-review-guide/SKILL.md +1 -1
  185. package/skills/research/paper-review/paper-reading-assistant/SKILL.md +1 -1
  186. package/skills/research/paper-review/peer-review-guide/SKILL.md +2 -2
  187. package/skills/research/paper-review/rebuttal-writing-guide/SKILL.md +1 -1
  188. package/skills/research/paper-review/review-response-guide/SKILL.md +1 -1
  189. package/skills/research/paper-review/scientify-write-review-paper/SKILL.md +1 -1
  190. package/skills/tools/code-exec/SKILL.md +1 -1
  191. package/skills/tools/code-exec/google-colab-guide/SKILL.md +1 -1
  192. package/skills/tools/code-exec/jupyter-notebook-guide/SKILL.md +1 -1
  193. package/skills/tools/code-exec/overleaf-cli-guide/SKILL.md +1 -1
  194. package/skills/tools/code-exec/python-reproducibility-guide/SKILL.md +1 -1
  195. package/skills/tools/code-exec/r-reproducibility-guide/SKILL.md +1 -1
  196. package/skills/tools/code-exec/sandbox-execution-guide/SKILL.md +1 -1
  197. package/skills/tools/diagram/SKILL.md +1 -1
  198. package/skills/tools/diagram/code-flow-visualizer/SKILL.md +1 -1
  199. package/skills/tools/diagram/excalidraw-diagram-guide/SKILL.md +1 -1
  200. package/skills/tools/diagram/mermaid-architect-guide/SKILL.md +1 -1
  201. package/skills/tools/diagram/plantuml-guide/SKILL.md +1 -1
  202. package/skills/tools/diagram/scientific-illustration-guide/SKILL.md +1 -1
  203. package/skills/tools/document/SKILL.md +1 -1
  204. package/skills/tools/document/large-document-reader/SKILL.md +2 -2
  205. package/skills/tools/document/markdown-academic-guide/SKILL.md +1 -1
  206. package/skills/tools/document/paper-parse-guide/SKILL.md +2 -2
  207. package/skills/tools/document/pdf-extraction-guide/SKILL.md +1 -1
  208. package/skills/tools/knowledge-graph/SKILL.md +2 -3
  209. package/skills/tools/knowledge-graph/citation-network-builder/SKILL.md +1 -1
  210. package/skills/tools/knowledge-graph/concept-map-generator/SKILL.md +1 -1
  211. package/skills/tools/knowledge-graph/ontology-design-guide/SKILL.md +1 -1
  212. package/skills/tools/knowledge-graph/rag-methodology-guide/SKILL.md +1 -1
  213. package/skills/tools/ocr-translate/SKILL.md +1 -1
  214. package/skills/tools/ocr-translate/handwriting-recognition-guide/SKILL.md +1 -1
  215. package/skills/tools/ocr-translate/latex-ocr-guide/SKILL.md +1 -1
  216. package/skills/tools/ocr-translate/multilingual-research-guide/SKILL.md +1 -1
  217. package/skills/tools/ocr-translate/zotero-pdf2zh-guide/SKILL.md +1 -0
  218. package/skills/tools/scraping/SKILL.md +1 -1
  219. package/skills/tools/scraping/dataset-finder-guide/SKILL.md +2 -2
  220. package/skills/tools/scraping/google-scholar-scraper/SKILL.md +1 -1
  221. package/skills/tools/scraping/repository-harvesting-guide/SKILL.md +1 -1
  222. package/skills/tools/scraping/web-scraping-ethics-guide/SKILL.md +1 -1
  223. package/skills/writing/citation/SKILL.md +1 -1
  224. package/skills/writing/citation/academic-citation-manager/SKILL.md +2 -2
  225. package/skills/writing/citation/bibtex-management-guide/SKILL.md +1 -1
  226. package/skills/writing/citation/citation-style-guide/SKILL.md +1 -1
  227. package/skills/writing/citation/mendeley-api/SKILL.md +2 -2
  228. package/skills/writing/citation/obsidian-citation-guide/SKILL.md +1 -0
  229. package/skills/writing/citation/obsidian-zotero-guide/SKILL.md +1 -0
  230. package/skills/writing/citation/papersgpt-zotero-guide/SKILL.md +1 -0
  231. package/skills/writing/citation/reference-manager-comparison/SKILL.md +1 -1
  232. package/skills/writing/citation/zotero-mdnotes-guide/SKILL.md +1 -0
  233. package/skills/writing/citation/zotero-reference-guide/SKILL.md +1 -0
  234. package/skills/writing/composition/SKILL.md +1 -1
  235. package/skills/writing/composition/abstract-writing-guide/SKILL.md +1 -1
  236. package/skills/writing/composition/discussion-writing-guide/SKILL.md +1 -1
  237. package/skills/writing/composition/introduction-writing-guide/SKILL.md +1 -1
  238. package/skills/writing/composition/literature-review-writing/SKILL.md +1 -1
  239. package/skills/writing/composition/methods-section-guide/SKILL.md +1 -1
  240. package/skills/writing/composition/response-to-reviewers/SKILL.md +1 -1
  241. package/skills/writing/composition/scientific-writing-resources/SKILL.md +1 -0
  242. package/skills/writing/latex/SKILL.md +1 -1
  243. package/skills/writing/latex/bibliography-management-guide/SKILL.md +1 -1
  244. package/skills/writing/latex/latex-drawing-collection/SKILL.md +1 -0
  245. package/skills/writing/latex/latex-templates-collection/SKILL.md +1 -0
  246. package/skills/writing/latex/math-typesetting-guide/SKILL.md +1 -1
  247. package/skills/writing/latex/overleaf-collaboration-guide/SKILL.md +1 -1
  248. package/skills/writing/latex/tex-render-guide/SKILL.md +2 -2
  249. package/skills/writing/latex/tikz-diagrams-guide/SKILL.md +1 -1
  250. package/skills/writing/polish/SKILL.md +1 -1
  251. package/skills/writing/polish/academic-tone-guide/SKILL.md +1 -1
  252. package/skills/writing/polish/academic-translation-guide/SKILL.md +1 -1
  253. package/skills/writing/polish/ai-writing-humanizer/SKILL.md +1 -1
  254. package/skills/writing/polish/conciseness-editing-guide/SKILL.md +1 -1
  255. package/skills/writing/polish/grammar-checker-guide/SKILL.md +1 -1
  256. package/skills/writing/polish/paper-polish-guide/SKILL.md +2 -2
  257. package/skills/writing/polish/plagiarism-detection-guide/SKILL.md +1 -1
  258. package/skills/writing/templates/SKILL.md +1 -1
  259. package/skills/writing/templates/beamer-presentation-guide/SKILL.md +1 -1
  260. package/skills/writing/templates/conference-paper-template/SKILL.md +1 -1
  261. package/skills/writing/templates/novathesis-guide/SKILL.md +1 -0
  262. package/skills/writing/templates/thesis-template-guide/SKILL.md +1 -1
  263. package/src/tools/arxiv.ts +78 -30
  264. package/src/tools/biorxiv.ts +142 -0
  265. package/src/tools/crossref.ts +60 -22
  266. package/src/tools/datacite.ts +188 -0
  267. package/src/tools/dblp.ts +125 -0
  268. package/src/tools/doaj.ts +82 -0
  269. package/src/tools/europe-pmc.ts +159 -0
  270. package/src/tools/hal.ts +118 -0
  271. package/src/tools/inspire-hep.ts +165 -0
  272. package/src/tools/openaire.ts +158 -0
  273. package/src/tools/openalex.ts +20 -15
  274. package/src/tools/opencitations.ts +103 -0
  275. package/src/tools/orcid.ts +136 -0
  276. package/src/tools/osf-preprints.ts +104 -0
  277. package/src/tools/pubmed.ts +19 -13
  278. package/src/tools/ror.ts +118 -0
  279. package/src/tools/unpaywall.ts +12 -6
  280. package/src/tools/util.ts +141 -0
  281. package/src/tools/zenodo.ts +154 -0
  282. package/mcp-configs/academic-db/ChatSpatial.json +0 -17
  283. package/mcp-configs/academic-db/academia-mcp.json +0 -17
  284. package/mcp-configs/academic-db/academic-paper-explorer.json +0 -17
  285. package/mcp-configs/academic-db/academic-search-mcp-server.json +0 -17
  286. package/mcp-configs/academic-db/agentinterviews-mcp.json +0 -17
  287. package/mcp-configs/academic-db/all-in-mcp.json +0 -17
  288. package/mcp-configs/academic-db/alphafold-mcp.json +0 -20
  289. package/mcp-configs/academic-db/apple-health-mcp.json +0 -17
  290. package/mcp-configs/academic-db/arxiv-latex-mcp.json +0 -17
  291. package/mcp-configs/academic-db/arxiv-mcp-server.json +0 -17
  292. package/mcp-configs/academic-db/bgpt-mcp.json +0 -17
  293. package/mcp-configs/academic-db/biomcp.json +0 -17
  294. package/mcp-configs/academic-db/biothings-mcp.json +0 -17
  295. package/mcp-configs/academic-db/brightspace-mcp.json +0 -21
  296. package/mcp-configs/academic-db/catalysishub-mcp-server.json +0 -17
  297. package/mcp-configs/academic-db/climatiq-mcp.json +0 -20
  298. package/mcp-configs/academic-db/clinicaltrialsgov-mcp-server.json +0 -17
  299. package/mcp-configs/academic-db/deep-research-mcp.json +0 -17
  300. package/mcp-configs/academic-db/dicom-mcp.json +0 -17
  301. package/mcp-configs/academic-db/enrichr-mcp-server.json +0 -17
  302. package/mcp-configs/academic-db/fec-mcp-server.json +0 -17
  303. package/mcp-configs/academic-db/fhir-mcp-server-themomentum.json +0 -17
  304. package/mcp-configs/academic-db/fhir-mcp.json +0 -19
  305. package/mcp-configs/academic-db/gget-mcp.json +0 -17
  306. package/mcp-configs/academic-db/gibs-mcp.json +0 -20
  307. package/mcp-configs/academic-db/gis-mcp-server.json +0 -22
  308. package/mcp-configs/academic-db/google-earth-engine-mcp.json +0 -21
  309. package/mcp-configs/academic-db/google-researcher-mcp.json +0 -17
  310. package/mcp-configs/academic-db/idea-reality-mcp.json +0 -17
  311. package/mcp-configs/academic-db/legiscan-mcp.json +0 -19
  312. package/mcp-configs/academic-db/lex.json +0 -17
  313. package/mcp-configs/academic-db/m4-clinical-mcp.json +0 -21
  314. package/mcp-configs/academic-db/medical-mcp.json +0 -21
  315. package/mcp-configs/academic-db/nexonco-mcp.json +0 -20
  316. package/mcp-configs/academic-db/omop-mcp.json +0 -20
  317. package/mcp-configs/academic-db/onekgpd-mcp.json +0 -20
  318. package/mcp-configs/academic-db/openedu-mcp.json +0 -20
  319. package/mcp-configs/academic-db/opengenes-mcp.json +0 -20
  320. package/mcp-configs/academic-db/openstax-mcp.json +0 -21
  321. package/mcp-configs/academic-db/openstreetmap-mcp.json +0 -21
  322. package/mcp-configs/academic-db/opentargets-mcp.json +0 -21
  323. package/mcp-configs/academic-db/pdb-mcp.json +0 -21
  324. package/mcp-configs/academic-db/smithsonian-mcp.json +0 -20
  325. package/mcp-configs/ai-platform/Adaptive-Graph-of-Thoughts-MCP-server.json +0 -17
  326. package/mcp-configs/ai-platform/ai-counsel.json +0 -17
  327. package/mcp-configs/ai-platform/atlas-mcp-server.json +0 -17
  328. package/mcp-configs/ai-platform/counsel-mcp.json +0 -17
  329. package/mcp-configs/ai-platform/cross-llm-mcp.json +0 -17
  330. package/mcp-configs/ai-platform/gptr-mcp.json +0 -17
  331. package/mcp-configs/ai-platform/magi-researchers.json +0 -21
  332. package/mcp-configs/ai-platform/mcp-academic-researcher.json +0 -22
  333. package/mcp-configs/ai-platform/open-paper-machine.json +0 -21
  334. package/mcp-configs/ai-platform/paper-intelligence.json +0 -21
  335. package/mcp-configs/ai-platform/paper-reader.json +0 -21
  336. package/mcp-configs/ai-platform/paperdebugger.json +0 -21
  337. package/mcp-configs/browser/decipher-research-agent.json +0 -17
  338. package/mcp-configs/browser/deep-research.json +0 -17
  339. package/mcp-configs/browser/everything-claude-code.json +0 -17
  340. package/mcp-configs/browser/exa-mcp.json +0 -20
  341. package/mcp-configs/browser/gpt-researcher.json +0 -17
  342. package/mcp-configs/browser/heurist-agent-framework.json +0 -17
  343. package/mcp-configs/browser/mcp-searxng.json +0 -21
  344. package/mcp-configs/browser/mcp-webresearch.json +0 -20
  345. package/mcp-configs/cloud-docs/confluence-mcp.json +0 -37
  346. package/mcp-configs/cloud-docs/google-drive-mcp.json +0 -35
  347. package/mcp-configs/cloud-docs/notion-mcp.json +0 -29
  348. package/mcp-configs/communication/discord-mcp.json +0 -29
  349. package/mcp-configs/communication/discourse-mcp.json +0 -21
  350. package/mcp-configs/communication/slack-mcp.json +0 -29
  351. package/mcp-configs/communication/telegram-mcp.json +0 -28
  352. package/mcp-configs/data-platform/4everland-hosting-mcp.json +0 -17
  353. package/mcp-configs/data-platform/automl-stat-mcp.json +0 -21
  354. package/mcp-configs/data-platform/context-keeper.json +0 -17
  355. package/mcp-configs/data-platform/context7.json +0 -19
  356. package/mcp-configs/data-platform/contextstream-mcp.json +0 -17
  357. package/mcp-configs/data-platform/email-mcp.json +0 -17
  358. package/mcp-configs/data-platform/jefferson-stats-mcp.json +0 -22
  359. package/mcp-configs/data-platform/mcp-excel-server.json +0 -21
  360. package/mcp-configs/data-platform/mcp-stata.json +0 -21
  361. package/mcp-configs/data-platform/mcpstack-jupyter.json +0 -21
  362. package/mcp-configs/data-platform/ml-mcp.json +0 -21
  363. package/mcp-configs/data-platform/nasdaq-data-link-mcp.json +0 -20
  364. package/mcp-configs/data-platform/numpy-mcp.json +0 -21
  365. package/mcp-configs/database/neo4j-mcp.json +0 -37
  366. package/mcp-configs/database/postgres-mcp.json +0 -28
  367. package/mcp-configs/database/sqlite-mcp.json +0 -29
  368. package/mcp-configs/dev-platform/geogebra-mcp.json +0 -21
  369. package/mcp-configs/dev-platform/github-mcp.json +0 -31
  370. package/mcp-configs/dev-platform/gitlab-mcp.json +0 -34
  371. package/mcp-configs/dev-platform/latex-mcp-server.json +0 -21
  372. package/mcp-configs/dev-platform/manim-mcp.json +0 -20
  373. package/mcp-configs/dev-platform/mcp-echarts.json +0 -20
  374. package/mcp-configs/dev-platform/panel-viz-mcp.json +0 -20
  375. package/mcp-configs/dev-platform/paperbanana.json +0 -20
  376. package/mcp-configs/dev-platform/texflow-mcp.json +0 -20
  377. package/mcp-configs/dev-platform/texmcp.json +0 -20
  378. package/mcp-configs/dev-platform/typst-mcp.json +0 -21
  379. package/mcp-configs/dev-platform/vizro-mcp.json +0 -20
  380. package/mcp-configs/email/email-mcp.json +0 -40
  381. package/mcp-configs/email/gmail-mcp.json +0 -37
  382. package/mcp-configs/note-knowledge/ApeRAG.json +0 -17
  383. package/mcp-configs/note-knowledge/In-Memoria.json +0 -17
  384. package/mcp-configs/note-knowledge/agent-memory.json +0 -17
  385. package/mcp-configs/note-knowledge/aimemo.json +0 -17
  386. package/mcp-configs/note-knowledge/biel-mcp.json +0 -19
  387. package/mcp-configs/note-knowledge/cognee.json +0 -17
  388. package/mcp-configs/note-knowledge/context-awesome.json +0 -17
  389. package/mcp-configs/note-knowledge/context-mcp.json +0 -17
  390. package/mcp-configs/note-knowledge/conversation-handoff-mcp.json +0 -17
  391. package/mcp-configs/note-knowledge/cortex.json +0 -17
  392. package/mcp-configs/note-knowledge/devrag.json +0 -17
  393. package/mcp-configs/note-knowledge/easy-obsidian-mcp.json +0 -17
  394. package/mcp-configs/note-knowledge/engram.json +0 -17
  395. package/mcp-configs/note-knowledge/gnosis-mcp.json +0 -17
  396. package/mcp-configs/note-knowledge/graphlit-mcp-server.json +0 -19
  397. package/mcp-configs/note-knowledge/local-faiss-mcp.json +0 -21
  398. package/mcp-configs/note-knowledge/mcp-memory-service.json +0 -21
  399. package/mcp-configs/note-knowledge/mcp-obsidian.json +0 -23
  400. package/mcp-configs/note-knowledge/mcp-ragdocs.json +0 -20
  401. package/mcp-configs/note-knowledge/mcp-summarizer.json +0 -21
  402. package/mcp-configs/note-knowledge/mediawiki-mcp.json +0 -21
  403. package/mcp-configs/note-knowledge/openzim-mcp.json +0 -20
  404. package/mcp-configs/note-knowledge/zettelkasten-mcp.json +0 -21
  405. package/mcp-configs/reference-mgr/academic-paper-mcp-http.json +0 -20
  406. package/mcp-configs/reference-mgr/academix.json +0 -20
  407. package/mcp-configs/reference-mgr/arxiv-cli.json +0 -17
  408. package/mcp-configs/reference-mgr/arxiv-research-mcp.json +0 -21
  409. package/mcp-configs/reference-mgr/arxiv-search-mcp.json +0 -17
  410. package/mcp-configs/reference-mgr/chiken.json +0 -17
  411. package/mcp-configs/reference-mgr/claude-scholar.json +0 -17
  412. package/mcp-configs/reference-mgr/devonthink-mcp.json +0 -17
  413. package/mcp-configs/reference-mgr/google-scholar-abstract-mcp.json +0 -19
  414. package/mcp-configs/reference-mgr/google-scholar-mcp.json +0 -20
  415. package/mcp-configs/reference-mgr/mcp-paperswithcode.json +0 -21
  416. package/mcp-configs/reference-mgr/mcp-scholarly.json +0 -20
  417. package/mcp-configs/reference-mgr/mcp-simple-arxiv.json +0 -20
  418. package/mcp-configs/reference-mgr/mcp-simple-pubmed.json +0 -20
  419. package/mcp-configs/reference-mgr/mcp-zotero.json +0 -21
  420. package/mcp-configs/reference-mgr/mendeley-mcp.json +0 -20
  421. package/mcp-configs/reference-mgr/ncbi-mcp-server.json +0 -22
  422. package/mcp-configs/reference-mgr/onecite.json +0 -21
  423. package/mcp-configs/reference-mgr/paper-search-mcp.json +0 -21
  424. package/mcp-configs/reference-mgr/pubmed-search-mcp.json +0 -21
  425. package/mcp-configs/reference-mgr/scholar-mcp.json +0 -21
  426. package/mcp-configs/reference-mgr/scholar-multi-mcp.json +0 -21
  427. package/mcp-configs/reference-mgr/seerai.json +0 -21
  428. package/mcp-configs/reference-mgr/semantic-scholar-fastmcp.json +0 -21
  429. package/mcp-configs/reference-mgr/sourcelibrary.json +0 -20
  430. package/mcp-configs/registry.json +0 -476
  431. package/mcp-configs/repository/dataverse-mcp.json +0 -33
  432. package/mcp-configs/repository/huggingface-mcp.json +0 -29
  433. package/skills/domains/business/xpert-bi-guide/SKILL.md +0 -84
  434. package/skills/domains/education/edumcp-guide/SKILL.md +0 -74
  435. package/skills/literature/search/paper-search-mcp-guide/SKILL.md +0 -107
  436. package/skills/tools/knowledge-graph/paperpile-notion-guide/SKILL.md +0 -84
  437. package/src/tools/semantic-scholar.ts +0 -112
@@ -0,0 +1,142 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import type { OpenClawPluginApi, OpenClawPluginToolContext } from "openclaw/plugin-sdk";
3
+ import { toolResult, trackedFetch, isTrackedError } from "./util.js";
4
+
5
+ const BASE = "https://api.biorxiv.org";
6
+
7
+ export function createBiorxivTools(
8
+ _ctx: OpenClawPluginToolContext,
9
+ _api: OpenClawPluginApi,
10
+ ) {
11
+ return [
12
+ {
13
+ name: "search_biorxiv",
14
+ label: "Search Preprints (bioRxiv)",
15
+ description:
16
+ "Get recent bioRxiv preprints by date range. Covers biology preprints (300K+). Use date range (e.g. '2026-03-01/2026-03-18'), recent count (e.g. '50'), or recent days (e.g. '7d').",
17
+ parameters: Type.Object({
18
+ interval: Type.String({
19
+ description:
20
+ "Date range 'YYYY-MM-DD/YYYY-MM-DD', recent count '50', or recent days '7d'",
21
+ }),
22
+ cursor: Type.Optional(
23
+ Type.Number({ description: "Pagination offset (default 0, each page returns up to 100)" }),
24
+ ),
25
+ }),
26
+ execute: async (input: { interval: string; cursor?: number }) => {
27
+ const cursor = input.cursor ?? 0;
28
+ const tracked = await trackedFetch("biorxiv", `${BASE}/details/biorxiv/${input.interval}/${cursor}/json`, undefined, 30_000);
29
+ if (isTrackedError(tracked)) return tracked;
30
+ const data = await tracked.res.json();
31
+
32
+ const meta = data.messages?.[0];
33
+ const papers = (data.collection ?? []).map(
34
+ (p: Record<string, unknown>) => ({
35
+ doi: p.doi,
36
+ title: p.title,
37
+ authors: typeof p.authors === "string"
38
+ ? (p.authors as string).split("; ").filter(Boolean)
39
+ : [],
40
+ abstract: p.abstract,
41
+ date: p.date,
42
+ category: p.category,
43
+ version: p.version,
44
+ license: p.license,
45
+ url: p.doi ? `https://www.biorxiv.org/content/${p.doi}` : undefined,
46
+ pdf_url: p.doi ? `https://www.biorxiv.org/content/${p.doi}v${p.version ?? 1}.full.pdf` : undefined,
47
+ source: "biorxiv",
48
+ }),
49
+ );
50
+
51
+ return toolResult({
52
+ total_results: meta?.total ?? papers.length,
53
+ cursor: meta?.cursor,
54
+ papers,
55
+ });
56
+ },
57
+ },
58
+ {
59
+ name: "search_medrxiv",
60
+ label: "Search Preprints (medRxiv)",
61
+ description:
62
+ "Get recent medRxiv preprints by date range. Covers medical/health science preprints (100K+).",
63
+ parameters: Type.Object({
64
+ interval: Type.String({
65
+ description:
66
+ "Date range 'YYYY-MM-DD/YYYY-MM-DD', recent count '50', or recent days '7d'",
67
+ }),
68
+ cursor: Type.Optional(
69
+ Type.Number({ description: "Pagination offset (default 0)" }),
70
+ ),
71
+ }),
72
+ execute: async (input: { interval: string; cursor?: number }) => {
73
+ const cursor = input.cursor ?? 0;
74
+ const tracked = await trackedFetch("medrxiv", `${BASE}/details/medrxiv/${input.interval}/${cursor}/json`, undefined, 30_000);
75
+ if (isTrackedError(tracked)) return tracked;
76
+ const data = await tracked.res.json();
77
+
78
+ const meta = data.messages?.[0];
79
+ const papers = (data.collection ?? []).map(
80
+ (p: Record<string, unknown>) => ({
81
+ doi: p.doi,
82
+ title: p.title,
83
+ authors: typeof p.authors === "string"
84
+ ? (p.authors as string).split("; ").filter(Boolean)
85
+ : [],
86
+ abstract: p.abstract,
87
+ date: p.date,
88
+ category: p.category,
89
+ version: p.version,
90
+ url: p.doi ? `https://www.medrxiv.org/content/${p.doi}` : undefined,
91
+ pdf_url: p.doi ? `https://www.medrxiv.org/content/${p.doi}v${p.version ?? 1}.full.pdf` : undefined,
92
+ source: "medrxiv",
93
+ }),
94
+ );
95
+
96
+ return toolResult({
97
+ total_results: meta?.total ?? papers.length,
98
+ cursor: meta?.cursor,
99
+ papers,
100
+ });
101
+ },
102
+ },
103
+ {
104
+ name: "get_preprint_by_doi",
105
+ label: "Get Preprint by DOI (bioRxiv/medRxiv)",
106
+ description:
107
+ "Get a specific bioRxiv or medRxiv preprint by its DOI.",
108
+ parameters: Type.Object({
109
+ doi: Type.String({ description: "DOI of the preprint (e.g. '10.1101/2024.01.15.575123')" }),
110
+ server: Type.Optional(
111
+ Type.String({ description: "Server: 'biorxiv' or 'medrxiv' (default: biorxiv)" }),
112
+ ),
113
+ }),
114
+ execute: async (input: { doi: string; server?: string }) => {
115
+ const server = input.server ?? "biorxiv";
116
+ const doi = input.doi.replace(/^https?:\/\/doi\.org\//, "");
117
+ const tracked = await trackedFetch(server, `${BASE}/details/${server}/${doi}/na/json`, undefined, 15_000);
118
+ if (isTrackedError(tracked)) return tracked;
119
+ const data = await tracked.res.json();
120
+ const papers = data.collection ?? [];
121
+ if (papers.length === 0) return toolResult({ error: "Preprint not found" });
122
+
123
+ const p = papers[0] as Record<string, unknown>;
124
+ return toolResult({
125
+ doi: p.doi,
126
+ title: p.title,
127
+ authors: typeof p.authors === "string"
128
+ ? (p.authors as string).split("; ").filter(Boolean)
129
+ : [],
130
+ abstract: p.abstract,
131
+ date: p.date,
132
+ category: p.category,
133
+ version: p.version,
134
+ license: p.license,
135
+ url: `https://www.${server}.org/content/${p.doi}`,
136
+ pdf_url: `https://www.${server}.org/content/${p.doi}v${p.version ?? 1}.full.pdf`,
137
+ source: server,
138
+ });
139
+ },
140
+ },
141
+ ];
142
+ }
@@ -1,6 +1,6 @@
1
1
  import { Type } from "@sinclair/typebox";
2
2
  import type { OpenClawPluginApi, OpenClawPluginToolContext } from "openclaw/plugin-sdk";
3
- import { toolResult } from "./util.js";
3
+ import { toolResult, trackedFetch, isTrackedError } from "./util.js";
4
4
 
5
5
  const BASE = "https://api.crossref.org";
6
6
 
@@ -25,11 +25,9 @@ export function createCrossRefTools(
25
25
  }),
26
26
  execute: async (input: { doi: string }) => {
27
27
  const doi = input.doi.replace(/^https?:\/\/doi\.org\//, "");
28
- const res = await fetch(`${BASE}/works/${encodeURIComponent(doi)}`, {
29
- headers,
30
- });
31
- if (!res.ok) return toolResult({ error: `API error: ${res.status} ${res.statusText}` });
32
- const data = await res.json();
28
+ const tracked = await trackedFetch("crossref", `${BASE}/works/${encodeURIComponent(doi)}`, { headers });
29
+ if (isTrackedError(tracked)) return tracked;
30
+ const data = await tracked.res.json();
33
31
  const w = data.message;
34
32
  return toolResult({
35
33
  doi: w.DOI,
@@ -46,6 +44,7 @@ export function createCrossRefTools(
46
44
  url: w.URL,
47
45
  abstract: w.abstract,
48
46
  license: w.license?.[0]?.URL,
47
+ _source_health: { source: "crossref", latency_ms: tracked.latency_ms },
49
48
  });
50
49
  },
51
50
  },
@@ -53,47 +52,82 @@ export function createCrossRefTools(
53
52
  name: "search_crossref",
54
53
  label: "Search Works (CrossRef)",
55
54
  description:
56
- "Search CrossRef for scholarly works by query. Covers 150M+ DOIs across all publishers.",
55
+ "Search CrossRef for scholarly works. Covers 150M+ DOIs across ALL publishers and disciplines. Supports journal/ISSN filtering, year range, work type, and citation-count sorting. Best general-purpose academic search tool.",
57
56
  parameters: Type.Object({
58
- query: Type.String({ description: "Search query" }),
59
- limit: Type.Optional(
60
- Type.Number({ description: "Max results (default 10, max 100)" }),
57
+ query: Type.String({ description: "Search query (keywords)" }),
58
+ journal: Type.Optional(
59
+ Type.String({
60
+ description:
61
+ "Journal name filter (container-title). E.g. 'Nature', 'American Economic Review', 'The Lancet'",
62
+ }),
63
+ ),
64
+ issn: Type.Optional(
65
+ Type.String({
66
+ description: "Journal ISSN filter. E.g. '0028-0836' for Nature, '0002-8282' for AER",
67
+ }),
61
68
  ),
62
69
  from_year: Type.Optional(
63
- Type.Number({ description: "Published from this year onward" }),
70
+ Type.Number({ description: "Published from this year onward (inclusive)" }),
71
+ ),
72
+ until_year: Type.Optional(
73
+ Type.Number({ description: "Published until this year (inclusive)" }),
64
74
  ),
65
75
  type: Type.Optional(
66
76
  Type.String({
67
77
  description:
68
- "Work type filter: 'journal-article', 'book-chapter', 'proceedings-article', etc.",
78
+ "Work type: 'journal-article', 'book-chapter', 'proceedings-article', 'posted-content' (preprint), 'dissertation'",
69
79
  }),
70
80
  ),
81
+ has_abstract: Type.Optional(
82
+ Type.Boolean({ description: "Only results with abstracts" }),
83
+ ),
71
84
  sort: Type.Optional(
72
85
  Type.String({
73
- description: "Sort by: 'relevance', 'published', 'is-referenced-by-count'",
86
+ description:
87
+ "Sort by: 'relevance' (default), 'published' (newest first), 'is-referenced-by-count' (most cited)",
74
88
  }),
75
89
  ),
90
+ limit: Type.Optional(
91
+ Type.Number({ description: "Max results (default 10, max 100)" }),
92
+ ),
76
93
  }),
77
94
  execute: async (input: {
78
95
  query: string;
79
- limit?: number;
96
+ journal?: string;
97
+ issn?: string;
80
98
  from_year?: number;
99
+ until_year?: number;
81
100
  type?: string;
101
+ has_abstract?: boolean;
82
102
  sort?: string;
103
+ limit?: number;
83
104
  }) => {
84
105
  const params = new URLSearchParams({
85
106
  query: input.query,
86
107
  rows: String(Math.min(input.limit ?? 10, 100)),
87
108
  });
88
- if (input.from_year)
89
- params.set("filter", `from-pub-date:${input.from_year}`);
90
- if (input.type)
91
- params.append("filter", `type:${input.type}`);
92
- if (input.sort) params.set("sort", input.sort);
93
109
 
94
- const res = await fetch(`${BASE}/works?${params}`, { headers });
95
- if (!res.ok) return toolResult({ error: `API error: ${res.status} ${res.statusText}` });
96
- const data = await res.json();
110
+ // Build filter chain
111
+ const filters: string[] = [];
112
+ if (input.from_year) filters.push(`from-pub-date:${input.from_year}`);
113
+ if (input.until_year) filters.push(`until-pub-date:${input.until_year}`);
114
+ if (input.type) filters.push(`type:${input.type}`);
115
+ if (input.has_abstract) filters.push("has-abstract:true");
116
+ if (input.issn) filters.push(`issn:${input.issn}`);
117
+ if (filters.length > 0) params.set("filter", filters.join(","));
118
+
119
+ // Journal name as query.container-title (separate from filter)
120
+ if (input.journal) params.set("query.container-title", input.journal);
121
+
122
+ if (input.sort) {
123
+ params.set("sort", input.sort);
124
+ params.set("order", "desc");
125
+ }
126
+
127
+ const tracked = await trackedFetch("crossref", `${BASE}/works?${params}`, { headers });
128
+ if (isTrackedError(tracked)) return tracked;
129
+ const data = await tracked.res.json();
130
+
97
131
  return toolResult({
98
132
  total_results: data.message?.["total-results"],
99
133
  items: data.message?.items?.map((w: Record<string, unknown>) => ({
@@ -107,7 +141,11 @@ export function createCrossRefTools(
107
141
  (w.published as Record<string, unknown>)?.["date-parts"],
108
142
  type: w.type,
109
143
  cited_by: w["is-referenced-by-count"],
144
+ abstract: typeof w.abstract === "string"
145
+ ? (w.abstract as string).replace(/<[^>]*>/g, "").slice(0, 300)
146
+ : undefined,
110
147
  })),
148
+ _source_health: { source: "crossref", latency_ms: tracked.latency_ms },
111
149
  });
112
150
  },
113
151
  },
@@ -0,0 +1,188 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import type { OpenClawPluginApi, OpenClawPluginToolContext } from "openclaw/plugin-sdk";
3
+ import { toolResult, trackedFetch, isTrackedError } from "./util.js";
4
+
5
+ const BASE = "https://api.datacite.org";
6
+
7
+ export function createDataCiteTools(
8
+ _ctx: OpenClawPluginToolContext,
9
+ _api: OpenClawPluginApi,
10
+ ) {
11
+ return [
12
+ {
13
+ name: "search_datacite",
14
+ label: "Search Datasets & DOIs (DataCite)",
15
+ description:
16
+ "Search DataCite for datasets, software, and other research outputs (50M+ DOIs). Covers Zenodo, Figshare, Dryad, and 2000+ repositories. Best for finding datasets, software, and non-journal outputs.",
17
+ parameters: Type.Object({
18
+ query: Type.String({
19
+ description: "Search query for datasets, software, or other research outputs",
20
+ }),
21
+ max_results: Type.Optional(
22
+ Type.Number({ description: "Max results (default 10, max 100)" }),
23
+ ),
24
+ resource_type: Type.Optional(
25
+ Type.String({
26
+ description:
27
+ "Filter by type: 'Dataset', 'Software', 'Text', 'Collection', 'Audiovisual', 'Image', etc.",
28
+ }),
29
+ ),
30
+ from_year: Type.Optional(
31
+ Type.Number({ description: "Published from this year onward" }),
32
+ ),
33
+ }),
34
+ execute: async (input: {
35
+ query: string;
36
+ max_results?: number;
37
+ resource_type?: string;
38
+ from_year?: number;
39
+ }) => {
40
+ const pageSize = Math.min(input.max_results ?? 10, 100);
41
+ const params = new URLSearchParams({
42
+ query: input.query,
43
+ "page[size]": String(pageSize),
44
+ });
45
+ if (input.resource_type) {
46
+ params.set("resource-type-id", input.resource_type.toLowerCase());
47
+ }
48
+ if (input.from_year) {
49
+ params.set("query", `${input.query} AND publicationYear:[${input.from_year} TO *]`);
50
+ }
51
+
52
+ const tracked = await trackedFetch("datacite", `${BASE}/dois?${params}`, undefined, 15_000);
53
+ if (isTrackedError(tracked)) return tracked;
54
+ const data = await tracked.res.json();
55
+
56
+ const items = (data.data ?? []).map(
57
+ (item: Record<string, unknown>) => {
58
+ const attrs = item.attributes as Record<string, unknown> | undefined;
59
+ if (!attrs) return { id: item.id };
60
+
61
+ const titles = attrs.titles as Array<{ title: string }> | undefined;
62
+ const creators = attrs.creators as Array<{
63
+ name: string;
64
+ nameType?: string;
65
+ givenName?: string;
66
+ familyName?: string;
67
+ }> | undefined;
68
+ const types = attrs.types as Record<string, string> | undefined;
69
+ const descriptions = attrs.descriptions as Array<{
70
+ description: string;
71
+ descriptionType: string;
72
+ }> | undefined;
73
+ const dates = attrs.dates as Array<{
74
+ date: string;
75
+ dateType: string;
76
+ }> | undefined;
77
+
78
+ const issuedDate = dates?.find((d) => d.dateType === "Issued")?.date;
79
+
80
+ return {
81
+ doi: attrs.doi,
82
+ title: titles?.[0]?.title,
83
+ creators: creators?.slice(0, 5).map((c) =>
84
+ c.givenName && c.familyName
85
+ ? `${c.givenName} ${c.familyName}`
86
+ : c.name,
87
+ ),
88
+ publisher: attrs.publisher,
89
+ publication_year: attrs.publicationYear,
90
+ resource_type: types?.resourceTypeGeneral,
91
+ description: descriptions?.find(
92
+ (d) => d.descriptionType === "Abstract",
93
+ )?.description,
94
+ url: attrs.url,
95
+ issued_date: issuedDate,
96
+ citation_count: attrs.citationCount,
97
+ view_count: attrs.viewCount,
98
+ download_count: attrs.downloadCount,
99
+ };
100
+ },
101
+ );
102
+
103
+ return toolResult({
104
+ total_results: data.meta?.total,
105
+ items,
106
+ _source_health: { source: "datacite", latency_ms: tracked.latency_ms },
107
+ });
108
+ },
109
+ },
110
+ {
111
+ name: "resolve_datacite_doi",
112
+ label: "Resolve DOI (DataCite)",
113
+ description:
114
+ "Resolve a DataCite DOI to get full metadata. Best for DOIs from Zenodo, Figshare, Dryad, and other data repositories (10.5281/*, 10.6084/*, etc.).",
115
+ parameters: Type.Object({
116
+ doi: Type.String({
117
+ description: "DOI to resolve, e.g. '10.5281/zenodo.1234567'",
118
+ }),
119
+ }),
120
+ execute: async (input: { doi: string }) => {
121
+ const doi = input.doi.replace(/^https?:\/\/doi\.org\//, "");
122
+
123
+ const tracked = await trackedFetch(
124
+ "datacite",
125
+ `${BASE}/dois/${encodeURIComponent(doi)}`,
126
+ undefined,
127
+ 15_000,
128
+ );
129
+ if (isTrackedError(tracked)) return tracked;
130
+ const data = await tracked.res.json();
131
+
132
+ const attrs = data.data?.attributes as Record<string, unknown> | undefined;
133
+ if (!attrs) return toolResult({ error: "DOI not found or no attributes" });
134
+
135
+ const titles = attrs.titles as Array<{ title: string }> | undefined;
136
+ const creators = attrs.creators as Array<{
137
+ name: string;
138
+ givenName?: string;
139
+ familyName?: string;
140
+ }> | undefined;
141
+ const types = attrs.types as Record<string, string> | undefined;
142
+ const descriptions = attrs.descriptions as Array<{
143
+ description: string;
144
+ descriptionType: string;
145
+ }> | undefined;
146
+ const dates = attrs.dates as Array<{
147
+ date: string;
148
+ dateType: string;
149
+ }> | undefined;
150
+ const rights = attrs.rightsList as Array<{
151
+ rights: string;
152
+ rightsUri?: string;
153
+ rightsIdentifier?: string;
154
+ }> | undefined;
155
+ const subjects = attrs.subjects as Array<{
156
+ subject: string;
157
+ }> | undefined;
158
+
159
+ return toolResult({
160
+ doi: attrs.doi,
161
+ title: titles?.[0]?.title,
162
+ creators: creators?.map((c) =>
163
+ c.givenName && c.familyName
164
+ ? `${c.givenName} ${c.familyName}`
165
+ : c.name,
166
+ ),
167
+ publisher: attrs.publisher,
168
+ publication_year: attrs.publicationYear,
169
+ resource_type: types?.resourceTypeGeneral,
170
+ resource_type_specific: types?.resourceType || undefined,
171
+ description: descriptions?.find(
172
+ (d) => d.descriptionType === "Abstract",
173
+ )?.description,
174
+ url: attrs.url,
175
+ dates: dates?.map((d) => ({ date: d.date, type: d.dateType })),
176
+ license: rights?.[0]?.rightsIdentifier ?? rights?.[0]?.rights,
177
+ license_url: rights?.[0]?.rightsUri,
178
+ subjects: subjects?.map((s) => s.subject),
179
+ citation_count: attrs.citationCount,
180
+ view_count: attrs.viewCount,
181
+ download_count: attrs.downloadCount,
182
+ version: attrs.version,
183
+ _source_health: { source: "datacite", latency_ms: tracked.latency_ms },
184
+ });
185
+ },
186
+ },
187
+ ];
188
+ }
@@ -0,0 +1,125 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import type { OpenClawPluginApi, OpenClawPluginToolContext } from "openclaw/plugin-sdk";
3
+ import { toolResult, trackedFetch, isTrackedError } from "./util.js";
4
+
5
+ export function createDblpTools(
6
+ _ctx: OpenClawPluginToolContext,
7
+ _api: OpenClawPluginApi,
8
+ ) {
9
+ return [
10
+ {
11
+ name: "search_dblp",
12
+ label: "Search CS Papers (dblp)",
13
+ description:
14
+ "Search dblp computer science bibliography (7M+ records). Covers conferences (NeurIPS, ICML, ACL, etc.) and journals. Best for CS venue-specific search.",
15
+ parameters: Type.Object({
16
+ query: Type.String({
17
+ description: "Search query for publications",
18
+ }),
19
+ max_results: Type.Optional(
20
+ Type.Number({ description: "Max results (default 10, max 1000)" }),
21
+ ),
22
+ offset: Type.Optional(
23
+ Type.Number({ description: "Result offset for pagination" }),
24
+ ),
25
+ }),
26
+ execute: async (input: {
27
+ query: string;
28
+ max_results?: number;
29
+ offset?: number;
30
+ }) => {
31
+ const params = new URLSearchParams({
32
+ q: input.query,
33
+ format: "json",
34
+ h: String(Math.min(input.max_results ?? 10, 1000)),
35
+ });
36
+ if (input.offset) params.set("f", String(input.offset));
37
+
38
+ const tracked = await trackedFetch("dblp", `https://dblp.org/search/publ/api?${params}`);
39
+ if (isTrackedError(tracked)) return tracked;
40
+ const data = await tracked.res.json();
41
+
42
+ const hits = data.result?.hits;
43
+ if (!hits) return toolResult({ total_results: 0, papers: [] });
44
+
45
+ const papers = (hits.hit ?? []).map(
46
+ (h: Record<string, unknown>) => {
47
+ const info = h.info as Record<string, unknown>;
48
+ if (!info) return {};
49
+
50
+ const authorsRaw = info.authors as Record<string, unknown> | undefined;
51
+ let authors: string[] = [];
52
+ if (authorsRaw?.author) {
53
+ const authorList = authorsRaw.author;
54
+ if (Array.isArray(authorList)) {
55
+ authors = authorList.map((a: Record<string, string> | string) =>
56
+ typeof a === "string" ? a : a.text ?? "",
57
+ );
58
+ } else if (typeof authorList === "object") {
59
+ authors = [(authorList as Record<string, string>).text ?? ""];
60
+ }
61
+ }
62
+
63
+ return {
64
+ title: info.title,
65
+ authors,
66
+ venue: info.venue,
67
+ year: info.year ? parseInt(info.year as string, 10) : undefined,
68
+ type: info.type,
69
+ doi: info.doi,
70
+ url: info.ee ?? info.url,
71
+ dblp_url: info.url,
72
+ };
73
+ },
74
+ );
75
+
76
+ return toolResult({
77
+ total_results: parseInt(hits["@total"] ?? "0", 10),
78
+ papers,
79
+ });
80
+ },
81
+ },
82
+ {
83
+ name: "search_dblp_author",
84
+ label: "Search Authors (dblp)",
85
+ description:
86
+ "Search dblp for computer science authors and their publication profiles.",
87
+ parameters: Type.Object({
88
+ query: Type.String({ description: "Author name to search" }),
89
+ max_results: Type.Optional(
90
+ Type.Number({ description: "Max results (default 10)" }),
91
+ ),
92
+ }),
93
+ execute: async (input: { query: string; max_results?: number }) => {
94
+ const params = new URLSearchParams({
95
+ q: input.query,
96
+ format: "json",
97
+ h: String(Math.min(input.max_results ?? 10, 100)),
98
+ });
99
+
100
+ const tracked = await trackedFetch("dblp", `https://dblp.org/search/author/api?${params}`);
101
+ if (isTrackedError(tracked)) return tracked;
102
+ const data = await tracked.res.json();
103
+
104
+ const hits = data.result?.hits;
105
+ if (!hits) return toolResult({ total_results: 0, authors: [] });
106
+
107
+ const authors = (hits.hit ?? []).map(
108
+ (h: Record<string, unknown>) => {
109
+ const info = h.info as Record<string, unknown>;
110
+ return {
111
+ name: info?.author,
112
+ url: info?.url,
113
+ notes: info?.notes,
114
+ };
115
+ },
116
+ );
117
+
118
+ return toolResult({
119
+ total_results: parseInt(hits["@total"] ?? "0", 10),
120
+ authors,
121
+ });
122
+ },
123
+ },
124
+ ];
125
+ }
@@ -0,0 +1,82 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import type { OpenClawPluginApi, OpenClawPluginToolContext } from "openclaw/plugin-sdk";
3
+ import { toolResult, trackedFetch, isTrackedError } from "./util.js";
4
+
5
+ const BASE = "https://doaj.org/api";
6
+
7
+ export function createDoajTools(
8
+ _ctx: OpenClawPluginToolContext,
9
+ _api: OpenClawPluginApi,
10
+ ) {
11
+ return [
12
+ {
13
+ name: "search_doaj",
14
+ label: "Search Open Access Articles (DOAJ)",
15
+ description:
16
+ "Search DOAJ for verified open access articles (9M+ articles from 20K+ OA journals). All results are guaranteed open access.",
17
+ parameters: Type.Object({
18
+ query: Type.String({
19
+ description:
20
+ "Search query. Supports field search: bibjson.title:, bibjson.author.name:, bibjson.keywords:, doi:, bibjson.year:. Boolean AND/OR supported.",
21
+ }),
22
+ max_results: Type.Optional(
23
+ Type.Number({ description: "Max results (default 10, max 100)" }),
24
+ ),
25
+ page: Type.Optional(
26
+ Type.Number({ description: "Page number (starts from 1)" }),
27
+ ),
28
+ sort: Type.Optional(
29
+ Type.String({ description: "Sort field, e.g. 'created_date:desc'" }),
30
+ ),
31
+ }),
32
+ execute: async (input: {
33
+ query: string;
34
+ max_results?: number;
35
+ page?: number;
36
+ sort?: string;
37
+ }) => {
38
+ const pageSize = Math.min(input.max_results ?? 10, 100);
39
+ const page = input.page ?? 1;
40
+
41
+ let url = `${BASE}/search/articles/${encodeURIComponent(input.query)}?page=${page}&pageSize=${pageSize}`;
42
+ if (input.sort) url += `&sort=${encodeURIComponent(input.sort)}`;
43
+
44
+ const tracked = await trackedFetch("doaj", url);
45
+ if (isTrackedError(tracked)) return tracked;
46
+ const data = await tracked.res.json();
47
+
48
+ const articles = (data.results ?? []).map(
49
+ (r: Record<string, unknown>) => {
50
+ const bib = r.bibjson as Record<string, unknown> | undefined;
51
+ if (!bib) return { id: r.id };
52
+
53
+ const identifiers = bib.identifier as Array<{ type: string; id: string }> | undefined;
54
+ const doi = identifiers?.find((i) => i.type === "doi")?.id;
55
+ const links = bib.link as Array<{ url: string; type: string }> | undefined;
56
+ const journal = bib.journal as Record<string, unknown> | undefined;
57
+
58
+ return {
59
+ title: bib.title,
60
+ abstract: bib.abstract,
61
+ authors: (bib.author as Array<{ name: string }> | undefined)
62
+ ?.map((a) => a.name),
63
+ year: bib.year,
64
+ doi,
65
+ journal: journal?.title,
66
+ publisher: journal?.publisher,
67
+ keywords: bib.keywords,
68
+ url: links?.[0]?.url ?? (doi ? `https://doi.org/${doi}` : undefined),
69
+ is_oa: true,
70
+ };
71
+ },
72
+ );
73
+
74
+ return toolResult({
75
+ total_results: data.total,
76
+ page,
77
+ articles,
78
+ });
79
+ },
80
+ },
81
+ ];
82
+ }