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. Закрепите версию с помощью ghcr.io/foundrynet/forge-sandbox:1.0.0, если не хотите отслеживать latest.

Порт 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 несовместимых форматах. Скорость шпинделя — это S SPEED (RPM) на Haas, Nist_Spindle (RPM) на SINUMERIK и ACT_SP_SPEED_1/min на FANUC. Ваш агент не должен изучать все три.

Forge переводит любой из них в единый канонический словарь. Песочница позволяет вам разрабатывать на основе этого словаря до того, как у вас появятся оборудование, учётные данные или бюджет.

Sandbox

Production

Данные

имитированные

ваше реальное оборудование

Каноническая схема

настоящая

настоящая

Сопоставления тегов вендоров

1 515 (публичные источники)

16 908 курируемых

Нераспознанные теги

классификатор сигналов

+ эмбеддинги, + исследование LLM, + самовосстановление

Прогнозирование

метод наименьших квадратов

TimesFM (200M параметров)

Аутентификация

нет

API-ключ

Персистентность

нет

история, идентичность, триггеры, ограничители

Стоимость

бесплатно

см. цены

Формы ответов идентичны. Это и есть контракт. Стройте интеграцию против песочницы, измените базовый URL, добавьте заголовок Authorization: Bearer — и ваш клиентский код не изменится.


Related MCP server: operational-data-mcp

Пять минут

Песочница поставляется с пятью имитированными машинами. Каждая передаёт настоящие имена тегов вендора — те самые написания, которые вы встречаете в реальном трафике.

# 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}'

Пять машин

Ключ

Оборудование

Протокол

Стиль тегов

haas

Обрабатывающий центр Haas VF-2SS

MTConnect

S SPEED (RPM), SP_LOAD_PCT (%)

fanuc

6-осевой робот FANUC R-30iB

FOCAS

TCPVEL (mm/s), PAYLOADKG(kg)

siemens

SINUMERIK 840D sl / S7-1500

PROFINET

SPINDEL_AUSLASTUNG (%), STUECKZAHL (pcs)

prusa

3D-принтер Prusa MK3S+

Marlin (последовательный)

hotend_temp, heater_power, pinda_temp

carrier

Кровельный HVAC Carrier 48TC

BACnet/IP

SupplyTemp, DamperPosition, CO2

Добавьте ?seed=N к любому вызову simulate, чтобы сделать его повторяемым.


Эндпоинты

Эндпоинт

Что делает

POST /v1/normalize

сырая телеметрия вендора → канонические поля (JSON или text/csv)

POST /v1/predict_breach

пересечёт ли ряд порог и когда

POST /v1/fleet_health

сводка по парку, распределение рисков, очередь обслуживания

POST /v1/predict_batch

предсказания по каждой машине, без сводки

GET /v1/coverage

что можно нормализовать; передайте ?oem=, чтобы проверить одного производителя

GET /v1/canonical-fields

канонический словарь: имя, тип, единица измерения, вертикаль

GET /v1/machines

пять имитированных машин

GET /v1/simulate/{machine}

одно сырое показание

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

история по одному сырому тегу

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 — возвращают 501 с причиной, а не голый 404, чтобы вы могли отличить «нет в песочнице» от «вы ошиблись при вводе».


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

Восемь инструментов. Пять из них, существующих в продакшене, несут описания инструментов продакшена дословно, потому что описание — это интерфейс, на основе которого ваш агент принимает решения; если здесь оно читается иначе, поведение промпта, которое вы настраиваете против песочницы, не перенесётся.

Инструмент

normalize_telemetry

продакшн

get_coverage

продакшн

predict_breach

продакшн

fleet_health

продакшн

predict_batch

продакшн

list_sandbox_machines

только песочница

get_sandbox_reading

только песочница

get_sandbox_series

только песочница

Каждое описание инструмента заканчивается примечанием SANDBOX:, поэтому агент, читающий список инструментов, узнаёт, что данные имитированы, прежде чем что-либо сделать.

Продакшн-версия Forge предоставляет 32 инструмента на https://mcp.foundrynet.io/mcp. Остальным 24 нужны постоянная идентичность, история, ограничители, триггеры, биллинг или ончейн-аттестация.


Как на самом деле работает разрешение

