Slides & documents · markdown · MCP

Generate artifacts. Fix it by hand. Repeat.

Artifact that can be edited by llms over MCP or by you on the canvas.

ohmyartifact  /  Gallery Saved ExportPresent

Organization pricing

Pay for the knowledge you keep, not the people who use it.

Every plan includes unlimited users. Capacity is based on active saved artifacts across documents and decks.

Business

$299 / month

$2,990 yearly · two months included

1,000 artifacts active and saved

  • Unlimited users
  • Human + agent editing
  • Private-pilot onboarding

Enterprise

$1,999 / month

$19,990 yearly · two months included

50,000 artifacts active and saved

  • Unlimited users
  • Human + agent editing
  • Direct private-pilot onboarding

Private pilot: checkout reserves your plan and starts assisted onboarding. An active saved artifact is a document or deck currently retained in your organization workspace; deleted artifacts do not count.

Install

Set up in one paste.

Copy this into Claude Code, or any agent that can run commands and write files. It connects the MCP server, installs the skill, and checks that both work.

setup promptMCP + skill
Set up ohmyartifact for me. Do all three steps, then tell me what happened.

1. Connect the MCP server. It is a Streamable HTTP server at http://localhost:8080/mcp
   (the app must be running: `make dev` inside ohmyartifact/app).
   - Claude Code: run  claude mcp add --transport http --scope user ohmyartifact http://localhost:8080/mcp
   - Any other client: add {"ohmyartifact": {"type": "http", "url": "http://localhost:8080/mcp"}}
     under "mcpServers" in its MCP config.

2. Install the skill. Create ~/.claude/skills/ohmyartifact/SKILL.md (or your client's skills
   folder) with exactly the content between the two ===== lines below. Do not change it.

3. Verify. Call list_artifacts on the ohmyartifact server and tell me what came back.
   Then read the resource oma://guide and tell me its first heading; that is the authoring guide
   the skill relies on. If either fails, tell me why instead of retrying.

=====
---
name: ohmyartifact
description: Read, create, and revise ohmyartifact documents and slide decks through its MCP server (local at http://localhost:8080/mcp). Use when the user mentions a deck, slides, a document, the gallery, or asks to turn something into a presentation.
---

# ohmyartifact

ohmyartifact stores every artifact as plain markdown. A person edits it on a canvas; you edit it over MCP. It is the same file, so make the smallest change that does the job and leave everything else exactly as you found it.

## Connect once

The app must be running locally (`make dev` in `app/`; REST and MCP share port 8080). Inside the repo, `.mcp.json` already registers the server. Anywhere else:

```bash
claude mcp add --transport http ohmyartifact http://localhost:8080/mcp
claude mcp list   # ohmyartifact: http://localhost:8080/mcp (HTTP) - ✓ Connected
```

## Authoring rules live on the server

The server sends its authoring guide as instructions when you connect: deck and document format, overlay slots and tones, mermaid diagrams, what earns its place on a slide, copy rules. That guide is the single source of truth and this skill does not repeat it. If your client does not show server instructions, read the resource `oma://guide` before your first write. Do not author from memory.

## Tools

Every write takes the `version` you last read and fails with `stale version: … is now at version N; read it again and retry` if someone saved in between. Every read and every write returns the current version.

| Tool | Arguments | Use it for |
| --- | --- | --- |
| `list_artifacts` | `query?` | find ids; `query` is a prefix search over title and content |
| `read_artifact` | `id` | metadata line, deck outline, then the full markdown |
| `create_document` | `title, markdown` | a new document |
| `create_slideshow` | `title, markdown` | a new deck |
| `edit_artifact` | `id, version, old_text, new_text, replace_all?` | exact-text replacement; `old_text` must match once unless `replace_all` |
| `replace_slide` | `id, version, slide, markdown` | rewrite one slide (1-based, no `---` in the markdown) |
| `insert_slide` | `id, version, markdown, after?` | add a slide after `after` (0 = first, omit = append) |
| `delete_slide` | `id, version, slide` | remove one slide |
| `move_slide` | `id, version, from, to` | reorder |
| `update_artifact` | `id, version, markdown?, title?` | replace the whole content or rename; only when rewriting most of it |
| `delete_artifact` | `id` | permanent; only when the user asks for it by name |

Resources: `oma://guide` (authoring guide), `oma://schema/overlays` (the JSON Schema every write is validated against), `oma://artifacts/{id}` (raw markdown).

## Workflow

1. `list_artifacts` with a query, or without one to see everything. If more than one title matches, ask which.
2. `read_artifact`. Keep the `version`. For a deck, the outline tells you slide numbers.
3. Pick the narrowest tool: `edit_artifact` for a sentence, `replace_slide` for a slide, `insert_slide` for a new one. `update_artifact` is for rewrites the user asked for.
4. Send the version you read. On a stale-version error, read again, reapply your change to the fresh text, write once more. Do not loop.
5. An invalid overlay or diagram rejects the whole write and nothing is saved; the error lists one message per problem. Fix the named fields and retry. Never drop an element to make an error go away.
6. Tell the user what changed, by slide number or heading. The editor picks the change up within a few seconds; they do not need to reload.
=====
Needs the app running locally: make dev in app/ Works with anything that speaks MCP over HTTP
Prefer to do it by hand?
  1. Run claude mcp add --transport http --scope user ohmyartifact http://localhost:8080/mcp
  2. Save the text between the ===== lines above as ~/.claude/skills/ohmyartifact/SKILL.md
  3. Ask for a deck.