forge-sandbox
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: operational-data-mcp
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 VF-2SS マシニングセンター | MTConnect |
|
| FANUC R-30iB 6 軸ロボット | FOCAS |
|
| SINUMERIK 840D sl / S7-1500 | PROFINET |
|
| Prusa MK3S+ 3D プリンター | Marlin シリアル |
|
| Carrier 48TC ルーフトップ HVAC | BACnet/IP |
|
任意の simulate 呼び出しに ?seed=N を追加すると、再現可能になります。
エンドポイント
エンドポイント | 機能 |
| 生のベンダーテレメトリ → 標準フィールド (JSON または |
| シリーズがしきい値を超えるか、いつ超えるか |
| フリート集計、リスク分布、メンテナンスキュー |
| マシンごとの予測、集計なし |
| 正規化できるもの; |
| 標準ディクショナリ: 名前、型、単位、垂直 |
| 5 台のシミュレートされたマシン |
| 1 つの生の読み取り |
| 1 つの生のタグの履歴 |
| 生存確認 (GET と HEAD) |
| MCP サーバー、Streamable HTTP |
| 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 user8 つのツール。本番に存在する 5 つは、本番のツール説明をそのまま保持しています。説明はエージェントが推論するインターフェースだからです — ここで異なる読み方をすると、サンドボックスに対して調整したプロンプトの動作が本番に引き継がれません。
ツール | |
| 本番 |
| 本番 |
| 本番 |
| 本番 |
| 本番 |
| サンドボックスのみ |
| サンドボックスのみ |
| サンドボックスのみ |
すべてのツール説明は SANDBOX: という注記で終わっているため、ツールリストを読むエージェントは、何かを実行する前にデータがシミュレートされていることを知らされます。
本番の Forge は https://mcp.foundrynet.io/mcp で 32 のツールを公開しています。残りの 24 は、永続的なアイデンティティ、履歴、ガードレール、トリガー、請求、またはオンチェーン証明を必要とします。
ここでの解決の仕組み
本番はタグを 5 つのレイヤーで解決します。サンドボックスは、モデル重み、ネットワーク、独自データを必要としない 3 つを提供します。
レイヤー | マッチタイプ | 信頼度 | 内容 |
1 |
| 1.00 | マッピングパック内の正確なベンダータグ |
1b |
| 0.95 | 同じ行、大文字小文字/句読点/単位接尾辞を折りたたんだ後 |
1c |
| 0.60 | 別のベンダーのパックがそれを知っていた — 隠さず報告 |
2 |
| 1.00 | タグがすでに標準フィールド名である |
3 |
| 0.55–0.72 | 決定論的主語+数量分類器 |
— |
| 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 つの点
どちらも既知の本番の問題であり、間違った形を教えるサンドボックスはサンドボックスがないより悪いため、ここで修正されています。
PWM スケールが宣言されています。 Marlin の
@:ヒーターフィールドは 0–127 のデューティバイトであり、パーセンテージではありません。本番のコーパスはこれに対してunit: nullを発行するため、95という読み取りは「95%、ほぼ最大」と解釈されますが、実際は約 75% です。サンドボックスはunit: "pwm_0_127"を宣言します。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 imageDocker なし:
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.pyforge-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
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceA local MCP server that breaks on demand, allowing you to test your client against auth failures, disappearing tools, flaky responses, and token expiry from a web UI.4210MIT
- AlicenseAqualityCmaintenanceMCP server that unifies real-time telemetry from industrial systems into a single queryable interface, enabling production visibility, anomaly detection, and operational insights.510MIT
- AlicenseAqualityBmaintenanceExposes 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.4MIT
- AlicenseBqualityBmaintenanceEnables bounded, deterministic triage verdicts for server health, fleet status, and timeline investigation through a simulated execution-boundary MCP server.35MIT
Related MCP Connectors
Hosted MCP endpoint with realistic fake data for prototyping agents. 12 tools, no setup.
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
MCP server exposing Kettle Logic insight articles & industry guidance as tools + resources.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/FoundryNet/forge-sandbox'
If you have feedback or need assistance with the MCP directory API, please join our Discord server