mcpField
A
ArtifactSmith

ArtifactSmith

リモート
github.com生産性03 日前に更新
リポジトリ公式サイト

ArtifactSmith について

ArtifactSmithは、自分でAIエージェントを運用する人向けのオープンソース成果物サーバーです。エージェントはバージョン管理されたウェブページや文書を作成・編集・出力・共有でき、成果物は初期状態で非公開、共有リンクは取り消せます。

主な機能

  1. 01エージェント成果物の作成と編集
  2. 02HTML、Markdown、PDF、DOCX、XLSXへの出力
  3. 03文書のバージョン管理と非公開プレビュー
  4. 04特定バージョンの共有とアクセス取り消し
  5. 05既存のMarkdownまたはHTMLの公開

活用シーン

  1. 01エージェントの調査を整ったレポートに変換
  2. 02内容をPDF、Word、Excelファイルとして出力
  3. 03共有前に非公開成果物をプレビュー
  4. 04共有済みバージョンへのアクセスを取り消し

MCP 対応

エージェントはMCP APIで成果物の作成、編集、公開、共有、管理を行います。セルフホスト環境のエンドポイントにはBearerトークンが必要で、ホスト版はOAuthに対応します。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://artifactsmith.neuralami.ai/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

すべてのエンドポイント
Streamable HTTPhttps://artifactsmith.neuralami.ai/mcp認証が必要

ツール

詳細

ArtifactSmith

ArtifactSmithは、AIエージェント向けのオープンソースのアーティファクトサーバーです。

ArtifactSmithが同じページを5つのスタイルで作成

例

公開ソース(Ready.govおよび米国労働統計局)のホスト版を基に作成しています。会議メモは架空のものです。開くのにサインアップは不要です。

エージェントはArtifactSmithを呼び出して、作業内容をWebページ、PDF、Wordファイル、スプレッドシート、Markdownなどの文書に変換します。各アーティファクトにはバージョンが付与され、共有されるまでは非公開のままです。共有リンクはいつでも無効にできます。

これは、自分でエージェントを運用し、Museのようなアーティファクトを自分のサーバー上で利用したい人向けです。

インストール前にお試しください:https://artifactsmith.neuralami.ai/try。MCPクライアントを接続できる環境を用意しています。Claude.ai、Claude Desktop、Claude Code、Cursorは、メールアドレスを使用したOAuthでサインインできます。貼り付けたトークンも利用できます。ビルド数は20回までで、私のサーバー上で実行されています。

できること

ArtifactSmithは、エージェントが文書を作成、編集、エクスポート(PDF、Word、Excel、Markdown)、共有、無効化するためのツールを提供します。OpenAI互換のあらゆるモデルエンドポイントで動作します。MetaのMuseアーティファクトに着想を得ています。

アーティファクトの例:推奨事項、ステータススコアカード、棒グラフを含む1ページの意思決定概要

要件:Composeプラグインを備えたDocker Engine。ページの作成にはモデルキー(OpenAI互換APIまたはローカルエンドポイント)が必要です。用意済みのMarkdownまたはHTMLの公開には不要です。

クイックスタート

Clineはllms-install.mdに従います。

cp .env.example .env
# Set OPENAI_API_KEY (or AM_LLM_KEY). Change AM_LLM_BASE / AM_DEFAULT_MODEL
# only if you are not using the default OpenAI host and model.
# Object-store keys: leave them empty and run ./scripts/ensure-local-env.sh,
# or paste your own AM_STORE_KEY and AM_STORE_SECRET.
./scripts/ensure-local-env.sh
docker compose up -d --build

# Create a token (prints the raw value once; only its hash is stored).
# --workspace is a label that scopes every artifact the token can see
# (e.g. alpha, team-a). Tokens cannot cross workspaces.
docker compose exec server artifactsmith token add --name agent --workspace alpha

publishは、すでに作成済みのページを保存するだけで、モデルを呼び出しません。そのため、キーが空でも次の手順を実行できます。上に表示されたトークンを貼り付けて、これを実行してください。共有URLが表示されます。

export AM_TOKEN='paste-the-token'
docker compose exec -T -e AM_TOKEN server python - <<'PY'
import asyncio
import json
import os
from datetime import timedelta

from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client

URL = "http://127.0.0.1:8780/mcp"
PAGE = """# Pilot store brief

The pilot store code is HARBOR-17. It is the identifier used on inventory, support, and rollout reports.
"""


def parse(result):
    if result.structuredContent is not None:
        return result.structuredContent
    return json.loads(result.content[0].text)


async def main():
    headers = {"Authorization": "Bearer " + os.environ["AM_TOKEN"]}
    async with streamablehttp_client(URL, headers=headers) as (read, write, _session):
        async with ClientSession(read, write) as session:
            await session.initialize()
            created = parse(
                await session.call_tool(
                    "publish",
                    {"display_name": "Pilot store brief", "markdown": PAGE},
                    read_timeout_seconds=timedelta(seconds=120),
                )
            )
            done = parse(
                await session.call_tool(
                    "status",
                    {"job_id": created["job_id"], "wait": 90},
                    read_timeout_seconds=timedelta(seconds=120),
                )
            )
            if done.get("status") != "done":
                raise SystemExit(json.dumps(done))
            shared = parse(
                await session.call_tool(
                    "share",
                    {"artifact_id": created["artifact_id"]},
                    read_timeout_seconds=timedelta(seconds=120),
                )
            )
            print(shared["url"])


asyncio.run(main())
PY

サーバーは.envからAM_LLM_BASE、AM_LLM_KEYまたはOPENAI_API_KEY、AM_DEFAULT_MODELを読み込みます。ベースURLの既定値はhttps://api.openai.comです。ベースURLの末尾に/v1を付けても問題ありません。クライアントアプリが自動的に/v1/chat/completionsを追加します。createにはキーまたはローカルのOpenAI互換エンドポイントが必要です。キーが空の状態でcreateに失敗すると、OPENAI_API_KEY / AM_LLM_KEYが空であることが報告されます。変更を反映するには、docker compose up -dをもう一度実行してください。

