@wentorai/research-plugins 1.3.2 → 1.4.2
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 +3 -12
- package/curated/research/README.md +1 -18
- package/curated/tools/README.md +1 -12
- package/curated/writing/README.md +2 -6
- package/index.ts +88 -5
- package/openclaw.plugin.json +3 -12
- package/package.json +3 -5
- package/skills/analysis/statistics/SKILL.md +1 -1
- package/skills/analysis/statistics/meta-analysis-guide/SKILL.md +1 -1
- package/skills/domains/ai-ml/SKILL.md +3 -2
- 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/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/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/medical-data-api/SKILL.md +197 -0
- package/skills/domains/biomedical/pdb-structure-api/SKILL.md +219 -0
- package/skills/domains/business/SKILL.md +2 -3
- package/skills/domains/chemistry/SKILL.md +3 -2
- package/skills/domains/chemistry/catalysis-hub-api/SKILL.md +171 -0
- package/skills/domains/education/SKILL.md +2 -3
- package/skills/domains/law/SKILL.md +3 -2
- package/skills/domains/law/uk-legislation-api/SKILL.md +179 -0
- package/skills/literature/discovery/SKILL.md +1 -1
- package/skills/literature/discovery/citation-alert-guide/SKILL.md +2 -2
- package/skills/literature/discovery/conference-proceedings-guide/SKILL.md +2 -2
- package/skills/literature/discovery/literature-mapping-guide/SKILL.md +1 -1
- package/skills/literature/discovery/paper-recommendation-guide/SKILL.md +8 -14
- package/skills/literature/discovery/rss-paper-feeds/SKILL.md +20 -14
- package/skills/literature/discovery/semantic-paper-radar/SKILL.md +8 -8
- package/skills/literature/discovery/semantic-scholar-recs-guide/SKILL.md +103 -86
- package/skills/literature/fulltext/SKILL.md +3 -2
- package/skills/literature/fulltext/arxiv-latex-source/SKILL.md +195 -0
- package/skills/literature/fulltext/open-access-guide/SKILL.md +1 -1
- package/skills/literature/fulltext/open-access-mining-guide/SKILL.md +5 -5
- package/skills/literature/metadata/citation-network-guide/SKILL.md +3 -3
- package/skills/literature/metadata/h-index-guide/SKILL.md +0 -27
- package/skills/literature/search/SKILL.md +3 -4
- package/skills/literature/search/citation-chaining-guide/SKILL.md +42 -32
- package/skills/literature/search/database-comparison-guide/SKILL.md +1 -1
- package/skills/literature/search/semantic-scholar-api/SKILL.md +56 -53
- package/skills/research/automation/SKILL.md +2 -3
- 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 +2 -1
- package/skills/research/deep-research/auto-deep-research-guide/SKILL.md +1 -0
- package/skills/research/deep-research/in-depth-research-guide/SKILL.md +1 -1
- package/skills/research/deep-research/kosmos-scientist-guide/SKILL.md +3 -3
- package/skills/research/deep-research/llm-scientific-discovery-guide/SKILL.md +1 -1
- package/skills/research/deep-research/local-deep-research-guide/SKILL.md +6 -6
- package/skills/research/deep-research/open-researcher-guide/SKILL.md +3 -3
- package/skills/research/deep-research/tongyi-deep-research-guide/SKILL.md +4 -4
- package/skills/research/methodology/SKILL.md +1 -1
- package/skills/research/methodology/claude-scientific-guide/SKILL.md +1 -0
- package/skills/research/methodology/grad-school-guide/SKILL.md +1 -1
- package/skills/research/methodology/qualitative-research-guide/SKILL.md +1 -1
- package/skills/research/paper-review/SKILL.md +1 -1
- package/skills/research/paper-review/automated-review-guide/SKILL.md +1 -1
- package/skills/research/paper-review/peer-review-guide/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/document/grobid-pdf-parsing/SKILL.md +1 -1
- package/skills/tools/document/paper-parse-guide/SKILL.md +2 -2
- package/skills/tools/knowledge-graph/SKILL.md +2 -3
- package/skills/tools/knowledge-graph/citation-network-builder/SKILL.md +5 -5
- package/skills/tools/knowledge-graph/knowledge-graph-construction/SKILL.md +1 -1
- package/skills/tools/ocr-translate/zotero-pdf2zh-guide/SKILL.md +1 -0
- package/skills/tools/scraping/academic-web-scraping/SKILL.md +1 -2
- package/skills/tools/scraping/google-scholar-scraper/SKILL.md +7 -7
- package/skills/writing/citation/SKILL.md +1 -1
- package/skills/writing/citation/academic-citation-manager/SKILL.md +20 -17
- package/skills/writing/citation/citation-assistant-skill/SKILL.md +72 -58
- 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/onecite-reference-guide/SKILL.md +1 -1
- package/skills/writing/citation/papersgpt-zotero-guide/SKILL.md +1 -0
- package/skills/writing/citation/zotero-mdnotes-guide/SKILL.md +1 -0
- package/skills/writing/citation/zotero-reference-guide/SKILL.md +2 -1
- package/skills/writing/citation/zotero-scholar-guide/SKILL.md +1 -1
- package/skills/writing/composition/scientific-writing-resources/SKILL.md +1 -0
- 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/templates/novathesis-guide/SKILL.md +1 -0
- package/src/tools/arxiv.ts +81 -30
- package/src/tools/biorxiv.ts +158 -0
- package/src/tools/crossref.ts +63 -22
- package/src/tools/datacite.ts +191 -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 +26 -15
- package/src/tools/opencitations.ts +112 -0
- package/src/tools/orcid.ts +139 -0
- package/src/tools/osf-preprints.ts +104 -0
- package/src/tools/pubmed.ts +22 -13
- package/src/tools/ror.ts +118 -0
- package/src/tools/unpaywall.ts +15 -6
- package/src/tools/util.ts +141 -0
- package/src/tools/zenodo.ts +157 -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/research/automation/mcp-server-guide/SKILL.md +0 -211
- package/skills/tools/knowledge-graph/paperpile-notion-guide/SKILL.md +0 -84
- package/src/tools/semantic-scholar.ts +0 -66
|
@@ -56,7 +56,7 @@ C4Context
|
|
|
56
56
|
|
|
57
57
|
System(platform, "Wentor Platform", "AI-powered research assistant ecosystem")
|
|
58
58
|
|
|
59
|
-
System_Ext(scholar, "
|
|
59
|
+
System_Ext(scholar, "OpenAlex", "Academic paper database")
|
|
60
60
|
System_Ext(crossref, "CrossRef", "DOI resolution and metadata")
|
|
61
61
|
System_Ext(github, "GitHub", "Code and skill repositories")
|
|
62
62
|
|
|
@@ -16,7 +16,7 @@ metadata:
|
|
|
16
16
|
|
|
17
17
|
Academic PDFs are the primary format for distributing research, yet extracting structured data from them remains challenging. PDFs encode visual layout, not semantic structure -- headings, paragraphs, equations, tables, and citations are all just positioned text and graphics. GROBID (GeneRation Of BIbliographic Data) is the leading open-source tool for parsing academic PDFs into structured XML/TEI format, extracting metadata, body text, references, and figures with high accuracy.
|
|
18
18
|
|
|
19
|
-
GROBID is used by major academic platforms including
|
|
19
|
+
GROBID is used by major academic platforms including CORE, ResearchGate, and others for large-scale document processing. It combines machine learning models (CRF and deep learning) with heuristic rules to handle the diverse formatting of academic papers across publishers and disciplines.
|
|
20
20
|
|
|
21
21
|
This guide covers installing and running GROBID, using its REST API for batch processing, extracting specific elements (metadata, references, body sections), and integrating GROBID output into downstream workflows such as knowledge bases, systematic reviews, and literature analysis pipelines.
|
|
22
22
|
|
|
@@ -32,7 +32,7 @@ Both modes begin by parsing the paper's structure from its PDF or HTML source, e
|
|
|
32
32
|
| DOI | Resolve via CrossRef/Unpaywall | Auto-fetches open access version |
|
|
33
33
|
| arXiv ID | `https://arxiv.org/pdf/{id}` | Always available |
|
|
34
34
|
| URL | Direct download | May require institutional access |
|
|
35
|
-
|
|
|
35
|
+
| OpenAlex ID | OpenAlex API + OA link | Includes metadata |
|
|
36
36
|
|
|
37
37
|
### PDF Parsing Pipeline
|
|
38
38
|
|
|
@@ -238,6 +238,6 @@ comparison = create_comparison_table(summaries,
|
|
|
238
238
|
|
|
239
239
|
- GROBID: https://github.com/kermitt2/grobid
|
|
240
240
|
- PyMuPDF: https://pymupdf.readthedocs.io
|
|
241
|
-
-
|
|
241
|
+
- OpenAlex API: https://api.openalex.org
|
|
242
242
|
- Unpaywall API: https://unpaywall.org/products/api
|
|
243
243
|
- S. Keshav, "How to Read a Paper" (2007): http://ccr.sigcomm.org/online/files/p83-keshavA.pdf
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: knowledge-graph-skills
|
|
3
|
-
description: "
|
|
3
|
+
description: "9 knowledge graphs skills. Trigger: building knowledge graphs, connecting concepts, ontology design. Design: graph construction, traversal, and visualization for research knowledge."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Knowledge Graphs —
|
|
6
|
+
# Knowledge Graphs — 9 Skills
|
|
7
7
|
|
|
8
8
|
Select the skill matching the user's need, then `read` its SKILL.md.
|
|
9
9
|
|
|
@@ -16,6 +16,5 @@ Select the skill matching the user's need, then `read` its SKILL.md.
|
|
|
16
16
|
| [notero-zotero-notion-guide](./notero-zotero-notion-guide/SKILL.md) | Sync Zotero references and annotations to Notion databases |
|
|
17
17
|
| [ontology-design-guide](./ontology-design-guide/SKILL.md) | Design ontologies and knowledge graphs for research data modeling |
|
|
18
18
|
| [openspg-guide](./openspg-guide/SKILL.md) | Ant Group knowledge graph engine with SPG and KAG framework |
|
|
19
|
-
| [paperpile-notion-guide](./paperpile-notion-guide/SKILL.md) | Sync Paperpile references and annotations to Notion |
|
|
20
19
|
| [rag-methodology-guide](./rag-methodology-guide/SKILL.md) | RAG architecture for academic knowledge retrieval and synthesis |
|
|
21
20
|
| [zotero-markdb-connect-guide](./zotero-markdb-connect-guide/SKILL.md) | Sync Zotero references to Obsidian and Logseq markdown |
|
|
@@ -44,12 +44,12 @@ OpenAlex (free):
|
|
|
44
44
|
- Limits: Reference linking less complete than WoS
|
|
45
45
|
- Best for: Large-scale analysis, reproducible research
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
CrossRef (free):
|
|
48
48
|
- Format: JSON via REST API
|
|
49
|
-
- Coverage: ~
|
|
50
|
-
- Strengths: Free,
|
|
51
|
-
- Limits:
|
|
52
|
-
- Best for:
|
|
49
|
+
- Coverage: ~150M DOIs across all publishers
|
|
50
|
+
- Strengths: Free, authoritative DOI metadata, reference linking
|
|
51
|
+
- Limits: No abstract text, citation counts may lag
|
|
52
|
+
- Best for: Cross-publisher networks, DOI resolution
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
### Data Cleaning for Network Construction
|
|
@@ -293,7 +293,7 @@ Provide a detailed answer citing specific papers, methods, and findings from the
|
|
|
293
293
|
- **Start with a clear schema.** Define your entity types and relations before extracting data. A schema change later requires re-processing.
|
|
294
294
|
- **Use persistent identifiers.** DOIs for papers, ORCIDs for authors, and canonical names for methods prevent duplicate nodes.
|
|
295
295
|
- **Validate extracted triples.** LLM extraction is imperfect. Sample and manually verify 5-10% of extractions.
|
|
296
|
-
- **Enrich with external data.** Link your KG to OpenAlex,
|
|
296
|
+
- **Enrich with external data.** Link your KG to OpenAlex, CrossRef, or Wikidata for additional metadata.
|
|
297
297
|
- **Version your graph.** Export snapshots regularly and track changes over time.
|
|
298
298
|
- **Design queries before building.** Know what questions you want to answer before deciding on the schema.
|
|
299
299
|
|
|
@@ -28,7 +28,6 @@ APIs are always preferable to scraping when available. They provide structured d
|
|
|
28
28
|
|
|
29
29
|
| API | Data | Rate Limit | Auth |
|
|
30
30
|
|-----|------|-----------|------|
|
|
31
|
-
| Semantic Scholar | Papers, authors, citations | 100 req/sec (with key) | API key (free) |
|
|
32
31
|
| OpenAlex | Papers, authors, venues, concepts | 100K req/day | Email in header |
|
|
33
32
|
| Crossref | DOI metadata | 50 req/sec (polite pool) | Email in header |
|
|
34
33
|
| PubMed (Entrez) | Biomedical literature | 10 req/sec (with key) | API key (free) |
|
|
@@ -319,7 +318,7 @@ class DataCollector:
|
|
|
319
318
|
## References
|
|
320
319
|
|
|
321
320
|
- [OpenAlex API Documentation](https://docs.openalex.org/) -- Open bibliographic data API
|
|
322
|
-
- [
|
|
321
|
+
- [CrossRef API](https://api.crossref.org/) -- DOI resolution and metadata
|
|
323
322
|
- [BeautifulSoup Documentation](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) -- HTML parsing
|
|
324
323
|
- [Scrapy Documentation](https://docs.scrapy.org/) -- Web scraping framework
|
|
325
324
|
- [Playwright Documentation](https://playwright.dev/python/) -- Browser automation
|
|
@@ -41,7 +41,7 @@ Ethical guidelines:
|
|
|
41
41
|
OpenAlex could answer it instead
|
|
42
42
|
|
|
43
43
|
Official and semi-official alternatives:
|
|
44
|
-
-
|
|
44
|
+
- OpenAlex API: free, no key required, excellent coverage
|
|
45
45
|
- OpenAlex API: free, comprehensive, well-documented
|
|
46
46
|
- Crossref API: free, DOI-based metadata and citation counts
|
|
47
47
|
- CORE API: free, full-text open access content
|
|
@@ -232,12 +232,12 @@ OpenAlex (openalex.org):
|
|
|
232
232
|
- Data: titles, abstracts, citations, authors, institutions
|
|
233
233
|
- Best for: large-scale bibliometric analysis
|
|
234
234
|
|
|
235
|
-
|
|
236
|
-
- Coverage:
|
|
237
|
-
- API: REST,
|
|
238
|
-
- Rate limit:
|
|
239
|
-
- Data: titles, abstracts, citations,
|
|
240
|
-
- Best for:
|
|
235
|
+
OpenAlex (openalex.org):
|
|
236
|
+
- Coverage: 250M+ works, all disciplines
|
|
237
|
+
- API: REST, no key required
|
|
238
|
+
- Rate limit: ~10 requests/sec polite
|
|
239
|
+
- Data: titles, abstracts, citations, concepts, author profiles
|
|
240
|
+
- Best for: cross-disciplinary analysis, open data research
|
|
241
241
|
|
|
242
242
|
Crossref (crossref.org):
|
|
243
243
|
- Coverage: 130M+ DOIs
|
|
@@ -11,7 +11,7 @@ Select the skill matching the user's need, then `read` its SKILL.md.
|
|
|
11
11
|
|-------|-------------|
|
|
12
12
|
| [academic-citation-manager](./academic-citation-manager/SKILL.md) | Manage academic citations across BibTeX, APA, MLA, and Chicago formats |
|
|
13
13
|
| [bibtex-management-guide](./bibtex-management-guide/SKILL.md) | Clean, format, deduplicate, and manage BibTeX bibliography files for LaTeX |
|
|
14
|
-
| [citation-assistant-skill](./citation-assistant-skill/SKILL.md) | Claude Code skill for citation workflow via
|
|
14
|
+
| [citation-assistant-skill](./citation-assistant-skill/SKILL.md) | Claude Code skill for citation workflow via OpenAlex and CrossRef |
|
|
15
15
|
| [citation-style-guide](./citation-style-guide/SKILL.md) | APA, MLA, Chicago citation format guide with CSL configuration |
|
|
16
16
|
| [jabref-reference-guide](./jabref-reference-guide/SKILL.md) | Guide to JabRef open-source BibTeX and BibLaTeX reference manager |
|
|
17
17
|
| [jasminum-zotero-guide](./jasminum-zotero-guide/SKILL.md) | Guide to Jasminum for retrieving CNKI Chinese academic metadata in Zotero |
|
|
@@ -18,7 +18,7 @@ Manage academic citations across multiple formats (BibTeX, APA 7th, MLA 9th, Chi
|
|
|
18
18
|
|
|
19
19
|
Citation management is a persistent friction point in academic writing. Researchers collect references from multiple sources (databases, PDFs, colleagues, web pages), store them in different formats, and must output them in the specific style required by each target journal. Errors in citations -- misspelled author names, incorrect years, broken DOIs, inconsistent formatting -- are among the most common reasons for desk rejection and reviewer criticism.
|
|
20
20
|
|
|
21
|
-
This skill provides a comprehensive citation management workflow that goes beyond what GUI reference managers offer. It can retrieve complete metadata from a DOI in seconds, convert between any citation format, detect and merge duplicate entries, validate entries against CrossRef and
|
|
21
|
+
This skill provides a comprehensive citation management workflow that goes beyond what GUI reference managers offer. It can retrieve complete metadata from a DOI in seconds, convert between any citation format, detect and merge duplicate entries, validate entries against CrossRef and OpenAlex databases, and generate properly formatted bibliographies for any major citation style.
|
|
22
22
|
|
|
23
23
|
The approach is text-based and scriptable, making it ideal for integration with LaTeX workflows, Markdown writing pipelines, and automated document generation. All citation data is stored in standard BibTeX format as the canonical source, with on-demand conversion to other formats for specific manuscript requirements.
|
|
24
24
|
|
|
@@ -52,33 +52,36 @@ print(bibtex)
|
|
|
52
52
|
# }
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
### From
|
|
55
|
+
### From OpenAlex
|
|
56
56
|
|
|
57
57
|
```python
|
|
58
|
-
def
|
|
59
|
-
"""Retrieve citation data from
|
|
60
|
-
url = f"https://api.
|
|
61
|
-
|
|
62
|
-
response = requests.get(url,
|
|
58
|
+
def get_citation_from_openalex(work_id):
|
|
59
|
+
"""Retrieve citation data from OpenAlex API."""
|
|
60
|
+
url = f"https://api.openalex.org/works/{work_id}"
|
|
61
|
+
headers = {"User-Agent": "ResearchPlugins/1.0 (https://wentor.ai)"}
|
|
62
|
+
response = requests.get(url, headers=headers)
|
|
63
63
|
if response.status_code == 200:
|
|
64
64
|
data = response.json()
|
|
65
65
|
return format_as_bibtex(data)
|
|
66
66
|
return None
|
|
67
67
|
|
|
68
|
-
def format_as_bibtex(
|
|
69
|
-
"""Convert
|
|
70
|
-
|
|
71
|
-
author_str = " and ".join(a["
|
|
72
|
-
first_author =
|
|
73
|
-
year =
|
|
68
|
+
def format_as_bibtex(oa_data):
|
|
69
|
+
"""Convert OpenAlex data to BibTeX."""
|
|
70
|
+
authorships = oa_data.get("authorships", [])
|
|
71
|
+
author_str = " and ".join(a["author"]["display_name"] for a in authorships)
|
|
72
|
+
first_author = authorships[0]["author"]["display_name"].split()[-1] if authorships else "Unknown"
|
|
73
|
+
year = str(oa_data.get("publication_year", ""))
|
|
74
74
|
key = f"{first_author}_{year}"
|
|
75
75
|
|
|
76
|
+
venue = oa_data.get("primary_location", {}) or {}
|
|
77
|
+
journal = (venue.get("source") or {}).get("display_name", "")
|
|
78
|
+
|
|
76
79
|
return f"""@article{{{key},
|
|
77
|
-
title={{{
|
|
80
|
+
title={{{oa_data.get('title', '')}}},
|
|
78
81
|
author={{{author_str}}},
|
|
79
82
|
year={{{year}}},
|
|
80
|
-
journal={{{
|
|
81
|
-
doi={{{
|
|
83
|
+
journal={{{journal}}},
|
|
84
|
+
doi={{{oa_data.get('doi', '')}}}
|
|
82
85
|
}}"""
|
|
83
86
|
```
|
|
84
87
|
|
|
@@ -308,7 +311,7 @@ pandoc paper.md --citeproc --bibliography=references.bib \
|
|
|
308
311
|
## References
|
|
309
312
|
|
|
310
313
|
- CrossRef API: https://api.crossref.org
|
|
311
|
-
-
|
|
314
|
+
- OpenAlex API: https://api.openalex.org
|
|
312
315
|
- APA 7th Edition Manual: https://apastyle.apa.org/products/publication-manual-7th-edition
|
|
313
316
|
- BibTeX documentation: http://www.bibtex.org
|
|
314
317
|
- CSL styles repository: https://github.com/citation-style-language/styles
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: citation-assistant-skill
|
|
3
|
-
description: "Claude Code skill for citation workflow via
|
|
3
|
+
description: "Claude Code skill for citation workflow via OpenAlex and CrossRef"
|
|
4
4
|
metadata:
|
|
5
5
|
openclaw:
|
|
6
6
|
emoji: "📎"
|
|
7
7
|
category: "writing"
|
|
8
8
|
subcategory: "citation"
|
|
9
|
-
keywords: ["citation assistant", "
|
|
9
|
+
keywords: ["citation assistant", "OpenAlex", "Claude Code skill", "reference lookup", "academic citation"]
|
|
10
10
|
source: "https://github.com/ZhangNy301/citation-assistant"
|
|
11
11
|
---
|
|
12
12
|
|
|
@@ -14,7 +14,7 @@ metadata:
|
|
|
14
14
|
|
|
15
15
|
## Overview
|
|
16
16
|
|
|
17
|
-
Citation Assistant is a Claude Code skill that integrates
|
|
17
|
+
Citation Assistant is a Claude Code skill that integrates OpenAlex and CrossRef APIs into the coding workflow for instant paper lookup, citation formatting, and reference management. Search for papers by title or keyword, get formatted BibTeX entries, find related works, and insert citations — all without leaving the terminal. Designed for researchers writing papers in LaTeX or Markdown.
|
|
18
18
|
|
|
19
19
|
## Installation
|
|
20
20
|
|
|
@@ -32,106 +32,118 @@ openclaw skills install citation-assistant
|
|
|
32
32
|
```python
|
|
33
33
|
import requests
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
OA_API = "https://api.openalex.org"
|
|
36
36
|
|
|
37
37
|
def search_papers(query, limit=5):
|
|
38
|
-
"""Search
|
|
38
|
+
"""Search OpenAlex for papers."""
|
|
39
39
|
resp = requests.get(
|
|
40
|
-
f"{
|
|
40
|
+
f"{OA_API}/works",
|
|
41
41
|
params={
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"fields": "title,authors,year,citationCount,"
|
|
45
|
-
"externalIds,abstract,venue",
|
|
42
|
+
"search": query,
|
|
43
|
+
"per_page": limit,
|
|
46
44
|
},
|
|
45
|
+
headers={"User-Agent": "ResearchPlugins/1.0 (https://wentor.ai)"},
|
|
47
46
|
)
|
|
48
|
-
return resp.json().get("
|
|
47
|
+
return resp.json().get("results", [])
|
|
49
48
|
|
|
50
49
|
papers = search_papers("attention mechanism transformer")
|
|
51
50
|
for p in papers:
|
|
52
|
-
authors = "
|
|
53
|
-
print(f"[{p
|
|
54
|
-
print(f" {authors} — Citations: {p
|
|
55
|
-
print(f" DOI: {p.get('
|
|
51
|
+
authors = [a["author"]["display_name"] for a in p.get("authorships", [])[:3]]
|
|
52
|
+
print(f"[{p.get('publication_year')}] {p.get('title')}")
|
|
53
|
+
print(f" {', '.join(authors)} — Citations: {p.get('cited_by_count')}")
|
|
54
|
+
print(f" DOI: {p.get('doi', 'N/A')}")
|
|
56
55
|
```
|
|
57
56
|
|
|
58
57
|
### BibTeX Generation
|
|
59
58
|
|
|
60
59
|
```python
|
|
61
|
-
def get_bibtex(
|
|
62
|
-
"""Get BibTeX for a
|
|
60
|
+
def get_bibtex(doi):
|
|
61
|
+
"""Get BibTeX for a paper via CrossRef DOI resolution."""
|
|
63
62
|
resp = requests.get(
|
|
64
|
-
f"
|
|
65
|
-
|
|
66
|
-
"fields": "title,authors,year,venue,externalIds,"
|
|
67
|
-
"journal,publicationTypes",
|
|
68
|
-
},
|
|
63
|
+
f"https://api.crossref.org/works/{doi}",
|
|
64
|
+
headers={"User-Agent": "ResearchPlugins/1.0 (https://wentor.ai; mailto:dev@wentor.ai)"},
|
|
69
65
|
)
|
|
70
|
-
|
|
66
|
+
msg = resp.json().get("message", {})
|
|
71
67
|
|
|
72
68
|
# Generate citation key
|
|
73
|
-
|
|
74
|
-
|
|
69
|
+
authors = msg.get("author", [])
|
|
70
|
+
first_author = authors[0].get("family", "unknown").lower() if authors else "unknown"
|
|
71
|
+
year = str(msg.get("published", {}).get("date-parts", [[""]])[0][0])
|
|
72
|
+
key = f"{first_author}{year}"
|
|
75
73
|
|
|
76
74
|
# Build BibTeX
|
|
77
|
-
authors_str = " and ".join(a
|
|
78
|
-
|
|
75
|
+
authors_str = " and ".join(f"{a.get('given', '')} {a.get('family', '')}".strip() for a in authors)
|
|
76
|
+
doi_str = msg.get("DOI", "")
|
|
77
|
+
|
|
78
|
+
title = msg.get("title", [""])[0] if isinstance(msg.get("title"), list) else msg.get("title", "")
|
|
79
|
+
journal = msg.get("container-title", [""])[0] if msg.get("container-title") else ""
|
|
79
80
|
|
|
80
81
|
bibtex = f"""@article{{{key},
|
|
81
|
-
title = {{{
|
|
82
|
+
title = {{{title}}},
|
|
82
83
|
author = {{{authors_str}}},
|
|
83
|
-
year = {{{
|
|
84
|
-
journal = {{{
|
|
85
|
-
doi = {{{
|
|
84
|
+
year = {{{year}}},
|
|
85
|
+
journal = {{{journal}}},
|
|
86
|
+
doi = {{{doi_str}}},
|
|
86
87
|
}}"""
|
|
87
88
|
return bibtex
|
|
88
89
|
|
|
89
90
|
# Example
|
|
90
|
-
bibtex = get_bibtex("
|
|
91
|
+
bibtex = get_bibtex("10.18653/v1/N19-1423")
|
|
91
92
|
print(bibtex)
|
|
92
93
|
```
|
|
93
94
|
|
|
94
95
|
### Citation Context
|
|
95
96
|
|
|
96
97
|
```python
|
|
97
|
-
def
|
|
98
|
-
"""Get papers that cite this work
|
|
98
|
+
def get_citing_works(openalex_id, limit=10):
|
|
99
|
+
"""Get papers that cite this work via OpenAlex."""
|
|
99
100
|
resp = requests.get(
|
|
100
|
-
f"{
|
|
101
|
+
f"{OA_API}/works",
|
|
101
102
|
params={
|
|
102
|
-
"
|
|
103
|
-
"
|
|
103
|
+
"filter": f"cites:{openalex_id}",
|
|
104
|
+
"per_page": limit,
|
|
105
|
+
"sort": "cited_by_count:desc",
|
|
104
106
|
},
|
|
107
|
+
headers={"User-Agent": "ResearchPlugins/1.0 (https://wentor.ai)"},
|
|
105
108
|
)
|
|
106
|
-
|
|
109
|
+
results = resp.json().get("results", [])
|
|
107
110
|
|
|
108
|
-
for
|
|
109
|
-
|
|
110
|
-
print(f"\n{paper
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
print(f" Intent: {cit.get('intents', ['unknown'])}")
|
|
111
|
+
for paper in results:
|
|
112
|
+
authors = [a["author"]["display_name"] for a in paper.get("authorships", [])[:3]]
|
|
113
|
+
print(f"\n{paper.get('title')} ({paper.get('publication_year', '?')})")
|
|
114
|
+
print(f" Authors: {', '.join(authors)}")
|
|
115
|
+
print(f" Citations: {paper.get('cited_by_count', 0)}")
|
|
114
116
|
|
|
115
|
-
|
|
117
|
+
get_citing_works("W2741809807")
|
|
116
118
|
```
|
|
117
119
|
|
|
118
120
|
### Related Paper Discovery
|
|
119
121
|
|
|
120
122
|
```python
|
|
121
|
-
def find_related(
|
|
122
|
-
"""Find papers related to a given paper."""
|
|
123
|
+
def find_related(openalex_id, limit=10):
|
|
124
|
+
"""Find papers related to a given paper via OpenAlex."""
|
|
125
|
+
# Get the paper's concepts, then search for similar works
|
|
123
126
|
resp = requests.get(
|
|
124
|
-
f"{
|
|
127
|
+
f"{OA_API}/works/{openalex_id}",
|
|
128
|
+
headers={"User-Agent": "ResearchPlugins/1.0 (https://wentor.ai)"},
|
|
129
|
+
)
|
|
130
|
+
paper = resp.json()
|
|
131
|
+
concepts = [c["display_name"] for c in paper.get("concepts", [])[:3]]
|
|
132
|
+
|
|
133
|
+
related_resp = requests.get(
|
|
134
|
+
f"{OA_API}/works",
|
|
125
135
|
params={
|
|
126
|
-
"
|
|
127
|
-
"
|
|
136
|
+
"search": " ".join(concepts),
|
|
137
|
+
"per_page": limit,
|
|
138
|
+
"sort": "cited_by_count:desc",
|
|
128
139
|
},
|
|
140
|
+
headers={"User-Agent": "ResearchPlugins/1.0 (https://wentor.ai)"},
|
|
129
141
|
)
|
|
130
|
-
return
|
|
142
|
+
return related_resp.json().get("results", [])
|
|
131
143
|
|
|
132
|
-
related = find_related("
|
|
144
|
+
related = find_related("W2741809807")
|
|
133
145
|
for p in related:
|
|
134
|
-
print(f"[{p
|
|
146
|
+
print(f"[{p.get('publication_year')}] {p.get('title')} ({p.get('cited_by_count')} cites)")
|
|
135
147
|
```
|
|
136
148
|
|
|
137
149
|
## Workflow Integration
|
|
@@ -161,10 +173,11 @@ def build_bibliography(queries, output_file="refs.bib"):
|
|
|
161
173
|
for query in queries:
|
|
162
174
|
papers = search_papers(query, limit=3)
|
|
163
175
|
for paper in papers:
|
|
164
|
-
|
|
165
|
-
if
|
|
166
|
-
seen_ids.add(
|
|
167
|
-
bibtex = get_bibtex(
|
|
176
|
+
doi = paper.get("doi")
|
|
177
|
+
if doi and doi not in seen_ids:
|
|
178
|
+
seen_ids.add(doi)
|
|
179
|
+
bibtex = get_bibtex(doi.replace("https://doi.org/", ""))
|
|
180
|
+
|
|
168
181
|
all_bibtex.append(bibtex)
|
|
169
182
|
|
|
170
183
|
with open(output_file, "w") as f:
|
|
@@ -189,4 +202,5 @@ build_bibliography([
|
|
|
189
202
|
## References
|
|
190
203
|
|
|
191
204
|
- [Citation Assistant GitHub](https://github.com/ZhangNy301/citation-assistant)
|
|
192
|
-
- [
|
|
205
|
+
- [OpenAlex API](https://api.openalex.org/)
|
|
206
|
+
- [CrossRef API](https://api.crossref.org/)
|
|
@@ -14,7 +14,7 @@ metadata:
|
|
|
14
14
|
|
|
15
15
|
## Overview
|
|
16
16
|
|
|
17
|
-
OneCite is an AI-powered toolkit for parsing, completing, and formatting academic references. Given incomplete or messy citation strings, it extracts structured metadata, fills in missing fields via API lookups (CrossRef,
|
|
17
|
+
OneCite is an AI-powered toolkit for parsing, completing, and formatting academic references. Given incomplete or messy citation strings, it extracts structured metadata, fills in missing fields via API lookups (CrossRef, OpenAlex), and outputs clean formatted references in any style (APA, MLA, BibTeX, Chicago). Available as a Python library and MCP server for agent integration.
|
|
18
18
|
|
|
19
19
|
## Installation
|
|
20
20
|
|
|
@@ -8,6 +8,7 @@ metadata:
|
|
|
8
8
|
openclaw:
|
|
9
9
|
category: "writing"
|
|
10
10
|
subcategory: "citation"
|
|
11
|
+
emoji: "📖"
|
|
11
12
|
keywords:
|
|
12
13
|
- zotero
|
|
13
14
|
- references
|
|
@@ -37,7 +38,7 @@ The plugin is particularly powerful for literature reviews, where you need to sy
|
|
|
37
38
|
- Identifies DOIs, arXiv IDs, and other persistent identifiers within references
|
|
38
39
|
|
|
39
40
|
**Database Matching**
|
|
40
|
-
- Matches parsed references against Crossref,
|
|
41
|
+
- Matches parsed references against Crossref, OpenAlex, and other academic databases
|
|
41
42
|
- Retrieves complete metadata for matched references (abstract, keywords, citation count)
|
|
42
43
|
- Displays match confidence to help users verify correct identification
|
|
43
44
|
- Supports manual correction when automatic matching fails
|
|
@@ -16,7 +16,7 @@ metadata:
|
|
|
16
16
|
|
|
17
17
|
Zotero is the most widely used open-source reference manager in academia, offering a powerful combination of local storage, cloud sync, browser integration, and a comprehensive API. While most researchers use Zotero through its desktop application and browser connector, the Zotero API enables programmatic access that is essential for automated research workflows—saving papers from scripts, batch-importing search results, organizing libraries algorithmically, and integrating reference management into custom research pipelines.
|
|
18
18
|
|
|
19
|
-
This skill covers using the Zotero Web API to create, read, update, and organize library items programmatically. It is designed for researchers who want to automate parts of their reference management workflow: importing papers from arXiv or
|
|
19
|
+
This skill covers using the Zotero Web API to create, read, update, and organize library items programmatically. It is designed for researchers who want to automate parts of their reference management workflow: importing papers from arXiv or OpenAlex searches directly into Zotero, auto-tagging papers based on content analysis, organizing collections programmatically, and exporting citations in various formats.
|
|
20
20
|
|
|
21
21
|
The skill complements the existing `zotero-api` skill by focusing specifically on practical scholar workflows—the common patterns a researcher uses when integrating Zotero into their daily literature management.
|
|
22
22
|
|