Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,533Letters: 13Defects: 1,322counted just now
teppi

Server definition

Hash
sha256:aeec34d2196131db6ede207375509b88ecbe181ecca6b567c28de2f388bdede8
What it is
What a remote MCP server returned when asked what it offers: 6 tools

The blob, as servednamed by its sha256

{ "instructions": "PasteApply MCP. Prefer these tools over driving the website. Optional store_resume once → reuse resumeId on generate. Generate is free but truncated: coverage, proof, what-changed, and a redacted sample only. For the full letter, resume, and files, call unlock_link (default $5 Export) and hand the Stripe URL to a human — or send Authorization Bearer pa_… from confirm_payment / POST /api/agent-key when unlocks remain. Never invent employers, dates, skills, or metrics. Never scrape card fields.", "tools": [ { "description": "Fallback unlock when get_generation still shows paid:false after the human paid (slow webhook). Pass the cs_ session id from the success URL. Happy path: poll get_generation until paid:true — no cs_ required. When paid, returns full coverLetter, structured resume, files.pdf/docx/coverPdf absolute URLs (?dl= token lasts UTC billing month), and apiKey (Authorization Bearer pa_… for later status/generate). Or POST /api/agent-key {sessionId, claimToken}. Pass claimToken from unlock_link: without it (and without the paying Google session) only the draft status comes back — no plan link, no apiKey. Never scrape card UI. Never complete Stripe Checkout as the user. Hand the Checkout URL to a human.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "claimToken": { "type": "string" }, "sessionId": { "type": "string" } }, "required": [ "sessionId" ], "type": "object" }, "name": "confirm_payment", "outputSchema": null }, { "description": "Tailor a resume and cover letter to one job posting. Pass jobPosting text and/or jobUrl (public http(s); we fetch+strip HTML; prefer pasted jobPosting if both). Pass resume text and/or resumeId from store_resume / POST /api/resumes (prefer resumeId over re-pasting; pasted resume still wins if both). Resume or resumeId required unless useSample. Unpaid generate returns a teaser only (coverage, fit.recommend skip|weak|apply with mustHavesMissing/impliedOnly and fit.gap naming any missing must-have (exactly one missing must-have ⇒ weak; two or more ⇒ skip; interview % bands follow the verdict: apply 70–95, weak 45–69, skip 0–44), recommendUnlock false when skip / true when weak|apply with optional unlockAdvice, proof, short what-changed, redacted sample). Check recommendUnlock / fit.recommend before unlock_link — do not unlock when skip. Full letter and resume require unlock_link or a paid Bearer pa_… key with unlocks remaining. Free daily cap → HTTP 429 code free_cap + retryAfter; paid month unlock cap → HTTP 402 code unlock_quota (not retry-later). Optional BYOK: modelProvider openai|anthropic as a tool arg; send the provider key only in connection header X-PasteApply-BYOK-Key (env-var placeholder — never a literal key in tool args or chat). Hosted is default. Paid bots: Authorization Bearer pa_… from confirm_payment or POST /api/agent-key. Ladder $3=1/$5=5/$10=50/$20=up to 200 (within 2,350 signed-in requests a month). Honesty lock: we only rearrange what is already true. Never invent employers, dates, skills, or metrics. If the posting wants something not on the source resume, omit it.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "jobPosting": { "type": "string" }, "jobUrl": { "type": "string" }, "model": { "type": "string" }, "modelProvider": { "enum": [ "hosted", "openai", "anthropic" ], "type": "string" }, "proPasses": { "items": { "type": "string" }, "type": "array" }, "resume": { "type": "string" }, "resumeId": { "type": "string" }, "useSample": { "type": "boolean" } }, "type": "object" }, "name": "generate", "outputSchema": null }, { "description": "Happy path after pay: poll until paid:true (webhook persists the unlock). Poll a generation including paid/unlocked after the human pays. Pass id or generationId (same uuid from generate). When paid:true: full coverLetter, resume, and files.ready/files.pdf/files.docx/files.coverPdf/files.expiresAt/files.coverLetter/files.resume (pdf/docx/coverPdf ?dl= URLs last the UTC billing month; refresh via get_generation anytime in-month). On file GET 403, re-call get_generation for a fresh token. Honesty lock: we only rearrange what is already true. Never invent employers, dates, skills, or metrics.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "generationId": { "type": "string" }, "id": { "type": "string" } }, "type": "object" }, "name": "get_generation", "outputSchema": null }, { "description": "Read PasteApply readiness (openaiConfigured, stripeConfigured, prices, plan/unlocks when Bearer pa_). Paid bots: Authorization Bearer pa_… from confirm_payment or POST /api/agent-key. Ladder $3=1/$5=5/$10=50/$20=up to 200 (within 2,350 signed-in requests a month). Honesty lock: we only rearrange what is already true. Never invent employers, dates, skills, or metrics.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": {}, "type": "object" }, "name": "status", "outputSchema": null }, { "description": "Store resume text in the vault and get a resumeId (rs_1.<uuid>) to reuse on generate. Prefer resumeId on later generate over re-pasting the full resume. Pass resume text here. For PDF/DOCX/DOC/TXT/MD files, use HTTP POST /api/resumes multipart field \"file\" (max ~8MB) — this MCP tool is text-only. Stored text is used as-is (honesty lock; never invent employers). TTL ~30 days. Honesty lock: we only rearrange what is already true. Never invent employers, dates, skills, or metrics.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "resume": { "type": "string" } }, "required": [ "resume" ], "type": "object" }, "name": "store_resume", "outputSchema": null }, { "description": "PURCHASES MAY BE PAUSED: while file storage is unavailable this tool returns an error with code purchases_paused (HTTP 503 + retryAfter, nothing charged, no Checkout created). Check status first (purchasesPaused / pricesAvailable) and do not retry in a loop. Otherwise: create a Stripe Checkout URL so a HUMAN can pay $5/mo Export (5 unlocks, default), $3/mo (1 unlock), $10/mo Pro (50 unlocks + extras), or $20/mo (up to 200 unlocks within 2,350 signed-in requests a month + Pro extras). After the human pays, poll get_generation until paid:true for paid files fields (files.ready, files.pdf, files.docx, files.coverPdf, files.expiresAt, files.coverLetter, files.resume). confirm_payment only if the poll stays unpaid (also returns apiKey pa_…): keep the claimToken from this reply and pass it to confirm_payment — only the Checkout's starter can link the plan or get the key. Never scrape card UI. Never complete Stripe Checkout as the user. Hand the Checkout URL to a human. Honesty lock: we only rearrange what is already true. Never invent employers, dates, skills, or metrics.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "generationId": { "type": "string" }, "price": { "enum": [ "monthly", "export", "pro", "power" ], "type": "string" } }, "type": "object" }, "name": "unlock_link", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:aeec34d2196131db6ede207375509b88ecbe181ecca6b567c28de2f388bdede8 | sha256sum