ホストのポートは127.0.0.1にバインドされます。

  • http://127.0.0.1:8780/mcpはMCP APIです(ベアラートークンが必要)
  • http://127.0.0.1:8780/app/はマイページです(同じトークンを貼り付けると、ブラウザーにセッションCookieが設定されます)
  • http://127.0.0.1:8781/はCookieを使用しないプレビューおよび共有元です(/p/…、/s/…)
公開済みイメージを使用する

ghcr.io/vrijsinghani/artifactsmith:0.1.0は、各リリースでlinux/amd64向けに公開されています。ソースからのビルド(上記のCompose手順)が引き続き既定の方法です。

クライアントを接続する

Claude.ai:Customize → Connectors → + Add → Add custom connector を選択します。https://artifactsmith.neuralami.ai/mcp を貼り付け、Connect を選択して、メールアドレスでサインインします。このコネクターは Claude デスクトップアプリとスマートフォンアプリでも利用できます。無料プランではカスタムコネクターを 1 つ追加できます。Team および Enterprise プランでは、オーナーが最初に追加する必要があります。

github.com/vrijsinghani/Artifactsmith は、自分で実行するコピーです。ホスト版では、Claude Desktop、Claude Code、Cursor は https://artifactsmith.neuralami.ai/mcp で OAuth を使ってサインインします。自分のコピーではトークンを使用します。このマシン上の MCP エンドポイントは http://127.0.0.1:8780/mcp です。artifactsmith token add のトークンを Authorization: Bearer YOUR_TOKEN として送信します。ヘッダーの値は Bearer で始まります。

ChatGPT Free、Go、Plus ではカスタム MCP サーバーを追加できません。Pro では読み取りと取得のみが可能なカスタム MCP サーバーを追加できますが、ページを作成することはできません。ChatGPT Business、Enterprise、Edu の管理者はウェブ上で追加でき、OAuth でサインインします。

ChatGPT ユーザーは、代わりに OpenAI の Codex CLI から利用できます。codex mcp add artifactsmith --url https://artifactsmith.neuralami.ai/mcp を実行し、次に codex mcp login artifactsmith を実行して、メールアドレスでサインインします。

Claude Desktop では設定が claude_desktop_config.json に保存されます(Settings → Developer → Edit Config)。このスニペットは npx と mcp-remote を実行するため、Node.js が必要です。保存した後、Claude Desktop を再起動してください。

{
  "mcpServers": {
    "artifactsmith": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "http://127.0.0.1:8780/mcp", "--header", "Authorization:${AUTH_HEADER}"],
      "env": { "AUTH_HEADER": "Bearer YOUR_TOKEN" }
    }
  }
}

Claude Code では .mcp.json に保存されます。または、次を実行します。

claude mcp add --transport http artifactsmith http://127.0.0.1:8780/mcp --header "Authorization: Bearer YOUR_TOKEN"
{
  "mcpServers": {
    "artifactsmith": {
      "type": "http",
      "url": "http://127.0.0.1:8780/mcp",
      "headers": { "Authorization": "Bearer YOUR_TOKEN" }
    }
  }
}

Cursor では ~/.cursor/mcp.json、またはプロジェクト内の .cursor/mcp.json に保存されます。

{
  "mcpServers": {
    "artifactsmith": {
      "url": "http://127.0.0.1:8780/mcp",
      "headers": { "Authorization": "Bearer YOUR_TOKEN" }
    }
  }
}

プロンプトの例:Pilot store brief という名前で 1 ページの概要を作成してください。これを source_content として渡します:パイロット店舗のコードは HARBOR-17 です。在庫、サポート、展開レポートで使用される識別子です。

artifactsmith stdio は標準入力と標準出力でツールを一覧表示するだけで、リッスンしません。オブジェクトストアやモデルを使用できないため、ページを作成または公開することはできません。

ネットワーク上またはプロキシの背後で提供する

Compose は API(8780)とプレビュー/共有(8781)を AM_BIND_ADDRESS(デフォルトは 127.0.0.1)で公開します。カードとリンクでは AM_API_URL、AM_PREVIEW_URL、AM_SHARE_URL を使用します(AM_SHARE_URL が空の場合は AM_PREVIEW_URL にフォールバックします)。TLS を使わずにポートを公開すると、ベアラートークンとアーティファクトの内容が平文でネットワーク上を流れます。

LAN アクセス

すべてのインターフェース(または特定の NIC の IP アドレス)でバインドし、公開 URL の変数をクライアントが開くアドレスに設定します。

# .env  (192.0.2.10 is documentation-range; substitute your LAN IP)
AM_BIND_ADDRESS=0.0.0.0
AM_API_URL=http://192.0.2.10:8780
AM_PREVIEW_URL=http://192.0.2.10:8781
AM_SHARE_URL=http://192.0.2.10:8781
AM_ALLOWED_HOSTS=192.0.2.10:8780,127.0.0.1:8780,localhost:8780

次に docker compose up -d --build を実行します。クライアントは http://192.0.2.10:8780/mcp を開き、プレビュー/共有リンクでは 127.0.0.1 ではなく 192.0.2.10 が使われます。ブラウザー経由の MCP クライアントでは、ページのオリジンを AM_ALLOWED_ORIGINS に設定する必要もあります。

共有 URL とプレビュー URL は、サーバーが返す際に AM_SHARE_URL/AM_PREVIEW_URL から構築されます。LAN 経由での提供に切り替える前にコピーしたリンクには、以前のベースホストが使われたままです。これらの設定を変更した後、もう一度 share を呼び出すか、inspect/status から URL をコピーしてください。

TLS を使用したリバースプロキシ

ホストのバインドはループバックのままにし、nginx または Caddy で TLS を終端します。公開 URL と許可リストを外部ホスト名に設定します。

# .env
AM_BIND_ADDRESS=127.0.0.1
AM_API_URL=https://artifacts.example.com
AM_PREVIEW_URL=https://preview.artifacts.example.com
AM_SHARE_URL=https://preview.artifacts.example.com
AM_ALLOWED_HOSTS=artifacts.example.com
AM_ALLOWED_ORIGINS=https://artifacts.example.com

