vitrine
Shareable links for what your AI agent makes. vitrine is a small, self-hosted MCP server. Your agent publishes an HTML report, a chart, a PDF or a folder of files, and gets back a link that opens in any browser.
- Private by default. Links are signed, expire and can be revoked. An artifact becomes public only after you approve it.
- One link per artifact. When the agent revises it, the link stays the same.
- Any MCP client. Claude Code, Hermes Agent, or anything that speaks MCP over HTTP.
- Easy to run. One process, one port, one folder of files. No database.
Install
With uv (it fetches Python 3.15 for you):
uvx mcp-vitrine --version # run without installing
uv tool install mcp-vitrine # or install the `mcp-vitrine` command
Or with Docker. stable is the newest release; for a deployment, pin a version from the
releases instead:
docker pull ghcr.io/edgar971/vitrine:stable
Run it
vitrine needs a secret, to sign links, and one token per client:
export VITRINE_SECRET="$(uvx mcp-vitrine secret new)"
uvx mcp-vitrine token new claude
# token: 3AVjpX77… ← give this to the client
# entry: claude:65b2dd…:read+write+share+publish
export VITRINE_TOKENS="claude:65b2dd…:read+write+share+publish" # the entry it printed
uvx mcp-vitrine serve # http://localhost:8080, data in ./data
With Docker, the same commands run inside the image:
docker run --rm ghcr.io/edgar971/vitrine:stable secret new
docker run --rm ghcr.io/edgar971/vitrine:stable token new claude
docker run -d --name vitrine -p 127.0.0.1:8080:8080 -v vitrine-data:/data \
-e VITRINE_SECRET=<secret> -e VITRINE_TOKENS=<entry> \
ghcr.io/edgar971/vitrine:stable
Check that it works, using the token that token new printed:
export VITRINE_TOKEN=<token>
echo '<h1>hello</h1>' > index.html
curl -s -H "Authorization: Bearer $VITRINE_TOKEN" -F title=Hello -F file=@index.html \
localhost:8080/api/artifacts
# {"id": "…", "url": "http://localhost:8080/s/…/", …}
Open the url: a private, expiring link to your page.
Connect your agent
vitrine serves MCP at /mcp, authenticated with a bearer token.
Claude Code
claude mcp add --transport http vitrine http://localhost:8080/mcp \
--header "Authorization: Bearer $VITRINE_TOKEN"
Any other MCP client that supports remote servers with headers:
{
"mcpServers": {
"vitrine": {
"url": "http://localhost:8080/mcp",
"headers": { "Authorization": "Bearer <token>" }
}
}
}
Hermes Agent connects the same way, and an optional plugin publishes files from disk: see integrations/hermes.
Give each client its own token, so you can revoke one without the others. Grant only the scopes it
needs: token new ci --scopes read,write cannot share links or make anything public.
Use it
Ask your agent for something you would open in a browser:
Build an HTML report of last month's energy use and share it with me.
Update the report with this week's numbers. (same link, new version)
Make that report public. (you are asked to approve first)
What the agent can do:
| Tool | Scope | Does |
|---|---|---|
artifact_create |
write |
Publish text files (HTML, Markdown, CSV, SVG, …) and get a private link |
artifact_update |
write |
Add a version behind the same link |
artifact_upload_url |
write |
A single-use upload URL for binaries and large files |
artifact_delete |
write |
Remove an artifact and every link to it |
artifact_get / artifact_list |
read |
Read an artifact back, or find earlier ones |
artifact_link |
share |
A fresh private link, with its own expiry |
artifact_revoke_links |
share |
Revoke every private link issued so far |
artifact_set_visibility |
publish |
Make an artifact public, after you approve |
Approval goes through your MCP client's confirmation prompt. If the client cannot ask, or you decline or don't answer, the artifact stays private.
Beyond localhost
Set VITRINE_PUBLIC_BASE_URL to the address people will open, for example
https://vitrine.example.com, and put vitrine behind TLS. Ready-made setups are in
examples: Compose with Caddy, and
Kubernetes. Backups, upgrades and monitoring are in
operations, and every setting is
in the configuration reference.
Learn more
- Documentation: how it works, the spec, the security model, and how to contribute.
- Changelog
- Found a vulnerability? Follow SECURITY.md rather than opening an issue.
MIT licensed.
Metadata
Release files for mcp-vitrine 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mcp_vitrine-0.1.0.tar.gz | 76.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mcp_vitrine-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 170.7 kB
Release files / mcp_vitrine-0.1.0.tar.gz
| Download URL | mcp_vitrine-0.1.0.tar.gz |
|---|---|
| Size | 76.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4b2d724545aef71e8c13ecaa37de7980a5dc4e738300a6f2d09261bd0d99dbd2
|
|
BLAKE2b-256 checksum How to use checksums |
44b1723704f14b8f9323daf09351a5068628293d715f34c71215977115ca0630
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / mcp_vitrine-0.1.0-py3-none-any.whl
| Download URL | mcp_vitrine-0.1.0-py3-none-any.whl |
|---|---|
| Size | 94.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7353f45d0f2d60e8e8b32fdd5d849dd078e752b5067b670431b44e11f0fd3bb8
|
|
BLAKE2b-256 checksum How to use checksums |
052d5475ea60d50b0f30a3960ff18d9ab7555ddb363f9e182d6c8981813c6f52
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|