From manuscript-tools
Use when the user wants to fix bare/written-out citations in a Quarto or LaTeX document, convert plain-text citations to proper BibTeX citation commands, clean up a bibliography, or check if working papers have been published
npx claudepluginhub halidaee/econtools_marketplace --plugin manuscript-toolsThis skill uses the workspace's default tool permissions.
Detect written-out citations in `.qmd`/`.tex` files, resolve them to BibTeX entries, replace with proper citation commands, and check working papers for published versions.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Calculates TAM/SAM/SOM using top-down, bottom-up, and value theory methodologies for market sizing, revenue estimation, and startup validation.
Detect written-out citations in .qmd/.tex files, resolve them to BibTeX entries, replace with proper citation commands, and check working papers for published versions.
Requires 3 MCP servers (see ../../mcps/README.md for installation):
@key, \cite{key}, etc.).bib file (don't create a new one)Ask the user when:
.bib entries match the same author-yearProceed automatically when:
.bib fileGoal: Identify what document to fix and where its bibliography file is
Detect document type:
.qmd file → Quarto (uses @key syntax).tex file → LaTeX (uses \citet{key} or \citep{key} syntax)Locate bibliography file:
.qmd: Extract from bibliography: field in YAML frontmatter.tex: Extract from \bibliography{filename} command.bib fileGoal: Find all written-out citations (like "Author (Year)") that need to be converted to proper citation commands
Use bibtex-mcp tool:
bibtex-mcp.scan_bare_citations(path: document_path)
Returns array of citations with:
text — matched citation text (e.g., "Conley and Udry (2010)")line — line number in documentauthors — extracted author last namesyear — extracted yearcitation_type — "narrative" or "parenthetical"locator — page/chapter reference if presentprefix, suffix — additional text like "see" or "among others"This gives us a to-do list of all citations that need fixing. Report to user: "Found N bare citations to resolve."
Goal: Index the existing .bib file so we can check if papers are already there before searching APIs
Use bibtex-mcp tool:
bibtex-mcp.parse_bib(path: bib_file_path)
Returns author-year index mapping strings like "Conley-2010" to arrays of matching entries. Each entry includes:
key — BibTeX key (e.g., "conley2010learning")type — entry type (article, techreport, unpublished, etc.)authors — array of author last namesyear, title, fieldsThis lets us quickly check "is Conley (2010) already in the .bib?" before doing expensive API searches.
Goal: For each bare citation, figure out which paper it refers to and get its proper BibTeX key
For each bare citation detected in Step 2, resolve in priority order:
Check if the citation's authors and year match any entry in the parsed bibliography index (from Step 3).
If unique match found:
bibtex-mcp.suggest_replacement(
citation_text: original_text,
key: matched_bib_key,
doc_type: "qmd" or "tex",
natbib: true
)
If multiple matches found:
If no match found:
Goal: Check if you've written about this paper in project notes/summaries before searching external APIs
Grep the project directory for markdown files mentioning the author + year:
grep -ri "Conley.*2010\|2010.*Conley" *.md --exclude=paper.qmd
Look for context like:
If context found:
If no useful context found:
Goal: Search external APIs when the paper isn't in your .bib or notes
Try CrossRef first (better for economics papers):
crossref-mcp.search(
query: "{first_author} {title_keywords}",
author: "{first_author}",
year: {year},
rows: 5
)
Each result includes a confidence_score (0-9) computed by the server:
If confidence >= 7:
crossref-mcp.get_bibtex(doi: result.doi)If confidence 4-6:
If confidence < 4 or no results:
semantic-scholar-mcp.search(
query: "{authors} {year} {title_keywords}",
year: "{year}",
limit: 5
)
semantic-scholar-mcp.get_bibtex(paper_id: result.paperId)If still no match:
Goal: Add newly-found papers to the .bib file with properly formatted keys that match the project's convention
For entries found via API (in Step 4):
Get raw BibTeX (already done in Step 4)
Rekey to match project convention:
bibtex-mcp.rekey_entry(
bibtex: raw_bibtex_string,
existing_keys: [list_of_all_keys_from_step_3],
convention: "auto"
)
Returns BibTeX with key rewritten to match project's format (e.g., conley2010learning)
Add to .bib file:
bibtex-mcp.add_entry(
bib_path: bib_file_path,
entry: rekeyed_bibtex
)
Generate citation command:
bibtex-mcp.suggest_replacement(
citation_text: original_text,
key: new_key,
doc_type: "qmd" or "tex",
natbib: true
)
Replace bare citation in the document with the suggested command
Goal: Find if any unpublished papers in the .bib have since been published, so we can upgrade them to the published version
After resolving all citations, scan the .bib file for unpublished papers:
For each @techreport or @unpublished entry:
crossref-mcp.find_published_version(
title: entry.title,
author: entry.first_author,
working_paper_year: entry.year
)
Returns published version with:
bibtex — BibTeX entry for published versionIf found and similarity >= 0.8:
bibtex-mcp.rekey_entry() and replace in .bibIf found and similarity < 0.8:
If not found:
Goal: Summarize what was accomplished
Report to user:
📊 Citation Curation Complete
Bare citations: X found, Y resolved
- Z resolved from existing .bib
- W resolved from CrossRef
- V resolved from Semantic Scholar
- U required user input
Working papers checked: N
- M upgraded to published versions
- P remain unpublished
Changes:
- Added Q new entries to bibliography.bib
- Replaced X bare citations with proper commands
User: "Fix the citations in paper.qmd"
Step 1: Found bibliography: references.bib
Step 2: Scan document
Found 5 bare citations:
- Line 12: "Conley and Udry (2010)"
- Line 45: "(Banerjee et al. 2013)"
- ...
Step 3: Parsed references.bib → 47 entries indexed
Step 4: Resolve citations
✓ "Conley and Udry (2010)" → matched existing key `conley2010learning`
Replaced with: @conley2010learning
✓ "Banerjee et al. (2013)" → not in .bib, searching APIs...
CrossRef match (score 8): "The Miracle of Microfinance?"
Added as `banerjee2013miracle`
Replaced with: [@banerjee2013miracle]
[... 3 more citations ...]
Step 6: Check working papers: 3 found
✓ "Mogstad (2012)" NBER → found published in AER 2015
Upgraded to journal article
📊 Complete: 5/5 citations resolved, 1 working paper upgraded
@key → renders as "Author (Year)"[@key] → renders as "(Author Year)"[@key, p. 45][@key1; @key2][-@key]\citet{key} → renders as "Author (Year)"\citep{key} → renders as "(Author Year)"\citep[p. 45]{key}\citep{key1, key2}\citeauthor{key}'s (\citeyear{key})The bibtex-mcp.suggest_replacement() tool handles these conversions automatically.
Issue: scan_bare_citations returns false positives
@key or \cite{})Issue: Can't find paper via any API
Issue: Multiple .bib entries with same author-year
The references-legacy/ directory contains the original implementation documentation:
citation-patterns.md — regex patterns (now in bibtex-mcp.scan_bare_citations())api-lookups.md — API instructions (now in crossref-mcp and semantic-scholar-mcp tools)bibtex-formats.md — key generation rules (now in bibtex-mcp.rekey_entry())These files are preserved for historical reference. The logic has been moved into the MCP servers for deterministic, testable implementation.