Caddy の最小構成例(API は 443、プレビューは別のホスト名で提供):

artifacts.example.com {
  reverse_proxy 127.0.0.1:8780
}
preview.artifacts.example.com {
  reverse_proxy 127.0.0.1:8781
}

API ホスト用の nginx の最小スニペット:

server {
  listen 443 ssl;
  server_name artifacts.example.com;
  # ssl_certificate / ssl_certificate_key omitted
  location / {
    proxy_pass http://127.0.0.1:8780;
    proxy_set_header Host $host;
    proxy_set_header Authorization $http_authorization;
    # status wait can be up to 90s; nginx defaults cut at 60s.
    proxy_read_timeout 120s;
    proxy_send_timeout 120s;
  }
}

AM_ALLOWED_HOSTS に公開ホスト名のみを指定した場合、ローカルで curl http://127.0.0.1:8780/mcp を実行すると HTTP 421 が返されます(DNS リバインディング保護)。代わりに、プロキシ経由のホスト名をクライアントに指定してください。ブラウザー経由の MCP クライアントは Origin ヘッダーを送信するため、AM_ALLOWED_ORIGINS をそのオリジンに設定しないと、リクエストは拒否されます。

別のマシン上の MCP クライアント

クライアントの接続先を {AM_API_URL}/mcp に設定し、トークンを Authorization: Bearer <token> として送信します(artifactsmith token add で一度だけ表示される値です)。ヘッダーの値は Bearer で始まります。artifactsmith stdio は標準入力と標準出力でツールを一覧表示するだけで、リッスンしません。オブジェクトストアやモデルを使用できないため、ページを作成または公開することはできません。例:

URL:    http://192.0.2.10:8780/mcp
Header: Authorization: Bearer asmb_…

仕組み

エージェントは MCP 経由で ArtifactSmith とやり取りします。ユーザーのリクエストは verbatim_request として、調査内容は source_content または source_files として渡します。create は非公開のビルドを開始し、共有リンクは公開しません。スタイル付きのページを作成するには、Markdown を publish に渡すと自動的にスタイルが適用されます(Markdown を渡し、HTML を渡さない場合は format を省略してください。デフォルトではハウススタイルがページを開いたときに適用されます)。引き続き format=markdown を渡すこともできます。または、source_content を指定して create を呼び出してください。publish での生の HTML は、自分でデザインしたページ専用であり、指定どおりに表示されます。

サーバーは OpenAI 互換のエンドポイントを呼び出します(チェックに失敗した場合は最大 2 回試行します)。モデルがコンテンツを作成します。固定のレンダラーがそれを HTML、Markdown、PDF、DOCX、または XLSX に変換します。publish はモデルを介さず、同じチェックとレンダラーを実行します。status を呼び出すか、最大 90 秒間 wait を呼び出すと、非公開プレビューを取得できます。

share は、特定のバージョンに対する公開リンクを作成します。unshare を実行すると、そのリンクは 404 を返すようになります。トークンは 1 つのワークスペースに属し、権限セットを保持します。

ドキュメントでは、公開されている http(s) ソースをクリック可能なリンクとして引用できます。サーバーはスクリプトを除去し、プライベートリンクのホストや機密情報と思われるものを拒否します。また、ダウンロードしたファイルをオフラインで開けるように、画像、CSS、フォント、iframe を自己完結型にし、外部への通信を行わないようにします。サイズ制限が適用されます。このプロセスは、使用状況データをどこにも送信しません。

出力形式

形式create(..., format=)主ファイルレンダラー
HTMLhtml(デフォルト)index.htmlサニタイズしてから保存
Markdownmarkdowndocument.mdUTF-8 テキスト
PDFpdfdocument.pdfWeasyPrint(HTML/CSS から PDF へ)
DOCXdocxdocument.docxpython-docx
XLSXxlsxdocument.xlsxopenpyxl

HTML は視覚的なスタイル(デフォルトではハウススタイル)を使用し、完全なページを保存します。その他の形式ではモデルに Markdown を生成させ、レンダラーがそれを変換します。publish は完成した HTML または Markdown を受け付け、同じレンダラーを使用します。PDF、DOCX、XLSX でも content.md を保存するため、後から編集する際のテキストベースとして利用できます。

PDF の変換には WeasyPrint を使用し、Pango と Cairo が必要です。Docker イメージには Chromium は含まれていません。詳細は docs/formats.md を参照してください。

スタイル

HTML の場合、create と edit では任意の style を指定できます。選択肢は house、bold、editorial、playful、terminal、swiss です。デフォルトは AM_DEFAULT_STYLE(通常は house)です。Markdown、PDF、DOCX、XLSX では、モデルへのプロンプトにこのビジュアルスタイルは適用されません。公開された Markdown ページを開くと、記録されたスタイルで表示されます。最後に使ったスタイルを維持するには、edit で style を省略してください。

create では mode も指定できます。full(デフォルト、AM_BUILD_MODE)では、モデルが HTML を作成します。fast では、モデルが Markdown を作成し、サーバーがそのスタイルでレンダリングします。fast が適用されるのは、初回の HTML 作成のみです。編集やその他の形式では、通常のフルパスが使われます。AM_FAST_STYLES(デフォルトは空)には、mode を省略した場合に fast を使うスタイルを指定します。明示的に指定した mode が優先されます。ソースに完全な HTML ドキュメントが含まれている場合、またはその HTML をそのまま公開するよう求められた場合は、mode を省略すると full が使われます。「変更なし」という指示の近くで HTML に言及しても、この動作にはなりません。

  • house:今日の静かなページです。白を基調にアクセントカラーをひとつ、太字は一か所に使います。
  • bold:ダークネイビーからバイオレットへのヒーロー、巨大な白い見出し、鮮やかなカードとチップを使います。

bold HTML スタイルのデスクトップとスマートフォンのプレビュー。巨大な見出しの後に、色付きのステップカードが続くダークグラデーションのヒーロー

  • editorial:雑誌の特集記事のようなスタイルです。オフホワイトの紙、大きなセリフ体の見出し、細い罫線、深い赤のアクセントをひとつ使います。

