{
  "identity": {
    "name": "anthropic-pdf-skill",
    "version": "latest",
    "publisher": {
      "name": "anthropics",
      "verified": false
    },
    "source": "https://github.com/anthropics/skills/tree/main/skills/pdf",
    "license": "Proprietary. LICENSE.txt has complete terms",
    "type": "skill",
    "git_sha": "98669c11ca63e9c81c11501e1437e5c47b556621"
  },
  "description": {
    "summary": "A comprehensive PDF manipulation skill that can read, create, edit, merge, split, watermark, fill forms, and perform OCR on PDF documents.",
    "semantic": {
      "capabilities": [
        "pdf_reading",
        "text_extraction",
        "pdf_merging",
        "pdf_splitting",
        "watermarking",
        "form_filling",
        "pdf_creation",
        "ocr",
        "image_extraction",
        "pdf_encryption",
        "page_rotation"
      ],
      "constraints": {
        "file_format": "PDF files only",
        "dependencies": "Requires pypdf, pdfplumber, reportlab, pytesseract, pdf2image, pandas, poppler-utils, qpdf, pdftk",
        "ocr_requirement": "Tesseract OCR engine needed for scanned document processing"
      }
    },
    "categories": [
      "document_processing",
      "file_manipulation",
      "ocr",
      "pdf_tools",
      "text_extraction"
    ],
    "solves": "I need to work with PDF files by reading their content, combining multiple PDFs, splitting them apart, adding watermarks, filling forms, or making scanned documents searchable."
  },
  "dependencies": [
    {
      "type": "python_package",
      "name": "pypdf",
      "version": null,
      "required": true
    },
    {
      "type": "python_package",
      "name": "pdfplumber",
      "version": null,
      "required": true
    },
    {
      "type": "python_package",
      "name": "reportlab",
      "version": null,
      "required": true
    },
    {
      "type": "python_package",
      "name": "pytesseract",
      "version": null,
      "required": false
    },
    {
      "type": "python_package",
      "name": "pdf2image",
      "version": null,
      "required": false
    },
    {
      "type": "python_package",
      "name": "pandas",
      "version": null,
      "required": false
    },
    {
      "type": "runtime",
      "name": "poppler-utils",
      "version": null,
      "required": false
    },
    {
      "type": "runtime",
      "name": "qpdf",
      "version": null,
      "required": false
    },
    {
      "type": "runtime",
      "name": "pdftk",
      "version": null,
      "required": false
    }
  ],
  "supply_chain": {
    "sbom": {
      "format": "N/A",
      "version": "N/A",
      "generated_at": "2026-03-28T19:03:14.317Z",
      "component_count": 0,
      "direct_dependencies": 0,
      "transitive_dependencies": 0,
      "vulnerability_summary": {
        "critical": 0,
        "high": 0,
        "medium": 0,
        "low": 0,
        "none": 0
      },
      "flagged_components": []
    },
    "last_dependency_audit": "2026-03-28T19:03:14.317Z"
  },
  "provenance": {
    "license_present": true,
    "license_file": "LICENSE.txt",
    "security_md_present": false,
    "readme_present": true,
    "readme_empty": false,
    "namespace_match": true,
    "last_commit_date": "2026-03-25T11:10:46-04:00",
    "contributor_count": 1,
    "repo_age_days": 3,
    "template_description": true
  },
  "owasp_mcp_coverage": [
    {
      "id": "MCP01",
      "name": "Excessive Agency & Permissions",
      "covered_by": [
        {
          "stage": "security",
          "description": "Cisco scanner behavioral analysis of permission scope"
        }
      ],
      "status": "covered"
    },
    {
      "id": "MCP02",
      "name": "Unauthorized Data Access",
      "covered_by": [
        {
          "stage": "adversarial",
          "description": "Category 3 (data exfiltration) attack patterns"
        }
      ],
      "status": "covered"
    },
    {
      "id": "MCP03",
      "name": "Tool Poisoning",
      "covered_by": [
        {
          "stage": "adversarial",
          "description": "Category 1 (prompt injection) and Category 5 (context poisoning) attack patterns"
        }
      ],
      "status": "covered"
    },
    {
      "id": "MCP04",
      "name": "Supply Chain Vulnerabilities",
      "covered_by": [
        {
          "stage": "sbom",
          "description": "SBOM generation (syft/cdxgen) and vulnerability scanning (grype/osv-scanner/npm audit)"
        }
      ],
      "status": "gap"
    },
    {
      "id": "MCP05",
      "name": "Command Injection",
      "covered_by": [
        {
          "stage": "adversarial",
          "description": "Category 2 (privilege escalation) and Category 6 (repo config injection) attack patterns"
        }
      ],
      "status": "covered"
    },
    {
      "id": "MCP06",
      "name": "Intent Subversion",
      "covered_by": [
        {
          "stage": "adversarial",
          "description": "Category 1 (prompt injection) and Category 4 (capability squatting) attack patterns"
        }
      ],
      "status": "covered"
    },
    {
      "id": "MCP07",
      "name": "Insecure Data Handling",
      "covered_by": [
        {
          "stage": "security",
          "description": "Cisco scanner data flow and sensitive data handling analysis"
        }
      ],
      "status": "covered"
    },
    {
      "id": "MCP08",
      "name": "Insufficient Logging",
      "covered_by": [],
      "status": "gap",
      "gap_note": "Not directly tested — logging adequacy requires runtime observation beyond current pipeline scope"
    },
    {
      "id": "MCP09",
      "name": "Resource Exhaustion",
      "covered_by": [
        {
          "stage": "fingerprint",
          "description": "Resource profiling (CPU, memory) during functional and adversarial testing"
        }
      ],
      "status": "covered"
    },
    {
      "id": "MCP10",
      "name": "Context Injection",
      "covered_by": [
        {
          "stage": "adversarial",
          "description": "Category 5 (context poisoning) attack patterns"
        }
      ],
      "status": "covered"
    }
  ],
  "composability": {
    "tested_with": [],
    "known_conflicts": [],
    "certified_workflows": []
  },
  "trust": {
    "score": 94,
    "grade": "A",
    "maturity": "Initial",
    "scheme_version": "2.0",
    "verified_at": "2026-03-28T19:03:14.320Z",
    "consumer_confirmations": {
      "total": 0,
      "confirmation_rate": 0,
      "last_30_days": {
        "consumptions": 0,
        "confirmations": 0,
        "disputes": 0,
        "dispute_categories": {}
      }
    },
    "provenance": {
      "hash": "sha256:81c13ba12742812f50a88e40dcdf02978548d8bb6e18f24fb34e96e96b998fe5",
      "signed_by": "fidensa.com",
      "signature": "see .cert.json artifact",
      "source_verified": true,
      "last_source_audit": "2026-03-28T19:03:14.320Z",
      "attestation_url": "https://fidensa.com/v1/attestation/"
    },
    "history": {
      "first_verified": "2026-03-28T19:03:14.320Z",
      "total_versions_verified": 1,
      "breaking_changes_detected": 0
    },
    "behavioral_fingerprint": {
      "fingerprint_version": "1.0",
      "baseline_created_at": "2026-03-28T19:03:08.034Z",
      "baseline_sample_size": 8,
      "signals": {
        "response_time_ms": {
          "p50": 21328,
          "p95": 24993,
          "p99": 24993
        },
        "error_rate": 0,
        "output_size_bytes": {
          "p50": 5181,
          "p95": 6850,
          "mean": 4620.5
        },
        "skill_specific": {
          "trigger_timing_ms": {
            "min": 11456,
            "max": 24993,
            "mean": 20626.2,
            "p50": 21720,
            "p95": 24993,
            "p99": 24993,
            "sample_count": 5
          },
          "trigger_activation_rate": 1,
          "negative_rejection_rate": 1
        }
      },
      "drift_status": "baseline"
    },
    "score_breakdown": [
      {
        "signal": "security_scan",
        "score": 0.874,
        "weight": 0.15,
        "contribution": 0.1311,
        "source": "stage2b-security",
        "rationale": "3 finding(s) across severity levels, decay-scored to 87%"
      },
      {
        "signal": "supply_chain",
        "score": 1,
        "weight": 0.1,
        "contribution": 0.1,
        "source": "stage2a-sbom",
        "rationale": "Skills have no dependency tree — supply chain N/A, scored as clean"
      },
      {
        "signal": "adversarial",
        "score": 1,
        "weight": 0.25,
        "contribution": 0.25,
        "source": "stage3b-adversarial",
        "rationale": "No adversarial findings — clean"
      },
      {
        "signal": "provenance",
        "score": 0.8,
        "weight": 0.2,
        "contribution": 0.16,
        "source": "stage1-ingest",
        "rationale": "source hash present, publisher identified, build succeeded, extraction method: llm_assisted"
      },
      {
        "signal": "consumer_confirm",
        "score": 1,
        "weight": 0.1,
        "contribution": 0.1,
        "source": "stage3a-functional",
        "rationale": "Pipeline-derived baseline: 5/5 triggers activated (no external reports yet)"
      },
      {
        "signal": "behavioral_pass",
        "score": 1,
        "weight": 0.1,
        "contribution": 0.1,
        "source": "stage3a-functional",
        "rationale": "5/5 triggers activated (100.0%)"
      },
      {
        "signal": "contract_accuracy",
        "score": 1,
        "weight": 0.06,
        "contribution": 0.06,
        "source": "stage3a-functional",
        "rationale": "3/3 negative tests passed (100.0%)"
      },
      {
        "signal": "uptime",
        "score": 1,
        "weight": 0.04,
        "contribution": 0.04,
        "source": "pipeline-derived",
        "rationale": "Static instruction text — uptime N/A, scored as available"
      }
    ],
    "max_achievable_score": 100,
    "review_flags": [
      {
        "category": "content",
        "severity": "medium",
        "source": "stage4-assembler",
        "description": "Description section was synthesized by LLM from stage data — verify accuracy",
        "blocks_certification": false,
        "kind": "note"
      },
      {
        "category": "publisher",
        "severity": "medium",
        "source": "stage1-ingest",
        "description": "Publisher \"anthropics\" is not verified — first certification from this publisher",
        "blocks_certification": false,
        "kind": "note"
      },
      {
        "category": "provenance",
        "severity": "low",
        "source": "stage1-provenance",
        "description": "No SECURITY.md or SECURITY.txt file found — no published vulnerability reporting process",
        "blocks_certification": false,
        "kind": "note"
      },
      {
        "category": "provenance",
        "severity": "low",
        "source": "stage1-provenance",
        "description": "Single contributor — no peer review evidence in commit history",
        "blocks_certification": false,
        "kind": "note"
      },
      {
        "category": "provenance",
        "severity": "low",
        "source": "stage1-provenance",
        "description": "Repository is 3 days old — recently created",
        "blocks_certification": false,
        "kind": "note"
      },
      {
        "category": "provenance",
        "severity": "low",
        "source": "stage1-provenance",
        "description": "Package description appears to be boilerplate or template text",
        "blocks_certification": false,
        "kind": "note"
      }
    ]
  },
  "skill": {
    "interface": {
      "format": "markdown",
      "agent_context": {
        "required_capabilities": [
          "code_execution",
          "filesystem:read",
          "filesystem:write"
        ],
        "required_tools": [
          "python",
          "bash"
        ],
        "expected_context": "User requests involving PDF files, either existing files to process or requirements to create new PDFs"
      },
      "triggers": {
        "activation": "This skill activates whenever the user wants to do anything with PDF files, including reading, extracting, combining, splitting, rotating, watermarking, creating, form filling, encrypting, or OCR operations.",
        "scope": "This skill handles all PDF-related operations from basic text extraction to advanced manipulation and creation tasks."
      },
      "instruction_count": 234,
      "file_count": 4
    },
    "behavioral_guarantees": {
      "does": [
        "Extract text and tables from PDF files using pdfplumber and pypdf",
        "Merge multiple PDFs into a single document",
        "Split PDFs into individual pages or page ranges",
        "Rotate PDF pages by specified degrees",
        "Add watermarks to PDF documents",
        "Create new PDFs from scratch using reportlab",
        "Fill PDF forms following FORMS.md instructions",
        "Encrypt and decrypt PDF files with passwords",
        "Extract images from PDFs using command-line tools",
        "Perform OCR on scanned PDFs using pytesseract and pdf2image",
        "Use ReportLab XML markup tags for subscripts and superscripts instead of Unicode characters"
      ],
      "does_not": [
        "Use Unicode subscript/superscript characters (₀₁₂₃₄₅₆₇₈₉, ⁰¹²³⁴⁵⁶⁷⁸⁹) in ReportLab PDFs as they render as black boxes"
      ],
      "scope_boundaries": {
        "modifies_files": true,
        "creates_files": true,
        "deletes_files": false,
        "makes_network_requests": false,
        "accesses_env_variables": false,
        "invokes_external_tools": true
      },
      "failure_modes": [
        {
          "condition": "when Unicode subscript/superscript characters are used in ReportLab",
          "behavior": "the agent uses XML markup tags instead to avoid rendering issues"
        },
        {
          "condition": "when PDF form filling is requested",
          "behavior": "the agent follows specific instructions from FORMS.md"
        },
        {
          "condition": "when advanced features are needed",
          "behavior": "the agent refers to REFERENCE.md for detailed examples"
        }
      ]
    },
    "security": {
      "risk_profile": "low",
      "threat_analysis": {},
      "scan_results": {
        "cisco_skill_scanner": {
          "status": "FAIL",
          "findings": {
            "critical": 0,
            "high": 0,
            "medium": 1,
            "low": 2
          },
          "analyzers": [
            "static",
            "behavioral",
            "llm",
            "meta"
          ],
          "scanned_at": "2026-03-28T19:00:20.126Z",
          "details": [
            {
              "severity": "low",
              "category": "data_exfiltration",
              "summary": "Several scripts accept file paths as command-line arguments without validation, potentially allowing access to files outside the intended working directory. While this is a local skill running on the user's machine, it could be exploited if malicious file paths are provided through user input or automated processes.",
              "analyzer": "llm",
              "skill_name": null,
              "aitech_id": null,
              "aisubtech_id": null
            },
            {
              "severity": "medium",
              "category": "skill_discovery_abuse",
              "summary": "The skill manifest does not specify allowed-tools, creating uncertainty about intended tool usage restrictions. While this field is optional, the skill contains Python scripts that perform file I/O operations, network requests (pdf2image, pytesseract), and system interactions. Without explicit tool declarations, users cannot verify if the skill's actual behavior aligns with intended security boundaries.",
              "analyzer": "llm",
              "skill_name": null,
              "aitech_id": null,
              "aisubtech_id": null
            },
            {
              "severity": "low",
              "category": "supply_chain_attack",
              "summary": "The skill relies on external Python libraries (pypdf, pdfplumber, reportlab, pytesseract, pdf2image, PIL) without specifying exact versions. While the skill doesn't directly install these packages, it assumes their availability and could be affected by malicious updates or breaking changes in these dependencies.",
              "analyzer": "llm",
              "skill_name": null,
              "aitech_id": null,
              "aisubtech_id": null
            }
          ]
        }
      },
      "adversarial_testing": {
        "methodology_version": "1.0",
        "categories_tested": [
          "prompt_injection_chains",
          "capability_squatting",
          "context_poisoning"
        ],
        "findings": [],
        "tested_at": "2026-03-28T19:03:14.317Z"
      }
    }
  }
}