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