Skip to main content
Glama
FoundryNet

forge-sandbox

by FoundryNet

Forge Sandbox

偽のデータ、本物のスキーマ。

Forge 産業用テレメトリカーネルの、キー不要のローカルシミュレーションです。ラップトップで実行し、その上でエージェント統合を構築し、同じコードを本番の Forge に向ければ実際の機器と通信できます。

API キー不要。アカウント不要。サインアップ不要。永続化もなし。このアプリは外部への呼び出しを行いません。

docker run -p 8000:8000 ghcr.io/foundrynet/forge-sandbox

マルチアーキテクチャ: linux/amd64 と linux/arm64。latest を追跡したくない場合は ghcr.io/foundrynet/forge-sandbox:1.0.0 でバージョンを固定してください。

ポート 8000 がすでに使用中ですか? docker run -p 8099:8000 ...、または compose の場合: FORGE_SANDBOX_PORT=8099 docker compose up。

curl -X POST http://localhost:8000/v1/normalize \
  -H "Content-Type: application/json" \
  -d '{"oem": "haas", "data": {"S SPEED (RPM)": 8500, "SP_LOAD_PCT (%)": 84.7, "COOL_TEMP [°F]": 161.8}}'
{
  "normalized": {
    "spindle_speed_rpm": 8500,
    "spindle_load_pct": 84.7,
    "sensor_readings.coolant_temp": 72.1111
  },
  "coverage_pct": 100.0,
  "fields_total": 3,
  "fields_distinct_canonical": 3,
  "unit_conversions": [
    {"raw_field": "COOL_TEMP [°F]", "canonical_field": "sensor_readings.coolant_temp",
     "from": "f", "to": "c", "conversion": "fahrenheit_to_celsius",
     "raw_value": 161.8, "converted_value": 72.1111}
  ],
  "oem": "haas",
  "vertical": "cnc",
  "simulated": true
}

これは何のためのものか

N 社の産業機器は、N 種類の互換性のない形式でテレメトリを生成します。スピンドル速度は Haas では S SPEED (RPM)、SINUMERIK では Nist_Spindle (RPM)、FANUC では ACT_SP_SPEED_1/min です。エージェントがこれらすべてを学習する必要はないはずです。

Forge は、それらのいずれかを 1 つの標準ボキャブラリに変換します。サンドボックスを使用すると、機器、認証情報、予算がなくても、そのボキャブラリに対して構築できます。

サンドボックス

本番

データ

シミュレーション

実際のマシン

標準スキーマ

本物

本物

ベンダータグマッピング

1,515 (公開ソース)

16,908 件のキュレーション済み

未解決タグ

シグナル分類器

+ 埋め込み、+ LLM リサーチ、+ 自己修復

予測

最小二乗法

TimesFM (200M パラメータ)

認証

なし

API キー

永続化

なし

履歴、アイデンティティ、トリガー、ガードレール

コスト

無料

価格を見る

レスポンスの形状は同一です。 それが契約です。サンドボックスに対して構築し、ベース URL を変更し、Authorization: Bearer ヘッダーを追加すれば、クライアントコードは変更する必要がありません。


Related MCP server: mcp-live-telemetry

5 分

サンドボックスには 5 台のシミュレートされたマシンが付属しています。それぞれが実際のベンダータグ名を発行します — ワイヤ上で実際に遭遇する綴りです。

# 1. See what's here
curl -s localhost:8000/v1/machines | jq '.machines[].description'

# 2. Pull a raw reading — vendor tags, unnormalized
curl -s localhost:8000/v1/simulate/siemens | jq .data
{
  "Betriebszustand": "AUTOMATIK",
  "PROGRAMM": "WELLE_STUFE3.MPF",
  "Nist_Spindle (RPM)": 1203,
  "SPINDEL_AUSLASTUNG (%)": 62.4,
  "Kuehlmittel Temp (C)": 30.6,
  "STUECKZAHL (pcs)": 842,
  "Betriebsstunden": 14203.5
}

