Write it anywhere. Merge it yourself.
A remote MCP server for
ashutoshverma.dev to read, create, delete drafts posts and publish them.
Six tools read
the site, serve the drafting rules, save drafts, and open a pull request. Publishing
stops at the pull request — the merge button is somewhere the model cannot reach.
- 1.0 draft
- 2.0 save
- 3.0 publish
- 4.0 merge
The posts that got written were the ones that survived the laptop.
Publishing meant opening the laptop, finding the repo, copying a template, getting the metadata block exactly right, committing, pushing, waiting for Vercel. Drafting from a phone was not possible at all.
So the idea you had on a train did not survive. This server is the shortest path from that idea to a preview URL, and deliberately nothing more.
How a thought becomes a page
-
1.0Draft
In any Claude client — Code, Desktop, the browser, the phone. get_skill serves the rules for the kind of content you are writing, plus be-human, the voice. The model does the writing; the server only moves bytes.
-
2.0Save
save_draft writes real MDX into workshop, a private repo. It commits straight to main, because nothing in there is public yet. A draft can be read back, rewritten, or thrown away.
-
3.0Publish
publish validates the draft against the site’s own live schema, cuts a branch on portfolio, and opens a pull request. Say “publish it” twice and you still get exactly one.
-
4.0Merge
Vercel builds a preview of the pull request. You read the preview, then you press merge. There is no tool for this stage, and that is the point — the model has no path to that button.
Six tools
The model is the caller here, not a person. Tool names and error strings are its whole interface, which makes their wording part of the product rather than polish.
| Tool | What it does | Reach |
|---|---|---|
| list_content | An index of writings, projects and posts | site · read |
| get_content | One item, whole, by slug | site · read |
| get_skill | The rules for one kind of content, plus the voice | workshop · read |
| save_draft | Write or replace a draft | workshop · write |
| publish | Open a pull request on the public site | portfolio · PR only |
| discard_draft | Delete a draft | workshop · write |
The tool opens the pull request. A person merges it.
Everything else follows from that. A slug that is already published cannot be touched without an explicit revise flag. No repo is ever cloned, so there is no stale checkout waiting to surprise anyone. Auth is one unguessable secret in the URL path — there is exactly one user, which is the one case OAuth adds nothing to.
The phone is the dangerous client: no diff to read, and a distracted reader. Every refusal in the design exists for that case.
What it runs on
- Runtime
- Bun · TypeScript, strict
- Server
- Elysia · the MCP TypeScript SDK
- Validation
- Zod, at every boundary
- Tooling
- Biome · bun:test
- Host
- Fly.io — one small machine that stops itself when idle
- Storage
- None. Every read and write goes through the GitHub API
- Status
- All six tools built.
An idea on a train now reaches a preview URL with no laptop involved.