{"name":"apply2volunteer","title":"Apply2Volunteer","description":"Preview or grade with no key. Claim and publish with OAuth or an API key.","documentationUrl":"https://applytovolunteer.com/ai","websiteUrl":"https://applytovolunteer.com","icons":[{"src":"https://applytovolunteer.com/icon-512.png","mimeType":"image/png","sizes":["512x512"]},{"src":"https://applytovolunteer.com/favicon.svg","mimeType":"image/svg+xml","sizes":["any"]}],"serverInfo":{"name":"apply2volunteer","title":"Apply2Volunteer","version":"1.0.0","websiteUrl":"https://applytovolunteer.com","icons":[{"src":"https://applytovolunteer.com/icon-512.png","mimeType":"image/png","sizes":["512x512"]},{"src":"https://applytovolunteer.com/favicon.svg","mimeType":"image/svg+xml","sizes":["any"]}]},"authentication":{"required":false,"oauth":{"resource":"https://applytovolunteer.com/mcp","resourceMetadata":"https://applytovolunteer.com/.well-known/oauth-protected-resource/mcp","authorizationServer":"https://applytovolunteer.com/.well-known/oauth-authorization-server"}},"remotes":[{"type":"streamable-http","url":"https://applytovolunteer.com/mcp"}],"tools":[{"name":"preview_volunteer_form","title":"Preview a volunteer form","description":"Convert a blank volunteer application into an online form preview. No account and no API key. Send exactly one of a PDF or page url, pasted form text, or template (volunteer-application-form or volunteer-interest-form). Uses the on-server parser only: Workers AI and other models stay off, so this call has no model charge. Returns previewUrl (/tools/p/{token}), claimUrl, and signUpUrl. claimUrl and signUpUrl are the same sign-up link (/login?next=/tools/p/{token}&utm_source=mcp) labeled sign up free to publish. The parsed form is stored for 24 hours and the daily cleanup deletes it. The URL is fetched once. File contents are not logged. Restricted fields such as Social Security numbers are left out. Anonymous use is limited per network and by a daily cap; over the cap, sign up free.","inputSchema":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"https URL of a blank volunteer PDF, Word file, or HTML page."},"text":{"type":"string","description":"Pasted blank form, one field label per line. Do not include applicant answers."},"template":{"type":"string","enum":["volunteer-application-form","volunteer-interest-form"],"description":"Built-in blank form. volunteer-application-form or volunteer-interest-form. Send exactly one of url, text, or template."}},"oneOf":[{"required":["url"],"not":{"anyOf":[{"required":["text"]},{"required":["template"]}]}},{"required":["text"],"not":{"anyOf":[{"required":["url"]},{"required":["template"]}]}},{"required":["template"],"not":{"anyOf":[{"required":["url"]},{"required":["text"]}]}}],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Parsed form title."},"fields":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","description":"Field label shown on the preview."},"type":{"type":"string","description":"Field type, such as short_text or email."}},"required":["label","type"],"additionalProperties":false}},"stages":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"kind":{"type":"string"},"order":{"type":"integer"}},"required":["name","kind","order"],"additionalProperties":false}},"fieldCount":{"type":"integer","minimum":0},"previewUrl":{"type":"string","format":"uri","description":"Public preview URL, /tools/p/{token}."},"claimUrl":{"type":"string","format":"uri","description":"Sign-up link that claims this preview, /login?next=/tools/p/{token}&utm_source=mcp."},"signUpUrl":{"type":"string","format":"uri","description":"Same URL as claimUrl."},"publishLabel":{"type":"string","description":"Label for the sign-up link."},"expiresAt":{"type":"integer","description":"Unix milliseconds when the preview is deleted."},"parser":{"type":"string","const":"heuristic","description":"On-server parser. Workers AI stays off."}},"required":["title","fields","stages","fieldCount","previewUrl","claimUrl","signUpUrl","publishLabel","expiresAt","parser"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Preview a volunteer form","readOnlyHint":false,"destructiveHint":false,"openWorldHint":true},"_meta":{"ui":{"resourceUri":"ui://applytovolunteer/form-preview.html"},"ui/resourceUri":"ui://applytovolunteer/form-preview.html","openai/outputTemplate":"ui://applytovolunteer/form-preview.html"}},{"name":"get_preview","title":"Read a form preview","description":"Read an unexpired converter preview by previewId. No API key. Returns the title, fields, stages, expiresAt, and previewUrl already shown on the public preview page (/tools/p/{previewId}), whether or not that preview was claimed. Unknown or expired ids are not found and include the converter URL. Does not return organization ids or saved form ids.","inputSchema":{"type":"object","properties":{"previewId":{"type":"string","minLength":22,"maxLength":22,"pattern":"^[A-Za-z0-9_-]{21}[AQgw]$","description":"Preview id from previewUrl (/tools/p/{previewId})."}},"required":["previewId"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"title":{"type":"string"},"fields":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","description":"Field label shown on the preview."},"type":{"type":"string","description":"Field type, such as short_text or email."}},"required":["label","type"],"additionalProperties":false}},"stages":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"kind":{"type":"string"},"order":{"type":"integer"}},"required":["name","kind","order"],"additionalProperties":false}},"expiresAt":{"type":"integer","description":"Unix milliseconds when the preview is deleted."},"previewUrl":{"type":"string","format":"uri","description":"Public preview URL, /tools/p/{previewId}."}},"required":["title","fields","stages","expiresAt","previewUrl"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Read a form preview","readOnlyHint":true,"destructiveHint":false},"_meta":{"ui":{"resourceUri":"ui://applytovolunteer/form-preview.html"},"ui/resourceUri":"ui://applytovolunteer/form-preview.html","openai/outputTemplate":"ui://applytovolunteer/form-preview.html"}},{"name":"grade_form","title":"Grade a volunteer form","description":"Grade a blank volunteer form from pasted text or a document URL. No API key. Send a url or text, not both. Uses the on-server grader only: Workers AI and other models stay off. Returns score, letter grade, fixes (the top recommendations), and reportUrl (/tools/r/{id}) for the public share page when one is stored. Restricted fields such as Social Security numbers are left out of parsed; the score still counts them. Anonymous use shares the Form Grader limit of 5 per network per day and counts toward the daily anonymous MCP cap. An organization hourly limit applies when an org API key with the forms:read scope is sent. Does not grade a saved form.","inputSchema":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"https URL of a blank volunteer form."},"text":{"type":"string","description":"Pasted blank form text."}},"oneOf":[{"required":["url"],"not":{"anyOf":[{"required":["text"]}]}},{"required":["text"],"not":{"anyOf":[{"required":["url"]}]}}],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"report":{"type":"object","properties":{"score":{"type":"integer","minimum":0,"maximum":100},"grade":{"type":"string","enum":["A","B","C","D","F"]},"recommendations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"severity":{"type":"string"},"title":{"type":"string"},"detail":{"type":"string"}},"required":["id","severity","title","detail"],"additionalProperties":true}}},"required":["score","grade","recommendations"],"additionalProperties":true,"description":"Full grade report. Restricted field labels are left out."},"parsed":{"type":"object","properties":{"title":{"type":"string"},"fields":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"type":{"type":"string"}},"required":["label","type"],"additionalProperties":true}}},"required":["title"],"additionalProperties":true,"description":"Parsed form. Restricted fields are left out."},"reportId":{"type":"string"},"reportUrl":{"type":"string","description":"Public report path, /tools/r/{reportId}, when one is stored."},"parser":{"type":"string","const":"heuristic","description":"Set on anonymous grades. Workers AI stays off."},"score":{"type":"integer","minimum":0,"maximum":100,"description":"Score from 0 to 100."},"grade":{"type":"string","enum":["A","B","C","D","F"],"description":"Letter grade."},"fixes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Stable id for this fix."},"severity":{"type":"string","enum":["critical","high","medium","low"]},"title":{"type":"string","description":"Short name of the fix."},"detail":{"type":"string","description":"What to change on the form."}},"required":["id","severity","title","detail"],"additionalProperties":false},"description":"Top fixes, the same recommendations as report.recommendations."}},"required":["report","parsed","reportId","score","grade","fixes"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Grade a volunteer form","readOnlyHint":true,"destructiveHint":false,"openWorldHint":true},"_meta":{"ui":{"resourceUri":"ui://applytovolunteer/form-preview.html"},"ui/resourceUri":"ui://applytovolunteer/form-preview.html","openai/outputTemplate":"ui://applytovolunteer/form-preview.html"}},{"name":"convert_pdf_preview","title":"Convert a PDF for the organization","description":"Convert a PDF URL into a stored preview for the authenticated organization. Requires an org API key with the forms:read scope. Returns the preview id and expiry. For a preview without a key, use preview_volunteer_form.","inputSchema":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"https URL of a blank volunteer PDF."}},"required":["url"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"title":{"type":"string"},"fields":{"type":"integer","minimum":0,"description":"Number of parsed fields."},"grader":{"type":"object","properties":{"score":{"type":"integer","minimum":0,"maximum":100},"grade":{"type":"string","enum":["A","B","C","D","F"]},"recommendations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"severity":{"type":"string"},"title":{"type":"string"},"detail":{"type":"string"}},"required":["id","severity","title","detail"],"additionalProperties":true}}},"required":["score","grade","recommendations"],"additionalProperties":true},"previewId":{"type":"string","description":"Preview id. The public path is /tools/p/{previewId}."},"expiresAt":{"type":"integer"}},"required":["title","fields","grader","previewId","expiresAt"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Convert a PDF for the organization","readOnlyHint":false,"destructiveHint":false,"openWorldHint":true},"_meta":{"ui":{"resourceUri":"ui://applytovolunteer/form-preview.html"},"ui/resourceUri":"ui://applytovolunteer/form-preview.html","openai/outputTemplate":"ui://applytovolunteer/form-preview.html"}},{"name":"list_forms","title":"List forms","description":"List forms that belong to the authenticated organization. Requires an org API key with the forms:read scope.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"outputSchema":{"type":"object","properties":{"forms":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Form id."},"orgId":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"status":{"type":"string","description":"draft or published."},"currentVersionId":{"type":["string","null"]},"settings":{"type":["string","null"],"description":"Client settings JSON. Internal keys are omitted."},"createdAt":{"type":"integer"},"updatedAt":{"type":"integer"},"deletedAt":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["id","orgId","slug","title","status","currentVersionId","settings","createdAt","updatedAt","deletedAt"],"additionalProperties":false},"description":"Forms in this organization. The text block is this array as JSON."}},"required":["forms"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"List forms","readOnlyHint":true,"destructiveHint":false}},{"name":"get_form","title":"Get a form","description":"Get one form by id when it belongs to the authenticated organization. Requires an org API key with the forms:read scope.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Form id."}},"required":["id"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Form id."},"orgId":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"status":{"type":"string","description":"draft or published."},"currentVersionId":{"type":["string","null"]},"settings":{"type":["string","null"],"description":"Client settings JSON. Internal keys are omitted."},"createdAt":{"type":"integer"},"updatedAt":{"type":"integer"},"deletedAt":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["id","orgId","slug","title","status","currentVersionId","settings","createdAt","updatedAt","deletedAt"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Get a form","readOnlyHint":true,"destructiveHint":false}},{"name":"list_applications","title":"List applications","description":"List applications for one form in the authenticated organization. Requires an org API key with the applications:read scope.","inputSchema":{"type":"object","properties":{"formId":{"type":"string","description":"Form id."}},"required":["formId"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"applications":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Application id."},"orgId":{"type":"string"},"formId":{"type":"string"},"formVersionId":{"type":"string"},"applicantEmail":{"type":["string","null"]},"applicantName":{"type":["string","null"]},"status":{"type":"string"},"source":{"type":"string"},"notes":{"type":["string","null"]},"decidedAt":{"anyOf":[{"type":"integer"},{"type":"null"}]},"declineReason":{"type":["string","null"]},"createdAt":{"type":"integer"},"ipHash":{"type":["string","null"]},"userAgent":{"type":["string","null"]},"submissionId":{"type":["string","null"]},"deletedAt":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["id","orgId","formId","formVersionId","applicantEmail","applicantName","status","source","notes","decidedAt","declineReason","createdAt","ipHash","userAgent","submissionId","deletedAt"],"additionalProperties":false},"description":"Applications for this form. The text block is this array as JSON. Applicant fields are only those the tool already returned."}},"required":["applications"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"List applications","readOnlyHint":true,"destructiveHint":false}},{"name":"get_application","title":"Get an application","description":"Get one application by id when it belongs to the authenticated organization. Requires an org API key with the applications:read scope.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Application id."}},"required":["id"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Application id."},"orgId":{"type":"string"},"formId":{"type":"string"},"formVersionId":{"type":"string"},"applicantEmail":{"type":["string","null"]},"applicantName":{"type":["string","null"]},"status":{"type":"string"},"source":{"type":"string"},"notes":{"type":["string","null"]},"decidedAt":{"anyOf":[{"type":"integer"},{"type":"null"}]},"declineReason":{"type":["string","null"]},"createdAt":{"type":"integer"},"ipHash":{"type":["string","null"]},"userAgent":{"type":["string","null"]},"submissionId":{"type":["string","null"]},"deletedAt":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["id","orgId","formId","formVersionId","applicantEmail","applicantName","status","source","notes","decidedAt","declineReason","createdAt","ipHash","userAgent","submissionId","deletedAt"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Get an application","readOnlyHint":true,"destructiveHint":false}},{"name":"update_application_status","title":"Update an application status","description":"Set an application's status for the authenticated organization. Requires an org API key with the applications:write scope. A decline requires a decline reason. This writes the status; it does not delete the application.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Application id."},"status":{"type":"string","enum":["new","in_review","advanced","accepted","declined","withdrawn","on_hold"]},"declineReason":{"description":"Required when status is declined."}},"required":["id","status"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"id":{"type":"string","description":"Application id."},"status":{"type":"string","description":"Status that was saved."}},"required":["ok","id","status"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Update an application status","readOnlyHint":false,"destructiveHint":false}},{"name":"create_form_from_pdf","title":"Save a draft from a PDF","description":"Fetch a PDF or page URL and save a draft form in the authenticated organization, the same way claiming a preview does. Requires an org API key with the forms:write scope. Uses the on-server parser only: Workers AI and other models stay off. Returns formId and editorUrl (/app/forms/{formId}). Does not publish the form. File contents are not logged.","inputSchema":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"https URL of a blank volunteer PDF."},"title":{"type":"string","description":"Optional title override."}},"required":["url"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"formId":{"type":"string","description":"Draft form id."},"title":{"type":"string"},"fieldCount":{"type":"integer","minimum":0},"editorUrl":{"type":"string","format":"uri","description":"Editor URL, /app/forms/{formId}."},"parser":{"type":"string","const":"heuristic","description":"On-server parser. Workers AI stays off."}},"required":["formId","title","fieldCount","editorUrl","parser"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Save a draft from a PDF","readOnlyHint":false,"destructiveHint":false,"openWorldHint":true},"_meta":{"ui":{"resourceUri":"ui://applytovolunteer/form-preview.html"},"ui/resourceUri":"ui://applytovolunteer/form-preview.html","openai/outputTemplate":"ui://applytovolunteer/form-preview.html"}},{"name":"create_form","title":"Create a blank draft form","description":"Create a blank draft form in the authenticated organization. Requires an org API key or OAuth sign-in with the forms:write scope. Same blank form as POST /api/v1/forms when no conversion, report, or preview is sent: title Volunteer application unless title is set, with First name and Email. Optional template volunteer-application-form or volunteer-interest-form seeds that template's fields instead, using the on-server parser. Workers AI stays off. An unknown template is an error and does not create a form. Title is at most 200 characters. MCP, an org API key, and OAuth share a limit of 60 creates per organization per hour. A website session is not counted. Returns formId and editorUrl (/app/forms/{formId}). Does not publish the form.","inputSchema":{"type":"object","properties":{"title":{"type":"string","maxLength":200,"description":"Optional title, at most 200 characters. Omitted uses Volunteer application, or the template title when template is set. Empty uses Volunteer application."},"template":{"type":"string","enum":["volunteer-application-form","volunteer-interest-form"],"description":"Optional. volunteer-application-form or volunteer-interest-form. Seeds the draft with that template instead of First name and Email."}},"additionalProperties":false},"outputSchema":{"type":"object","properties":{"formId":{"type":"string","description":"Draft form id."},"title":{"type":"string"},"status":{"type":"string"},"versionId":{"type":"string","description":"Version being edited, when one exists."},"editorUrl":{"type":"string","format":"uri","description":"Editor URL, /app/forms/{formId}."},"settings":{"description":"Settings the editor would show. Null when unset."},"fields":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"key":{"type":"string"},"label":{"type":"string"},"type":{"type":"string"},"required":{"type":"boolean"},"order":{"type":"integer"}},"required":["id","key","label","type","required","order"],"additionalProperties":false}},"added":{"type":"array","items":{"type":"object","properties":{"id":{"$ref":"#/properties/fields/items/properties/id"},"key":{"$ref":"#/properties/fields/items/properties/key"},"label":{"$ref":"#/properties/fields/items/properties/label"},"type":{"$ref":"#/properties/fields/items/properties/type"},"required":{"$ref":"#/properties/fields/items/properties/required"},"order":{"$ref":"#/properties/fields/items/properties/order"},"stageId":{"type":["string","null"]}},"required":["id","key","label","type","required","order"],"additionalProperties":false},"description":"Fields inserted by this call."}},"required":["formId","title","status","editorUrl","fields"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Create a blank draft form","readOnlyHint":false,"destructiveHint":false},"_meta":{"ui":{"resourceUri":"ui://applytovolunteer/form-preview.html"},"ui/resourceUri":"ui://applytovolunteer/form-preview.html","openai/outputTemplate":"ui://applytovolunteer/form-preview.html"}},{"name":"update_form","title":"Update a draft form","description":"Update a form that belongs to the authenticated organization. Requires an org API key or OAuth sign-in with the forms:write scope. Same checks as PATCH /api/v1/forms/{id}: title, settings, and fields. A field entry with an id updates that field. A field entry with no id inserts a field. op add also inserts a field, and that row must not include an id. The server assigns the id. Required on an insert: label and type (an existing field type). Optional on an insert: helpText (at most 2000 characters), required, options, and stageId. stageId defaults to the Interest stage, or the first stage. New fields are appended. order on an insert is ignored. On an existing field, optional order is an integer greater than or equal to 0 and sets that field's position. An order already used by another field on this version is refused (409 'A field already occupies this order on the form version.'). op remove, or removeFieldIds, deletes fields on the current draft. Answers and consents are matched by field key on every version of the form, not by the draft field id. A field that has answers or consents cannot be removed (409 'This field has answers or consents and cannot be removed.'). Changing a field key is refused when that field's current key, or the new key, already has answers or consents on this form (409 'A field key that already has answers or consents cannot be changed.'). At most 20 fields can be added and 20 removed in one call. A form can hold at most 140 fields. Title is at most 200 characters, a field label at most 500, and stored settings JSON at most 32 KB. A field id that is not on the current draft returns 409 'This field id is not on the current draft.' Re-read the form with get_form and retry with the current field ids. A malformed field id is rejected. Top-level settings keys whose names start with __ are ignored, and the stored editor stamp is kept. A lower editorSeq does not overwrite a newer save. A form that belongs to another organization is not found. MCP, an org API key, and OAuth share a limit of 60 updates per organization per hour. Adding or removing fields uses that same limit. A website session is not counted. Returns the updated draft, any new field ids, and editorUrl (/app/forms/{formId}). Does not publish the form.","inputSchema":{"type":"object","properties":{"formId":{"type":"string","description":"Form id in the authenticated organization."},"title":{"type":"string","maxLength":200,"description":"Form title, at most 200 characters. On a published form this is held as a draft until publish."},"settings":{"type":"object","additionalProperties":true,"description":"description, indexable, confirmationMessage, and notifyEmails are type-checked. Other client keys are stored. Top-level keys whose names start with __ are ignored, including editorSession and editorSeq inside settings."},"fields":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"order":{"type":"integer","minimum":0,"description":"Position of an existing field (an entry with id). Integer greater than or equal to 0. An order already used by another field on this version is refused. Ignored on an insert; new fields are appended. Omitted keys are not written."}}},"description":"Fields to update, add, or remove. An id updates that field. No id inserts a field. op add inserts a field and must not include an id (label and type required; helpText at most 2000 characters, required, options, and stageId optional; stageId defaults to Interest or the first stage; the server assigns the id). On an existing field, order is an integer greater than or equal to 0 and sets that field's position. order on an insert is ignored and the new field is appended. An order already used by another field on this version is refused. op remove deletes that field when it is on the current draft and its key has no answers or consents on any version of this form. At most 20 adds and 20 removes per call. A form holds at most 140 fields. Unknown keys are rejected. Omitted keys are not written."},"removeFieldIds":{"type":"array","items":{"type":"string"},"description":"Field ids to delete from the current draft. A field whose key has answers or consents on any version of this form is refused. Combined with op remove, at most 20 deletes per call."},"editorSession":{"type":"string","description":"Editor tab session. Send with editorSeq. Omitted saves keep last-commit-wins and leave the stored stamp."},"editorSeq":{"type":"integer","minimum":1,"description":"Editor sequence for this session. A lower sequence does not overwrite a newer save."}},"required":["formId"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"formId":{"type":"string","description":"Draft form id."},"title":{"type":"string"},"status":{"type":"string"},"versionId":{"type":"string","description":"Version being edited, when one exists."},"editorUrl":{"type":"string","format":"uri","description":"Editor URL, /app/forms/{formId}."},"settings":{"description":"Settings the editor would show. Null when unset."},"fields":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"key":{"type":"string"},"label":{"type":"string"},"type":{"type":"string"},"required":{"type":"boolean"},"order":{"type":"integer"}},"required":["id","key","label","type","required","order"],"additionalProperties":false}},"added":{"type":"array","items":{"type":"object","properties":{"id":{"$ref":"#/properties/fields/items/properties/id"},"key":{"$ref":"#/properties/fields/items/properties/key"},"label":{"$ref":"#/properties/fields/items/properties/label"},"type":{"$ref":"#/properties/fields/items/properties/type"},"required":{"$ref":"#/properties/fields/items/properties/required"},"order":{"$ref":"#/properties/fields/items/properties/order"},"stageId":{"type":["string","null"]}},"required":["id","key","label","type","required","order"],"additionalProperties":false},"description":"Fields inserted by this call."}},"required":["formId","title","status","editorUrl","fields"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Update a draft form","readOnlyHint":false,"destructiveHint":false}},{"name":"discard_form","title":"Discard an open draft","description":"Discard the open draft of a form that belongs to the authenticated organization. Requires an org API key or OAuth sign-in with the forms:write scope. Same checks as POST /api/v1/forms/{id}/discard. An open draft is an unpublished version newer than the published snapshot. This deletes that draft and clears drafted public settings. The published form stays. Returns { ok: true }. A form with no open draft returns 404 { error: \"not found\", message: \"No open draft to discard.\" }. That includes a form that was never published and a published form with nothing left to discard. If the form changed since this discard was read, it writes nothing and returns 409 'This form changed. Reload and try again.' This does not delete the form. A form that belongs to another organization is not found.","inputSchema":{"type":"object","properties":{"formId":{"type":"string","description":"Form id in the authenticated organization."}},"required":["formId"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"ok":{"type":"boolean","const":true,"description":"The open draft was discarded. The published form stays."}},"required":["ok"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Discard an open draft","readOnlyHint":false,"destructiveHint":true}},{"name":"publish_form","title":"Publish a form","description":"Publish a draft form that belongs to the authenticated organization. Requires an org API key or OAuth sign-in with the forms:write scope. Runs the same checks as POST /api/v1/forms/{id}/publish, including field identity and stage validation. A form with no fields is rejected (400 'A form must have at least one field to publish.'). Publish returns 409 'Publish would remove a field that already has answers or consents.' when the draft would drop a field key that already has answers or consents on any version of the form. Returns formId, status published, publicUrl (the public form URL, the same value as publicFormUrl), the embed URL, and the embed snippet. Does not publish a form that belongs to another organization.","inputSchema":{"type":"object","properties":{"formId":{"type":"string","description":"Form id of a draft in the authenticated organization."}},"required":["formId"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"formId":{"type":"string","description":"Published form id."},"versionId":{"type":"string"},"version":{"type":"integer"},"status":{"type":"string","const":"published"},"publicFormUrl":{"type":"string","format":"uri","description":"Canonical public form URL."},"publicUrl":{"type":"string","format":"uri","description":"Same URL as publicFormUrl."},"embedUrl":{"type":"string","format":"uri","description":"Iframe URL, /{org}/{form}?embed=1."},"embedSnippet":{"type":"string","description":"Script tag that embeds the form."}},"required":["formId","versionId","version","status"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Publish a form","readOnlyHint":false,"destructiveHint":true,"openWorldHint":true},"_meta":{"ui":{"resourceUri":"ui://applytovolunteer/form-preview.html"},"ui/resourceUri":"ui://applytovolunteer/form-preview.html","openai/outputTemplate":"ui://applytovolunteer/form-preview.html"}},{"name":"claim_preview","title":"Save a preview as a draft","description":"Save an unexpired anonymous preview into the authenticated organization as a draft. Requires an org API key or OAuth sign-in with the forms:write scope. Same save as POST /api/v1/tools/previews/{id}/claim. previewId is the token in previewUrl (/tools/p/{previewId}). Returns formId and editorUrl (/app/forms/{formId}). An unknown or expired preview is an error. A preview already saved by another organization is refused. Claiming the same preview again for this organization returns the same draft.","inputSchema":{"type":"object","properties":{"previewId":{"type":"string","minLength":22,"maxLength":22,"pattern":"^[A-Za-z0-9_-]{21}[AQgw]$","description":"Preview id from previewUrl (/tools/p/{previewId})."}},"required":["previewId"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"formId":{"type":"string","description":"Draft form id saved from the preview."},"editorUrl":{"type":"string","format":"uri","description":"Editor URL, /app/forms/{formId}."},"versionId":{"type":"string"},"grader":{"type":"object","properties":{"score":{"type":"integer","minimum":0,"maximum":100},"grade":{"type":"string","enum":["A","B","C","D","F"]},"recommendations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"severity":{"type":"string"},"title":{"type":"string"},"detail":{"type":"string"}},"required":["id","severity","title","detail"],"additionalProperties":true}}},"required":["score","grade","recommendations"],"additionalProperties":true,"description":"Grade of the saved draft, when one was stored."}},"required":["formId","editorUrl"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"title":"Save a preview as a draft","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"_meta":{"ui":{"resourceUri":"ui://applytovolunteer/form-preview.html"},"ui/resourceUri":"ui://applytovolunteer/form-preview.html","openai/outputTemplate":"ui://applytovolunteer/form-preview.html"}}],"prompts":[{"name":"convert_volunteer_form","title":"Convert a volunteer form","description":"Turn a blank volunteer form into a preview. Sign up free from the claim link, or claim and publish it when you are already signed in.","arguments":[{"name":"url","description":"https URL of a blank volunteer PDF, Word file, or HTML page. Send exactly one of a url, pasted text, or template.","required":false},{"name":"text","description":"Pasted blank form, one field label per line. Do not include applicant answers.","required":false},{"name":"template","description":"Built-in blank form: volunteer-application-form or volunteer-interest-form. Send exactly one of a url, pasted text, or template.","required":false}]},{"name":"grade_volunteer_form","title":"Grade a volunteer form","description":"Grade a blank volunteer form, show the top fixes, and offer to convert it.","arguments":[{"name":"url","description":"https URL of a blank volunteer form. Send a url or pasted text, not both.","required":false},{"name":"text","description":"Pasted blank form text. Send a url or pasted text, not both.","required":false}]},{"name":"review_new_applications","title":"Review new applications","description":"List applications for a form and summarize the new ones. Does not change a status unless you explicitly say yes.","arguments":[{"name":"formId","description":"Form id from list_forms. Omit it to pick a form after listing.","required":false}]}],"resources":[{"uri":"a2v://getting-started","name":"getting-started","title":"Getting started","description":"How to call preview_volunteer_form or grade_form with no API key, then open claimUrl or signUpUrl.","mimeType":"text/markdown"},{"uri":"a2v://templates/volunteer-application-form","name":"volunteer-application-form","title":"Volunteer application form template","description":"Blank volunteer application fields, with the public template URL. Contact details first. References and consents later.","mimeType":"text/markdown"},{"uri":"a2v://templates/volunteer-interest-form","name":"volunteer-interest-form","title":"Volunteer interest form template","description":"Blank volunteer interest fields, with the public template URL. Name, email, phone, interests, and availability.","mimeType":"text/markdown"},{"uri":"a2v://tool-map","name":"tool-map","title":"MCP tool map","description":"Anonymous tool names and the claim and publish path. No secrets.","mimeType":"text/markdown"},{"uri":"ui://applytovolunteer/form-preview.html","name":"form-preview","title":"Form preview","description":"Read-only inline result for preview_volunteer_form, get_preview, grade_form, create_form, create_form_from_pdf, convert_pdf_preview, publish_form, and claim_preview. Open buttons use utm_source=mcp-app.","mimeType":"text/html;profile=mcp-app","_meta":{"ui":{"prefersBorder":true,"csp":{"connectDomains":[],"resourceDomains":[],"frameDomains":[],"baseUriDomains":[]}}}}]}