{"name":"io.github.reinlainer/postmd-mcp-server","slug":"reinlainer-postmd-mcp-server","title":null,"description":"Publish Markdown to PostMD and get a shareable web page","url":"https://mcp.market/server/reinlainer-postmd-mcp-server","rating":null,"grade":"B","score":83,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":30,"stars":0,"forks":0,"downloads_week":95,"last_push_at":"2026-09-16T23:53:54.000Z","license":"MIT"},"claimed":false,"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/reinlainer/postmd-mcp-server","website":null,"version":"2.4.0","remotes":[{"type":"streamable-http","url":"https://postmd.turink.com/mcp"}],"packages":[{"registryType":"npm","identifier":"postmd-mcp-server","version":"2.4.0","transport":{"type":"stdio"},"environmentVariables":[{"description":"Where PostMD runs. Defaults to https://postmd.turink.com; set it only for a self-hosted instance.","name":"POSTMD_BASE_URL"},{"description":"Needed only for managing documents, attachments and groups. Publishing and reading work without it.","isSecret":true,"name":"POSTMD_API_KEY"},{"description":"Set to 1 for verbose diagnostics on stderr.","name":"POSTMD_DEBUG"}]}],"tools":[{"name":"postmd_create_document","description":"Publish Markdown as a PostMD web page. No API key required — anyone can publish. Returns docCode and data.shareUrl; hand shareUrl to people. Without a key the document is anonymous: data.retainedUntil is when it is deleted and data.controlToken is the only way to update or delete it, shown once and never reissued — report both to the person. With an API key the document belongs to that member, has no expiry, needs no token and can collect notes; groupId files it into that group instead of the default one (key with documents:write).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"markdown":{"type":"string","description":"Full Markdown document as one UTF-8 string (the entire source, not a summary)."},"title":{"type":"string","description":"Shown in the viewer and link previews. Defaults to fileName without .md."},"fileName":{"type":"string","description":"Upload filename, must end in .md. Default document.md."},"password":{"type":"string","description":"Readers must supply this password to see the content."},"shareEndDate":{"type":"string","description":"yyyyMMdd. The document stops being served after this date. Omit for no end date."},"viewerStyle":{"type":"string","description":"Viewer theme: readable (default), github, minimal, report, pamphlet or dark. Unknown values fall back to readable."},"groupId":{"type":"number","description":"File the document in this group instead of the default group (needs an API key)."}},"required":["markdown"]}},{"name":"postmd_delete_document","description":"Delete a document. Requires an API key with documents:write for a document you own, or `controlToken` for an anonymously published one. There is no endpoint to undo this: the document stops being served at once and its stored content is erased about a month later.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"docCode":{"type":"string"},"controlToken":{"type":"string","description":"Control token from an anonymous publish answer (pmt_...). Lets you act on that one document without an API key."}},"required":["docCode"]}},{"name":"postmd_get_document","description":"Get document metadata by docCode: title, fileName, hasPassword, shareEndDate, viewerStyle, timestamps. Public — no API key needed. Content is not included; use postmd_get_document_raw for the Markdown source.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"docCode":{"type":"string","description":"Document code, e.g. P-123-456-789."}},"required":["docCode"]}},{"name":"postmd_get_document_raw","description":"Get the stored Markdown source of a document. Public — no API key needed. Password-protected documents need `password`; expired documents cannot be read.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"docCode":{"type":"string"},"password":{"type":"string","description":"Plain document password, if the document has one."}},"required":["docCode"]}},{"name":"postmd_update_document","description":"Update a document. Requires an API key with documents:write for a document you own, or `controlToken` for an anonymously published one. Include `markdown` to replace the stored content; any metadata field replaces that field. clearPassword / clearShareEndDate remove the password / end date. Updating does not push back the deletion date of an anonymous document. Replacing the content requires notesOnReplace.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"docCode":{"type":"string"},"markdown":{"type":"string","description":"Full new Markdown body as one UTF-8 string. Omit if only metadata changes."},"title":{"type":"string"},"fileName":{"type":"string","description":"Upload filename when replacing content. Default document.md."},"password":{"type":"string","description":"Readers must supply this password to see the content."},"shareEndDate":{"type":"string","description":"yyyyMMdd. The document stops being served after this date. Omit for no end date."},"viewerStyle":{"type":"string","description":"Viewer theme: readable (default), github, minimal, report, pamphlet or dark. Unknown values fall back to readable."},"clearPassword":{"type":"boolean","description":"true removes the password."},"clearShareEndDate":{"type":"boolean","description":"true removes the end date, making sharing open-ended."},"notesOnReplace":{"type":"string","enum":["keep","abort"],"description":"Required when replacing the content. Notes are located by the text they quote, so replacing the body moves or loses where they point: a note whose quote is gone loses its place in the body, and one whose quote now appears elsewhere points there. keep replaces anyway and leaves the notes. abort refuses when the document has notes anchored to its text, and the answer says how many."},"controlToken":{"type":"string","description":"Control token from an anonymous publish answer (pmt_...). Lets you act on that one document without an API key."}},"required":["docCode"]}}],"scan":{"score":83,"grade":"B","scanned_at":"2026-09-19T10:16:57.782Z","report":{"scannerVersion":"0.1.3","scannedAt":"2026-09-19T10:16:57.761Z","components":{"code":{"score":25,"max":25,"notes":["6 source files scanned"]},"reliability":{"score":17,"max":20,"notes":["remote reachable in 2580ms"]},"poisoning":{"score":15,"max":15,"notes":["5 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 3 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 2 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://postmd.turink.com/mcp","reachable":true,"authRequired":false,"latencyMs":2580,"serverInfo":{"name":"postmd-mcp-server","version":"2.4.0"}}],"packages":[{"registryType":"npm","identifier":"postmd-mcp-server","version":"2.4.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-09-15T07:43:40.811Z","repositoryUrl":"git+https://github.com/reinlainer/postmd-mcp-server.git","weeklyDownloads":95}],"repo":{"found":true,"owner":"reinlainer","repo":"postmd-mcp-server","archived":false,"pushedAt":"2026-09-16T23:53:54Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/3735668?v=4","ownerCreatedAt":"2013-03-01T07:54:24Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/3735668?v=4&s=128","source":"github"},"presence":{"stars":0,"forks":0,"downloadsWeek":95,"license":"MIT","lastPushAt":"2026-09-16T23:53:54.000Z","score":30}}}},"grade_history":[],"reviews":[]}