editorial HTML スタイルのデスクトップとスマートフォンのプレビュー。大きなセリフ体の見出し、赤い罫線のリード文、2段組み

  • playful:クリーム色のページに、キャンディカラーの角丸カード、太いアウトライン、ずらした影を使います。

playful HTML スタイルのデスクトップとスマートフォンのプレビュー。コーラル色の角丸バナー、動く目のアクセント、ミント色のチャットカード

  • terminal:ダークモード、等幅フォント、ネオングリーンとシアンを使い、各セクションを偽のターミナルウィンドウとして表示します。

terminal HTML スタイルのデスクトップとスマートフォンのプレビュー。緑色のシェルプロンプト風の見出しと、タイトルバーに3つのドットがある暗色のウィンドウ

  • swiss:白いグリッド、巨大な黒のグロテスク体、数字と罫線のみにシグナルオレンジを使います。

swiss HTML スタイルのデスクトップとスマートフォンのプレビュー。巨大な黒い見出し、オレンジ色の罫線、大きなオレンジ色の数字

MCP ツール

ツール権限機能
createcreate非公開のビルドをキューに追加します。format、style、mode は任意です。共有リンクは作成しません。
publishpublishMarkdown を保存してスタイル付きページを作成するか、自分で作成した HTML を保存します。モデル呼び出しは行いません。
editedit最新の完了済みバージョンから新しいバージョンを作成します。古い base_version は受け付けません。
statusread完了、失敗、または入力待ちになるまで、状態を確認するか、wait(0~90秒)で待機します。
list_artifactsreadトークンのワークスペースのカタログです。
inspectreadマニフェスト、履歴、共有状態を表示します。include_content を指定すると、そのバージョンの保存済みテキストを返します。文字数は公開時の上限までです。
exportexportレンダリング済みファイルのダウンロードリンクを返します。有効期間は15分です。
shareshare指定したバージョンの公開リンクを作成します。
unshareshare公開リンクを直ちに無効にします。
revoke_previewsexport成果物の非公開 /p/ プレビューリンクを期限切れにします(バージョン指定は任意です)。
deletedelete2段階の削除です。最初の呼び出しで確認トークンが返されます。
create の引数

必須:

  • verbatim_request:ユーザーの正確な言葉です。これがスコープのすべてです。

次のうち少なくとも1つを指定してください。もう一方は自動入力されます。

  • display_name:カードやカタログに表示される人向けのタイトルです。slug が設定されている場合は不要です。省略すると、slug が初期値になります。上限:200文字。例:"Pilot store brief"。
  • slug:ワークスペース内で一意のURLキーです。display_name が設定されている場合は不要です。省略すると、タイトルから生成されます(小文字に変換し、アクセント記号を除去し、その他の文字をハイフンに置き換えます)。a-z、0-9、- の2~63文字で、先頭は英字または数字にする必要があります。例:"pilot-store-brief"。同じワークスペース内で重複するスラッグは拒否されます。edit を使用してください。

任意:

  • kind:初期値は web_static です(このリリースで使用できる唯一の種類です)。
  • format:html(初期値)、markdown、pdf、docx、または xlsx。
  • style:house(初期値)、bold、editorial、playful、terminal、または swiss。HTML のビルドで使用されます。Markdown ページを開くと、このスタイルで表示されます。PDF、DOCX、XLSX には適用されません。
  • mode:full(初期値)または fast。fast は最初のHTMLビルドです。Markdownを入力し、スタイル付きHTMLを出力します。
  • source_content / source_files:調査済みの事実を指定します。合計200 KBまでです。ビルダーはこれをデータとして扱います。
  • model、workspace、idempotency_key、capabilities。

実行例(タイトルのみ。スラッグは pilot-store-brief になります)。ソーステキストには、依頼で求められているすべての事実(「それが重要な理由」を含む)を裏付ける情報が必要です。

{
  "display_name": "Pilot store brief",
  "verbatim_request": "One page that states the pilot store code and why it matters.",
  "source_content": "The pilot store code is HARBOR-17. It matters because it is the single identifier used across inventory, support, and rollout reports for the pilot.",
  "format": "html"
}

依頼とソースに必要な事実が不足している場合、ジョブは needs_input で終了し、ファイルは保存されません。サーバーのチェックに失敗すると、モデルが2回目に呼び出されるため、ビルドの失敗が報告されるまでの時間は、問題なく完了した場合のおよそ2倍になります。編集では、まず変更箇所のパッチを要求します。パッチを適用できない場合、または同じチェックに失敗した場合は、同じジョブ内でファイル全体を再構築します。

publish arguments

すでに書いたテキストを、スタイル付きページにしたい場合は、Markdown を渡すと自動でスタイルが適用されます。Markdown を渡し、HTML を渡さない場合は、format を省略してください。format=markdown を渡すこともできます。style のデフォルトは house で、ページを開いたときに適用されます。保存されるファイルは Markdown のままです。新しいアーティファクトで HTML も渡した場合は、format を指定しない限り HTML がページになります。生の HTML は ArtifactSmith のスタイルを適用せず、指定どおりに表示されます。その HTML に CSS がほとんどないか、まったくない場合、結果には warning が含まれます。pdf、docx、xlsx の場合は format を渡してください。publish はモデルを呼び出しません。ページには、モデル出力と同じサイズ上限、シークレットスキャン、プライベートリンクのチェック、サニタイザー、レンダラー、最終チェックが適用されます。

新しいアーティファクト:display_name または slug と、ページを渡します。

  • html:完全な HTML ドキュメントです。format が html の場合は必須です。
  • markdown:完成した Markdown です。format が markdown、pdf、docx、xlsx の場合は必須です。format を省略し、本文がこれだけの場合は、形式は markdown になります。
  • もう一方のフィールドも渡すことができます。シークレットとプライベートリンクがチェックされますが、レンダリングされません。

