Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.de.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,14 @@
<a href="https://hub.docker.com/r/helpcodeai/anythingmcp"><img src="https://img.shields.io/docker/pulls/helpcodeai/anythingmcp?logo=docker&logoColor=white&color=2563eb&labelColor=0b1220" alt="Docker pulls"></a>
</p>

**Claude beantwortet eine Frage, die zuvor kein Chatbot beantworten konnte**, weil die Daten in einem Außendienstsystem liegen, das REST statt MCP spricht:
**Eine Frage in Claude, beantwortet aus Etsy, SAP und einer Logistik-API.** AnythingMCP bindet den Shop aus dem Marktplatz an, SAP S/4HANA über OData und eine REST-API über ihre OpenAPI-Spezifikation. Danach arbeitet Claude mit allen drei Systemen:

<p align="center">
<img src="docs/assets/demo-claude.gif" alt="AnythingMCP in Claude: Auf die Frage, welche Firmen ein Techniker letzte Woche besucht hat, ruft Claude MCP-Tools auf, die AnythingMCP aus der REST-API eines Außendienstsystems erzeugt hat." width="100%" />
<a href="https://anythingmcp.com/video-promo"><img src="docs/assets/demo-lumen-clay.gif" alt="AnythingMCP-Demo: Etsy aus dem Marktplatz installiert, SAP S/4HANA als OData-Connector angelegt, eine Logistik-API aus ihrer OpenAPI-Spezifikation importiert. Danach beantwortet Claude, welche Etsy-Bestellungen hängen und ob SAP genug Bestand für einen Ersatzversand hat" width="100%" /></a>
</p>

<p align="center"><a href="https://anythingmcp.com/video-promo">▶ Die ganze Demo ansehen (2:40, mit Ton)</a></p>