Продакшн разрешает тег через пять уровней. Песочница включает три из них, которым не нужны веса моделей, сеть и проприетарные данные.

Уровень

Тип совпадения

Уверенность

Что это

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 — это уникальные канонические поля ÷ общее количество тегов. Десять написаний одной величины — это одно покрытое поле, а не десять. (В продакшене была именно эта ошибка, и он сообщал о 100% покрытии на корпусе без начальных данных.)

Песочница никогда не выдумывает канонические имена. Каждое имя, которое она выдаёт, берётся из поставляемого словаря, а цели классификатора проверяются по этому словарю при запуске — опечатка приводит к падению контейнера, а не к поставке правдоподобно выглядящего неправильного поля.


Чего НЕТ в этом образе

Намеренно, и заявлено прямо, чтобы ничто здесь не приняли за настоящий продукт:

  • Продакшн-корпус сопоставлений. 16 908 курируемых сопоставлений с оценками уверенности и происхождением. Песочница поставляет 1 515 сопоставлений, собранных только из уже публичных источников: каноническая схема под лицензией MIT (haas, fanuc, siemens, octoprint), поставляемый вертикальный пакет BACnet/IP плюс имена объектов Carrier i-Vu, а также имена полей Marlin M105/M114, которые любой Prusa передаёт по последовательному порту. tools/build_packs.py показывает, откуда взялась каждая строка.

  • Слой эмбеддингов. Продакшн векторизует нераспознанные теги и сопоставляет их по сходству. Здесь нет весов моделей.

  • LLM-исследование полей. Продакшн отправляет действительно новые теги модели, кэширует ответ, подтверждает его после 5 использований и упаковывает после 10. Не здесь.

  • Физические валидаторы и валидаторы времени чтения. Скорость изменения, залипший датчик, пропадание сигнала, режим работы, корреляция, затухание уверенности. Не здесь.

  • TimesFM. Продакшн прогнозирует с помощью фундаментальной модели временных рядов на 200M параметров. Песочница использует метод наименьших квадратов с квантильной полосой, масштабированной по остаткам. Каждый прогноз помечается "model": "sandbox-ols-v1" и "simulated": true.

  • Персистентность, идентичность, история, триггеры, ограничители, биллинг, аттестация. Всё с сохранением состояния, всё на стороне сервера.

  • Любое соединение с продакшеном. Приложение не импортирует HTTP-клиент и не использует socket API, поэтому не совершает исходящих вызовов — grep -rE "httpx|requests|urllib|socket" app/ возвращает пустой результат. docker-compose.yml дополнительно запускает его в режиме read_only со всеми capabilities отключёнными. Обратите внимание: это укрепляет файловую систему, а не сеть: стандартный мост Docker по-прежнему разрешает исходящий трафик, так что если вам нужно, чтобы это было принудительно, а не просто фактом, запускайте во internal сети.

Каждый ответ содержит "simulated": true и заголовок X-Forge-Sandbox: true. Если вы когда-нибудь увидите их на реальном эндпоинте, значит, что-то маршрутизируется неправильно.


Две вещи, которые песочница делает лучше продакшена

Обе — известные проблемы продакшена, исправленные здесь, потому что песочница, которая учит неправильной форме, хуже, чем отсутствие песочницы.

  1. Шкала PWM объявлена. Поле нагревателя @: в Marlin — это байт коэффициента заполнения 0–127, а не процент. Корпус продакшена выдаёт для него unit: null, поэтому показание 95 интерпретируется как «95%, почти максимум», хотя на самом деле это около 75%. Песочница объявляет unit: "pwm_0_127".

  2. Пустые единицы измерения заполняются из имён полей. Опубликованный корпус объявляет единицу измерения только для 58 из 366 полей. Там, где имя поля указывает единицу (_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

Переход на продакшен

Два изменения:

- 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 canonical schema, распространяемой по лицензии MIT; tools/build_packs.py документирует происхождение каждого пакета.


Forge от Foundry Labs · forge@foundrynet.io

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
1Releases (12mo)
Commit activity

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

  • A
    license
    Not graded
    quality
    B
    maintenance
    A 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.
    42
    10
    MIT
  • 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

View all related MCP servers

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.

View all MCP Connectors

Latest Blog Posts

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