forge-sandbox
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 VF-2SS | MTConnect |
|
| 6-осевой робот FANUC R-30iB | FOCAS |
|
| SINUMERIK 840D sl / S7-1500 | PROFINET |
|
| 3D-принтер Prusa MK3S+ | Marlin (последовательный) |
|
| Кровельный HVAC Carrier 48TC | BACnet/IP |
|
Добавьте ?seed=N к любому вызову simulate, чтобы сделать его повторяемым.
Эндпоинты
Эндпоинт | Что делает |
| сырая телеметрия вендора → канонические поля (JSON или |
| пересечёт ли ряд порог и когда |
| сводка по парку, распределение рисков, очередь обслуживания |
| предсказания по каждой машине, без сводки |
| что можно нормализовать; передайте |
| канонический словарь: имя, тип, единица измерения, вертикаль |
| пять имитированных машин |
| одно сырое показание |
| история по одному сырому тегу |
| проверка живости (GET и HEAD) |
| MCP-сервер, Streamable HTTP |
| браузер 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Восемь инструментов. Пять из них, существующих в продакшене, несут описания инструментов продакшена дословно, потому что описание — это интерфейс, на основе которого ваш агент принимает решения; если здесь оно читается иначе, поведение промпта, которое вы настраиваете против песочницы, не перенесётся.
Инструмент | |
| продакшн |
| продакшн |
| продакшн |
| продакшн |
| продакшн |
| только песочница |
| только песочница |
| только песочница |
Каждое описание инструмента заканчивается примечанием SANDBOX:, поэтому агент, читающий список инструментов, узнаёт, что данные имитированы, прежде чем что-либо сделать.
Продакшн-версия Forge предоставляет 32 инструмента на https://mcp.foundrynet.io/mcp. Остальным 24 нужны постоянная идентичность, история, ограничители, триггеры, биллинг или ончейн-аттестация.
Как на самом деле работает разрешение
Продакшн разрешает тег через пять уровней. Песочница включает три из них, которым не нужны веса моделей, сеть и проприетарные данные.
Уровень | Тип совпадения | Уверенность | Что это |
1 |
| 1.00 | точный тег вендора в пакете сопоставлений |
1b |
| 0.95 | та же строка, когда регистр, пунктуация и суффикс единицы измерения свёрнуты |
1c |
| 0.60 | пакет другого вендора знал этот тег — сообщается, а не скрывается |
2 |
| 1.00 | тег уже ЯВЛЯЕТСЯ каноническим именем поля |
3 |
| 0.55–0.72 | детерминированный классификатор «субъект+количество» |
— |
| 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. Если вы когда-нибудь увидите их на реальном эндпоинте, значит, что-то маршрутизируется неправильно.
Две вещи, которые песочница делает лучше продакшена
Обе — известные проблемы продакшена, исправленные здесь, потому что песочница, которая учит неправильной форме, хуже, чем отсутствие песочницы.
Шкала PWM объявлена. Поле нагревателя
@:в Marlin — это байт коэффициента заполнения 0–127, а не процент. Корпус продакшена выдаёт для негоunit: null, поэтому показание95интерпретируется как «95%, почти максимум», хотя на самом деле это около 75%. Песочница объявляетunit: "pwm_0_127".Пустые единицы измерения заполняются из имён полей. Опубликованный корпус объявляет единицу измерения только для 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.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Переход на продакшен
Два изменения:
- 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
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