新しいバージョン:artifact_id と base_version(最新の完了済みバージョン)、および新しいページを渡します。html または markdown のアーティファクトで format を省略した場合、HTML がなく Markdown があれば markdown、Markdown がなく HTML があれば html になります。両方のフィールドがある場合は、アーティファクトの形式が維持されます。pdf、docx、xlsx のアーティファクトでは、format を省略して新しいページが Markdown の場合も、その形式が維持されます。別の対応形式を選ぶには format を渡してください。このバージョンの完了時にカード名を変更するには、display_name を渡します。display_name を省略すると、変更されたページタイトル(HTML の <title> または最初の Markdown 見出し)がカードタイトルになります。アーティファクト ID と slug は変わりません。最新の共有ページでは、その名前が <title> と og:title に使用されます。古いバージョンはそれぞれの形式を維持します。共有された Markdown ページはスタイル付き HTML として開きます。この URL の ?raw=1 または document.md を指定すると、保存された Markdown がダウンロードされます。

summary と assumptions は任意のカードフィールドです(それぞれ最大 8000 文字)。モデル出力と同様にスキャンされます。要約または前提事項が長すぎる場合、呼び出し時に metadata exceeds N characters として拒否され、何も保存されません。note は任意です。Inspect では Published a finished page. の横に表示されます。メモが長すぎる場合、またはシークレット、プライベートリンク、許可リストのチェックに失敗した場合、バージョン行が作成される前に拒否されます。Markdown では style によって開いたページのスタイルが変わります(デフォルトは house)。HTML では style が記録されますが、送信されたページのスタイルは変更されません。PDF、DOCX、XLSX では HTML スタイルシートは使用されません。

artifact_id、version、job_id を返します。done または failed になるまで status を呼び出してください。ページが拒否された場合、状態は failed となり、error に失敗したチェックが示されます。ジョブが完了すると、status と inspect に、送信されたページに加えられた安全性に関する編集の一覧 safety_changes が含まれます。HTML の publish では、リンクになっていない URL をリンクに変換しません。publish は共有リンクを作成しません。トークンごとのビルドクォータにカウントされ、publish 権限が必要です。

export

権限:export。

引数:

  • artifact_id(必須):ダウンロードするアーティファクトを指定します。
  • version(任意):完了済みのバージョンを指定します。省略すると、最新の完了済みバージョンが使用されます。

download_url(有効期間は 15 分)、file、version、sha256、self_contained、expires_in("15m")を返します。

{ "artifact_id": "art_example", "version": 1 }
share

権限:share。

引数:

  • artifact_id(必須):公開するアーティファクトを指定します。
  • version(任意):完了済みの特定のバージョンを指定します。省略すると、最新の完了済みバージョンが使用されます。
  • ttl_days(任意):有効期間(日数)を指定します。デフォルトは AM_SHARE_TTL_DAYS です。AM_SHARE_TTL_DAYS が 0 の場合、ttl_days は無視され、リンクは取り消されるまで有効です。それ以外の場合、有効期間は AM_SHARE_TTL_MAX_DAYS を上限とします。

state("shared")、url、version、expires_at、lifetime、reused を返します。URL を知っている人は誰でも、そのバージョンを開くことができます。

{ "artifact_id": "art_example" }
unshare

権限:share。

引数:

  • artifact_id(必須):共有を取り消すアーティファクト。
  • version(任意):1つのバージョンの共有を取り消します。省略するか、0を指定すると、すべてのバージョンの共有を取り消します。

artifact_id、revoked_links(取り消されたリンクの数)、stateを返します。公開リンクがまだ有効な場合、stateは"shared"となり、urlとfollows("latest"または"pinned")も返します。公開リンクが残っていない場合に限り、"not_shared"となります。1つのピン留めを取り消しても、最新バージョンを追跡するリンクは有効なままです。取り消されたURLは直ちに404を返します。

{ "artifact_id": "art_example" }
delete

権限:delete。

引数:

  • artifact_id(必須):完全に削除するアーティファクト。
  • confirm_token(初回の呼び出しでは省略):初回の応答に含まれるトークン。有効期限は10分です。

初回の呼び出しでは何も削除されません。step("confirm")、confirm_token、title、versions、expires_in("10m")、警告を返します。2回目の呼び出しでは、保存されているすべてのバージョン、共有リンク、データベースの行を完全に削除します。deleted(true)、artifact_id、purged_object_versionsを返します。

{ "artifact_id": "art_example" }
{ "artifact_id": "art_example", "confirm_token": "paste-the-token" }

設定

各設定には、ファイルから値を読み込むNAME_FILE形式もあります。