エージェントは STUECKZAHL が部品数で、Betriebsstunden が稼働時間であることを推測できません。推測する必要もありません:

# 3. Normalize it
curl -s localhost:8000/v1/simulate/siemens \
  | jq '{oem, data}' \
  | curl -s -X POST localhost:8000/v1/normalize -H 'Content-Type: application/json' -d @- \
  | jq .normalized
{
  "execution_state": "AUTOMATIK",
  "program_name": "WELLE_STUFE3.MPF",
  "spindle_speed_rpm": 1203,
  "spindle_load_pct": 62.4,
  "sensor_readings.coolant_temp": 30.6,
  "part_count": 842,
  "operating_hours": 14203.5
}
# 4. Forecast — grab a series, ask whether it breaches
curl -s 'localhost:8000/v1/simulate/fanuc/series?field=MOTOR_TEMP&points=48' > /tmp/s.json

jq '{time_series: .values, threshold: 75.0, canonical_field: .canonical_field}' /tmp/s.json \
  | curl -s -X POST localhost:8000/v1/predict_breach -H 'Content-Type: application/json' -d @- \
  | jq '{will_breach, estimated_steps_to_breach, confidence, breach_window}'

5 台のマシン

キー

機器

プロトコル

タグスタイル

haas

Haas VF-2SS マシニングセンター

MTConnect

S SPEED (RPM), SP_LOAD_PCT (%)

fanuc

FANUC R-30iB 6 軸ロボット

FOCAS

TCPVEL (mm/s), PAYLOADKG(kg)

siemens

SINUMERIK 840D sl / S7-1500

PROFINET

SPINDEL_AUSLASTUNG (%), STUECKZAHL (pcs)

prusa

Prusa MK3S+ 3D プリンター

Marlin シリアル

hotend_temp, heater_power, pinda_temp

carrier

Carrier 48TC ルーフトップ HVAC

BACnet/IP

SupplyTemp, DamperPosition, CO2

任意の simulate 呼び出しに ?seed=N を追加すると、再現可能になります。


エンドポイント

エンドポイント

機能

POST /v1/normalize

生のベンダーテレメトリ → 標準フィールド (JSON または text/csv)

POST /v1/predict_breach

シリーズがしきい値を超えるか、いつ超えるか

POST /v1/fleet_health

フリート集計、リスク分布、メンテナンスキュー

POST /v1/predict_batch

マシンごとの予測、集計なし

GET /v1/coverage

正規化できるもの; ?oem= で 1 つ確認可能

GET /v1/canonical-fields

標準ディクショナリ: 名前、型、単位、垂直

GET /v1/machines

5 台のシミュレートされたマシン

GET /v1/simulate/{machine}

1 つの生の読み取り

GET /v1/simulate/{machine}/series?field=

1 つの生のタグの履歴

GET /health

生存確認 (GET と HEAD)

ANY /mcp

MCP サーバー、Streamable HTTP

GET /docs

OpenAPI ブラウザ

本番には存在するが永続状態を必要とするエンドポイント — /v1/history、/v1/identify、/v1/guardrails、/v1/triggers、/v1/attest、/v1/billing/usage — は、単なる 404 ではなく理由付きの 501 を返します。これにより、「サンドボックスにない」と「入力ミス」を区別できます。


MCP

サンドボックスは MCP サーバーでもあります。Claude Desktop、Claude Code、または任意の MCP クライアントを http://localhost:8000/mcp に向けてください。

{
  "mcpServers": {
    "forge-sandbox": {
      "type": "http",
      "url": "http://localhost:8000/mcp"
    }
  }
}

Claude Code:

claude mcp add --scope user --transport http forge-sandbox http://localhost:8000/mcp

--scope user が重要です。これがないと claude mcp add はサーバーを現在のディレクトリにローカルに登録するため、その場所でのみ解決され、他の場所では解決されません — 実際に使用したいプロジェクトから claude mcp get forge-sandbox を実行すると、"No MCP server named forge-sandbox" というエラーになります。ユーザースコープにすると、どこでも利用可能になります。元に戻すには:

