@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,142 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import type { OpenClawPluginApi, OpenClawPluginToolContext } from "openclaw/plugin-sdk";
|
|
3
|
+
import { toolResult, trackedFetch, isTrackedError } from "./util.js";
|
|
4
|
+
|
|
5
|
+
const BASE = "https://api.biorxiv.org";
|
|
6
|
+
|
|
7
|
+
export function createBiorxivTools(
|
|
8
|
+
_ctx: OpenClawPluginToolContext,
|
|
9
|
+
_api: OpenClawPluginApi,
|
|
10
|
+
) {
|
|
11
|
+
return [
|
|
12
|
+
{
|
|
13
|
+
name: "search_biorxiv",
|
|
14
|
+
label: "Search Preprints (bioRxiv)",
|
|
15
|
+
description:
|
|
16
|
+
"Get recent bioRxiv preprints by date range. Covers biology preprints (300K+). Use date range (e.g. '2026-03-01/2026-03-18'), recent count (e.g. '50'), or recent days (e.g. '7d').",
|
|
17
|
+
parameters: Type.Object({
|
|
18
|
+
interval: Type.String({
|
|
19
|
+
description:
|
|
20
|
+
"Date range 'YYYY-MM-DD/YYYY-MM-DD', recent count '50', or recent days '7d'",
|
|
21
|
+
}),
|
|
22
|
+
cursor: Type.Optional(
|
|
23
|
+
Type.Number({ description: "Pagination offset (default 0, each page returns up to 100)" }),
|
|
24
|
+
),
|
|
25
|
+
}),
|
|
26
|
+
execute: async (input: { interval: string; cursor?: number }) => {
|
|
27
|
+
const cursor = input.cursor ?? 0;
|
|
28
|
+
const tracked = await trackedFetch("biorxiv", `${BASE}/details/biorxiv/${input.interval}/${cursor}/json`, undefined, 30_000);
|
|
29
|
+
if (isTrackedError(tracked)) return tracked;
|
|
30
|
+
const data = await tracked.res.json();
|
|
31
|
+
|
|
32
|
+
const meta = data.messages?.[0];
|
|
33
|
+
const papers = (data.collection ?? []).map(
|
|
34
|
+
(p: Record<string, unknown>) => ({
|
|
35
|
+
doi: p.doi,
|
|
36
|
+
title: p.title,
|
|
37
|
+
authors: typeof p.authors === "string"
|
|
38
|
+
? (p.authors as string).split("; ").filter(Boolean)
|
|
39
|
+
: [],
|
|
40
|
+
abstract: p.abstract,
|
|
41
|
+
date: p.date,
|
|
42
|
+
category: p.category,
|
|
43
|
+
version: p.version,
|
|
44
|
+
license: p.license,
|
|
45
|
+
url: p.doi ? `https://www.biorxiv.org/content/${p.doi}` : undefined,
|
|
46
|
+
pdf_url: p.doi ? `https://www.biorxiv.org/content/${p.doi}v${p.version ?? 1}.full.pdf` : undefined,
|
|
47
|
+
source: "biorxiv",
|
|
48
|
+
}),
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
return toolResult({
|
|
52
|
+
total_results: meta?.total ?? papers.length,
|
|
53
|
+
cursor: meta?.cursor,
|
|
54
|
+
papers,
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: "search_medrxiv",
|
|
60
|
+
label: "Search Preprints (medRxiv)",
|
|
61
|
+
description:
|
|
62
|
+
"Get recent medRxiv preprints by date range. Covers medical/health science preprints (100K+).",
|
|
63
|
+
parameters: Type.Object({
|
|
64
|
+
interval: Type.String({
|
|
65
|
+
description:
|
|
66
|
+
"Date range 'YYYY-MM-DD/YYYY-MM-DD', recent count '50', or recent days '7d'",
|
|
67
|
+
}),
|
|
68
|
+
cursor: Type.Optional(
|
|
69
|
+
Type.Number({ description: "Pagination offset (default 0)" }),
|
|
70
|
+
),
|
|
71
|
+
}),
|
|
72
|
+
execute: async (input: { interval: string; cursor?: number }) => {
|
|
73
|
+
const cursor = input.cursor ?? 0;
|
|
74
|
+
const tracked = await trackedFetch("medrxiv", `${BASE}/details/medrxiv/${input.interval}/${cursor}/json`, undefined, 30_000);
|
|
75
|
+
if (isTrackedError(tracked)) return tracked;
|
|
76
|
+
const data = await tracked.res.json();
|
|
77
|
+
|
|
78
|
+
const meta = data.messages?.[0];
|
|
79
|
+
const papers = (data.collection ?? []).map(
|
|
80
|
+
(p: Record<string, unknown>) => ({
|
|
81
|
+
doi: p.doi,
|
|
82
|
+
title: p.title,
|
|
83
|
+
authors: typeof p.authors === "string"
|
|
84
|
+
? (p.authors as string).split("; ").filter(Boolean)
|
|
85
|
+
: [],
|
|
86
|
+
abstract: p.abstract,
|
|
87
|
+
date: p.date,
|
|
88
|
+
category: p.category,
|
|
89
|
+
version: p.version,
|
|
90
|
+
url: p.doi ? `https://www.medrxiv.org/content/${p.doi}` : undefined,
|
|
91
|
+
pdf_url: p.doi ? `https://www.medrxiv.org/content/${p.doi}v${p.version ?? 1}.full.pdf` : undefined,
|
|
92
|
+
source: "medrxiv",
|
|
93
|
+
}),
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
return toolResult({
|
|
97
|
+
total_results: meta?.total ?? papers.length,
|
|
98
|
+
cursor: meta?.cursor,
|
|
99
|
+
papers,
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: "get_preprint_by_doi",
|
|
105
|
+
label: "Get Preprint by DOI (bioRxiv/medRxiv)",
|
|
106
|
+
description:
|
|
107
|
+
"Get a specific bioRxiv or medRxiv preprint by its DOI.",
|
|
108
|
+
parameters: Type.Object({
|
|
109
|
+
doi: Type.String({ description: "DOI of the preprint (e.g. '10.1101/2024.01.15.575123')" }),
|
|
110
|
+
server: Type.Optional(
|
|
111
|
+
Type.String({ description: "Server: 'biorxiv' or 'medrxiv' (default: biorxiv)" }),
|
|
112
|
+
),
|
|
113
|
+
}),
|
|
114
|
+
execute: async (input: { doi: string; server?: string }) => {
|
|
115
|
+
const server = input.server ?? "biorxiv";
|
|
116
|
+
const doi = input.doi.replace(/^https?:\/\/doi\.org\//, "");
|
|
117
|
+
const tracked = await trackedFetch(server, `${BASE}/details/${server}/${doi}/na/json`, undefined, 15_000);
|
|
118
|
+
if (isTrackedError(tracked)) return tracked;
|
|
119
|
+
const data = await tracked.res.json();
|
|
120
|
+
const papers = data.collection ?? [];
|
|
121
|
+
if (papers.length === 0) return toolResult({ error: "Preprint not found" });
|
|
122
|
+
|
|
123
|
+
const p = papers[0] as Record<string, unknown>;
|
|
124
|
+
return toolResult({
|
|
125
|
+
doi: p.doi,
|
|
126
|
+
title: p.title,
|
|
127
|
+
authors: typeof p.authors === "string"
|
|
128
|
+
? (p.authors as string).split("; ").filter(Boolean)
|
|
129
|
+
: [],
|
|
130
|
+
abstract: p.abstract,
|
|
131
|
+
date: p.date,
|
|
132
|
+
category: p.category,
|
|
133
|
+
version: p.version,
|
|
134
|
+
license: p.license,
|
|
135
|
+
url: `https://www.${server}.org/content/${p.doi}`,
|
|
136
|
+
pdf_url: `https://www.${server}.org/content/${p.doi}v${p.version ?? 1}.full.pdf`,
|
|
137
|
+
source: server,
|
|
138
|
+
});
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
];
|
|
142
|
+
}
|
package/src/tools/crossref.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.crossref.org";
|
|
6
6
|
|
|
@@ -25,11 +25,9 @@ export function createCrossRefTools(
|
|
|
25
25
|
}),
|
|
26
26
|
execute: async (input: { doi: string }) => {
|
|
27
27
|
const doi = input.doi.replace(/^https?:\/\/doi\.org\//, "");
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (!res.ok) return toolResult({ error: `API error: ${res.status} ${res.statusText}` });
|
|
32
|
-
const data = await res.json();
|
|
28
|
+
const tracked = await trackedFetch("crossref", `${BASE}/works/${encodeURIComponent(doi)}`, { headers });
|
|
29
|
+
if (isTrackedError(tracked)) return tracked;
|
|
30
|
+
const data = await tracked.res.json();
|
|
33
31
|
const w = data.message;
|
|
34
32
|
return toolResult({
|
|
35
33
|
doi: w.DOI,
|
|
@@ -46,6 +44,7 @@ export function createCrossRefTools(
|
|
|
46
44
|
url: w.URL,
|
|
47
45
|
abstract: w.abstract,
|
|
48
46
|
license: w.license?.[0]?.URL,
|
|
47
|
+
_source_health: { source: "crossref", latency_ms: tracked.latency_ms },
|
|
49
48
|
});
|
|
50
49
|
},
|
|
51
50
|
},
|
|
@@ -53,47 +52,82 @@ export function createCrossRefTools(
|
|
|
53
52
|
name: "search_crossref",
|
|
54
53
|
label: "Search Works (CrossRef)",
|
|
55
54
|
description:
|
|
56
|
-
"Search CrossRef for scholarly works
|
|
55
|
+
"Search CrossRef for scholarly works. Covers 150M+ DOIs across ALL publishers and disciplines. Supports journal/ISSN filtering, year range, work type, and citation-count sorting. Best general-purpose academic search tool.",
|
|
57
56
|
parameters: Type.Object({
|
|
58
|
-
query: Type.String({ description: "Search query" }),
|
|
59
|
-
|
|
60
|
-
Type.
|
|
57
|
+
query: Type.String({ description: "Search query (keywords)" }),
|
|
58
|
+
journal: Type.Optional(
|
|
59
|
+
Type.String({
|
|
60
|
+
description:
|
|
61
|
+
"Journal name filter (container-title). E.g. 'Nature', 'American Economic Review', 'The Lancet'",
|
|
62
|
+
}),
|
|
63
|
+
),
|
|
64
|
+
issn: Type.Optional(
|
|
65
|
+
Type.String({
|
|
66
|
+
description: "Journal ISSN filter. E.g. '0028-0836' for Nature, '0002-8282' for AER",
|
|
67
|
+
}),
|
|
61
68
|
),
|
|
62
69
|
from_year: Type.Optional(
|
|
63
|
-
Type.Number({ description: "Published from this year onward" }),
|
|
70
|
+
Type.Number({ description: "Published from this year onward (inclusive)" }),
|
|
71
|
+
),
|
|
72
|
+
until_year: Type.Optional(
|
|
73
|
+
Type.Number({ description: "Published until this year (inclusive)" }),
|
|
64
74
|
),
|
|
65
75
|
type: Type.Optional(
|
|
66
76
|
Type.String({
|
|
67
77
|
description:
|
|
68
|
-
"Work type
|
|
78
|
+
"Work type: 'journal-article', 'book-chapter', 'proceedings-article', 'posted-content' (preprint), 'dissertation'",
|
|
69
79
|
}),
|
|
70
80
|
),
|
|
81
|
+
has_abstract: Type.Optional(
|
|
82
|
+
Type.Boolean({ description: "Only results with abstracts" }),
|
|
83
|
+
),
|
|
71
84
|
sort: Type.Optional(
|
|
72
85
|
Type.String({
|
|
73
|
-
description:
|
|
86
|
+
description:
|
|
87
|
+
"Sort by: 'relevance' (default), 'published' (newest first), 'is-referenced-by-count' (most cited)",
|
|
74
88
|
}),
|
|
75
89
|
),
|
|
90
|
+
limit: Type.Optional(
|
|
91
|
+
Type.Number({ description: "Max results (default 10, max 100)" }),
|
|
92
|
+
),
|
|
76
93
|
}),
|
|
77
94
|
execute: async (input: {
|
|
78
95
|
query: string;
|
|
79
|
-
|
|
96
|
+
journal?: string;
|
|
97
|
+
issn?: string;
|
|
80
98
|
from_year?: number;
|
|
99
|
+
until_year?: number;
|
|
81
100
|
type?: string;
|
|
101
|
+
has_abstract?: boolean;
|
|
82
102
|
sort?: string;
|
|
103
|
+
limit?: number;
|
|
83
104
|
}) => {
|
|
84
105
|
const params = new URLSearchParams({
|
|
85
106
|
query: input.query,
|
|
86
107
|
rows: String(Math.min(input.limit ?? 10, 100)),
|
|
87
108
|
});
|
|
88
|
-
if (input.from_year)
|
|
89
|
-
params.set("filter", `from-pub-date:${input.from_year}`);
|
|
90
|
-
if (input.type)
|
|
91
|
-
params.append("filter", `type:${input.type}`);
|
|
92
|
-
if (input.sort) params.set("sort", input.sort);
|
|
93
109
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
110
|
+
// Build filter chain
|
|
111
|
+
const filters: string[] = [];
|
|
112
|
+
if (input.from_year) filters.push(`from-pub-date:${input.from_year}`);
|
|
113
|
+
if (input.until_year) filters.push(`until-pub-date:${input.until_year}`);
|
|
114
|
+
if (input.type) filters.push(`type:${input.type}`);
|
|
115
|
+
if (input.has_abstract) filters.push("has-abstract:true");
|
|
116
|
+
if (input.issn) filters.push(`issn:${input.issn}`);
|
|
117
|
+
if (filters.length > 0) params.set("filter", filters.join(","));
|
|
118
|
+
|
|
119
|
+
// Journal name as query.container-title (separate from filter)
|
|
120
|
+
if (input.journal) params.set("query.container-title", input.journal);
|
|
121
|
+
|
|
122
|
+
if (input.sort) {
|
|
123
|
+
params.set("sort", input.sort);
|
|
124
|
+
params.set("order", "desc");
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const tracked = await trackedFetch("crossref", `${BASE}/works?${params}`, { headers });
|
|
128
|
+
if (isTrackedError(tracked)) return tracked;
|
|
129
|
+
const data = await tracked.res.json();
|
|
130
|
+
|
|
97
131
|
return toolResult({
|
|
98
132
|
total_results: data.message?.["total-results"],
|
|
99
133
|
items: data.message?.items?.map((w: Record<string, unknown>) => ({
|
|
@@ -107,7 +141,11 @@ export function createCrossRefTools(
|
|
|
107
141
|
(w.published as Record<string, unknown>)?.["date-parts"],
|
|
108
142
|
type: w.type,
|
|
109
143
|
cited_by: w["is-referenced-by-count"],
|
|
144
|
+
abstract: typeof w.abstract === "string"
|
|
145
|
+
? (w.abstract as string).replace(/<[^>]*>/g, "").slice(0, 300)
|
|
146
|
+
: undefined,
|
|
110
147
|
})),
|
|
148
|
+
_source_health: { source: "crossref", latency_ms: tracked.latency_ms },
|
|
111
149
|
});
|
|
112
150
|
},
|
|
113
151
|
},
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import type { OpenClawPluginApi, OpenClawPluginToolContext } from "openclaw/plugin-sdk";
|
|
3
|
+
import { toolResult, trackedFetch, isTrackedError } from "./util.js";
|
|
4
|
+
|
|
5
|
+
const BASE = "https://api.datacite.org";
|
|
6
|
+
|
|
7
|
+
export function createDataCiteTools(
|
|
8
|
+
_ctx: OpenClawPluginToolContext,
|
|
9
|
+
_api: OpenClawPluginApi,
|
|
10
|
+
) {
|
|
11
|
+
return [
|
|
12
|
+
{
|
|
13
|
+
name: "search_datacite",
|
|
14
|
+
label: "Search Datasets & DOIs (DataCite)",
|
|
15
|
+
description:
|
|
16
|
+
"Search DataCite for datasets, software, and other research outputs (50M+ DOIs). Covers Zenodo, Figshare, Dryad, and 2000+ repositories. Best for finding datasets, software, and non-journal outputs.",
|
|
17
|
+
parameters: Type.Object({
|
|
18
|
+
query: Type.String({
|
|
19
|
+
description: "Search query for datasets, software, or other research outputs",
|
|
20
|
+
}),
|
|
21
|
+
max_results: Type.Optional(
|
|
22
|
+
Type.Number({ description: "Max results (default 10, max 100)" }),
|
|
23
|
+
),
|
|
24
|
+
resource_type: Type.Optional(
|
|
25
|
+
Type.String({
|
|
26
|
+
description:
|
|
27
|
+
"Filter by type: 'Dataset', 'Software', 'Text', 'Collection', 'Audiovisual', 'Image', etc.",
|
|
28
|
+
}),
|
|
29
|
+
),
|
|
30
|
+
from_year: Type.Optional(
|
|
31
|
+
Type.Number({ description: "Published from this year onward" }),
|
|
32
|
+
),
|
|
33
|
+
}),
|
|
34
|
+
execute: async (input: {
|
|
35
|
+
query: string;
|
|
36
|
+
max_results?: number;
|
|
37
|
+
resource_type?: string;
|
|
38
|
+
from_year?: number;
|
|
39
|
+
}) => {
|
|
40
|
+
const pageSize = Math.min(input.max_results ?? 10, 100);
|
|
41
|
+
const params = new URLSearchParams({
|
|
42
|
+
query: input.query,
|
|
43
|
+
"page[size]": String(pageSize),
|
|
44
|
+
});
|
|
45
|
+
if (input.resource_type) {
|
|
46
|
+
params.set("resource-type-id", input.resource_type.toLowerCase());
|
|
47
|
+
}
|
|
48
|
+
if (input.from_year) {
|
|
49
|
+
params.set("query", `${input.query} AND publicationYear:[${input.from_year} TO *]`);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const tracked = await trackedFetch("datacite", `${BASE}/dois?${params}`, undefined, 15_000);
|
|
53
|
+
if (isTrackedError(tracked)) return tracked;
|
|
54
|
+
const data = await tracked.res.json();
|
|
55
|
+
|
|
56
|
+
const items = (data.data ?? []).map(
|
|
57
|
+
(item: Record<string, unknown>) => {
|
|
58
|
+
const attrs = item.attributes as Record<string, unknown> | undefined;
|
|
59
|
+
if (!attrs) return { id: item.id };
|
|
60
|
+
|
|
61
|
+
const titles = attrs.titles as Array<{ title: string }> | undefined;
|
|
62
|
+
const creators = attrs.creators as Array<{
|
|
63
|
+
name: string;
|
|
64
|
+
nameType?: string;
|
|
65
|
+
givenName?: string;
|
|
66
|
+
familyName?: string;
|
|
67
|
+
}> | undefined;
|
|
68
|
+
const types = attrs.types as Record<string, string> | undefined;
|
|
69
|
+
const descriptions = attrs.descriptions as Array<{
|
|
70
|
+
description: string;
|
|
71
|
+
descriptionType: string;
|
|
72
|
+
}> | undefined;
|
|
73
|
+
const dates = attrs.dates as Array<{
|
|
74
|
+
date: string;
|
|
75
|
+
dateType: string;
|
|
76
|
+
}> | undefined;
|
|
77
|
+
|
|
78
|
+
const issuedDate = dates?.find((d) => d.dateType === "Issued")?.date;
|
|
79
|
+
|
|
80
|
+
return {
|
|
81
|
+
doi: attrs.doi,
|
|
82
|
+
title: titles?.[0]?.title,
|
|
83
|
+
creators: creators?.slice(0, 5).map((c) =>
|
|
84
|
+
c.givenName && c.familyName
|
|
85
|
+
? `${c.givenName} ${c.familyName}`
|
|
86
|
+
: c.name,
|
|
87
|
+
),
|
|
88
|
+
publisher: attrs.publisher,
|
|
89
|
+
publication_year: attrs.publicationYear,
|
|
90
|
+
resource_type: types?.resourceTypeGeneral,
|
|
91
|
+
description: descriptions?.find(
|
|
92
|
+
(d) => d.descriptionType === "Abstract",
|
|
93
|
+
)?.description,
|
|
94
|
+
url: attrs.url,
|
|
95
|
+
issued_date: issuedDate,
|
|
96
|
+
citation_count: attrs.citationCount,
|
|
97
|
+
view_count: attrs.viewCount,
|
|
98
|
+
download_count: attrs.downloadCount,
|
|
99
|
+
};
|
|
100
|
+
},
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
return toolResult({
|
|
104
|
+
total_results: data.meta?.total,
|
|
105
|
+
items,
|
|
106
|
+
_source_health: { source: "datacite", latency_ms: tracked.latency_ms },
|
|
107
|
+
});
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: "resolve_datacite_doi",
|
|
112
|
+
label: "Resolve DOI (DataCite)",
|
|
113
|
+
description:
|
|
114
|
+
"Resolve a DataCite DOI to get full metadata. Best for DOIs from Zenodo, Figshare, Dryad, and other data repositories (10.5281/*, 10.6084/*, etc.).",
|
|
115
|
+
parameters: Type.Object({
|
|
116
|
+
doi: Type.String({
|
|
117
|
+
description: "DOI to resolve, e.g. '10.5281/zenodo.1234567'",
|
|
118
|
+
}),
|
|
119
|
+
}),
|
|
120
|
+
execute: async (input: { doi: string }) => {
|
|
121
|
+
const doi = input.doi.replace(/^https?:\/\/doi\.org\//, "");
|
|
122
|
+
|
|
123
|
+
const tracked = await trackedFetch(
|
|
124
|
+
"datacite",
|
|
125
|
+
`${BASE}/dois/${encodeURIComponent(doi)}`,
|
|
126
|
+
undefined,
|
|
127
|
+
15_000,
|
|
128
|
+
);
|
|
129
|
+
if (isTrackedError(tracked)) return tracked;
|
|
130
|
+
const data = await tracked.res.json();
|
|
131
|
+
|
|
132
|
+
const attrs = data.data?.attributes as Record<string, unknown> | undefined;
|
|
133
|
+
if (!attrs) return toolResult({ error: "DOI not found or no attributes" });
|
|
134
|
+
|
|
135
|
+
const titles = attrs.titles as Array<{ title: string }> | undefined;
|
|
136
|
+
const creators = attrs.creators as Array<{
|
|
137
|
+
name: string;
|
|
138
|
+
givenName?: string;
|
|
139
|
+
familyName?: string;
|
|
140
|
+
}> | undefined;
|
|
141
|
+
const types = attrs.types as Record<string, string> | undefined;
|
|
142
|
+
const descriptions = attrs.descriptions as Array<{
|
|
143
|
+
description: string;
|
|
144
|
+
descriptionType: string;
|
|
145
|
+
}> | undefined;
|
|
146
|
+
const dates = attrs.dates as Array<{
|
|
147
|
+
date: string;
|
|
148
|
+
dateType: string;
|
|
149
|
+
}> | undefined;
|
|
150
|
+
const rights = attrs.rightsList as Array<{
|
|
151
|
+
rights: string;
|
|
152
|
+
rightsUri?: string;
|
|
153
|
+
rightsIdentifier?: string;
|
|
154
|
+
}> | undefined;
|
|
155
|
+
const subjects = attrs.subjects as Array<{
|
|
156
|
+
subject: string;
|
|
157
|
+
}> | undefined;
|
|
158
|
+
|
|
159
|
+
return toolResult({
|
|
160
|
+
doi: attrs.doi,
|
|
161
|
+
title: titles?.[0]?.title,
|
|
162
|
+
creators: creators?.map((c) =>
|
|
163
|
+
c.givenName && c.familyName
|
|
164
|
+
? `${c.givenName} ${c.familyName}`
|
|
165
|
+
: c.name,
|
|
166
|
+
),
|
|
167
|
+
publisher: attrs.publisher,
|
|
168
|
+
publication_year: attrs.publicationYear,
|
|
169
|
+
resource_type: types?.resourceTypeGeneral,
|
|
170
|
+
resource_type_specific: types?.resourceType || undefined,
|
|
171
|
+
description: descriptions?.find(
|
|
172
|
+
(d) => d.descriptionType === "Abstract",
|
|
173
|
+
)?.description,
|
|
174
|
+
url: attrs.url,
|
|
175
|
+
dates: dates?.map((d) => ({ date: d.date, type: d.dateType })),
|
|
176
|
+
license: rights?.[0]?.rightsIdentifier ?? rights?.[0]?.rights,
|
|
177
|
+
license_url: rights?.[0]?.rightsUri,
|
|
178
|
+
subjects: subjects?.map((s) => s.subject),
|
|
179
|
+
citation_count: attrs.citationCount,
|
|
180
|
+
view_count: attrs.viewCount,
|
|
181
|
+
download_count: attrs.downloadCount,
|
|
182
|
+
version: attrs.version,
|
|
183
|
+
_source_health: { source: "datacite", latency_ms: tracked.latency_ms },
|
|
184
|
+
});
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
];
|
|
188
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import type { OpenClawPluginApi, OpenClawPluginToolContext } from "openclaw/plugin-sdk";
|
|
3
|
+
import { toolResult, trackedFetch, isTrackedError } from "./util.js";
|
|
4
|
+
|
|
5
|
+
export function createDblpTools(
|
|
6
|
+
_ctx: OpenClawPluginToolContext,
|
|
7
|
+
_api: OpenClawPluginApi,
|
|
8
|
+
) {
|
|
9
|
+
return [
|
|
10
|
+
{
|
|
11
|
+
name: "search_dblp",
|
|
12
|
+
label: "Search CS Papers (dblp)",
|
|
13
|
+
description:
|
|
14
|
+
"Search dblp computer science bibliography (7M+ records). Covers conferences (NeurIPS, ICML, ACL, etc.) and journals. Best for CS venue-specific search.",
|
|
15
|
+
parameters: Type.Object({
|
|
16
|
+
query: Type.String({
|
|
17
|
+
description: "Search query for publications",
|
|
18
|
+
}),
|
|
19
|
+
max_results: Type.Optional(
|
|
20
|
+
Type.Number({ description: "Max results (default 10, max 1000)" }),
|
|
21
|
+
),
|
|
22
|
+
offset: Type.Optional(
|
|
23
|
+
Type.Number({ description: "Result offset for pagination" }),
|
|
24
|
+
),
|
|
25
|
+
}),
|
|
26
|
+
execute: async (input: {
|
|
27
|
+
query: string;
|
|
28
|
+
max_results?: number;
|
|
29
|
+
offset?: number;
|
|
30
|
+
}) => {
|
|
31
|
+
const params = new URLSearchParams({
|
|
32
|
+
q: input.query,
|
|
33
|
+
format: "json",
|
|
34
|
+
h: String(Math.min(input.max_results ?? 10, 1000)),
|
|
35
|
+
});
|
|
36
|
+
if (input.offset) params.set("f", String(input.offset));
|
|
37
|
+
|
|
38
|
+
const tracked = await trackedFetch("dblp", `https://dblp.org/search/publ/api?${params}`);
|
|
39
|
+
if (isTrackedError(tracked)) return tracked;
|
|
40
|
+
const data = await tracked.res.json();
|
|
41
|
+
|
|
42
|
+
const hits = data.result?.hits;
|
|
43
|
+
if (!hits) return toolResult({ total_results: 0, papers: [] });
|
|
44
|
+
|
|
45
|
+
const papers = (hits.hit ?? []).map(
|
|
46
|
+
(h: Record<string, unknown>) => {
|
|
47
|
+
const info = h.info as Record<string, unknown>;
|
|
48
|
+
if (!info) return {};
|
|
49
|
+
|
|
50
|
+
const authorsRaw = info.authors as Record<string, unknown> | undefined;
|
|
51
|
+
let authors: string[] = [];
|
|
52
|
+
if (authorsRaw?.author) {
|
|
53
|
+
const authorList = authorsRaw.author;
|
|
54
|
+
if (Array.isArray(authorList)) {
|
|
55
|
+
authors = authorList.map((a: Record<string, string> | string) =>
|
|
56
|
+
typeof a === "string" ? a : a.text ?? "",
|
|
57
|
+
);
|
|
58
|
+
} else if (typeof authorList === "object") {
|
|
59
|
+
authors = [(authorList as Record<string, string>).text ?? ""];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
title: info.title,
|
|
65
|
+
authors,
|
|
66
|
+
venue: info.venue,
|
|
67
|
+
year: info.year ? parseInt(info.year as string, 10) : undefined,
|
|
68
|
+
type: info.type,
|
|
69
|
+
doi: info.doi,
|
|
70
|
+
url: info.ee ?? info.url,
|
|
71
|
+
dblp_url: info.url,
|
|
72
|
+
};
|
|
73
|
+
},
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
return toolResult({
|
|
77
|
+
total_results: parseInt(hits["@total"] ?? "0", 10),
|
|
78
|
+
papers,
|
|
79
|
+
});
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: "search_dblp_author",
|
|
84
|
+
label: "Search Authors (dblp)",
|
|
85
|
+
description:
|
|
86
|
+
"Search dblp for computer science authors and their publication profiles.",
|
|
87
|
+
parameters: Type.Object({
|
|
88
|
+
query: Type.String({ description: "Author name to search" }),
|
|
89
|
+
max_results: Type.Optional(
|
|
90
|
+
Type.Number({ description: "Max results (default 10)" }),
|
|
91
|
+
),
|
|
92
|
+
}),
|
|
93
|
+
execute: async (input: { query: string; max_results?: number }) => {
|
|
94
|
+
const params = new URLSearchParams({
|
|
95
|
+
q: input.query,
|
|
96
|
+
format: "json",
|
|
97
|
+
h: String(Math.min(input.max_results ?? 10, 100)),
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
const tracked = await trackedFetch("dblp", `https://dblp.org/search/author/api?${params}`);
|
|
101
|
+
if (isTrackedError(tracked)) return tracked;
|
|
102
|
+
const data = await tracked.res.json();
|
|
103
|
+
|
|
104
|
+
const hits = data.result?.hits;
|
|
105
|
+
if (!hits) return toolResult({ total_results: 0, authors: [] });
|
|
106
|
+
|
|
107
|
+
const authors = (hits.hit ?? []).map(
|
|
108
|
+
(h: Record<string, unknown>) => {
|
|
109
|
+
const info = h.info as Record<string, unknown>;
|
|
110
|
+
return {
|
|
111
|
+
name: info?.author,
|
|
112
|
+
url: info?.url,
|
|
113
|
+
notes: info?.notes,
|
|
114
|
+
};
|
|
115
|
+
},
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
return toolResult({
|
|
119
|
+
total_results: parseInt(hits["@total"] ?? "0", 10),
|
|
120
|
+
authors,
|
|
121
|
+
});
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
];
|
|
125
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import type { OpenClawPluginApi, OpenClawPluginToolContext } from "openclaw/plugin-sdk";
|
|
3
|
+
import { toolResult, trackedFetch, isTrackedError } from "./util.js";
|
|
4
|
+
|
|
5
|
+
const BASE = "https://doaj.org/api";
|
|
6
|
+
|
|
7
|
+
export function createDoajTools(
|
|
8
|
+
_ctx: OpenClawPluginToolContext,
|
|
9
|
+
_api: OpenClawPluginApi,
|
|
10
|
+
) {
|
|
11
|
+
return [
|
|
12
|
+
{
|
|
13
|
+
name: "search_doaj",
|
|
14
|
+
label: "Search Open Access Articles (DOAJ)",
|
|
15
|
+
description:
|
|
16
|
+
"Search DOAJ for verified open access articles (9M+ articles from 20K+ OA journals). All results are guaranteed open access.",
|
|
17
|
+
parameters: Type.Object({
|
|
18
|
+
query: Type.String({
|
|
19
|
+
description:
|
|
20
|
+
"Search query. Supports field search: bibjson.title:, bibjson.author.name:, bibjson.keywords:, doi:, bibjson.year:. Boolean AND/OR supported.",
|
|
21
|
+
}),
|
|
22
|
+
max_results: Type.Optional(
|
|
23
|
+
Type.Number({ description: "Max results (default 10, max 100)" }),
|
|
24
|
+
),
|
|
25
|
+
page: Type.Optional(
|
|
26
|
+
Type.Number({ description: "Page number (starts from 1)" }),
|
|
27
|
+
),
|
|
28
|
+
sort: Type.Optional(
|
|
29
|
+
Type.String({ description: "Sort field, e.g. 'created_date:desc'" }),
|
|
30
|
+
),
|
|
31
|
+
}),
|
|
32
|
+
execute: async (input: {
|
|
33
|
+
query: string;
|
|
34
|
+
max_results?: number;
|
|
35
|
+
page?: number;
|
|
36
|
+
sort?: string;
|
|
37
|
+
}) => {
|
|
38
|
+
const pageSize = Math.min(input.max_results ?? 10, 100);
|
|
39
|
+
const page = input.page ?? 1;
|
|
40
|
+
|
|
41
|
+
let url = `${BASE}/search/articles/${encodeURIComponent(input.query)}?page=${page}&pageSize=${pageSize}`;
|
|
42
|
+
if (input.sort) url += `&sort=${encodeURIComponent(input.sort)}`;
|
|
43
|
+
|
|
44
|
+
const tracked = await trackedFetch("doaj", url);
|
|
45
|
+
if (isTrackedError(tracked)) return tracked;
|
|
46
|
+
const data = await tracked.res.json();
|
|
47
|
+
|
|
48
|
+
const articles = (data.results ?? []).map(
|
|
49
|
+
(r: Record<string, unknown>) => {
|
|
50
|
+
const bib = r.bibjson as Record<string, unknown> | undefined;
|
|
51
|
+
if (!bib) return { id: r.id };
|
|
52
|
+
|
|
53
|
+
const identifiers = bib.identifier as Array<{ type: string; id: string }> | undefined;
|
|
54
|
+
const doi = identifiers?.find((i) => i.type === "doi")?.id;
|
|
55
|
+
const links = bib.link as Array<{ url: string; type: string }> | undefined;
|
|
56
|
+
const journal = bib.journal as Record<string, unknown> | undefined;
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
title: bib.title,
|
|
60
|
+
abstract: bib.abstract,
|
|
61
|
+
authors: (bib.author as Array<{ name: string }> | undefined)
|
|
62
|
+
?.map((a) => a.name),
|
|
63
|
+
year: bib.year,
|
|
64
|
+
doi,
|
|
65
|
+
journal: journal?.title,
|
|
66
|
+
publisher: journal?.publisher,
|
|
67
|
+
keywords: bib.keywords,
|
|
68
|
+
url: links?.[0]?.url ?? (doi ? `https://doi.org/${doi}` : undefined),
|
|
69
|
+
is_oa: true,
|
|
70
|
+
};
|
|
71
|
+
},
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
return toolResult({
|
|
75
|
+
total_results: data.total,
|
|
76
|
+
page,
|
|
77
|
+
articles,
|
|
78
|
+
});
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
}
|