変数デフォルト値用途
OPENAI_API_KEY / AM_LLM_KEYempty設定されたエンドポイント用のLLM認証情報です。
AM_LLM_APIchatchat(Chat Completions)または responses です。
AM_LLM_BASEhttps://api.openai.comOpenAI互換ホストのルートです。末尾の /v1 の有無は問いません。
AM_LLM_TEMPERATUREunsetChat Completionsのtemperatureです。未設定の場合は 0 を送信し、none の場合はフィールドを省略します。
AM_DEFAULT_MODELgpt-4o-miniLLMに送信するモデル名です。
AM_DEFAULT_STYLEhousecreate で style を省略した場合のHTMLビジュアルスタイルです。
AM_BUILD_MODEfullcreate で mode を省略した場合の full または fast です。fast は初回ビルドのHTMLにのみ適用されます。
AM_FAST_STYLESemptycreate で mode を省略した場合にデフォルトで fast にするスタイル(house、bold、…)をカンマ区切りで指定します。空の場合は、すべてのスタイルで AM_BUILD_MODE が適用されます。明示的に指定した mode が優先されます。完成済みのHTMLソース、またはそのHTMLをそのまま公開するリクエストでは、mode が省略されている場合も full が適用されます。「unchanged」の横にHTMLについて言及しているだけの場合は該当しません。それ以外の形式と編集では full が適用されます。不明な名前がある場合は起動時にエラーになります。
AM_SHARE_TTL_DAYS300 は取り消されるまで有効であることを意味します。
AM_SHARE_TTL_MAX_DAYS365正のTTLの上限です。
AM_SHARE_CREDITtrue共有HTMLページに目立たない「Made with ArtifactSmith」リンクを表示します。false にすると非表示になります。エクスポート、プレビュー、保存ファイルには含まれません。
AM_STORE_ENDPOINT(required)S3互換のオブジェクトストアです。
AM_STORE_BUCKETartifactsバケット名です。
AM_STORE_KEY / AM_STORE_SECRET(required)オブジェクトストアの認証情報です。
AM_BLOCK_PRIVATE_LINKStrue出力内のlocalhost、RFC1918、およびリンクローカルのホストを拒否します。
AM_ALLOWED_LINK_DOMAINSempty設定すると、残りのすべてのホストが一致する必要があります。
AM_MAX_OUTPUT_BYTES50 MiBレンダリング出力の上限です。
AM_RENDER_TIMEOUT120レンダラー呼び出し1回あたりの秒数です。
AM_BUILD_TIMEOUT900ジョブ全体の秒数です。
AM_EDIT_PATCH_TIMEOUT_S45編集パッチ呼び出しの秒数です。タイムアウトした場合は、全体を書き直します。
AM_MAX_BUILDS2同時実行ワーカー数です。ホスト型トライアルでは、これらのスロットのうち最大1つを使用します。
AM_BUILDS_PER_HOUR20内部トークンのトークンあたりのクォータです。トライアルトークンには AM_TRIAL_BUILDS_PER_HOUR が適用されます。
AM_TRIAL_ENABLEDfalseホスト型お試しページ(/try、旧 /trial)を公開し、ビルドを許可します。false にすると、どちらもすぐに閉じます。
AM_TRIAL_EMAIL_VERIFYtrueトークンを表示する前に、ワンタイムリンクをメールで送信します。false にすると、送信時にトークンを表示し、アドレスを未検証として記録します。
AM_TRIAL_BUILD_LIMIT201つのトライアルトークンで実行できる累計ビルド数です。
AM_TRIAL_FREE_NEEDS_INPUT5ホスト型トークンで、ビルドを使わない needs_input ジョブの数です。これを超えるとビルドを使用します。
AM_TRIAL_BUILDS_PER_HOUR10トライアルトークンの1時間あたりの上限です。AM_BUILDS_PER_HOUR は変更されません。
AM_TRIAL_DAILY_USD10UTC日ごとのトライアル利用額全体の上限です。内部トークンには上限がありません。
AM_TRIAL_PRICE_IN / AM_TRIAL_PRICE_OUT0.10 / 0.50入力/出力トークン100万個あたりのUSD単価です。予約額の計算に使用されます。
AM_TRIAL_MODELanthropic/claude-haiku-5-5すべてのトライアルビルドで使用するモデルです。呼び出し元のモデル名は無視されます。
AM_TRIAL_MAX_OUTPUT_TOKENS16000トライアルモデル呼び出しで指定する出力上限です。
AM_TRIAL_SIGNUPS_PER_IP / AM_TRIAL_SIGNUP_WINDOW_S3 / 864001ウィンドウあたりの、IPv4アドレスまたはIPv6 /48 ごとのサインアップ試行回数です。
AM_TRIAL_SIGNUPS_PER_DAY300UTC日ごとに発行するサインアップ数です。上限に達すると、/try に「本日のホスト型トークンはこれ以上発行できません。00:00 UTCに再開します」と表示されます。
AM_TRIAL_LINK_TTL_S1800マジックリンクの有効期間(秒)です。
AM_TRIAL_RETENTION_DAYS30最後のビルドからこの日数が経過したトライアルワークスペースを削除します。
AM_TRIAL_ABUSE_EMAILemptyトライアルページのフッターに表示するメールリンクです。空の場合はリンクを省略します。
AM_SMTP_HOST / AM_SMTP_PORT / AM_SMTP_FROMempty / 587 / emptyマジックリンクのメール送信に使用します。ホストまたは送信元が空の場合、送信は拒否されます。
AM_SMTP_USER / AM_SMTP_PASSWORDemptySMTPログイン情報です。パスワードには AM_SMTP_PASSWORD_FILE を指定できます。
AM_SMTP_TLStrueマジックリンクの送信時にTLSを開始します。
AM_HOST127.0.0.1artifactsmith serve のリッスンアドレスです。Compose/イメージではコンテナー内で 0.0.0.0 に設定されます。
AM_BIND_ADDRESS127.0.0.1compose.yaml のポート 8780 および 8781 をホストに公開する際のバインド先です。
AM_API_PORT / AM_PREVIEW_PORT8780 / 8781リッスンポートです。
AM_API_URL / AM_PREVIEW_URL / AM_SHARE_URLhttp://127.0.0.1:8780 / :8781カードやリンクに書き込むURLです。AM_SHARE_URL が空の場合は AM_PREVIEW_URL を使用します。API URLが https:// の場合、「マイページ」CookieにSecure属性が設定されます。
AM_COOKIE_SECUREAM_API_URL に従うtrue または false を指定すると、「マイページ」CookieのSecureフラグを強制的に設定できます。ローカルHTTPでは未設定のままにしてください。
AM_TRUSTED_PROXIESempty「マイページ」のログイン制限とトライアルのサインアップ制限において、X-Real-IP または X-Forwarded-For の設定を許可するIPまたはCIDRをカンマ区切りで指定します。空の場合、これらのヘッダーは無視されます。
AM_LOGIN_LIMIT / AM_LOGIN_PREFIX_LIMIT / AM_LOGIN_WINDOW_S8 / 8 / 900ウィンドウ(秒)内の、IPv4アドレスまたはIPv6 /64 ごと、およびハッシュ化されたトークンプレフィックスごとのサインイン失敗回数です。
AM_ALLOWED_HOSTS127.0.0.1:<api_port>,localhost:<api_port>MCPのDNSリバインディング保護(デフォルトで有効)に使用するHost値をカンマ区切りで指定します。
AM_ALLOWED_ORIGINSemptyMCPのDNSリバインディング保護に使用するOrigin値をカンマ区切りで指定します。
AM_DATA_DIR / AM_SECRETS_DIR/data / /secretsSQLiteとHMAC署名キーの保存先です。
ローカルファイル用に .env.example をコピーします。./scripts/ensure-local-env.sh が空の AM_STORE_KEY と AM_STORE_SECRET を補完します。ストレージイメージは rustfs/rustfs:1.0.1 です(compose.yaml ではダイジェストで固定されています)。