claude mcp remove forge-sandbox -s user

8 つのツール。本番に存在する 5 つは、本番のツール説明をそのまま保持しています。説明はエージェントが推論するインターフェースだからです — ここで異なる読み方をすると、サンドボックスに対して調整したプロンプトの動作が本番に引き継がれません。

ツール

normalize_telemetry

本番

get_coverage

本番

predict_breach

本番

fleet_health

本番

predict_batch

本番

list_sandbox_machines

サンドボックスのみ

get_sandbox_reading

サンドボックスのみ

get_sandbox_series

サンドボックスのみ

すべてのツール説明は SANDBOX: という注記で終わっているため、ツールリストを読むエージェントは、何かを実行する前にデータがシミュレートされていることを知らされます。

本番の Forge は https://mcp.foundrynet.io/mcp で 32 のツールを公開しています。残りの 24 は、永続的なアイデンティティ、履歴、ガードレール、トリガー、請求、またはオンチェーン証明を必要とします。


ここでの解決の仕組み

本番はタグを 5 つのレイヤーで解決します。サンドボックスは、モデル重み、ネットワーク、独自データを必要としない 3 つを提供します。

レイヤー

マッチタイプ

信頼度

内容

1

corpus

1.00

マッピングパック内の正確なベンダータグ

1b

corpus_normalized

0.95

同じ行、大文字小文字/句読点/単位接尾辞を折りたたんだ後

1c

cross_oem

0.60

別のベンダーのパックがそれを知っていた — 隠さず報告

2

identity

1.00

タグがすでに標準フィールド名である

3

signal

0.55–0.72

決定論的主語+数量分類器

—

unknown

0.00

正直なミス

何も解決しないタグは、出力で生の名前と値を保持します。何も黙って破棄されず、カバレッジにもカウントされません。

coverage_pct は異なる標準フィールド数 ÷ タグ総数です。1 つの数量の 10 の綴は、10 ではなく 1 つのフィールドとしてカウントされます。(本番はまさにこのバグがあり、シードされていないコーパスで 100% のカバレッジを報告しました。)

サンドボックスは標準名を発明しません。発行されるすべての名前は、同梱のディクショナリから出てきます。分類器のターゲットは起動時にそのディクショナリに対して検証されます — タイプミスはコンテナを失敗させ、もっともらしい間違ったフィールドを出荷しません。


このイメージに含まれないもの

意図的に、そしてここにあるものが本物と誤解されないように明確に述べられています:

  • 本番のマッピングコーパス。 信頼度スコアと出典を持つ 16,908 のキュレートされたマッピング。サンドボックスは、すでに公開されているソースのみから組み立てられた 1,515 のマッピングを提供します: MIT ライセンスの標準スキーマ (haas、fanuc、siemens、octoprint)、同梱の BACnet/IP 垂直パックと Carrier i-Vu オブジェクト名、および Prusa がシリアルで発行する Marlin M105/M114 フィールド名。tools/build_packs.py は各行の出典を正確に示します。

  • 埋め込みレイヤー。 本番は認識されないタグを埋め込み、類似度でマッチングします。ここにはモデル重みはありません。

  • LLM フィールドリサーチ。 本番は真に新しいタグをモデルに送り、回答をキャッシュし、5 回の使用で確認し、10 回でパックします。ここにはありません。

  • 物理バリデータと読み取り時バリデータ。 変化率、センサー固着、ドロップアウト、動作モード、相関、信頼度減衰。ここにはありません。

  • TimesFM。 本番は 200M パラメータの時系列基盤モデルで予測します。サンドボックスは残差スケーリングされた分位帯を持つ最小二乗法を使用します。すべての予測には "model": "sandbox-ols-v1" と "simulated": true がスタンプされます。

  • 永続化、アイデンティティ、履歴、トリガー、ガードレール、請求、証明。 すべてステートフルで、すべてサーバーサイドです。

  • 本番への接続。 アプリケーションは HTTP クライアントもソケット API もインポートしないため、外部への呼び出しは行いません — grep -rE "httpx|requests|urllib|socket" app/ は空で返ります。docker-compose.yml はさらに、すべてのケーパビリティを削除した read_only で実行します。これはファイルシステムを強化するもので、ネットワークを強化するものではないことに注意してください。Docker のデフォルトのブリッジは依然として外部への送信を許可するため、単に真であるだけでなく強制する必要がある場合は、internal ネットワークで実行してください。

