Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
AM_HOSTNoListen address for `artifactsmith serve`. Compose/image set `0.0.0.0` in-container.127.0.0.1
AM_API_URLNoURL written into cards and links.http://127.0.0.1:8780
AM_LLM_APINo`chat` (Chat Completions) or `responses`.chat
AM_LLM_KEYNoLLM credential for the configured endpoint (alternative to OPENAI_API_KEY).
AM_API_PORTNoAPI listen port.8780
AM_DATA_DIRNoSQLite and the HMAC signing key./data
AM_LLM_BASENoOpenAI-compatible host root. With or without a trailing `/v1`.https://api.openai.com
AM_SHARE_URLNoURL written into cards and links. Empty `AM_SHARE_URL` uses `AM_PREVIEW_URL`. An `https://` API URL marks the My pages cookie Secure.
AM_STORE_KEYYesObject-store credentials.
AM_BUILD_MODENo`full` or `fast` when `create` omits `mode`. `fast` is first-build HTML only.full
AM_MAX_BUILDSNoConcurrent workers.2
AM_FAST_STYLESNoComma-separated styles (`house`, `bold`, …) that default to `fast` when `create` omits `mode`. Empty keeps `AM_BUILD_MODE` for every style. An explicit `mode` still wins. A finished HTML source, or a request to publish that HTML as-is, stays `full` when `mode` is omitted. Mentioning HTML beside "unchanged" does not. Other formats and edits stay `full`. An unknown name fails at startup.
AM_LOGIN_LIMITNoFailed sign-ins per IPv4 address or IPv6 `/64` inside the window (seconds).8
AM_PREVIEW_URLNoURL written into cards and links.http://127.0.0.1:8781
AM_SECRETS_DIRNoSQLite and the HMAC signing key./secrets
OPENAI_API_KEYNoLLM credential for the configured endpoint.
AM_BIND_ADDRESSNoHost publish bind for ports `8780` and `8781` in `compose.yaml`.127.0.0.1
AM_PREVIEW_PORTNoPreview/share listen port.8781
AM_STORE_BUCKETNoBucket name.artifacts
AM_STORE_SECRETYesObject-store credentials.
AM_ALLOWED_HOSTSNoComma-separated Host values for MCP DNS-rebinding protection (on by default).127.0.0.1:<api_port>,localhost:<api_port>
AM_BUILD_TIMEOUTNoSeconds for the whole job.900
AM_COOKIE_SECURENo`true` or `false` forces the My pages cookie Secure flag. Leave it unset on local HTTP. Default follows `AM_API_URL`.
AM_DEFAULT_MODELNoModel name sent to the LLM.gpt-4o-mini
AM_DEFAULT_STYLENoHTML visual style when `create` omits `style`.house
AM_LOGIN_WINDOW_SNoWindow in seconds for login limits.900
AM_RENDER_TIMEOUTNoSeconds for one renderer call.120
AM_SHARE_TTL_DAYSNo`0` means until revoked.30
AM_STORE_ENDPOINTYesS3-compatible object store.
AM_ALLOWED_ORIGINSNoComma-separated Origin values for MCP DNS-rebinding protection.
AM_BUILDS_PER_HOURNoPer-token quota.20
AM_LLM_TEMPERATURENoChat Completions temperature. Unset sends `0`; `none` omits the field.
AM_TRUSTED_PROXIESNoComma-separated IPs or CIDRs that may set `X-Real-IP` or `X-Forwarded-For` for My pages login limits. Empty ignores those headers.
AM_MAX_OUTPUT_BYTESNoRendered output cap.50 MiB
AM_LOGIN_PREFIX_LIMITNoFailed sign-ins per hashed token prefix inside the window (seconds).8
AM_SHARE_TTL_MAX_DAYSNoCap on positive TTLs.365
AM_BLOCK_PRIVATE_LINKSNoReject localhost, RFC1918, and link-local hosts in output.true
AM_ALLOWED_LINK_DOMAINSNoIf set, every remaining host must match.
AM_EDIT_PATCH_TIMEOUT_SNoSeconds for the edit patch call. A timeout falls back to a full rewrite.45

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
createA

Queue a new artifact. Returns artifact_id, version, and job_id immediately. Then call status(job_id, wait=90).

Want a styled page from text you already wrote? Publish that Markdown. It is styled automatically
when format is omitted and no html is passed (format=markdown; style defaults to house).
Want the server to write the page? Pass source_content here.
Raw HTML in publish is shown exactly as given, with no ArtifactSmith styling.