ホスト型お試しページの実行

AM_TRIAL_ENABLED=true を設定し、AM_API_URL を公開オリジンに指定します。AM_TRIAL_EMAIL_VERIFY を true のままにすると、/try は1回限りのリンクをメールで送信します(AM_SMTP_HOST と AM_SMTP_FROM が必要です。どちらかが空の場合、サインアップは安全側に倒して失敗します)。GET /trial は /try にリダイレクトします。オープン中のフォームや、すでに送信済みのリンクが引き続き機能するよう、POST /trial と /trial/verify はそのまま利用できます。Message-ID のドメインは AM_SMTP_FROM のドメインです。リンクを開いてもトークンは消費されません。「Show my token」ボタンを押すと、ワークスペースのトークンが一度だけ表示されます。AM_TRIAL_EMAIL_VERIFY=false を設定すると、送信時に同じページを表示し、メールは送信しません。この場合、サインアップ行には verified=0 が保存されます。どちらの場合も、このページには Claude Desktop(mcp-remote)、Claude Code(HTTP)、Cursor、および汎用 MCP クライアント向けの設定が含まれます。Desktop のスニペットでは、スペースが引数として扱われないよう、ベアラー値を AUTH_HEADER に設定します。Cursor では URL とヘッダーを使用し、コマンド引数はありません。各スニペットには YOUR_TOKEN と記載されています。このページには、Claude Desktop の「Customize → Connectors → Add custom connector」経由で、同じ公開 MCP URL と Authorization リクエストヘッダーを指定する方法も記載されています。ヘッダー値は Bearer で始まります。また、claude_desktop_config.json、.mcp.json、~/.cursor/mcp.json、その公開 MCP URL 用の claude mcp add コマンド、および source_content としてノートを渡すプロンプトの例も記載されています。このページには、AM_TRIAL_BUILD_LIMIT によるビルド上限が表示されます。AM_API_URL が公開 https オリジンの場合、同じページには {AM_API_URL}/try 用の Open Graph と Twitter カードが含まれます。画像は {AM_API_URL}/static/og-trial.png で、トークンは不要です。ループバックまたはプライベートの AM_API_URL の場合、これらのタグは省略されます。このページには引き続き noindex が設定されます。正規化されたアドレス1つにつき、トークンは1つ発行されます。Gmail アドレスではドットと +tags が無視されます。使い捨てドメインは拒否されます。同じ IPv6 ネットワークからのサインアップ試行は、/48 を共有します。マイページへのログインでは、引き続き /64 を使用します。UTC の1日あたりに発行されるトークンは、最大 AM_TRIAL_SIGNUPS_PER_DAY 個です(デフォルトは300個)。上限に達すると、/try には「本日のホスト型トークンはこれ以上発行できません。00:00 UTC に再開します」と表示されます。

ホスト型ビルドでは常に AM_TRIAL_MODEL が使用され、publish は呼び出せません。ホスト型トークンのツール一覧には publish が含まれません。レスポンスには builds_remaining が含まれます。トークンごとに、最大 AM_TRIAL_FREE_NEEDS_INPUT 件(デフォルトは5件)の needs_input ジョブではビルド数を消費しません。それ以降は消費されます。ジョブが失敗しても消費されます。日次の利用額上限では引き続き、そのジョブのモデル用トークンがカウントされ、時間ごとの上限ではその試行がカウントされます。アーティファクトを削除しても、ビルド数は戻りません。日次の利用額上限に達すると、エラーは the hosted copy hit today's limit, back at 00:00 UTC になります。トークンを使い切ると、GitHub リポジトリへのリンクが表示されます。ホスト型トークンの共有リンクは、最長30日間有効です。配信されるページには、すでに noindex が記載されていない robots メタタグがページにあっても noindex が追加され、リポジトリへのリンクを含むフッターも追加されます。ページでフッターが非表示になっている場合も、このフッターは表示されたままです。アイドル状態のホスト型ワークスペースは、AM_TRIAL_RETENTION_DAYS の期間が経過すると削除されます(デフォルトは30日です)。このクリーンアップは起動時に実行され、その後は1時間ごとに実行されます。

セキュリティ

トークンはワークスペースごとに発行され、SHA-256 ハッシュとして保存されます。アーティファクト ID を知っていても、アクセス権は付与されません。

権限は create、read、edit、publish、export、share、delete です。

ビルドは share を呼び出すまで非公開です。呼び出すと、最新の完了済みバージョンを参照する公開 /s/… URL が作成されます。特定のバージョンを固定した独自の URL を使うには、version または pin を渡します。unshare を実行すると、404 が返されるようになります。バージョンを指定して unshare を実行すると、その固定 URL だけが無効になります。共有 HTML ページには、GitHub リポジトリへのリンクを含む「Made with ArtifactSmith」という控えめなフッターが 1 行追加されます。この行を表示しない場合は、AM_SHARE_CREDIT=false を設定します。この行は保存されたファイル、プレビュー、エクスポートには書き込まれません。

プレビューと共有ページは独自のポートで実行され、Cookie を送信せず、CSP に script-src 'none' と sandbox allow-popups allow-popups-to-escape-sandbox allow-top-navigation-by-user-activation を設定します。

マイページ(API オリジン上の /app/)は、トークンのワークスペース内の読み取り専用カタログです。サインイン時は、フォームにトークンを貼り付けます。応答では、パス /app に対して HttpOnly、SameSite=Strict のセッション Cookie が設定され、トークンが URL に含まれることはありません。AM_API_URL が https の場合(または AM_COOKIE_SECURE=true の場合)、Cookie は Secure に設定されます。リクエストごとにトークンが再読み込みされるため、取り消すとセッションは直ちに無効になります。別のワークスペースのアーティファクト ID は 404 になります。一覧には一度に 50 ページが表示されます。時刻は、閲覧者が別の IANA タイムゾーンを設定していない限り America/New_York を使用し、ページにはそのタイムゾーンが表示されます。リバースプロキシの背後で運用する場合は、AM_TRUSTED_PROXIES にそのプロキシを設定してください。これにより、サインイン失敗がクライアント(X-Real-IP、または右端の X-Forwarded-For のホップ)とトークンプレフィックスのハッシュに対してカウントされます。IPv6 クライアントは /64 を共有します。各 IPv4 アドレスはそれぞれ独立したバケットになります。IPv4 マップ IPv6 アドレスも同様です。その他のピアからこれらのヘッダーを送信することはできません。プレビューオリジンでは /app/ は提供されません。