すべてのレスポンスには "simulated": true と X-Forge-Sandbox: true ヘッダーが含まれます。実際のエンドポイントでこれらを見た場合、何かが誤ってルーティングされています。


サンドボックスが本番より優れている 2 つの点

どちらも既知の本番の問題であり、間違った形を教えるサンドボックスはサンドボックスがないより悪いため、ここで修正されています。

  1. PWM スケールが宣言されています。 Marlin の @: ヒーターフィールドは 0–127 のデューティバイトであり、パーセンテージではありません。本番のコーパスはこれに対して unit: null を発行するため、95 という読み取りは「95%、ほぼ最大」と解釈されますが、実際は約 75% です。サンドボックスは unit: "pwm_0_127" を宣言します。

  2. null 単位はフィールド名から補完されます。 公開されたコーパスは 366 フィールドのうち 58 にのみ単位を宣言しています。フィールド名が単位を示している場合 (_temperature_c、_pressure_bar、_rpm)、サンドボックスはそれを補完し、unit_source: "sandbox_inferred_from_name" とマークします。


ローカル開発

docker compose up --build          # build and run your local changes
docker build --target test .       # run the suite inside the shipping image

Docker なし:

python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements-dev.txt
python -m pytest tests/ -q
uvicorn app.main:app --reload --port 8000

ソースからマッピングパックを再生成します (canonical-schema リポジトリのチェックアウトが必要):

python3 tools/build_packs.py
forge-sandbox/
  app/
    main.py        FastAPI surface — the production response envelopes
    corpus.py      tag → canonical resolution, unit conversion, collisions
    simulate.py    the five machines
    predict.py     deterministic forecasting, production's response contract
    mcp_tools.py   MCP server, production tool descriptions
    packs/         generated mapping packs + the canonical dictionary
  tools/
    build_packs.py regenerates packs from the public sources
  tests/
    test_sandbox.py

本番へのアップグレード

2 つの変更:

- BASE_URL = "http://localhost:8000"
- headers = {}
+ BASE_URL = "https://forge.foundrynet.io"
+ headers = {"Authorization": f"Bearer {FORGE_API_KEY}"}

MCP の場合は、http://localhost:8000/mcp を https://mcp.foundrynet.io/mcp に置き換えます。

内部で変わるもの:

  • サンドボックスが unknown と報告したタグは、埋め込みレイヤー、LLM リサーチパス、または垂直パックによって解決されます。

  • 予測は直線ではなく TimesFM から得られます。

  • 読み取りが永続化されるため、履歴、トリガー、ガードレールが機能し始めます。

  • /v1/identify は永続的なマシンアイデンティティを発行します。

  • 予測は証明できます。

キーを取得: foundrynet.io


Sandbox:     fake data, real schema
Production:  real data, real schema, real predictions

Upgrade:     foundrynet.io

ライセンス

マッピングパックは、MITライセンスのFoundryNet正規スキーマから派生したものです。tools/build_packs.pyは、すべてのパックの出所を文書化しています。


Foundry Labs提供 · forge@foundrynet.io

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Exposes live industrial IoT telemetry to any MCP client, streaming simulated sensor data from a fleet of machines and detecting anomalies, with the ability to inject faults on demand.
    4
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables bounded, deterministic triage verdicts for server health, fleet status, and timeline investigation through a simulated execution-boundary MCP server.
    3
    5
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that lets AI models read and control industrial devices via standardized protocols like Modbus, OPC UA, and MQTT, with simulation and real hardware modes.
    4
    MIT