Compare experimental method details between two Zotero PDF papers, identify protocol differences (ratios, dosages, timing, conditions), search supporting literature to explain why they differ, and generate an HTML report. Use when you need a parameter-level comparison of two methods and evidence-backed reasons for discrepancies.
64
76%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Fix and improve this skill with Tessl
tessl review fix ./scientific-skills/Other/experiment-detail-comparator/SKILL.mdRun this minimal command first to verify the supported execution path:
python scripts/compare_methods.py --helpUse this skill when you need to:
mistral-pdf-to-markdown workflow for robust text extraction.>=3.10json (stdlib)subprocess (stdlib)pathlib (stdlib)re (stdlib)pdfplumber >=0.10.0 (PDF table extraction)PyPDF2 >=3.0.0 (PDF text extraction / parsing support)requests >=2.31.0 (download PDFs from URLs)Install optional dependencies:
pip install "pdfplumber>=0.10.0" "PyPDF2>=3.0.0" "requests>=2.31.0"mcp__zotero__*mistral-pdf-to-markdown skill (requires MISTRAL_API_KEY)Set in Notes/.env:
ZOTERO_API_KEY (required for Zotero web library access; optional for local-only)ZOTERO_LIBRARY_TYPE (user or group)ZOTERO_LIBRARY_ID (your Zotero library ID)MISTRAL_API_KEY (required for best PDF→Markdown conversion)Compare two papers by Zotero search terms:
python run_comparison.py \
"CRISPR-Cas9 knockout in HeLa cells" \
"Efficient genome editing in HEK293 cells" \
./outputCompare two papers by Zotero attachment keys:
python run_comparison.py \
ABCDEFGHIJKLMNOPQRSTUVWXYZ123456 \
ZYXWVUTSRQPONMLKJIHGFEDCBA654321 \
./outputCompare two local PDFs:
python run_comparison.py \
./paper1.pdf \
./paper2.pdf \
./outputExpected outputs (in ./output):
comparison_report.htmlmethod_details.jsonexplanations.jsonresult1 = mcp__zotero__zotero_search_items(query="paper 1 title or author", limit=5)
item_key1 = result1[0]["key"]
result2 = mcp__zotero__zotero_search_items(query="paper 2 title or author", limit=5)
item_key2 = result2[0]["key"]
children1 = mcp__zotero__zotero_get_item_children(item_key=item_key1)
attachment_key1 = [c for c in children1 if c.get("type") == "application/pdf"][0]["key"]
children2 = mcp__zotero__zotero_get_item_children(item_key=item_key2)
attachment_key2 = [c for c in children2 if c.get("type") == "application/pdf"][0]["key"]python scripts/get_zotero_pdf.py "$ATTACHMENT_KEY1"
python scripts/get_zotero_pdf.py "$ATTACHMENT_KEY2"python scripts/convert_pdf_to_markdown.py "PATH_TO_PDF1" "temp/paper1.md"
python scripts/convert_pdf_to_markdown.py "PATH_TO_PDF2" "temp/paper2.md"python scripts/extract_method_section.py temp/paper1.md temp/paper1_method.json
python scripts/extract_method_section.py temp/paper2.md temp/paper2_method.jsonpython scripts/compare_methods.py temp/paper1_method.json temp/paper2_method.json output/comparison.jsonpython scripts/search_explanations.py output/comparison.json output/explanations.jsonpython scripts/generate_html_report.py \
temp/paper1_method.json \
temp/paper2_method.json \
output/comparison.json \
output/explanations.json \
output/comparison_report.htmlThe extraction step aims to produce a structured JSON object per paper with:
Basic parameters
Experimental design
Materials detail
Equipment detail
Sample information
Key steps
Use when parameters are primarily in tables (common in materials lists, primer tables, buffer recipes):
python scripts/extract_pdf_tables.py paper.pdf output/tables.jsonOutput includes detected table types (e.g., materials/parameters/results) and normalized JSON rows.
Use when you need full-text parsing, DOI detection, or multi-language handling:
python scripts/download_full_pdf.py https://example.com/paper.pdf ./downloads
# or
python scripts/download_full_pdf.py ./local/paper.pdf ./parsedFeatures:
compare_methods(...) identifies differences across normalized fields and produces:
Example comparison table structure:
| Parameter | Paper 1 | Paper 2 | Difference |
|---|---|---|---|
| Reagent concentration | 10 mM | 20 mM | 2× higher in Paper 2 |
| Temperature | 37°C | 25°C | 12°C lower in Paper 2 |
| Duration | 2 h | 4 h | 2× longer in Paper 2 |
For each significant difference, the skill builds targeted queries such as:
{method_name} {parameter} optimization{parameter} effect on yield{reagent} concentration protocol comparisonSupported sources (depending on your toolchain availability):
The output is an explanation object per parameter with:
Each explanation is graded:
The report includes:
Primary output file:
comparison_report.html (shareable, human-readable)Supporting outputs:
method_details.json (structured extraction for both papers)explanations.json (search results + graded rationales)experiment_detail_comparator_result.md unless the skill documentation defines a better convention.Run this minimal verification path before full execution when possible:
python scripts/compare_methods.py --helpExpected output format:
Result file: experiment_detail_comparator_result.md
Validation summary: PASS/FAIL with brief notes
Assumptions: explicit list if any63c61d3
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.