@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,159 @@
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://www.ebi.ac.uk/europepmc/webservices/rest";
6
+
7
+ export function createEuropePmcTools(
8
+ _ctx: OpenClawPluginToolContext,
9
+ _api: OpenClawPluginApi,
10
+ ) {
11
+ return [
12
+ {
13
+ name: "search_europe_pmc",
14
+ label: "Search Articles (Europe PMC)",
15
+ description:
16
+ "Search Europe PMC biomedical literature. Covers 33M+ articles including full PubMed, with open access full text, citation counts, and MeSH terms.",
17
+ parameters: Type.Object({
18
+ query: Type.String({
19
+ description:
20
+ "Search query. Supports field tags: TITLE:, AUTH:, JOURNAL:, DOI:, and boolean AND/OR/NOT.",
21
+ }),
22
+ max_results: Type.Optional(
23
+ Type.Number({ description: "Max results (default 10, max 1000)" }),
24
+ ),
25
+ sort: Type.Optional(
26
+ Type.String({
27
+ description: "Sort by: 'RELEVANCE', 'DATE_DESC', 'CITED'",
28
+ }),
29
+ ),
30
+ cursor: Type.Optional(
31
+ Type.String({ description: "Pagination cursor (use value from previous response)" }),
32
+ ),
33
+ }),
34
+ execute: async (input: {
35
+ query: string;
36
+ max_results?: number;
37
+ sort?: string;
38
+ cursor?: string;
39
+ }) => {
40
+ const params = new URLSearchParams({
41
+ query: input.query,
42
+ format: "json",
43
+ pageSize: String(Math.min(input.max_results ?? 10, 1000)),
44
+ resultType: "core",
45
+ });
46
+ if (input.sort) params.set("sort", input.sort);
47
+ params.set("cursorMark", input.cursor ?? "*");
48
+
49
+ const tracked = await trackedFetch("europe_pmc", `${BASE}/search?${params}`);
50
+ if (isTrackedError(tracked)) return tracked;
51
+ const data = await tracked.res.json();
52
+
53
+ const results = (data.resultList?.result ?? []).map(
54
+ (r: Record<string, unknown>) => ({
55
+ pmid: r.pmid,
56
+ pmcid: r.pmcid,
57
+ doi: r.doi,
58
+ title: r.title,
59
+ authors: r.authorString,
60
+ journal: (r.journalInfo as Record<string, unknown>)?.journal
61
+ ? ((r.journalInfo as Record<string, unknown>).journal as Record<string, unknown>)?.title
62
+ : undefined,
63
+ year: r.pubYear,
64
+ abstract: r.abstractText,
65
+ is_oa: r.isOpenAccess === "Y",
66
+ cited_by_count: r.citedByCount,
67
+ source: r.source,
68
+ url: r.doi ? `https://doi.org/${r.doi}` : `https://europepmc.org/article/${r.source}/${r.id}`,
69
+ }),
70
+ );
71
+
72
+ return toolResult({
73
+ total_results: data.hitCount,
74
+ next_cursor: data.nextCursorMark,
75
+ articles: results,
76
+ _source_health: { source: "europe_pmc", latency_ms: tracked.latency_ms },
77
+ });
78
+ },
79
+ },
80
+ {
81
+ name: "get_epmc_citations",
82
+ label: "Get Citations (Europe PMC)",
83
+ description:
84
+ "Get papers that cite a given article. Forward citation tracking for biomedical literature.",
85
+ parameters: Type.Object({
86
+ pmid: Type.String({
87
+ description: "PubMed ID of the article",
88
+ }),
89
+ max_results: Type.Optional(
90
+ Type.Number({ description: "Max citations to return (default 25)" }),
91
+ ),
92
+ page: Type.Optional(Type.Number({ description: "Page number (default 1)" })),
93
+ }),
94
+ execute: async (input: { pmid: string; max_results?: number; page?: number }) => {
95
+ const params = new URLSearchParams({
96
+ format: "json",
97
+ pageSize: String(input.max_results ?? 25),
98
+ page: String(input.page ?? 1),
99
+ });
100
+ const tracked = await trackedFetch("europe_pmc", `${BASE}/MED/${input.pmid}/citations?${params}`);
101
+ if (isTrackedError(tracked)) return tracked;
102
+ const data = await tracked.res.json();
103
+
104
+ return toolResult({
105
+ total_citations: data.hitCount,
106
+ citations: (data.citationList?.citation ?? []).map(
107
+ (c: Record<string, unknown>) => ({
108
+ pmid: c.id,
109
+ source: c.source,
110
+ title: c.title,
111
+ authors: c.authorString,
112
+ journal: c.journalAbbreviation,
113
+ year: c.pubYear,
114
+ cited_by_count: c.citedByCount,
115
+ }),
116
+ ),
117
+ _source_health: { source: "europe_pmc", latency_ms: tracked.latency_ms },
118
+ });
119
+ },
120
+ },
121
+ {
122
+ name: "get_epmc_references",
123
+ label: "Get References (Europe PMC)",
124
+ description:
125
+ "Get the reference list of a paper. Shows what a paper cites.",
126
+ parameters: Type.Object({
127
+ pmid: Type.String({ description: "PubMed ID of the article" }),
128
+ max_results: Type.Optional(
129
+ Type.Number({ description: "Max references to return (default 25)" }),
130
+ ),
131
+ }),
132
+ execute: async (input: { pmid: string; max_results?: number }) => {
133
+ const params = new URLSearchParams({
134
+ format: "json",
135
+ pageSize: String(input.max_results ?? 25),
136
+ });
137
+ const tracked = await trackedFetch("europe_pmc", `${BASE}/MED/${input.pmid}/references?${params}`);
138
+ if (isTrackedError(tracked)) return tracked;
139
+ const data = await tracked.res.json();
140
+
141
+ return toolResult({
142
+ total_references: data.hitCount,
143
+ references: (data.referenceList?.reference ?? []).map(
144
+ (r: Record<string, unknown>) => ({
145
+ pmid: r.id,
146
+ source: r.source,
147
+ title: r.title,
148
+ authors: r.authorString,
149
+ journal: r.journalAbbreviation,
150
+ year: r.pubYear,
151
+ order: r.citedOrder,
152
+ }),
153
+ ),
154
+ _source_health: { source: "europe_pmc", latency_ms: tracked.latency_ms },
155
+ });
156
+ },
157
+ },
158
+ ];
159
+ }
@@ -0,0 +1,118 @@
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.archives-ouvertes.fr";
6
+
7
+ /** Default fields to request from HAL Solr API */
8
+ const DEFAULT_FIELDS = [
9
+ "title_s",
10
+ "authFullName_s",
11
+ "doiId_s",
12
+ "producedDate_s",
13
+ "uri_s",
14
+ "abstract_s",
15
+ "journalTitle_s",
16
+ "keyword_s",
17
+ "docType_s",
18
+ "halId_s",
19
+ ].join(",");
20
+
21
+ export function createHalTools(
22
+ _ctx: OpenClawPluginToolContext,
23
+ _api: OpenClawPluginApi,
24
+ ) {
25
+ return [
26
+ {
27
+ name: "search_hal",
28
+ label: "Search Publications (HAL)",
29
+ description:
30
+ "Search HAL (Hyper Articles en Ligne), the French open archive for scholarly publications. Covers 4M+ documents with strong coverage of French and European research across all disciplines.",
31
+ parameters: Type.Object({
32
+ query: Type.String({
33
+ description:
34
+ "Search query. Supports Solr syntax: field:value, AND/OR/NOT, quoted phrases.",
35
+ }),
36
+ rows: Type.Optional(
37
+ Type.Number({ description: "Max results (default 10, max 100)" }),
38
+ ),
39
+ sort: Type.Optional(
40
+ Type.String({
41
+ description:
42
+ "Sort: 'producedDate_s desc' (newest), 'producedDate_s asc' (oldest). Default: relevance.",
43
+ }),
44
+ ),
45
+ doc_type: Type.Optional(
46
+ Type.String({
47
+ description:
48
+ "Document type filter: 'ART' (journal article), 'COMM' (conference paper), 'THESE' (thesis), 'COUV' (book chapter), 'OUV' (book), 'REPORT', 'HDR', 'POSTER'",
49
+ }),
50
+ ),
51
+ }),
52
+ execute: async (input: {
53
+ query: string;
54
+ rows?: number;
55
+ sort?: string;
56
+ doc_type?: string;
57
+ }) => {
58
+ let q = input.query;
59
+ if (input.doc_type) {
60
+ q = `(${q}) AND docType_s:${input.doc_type}`;
61
+ }
62
+
63
+ const params = new URLSearchParams({
64
+ q,
65
+ fl: DEFAULT_FIELDS,
66
+ rows: String(Math.min(input.rows ?? 10, 100)),
67
+ wt: "json",
68
+ });
69
+ if (input.sort) params.set("sort", input.sort);
70
+
71
+ const result = await trackedFetch(
72
+ "hal",
73
+ `${BASE}/search/?${params}`,
74
+ undefined,
75
+ 10_000,
76
+ );
77
+ if (isTrackedError(result)) return result;
78
+ const data = await result.res.json();
79
+
80
+ const response = data.response as Record<string, unknown> | undefined;
81
+ const docs = response?.docs as Array<Record<string, unknown>> | undefined;
82
+
83
+ return toolResult({
84
+ total_results: response?.numFound,
85
+ source: "hal",
86
+ papers: (docs ?? []).map((doc) => {
87
+ // HAL returns title_s and authFullName_s as arrays
88
+ const titles = doc.title_s as string[] | undefined;
89
+ const authors = doc.authFullName_s as string[] | undefined;
90
+ const keywords = doc.keyword_s as string[] | undefined;
91
+ const abstracts = doc.abstract_s as string[] | undefined;
92
+ const doi = doc.doiId_s as string | undefined;
93
+
94
+ return {
95
+ title: titles?.[0],
96
+ authors,
97
+ doi,
98
+ year: doc.producedDate_s
99
+ ? String(doc.producedDate_s).slice(0, 4)
100
+ : undefined,
101
+ publication_date: doc.producedDate_s,
102
+ journal: doc.journalTitle_s,
103
+ doc_type: doc.docType_s,
104
+ keywords,
105
+ abstract: abstracts?.[0]
106
+ ? String(abstracts[0]).slice(0, 500)
107
+ : undefined,
108
+ url: (doc.uri_s as string) ?? (doi ? `https://doi.org/${doi}` : undefined),
109
+ hal_id: doc.halId_s,
110
+ source: "hal",
111
+ };
112
+ }),
113
+ _latency_ms: result.latency_ms,
114
+ });
115
+ },
116
+ },
117
+ ];
118
+ }
@@ -0,0 +1,165 @@
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://inspirehep.net/api";
6
+
7
+ interface InspireAuthor {
8
+ full_name: string;
9
+ first_name?: string;
10
+ last_name?: string;
11
+ }
12
+
13
+ interface InspireTitle {
14
+ title: string;
15
+ source?: string;
16
+ }
17
+
18
+ interface InspireAbstract {
19
+ value: string;
20
+ source?: string;
21
+ }
22
+
23
+ interface InspireArxivEprint {
24
+ value: string;
25
+ categories?: string[];
26
+ }
27
+
28
+ interface InspireDoi {
29
+ value: string;
30
+ }
31
+
32
+ interface InspirePublicationInfo {
33
+ year?: number;
34
+ journal_title?: string;
35
+ journal_volume?: string;
36
+ page_start?: string;
37
+ page_end?: string;
38
+ artid?: string;
39
+ }
40
+
41
+ function normalizeHit(meta: Record<string, unknown>): Record<string, unknown> {
42
+ const titles = meta.titles as InspireTitle[] | undefined;
43
+ const authors = meta.authors as InspireAuthor[] | undefined;
44
+ const arxivEprints = meta.arxiv_eprints as InspireArxivEprint[] | undefined;
45
+ const dois = meta.dois as InspireDoi[] | undefined;
46
+ const abstracts = meta.abstracts as InspireAbstract[] | undefined;
47
+ const pubInfo = meta.publication_info as InspirePublicationInfo[] | undefined;
48
+
49
+ const arxivId = arxivEprints?.[0]?.value;
50
+ const doi = dois?.[0]?.value;
51
+
52
+ return {
53
+ title: titles?.[0]?.title,
54
+ authors: authors?.slice(0, 10).map((a) => a.full_name),
55
+ author_count: authors?.length ?? meta.author_count,
56
+ doi,
57
+ arxiv_id: arxivId,
58
+ arxiv_categories: arxivEprints?.[0]?.categories,
59
+ year: pubInfo?.[0]?.year ?? (meta.earliest_date ? String(meta.earliest_date).slice(0, 4) : undefined),
60
+ journal: pubInfo?.[0]?.journal_title,
61
+ journal_volume: pubInfo?.[0]?.journal_volume,
62
+ citation_count: meta.citation_count,
63
+ abstract: abstracts?.[0]?.value,
64
+ url: doi
65
+ ? `https://doi.org/${doi}`
66
+ : arxivId
67
+ ? `https://arxiv.org/abs/${arxivId}`
68
+ : undefined,
69
+ inspire_url: meta.control_number
70
+ ? `https://inspirehep.net/literature/${meta.control_number}`
71
+ : undefined,
72
+ source: "inspire_hep",
73
+ };
74
+ }
75
+
76
+ export function createInspireHepTools(
77
+ _ctx: OpenClawPluginToolContext,
78
+ _api: OpenClawPluginApi,
79
+ ) {
80
+ return [
81
+ {
82
+ name: "search_inspire",
83
+ label: "Search Papers (INSPIRE-HEP)",
84
+ description:
85
+ "Search INSPIRE-HEP for high-energy physics literature. The primary database for particle physics, astrophysics, and related fields. Covers 1.5M+ records with citation tracking.",
86
+ parameters: Type.Object({
87
+ query: Type.String({
88
+ description:
89
+ "Search query. Supports SPIRES-style: 'find a einstein and t relativity', or keywords like 'higgs boson'. Field search: a (author), t (title), j (journal), eprint (arXiv ID).",
90
+ }),
91
+ size: Type.Optional(
92
+ Type.Number({ description: "Max results (default 10, max 100)" }),
93
+ ),
94
+ sort: Type.Optional(
95
+ Type.String({
96
+ description:
97
+ "Sort by: 'mostrecent' (newest), 'mostcited', 'bestmatch' (relevance)",
98
+ }),
99
+ ),
100
+ }),
101
+ execute: async (input: { query: string; size?: number; sort?: string }) => {
102
+ const params = new URLSearchParams({
103
+ q: input.query,
104
+ size: String(Math.min(input.size ?? 10, 100)),
105
+ sort: input.sort ?? "bestmatch",
106
+ });
107
+
108
+ const result = await trackedFetch(
109
+ "inspire_hep",
110
+ `${BASE}/literature?${params}`,
111
+ undefined,
112
+ 10_000,
113
+ );
114
+ if (isTrackedError(result)) return result;
115
+ const data = await result.res.json();
116
+
117
+ return toolResult({
118
+ total_results: data.hits?.total,
119
+ source: "inspire_hep",
120
+ papers: data.hits?.hits?.map(
121
+ (h: Record<string, unknown>) =>
122
+ normalizeHit(h.metadata as Record<string, unknown>),
123
+ ),
124
+ _latency_ms: result.latency_ms,
125
+ });
126
+ },
127
+ },
128
+ {
129
+ name: "get_inspire_paper",
130
+ label: "Get Paper Details (INSPIRE-HEP)",
131
+ description:
132
+ "Get detailed information about a specific paper from INSPIRE-HEP by arXiv ID or DOI.",
133
+ parameters: Type.Object({
134
+ identifier: Type.String({
135
+ description:
136
+ "Paper identifier: arXiv ID (e.g. '1207.7214') or DOI (e.g. '10.1016/j.physletb.2012.08.020')",
137
+ }),
138
+ }),
139
+ execute: async (input: { identifier: string }) => {
140
+ // Determine if it's a DOI or arXiv ID
141
+ const id = input.identifier.trim();
142
+ let url: string;
143
+ if (id.startsWith("10.")) {
144
+ url = `${BASE}/doi/${encodeURIComponent(id)}`;
145
+ } else {
146
+ // arXiv ID — strip any "arXiv:" prefix
147
+ const arxivId = id.replace(/^arXiv:/i, "");
148
+ url = `${BASE}/arxiv/${encodeURIComponent(arxivId)}`;
149
+ }
150
+
151
+ const result = await trackedFetch("inspire_hep", url, undefined, 10_000);
152
+ if (isTrackedError(result)) return result;
153
+ const data = await result.res.json();
154
+
155
+ const meta = data.metadata as Record<string, unknown> | undefined;
156
+ if (!meta) return toolResult({ error: "Paper not found", source: "inspire_hep" });
157
+
158
+ return toolResult({
159
+ ...normalizeHit(meta),
160
+ _latency_ms: result.latency_ms,
161
+ });
162
+ },
163
+ },
164
+ ];
165
+ }
@@ -0,0 +1,158 @@
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.openaire.eu";
6
+
7
+ /**
8
+ * Parse OpenAIRE XML response wrapped in JSON.
9
+ * OpenAIRE returns XML by default; with format=json it wraps XML nodes in JSON objects.
10
+ */
11
+ function parseOpenAireResult(result: Record<string, unknown>): Record<string, unknown> {
12
+ const metadata = result.metadata as Record<string, unknown> | undefined;
13
+ const oafEntity = metadata?.["oaf:entity"] as Record<string, unknown> | undefined;
14
+ const oafResult = oafEntity?.["oaf:result"] as Record<string, unknown> | undefined;
15
+
16
+ if (!oafResult) {
17
+ // Flat JSON format (newer API versions)
18
+ return {
19
+ title: result.title,
20
+ authors: result.authors,
21
+ doi: result.doi,
22
+ url: result.url,
23
+ };
24
+ }
25
+
26
+ // Extract title
27
+ const titleRaw = oafResult.title;
28
+ let title = "";
29
+ if (Array.isArray(titleRaw)) {
30
+ const main = titleRaw.find((t: Record<string, string>) => t["@classid"] === "main title");
31
+ title = (main ?? titleRaw[0])?.["$"] ?? "";
32
+ } else if (typeof titleRaw === "object" && titleRaw !== null) {
33
+ title = (titleRaw as Record<string, string>)["$"] ?? "";
34
+ }
35
+
36
+ // Extract authors
37
+ const creatorsRaw = oafResult.creator;
38
+ const authors: string[] = [];
39
+ if (Array.isArray(creatorsRaw)) {
40
+ for (const c of creatorsRaw) {
41
+ const name = typeof c === "string" ? c : (c as Record<string, string>)["$"];
42
+ if (name) authors.push(name);
43
+ }
44
+ } else if (creatorsRaw) {
45
+ const name = typeof creatorsRaw === "string" ? creatorsRaw : (creatorsRaw as Record<string, string>)["$"];
46
+ if (name) authors.push(name);
47
+ }
48
+
49
+ // Extract DOI and other identifiers
50
+ const pidRaw = oafResult.pid;
51
+ let doi: string | undefined;
52
+ if (Array.isArray(pidRaw)) {
53
+ const doiPid = pidRaw.find((p: Record<string, string>) => p["@classid"] === "doi");
54
+ doi = (doiPid as Record<string, string> | undefined)?.["$"];
55
+ } else if (typeof pidRaw === "object" && pidRaw !== null) {
56
+ if ((pidRaw as Record<string, string>)["@classid"] === "doi") {
57
+ doi = (pidRaw as Record<string, string>)["$"];
58
+ }
59
+ }
60
+
61
+ // Extract dates
62
+ const dateRaw = oafResult.dateofacceptance;
63
+ const date = typeof dateRaw === "string" ? dateRaw : (dateRaw as Record<string, string> | undefined)?.["$"];
64
+
65
+ // Extract best access right
66
+ const accessRaw = oafResult.bestaccessright;
67
+ const isOa = typeof accessRaw === "object" && accessRaw !== null
68
+ ? (accessRaw as Record<string, string>)["@classid"] === "OPEN"
69
+ : false;
70
+
71
+ return {
72
+ title,
73
+ authors,
74
+ doi,
75
+ date,
76
+ is_oa: isOa,
77
+ url: doi ? `https://doi.org/${doi}` : undefined,
78
+ };
79
+ }
80
+
81
+ export function createOpenAireTools(
82
+ _ctx: OpenClawPluginToolContext,
83
+ _api: OpenClawPluginApi,
84
+ ) {
85
+ return [
86
+ {
87
+ name: "search_openaire",
88
+ label: "Search Publications (OpenAIRE)",
89
+ description:
90
+ "Search OpenAIRE for publications (170M+ records). Uniquely supports filtering by EU funding source (EC, NSF, etc.) and project ID.",
91
+ parameters: Type.Object({
92
+ keywords: Type.String({
93
+ description: "Search keywords",
94
+ }),
95
+ author: Type.Optional(Type.String({ description: "Author name" })),
96
+ doi: Type.Optional(Type.String({ description: "DOI" })),
97
+ from_date: Type.Optional(
98
+ Type.String({ description: "From date (YYYY-MM-DD)" }),
99
+ ),
100
+ to_date: Type.Optional(
101
+ Type.String({ description: "To date (YYYY-MM-DD)" }),
102
+ ),
103
+ oa_only: Type.Optional(
104
+ Type.Boolean({ description: "Only open access results" }),
105
+ ),
106
+ funder: Type.Optional(
107
+ Type.String({
108
+ description: "Funder abbreviation: 'EC' (EU), 'NSF', 'NIH', 'UKRI', 'DFG', etc.",
109
+ }),
110
+ ),
111
+ max_results: Type.Optional(
112
+ Type.Number({ description: "Max results (default 10, max 50)" }),
113
+ ),
114
+ }),
115
+ execute: async (input: {
116
+ keywords: string;
117
+ author?: string;
118
+ doi?: string;
119
+ from_date?: string;
120
+ to_date?: string;
121
+ oa_only?: boolean;
122
+ funder?: string;
123
+ max_results?: number;
124
+ }) => {
125
+ const params = new URLSearchParams({
126
+ keywords: input.keywords,
127
+ format: "json",
128
+ size: String(Math.min(input.max_results ?? 10, 50)),
129
+ });
130
+ if (input.author) params.set("author", input.author);
131
+ if (input.doi) params.set("doi", input.doi);
132
+ if (input.from_date) params.set("fromDateAccepted", input.from_date);
133
+ if (input.to_date) params.set("toDateAccepted", input.to_date);
134
+ if (input.oa_only) params.set("OA", "true");
135
+ if (input.funder) params.set("funder", input.funder);
136
+
137
+ const tracked = await trackedFetch("openaire", `${BASE}/search/publications?${params}`, undefined, 15_000);
138
+ if (isTrackedError(tracked)) return tracked;
139
+ const data = await tracked.res.json();
140
+
141
+ const response = data.response as Record<string, unknown> | undefined;
142
+ const header = response?.header as Record<string, unknown> | undefined;
143
+ const total = header?.total as Record<string, string> | undefined;
144
+ const results = response?.results as Record<string, unknown> | undefined;
145
+ const resultList = results?.result;
146
+
147
+ const papers = (Array.isArray(resultList) ? resultList : []).map(
148
+ (r: Record<string, unknown>) => parseOpenAireResult(r),
149
+ );
150
+
151
+ return toolResult({
152
+ total_results: total?.["$"] ? parseInt(total["$"], 10) : papers.length,
153
+ papers,
154
+ });
155
+ },
156
+ },
157
+ ];
158
+ }
@@ -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.openalex.org";
6
6
 