スクリプトは除去されます。グローバルホストへの公開 http(s) リンクは保持されます(HTML では rel="noopener noreferrer nofollow" と target="_blank" が付与されます)。ページ内の # アンカーはページ内にとどまります。ホストのチェックには urllib と WHATWG 方式の近似を使用します。受け入れられたリンクがプライベートホストに到達しないことは保証されますが、受け入れられたリンクすべてがブラウザーで有効であることは保証されません。プロトコル相対の //host 引用は、ホストが公開されている場合に限り https:// に変換されます。プライベートまたは危険な // の宛先は無効化され、変換されません。プライベート、ループバック、リンクローカルのホストがあるとビルドは失敗します。javascript:、vbscript:、data:、file: も同様です。リモート画像 URL は、すべての形式でその URL へのクリック可能なリンクになり、代替テキストがラベルとして使われます。開いたときに画像が読み込まれることはありません。CSS の url()、フォント、iframe はローカルにとどまります。シークレットがあるとビルドは失敗します。サイズと時間に上限が適用されます。

このプロセスは使用状況データを外部に送信しません。

詳細は docs/threat-model.md と SECURITY.md を参照してください。

トークン

ワークスペースは、アーティファクトの名前空間です(例:alpha または team-a)。各トークンは 1 つのワークスペースだけに属し、そのワークスペース内でのみアーティファクトを作成または読み取れます。別のワークスペースのアーティファクト ID を知っていても、アクセス権は付与されません。

artifactsmith token add --name NAME --workspace WS [--perms create,read,edit,publish,export,share,delete]
artifactsmith token list
artifactsmith token revoke --id ID | --name NAME
artifactsmith token perms --id ID | --name NAME
artifactsmith token perms --name NAME --add publish
artifactsmith token perms --name NAME --remove publish

token perms は既存のトークンの権限を 1 つ変更します。トークンの値は変わりません。追加または削除するたびに、監査ログに 1 行追加されます。権限を一覧表示しても、ログには追加されません。名前が一致するトークンが複数ある場合は、--id を渡します。

アンインストール/リセット

# Stop containers, delete compose volumes, and remove images created for this project
# (server, storage-init, and the rustfs/rustfs pull). Requires store keys in .env like other compose commands.
docker compose down --volumes --rmi all

最初からやり直すには、.env.example を再度コピーして、クイックスタートを再実行します。

開発

python3 -m venv .venv && source .venv/bin/activate
make install
make ci          # lint, types, unit tests, denylist
テストの実行

make test は、CI で使用されるものと同じ pytest コマンドでユニットテストを実行します。Docker は起動しません。

エンドツーエンドテストでは compose.test.yaml を使用します。このファイルは、tests/support/ にある偽のチャットモデルを追加します。

./scripts/ensure-local-env.sh
docker compose -f compose.yaml -f compose.test.yaml up -d --build
python -m tests.e2e.test_end_to_end
python -m tests.e2e.test_formats
python -m tests.e2e.test_bind_address   # AM_BIND_ADDRESS=0.0.0.0 via non-loopback IP

make smoke は、同じスタックとスクリプトを実行します。Compose コマンドでは、compose.yaml で必要とされるため、AM_STORE_KEY と AM_STORE_SECRET を設定した .env が必要です(docker compose down の実行時も同様です)。

docs/architecture.md、docs/operations.md、CONTRIBUTING.md。

どのように構築されたか

Artifactsmith は、バイブコーディングで開発されました。人間が方向性を定めて判断を下し、AI エージェントがコードを作成し、チェックしました。

  • Grok Bot がプロジェクトを運営しました。作業を計画し、すべてのプルリクエストをファイルごとにレビューし、マージ前に修正が必要な点を判断しました。
  • Cursor のクラウドエージェントがコード、テスト、ドキュメントを作成し、レビューで指摘された箇所を修正しました。
  • Hermes のエージェントが独立したチェックを行いました。1 体はシニアエンジニアとしてコードをレビューし、各ラウンドを承認しました。もう 1 体は新規ユーザーと同じように、この README だけを見ながら一からインストールしました。

リリース前に、以下の確認を行いました。

  • ブロッカーとなる問題がなくなるまで、行ごとのコードレビューを複数回実施しました。
  • Semgrep、Bandit、gitleaks、pip-audit、Trivy を使用した独立したセキュリティ監査を行い、脅威モデルも文書化しました。
  • HTML クリーナー、リンク処理、エクスポート形式に対して、実際に攻撃テストを行いました。
  • 5 つすべての形式で、稼働中のモデルを使って実際にビルドし、リンクがクリック可能なままであることと、ドキュメントを開いたときに外部から何も読み込まれないことを確認しました。
  • 別のマシンにクリーンインストールし、ローカルネットワーク上のほかのマシンへの提供も確認しました。
  • 変更のたびに、リント、厳格な型チェック、Python 3.11 と 3.12 でのユニットテスト、Docker ビルド、依存関係スキャン、シークレットスキャンを自動で実施しました。

監査レポートは docs/security-audit-2026-10-09.md にあります。見落としを見つけた場合は、SECURITY.md をご覧ください。

ライセンス

MIT。ハウススタイルの文章ルールとビジュアルルールは、Humanizer(MIT)および Anthropic frontend-design(Apache-2.0)を参考にしています。クレジット表記は NOTICE にあり、サードパーティのライセンステキストは licenses/ にあります。Docker イメージには、これらのファイルが /app に含まれています。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。