Required: verbatim_request (the user's exact words; the whole scope).

display_name is the human title on cards (optional if slug is set; defaults to the slug;
at most 200 characters; example "Pilot store brief"). slug is the workspace URL key
(optional if display_name is set; otherwise derived from the title; 2-63 chars of a-z, 0-9,
and hyphen, starting with a letter or digit; example "pilot-store-brief"). Provide at least one.
kind defaults to web_static (the only kind in this release).

format is html (default), markdown, pdf, docx, or xlsx. The model writes content. A fixed renderer
writes the bytes. html uses the visual style (house, bold, editorial, playful, terminal, swiss;
default AM_DEFAULT_STYLE, usually house). On markdown, pdf, docx, and xlsx the model prompt does
not use that visual style. A markdown page is still shown in the recorded style when it is opened.

mode is fast or full (default AM_BUILD_MODE, usually full). When mode is omitted and the
style is listed in AM_FAST_STYLES, the default is fast instead. fast applies to a first HTML
build: the model writes Markdown and the server renders it. full is the HTML build.
Other formats ignore fast. An explicit mode still wins. A complete HTML source, or a request
to publish that HTML as-is, stays full when mode is omitted. Mentioning HTML beside "unchanged" does not.

source_content (optional, up to 200 KB total with source_files) is researched material the page
is built from. The builder uses only the request plus this material for facts.

source_files (optional) is a list of {name, content} objects under the same 200 KB cap.

If a needed fact is missing, the job ends as needs_input with a short missing message and stores
no file. Call create again with the same slug after you supply the data.

create does not create a share link. When checks fail, the server retries the model once, so a
failed build takes about twice as long to report as a clean one.
editA

Build a new version from base_version (the latest done version) using the user's exact change request. Returns a conflict if base_version is stale. Inspect, then edit from the latest.

source_content and source_files (optional, 200 KB total) replace the base version's source.
If omitted, the base version's source is reused.

style (optional) is house, bold, editorial, playful, terminal, or swiss. Omit it to keep the
style the artifact was last built with. It applies to HTML only; other formats accept it and
ignore it.

format (optional) is html, markdown, pdf, docx, or xlsx. Omit it to keep the artifact's current
format. A different format builds this version in that format. When the version is done, the
artifact's format updates. The artifact id and slug stay the same. Older versions keep the format
they were built with.

display_name (optional) is the card title. When this version finishes, that name replaces the
artifact's display_name. Omit it and a changed page title (the HTML title, or the first Markdown
heading) becomes the card title instead. The slug stays the same.

Ends as needs_input with a missing message if the change needs facts that were not supplied.
publishA

Store a page you have already finished. Use this when you already have the finished page. No model call. Returns artifact_id, version, and job_id immediately. Then call status(job_id, wait=90). When the job is done, status and inspect list safety_changes for each safety edit that changed the page. HTML publish does not turn bare URLs into links. The document title is stored as given and escaped in the page. note is optional. Inspect shows a non-empty note beside "Published a finished page." It is not the text a later edit sends to the model. A secret, private link, or over-long note is rejected before a row exists.

Want a styled page? Pass Markdown and it is styled automatically. Omit format when you pass
markdown and no html. style is house, bold, editorial, playful, terminal, or swiss (default house)
and is applied when the page is opened. The stored file stays Markdown. You can still pass
format=markdown. On a new artifact, if you also pass html, html is the page unless you set format.
Raw HTML is shown
exactly as given, with no ArtifactSmith styling. If that HTML has little or no CSS, the result
includes warning. Pass format for pdf, docx, or xlsx.

html is the complete HTML document when format is html. markdown is the finished Markdown when
format is markdown, pdf, docx, or xlsx. You may pass the other field as well: it is checked for
secrets and private links and is not rendered. PDF, DOCX, and XLSX do not use the HTML style sheet.

New artifact: pass display_name or slug (same rules as create). New version of an existing artifact:
pass artifact_id and base_version (the latest done version). Omit format on an html or markdown
artifact and markdown with no html is markdown; html with no markdown is html; both fields keep
the artifact's format. A pdf, docx, or xlsx artifact keeps that format when format is omitted and
the new page is markdown. Pass format to choose html, markdown, pdf, docx, or xlsx. Pass display_name
to rename the card when this version finishes. Omit display_name and a changed page title (the HTML
title, or the first Markdown heading) becomes the card title. The artifact id and slug stay the same.
Older versions keep the format they were published with.

