@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.
- package/README.md +32 -56
- package/curated/analysis/README.md +1 -13
- package/curated/domains/README.md +1 -5
- package/curated/literature/README.md +1 -10
- package/curated/research/README.md +1 -18
- package/curated/tools/README.md +1 -12
- package/curated/writing/README.md +1 -5
- package/index.ts +88 -5
- package/openclaw.plugin.json +3 -12
- package/package.json +3 -5
- package/skills/analysis/dataviz/SKILL.md +1 -1
- package/skills/analysis/dataviz/color-accessibility-guide/SKILL.md +1 -1
- package/skills/analysis/dataviz/geospatial-viz-guide/SKILL.md +1 -1
- package/skills/analysis/dataviz/interactive-viz-guide/SKILL.md +1 -1
- package/skills/analysis/dataviz/network-visualization-guide/SKILL.md +1 -1
- package/skills/analysis/dataviz/publication-figures-guide/SKILL.md +1 -1
- package/skills/analysis/econometrics/SKILL.md +1 -1
- package/skills/analysis/econometrics/causal-inference-guide/SKILL.md +1 -1
- package/skills/analysis/econometrics/iv-regression-guide/SKILL.md +1 -1
- package/skills/analysis/econometrics/mostly-harmless-guide/SKILL.md +3 -10
- package/skills/analysis/econometrics/panel-data-analyst/SKILL.md +1 -1
- package/skills/analysis/econometrics/panel-data-guide/SKILL.md +1 -1
- package/skills/analysis/econometrics/stata-accounting-guide/SKILL.md +1 -1
- package/skills/analysis/econometrics/stata-analyst-guide/SKILL.md +1 -1
- package/skills/analysis/econometrics/time-series-guide/SKILL.md +1 -1
- package/skills/analysis/statistics/SKILL.md +2 -2
- package/skills/analysis/statistics/bayesian-statistics-guide/SKILL.md +1 -1
- package/skills/analysis/statistics/meta-analysis-guide/SKILL.md +2 -2
- package/skills/analysis/statistics/nonparametric-tests-guide/SKILL.md +1 -1
- package/skills/analysis/statistics/power-analysis-guide/SKILL.md +1 -1
- package/skills/analysis/statistics/sem-guide/SKILL.md +1 -1
- package/skills/analysis/statistics/survival-analysis-guide/SKILL.md +1 -1
- package/skills/analysis/wrangling/SKILL.md +1 -1
- package/skills/analysis/wrangling/data-cleaning-pipeline/SKILL.md +1 -1
- package/skills/analysis/wrangling/missing-data-handling/SKILL.md +1 -1
- package/skills/analysis/wrangling/questionnaire-design-guide/SKILL.md +1 -1
- package/skills/analysis/wrangling/stata-data-cleaning/SKILL.md +1 -1
- package/skills/analysis/wrangling/survey-data-processing/SKILL.md +1 -1
- package/skills/analysis/wrangling/text-mining-guide/SKILL.md +1 -1
- package/skills/domains/ai-ml/SKILL.md +3 -2
- package/skills/domains/ai-ml/computer-vision-guide/SKILL.md +1 -1
- package/skills/domains/ai-ml/generative-ai-guide/SKILL.md +1 -0
- package/skills/domains/ai-ml/huggingface-api/SKILL.md +251 -0
- package/skills/domains/ai-ml/llm-evaluation-guide/SKILL.md +1 -1
- package/skills/domains/ai-ml/prompt-engineering-research/SKILL.md +1 -1
- package/skills/domains/ai-ml/reinforcement-learning-guide/SKILL.md +1 -1
- package/skills/domains/ai-ml/transformer-architecture-guide/SKILL.md +1 -1
- package/skills/domains/biomedical/SKILL.md +9 -2
- package/skills/domains/biomedical/alphafold-api/SKILL.md +227 -0
- package/skills/domains/biomedical/biothings-api/SKILL.md +296 -0
- package/skills/domains/biomedical/clinical-research-guide/SKILL.md +1 -1
- package/skills/domains/biomedical/clinicaltrials-api-v2/SKILL.md +216 -0
- package/skills/domains/biomedical/enrichr-api/SKILL.md +264 -0
- package/skills/domains/biomedical/ensembl-rest-api/SKILL.md +204 -0
- package/skills/domains/biomedical/epidemiology-guide/SKILL.md +1 -1
- package/skills/domains/biomedical/genomics-analysis-guide/SKILL.md +1 -1
- package/skills/domains/biomedical/medical-data-api/SKILL.md +197 -0
- package/skills/domains/biomedical/medical-imaging-guide/SKILL.md +1 -1
- package/skills/domains/biomedical/pdb-structure-api/SKILL.md +219 -0
- package/skills/domains/business/SKILL.md +2 -3
- package/skills/domains/business/innovation-management-guide/SKILL.md +1 -1
- package/skills/domains/business/market-analysis-guide/SKILL.md +1 -1
- package/skills/domains/business/operations-research-guide/SKILL.md +1 -1
- package/skills/domains/business/strategic-management-guide/SKILL.md +1 -1
- package/skills/domains/chemistry/SKILL.md +3 -2
- package/skills/domains/chemistry/catalysis-hub-api/SKILL.md +171 -0
- package/skills/domains/chemistry/molecular-dynamics-guide/SKILL.md +1 -1
- package/skills/domains/chemistry/retrosynthesis-guide/SKILL.md +1 -1
- package/skills/domains/chemistry/spectroscopy-analysis-guide/SKILL.md +1 -1
- package/skills/domains/cs/SKILL.md +1 -1
- package/skills/domains/cs/algorithms-complexity-guide/SKILL.md +1 -1
- package/skills/domains/cs/distributed-systems-guide/SKILL.md +1 -1
- package/skills/domains/cs/formal-verification-guide/SKILL.md +1 -1
- package/skills/domains/cs/software-engineering-research/SKILL.md +1 -1
- package/skills/domains/ecology/SKILL.md +1 -1
- package/skills/domains/ecology/biodiversity-data-guide/SKILL.md +1 -1
- package/skills/domains/ecology/conservation-biology-guide/SKILL.md +1 -1
- package/skills/domains/ecology/species-distribution-guide/SKILL.md +1 -1
- package/skills/domains/economics/SKILL.md +1 -1
- package/skills/domains/economics/behavioral-economics-guide/SKILL.md +1 -1
- package/skills/domains/economics/development-economics-guide/SKILL.md +1 -1
- package/skills/domains/education/SKILL.md +2 -3
- package/skills/domains/education/assessment-design-guide/SKILL.md +1 -1
- package/skills/domains/education/curriculum-design-guide/SKILL.md +1 -1
- package/skills/domains/education/educational-research-methods/SKILL.md +1 -1
- package/skills/domains/education/learning-science-guide/SKILL.md +1 -1
- package/skills/domains/education/mooc-analytics-guide/SKILL.md +1 -1
- package/skills/domains/finance/SKILL.md +1 -1
- package/skills/domains/finance/financial-data-analysis/SKILL.md +1 -1
- package/skills/domains/finance/portfolio-optimization-guide/SKILL.md +1 -1
- package/skills/domains/finance/quantitative-finance-guide/SKILL.md +1 -1
- package/skills/domains/finance/risk-modeling-guide/SKILL.md +1 -1
- package/skills/domains/geoscience/SKILL.md +1 -1
- package/skills/domains/geoscience/climate-modeling-guide/SKILL.md +1 -1
- package/skills/domains/geoscience/climate-science-guide/SKILL.md +1 -1
- package/skills/domains/geoscience/gis-remote-sensing-guide/SKILL.md +1 -1
- package/skills/domains/geoscience/satellite-remote-sensing/SKILL.md +1 -1
- package/skills/domains/geoscience/seismology-data-guide/SKILL.md +1 -1
- package/skills/domains/humanities/SKILL.md +1 -1
- package/skills/domains/humanities/digital-humanities-guide/SKILL.md +1 -1
- package/skills/domains/humanities/ethical-philosophy-guide/SKILL.md +1 -1
- package/skills/domains/humanities/philosophy-research-guide/SKILL.md +1 -1
- package/skills/domains/law/SKILL.md +3 -2
- package/skills/domains/law/legal-nlp-guide/SKILL.md +1 -1
- package/skills/domains/law/legal-research-guide/SKILL.md +1 -1
- package/skills/domains/law/patent-analysis-guide/SKILL.md +1 -1
- package/skills/domains/law/regulatory-compliance-guide/SKILL.md +1 -1
- package/skills/domains/law/uk-legislation-api/SKILL.md +179 -0
- package/skills/domains/math/SKILL.md +1 -1
- package/skills/domains/math/numerical-methods-guide/SKILL.md +1 -1
- package/skills/domains/math/symbolic-computation-guide/SKILL.md +1 -1
- package/skills/domains/math/topology-data-analysis/SKILL.md +1 -1
- package/skills/domains/pharma/SKILL.md +1 -1
- package/skills/domains/pharma/clinical-pharmacology-guide/SKILL.md +1 -1
- package/skills/domains/pharma/clinical-trial-design-guide/SKILL.md +1 -1
- package/skills/domains/pharma/drug-development-guide/SKILL.md +1 -1
- package/skills/domains/pharma/drug-target-interaction/SKILL.md +1 -1
- package/skills/domains/pharma/pharmacovigilance-guide/SKILL.md +1 -1
- package/skills/domains/physics/SKILL.md +1 -1
- package/skills/domains/physics/astrophysics-data-guide/SKILL.md +1 -1
- package/skills/domains/physics/computational-physics-guide/SKILL.md +1 -1
- package/skills/domains/physics/particle-physics-guide/SKILL.md +1 -1
- package/skills/domains/physics/quantum-computing-guide/SKILL.md +1 -1
- package/skills/domains/social-science/SKILL.md +1 -1
- package/skills/domains/social-science/network-analysis-guide/SKILL.md +1 -1
- package/skills/domains/social-science/social-research-methods/SKILL.md +1 -1
- package/skills/domains/social-science/survey-research-guide/SKILL.md +1 -1
- package/skills/literature/discovery/SKILL.md +1 -1
- package/skills/literature/discovery/citation-alert-guide/SKILL.md +1 -1
- package/skills/literature/discovery/conference-proceedings-guide/SKILL.md +1 -1
- package/skills/literature/discovery/literature-mapping-guide/SKILL.md +1 -1
- package/skills/literature/discovery/rss-paper-feeds/SKILL.md +1 -1
- package/skills/literature/discovery/semantic-scholar-recs-guide/SKILL.md +1 -1
- package/skills/literature/discovery/zotero-arxiv-daily-guide/SKILL.md +3 -3
- package/skills/literature/fulltext/SKILL.md +3 -2
- package/skills/literature/fulltext/arxiv-latex-source/SKILL.md +195 -0
- package/skills/literature/fulltext/interlibrary-loan-guide/SKILL.md +1 -1
- package/skills/literature/fulltext/open-access-guide/SKILL.md +1 -1
- package/skills/literature/fulltext/open-access-mining-guide/SKILL.md +1 -1
- package/skills/literature/fulltext/preprint-servers-guide/SKILL.md +1 -1
- package/skills/literature/metadata/SKILL.md +1 -1
- package/skills/literature/metadata/altmetrics-guide/SKILL.md +1 -1
- package/skills/literature/metadata/doi-resolution-guide/SKILL.md +1 -1
- package/skills/literature/metadata/h-index-guide/SKILL.md +1 -1
- package/skills/literature/metadata/journal-metrics-guide/SKILL.md +1 -1
- package/skills/literature/metadata/orcid-integration-guide/SKILL.md +1 -1
- package/skills/literature/search/SKILL.md +2 -3
- package/skills/literature/search/arxiv-batch-reporting/SKILL.md +2 -2
- package/skills/literature/search/boolean-search-guide/SKILL.md +1 -1
- package/skills/literature/search/citation-chaining-guide/SKILL.md +1 -1
- package/skills/literature/search/database-comparison-guide/SKILL.md +1 -1
- package/skills/literature/search/deep-literature-search/SKILL.md +2 -2
- package/skills/literature/search/google-scholar-guide/SKILL.md +1 -1
- package/skills/literature/search/mesh-terms-guide/SKILL.md +1 -1
- package/skills/literature/search/systematic-search-strategy/SKILL.md +1 -1
- package/skills/research/automation/SKILL.md +1 -1
- package/skills/research/automation/data-collection-automation/SKILL.md +1 -1
- package/skills/research/automation/datagen-research-guide/SKILL.md +1 -0
- package/skills/research/automation/mle-agent-guide/SKILL.md +1 -0
- package/skills/research/automation/paper-to-agent-guide/SKILL.md +1 -0
- package/skills/research/automation/research-workflow-automation/SKILL.md +1 -1
- package/skills/research/deep-research/SKILL.md +1 -1
- package/skills/research/deep-research/auto-deep-research-guide/SKILL.md +1 -0
- package/skills/research/deep-research/meta-synthesis-guide/SKILL.md +1 -1
- package/skills/research/deep-research/scoping-review-guide/SKILL.md +1 -1
- package/skills/research/deep-research/systematic-review-guide/SKILL.md +1 -1
- package/skills/research/funding/SKILL.md +1 -1
- package/skills/research/funding/eu-horizon-guide/SKILL.md +1 -1
- package/skills/research/funding/grant-budget-guide/SKILL.md +1 -1
- package/skills/research/funding/grant-writing-guide/SKILL.md +1 -1
- package/skills/research/funding/nsf-grant-guide/SKILL.md +1 -1
- package/skills/research/funding/open-science-guide/SKILL.md +1 -1
- package/skills/research/methodology/SKILL.md +2 -2
- package/skills/research/methodology/action-research-guide/SKILL.md +1 -1
- package/skills/research/methodology/claude-scientific-guide/SKILL.md +1 -0
- package/skills/research/methodology/experimental-design-guide/SKILL.md +1 -1
- package/skills/research/methodology/grounded-theory-guide/SKILL.md +1 -1
- package/skills/research/methodology/mixed-methods-guide/SKILL.md +1 -1
- package/skills/research/methodology/qualitative-research-guide/SKILL.md +2 -2
- package/skills/research/methodology/research-paper-kb/SKILL.md +2 -2
- package/skills/research/methodology/research-town-guide/SKILL.md +3 -3
- package/skills/research/methodology/scientify-idea-generation/SKILL.md +1 -1
- package/skills/research/paper-review/SKILL.md +2 -2
- package/skills/research/paper-review/automated-review-guide/SKILL.md +1 -1
- package/skills/research/paper-review/paper-reading-assistant/SKILL.md +1 -1
- package/skills/research/paper-review/peer-review-guide/SKILL.md +2 -2
- package/skills/research/paper-review/rebuttal-writing-guide/SKILL.md +1 -1
- package/skills/research/paper-review/review-response-guide/SKILL.md +1 -1
- package/skills/research/paper-review/scientify-write-review-paper/SKILL.md +1 -1
- package/skills/tools/code-exec/SKILL.md +1 -1
- package/skills/tools/code-exec/google-colab-guide/SKILL.md +1 -1
- package/skills/tools/code-exec/jupyter-notebook-guide/SKILL.md +1 -1
- package/skills/tools/code-exec/overleaf-cli-guide/SKILL.md +1 -1
- package/skills/tools/code-exec/python-reproducibility-guide/SKILL.md +1 -1
- package/skills/tools/code-exec/r-reproducibility-guide/SKILL.md +1 -1
- package/skills/tools/code-exec/sandbox-execution-guide/SKILL.md +1 -1
- package/skills/tools/diagram/SKILL.md +1 -1
- package/skills/tools/diagram/code-flow-visualizer/SKILL.md +1 -1
- package/skills/tools/diagram/excalidraw-diagram-guide/SKILL.md +1 -1
- package/skills/tools/diagram/mermaid-architect-guide/SKILL.md +1 -1
- package/skills/tools/diagram/plantuml-guide/SKILL.md +1 -1
- package/skills/tools/diagram/scientific-illustration-guide/SKILL.md +1 -1
- package/skills/tools/document/SKILL.md +1 -1
- package/skills/tools/document/large-document-reader/SKILL.md +2 -2
- package/skills/tools/document/markdown-academic-guide/SKILL.md +1 -1
- package/skills/tools/document/paper-parse-guide/SKILL.md +2 -2
- package/skills/tools/document/pdf-extraction-guide/SKILL.md +1 -1
- package/skills/tools/knowledge-graph/SKILL.md +2 -3
- package/skills/tools/knowledge-graph/citation-network-builder/SKILL.md +1 -1
- package/skills/tools/knowledge-graph/concept-map-generator/SKILL.md +1 -1
- package/skills/tools/knowledge-graph/ontology-design-guide/SKILL.md +1 -1
- package/skills/tools/knowledge-graph/rag-methodology-guide/SKILL.md +1 -1
- package/skills/tools/ocr-translate/SKILL.md +1 -1
- package/skills/tools/ocr-translate/handwriting-recognition-guide/SKILL.md +1 -1
- package/skills/tools/ocr-translate/latex-ocr-guide/SKILL.md +1 -1
- package/skills/tools/ocr-translate/multilingual-research-guide/SKILL.md +1 -1
- package/skills/tools/ocr-translate/zotero-pdf2zh-guide/SKILL.md +1 -0
- package/skills/tools/scraping/SKILL.md +1 -1
- package/skills/tools/scraping/dataset-finder-guide/SKILL.md +2 -2
- package/skills/tools/scraping/google-scholar-scraper/SKILL.md +1 -1
- package/skills/tools/scraping/repository-harvesting-guide/SKILL.md +1 -1
- package/skills/tools/scraping/web-scraping-ethics-guide/SKILL.md +1 -1
- package/skills/writing/citation/SKILL.md +1 -1
- package/skills/writing/citation/academic-citation-manager/SKILL.md +2 -2
- package/skills/writing/citation/bibtex-management-guide/SKILL.md +1 -1
- package/skills/writing/citation/citation-style-guide/SKILL.md +1 -1
- package/skills/writing/citation/mendeley-api/SKILL.md +2 -2
- package/skills/writing/citation/obsidian-citation-guide/SKILL.md +1 -0
- package/skills/writing/citation/obsidian-zotero-guide/SKILL.md +1 -0
- package/skills/writing/citation/papersgpt-zotero-guide/SKILL.md +1 -0
- package/skills/writing/citation/reference-manager-comparison/SKILL.md +1 -1
- package/skills/writing/citation/zotero-mdnotes-guide/SKILL.md +1 -0
- package/skills/writing/citation/zotero-reference-guide/SKILL.md +1 -0
- package/skills/writing/composition/SKILL.md +1 -1
- package/skills/writing/composition/abstract-writing-guide/SKILL.md +1 -1
- package/skills/writing/composition/discussion-writing-guide/SKILL.md +1 -1
- package/skills/writing/composition/introduction-writing-guide/SKILL.md +1 -1
- package/skills/writing/composition/literature-review-writing/SKILL.md +1 -1
- package/skills/writing/composition/methods-section-guide/SKILL.md +1 -1
- package/skills/writing/composition/response-to-reviewers/SKILL.md +1 -1
- package/skills/writing/composition/scientific-writing-resources/SKILL.md +1 -0
- package/skills/writing/latex/SKILL.md +1 -1
- package/skills/writing/latex/bibliography-management-guide/SKILL.md +1 -1
- package/skills/writing/latex/latex-drawing-collection/SKILL.md +1 -0
- package/skills/writing/latex/latex-templates-collection/SKILL.md +1 -0
- package/skills/writing/latex/math-typesetting-guide/SKILL.md +1 -1
- package/skills/writing/latex/overleaf-collaboration-guide/SKILL.md +1 -1
- package/skills/writing/latex/tex-render-guide/SKILL.md +2 -2
- package/skills/writing/latex/tikz-diagrams-guide/SKILL.md +1 -1
- package/skills/writing/polish/SKILL.md +1 -1
- package/skills/writing/polish/academic-tone-guide/SKILL.md +1 -1
- package/skills/writing/polish/academic-translation-guide/SKILL.md +1 -1
- package/skills/writing/polish/ai-writing-humanizer/SKILL.md +1 -1
- package/skills/writing/polish/conciseness-editing-guide/SKILL.md +1 -1
- package/skills/writing/polish/grammar-checker-guide/SKILL.md +1 -1
- package/skills/writing/polish/paper-polish-guide/SKILL.md +2 -2
- package/skills/writing/polish/plagiarism-detection-guide/SKILL.md +1 -1
- package/skills/writing/templates/SKILL.md +1 -1
- package/skills/writing/templates/beamer-presentation-guide/SKILL.md +1 -1
- package/skills/writing/templates/conference-paper-template/SKILL.md +1 -1
- package/skills/writing/templates/novathesis-guide/SKILL.md +1 -0
- package/skills/writing/templates/thesis-template-guide/SKILL.md +1 -1
- package/src/tools/arxiv.ts +78 -30
- package/src/tools/biorxiv.ts +142 -0
- package/src/tools/crossref.ts +60 -22
- package/src/tools/datacite.ts +188 -0
- package/src/tools/dblp.ts +125 -0
- package/src/tools/doaj.ts +82 -0
- package/src/tools/europe-pmc.ts +159 -0
- package/src/tools/hal.ts +118 -0
- package/src/tools/inspire-hep.ts +165 -0
- package/src/tools/openaire.ts +158 -0
- package/src/tools/openalex.ts +20 -15
- package/src/tools/opencitations.ts +103 -0
- package/src/tools/orcid.ts +136 -0
- package/src/tools/osf-preprints.ts +104 -0
- package/src/tools/pubmed.ts +19 -13
- package/src/tools/ror.ts +118 -0
- package/src/tools/unpaywall.ts +12 -6
- package/src/tools/util.ts +141 -0
- package/src/tools/zenodo.ts +154 -0
- package/mcp-configs/academic-db/ChatSpatial.json +0 -17
- package/mcp-configs/academic-db/academia-mcp.json +0 -17
- package/mcp-configs/academic-db/academic-paper-explorer.json +0 -17
- package/mcp-configs/academic-db/academic-search-mcp-server.json +0 -17
- package/mcp-configs/academic-db/agentinterviews-mcp.json +0 -17
- package/mcp-configs/academic-db/all-in-mcp.json +0 -17
- package/mcp-configs/academic-db/alphafold-mcp.json +0 -20
- package/mcp-configs/academic-db/apple-health-mcp.json +0 -17
- package/mcp-configs/academic-db/arxiv-latex-mcp.json +0 -17
- package/mcp-configs/academic-db/arxiv-mcp-server.json +0 -17
- package/mcp-configs/academic-db/bgpt-mcp.json +0 -17
- package/mcp-configs/academic-db/biomcp.json +0 -17
- package/mcp-configs/academic-db/biothings-mcp.json +0 -17
- package/mcp-configs/academic-db/brightspace-mcp.json +0 -21
- package/mcp-configs/academic-db/catalysishub-mcp-server.json +0 -17
- package/mcp-configs/academic-db/climatiq-mcp.json +0 -20
- package/mcp-configs/academic-db/clinicaltrialsgov-mcp-server.json +0 -17
- package/mcp-configs/academic-db/deep-research-mcp.json +0 -17
- package/mcp-configs/academic-db/dicom-mcp.json +0 -17
- package/mcp-configs/academic-db/enrichr-mcp-server.json +0 -17
- package/mcp-configs/academic-db/fec-mcp-server.json +0 -17
- package/mcp-configs/academic-db/fhir-mcp-server-themomentum.json +0 -17
- package/mcp-configs/academic-db/fhir-mcp.json +0 -19
- package/mcp-configs/academic-db/gget-mcp.json +0 -17
- package/mcp-configs/academic-db/gibs-mcp.json +0 -20
- package/mcp-configs/academic-db/gis-mcp-server.json +0 -22
- package/mcp-configs/academic-db/google-earth-engine-mcp.json +0 -21
- package/mcp-configs/academic-db/google-researcher-mcp.json +0 -17
- package/mcp-configs/academic-db/idea-reality-mcp.json +0 -17
- package/mcp-configs/academic-db/legiscan-mcp.json +0 -19
- package/mcp-configs/academic-db/lex.json +0 -17
- package/mcp-configs/academic-db/m4-clinical-mcp.json +0 -21
- package/mcp-configs/academic-db/medical-mcp.json +0 -21
- package/mcp-configs/academic-db/nexonco-mcp.json +0 -20
- package/mcp-configs/academic-db/omop-mcp.json +0 -20
- package/mcp-configs/academic-db/onekgpd-mcp.json +0 -20
- package/mcp-configs/academic-db/openedu-mcp.json +0 -20
- package/mcp-configs/academic-db/opengenes-mcp.json +0 -20
- package/mcp-configs/academic-db/openstax-mcp.json +0 -21
- package/mcp-configs/academic-db/openstreetmap-mcp.json +0 -21
- package/mcp-configs/academic-db/opentargets-mcp.json +0 -21
- package/mcp-configs/academic-db/pdb-mcp.json +0 -21
- package/mcp-configs/academic-db/smithsonian-mcp.json +0 -20
- package/mcp-configs/ai-platform/Adaptive-Graph-of-Thoughts-MCP-server.json +0 -17
- package/mcp-configs/ai-platform/ai-counsel.json +0 -17
- package/mcp-configs/ai-platform/atlas-mcp-server.json +0 -17
- package/mcp-configs/ai-platform/counsel-mcp.json +0 -17
- package/mcp-configs/ai-platform/cross-llm-mcp.json +0 -17
- package/mcp-configs/ai-platform/gptr-mcp.json +0 -17
- package/mcp-configs/ai-platform/magi-researchers.json +0 -21
- package/mcp-configs/ai-platform/mcp-academic-researcher.json +0 -22
- package/mcp-configs/ai-platform/open-paper-machine.json +0 -21
- package/mcp-configs/ai-platform/paper-intelligence.json +0 -21
- package/mcp-configs/ai-platform/paper-reader.json +0 -21
- package/mcp-configs/ai-platform/paperdebugger.json +0 -21
- package/mcp-configs/browser/decipher-research-agent.json +0 -17
- package/mcp-configs/browser/deep-research.json +0 -17
- package/mcp-configs/browser/everything-claude-code.json +0 -17
- package/mcp-configs/browser/exa-mcp.json +0 -20
- package/mcp-configs/browser/gpt-researcher.json +0 -17
- package/mcp-configs/browser/heurist-agent-framework.json +0 -17
- package/mcp-configs/browser/mcp-searxng.json +0 -21
- package/mcp-configs/browser/mcp-webresearch.json +0 -20
- package/mcp-configs/cloud-docs/confluence-mcp.json +0 -37
- package/mcp-configs/cloud-docs/google-drive-mcp.json +0 -35
- package/mcp-configs/cloud-docs/notion-mcp.json +0 -29
- package/mcp-configs/communication/discord-mcp.json +0 -29
- package/mcp-configs/communication/discourse-mcp.json +0 -21
- package/mcp-configs/communication/slack-mcp.json +0 -29
- package/mcp-configs/communication/telegram-mcp.json +0 -28
- package/mcp-configs/data-platform/4everland-hosting-mcp.json +0 -17
- package/mcp-configs/data-platform/automl-stat-mcp.json +0 -21
- package/mcp-configs/data-platform/context-keeper.json +0 -17
- package/mcp-configs/data-platform/context7.json +0 -19
- package/mcp-configs/data-platform/contextstream-mcp.json +0 -17
- package/mcp-configs/data-platform/email-mcp.json +0 -17
- package/mcp-configs/data-platform/jefferson-stats-mcp.json +0 -22
- package/mcp-configs/data-platform/mcp-excel-server.json +0 -21
- package/mcp-configs/data-platform/mcp-stata.json +0 -21
- package/mcp-configs/data-platform/mcpstack-jupyter.json +0 -21
- package/mcp-configs/data-platform/ml-mcp.json +0 -21
- package/mcp-configs/data-platform/nasdaq-data-link-mcp.json +0 -20
- package/mcp-configs/data-platform/numpy-mcp.json +0 -21
- package/mcp-configs/database/neo4j-mcp.json +0 -37
- package/mcp-configs/database/postgres-mcp.json +0 -28
- package/mcp-configs/database/sqlite-mcp.json +0 -29
- package/mcp-configs/dev-platform/geogebra-mcp.json +0 -21
- package/mcp-configs/dev-platform/github-mcp.json +0 -31
- package/mcp-configs/dev-platform/gitlab-mcp.json +0 -34
- package/mcp-configs/dev-platform/latex-mcp-server.json +0 -21
- package/mcp-configs/dev-platform/manim-mcp.json +0 -20
- package/mcp-configs/dev-platform/mcp-echarts.json +0 -20
- package/mcp-configs/dev-platform/panel-viz-mcp.json +0 -20
- package/mcp-configs/dev-platform/paperbanana.json +0 -20
- package/mcp-configs/dev-platform/texflow-mcp.json +0 -20
- package/mcp-configs/dev-platform/texmcp.json +0 -20
- package/mcp-configs/dev-platform/typst-mcp.json +0 -21
- package/mcp-configs/dev-platform/vizro-mcp.json +0 -20
- package/mcp-configs/email/email-mcp.json +0 -40
- package/mcp-configs/email/gmail-mcp.json +0 -37
- package/mcp-configs/note-knowledge/ApeRAG.json +0 -17
- package/mcp-configs/note-knowledge/In-Memoria.json +0 -17
- package/mcp-configs/note-knowledge/agent-memory.json +0 -17
- package/mcp-configs/note-knowledge/aimemo.json +0 -17
- package/mcp-configs/note-knowledge/biel-mcp.json +0 -19
- package/mcp-configs/note-knowledge/cognee.json +0 -17
- package/mcp-configs/note-knowledge/context-awesome.json +0 -17
- package/mcp-configs/note-knowledge/context-mcp.json +0 -17
- package/mcp-configs/note-knowledge/conversation-handoff-mcp.json +0 -17
- package/mcp-configs/note-knowledge/cortex.json +0 -17
- package/mcp-configs/note-knowledge/devrag.json +0 -17
- package/mcp-configs/note-knowledge/easy-obsidian-mcp.json +0 -17
- package/mcp-configs/note-knowledge/engram.json +0 -17
- package/mcp-configs/note-knowledge/gnosis-mcp.json +0 -17
- package/mcp-configs/note-knowledge/graphlit-mcp-server.json +0 -19
- package/mcp-configs/note-knowledge/local-faiss-mcp.json +0 -21
- package/mcp-configs/note-knowledge/mcp-memory-service.json +0 -21
- package/mcp-configs/note-knowledge/mcp-obsidian.json +0 -23
- package/mcp-configs/note-knowledge/mcp-ragdocs.json +0 -20
- package/mcp-configs/note-knowledge/mcp-summarizer.json +0 -21
- package/mcp-configs/note-knowledge/mediawiki-mcp.json +0 -21
- package/mcp-configs/note-knowledge/openzim-mcp.json +0 -20
- package/mcp-configs/note-knowledge/zettelkasten-mcp.json +0 -21
- package/mcp-configs/reference-mgr/academic-paper-mcp-http.json +0 -20
- package/mcp-configs/reference-mgr/academix.json +0 -20
- package/mcp-configs/reference-mgr/arxiv-cli.json +0 -17
- package/mcp-configs/reference-mgr/arxiv-research-mcp.json +0 -21
- package/mcp-configs/reference-mgr/arxiv-search-mcp.json +0 -17
- package/mcp-configs/reference-mgr/chiken.json +0 -17
- package/mcp-configs/reference-mgr/claude-scholar.json +0 -17
- package/mcp-configs/reference-mgr/devonthink-mcp.json +0 -17
- package/mcp-configs/reference-mgr/google-scholar-abstract-mcp.json +0 -19
- package/mcp-configs/reference-mgr/google-scholar-mcp.json +0 -20
- package/mcp-configs/reference-mgr/mcp-paperswithcode.json +0 -21
- package/mcp-configs/reference-mgr/mcp-scholarly.json +0 -20
- package/mcp-configs/reference-mgr/mcp-simple-arxiv.json +0 -20
- package/mcp-configs/reference-mgr/mcp-simple-pubmed.json +0 -20
- package/mcp-configs/reference-mgr/mcp-zotero.json +0 -21
- package/mcp-configs/reference-mgr/mendeley-mcp.json +0 -20
- package/mcp-configs/reference-mgr/ncbi-mcp-server.json +0 -22
- package/mcp-configs/reference-mgr/onecite.json +0 -21
- package/mcp-configs/reference-mgr/paper-search-mcp.json +0 -21
- package/mcp-configs/reference-mgr/pubmed-search-mcp.json +0 -21
- package/mcp-configs/reference-mgr/scholar-mcp.json +0 -21
- package/mcp-configs/reference-mgr/scholar-multi-mcp.json +0 -21
- package/mcp-configs/reference-mgr/seerai.json +0 -21
- package/mcp-configs/reference-mgr/semantic-scholar-fastmcp.json +0 -21
- package/mcp-configs/reference-mgr/sourcelibrary.json +0 -20
- package/mcp-configs/registry.json +0 -476
- package/mcp-configs/repository/dataverse-mcp.json +0 -33
- package/mcp-configs/repository/huggingface-mcp.json +0 -29
- package/skills/domains/business/xpert-bi-guide/SKILL.md +0 -84
- package/skills/domains/education/edumcp-guide/SKILL.md +0 -74
- package/skills/literature/search/paper-search-mcp-guide/SKILL.md +0 -107
- package/skills/tools/knowledge-graph/paperpile-notion-guide/SKILL.md +0 -84
- package/src/tools/semantic-scholar.ts +0 -112
|
@@ -0,0 +1,103 @@
|
|
|
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.opencitations.net";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Extract DOI from OpenCitations multi-identifier string.
|
|
9
|
+
* Format: "omid:br/... doi:10.1038/nature12373 openalex:W..."
|
|
10
|
+
*/
|
|
11
|
+
function extractDoi(multiId: string): string | undefined {
|
|
12
|
+
const match = multiId.match(/doi:(10\.\S+)/);
|
|
13
|
+
return match ? match[1] : undefined;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function createOpenCitationsTools(
|
|
17
|
+
_ctx: OpenClawPluginToolContext,
|
|
18
|
+
_api: OpenClawPluginApi,
|
|
19
|
+
) {
|
|
20
|
+
return [
|
|
21
|
+
{
|
|
22
|
+
name: "get_citations_open",
|
|
23
|
+
label: "Get Citations (OpenCitations)",
|
|
24
|
+
description:
|
|
25
|
+
"Get all papers citing a given DOI using OpenCitations (2B+ open citation links). Works across all disciplines.",
|
|
26
|
+
parameters: Type.Object({
|
|
27
|
+
doi: Type.String({
|
|
28
|
+
description: "DOI of the paper, e.g. '10.1038/nature12373'",
|
|
29
|
+
}),
|
|
30
|
+
}),
|
|
31
|
+
execute: async (input: { doi: string }) => {
|
|
32
|
+
const doi = input.doi.replace(/^https?:\/\/doi\.org\//, "");
|
|
33
|
+
const tracked = await trackedFetch("opencitations", `${BASE}/index/v2/citations/doi:${encodeURIComponent(doi)}`);
|
|
34
|
+
if (isTrackedError(tracked)) return tracked;
|
|
35
|
+
const data = await tracked.res.json();
|
|
36
|
+
|
|
37
|
+
if (!Array.isArray(data)) return toolResult({ error: "Unexpected response format" });
|
|
38
|
+
|
|
39
|
+
return toolResult({
|
|
40
|
+
total_citations: data.length,
|
|
41
|
+
citations: data.slice(0, 100).map((c: Record<string, string>) => ({
|
|
42
|
+
citing_doi: extractDoi(c.citing ?? ""),
|
|
43
|
+
cited_doi: extractDoi(c.cited ?? ""),
|
|
44
|
+
creation_date: c.creation,
|
|
45
|
+
})),
|
|
46
|
+
_source_health: { source: "opencitations", latency_ms: tracked.latency_ms },
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "get_references_open",
|
|
52
|
+
label: "Get References (OpenCitations)",
|
|
53
|
+
description:
|
|
54
|
+
"Get all references of a paper by DOI. Shows what a paper cites.",
|
|
55
|
+
parameters: Type.Object({
|
|
56
|
+
doi: Type.String({
|
|
57
|
+
description: "DOI of the paper, e.g. '10.1038/nature12373'",
|
|
58
|
+
}),
|
|
59
|
+
}),
|
|
60
|
+
execute: async (input: { doi: string }) => {
|
|
61
|
+
const doi = input.doi.replace(/^https?:\/\/doi\.org\//, "");
|
|
62
|
+
const tracked = await trackedFetch("opencitations", `${BASE}/index/v2/references/doi:${encodeURIComponent(doi)}`);
|
|
63
|
+
if (isTrackedError(tracked)) return tracked;
|
|
64
|
+
const data = await tracked.res.json();
|
|
65
|
+
|
|
66
|
+
if (!Array.isArray(data)) return toolResult({ error: "Unexpected response format" });
|
|
67
|
+
|
|
68
|
+
return toolResult({
|
|
69
|
+
total_references: data.length,
|
|
70
|
+
references: data.slice(0, 100).map((r: Record<string, string>) => ({
|
|
71
|
+
cited_doi: extractDoi(r.cited ?? ""),
|
|
72
|
+
citing_doi: extractDoi(r.citing ?? ""),
|
|
73
|
+
creation_date: r.creation,
|
|
74
|
+
})),
|
|
75
|
+
_source_health: { source: "opencitations", latency_ms: tracked.latency_ms },
|
|
76
|
+
});
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: "get_citation_count",
|
|
81
|
+
label: "Get Citation Count (OpenCitations)",
|
|
82
|
+
description:
|
|
83
|
+
"Get the total citation count for a DOI from OpenCitations open data.",
|
|
84
|
+
parameters: Type.Object({
|
|
85
|
+
doi: Type.String({
|
|
86
|
+
description: "DOI of the paper, e.g. '10.1038/nature12373'",
|
|
87
|
+
}),
|
|
88
|
+
}),
|
|
89
|
+
execute: async (input: { doi: string }) => {
|
|
90
|
+
const doi = input.doi.replace(/^https?:\/\/doi\.org\//, "");
|
|
91
|
+
const tracked = await trackedFetch("opencitations", `${BASE}/index/v2/citation-count/doi:${encodeURIComponent(doi)}`);
|
|
92
|
+
if (isTrackedError(tracked)) return tracked;
|
|
93
|
+
const data = await tracked.res.json();
|
|
94
|
+
|
|
95
|
+
const count = Array.isArray(data) && data[0]?.count
|
|
96
|
+
? parseInt(data[0].count, 10)
|
|
97
|
+
: 0;
|
|
98
|
+
|
|
99
|
+
return toolResult({ doi, citation_count: count, _source_health: { source: "opencitations", latency_ms: tracked.latency_ms } });
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
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://pub.orcid.org/v3.0";
|
|
6
|
+
|
|
7
|
+
const HEADERS: Record<string, string> = {
|
|
8
|
+
Accept: "application/json",
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export function createOrcidTools(
|
|
12
|
+
_ctx: OpenClawPluginToolContext,
|
|
13
|
+
_api: OpenClawPluginApi,
|
|
14
|
+
) {
|
|
15
|
+
return [
|
|
16
|
+
{
|
|
17
|
+
name: "search_orcid",
|
|
18
|
+
label: "Search Researchers (ORCID)",
|
|
19
|
+
description:
|
|
20
|
+
"Search the ORCID registry for researchers by name, affiliation, or keyword. Returns ORCID iDs that can be used with get_orcid_works.",
|
|
21
|
+
parameters: Type.Object({
|
|
22
|
+
query: Type.String({
|
|
23
|
+
description:
|
|
24
|
+
"Lucene-style query. Supports fields: family-name, given-names, affiliation-org-name, keyword, orcid, ringgold-org-id. E.g. 'family-name:Smith AND affiliation-org-name:MIT'",
|
|
25
|
+
}),
|
|
26
|
+
limit: Type.Optional(
|
|
27
|
+
Type.Number({ description: "Max results (default 10, max 100)" }),
|
|
28
|
+
),
|
|
29
|
+
}),
|
|
30
|
+
execute: async (input: { query: string; limit?: number }) => {
|
|
31
|
+
const params = new URLSearchParams({
|
|
32
|
+
q: input.query,
|
|
33
|
+
rows: String(Math.min(input.limit ?? 10, 100)),
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const result = await trackedFetch(
|
|
37
|
+
"orcid",
|
|
38
|
+
`${BASE}/search/?${params}`,
|
|
39
|
+
{ headers: HEADERS },
|
|
40
|
+
10_000,
|
|
41
|
+
);
|
|
42
|
+
if (isTrackedError(result)) return result;
|
|
43
|
+
const data = await result.res.json();
|
|
44
|
+
|
|
45
|
+
const researchers = (data.result ?? []).map(
|
|
46
|
+
(r: Record<string, unknown>) => {
|
|
47
|
+
const oi = r["orcid-identifier"] as Record<string, string> | undefined;
|
|
48
|
+
return {
|
|
49
|
+
orcid: oi?.path,
|
|
50
|
+
uri: oi?.uri,
|
|
51
|
+
source: "orcid",
|
|
52
|
+
};
|
|
53
|
+
},
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
return toolResult({
|
|
57
|
+
total_results: data["num-found"],
|
|
58
|
+
source: "orcid",
|
|
59
|
+
researchers,
|
|
60
|
+
_latency_ms: result.latency_ms,
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: "get_orcid_works",
|
|
66
|
+
label: "Get Works by ORCID (ORCID)",
|
|
67
|
+
description:
|
|
68
|
+
"Get the publication list for a researcher by their ORCID iD. Returns titles, DOIs, publication years, and work types.",
|
|
69
|
+
parameters: Type.Object({
|
|
70
|
+
orcid: Type.String({
|
|
71
|
+
description: "ORCID iD, e.g. '0000-0002-1825-0097'",
|
|
72
|
+
}),
|
|
73
|
+
}),
|
|
74
|
+
execute: async (input: { orcid: string }) => {
|
|
75
|
+
const orcid = input.orcid.replace(/^https?:\/\/orcid\.org\//, "");
|
|
76
|
+
|
|
77
|
+
const result = await trackedFetch(
|
|
78
|
+
"orcid",
|
|
79
|
+
`${BASE}/${encodeURIComponent(orcid)}/works`,
|
|
80
|
+
{ headers: HEADERS },
|
|
81
|
+
10_000,
|
|
82
|
+
);
|
|
83
|
+
if (isTrackedError(result)) return result;
|
|
84
|
+
const data = await result.res.json();
|
|
85
|
+
|
|
86
|
+
const groups = data.group as Array<Record<string, unknown>> | undefined;
|
|
87
|
+
|
|
88
|
+
const works = (groups ?? []).map((g) => {
|
|
89
|
+
const summaries = g["work-summary"] as Array<Record<string, unknown>> | undefined;
|
|
90
|
+
const first = summaries?.[0];
|
|
91
|
+
if (!first) return null;
|
|
92
|
+
|
|
93
|
+
// Extract title
|
|
94
|
+
const titleObj = first.title as Record<string, unknown> | undefined;
|
|
95
|
+
const title = (titleObj?.title as Record<string, string> | undefined)?.value;
|
|
96
|
+
|
|
97
|
+
// Extract publication date
|
|
98
|
+
const pubDate = first["publication-date"] as Record<string, unknown> | undefined;
|
|
99
|
+
const year = (pubDate?.year as Record<string, string> | undefined)?.value;
|
|
100
|
+
const month = (pubDate?.month as Record<string, string> | undefined)?.value;
|
|
101
|
+
|
|
102
|
+
// Extract DOI from external-ids
|
|
103
|
+
const extIds = first["external-ids"] as Record<string, unknown> | undefined;
|
|
104
|
+
const extIdList = extIds?.["external-id"] as Array<Record<string, unknown>> | undefined;
|
|
105
|
+
const doiEntry = extIdList?.find(
|
|
106
|
+
(e) => e["external-id-type"] === "doi" && e["external-id-relationship"] === "self",
|
|
107
|
+
);
|
|
108
|
+
const doi = doiEntry?.["external-id-value"] as string | undefined;
|
|
109
|
+
|
|
110
|
+
// Extract journal title
|
|
111
|
+
const journalTitle = first["journal-title"] as Record<string, string> | undefined;
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
title,
|
|
115
|
+
doi,
|
|
116
|
+
year,
|
|
117
|
+
month,
|
|
118
|
+
type: first.type,
|
|
119
|
+
journal: journalTitle?.value,
|
|
120
|
+
url: doi ? `https://doi.org/${doi}` : undefined,
|
|
121
|
+
authors: undefined as string[] | undefined, // ORCID works endpoint does not include author lists
|
|
122
|
+
source: "orcid",
|
|
123
|
+
};
|
|
124
|
+
}).filter(Boolean);
|
|
125
|
+
|
|
126
|
+
return toolResult({
|
|
127
|
+
orcid,
|
|
128
|
+
total_works: works.length,
|
|
129
|
+
source: "orcid",
|
|
130
|
+
works,
|
|
131
|
+
_latency_ms: result.latency_ms,
|
|
132
|
+
});
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
];
|
|
136
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
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.osf.io/v2";
|
|
6
|
+
|
|
7
|
+
export function createOsfPreprintsTools(
|
|
8
|
+
_ctx: OpenClawPluginToolContext,
|
|
9
|
+
_api: OpenClawPluginApi,
|
|
10
|
+
) {
|
|
11
|
+
return [
|
|
12
|
+
{
|
|
13
|
+
name: "search_osf_preprints",
|
|
14
|
+
label: "Search Preprints (OSF)",
|
|
15
|
+
description:
|
|
16
|
+
"Search OSF Preprints, an aggregator covering 180K+ preprints across multiple providers including SocArXiv, PsyArXiv, EarthArXiv, EngrXiv, and NutriXiv. Covers social sciences, psychology, earth sciences, engineering, and more.",
|
|
17
|
+
parameters: Type.Object({
|
|
18
|
+
provider: Type.Optional(
|
|
19
|
+
Type.String({
|
|
20
|
+
description:
|
|
21
|
+
"Preprint provider filter: 'osf', 'socarxiv', 'psyarxiv', 'engrxiv', 'eartharxiv', 'nutrixiv'. Omit for all providers.",
|
|
22
|
+
}),
|
|
23
|
+
),
|
|
24
|
+
size: Type.Optional(
|
|
25
|
+
Type.Number({ description: "Max results (default 10, max 100)" }),
|
|
26
|
+
),
|
|
27
|
+
page: Type.Optional(
|
|
28
|
+
Type.Number({ description: "Page number (default 1)" }),
|
|
29
|
+
),
|
|
30
|
+
}),
|
|
31
|
+
execute: async (input: {
|
|
32
|
+
provider?: string;
|
|
33
|
+
size?: number;
|
|
34
|
+
page?: number;
|
|
35
|
+
}) => {
|
|
36
|
+
const params = new URLSearchParams({
|
|
37
|
+
"page[size]": String(Math.min(input.size ?? 10, 100)),
|
|
38
|
+
});
|
|
39
|
+
if (input.provider) params.set("filter[provider]", input.provider);
|
|
40
|
+
if (input.page) params.set("page", String(input.page));
|
|
41
|
+
|
|
42
|
+
const result = await trackedFetch(
|
|
43
|
+
"osf_preprints",
|
|
44
|
+
`${BASE}/preprints/?${params}`,
|
|
45
|
+
{
|
|
46
|
+
headers: {
|
|
47
|
+
Accept: "application/vnd.api+json",
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
20_000,
|
|
51
|
+
);
|
|
52
|
+
if (isTrackedError(result)) return result;
|
|
53
|
+
const data = await result.res.json();
|
|
54
|
+
|
|
55
|
+
const items = data.data as Array<Record<string, unknown>> | undefined;
|
|
56
|
+
const linksMeta = (data.links as Record<string, unknown>)?.meta as Record<string, unknown> | undefined;
|
|
57
|
+
|
|
58
|
+
return toolResult({
|
|
59
|
+
total_results: linksMeta?.total,
|
|
60
|
+
page: input.page ?? 1,
|
|
61
|
+
source: "osf_preprints",
|
|
62
|
+
preprints: (items ?? []).map((item) => {
|
|
63
|
+
const attrs = item.attributes as Record<string, unknown> | undefined;
|
|
64
|
+
const relationships = item.relationships as Record<string, unknown> | undefined;
|
|
65
|
+
const providerData = (
|
|
66
|
+
relationships?.provider as Record<string, unknown> | undefined
|
|
67
|
+
)?.data as Record<string, string> | undefined;
|
|
68
|
+
const subjects = attrs?.subjects as Array<Array<{ id: string; text: string }>> | undefined;
|
|
69
|
+
|
|
70
|
+
// Flatten nested subject arrays
|
|
71
|
+
const subjectNames = subjects
|
|
72
|
+
?.flat()
|
|
73
|
+
.map((s) => s.text)
|
|
74
|
+
.filter(Boolean);
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
id: item.id,
|
|
78
|
+
title: attrs?.title,
|
|
79
|
+
description: attrs?.description
|
|
80
|
+
? String(attrs.description).slice(0, 500)
|
|
81
|
+
: undefined,
|
|
82
|
+
doi: attrs?.doi ?? undefined,
|
|
83
|
+
date_created: attrs?.date_created,
|
|
84
|
+
date_published: attrs?.date_published,
|
|
85
|
+
year: attrs?.date_published
|
|
86
|
+
? String(attrs.date_published).slice(0, 4)
|
|
87
|
+
: attrs?.date_created
|
|
88
|
+
? String(attrs.date_created).slice(0, 4)
|
|
89
|
+
: undefined,
|
|
90
|
+
provider: providerData?.id,
|
|
91
|
+
tags: attrs?.tags,
|
|
92
|
+
subjects: subjectNames,
|
|
93
|
+
is_published: attrs?.is_published,
|
|
94
|
+
authors: undefined as string[] | undefined, // OSF preprint list does not embed contributor names
|
|
95
|
+
url: `https://osf.io/preprints/${providerData?.id ?? "osf"}/${String(item.id).replace(/_v\d+$/, "")}`,
|
|
96
|
+
source: "osf_preprints",
|
|
97
|
+
};
|
|
98
|
+
}),
|
|
99
|
+
_latency_ms: result.latency_ms,
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
];
|
|
104
|
+
}
|
package/src/tools/pubmed.ts
CHANGED
|
@@ -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 EUTILS = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils";
|
|
6
6
|
|
|
@@ -53,23 +53,27 @@ export function createPubMedTools(
|
|
|
53
53
|
if (input.max_date) searchParams.set("maxdate", input.max_date);
|
|
54
54
|
if (input.min_date || input.max_date) searchParams.set("datetype", "pdat");
|
|
55
55
|
|
|
56
|
-
const
|
|
57
|
-
if (
|
|
58
|
-
|
|
59
|
-
const searchData = await searchRes.json();
|
|
56
|
+
const searchTracked = await trackedFetch("pubmed", `${EUTILS}/esearch.fcgi?${searchParams}`);
|
|
57
|
+
if (isTrackedError(searchTracked)) return searchTracked;
|
|
58
|
+
const searchData = await searchTracked.res.json();
|
|
60
59
|
const ids: string[] = searchData.esearchresult?.idlist ?? [];
|
|
61
60
|
|
|
62
|
-
if (ids.length === 0)
|
|
61
|
+
if (ids.length === 0) {
|
|
62
|
+
return toolResult({
|
|
63
|
+
total_count: searchData.esearchresult?.count ?? 0,
|
|
64
|
+
articles: [],
|
|
65
|
+
_source_health: { source: "pubmed", latency_ms: searchTracked.latency_ms },
|
|
66
|
+
});
|
|
67
|
+
}
|
|
63
68
|
|
|
64
69
|
const summaryParams = new URLSearchParams({
|
|
65
70
|
db: "pubmed",
|
|
66
71
|
id: ids.join(","),
|
|
67
72
|
retmode: "json",
|
|
68
73
|
});
|
|
69
|
-
const
|
|
70
|
-
if (
|
|
71
|
-
|
|
72
|
-
const summaryData = await summaryRes.json();
|
|
74
|
+
const summaryTracked = await trackedFetch("pubmed", `${EUTILS}/esummary.fcgi?${summaryParams}`);
|
|
75
|
+
if (isTrackedError(summaryTracked)) return summaryTracked;
|
|
76
|
+
const summaryData = await summaryTracked.res.json();
|
|
73
77
|
|
|
74
78
|
const articles = ids.map((id) => {
|
|
75
79
|
const doc = summaryData.result?.[id];
|
|
@@ -92,6 +96,7 @@ export function createPubMedTools(
|
|
|
92
96
|
return toolResult({
|
|
93
97
|
total_count: parseInt(searchData.esearchresult?.count ?? "0", 10),
|
|
94
98
|
articles,
|
|
99
|
+
_source_health: { source: "pubmed", latency_ms: summaryTracked.latency_ms },
|
|
95
100
|
});
|
|
96
101
|
},
|
|
97
102
|
},
|
|
@@ -109,9 +114,9 @@ export function createPubMedTools(
|
|
|
109
114
|
id: input.pmid,
|
|
110
115
|
retmode: "xml",
|
|
111
116
|
});
|
|
112
|
-
const
|
|
113
|
-
if (
|
|
114
|
-
const xml = await res.text();
|
|
117
|
+
const tracked = await trackedFetch("pubmed", `${EUTILS}/efetch.fcgi?${params}`);
|
|
118
|
+
if (isTrackedError(tracked)) return tracked;
|
|
119
|
+
const xml = await tracked.res.text();
|
|
115
120
|
|
|
116
121
|
const getText = (tag: string) => {
|
|
117
122
|
const m = xml.match(new RegExp(`<${tag}>([\\s\\S]*?)</${tag}>`));
|
|
@@ -162,6 +167,7 @@ export function createPubMedTools(
|
|
|
162
167
|
pmc,
|
|
163
168
|
mesh_terms: getMesh(),
|
|
164
169
|
url: `https://pubmed.ncbi.nlm.nih.gov/${input.pmid}/`,
|
|
170
|
+
_source_health: { source: "pubmed", latency_ms: tracked.latency_ms },
|
|
165
171
|
});
|
|
166
172
|
},
|
|
167
173
|
},
|
package/src/tools/ror.ts
ADDED
|
@@ -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.ror.org/v2";
|
|
6
|
+
|
|
7
|
+
export function createRorTools(
|
|
8
|
+
_ctx: OpenClawPluginToolContext,
|
|
9
|
+
_api: OpenClawPluginApi,
|
|
10
|
+
) {
|
|
11
|
+
return [
|
|
12
|
+
{
|
|
13
|
+
name: "search_ror",
|
|
14
|
+
label: "Search Research Organizations (ROR)",
|
|
15
|
+
description:
|
|
16
|
+
"Search the Research Organization Registry (ROR) for institutions, universities, labs, and funders. Returns canonical identifiers, locations, types, and links. Useful for affiliation disambiguation and finding institution metadata.",
|
|
17
|
+
parameters: Type.Object({
|
|
18
|
+
query: Type.String({
|
|
19
|
+
description: "Organization name or acronym to search, e.g. 'MIT', 'Max Planck', 'CNRS'",
|
|
20
|
+
}),
|
|
21
|
+
max_results: Type.Optional(
|
|
22
|
+
Type.Number({ description: "Max results (default 10, max 50)" }),
|
|
23
|
+
),
|
|
24
|
+
}),
|
|
25
|
+
execute: async (input: { query: string; max_results?: number }) => {
|
|
26
|
+
const params = new URLSearchParams({
|
|
27
|
+
query: input.query,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const tracked = await trackedFetch("ror", `${BASE}/organizations?${params}`, undefined, 10_000);
|
|
31
|
+
if (isTrackedError(tracked)) return tracked;
|
|
32
|
+
const data = await tracked.res.json();
|
|
33
|
+
|
|
34
|
+
const maxResults = Math.min(input.max_results ?? 10, 50);
|
|
35
|
+
const items = (data.items ?? []).slice(0, maxResults).map(
|
|
36
|
+
(org: Record<string, unknown>) => {
|
|
37
|
+
const names = org.names as Array<{
|
|
38
|
+
value: string;
|
|
39
|
+
types: string[];
|
|
40
|
+
lang: string | null;
|
|
41
|
+
}> | undefined;
|
|
42
|
+
const locations = org.locations as Array<{
|
|
43
|
+
geonames_details: {
|
|
44
|
+
name: string;
|
|
45
|
+
country_name: string;
|
|
46
|
+
country_code: string;
|
|
47
|
+
country_subdivision_name?: string;
|
|
48
|
+
lat: number;
|
|
49
|
+
lng: number;
|
|
50
|
+
};
|
|
51
|
+
}> | undefined;
|
|
52
|
+
const links = org.links as Array<{
|
|
53
|
+
type: string;
|
|
54
|
+
value: string;
|
|
55
|
+
}> | undefined;
|
|
56
|
+
const externalIds = org.external_ids as Array<{
|
|
57
|
+
type: string;
|
|
58
|
+
all: string[];
|
|
59
|
+
preferred: string | null;
|
|
60
|
+
}> | undefined;
|
|
61
|
+
|
|
62
|
+
// Extract the display name (ror_display type preferred, then first label)
|
|
63
|
+
const displayName = names?.find(
|
|
64
|
+
(n) => n.types.includes("ror_display"),
|
|
65
|
+
)?.value;
|
|
66
|
+
const acronym = names?.find(
|
|
67
|
+
(n) => n.types.includes("acronym"),
|
|
68
|
+
)?.value;
|
|
69
|
+
const aliases = names
|
|
70
|
+
?.filter((n) => n.types.includes("alias"))
|
|
71
|
+
.map((n) => n.value);
|
|
72
|
+
const labels = names
|
|
73
|
+
?.filter((n) => n.types.includes("label") && !n.types.includes("ror_display"))
|
|
74
|
+
.map((n) => ({ name: n.value, lang: n.lang }));
|
|
75
|
+
|
|
76
|
+
const location = locations?.[0]?.geonames_details;
|
|
77
|
+
const website = links?.find((l) => l.type === "website")?.value;
|
|
78
|
+
const wikipedia = links?.find((l) => l.type === "wikipedia")?.value;
|
|
79
|
+
|
|
80
|
+
// Extract GRID and other IDs
|
|
81
|
+
const gridId = externalIds?.find((e) => e.type === "grid")?.preferred;
|
|
82
|
+
const wikidataId = externalIds?.find((e) => e.type === "wikidata")?.preferred;
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
ror_id: org.id,
|
|
86
|
+
name: displayName ?? names?.[0]?.value,
|
|
87
|
+
acronym,
|
|
88
|
+
aliases: aliases?.length ? aliases : undefined,
|
|
89
|
+
labels: labels?.length ? labels : undefined,
|
|
90
|
+
types: org.types,
|
|
91
|
+
status: org.status,
|
|
92
|
+
established: org.established,
|
|
93
|
+
location: location
|
|
94
|
+
? {
|
|
95
|
+
city: location.name,
|
|
96
|
+
country: location.country_name,
|
|
97
|
+
country_code: location.country_code,
|
|
98
|
+
region: location.country_subdivision_name,
|
|
99
|
+
}
|
|
100
|
+
: undefined,
|
|
101
|
+
website,
|
|
102
|
+
wikipedia,
|
|
103
|
+
domains: org.domains,
|
|
104
|
+
grid_id: gridId,
|
|
105
|
+
wikidata_id: wikidataId,
|
|
106
|
+
};
|
|
107
|
+
},
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
return toolResult({
|
|
111
|
+
total_results: data.number_of_results,
|
|
112
|
+
organizations: items,
|
|
113
|
+
_source_health: { source: "ror", latency_ms: tracked.latency_ms },
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
}
|
package/src/tools/unpaywall.ts
CHANGED
|
@@ -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.unpaywall.org/v2";
|
|
6
6
|
|
|
@@ -23,14 +23,19 @@ export function createUnpaywallTools(
|
|
|
23
23
|
}),
|
|
24
24
|
execute: async (input: { doi: string }) => {
|
|
25
25
|
const doi = input.doi.replace(/^https?:\/\/doi\.org\//, "");
|
|
26
|
-
const
|
|
26
|
+
const tracked = await trackedFetch(
|
|
27
|
+
"unpaywall",
|
|
27
28
|
`${BASE}/${encodeURIComponent(doi)}?email=${email}`,
|
|
28
29
|
);
|
|
29
|
-
if (
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
if (isTrackedError(tracked)) {
|
|
31
|
+
// Special handling for 404 (DOI not found)
|
|
32
|
+
if (tracked.details && typeof tracked.details === "object" && "error" in (tracked.details as Record<string, unknown>)) {
|
|
33
|
+
const errMsg = String((tracked.details as Record<string, string>).error);
|
|
34
|
+
if (errMsg.includes("404")) return toolResult({ error: "DOI not found in Unpaywall" });
|
|
35
|
+
}
|
|
36
|
+
return tracked;
|
|
32
37
|
}
|
|
33
|
-
const data = await res.json();
|
|
38
|
+
const data = await tracked.res.json();
|
|
34
39
|
|
|
35
40
|
const oaLocations = (
|
|
36
41
|
data.oa_locations as Record<string, unknown>[] | undefined
|
|
@@ -53,6 +58,7 @@ export function createUnpaywallTools(
|
|
|
53
58
|
publisher: data.publisher,
|
|
54
59
|
published_date: data.published_date,
|
|
55
60
|
oa_locations: oaLocations,
|
|
61
|
+
_source_health: { source: "unpaywall", latency_ms: tracked.latency_ms },
|
|
56
62
|
});
|
|
57
63
|
},
|
|
58
64
|
},
|