@@ -58,9 +58,9 @@ export function createOpenAlexTools(
58
58
  if (filters.length > 0) params.set("filter", filters.join(","));
59
59
  if (input.sort_by) params.set("sort", input.sort_by);
60
60
 
61
- const res = await fetch(`${BASE}/works?${params}`, { headers });
62
- if (!res.ok) return toolResult({ error: `API error: ${res.status} ${res.statusText}` });
63
- const data = await res.json();
61
+ const tracked = await trackedFetch("openalex", `${BASE}/works?${params}`, { headers });
62
+ if (isTrackedError(tracked)) return tracked;
63
+ const data = await tracked.res.json();
64
64
  return toolResult({
65
65
  total_count: data.meta?.count,
66
66
  results: data.results?.map((w: Record<string, unknown>) => ({
@@ -78,6 +78,7 @@ export function createOpenAlexTools(
78
78
  )
79
79
  : [],
80
80
  })),
81
+ _source_health: { source: "openalex", latency_ms: tracked.latency_ms },
81
82
  });
82
83
  },
83
84
  },
@@ -96,11 +97,9 @@ export function createOpenAlexTools(
96
97
  const id = input.work_id.startsWith("10.")
97
98
  ? `https://doi.org/${input.work_id}`
98
99
  : input.work_id;
99
- const res = await fetch(`${BASE}/works/${encodeURIComponent(id)}`, {
100
- headers,
101
- });
102
- if (!res.ok) return toolResult({ error: `API error: ${res.status} ${res.statusText}` });
103
- const w = await res.json();
100
+ const tracked = await trackedFetch("openalex", `${BASE}/works/${encodeURIComponent(id)}`, { headers });
101
+ if (isTrackedError(tracked)) return tracked;
102
+ const w = await tracked.res.json();
104
103
  return toolResult({
105
104
  id: w.id,
106
105
  doi: w.doi,
@@ -120,6 +119,7 @@ export function createOpenAlexTools(
120
119
  ?.slice(0, 10)
121
120
  .map((c: Record<string, unknown>) => c.display_name),
122
121
  referenced_works_count: w.referenced_works?.length,
122
+ _source_health: { source: "openalex", latency_ms: tracked.latency_ms },
123
123
  });
124
124
  },
125
125
  },