The page runs the same safety pipeline as model output: size caps, secret scan, private-link checks,
the sanitizer, the renderer for format (including PDF, DOCX, and XLSX), and the final sweep. A rejected
page ends as failed, and error names the check that failed. publish does not create a share link.
It counts toward the per-token build quota and requires the publish permission.

summary and assumptions are optional card fields. Each is rejected when the call arrives if it is
longer than the metadata cap (the same 'metadata exceeds N characters' error the job would report).
They are also scanned like model output. On markdown, style changes the opened page. On HTML, style
is recorded and the submitted page is not restyled.
statusB

Build state (queued, building, done, failed, or needs_input). needs_input includes a missing message. Also returns progress and the presentation card. wait (0 to 90 seconds) holds the call open until the build finishes.

list_artifactsA

Catalog of artifacts in your workspace, newest first. Optional kind filter and text query on slug or title.

inspectA

Manifest, files, build log, request history, and share state. Defaults to the latest done version.

include_content is optional and defaults to false. When true, the target done version adds
content with file, size_bytes, and text when that text is within the publish character cap.
PDF, DOCX, and XLSX return content.md and set primary_binary; they do not return the binary.
Over the cap, size_bytes is set and text is omitted. A store failure sets content_error to
store_read_failed. The call still requires read permission on this workspace.
exportA

Download link for one rendered file (html, md, pdf, docx, or xlsx).

Permission: export.
Arguments: artifact_id (required), version (optional; latest done version).
Returns: download_url (valid 15 minutes), file, version, sha256, self_contained, expires_in.
Example: export(artifact_id="art_example", version=1)
shareA

Publish a public link. Anyone with the link can open it.

Permission: share.
Arguments: artifact_id (required), version (optional; passing it pins that version), ttl_days (optional; ignored when AM_SHARE_TTL_DAYS is 0), pin (optional).
Returns: state, url, version, follows ("latest" or "pinned"), expires_at, lifetime, reused.
Omit version to keep serving the latest done version on the same URL.
Example: share(artifact_id="art_example")
unshare revokes it immediately.
unshareA

Revoke public share links. Takes effect immediately; the old URL returns 404.

Permission: share.
Arguments: artifact_id (required), version (optional). A version revokes only pinned links for that version. Omit it, or pass 0, to revoke every public link, including the one that follows the latest version.
Returns: artifact_id, revoked_links (count), and state. state is "shared" when a public link is still live (with url and follows), and "not_shared" only when none is.
Example: unshare(artifact_id="art_example")
revoke_previewsA

Expire private /p/ preview links for an artifact (or one version). Token revocation and signing-key rotation do not expire these database-backed capabilities; call this explicitly.

deleteA

Two-step purge of an artifact. Warn the user before the second call.

Permission: delete.
Arguments: artifact_id (required), confirm_token (optional until the second call).
Returns: first call is step "confirm" with confirm_token, title, versions, expires_in "10m", and a warning.
Second call returns deleted true, artifact_id, and purged_object_versions.
Example: delete(artifact_id="art_example") then delete(artifact_id="art_example", confirm_token="...")

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.9/5.0

Scored across 11 tools

Disambiguation4/5

The three authoring tools are clearly separated by who writes the content (create = model builds, publish = you supply finished page, edit = new version from base_version), and status vs inspect vs list_artifacts have distinct roles. Minor overlap remains between create/publish (both accept format/style/html and queue jobs) and between unshare/revoke_previews (both revoke link types), but descriptions disambiguate them.

Naming Consistency4/5

Mostly clean lowercase verbs (create, edit, publish, inspect, export, share, unshare, delete) with a couple of verb_noun names (list_artifacts, revoke_previews) and one noun (status). The pattern is readable and predictable despite the minor mix of single-verb and verb_noun forms.

Tool Count5/5

Eleven tools is well-scoped for an artifact lifecycle server. Every tool maps to a distinct stage (create/edit/publish/status/list/inspect/export/share/unshare/revoke_previews/delete) with no redundant entries.

Completeness5/5

Full lifecycle coverage: creation (create/publish), versioning (edit), monitoring (status), discovery (list_artifacts), inspection (inspect), distribution (export/share), revocation (unshare/revoke_previews), and cleanup (delete). No obvious dead ends for the stated artifact-hosting purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues