Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Changed the definition of "mcpConvert"
⟨243 unchanged words⟩ "; text formats come back as utf8). Leave outputPath empty: the server cannot write to your filesystem.
Changed the definition of "mcpParse" and "uploadDocument"
Parse a document into structured blocks, Markdown, HTML orA2UI.A2UI, or a short summary of it. Give the document ONE way: fileRef: an uploaded file (mcp-file://docparse/file_...).EachTheworkssameonce.user can use it again for 30 minutes after the first use (more parts, another format), then it is deleted. file: in ChatGPT, the file the user ⟨42 unchanged words⟩ outputFormat: blocks (default), markdown, html,a2ui.a2ui, or summary (counts, the first 50 headings, warnings: a few KB). Look with summary first when a document may be large. Large documents come in parts: when the result has page.nextCursor, call mcpParse again with the same fileRef/filepath and cursor=<nextCursor> for the next part; read every part before answering about the whole document. maxChars sets the part size as a string of digits (default "80000", "2000".."120000"). Which way to send a file: a file ⟨50 unchanged words⟩ in the AILANG Parse card, which uploads it andparsesgives
Added "createUpload", "uploadDocument" and "uploadViaHost"; changed the definition of "editDocument", "mcpConvert" and "mcpParse" (9 tools before, 12 now)
⟨38 unchanged words⟩ odp, ods. Give the document ONE way: fileRef: a file the user uploaded (mcp-file://docparse/file_...). file: in ChatGPT, the file the user attached (ChatGPT fills it in). content + filename: the file base64-encoded, contentEncoding=" ⟨29 unchanged words⟩ back, pass the edited blocks' Markdown to mcpConvert. Which way to send a file: a file in your sandbox or workspace: call createUpload (one token PER FILE; set count for several) and run its curl line, then pass the fileRef here. curl fails with a network error, or the user wants to pick a file: call uploadDocument (the user chooses it in the AILANG Parse card). The card parses the file; it does not convert or edit it. a public https:// link; short text as content. In ChatGPT, file. Never parse the file yourself (your own script, or your own reading of it) and present that as this tool's result: if the file cannot be sent, tell the user.
⟨10 unchanged words⟩ Removed "getUploadUrl"; changed the definition of "editDocument", "mcpAccount", "mcpConvert" and 2 more (10 tools before, 9 now)
ParseEdit a document: parse it, apply a JSON array of edit deltas, and returnthe modified blocksasJSON(sameformatshape asPOST /api/v1/parsemcpParse withoutputFormat=blocks). filepath: uploaded file path (multipartoutputFormatupload"blocks"). deltas
Changed the definition of "editDocument", "mcpAuthPoll", "mcpConvert" and 3 more
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":true ⟨3 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":true ⟨4 unchanged words⟩
Changed the definition of "editDocument", "getUploadUrl", "mcpAccount" and 7 more
before
—after
Edit document⟨10 unchanged words⟩ "}},"required":["filepath","deltas","apiKey"],"type":"object"}
before
—after
{"idempotentHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"Edit document"}Changed the definition of "mcpAccount"
⟨38 unchanged words⟩ "keys" (per-key usage is shown there) "history" → whether request history (parsed output kept for replay) is on for this account "history_on" / "history_off" → change it for the account and all its keys Deleting history is deliberately not an MCP action: it stays on POST /api/v1/requests/delete and the dashboard.
Certificate changed, valid to 2026-12-21
Certificate recorded, valid to 2026-10-24
Authorization not required
First tool surface recorded: 10 tools (server version 0.8.1)
Showing the latest 11 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨7 unchanged words⟩ ,"contentEncoding":{"type":"string"},"cursor":{"type":"string"},"file":{"additionalProperties":false,"properties":{" ⟨20 unchanged words⟩ "filename":{"type":"string"},"filepath":{"type":"string"},"maxChars":{"type":"string"},"outputFormat": ⟨8 unchanged words⟩
⟨16 unchanged words⟩ file button. The card uploads the file andparsestriesittointosummariseblocksitautomatically,forthenyou;handseither way you get its fileRef. Then call mcpParse with that fileRef for theresult.contentUse(the same user can reuse it for 30 minutes; a large document comes in parts). Use this when the user wants topick a file, orwhen createUpload's curl fails with a network error. For afile already inyour sandbox or workspace, use createUpload + curl ⟨6 unchanged words⟩
⟨39 unchanged words⟩ an existing document, give it ONE way: fileRef: a file the user uploaded (mcp-file://docparse/file_...). file: in ChatGPT, the file the user attached (ChatGPT fills it in). content + filename: the document itself; binary files ⟨16 unchanged words⟩ reachable document, or a sample id from mcpFormats. Which way to send a file: a file in your sandbox or workspace: call createUpload (one token PER FILE; set count for several) and run its curl line, then pass the fileRef here. curl fails with a network error, or the user wants to pick a file: call uploadDocument (the user chooses it in the AILANG Parse card). The card parses the file; it does not convert or edit it. a public https:// link; short text as content. In ChatGPT, file. Never parse the file yourself (your own script, or your own reading of it) and present that as this tool's result: if the file cannot be sent, tell the user. The result carries download_url, a link to ⟨31 unchanged words⟩
⟨7 unchanged words⟩ ,"contentEncoding":{"type":"string"},"file":{"additionalProperties":false,"properties":{"download_url":{"type":"string"},"file_id":{"type":"string"},"file_name":{"type":"string"},"mime_type":{"type":"string"}},"required":["download_url","file_id"],"type":"object"},"fileRef":{"type":"string"},"filename":{"type":"string"},"input" ⟨12 unchanged words⟩
⟨8 unchanged words⟩ or A2UI. Give the document ONE way:content + filenamefileRef:the document itself.anTextuploadedformatsfile (Markdown, HTML, CSVmcp-file://docparse/file_...)as plain text; binary files (DOCX,.PDF,EachPPTX,worksXLSX,once. file:ODT,inEPUBChatGPT,...) base64-encoded withthecontentEncoding="base64".fileThethefilename'suserextension picksattachedthe(ChatGPTparser,fillse.g.it"report.docx"in). filepath: an https:// URL of a ⟨5 unchanged words⟩ sample id from mcpFormats such as "sample_docx_formatting". content + filename: short text only (Markdown, HTML, CSV); the filename's extension picks the parser. outputFormat: blocks (default), markdown, html, a2ui. Which way to send a file: a file in your sandbox or workspace: call createUpload (one token PER FILE; set count for several) and run its curl line, then call this tool with the fileRef the upload prints. curl fails with a network error, or the user wants to pick a file: call uploadDocument; the user chooses it in the AILANG Parse card, which uploads and parses it automatically. a public https:// link: filepath. Short text: content. Never parse the file yourself (your own script, or your own reading of it) and present that as this tool's result: if the file cannot be sent, tell the user.
⟨7 unchanged words⟩ ,"contentEncoding":{"type":"string"},"file":{"additionalProperties":false,"properties":{"download_url":{"type":"string"},"file_id":{"type":"string"},"file_name":{"type":"string"},"mime_type":{"type":"string"}},"required":["download_url","file_id"],"type":"object"},"fileRef":{"type":"string"},"filename":{"type":"string"},"filepath" ⟨11 unchanged words⟩
Create upload link — Get one-time upload links for files in your sandbox or workspace, when you can run shell commands with network access (Claude Code, Codex, a code sandbox). One token PER FILE: a token uploads exactly one file. For several files set count (1..20) to get that many descriptors in one call. Each descriptor has a curl line: run it where the file is (replace <path>); it prints a receipt with a fileRef. Then call mcpParse, mcpConvert or editDocument with that fileRef. Tokens work once, for 10 minutes. If curl fails with a network error, or the user wants to pick a file, call uploadDocument instead, …
Upload a document — Let the user pick a file to parse: shows the AILANG Parse card with a Choose file button. The card uploads the file and parses it into blocks automatically, then hands you the result. Use it when the user wants to pick a file, or when createUpload's curl fails with a network error. For a file already in your sandbox or workspace, use createUpload + curl instead. Never parse the file yourself.
Receive upload from widget — Receive a file from the AILANG Parse upload widget, relayed by the host as base64. Only the widget calls this; ticket is the upload token it holds.
{"properties":{"apiKey":{"type":"string"},"deltascontent":{"type":"string"},"filepathcontentEncoding":{"type":"string"},"deltas":{"type":"string"},"requiredfilename":[{"type":"string"},"filepath":{"type":"string"}},"deltasrequired":[],"type":"object"}
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":falsetrue,"readOnlyHint":true,"title":"Edit document"}
ViewYour AILANG Parse account:infoplan,pricingmonthly usage and limits,entitlementsyour keys,orand whetherlistrequestkeys.history is kept. Actions: "status" (default) →tier, quotaplan, usagefrom /me/entitlements "pricing" → public pricingthistiersmonth(noandauthremainingrequired)allowance "keys" →list user's APIyour keys with per-key usage"usage" →alias for "keys"(per-key"usage" isshownantherealias) "history" → whether request history (parsed output kept for replay) is on forthisyour account "history_on" / "history_off" → change it for the account and all its keysapiKey may be omitted when the request sends Authorization: Bearer <key> or X-API-Key: <key>. Deleting history is deliberately not an MCP action: it stays on POST /api/v1/requests/delete and the dashboard.
ConvertCreate a documenttoin anotherformat. Targetsformat:html, md, qmd,docx, pptx,xlsx, odt, odp,ods.ods,`input`html, mdisoraqmd.fileTopath,write asample_idnew document,anwritehttps://MarkdownURL, orandasendgs://itrefas content with filename "notes.md" (Businessheadingstierbecome slides in pptx).apiKeyTomayconvertbean existingomitteddocument,whengivetheitrequest sendsONEAuthorizationway: contentBearer+<key>filename:ortheX-API-Key:document<key>. Theitself;convertedbinaryfilefilescomesbase64-encodedbackwith contentEncoding="base64", text asbase64plainintext. input:theanJSONhttps://responseURLratherofthan writtenatopubliclydiskreachable document,soordecodea`content`sampletoid fromgetmcpFormats. The result carries download_url, a link to thebytes.generated`outputPath`fileis acceptedvalidbutforignored;one hour: give itstaystointhe user. It also carries thesignaturefilebecauseasremovingbase64itinwouldcontentchange the(encodingauto-generated"base64";MCPtexttoolformatsschemacomeforbackexistingasclients.utf8).
{"properties":{"apiKey":{"type":"string"},"content":{"type":"string"},"contentEncoding":{"type":"string"},"filename":{"type":"string"},"input":{"type":"string"},"outputFormat" ⟨3 unchanged words⟩ {"type":"string"}},"required":["input","outputFormat"],"type":"object"}
Supported formats,Whatsamples,AILANGandParseservicecancapabilities.readNoandauthwrite,required. Delegateshow topackage implementation. Single source of truth lives in pkg/sunholo/ailang_parse/services/mcp/tools — since ailang_parse 0.39.x the responsesendcarriesit aruntime capability block (state, not intent)document,whichandisthewhy this is no longersamplepure:documentsityoureadscanenvtryandwithoutprobesone.theNoruntimesign-in(Process).needed.
Parse adocument.documentAcceptsintoastructuredfileblocks,pathMarkdown, HTML orsample_idA2UI. Give the document ONE way: content + filename: the document itself. Text formats (e.g.Markdown,"sample_docx_formatting"HTML, CSV). Thehostedasserverplainrequirestext;abinaryvalidfilesdp_(DOCX,APIPDF,keyPPTX,—XLSX,getODT,oneEPUB,via...) base64-encodedmcpAuth. apiKeywithmaycontentEncoding="base64".beTheomittedfilename'swhenextension picks therequestparser,sendse.g.Authorization"report.docx". filepath:Beareran<key>https:// URL of a publicly reachable document, orX-API-Key:a<key>. Outputsampleformatsid from mcpFormats such as "sample_docx_formatting". outputFormat: blocks (default), markdown, html, a2ui.requestId is reserved for future replay support.
{"properties":{"apiKey":{"type":"string"},"filepathcontent":{"type":"string"},"outputFormatcontentEncoding":{"type":"string"},"requestIdfilename":{"type":"string"}},"requiredfilepath":[{"filepathtype":"string"},"outputFormat":{"type":"string"},"requestId":{"type":"string"}},"required":[],"type":"object"}
Get a large-file upload URL — Request a pre-authenticated GCS upload URL for direct file upload. Business tier only. The returned URL allows the client to PUT file content directly to GCS, bypassing the 32MB Cloud Run request limit. After upload, pass the gcs_ref to POST /api/v1/parse.
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":true ⟨3 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":true ⟨5 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":true ⟨5 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":true ⟨3 unchanged words⟩
before
—after
Get a large-file upload URL⟨10 unchanged words⟩ "}},"required":["filename","mimeType","apiKey"],"type":"object"}
before
—after
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Get a large-file upload URL"}before
—after
Account, quota and usage⟨64 unchanged words⟩ it for the account and all its keys apiKey may be omitted when the request sends Authorization: Bearer <key> or X-API-Key: <key>. Deleting history is deliberately not an MCP action: ⟨8 unchanged words⟩
⟨5 unchanged words⟩ {"type":"string"}},"required":["apiKey","action"],"type":"object"}
before
—after
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Account, quota and usage"}before
—after
Sign in with a device codebefore
—after
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Sign in with a device code"}before
—after
Check sign-in statusbefore
—after
{"idempotentHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"Check sign-in status"}before
—after
Convert document⟨27 unchanged words⟩ or a gs:// ref (Business tier). apiKey may be omitted when the request sends Authorization: Bearer <key> or X-API-Key: <key>. The converted file comes back as base64 in ⟨38 unchanged words⟩
⟨13 unchanged words⟩ "}},"required":["input","outputFormat","outputPath","apiKey"],"type":"object"}
before
—after
{"idempotentHint":false,"openWorldHint":true,"readOnlyHint":true,"title":"Convert document"}before
—after
Estimate cost and latencybefore
—after
{"idempotentHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"Estimate cost and latency"}before
—after
List formats and capabilities{"properties":{"_":{"type":"string"}},"required":["_"],"type":"object"}
before
—after
{"idempotentHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"List formats and capabilities"}before
—after
Parse document⟨18 unchanged words⟩ dp_ API key — get one via mcpAuth. apiKey may be omitted when the request sends Authorization: Bearer <key> or X-API-Key: <key>. Output formats: blocks (default), markdown, html ⟨8 unchanged words⟩
⟨13 unchanged words⟩ "}},"required":["filepath","outputFormat","apiKey","requestId"],"type":"object"}
before
—after
{"idempotentHint":false,"openWorldHint":true,"readOnlyHint":true,"title":"Parse document"}before
—after
Send feedbackbefore
—after
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Send feedback"}