{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-05T15:52:22.043Z","url":"https://verifymcp.io/servers/com-utilitly-mcp/utilitly-mcp","markdownUrl":"https://verifymcp.io/servers/com-utilitly-mcp/utilitly-mcp.md","server":{"slug":"com-utilitly-mcp","name":"Utilitly PDF","registryName":"com.utilitly/mcp","description":"Merge, split, rotate, delete, reorder and duplicate PDF pages on your computer. Nothing is uploaded.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"utilitly-mcp","type":"npm","identifier":"@utilitly/mcp","withdrawn":false,"url":"https://verifymcp.io/servers/com-utilitly-mcp/utilitly-mcp","version":"0.1.1","transport":"stdio","scoredAt":"2026-11-05T06:13:42.785Z"},"score":{"total":73,"tier":"medium","status":"scored","weekDelta":3,"history":[{"date":"2026-11-05","total":73},{"date":"2026-11-04","total":73},{"date":"2026-11-03","total":72},{"date":"2026-11-02","total":72},{"date":"2026-11-01","total":71},{"date":"2026-10-31","total":71},{"date":"2026-10-30","total":70},{"date":"2026-10-29","total":70}]},"categories":[{"name":"Supply Chain Security","score":99,"verdict":"partial","reasons":["No malware found by supply-chain analysis.","No known CVEs affecting this package version or its production dependencies.","No install/post-install scripts declared.","3 of 14 dependencies flagged as unhealthy."],"codes":[{"code":"supplychain.malware_clean","args":{}},{"code":"cve.none","args":{}},{"code":"installscript.none","args":{}},{"code":"dephealth.assessed","args":{"deps":"14","unhealthy":"3"}}]},{"name":"Provenance & Transparency","score":45,"verdict":"fail","reasons":["Source repository is publicly reachable at the declared URL.","Provenance check failed: no build-provenance attestation is published.","Clear OSI-approved license (MIT).","Actively maintained (last published 6 days ago).","Disclosure check failed: no security disclosure policy was found in the source repository."],"codes":[{"code":"provenance.repo_verified","args":{}},{"code":"provenance.none","args":{}},{"code":"license.osi","args":{"spdx":"MIT"}},{"code":"maintenance.recent","args":{"age_days":"6"}},{"code":"disclosure.absent","args":{}}]},{"name":"Schema Quality & AI Usability","score":74,"verdict":"fail","reasons":["AI-judged instruction clarity (excellent).","Context-footprint check failed: tool/resource definitions use about 1174 tokens (~146/item across 8 items; 8 tools + 0 resources), over budget; trim descriptions and params.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.ai_quality","args":{"band":"excellent"}},{"code":"schema.footprint_heavy","args":{"avg":"146","items":"8","tools":"8","tokens":"1174","resources":"0"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":23,"verdict":"partial","reasons":["Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses."],"codes":[{"code":"stability.building_history","args":{"days":"7"}}]},{"name":"Tool Coverage","score":100,"verdict":"pass","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","100% of tool parameters carry a description.","Structured output schemas are declared (100% of tools); any adoption earns full credit."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"100"}},{"code":"toolquality.output_present","args":{"pct":"100"}}]},{"name":"Tool Safety","score":100,"verdict":"pass","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.","An AI judge read all 8 captured unit(s) of tool text and found none that tries to manipulate the model reading it."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_declared","args":{"pct":"100","annotated":"2","destructive":"2"}},{"code":"toolsafety.manipulation_clean","args":{"units":"8","judged":"8"}}]},{"name":"Capabilities","score":100,"verdict":"pass","reasons":["Implements a current MCP spec version (2026-07-28)."],"codes":[{"code":"protocol.current","args":{"version":"2026-07-28"}}]}],"inconclusive":[],"malware":[],"components":[{"slug":"utilitly-mcp","type":"npm","identifier":"@utilitly/mcp","withdrawn":false,"score":73,"current":true,"url":"https://verifymcp.io/servers/com-utilitly-mcp/utilitly-mcp","markdownUrl":"https://verifymcp.io/servers/com-utilitly-mcp/utilitly-mcp.md"}],"facts":[{"label":"Registry","value":"npm"},{"label":"Package","value":"@utilitly/mcp"},{"label":"Version","value":"0.1.1"},{"label":"Transport","value":"stdio"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"pdf_info","title":"PDF info","description":"Reads a PDF and reports its page count, file size, first page size in points, and whether it is password-protected. Changes nothing.","inputs":[{"name":"path","type":"string","required":true,"description":"Absolute path to a PDF file, or one starting with ~/."}],"outputs":[{"name":"encrypted","type":"boolean","required":true,"description":null},{"name":"file_size_bytes","type":"integer","required":true,"description":null},{"name":"first_page","type":null,"required":true,"description":null},{"name":"pages","type":null,"required":true,"description":"Null when the file is encrypted in a way that hides its page list"},{"name":"path","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":56},{"name":"merge_pdfs","title":"Merge PDFs","description":"Combines PDFs into one, in the order given. The result is named after the first file, with -merged. Writes the result as a new file next to the input (or to output_path) and never replaces an existing file; the input is left unchanged.","inputs":[{"name":"output_path","type":"string","required":false,"description":"Optional absolute path for the new PDF, ending in .pdf. It must not exist yet. By default the result goes next to the input."},{"name":"paths","type":"array","required":true,"description":"Absolute paths of the PDFs to combine, in order"}],"outputs":[{"name":"output_path","type":"string","required":true,"description":"Where the new PDF was written"},{"name":"pages","type":"integer","required":true,"description":"Pages in the new PDF"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":116},{"name":"split_pdf","title":"Split a PDF","description":"Splits a PDF into one new file per comma-separated range, named -part1, -part2 and so on. \"1-2, 3-end\" gives two files, and one call writes at most 1,000 (or one per page for longer PDFs). Never replaces an existing file; the input is left unchanged.","inputs":[{"name":"output_folder","type":"string","required":false,"description":"Optional absolute path of an existing folder for the files. By default they go next to the input."},{"name":"path","type":"string","required":true,"description":"Absolute path to a PDF file, or one starting with ~/."},{"name":"ranges","type":"string","required":true,"description":"Ranges such as \"1-2, 3, 4-end\": one output file per comma-separated part"}],"outputs":[{"name":"output_paths","type":"array","required":true,"description":"The new PDFs, one per range"},{"name":"pages","type":"array","required":true,"description":"Pages in each new PDF"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":153},{"name":"extract_pages","title":"Extract pages","description":"Copies the selected pages into one new PDF, in page order, named with -pages. Writes the result as a new file next to the input (or to output_path) and never replaces an existing file; the input is left unchanged.","inputs":[{"name":"output_path","type":"string","required":false,"description":"Optional absolute path for the new PDF, ending in .pdf. It must not exist yet. By default the result goes next to the input."},{"name":"pages","type":"string","required":true,"description":"Pages, such as \"2\", \"1-3, 5\" or \"4-end\". Commas separate parts."},{"name":"path","type":"string","required":true,"description":"Absolute path to a PDF file, or one starting with ~/."}],"outputs":[{"name":"output_path","type":"string","required":true,"description":"Where the new PDF was written"},{"name":"pages","type":"integer","required":true,"description":"Pages in the new PDF"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":142},{"name":"rotate_pdf","title":"Rotate pages","description":"Turns pages clockwise by a multiple of 90 degrees (negative turns counter-clockwise), every page unless pages is given. Named with -rotated. Writes the result as a new file next to the input (or to output_path) and never replaces an existing file; the input is left unchanged.","inputs":[{"name":"angle","type":"integer","required":true,"description":"Degrees clockwise: 90, 180, 270, or -90 for counter-clockwise"},{"name":"output_path","type":"string","required":false,"description":"Optional absolute path for the new PDF, ending in .pdf. It must not exist yet. By default the result goes next to the input."},{"name":"pages","type":"string","required":false,"description":"Pages, such as \"2\", \"1-3, 5\" or \"4-end\". Commas separate parts. Every page when left out."},{"name":"path","type":"string","required":true,"description":"Absolute path to a PDF file, or one starting with ~/."}],"outputs":[{"name":"output_path","type":"string","required":true,"description":"Where the new PDF was written"},{"name":"pages","type":"integer","required":true,"description":"Pages in the new PDF"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":186},{"name":"delete_pages","title":"Delete pages","description":"Removes the selected pages and keeps the rest in order, named with -trimmed. At least one page must remain. Writes the result as a new file next to the input (or to output_path) and never replaces an existing file; the input is left unchanged.","inputs":[{"name":"output_path","type":"string","required":false,"description":"Optional absolute path for the new PDF, ending in .pdf. It must not exist yet. By default the result goes next to the input."},{"name":"pages","type":"string","required":true,"description":"Pages to remove, such as \"2\", \"1-3, 5\" or \"4-end\". Commas separate parts."},{"name":"path","type":"string","required":true,"description":"Absolute path to a PDF file, or one starting with ~/."}],"outputs":[{"name":"output_path","type":"string","required":true,"description":"Where the new PDF was written"},{"name":"pages","type":"integer","required":true,"description":"Pages in the new PDF"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":150},{"name":"reorder_pages","title":"Reorder pages","description":"Puts the pages in a new order, named with -reordered. The order must list every page exactly once; use pdf_info for the page count. Writes the result as a new file next to the input (or to output_path) and never replaces an existing file; the input is left unchanged.","inputs":[{"name":"order","type":"array","required":true,"description":"Every page number once, in the new order, e.g. [3, 1, 2]"},{"name":"output_path","type":"string","required":false,"description":"Optional absolute path for the new PDF, ending in .pdf. It must not exist yet. By default the result goes next to the input."},{"name":"path","type":"string","required":true,"description":"Absolute path to a PDF file, or one starting with ~/."}],"outputs":[{"name":"output_path","type":"string","required":true,"description":"Where the new PDF was written"},{"name":"pages","type":"integer","required":true,"description":"Pages in the new PDF"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":153},{"name":"duplicate_pages","title":"Duplicate pages","description":"Adds copies of the selected pages, right after each one or all at the end, named with -duplicated. Copies share the page's images, so the file barely grows. One call can add at most 10,000 pages. Writes the result as a new file next to the input (or to output_path) and never replaces an existing file; the input is left unchanged.","inputs":[{"name":"copies","type":"integer","required":false,"description":"Extra copies of each page. Default 1."},{"name":"output_path","type":"string","required":false,"description":"Optional absolute path for the new PDF, ending in .pdf. It must not exist yet. By default the result goes next to the input."},{"name":"pages","type":"string","required":true,"description":"Pages to copy, such as \"2\", \"1-3, 5\" or \"4-end\". Commas separate parts."},{"name":"path","type":"string","required":true,"description":"Absolute path to a PDF file, or one starting with ~/."},{"name":"placement","type":"string","required":false,"description":"\"after\" (default) puts copies right after each page; \"end\" adds them at the end."}],"outputs":[{"name":"output_path","type":"string","required":true,"description":"Where the new PDF was written"},{"name":"pages","type":"integer","required":true,"description":"Pages in the new PDF"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":218}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T06:13:42.000Z","track":"package","endpoint":null,"declaredUrl":null,"truncated":false,"tls":null,"dnssec":null,"auth":null,"httpsRedirect":null,"transports":[],"provenance":{"outcome":"none","label":"No attestation","reason":null,"reasonLabel":null,"discovery":null,"discoveryLabel":null,"sourceRepo":null,"attestationSkipped":null,"attestationSkippedLabel":null},"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":{"nodes":14,"partial":false,"deprecated":null,"stale":3,"noRepo":null}},"mismatches":[],"changelog":{"trackingSince":"2026-10-29","recent":[{"id":"chg_01a1a52c-6f98-794c-abae-e027f5e8dc80","kind":"score.total_changed","summary":"Trust score (72 → 73)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-utilitly-mcp/utilitly-mcp#chg-chg_01a1a52c-6f98-794c-abae-e027f5e8dc80"},{"id":"chg_01a19adf-f2a8-76f0-a0db-6f3786bd026f","kind":"score.total_changed","summary":"Trust score (71 → 72)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/com-utilitly-mcp/utilitly-mcp#chg-chg_01a19adf-f2a8-76f0-a0db-6f3786bd026f"},{"id":"chg_01a19092-a7c0-73b7-99c3-8d0caf323e57","kind":"score.total_changed","summary":"Trust score (70 → 71)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/com-utilitly-mcp/utilitly-mcp#chg-chg_01a19092-a7c0-73b7-99c3-8d0caf323e57"},{"id":"chg_01a187f6-cf74-771d-9ce4-02777f623e4b","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/com-utilitly-mcp/utilitly-mcp#chg-chg_01a187f6-cf74-771d-9ce4-02777f623e4b"},{"id":"chg_01a187f6-2bf8-7a5f-b3ea-3fb1540a70a4","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/com-utilitly-mcp/utilitly-mcp#chg-chg_01a187f6-2bf8-7a5f-b3ea-3fb1540a70a4"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/com-utilitly-mcp/utilitly-mcp/changelog.json"},"links":{"html":"https://verifymcp.io/servers/com-utilitly-mcp/utilitly-mcp","markdown":"https://verifymcp.io/servers/com-utilitly-mcp/utilitly-mcp.md","changelogJson":"https://verifymcp.io/servers/com-utilitly-mcp/utilitly-mcp/changelog.json","changelogRss":"https://verifymcp.io/servers/com-utilitly-mcp/utilitly-mcp.xml","external":[{"label":"npm package","href":"https://www.npmjs.com/package/@utilitly/mcp"},{"label":"Socket report","href":"https://socket.dev/npm/package/@utilitly/mcp"},{"label":"Repository","href":"https://github.com/utilitlyPDF/utilitly-mcp"},{"label":"Website","href":"https://utilitly.com/"}]}}