**Selbst ausprobieren** — drei Zeilen, ohne das Repository zu klonen, [Details weiter unten](#run-it-yourself):

```bash
Expand Down
6 changes: 4 additions & 2 deletions README.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,14 @@
<a href="https://hub.docker.com/r/helpcodeai/anythingmcp"><img src="https://img.shields.io/docker/pulls/helpcodeai/anythingmcp?logo=docker&logoColor=white&color=2563eb&labelColor=0b1220" alt="Docker pulls"></a>
</p>

**これまでチャットボットでは答えられなかった質問に、Claude が回答します。** 必要なデータが、MCP ではなく REST を使うフィールドサービスシステムに保存されている場合でも対応できます。
**Claude への 1 つの質問に、Etsy、SAP、物流 API のデータで回答します。** AnythingMCP はマーケットプレイスから Etsy を、OData で SAP S/4HANA を、OpenAPI 仕様から REST API を接続し、Claude は 3 つのシステムをまたいで作業します。

<p align="center">
<img src="docs/assets/demo-claude.gif" alt="Claude で動く AnythingMCP:技術者が先週訪問した会社を尋ねられた Claude が、フィールドサービスの REST API から AnythingMCP が生成した MCP ツールを呼び出している様子。" width="100%" />
<a href="https://anythingmcp.com/video-promo"><img src="docs/assets/demo-lumen-clay.gif" alt="AnythingMCP のデモ:マーケットプレイスから Etsy をインストールし、SAP S/4HANA を OData コネクタとして追加し、物流 API を OpenAPI 仕様から取り込んだ後、Claude が配送で止まっている Etsy の注文と、SAP に再送用の在庫があるかを答える様子。" width="100%" /></a>
</p>

<p align="center"><a href="https://anythingmcp.com/video-promo">▶ デモ全編を見る(2:40、音声付き)</a></p>

**自分で動かす** — 3 行のコマンドで、リポジトリのクローンは不要です。[詳しい手順はこちら](#run-it-yourself)。

```bash
Expand Down
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,14 @@
<a href="#the-adapter-catalog"><img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2FHelpCode-ai%2Fanythingmcp%2Fbadges%2Fkeyless.json" alt="Adapters that need no API key"></a>
</p>

**Claude answering a question no chatbot could answer**, because the data lives in a field-service system that speaks REST, not MCP:
**One question in Claude, answered from Etsy, SAP and a logistics API.** AnythingMCP connects the shop from the marketplace, SAP S/4HANA over OData and a REST API from its OpenAPI spec, then Claude works across all three:

<p align="center">
<img src="docs/assets/demo-claude.gif" alt="AnythingMCP in Claude: asked which companies a technician visited last week, Claude calls MCP tools that AnythingMCP generated from a field-service REST API" width="100%" />
<a href="https://anythingmcp.com/video-promo"><img src="docs/assets/demo-lumen-clay.gif" alt="AnythingMCP demo: Etsy installed from the marketplace, SAP S/4HANA added as an OData connector, a logistics API imported from its OpenAPI spec, then Claude answers which Etsy orders are stuck and whether SAP has stock to resend them" width="100%" /></a>
</p>

<p align="center"><a href="https://anythingmcp.com/video-promo">▶ Watch the full demo (2:40, with sound)</a></p>

**Run it yourself** — three lines, no clone, [details below](#run-it-yourself):

```bash
Expand Down
6 changes: 4 additions & 2 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,14 @@
<a href="https://hub.docker.com/r/helpcodeai/anythingmcp"><img src="https://img.shields.io/docker/pulls/helpcodeai/anythingmcp?logo=docker&logoColor=white&color=2563eb&labelColor=0b1220" alt="Docker pulls"></a>
</p>

**Claude 回答了一个此前聊天机器人无法回答的问题**,因为相关数据位于使用 REST 而非 MCP 的现场服务系统中:
**在 Claude 中提一个问题,答案来自 Etsy、SAP 和一个物流 API。** AnythingMCP 从市场接入 Etsy,通过 OData 接入 SAP S/4HANA,并根据 OpenAPI 规范导入 REST API,随后 Claude 即可跨三个系统工作:

<p align="center">
<img src="docs/assets/demo-claude.gif" alt="AnythingMCP 在 Claude 中的效果:被问到某位技术人员上周走访了哪些公司时,Claude 调用 AnythingMCP 根据现场服务 REST API 生成的 MCP 工具。" width="100%" />
<a href="https://anythingmcp.com/video-promo"><img src="docs/assets/demo-lumen-clay.gif" alt="AnythingMCP 演示:从市场安装 Etsy,将 SAP S/4HANA 添加为 OData 连接器,根据 OpenAPI 规范导入物流 API,然后 Claude 回答哪些 Etsy 订单卡在运输中,以及 SAP 是否有库存可以补发。" width="100%" /></a>
</p>

<p align="center"><a href="https://anythingmcp.com/video-promo">▶ 观看完整演示(2:40,有声音)</a></p>

**自己运行试试** — 三行命令,无需克隆仓库,[详细说明见下文](#run-it-yourself):

```bash
Expand Down
Binary file removed docs/assets/demo-claude.gif
Binary file not shown.
Binary file added docs/assets/demo-lumen-clay.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 20 additions & 0 deletions video/demo/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
footage/
renders/
node_modules/
.wrangler/
director/native/humanio
*.recordly
director/mock-backend/*.snapshot.json
dist/
compositions/.media/
compositions/.motion/
compositions/snapshots/
compositions/assets/footage/
styleframes/handoff/
styleframes/attach/
styleframes/renders/
.DS_Store
compositions/.hyperframes/
compositions/.thumbnails/
__pycache__/
compositions/.waveform-cache/
122 changes: 122 additions & 0 deletions video/demo/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
# AnythingMCP demo video ("Lumen & Clay")

Source of the product demo on anythingmcp.com/video-promo and in the README (2:40, English).
No voice-over: on-screen type, captions, music, and screen recordings of the product and of Claude.

The story: *Lumen & Clay*, a fictional ceramics studio, sells on Etsy, runs SAP S/4HANA and
has its own logistics API. The video connects all three through AnythingMCP (a marketplace
adapter, a custom OData connector, an OpenAPI import) and ends with Claude answering a
question that spans them. **All data is fictional**: nothing here touches a real shop, SAP
system or customer.

```
fixtures/ the one source of the Lumen & Clay data (products, orders, SAP, logistics)
mock-api/ mock backend (Etsy v3, SAP Gateway OData V2, logistics API): Worker-style handler, run on Node
director/ drives the recordings: real-cursor input helper, mock backend, scene scripts
styleframes/ Claude Design brief (the exported styleframes stay local)
compositions/ HyperFrames project: build.py generates index.html from the cut list
export-web.py web and README files derived from the final render
footage/ raw Recordly exports (git-ignored; compositions/assets/footage/ too)
renders/ final renders and web files (git-ignored)
```

## 1. Mock backend

```bash
cd mock-api
npm install
npm run dev # local, http://localhost:8787 (wrangler)
npm run build:node # dist/server.mjs, the same handler on plain Node
```

On AnythingMCP Cloud it runs as an internal container next to the backend, with no
public port. The backend reaches it by a dotted network alias (connector base URLs must
contain a dot), which is on the instance SSRF allowlist:

```bash
scp dist/server.mjs root@<droplet>:/opt/lumen-demo-api/server.mjs
docker run -d --name lumen-demo-api --network amcp-cloud_default \
--network-alias demo-api.lumenandclay.internal --restart unless-stopped --memory 128m \
-v /opt/lumen-demo-api/server.mjs:/app/server.mjs:ro -e PORT=8787 node:22-alpine node /app/server.mjs
# site_settings.ssrf_allowed_hosts must contain "demo-api.lumenandclay.internal"
```

Endpoints:

| Path | What |
|---|---|
| `/etsy/v3/application/...` | the nine endpoints of the Etsy adapter |
| `/sap/opu/odata/IWFND/CATALOGSERVICE;v=2/ServiceCollection` | SAP service catalog (42 services) |
| `/sap/opu/odata/sap/ZLC_STOCK_OVERVIEW_SRV` | stock by plant with safety stock (the one the demo queries) |
| `/sap/opu/odata/sap/API_PRODUCT_SRV`, `API_SALES_ORDER_SRV` | products, sales orders |
| `/logistics/openapi.json` | OpenAPI 3.1 of the logistics API (12 operations) |
| `/logistics/v1/...` | the logistics API |

Dates are relative to the day of the request, so "last 30 days" and "this week" hold
whenever the video is recorded.

## 2. Cloud connectors used by Claude

`mock-api/cloud-setup.cjs` creates, through the backend's own API, one MCP server
**"Lumen & Clay Demo"** with only these connectors (`--reset` replaces a previous run):

| Connector | Type | Base URL | Notes |
|---|---|---|---|
| Etsy | the Etsy marketplace adapter, re-pointed | `<mock>/etsy/v3/application` | auth switched to none |
| SAP S/4HANA | OData, SAP Gateway on, client 100, tool prefix `s4` | `<mock>` | Basic auth, any credentials |
| Lumen Logistics API | REST from OpenAPI | spec `<mock>/logistics/openapi.json` | API key, any value |

The server instructions tell Claude where things are (shop id, the stock service, the
order_ref convention), so answers need fewer calls on camera.

## 3. Recording

The web-app scenes run against the real frontend with a local mock backend (so no real
workspace, connector or email is ever on screen); the Claude scenes run in claude.ai.
Both are driven by `director/`, which moves the **real** macOS cursor with human timing,
so Recordly's auto-zoom and cursor effects work as with a person at the mouse.

One-time setup:

1. System Settings → Privacy & Security → **Accessibility**: enable the app that runs the
director (Conductor or Terminal). **Screen Recording**: enable Recordly.
2. `cd director && npm install && npm run build:native`
3. Build the frontend for the harness:
`cd packages/frontend && BACKEND_INTERNAL_URL=http://127.0.0.1:4100 NEXT_PUBLIC_API_URL= npx next build`
4. Log in to claude.ai once in the recording profile (`~/.lumen-demo-chrome`), which the
director opens as an app window.

Run a take with `cd director && npx tsx run.ts <scene>`; with Recordly recording, press
Ctrl+Option+G in the demo window (or `npx tsx go.ts`). Scenes: `etsy-ui`, `sap-ui`,
`openapi-ui`, `connect-claude`, `etsy-claude`, `sap-claude`, `finale-claude`
(`--dry` checks a web-app scene headless). The director takes care of what bit us:

- the window opens on the Retina display, so a take is 3200×1800 even with a 1x monitor as main display;
- claude.ai is forced to English for the take, chats are incognito (no sidebar, history or memory);
- the notification nudge over the composer is hidden, Chrome autocomplete is off (its dropdown swallows real clicks);
- the consent page shows the demo user's email instead of the real account;
- `connect-claude` disconnects and removes the connector off camera first: removing alone keeps the OAuth grant and skips the consent page. Set `LUMEN_MCP_URL` to the server URL.

Before every take: Do Not Disturb on, nothing over the recording area, Recordly in
**window** mode. Export every clip **untrimmed** (Recordly otherwise cuts idle stretches,
the Claude waits among them) at full resolution. Clip names: `01-etsy-ui`,
`02-etsy-claude`, `03-sap-ui`, `04-sap-claude`, `05-openapi-ui`, `06b-finale-claude`,
`07-connect-claude`, in `compositions/assets/footage/`.

## 4. Edit and render

```bash
cd compositions
# frame-difference per frame, used to snap cuts to still frames
for n in assets/footage/*.mp4; do b=$(basename $n .mp4); ffmpeg -i $n -vf "scale=320:180,tblend=all_mode=difference,signalstats,metadata=print:key=lavfi.signalstats.YAVG:file=.motion/$b.txt" -f null -; done
python3 build.py # cut list, captions, overlays -> index.html (see the script's docstring for .motion/motion.json)
npx hyperframes check
npx hyperframes preview --background
npx hyperframes render --output ../renders/anythingmcp-demo-lumen-clay-en.mp4 --fps 30 --quality delivery
cd .. && python3 export-web.py # demo.mp4/.webm, 23 s preview loop, poster, README GIF
```

- **Cut list**: `SCENES` in `build.py`, one line per kept range: clip, source in/out, speed, caption. Claude waits run at 6–8× with a visible speed label; cut after the Send click, before Recordly's zoom-out.
- **Look**: overlays follow the Claude Design styleframes (AnythingMCP Design System: Fraunces, Geist, cream/ink/blue); recordings fly in and out in 3D on a dark stage, captions sit below them.
- **Music**: a HeyGen catalog track (`npx hyperframes media-use resolve --type bgm`, needs `heygen auth login --oauth`), kept out of git in `compositions/.media/`. Its licence for use outside HeyGen is not confirmed.
- **Publishing**: the site streams the files from DigitalOcean Spaces (`koch-katalog` bucket, `anythingmcp/demo/<date>/`, public-read, `Cache-Control: immutable`), so a new cut goes into a new dated folder and `lib/demo-media.ts` in the website repo points at it. The README uses `docs/assets/demo-lumen-clay.gif`.
Loading
Loading