ChatGPT Web HWPX MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ChatGPT Web HWPX MCPCall probe_read with message "ChatGPT Web P0 read test""
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ChatGPT Web HWPX MCP
Remote Streamable-HTTP MCP for creating and handing off HWPX documents from ChatGPT Web.
Current phase
P0 is closed / PASS. ChatGPT Web discovered the custom MCP, executed native read/write actions, and created a remote artifact. See P0_TEST_LEDGER.md.
P1 is closed at the server/lifecycle layer. Minimal valid HWPX materialization, opaque document_id custody, structural validation, signed export, and deletion are implemented. See P1_TEST_LEDGER.md.
P1.1 is active. Authentication has moved out of MCP tool arguments and onto the MCP transport:
ChatGPT Web
→ OAuth 2.1 authorization-code + PKCE/DCR
→ Authorization: Bearer <short-lived access token>
→ remote MCP /mcp
→ create_document
→ caller-owned opaque document_id
→ bounded ephemeral object store
→ structural HWPX validation
→ export_document
→ short-lived signed artifact URLThe P1.1 receipts are tracked in P11_TEST_LEDGER.md.
P1.1 intentionally does not accept arbitrary existing HWPX uploads yet.
Related MCP server: notebooklm-mcp
MCP tools
Tool | Side effect | Purpose |
| No | Authenticated connectivity probe |
| No | Current capability/auth boundary |
| Yes | Materialize a small HWPX and return an opaque |
| No | Validate and inspect one caller-owned document |
| No* | Return a short-lived signed download URL |
| Yes | Delete the caller-owned HWPX and metadata |
There are no password, passphrase, API-key, or access-token fields in these MCP tool schemas. Authentication happens at the HTTP/MCP transport layer.
export_document does not mutate the HWPX bytes, but it creates a temporary bearer-style download capability.
OAuth boundary
P1.1 co-hosts a small single-user OAuth 2.1 authorization server using the MCP Python SDK.
The flow is:
401 from /mcp
→ Protected Resource Metadata discovery
→ Authorization Server Metadata discovery
→ Dynamic Client Registration
→ authorization-code + PKCE
→ browser approval page
→ short-lived access token + rotating refresh token
→ bearer-authenticated MCP requestThe browser approval page requires P11_OAUTH_PASSPHRASE, which is a server-side deployment secret. It is never sent as an MCP tool argument.
Prototype token settings:
access token: 15 minutes;
refresh token: 30 days with rotation;
authorization request: 5 minutes;
required MCP scope:
hwpx;refresh scope:
offline_access.
Current OAuth limitation
OAuth client registrations, authorization codes, access tokens, and refresh tokens are stored in memory in P1.1. A server restart or Render redeploy invalidates them and therefore requires ChatGPT to reconnect/re-authorize.
This is intentional for P1.1: secret-free native invocation is established before adding durable credential state.
HWPX materialization
The server uses python-hwpx >= 6.4 for document creation. Generated files are independently checked as ZIP/XML packages.
The validator requires at least:
mimetype
version.xml
META-INF/container.xml
Contents/content.hpf
Contents/header.xml
Contents/section0.xmlIt also verifies that mimetype is the first ZIP entry, is stored without compression, and equals application/hwp+zip.
Storage and ownership contract
The server never exposes filesystem paths to the model.
Each document receives an opaque ID such as:
doc_<random>Metadata includes the authenticated OAuth subject that owns the document. inspect_document, export_document, and delete_document reject documents not owned by the authenticated principal.
The current backend is a bounded ephemeral filesystem object store under /tmp; the default retention window is 30 minutes.
The document_id contract is deliberately storage-independent so a later phase can replace the filesystem backend with an S3-compatible object store without changing the MCP-facing API.
Download handoff
export_document returns a signed URL of the form:
https://HOST/artifacts/<document_id>?exp=<unix-time>&sig=<hmac>The URL expires quickly, is capped by the document retention deadline, and uses Cache-Control: private, no-store.
P1.1 CI downloads the resulting HWPX bytes and verifies their SHA-256 digest against the digest sealed at materialization time.
Local run
Install dependencies:
pip install -r requirements.txtRun with local OAuth/download secrets:
P11_OAUTH_PASSPHRASE='local-oauth-passphrase' \
P1_DOWNLOAD_SECRET='local-download-secret' \
P1_PUBLIC_BASE_URL='http://127.0.0.1:8000' \
python server.pyPowerShell:
$env:P11_OAUTH_PASSPHRASE="local-oauth-passphrase"
$env:P1_DOWNLOAD_SECRET="local-download-secret"
$env:P1_PUBLIC_BASE_URL="http://127.0.0.1:8000"
python server.pyEndpoints:
http://127.0.0.1:8000/health
http://127.0.0.1:8000/mcp
http://127.0.0.1:8000/.well-known/oauth-protected-resource/mcp
http://127.0.0.1:8000/.well-known/oauth-authorization-serverRun the full OAuth-native lifecycle smoke test:
P11_OAUTH_PASSPHRASE='local-oauth-passphrase' \
RUN_P11_WRITE_TEST=1 \
python test_client.pyUnit tests:
python -m unittest -v test_p1.pyDocker
docker build -t chatgpt-web-hwpx-mcp .
docker run --rm -p 8000:8000 \
-e P11_OAUTH_PASSPHRASE='replace-me-with-a-strong-value' \
-e P1_DOWNLOAD_SECRET='replace-me-too' \
chatgpt-web-hwpx-mcpDeployment
render.yaml is the canonical deployment description. There is deliberately no one-click deploy button.
Required deployment secrets:
P11_OAUTH_PASSPHRASE— manually provisioned secret (sync: falsein the Render Blueprint);P1_DOWNLOAD_SECRET— generated by Render.
The existing canonical Render service retains the historical P0-era slug so the registered MCP endpoint does not change unnecessarily:
https://chatgpt-web-hwpx-mcp-p0.onrender.comCI
Two workflows define the P1.1 court:
P1.1 OAuth HWPX lifecycle CI— unit tests, unauthenticated 401, OAuth discovery, DCR, PKCE authorization, bearer MCP, secret-free tool-schema audit,create → inspect → export → download → SHA-256 receipt → delete.P1.1 Render OAuth boundary verification— public/health, OAuth metadata endpoints, and unauthenticated MCP rejection against the deployed service.
Remote CI intentionally does not receive the browser-approval passphrase.
Security boundary
P1.1 is still a prototype. Do not yet ingest existing personal or confidential HWPX files.
Before sensitive-document ingress, the project still needs:
durable OAuth registration/token persistence across deploys;
stronger multi-user/session isolation;
ingress ZIP-bomb/path-traversal/XML defenses;
quotas and audit logging;
persistent object storage if durable custody is needed;
a Hancom rendering/fidelity oracle for exact visual compatibility.
Next phases
P1 minimal valid HWPX + document_id + signed export
P1.1 OAuth-native secret-free lifecycle + authenticated ownership
P1.2 durable auth state + authenticated safe ingest
P2 structured edits and formatting
P3 tables / images / equations
P4 renderer-oracle and Hancom fidelity validationThis server cannot be deployed
Maintenance
Related MCP Connectors
Team docs served to AI agents over MCP - search, Markdown reads, version pinning, read audit.
Generate contextual prompts and reusable agent skills, evaluate prompts with the 16-dimension Prompt Score, and manage saved work in PromptDrive. Twelve MCP tools also provide authorized access to private Memory for source-grounded answers. Connect over Streamable HTTP using OAuth 2.1 and PKCE. Generation consumes account quota and automatically saves successful results; Memory access follows account permissions and plan limits.
Hosted MCP endpoint with realistic fake data for prototyping agents. 12 tools, no setup.
Security & DLP proxy for MCP: tool-poisoning scans, PII redaction on tool args/results. Beta.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to read, search, create, and edit Quip documents through the MCP protocol.5ISC
- AlicenseBqualityBmaintenanceMCP server that provides ~39 tools to interact with Google NotebookLM's internal API, enabling notebook management, source addition, chat queries, and Studio artifact generation through stdio, HTTP, and SSE transports.39MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to interact with WordPress sites over MCP, providing read-only tools for AEO/GEO readiness, AI visibility, traffic, request logs, bot identification, page checks, and schema/markdown previews, plus opt-in write tools to draft, edit, and publish posts with permission checks and auditing.1GPL 2.0
- AlicenseNot gradedqualityBmaintenanceEnables ChatGPT Pro web to securely read workspace files, git diffs, and test records through OAuth-protected read-only MCP tools, so it can plan and review while Codex handles execution without uploading the repository.MIT