@@ -148,14 +148,18 @@ export function createOpenAlexTools(
148
148
  search: input.author_id,
149
149
  per_page: "5",
150
150
  });
151
- const res = await fetch(`${BASE}/authors?${params}`, { headers });
152
- if (!res.ok) return toolResult({ error: `API error: ${res.status} ${res.statusText}` });
153
- return toolResult(await res.json());
151
+ const tracked = await trackedFetch("openalex", `${BASE}/authors?${params}`, { headers });
152
+ if (isTrackedError(tracked)) return tracked;
153
+ const data = await tracked.res.json();
154
+ return toolResult({
155
+ ...data,
156
+ _source_health: { source: "openalex", latency_ms: tracked.latency_ms },
157
+ });
154
158
  }
155
159
 
156
- const res = await fetch(url, { headers });
157
- if (!res.ok) return toolResult({ error: `API error: ${res.status} ${res.statusText}` });
158
- const a = await res.json();
160
+ const tracked = await trackedFetch("openalex", url, { headers });
161
+ if (isTrackedError(tracked)) return tracked;
162
+ const a = await tracked.res.json();
159
163
  return toolResult({
160
164
  id: a.id,
161
165
  display_name: a.display_name,
@@ -171,6 +175,7 @@ export function createOpenAlexTools(
171
175
  top_concepts: a.x_concepts
172
176
  ?.slice(0, 5)
173
177
  .map((c: Record<string, unknown>) => c.display_name),
178
+ _source_health: { source: "openalex", latency_ms: tracked.latency_ms },
174
179
  });
175
180
  },
176
181
  },