{"name":"io.github.ShahriarBijoy/passwerk","slug":"shahriarbijoy-passwerk","title":"passwerk","description":"Offline EU Battery Passport compiler: ingest documents, map, validate (IDTA 02035), emit AASX.","url":"https://mcp.market/server/shahriarbijoy-passwerk","rating":null,"grade":"A","score":92,"certified":false,"status":"active","category":"maps","tags":["maps"],"presence":{"score":31,"stars":0,"forks":0,"downloads_week":351,"last_push_at":"2026-09-15T16:33:14.000Z","license":"Apache-2.0"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/ShahriarBijoy/passwerk","website":"https://github.com/ShahriarBijoy/passwerk#readme","version":"0.1.1","remotes":[],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"@passwerk/server","version":"0.1.1","runtimeHint":"npx","transport":{"type":"stdio"},"environmentVariables":[{"description":"Directory ingest_documents may read and emit_passport may write (default: the working directory)","name":"PASSWERK_ROOT"},{"description":"info (default) or debug; JSON lines on stderr","choices":["info","debug"],"name":"PASSWERK_LOG_LEVEL"}]}],"tools":[{"name":"apply_mappings","description":"Folds accepted mapping decisions (or manual values) into a PassportDraft. Idempotent: the same decision twice is a no-op; a different value for an attribute that already has one is reported as a conflict and not applied unless override is true. Pass meta instead of draft to start a new draft.","write_action":false,"price_micros":0,"input_schema":null},{"name":"check_obligations","description":"Whether a battery passport is required for a battery type, role, energy and market date under Regulation (EU) 2023/1542 Article 77(1); returns the category, the mandatory, conditional and deferred attribute sets and the legal timeline. Answers required, not_required or insufficient_input. Not legal advice.","write_action":false,"price_micros":0,"input_schema":null},{"name":"emit_passport","description":"Emits a PassportDraft as AAS JSON (IDTA 02035 submodels), an AASX package, the draft JSON and/or the HTML sheet, and re-validates the emitted output. Fail-honest: files are returned even when the verdict is invalid, and the verdict is never better than validate_passport’s. Bytes come back base64 inline unless outDir is given.","write_action":false,"price_micros":0,"input_schema":null},{"name":"explain_attribute","description":"Everything the knowledge base holds about one passport attribute (official DIN definition, DE/EN explanation, synonyms, who typically has the data, unit, range, applicability per category, legal references, IDTA template elements) or one plausibility rule (message, fix hint, legal reference). Nothing is composed; unknown ids are an error.","write_action":false,"price_micros":0,"input_schema":null},{"name":"extract_facts","description":"Turns a DocumentBundle into a FactSet: labelled values with normalised numbers, units and dates, each with file, page, line or cell provenance. Pure heuristics, no model. Returns the FactSet and a factSetId to pass to suggest_mappings.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gap_report","description":"The to-do list for a PassportDraft: every attribute bucketed as required, conditional, deferred or optional with status, legal references, who typically has the data and a suggested action; completeness for mandatory and overall data points, grouped by submodel and by data owner. Runs validate_passport first so invalid values count as gaps. Ask for detail \"full\" and a status/bucket filter to see e","write_action":false,"price_micros":0,"input_schema":null},{"name":"generate_carrier","description":"Builds the data carrier for a passport: the unique identifier (the draft’s passportId, an absolute https URI), an optional GS1 Digital Link (/01/{gtin}/21/{serial} or /8004/{giai}) and the QR code as SVG or PNG. The QR encodes the Digital Link when GS1 data is given, else the identifier. Says nothing about validity; validate_passport does.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ingest_documents","description":"Reads PDF, XLSX, CSV, DOCX and TXT documents into a DocumentBundle with page, line, table and cell provenance, deterministically and without OCR or a model. Returns a per-document summary and a bundleId to pass to extract_facts; ask for detail \"full\" to see the pages. Unsupported or unreadable files are reported, not dropped.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_capabilities","description":"Versions of the bundled IDTA 02035 templates and AAS schemas, knowledge-base statistics, when the artefacts were retrieved, the sovereignty statement, and this server’s tools and session-store usage. Call first to learn what this server can do.","write_action":false,"price_micros":0,"input_schema":null},{"name":"review_passport","description":"Opens the interactive passwerk workbench in hosts that render MCP Apps (Claude Desktop, Claude web): upload documents, accept or edit mapping proposals, read the gap report and export, all on the user’s machine. Pass the current draft so the user reviews it visually; the workbench keeps the draft id in sync so gap_report and emit_passport can continue on it. Hosts without a UI receive the same dra","write_action":false,"price_micros":0,"input_schema":null},{"name":"suggest_mappings","description":"Scores every fact against the knowledge-base synonym index (DE/EN), unit and type checks and the attribute range, and returns candidate mappings sorted by confidence with a DE/EN explanation and provenance. Review proposals under 0.7 with the user or the source page, then pass the accepted ones to apply_mappings. Ask for detail \"full\", or pass attributeIds, to see every candidate with its file, pa","write_action":false,"price_micros":0,"input_schema":null},{"name":"validate_passport","description":"Runs all four validation layers on a PassportDraft: L1 schema, L2 AAS meta-model (aas-core), L3 IDTA 02035 template conformance, L4 domain plausibility. Returns the verdict (valid, valid_with_warnings, invalid) and every finding with layer, rule id, path, DE/EN message, legal reference and fix hint. The only source of a validity claim.","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":92,"grade":"A","scanned_at":"2026-09-19T20:04:36.693Z","report":{"scannerVersion":"0.1.5","scannedAt":"2026-09-19T20:04:36.677Z","components":{"code":{"score":25,"max":25,"notes":["63 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 4 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"@passwerk/server","version":"0.1.1","found":true,"license":"Apache-2.0","hasInstallScripts":false,"dependencyCount":4,"publishedAt":"2026-09-13T19:55:34.493Z","repositoryUrl":"git+https://github.com/ShahriarBijoy/passwerk.git","weeklyDownloads":351}],"repo":{"found":true,"owner":"ShahriarBijoy","repo":"passwerk","archived":false,"pushedAt":"2026-09-15T16:33:14Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/43579553?v=4","ownerCreatedAt":"2018-09-25T15:00:07Z","license":"Apache-2.0"},"icon":{"url":"https://avatars.githubusercontent.com/u/43579553?v=4&s=128","source":"registry"},"presence":{"stars":0,"forks":0,"downloadsWeek":351,"license":"Apache-2.0","lastPushAt":"2026-09-15T16:33:14.000Z","score":31}}}},"grade_history":[],"reviews":[]}