FoundryNet — Industrial Machine Intelligence

io.github.FoundryNet由 GitHub 帳號 FoundryNet 發布v1.1.0更新於 Nov 2, 2026

Cross-OEM industrial machine intelligence: identity, normalization, automation, attestation.

已驗證Streamable HTTP可網頁執行雲端與基礎設施資料與分析商業與電商

概覽

AI 產生的概覽

面向跨廠牌工業機台的託管 MCP 伺服器:辨識機台、正規化 OEM 遙測、執行自動化、預測故障並驗證工作紀錄。

可以做什麼
  • 辨識機台,並把原始 OEM 遙測正規化為統一的欄位結構,支援覆蓋度查詢與對應修正
  • 查詢機台運轉歷史,建立、啟用、列出、停用、刪除或還原自然語言自動化,並檢視 webhook 歷史
  • 預測故障、越限與剩餘壽命,評估機群健康度、偵測異常並查看預測準確率
  • 計算 OEE、能耗、班別報告、機台診斷與健康指數,並檢查護欄規則
  • 檢視連上自有核心的代理程式,並產生防竄改、雜湊驗證的工作紀錄
  • 執行從監看到觸發的沙箱示範流程
適用情境
適合需要同時面對多廠牌工廠設備(CNC、機器人、協作型機器人)的情境:希望用自然語言查詢、統一遙測欄位、設定自動化並做預測性維護,而不必為每個廠商各自串接工具。
執行需求
遠端 Streamable HTTP 端點(同時保留舊版 SSE);不需本機安裝。需要 Forge API 金鑰,透過 Authorization Bearer 標頭傳送,可在官網免費註冊取得;免費方案只開放唯讀工具,進階預測與診斷工具按次計費。
安裝前請注意
金鑰屬於憑證,經 Authorization 標頭傳送,須妥善保管。自動化可被建立、啟用、停用、刪除與還原,工作紀錄也會被寫入,因此助理可能改變真實機台上的狀態。進階預測與診斷工具按次收費,沙箱示範工具不需綁卡即可觸發動作。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 FoundryNet — Industrial Machine Intelligence,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.FoundryNet%2Fforge-mcp/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "foundrynet-industrial-machine-intelligen": {
      "type": "http",
      "url": "https://foundrynet-mcp-production.up.railway.app/mcp"
    }
  }
}

README

Forge by FoundryNet — Industrial Machine Intelligence

The cross-manufacturer industrial MCP server. Talk to any CNC, robot, or industrial machine in natural language — machine identity, telemetry normalization across 46 vendor packs in 20 verticals, plain-English automation, and tamper-evident work records.

Hosted MCP over Streamable HTTP. 32 tools wrap the Forge v1 API: provision a stable machine identity, normalize raw OEM telemetry into a canonical schema, query operational history, parse and activate plain-English automations, predict failures (TimesFM), score fleet health, and record every state-changing action as a verifiable, tamper-evident work record.

What it does

It normalizes raw OEM telemetry from 18 manufacturer families into one canonical vocabulary with thousands of confirmed field mappings — so an agent writes against one set of field names whether the machine is a Fanuc CNC, a KUKA arm, or a Universal Robots cobot. On top of that it turns plain-English instructions into structured automations (review then activate), and records every state-changing action as a tamper-evident work record.

Architecture

Pure HTTP proxy. Every tool is a thin wrapper around https://forge.foundrynet.io/v1/*. No state, no shared imports with forge-prod — separate Railway service, separate dependencies (fastmcp + httpx).

Claude Desktop / agent        │ Streamable HTTP (/mcp) — or legacy SSE (/sse)        │ Authorization: Bearer <the CALLER's Forge API key>        ▼  foundrynet-mcp on Railway        │ gate: validate key → tier → cap → bind caller        │ HTTPS, Authorization: Bearer <the SAME caller's key>        │        X-Forge-Caller-Key-Id: <their forge_api_keys.id>        ▼  forge.foundrynet.io/v1/*  — scopes every row to that caller

Tenancy. The upstream call is made as the CALLER, not as this server. It used to be made with the server's own FOUNDRYNET_API_KEY for every caller, with no caller named: forge-prod scopes rows to the authenticated key's owner, so every MCP tenant read and wrote inside one shared Forge account — and fleet_oee, shift_report, list_agents and prediction_accuracy take no machine argument, so they returned that whole account. The upstream hop now REFUSES to run when it cannot name the caller: there is no fallback, because the only fallback is the shared key. OAuth access tokens carry a key id but not a key, so they cannot be presented upstream and are refused on tool calls with tenant_context_unavailable.

POST /a2a/tasks and GET /a2a/agents go through the same gate function (gating.enforce_call) as tools/call, by skill→tool mapping. They previously authenticated the caller and then dispatched with no tier check, no cap and no payment gate, which made the A2A route a free pass to the paid inference tools.

Tests and the release gate

python3 -m venv .venv && .venv/bin/pip install -r requirements.txt pytest pytest-asyncio.venv/bin/python -m pytest tests/ -q        # 229 checksscripts/release_gate.sh                     # tree, deps, import, suite, version

The suite drives the real ASGI app over real Streamable HTTP through the real gate; only Supabase and the upstream hop are substituted, and the upstream substitute RECORDS requests, because what identity this server presents to forge-prod is the thing most worth asserting. tests/test_rest_mcp_parity.py measures free-tier parity against forge-prod's own _endpoint_to_billing_meter, read out of its source at test time rather than copied.

CI runs the whole tree on every push and pull request (.github/workflows/release-gate.yml, pinned to ubuntu-24.04): measured 223 passed, 6 skipped, 229 collected in 2m04s. The 6 skips are the checks that read forge-prod's api.py off the local disk — 5 parity plus the cost-ledger single-writer check — and they skip loudly, with their reason printed, because forge-prod is a separate private repo and is not on the runner. A visible skip beats a green tick over a check that was quietly dropped.

Deploying

cd ~/forge-mcp && git checkout main && git pull --ff-only && ./deploy.sh

Never railway up by hand. deploy.sh does seven things in order, and five of them exist because of a specific way a deploy has gone wrong:

  1. refuses a dirty tree or a branch that is not main — railway up uploads the WORKING TREE, so with uncommitted changes no commit describes what ships;
  2. runs scripts/release_gate.sh and refuses if it is red. There is no override flag, deliberately;
  3. takes a deploy lock (~/.forge-mcp-deploy.lock, atomic mkdir) so two concurrent deploys cannot race on the upload and on the verification;
  4. refuses if railway up would archive the wrong directory. It archives the CLOSEST LINKED project directory from ~/.railway/config.json, walking UP — not $PWD. This directory once inherited $HOME's link, which names a DIFFERENT SERVICE;
  5. runs stamp_build.py, which writes build_info.json (commit, dirty state, content_hash over the uploaded file set, build time);
  6. railway up --service 162115b7-… — the id is explicit, because a bare railway up resolves the service from that same ancestor link;
  7. polls https://mcp.foundrynet.io/health until build.commit_short AND build.content_hash both equal the stamp it just wrote, then asserts the status. Railway reporting SUCCESS only means the upload and build succeeded — a crash-looping new container leaves the OLD one serving and the deploy looks fine. content_hash is checked as well as the commit because railway up uploads a tree: the same commit with a different tree is a different deployment.

/health carries a build block using the same key names as forge-prod's, so one verifier reads both services. When build_info.json is absent it says so in words — build_info.json absent — deploy did not run stamp_build.py, with commit, content_hash and built_at present and null — because a null that looks like a missing field is indistinguishable from a stamped build.

Tools (32)

Identity & data: identify_machine, normalize_telemetry, query_machine_history, get_coverage, correct_mapping. Automation: create_automation, activate_automation, list_automations, disable_automation, delete_automation, restore_automation, query_webhook_history. Prediction (TimesFM): predict, predict_breach, remaining_life, predict_batch, fleet_health, detect_anomalies, machine_intelligence, prediction_accuracy. Operations: calculate_oee, fleet_oee, energy_consumption, shift_report, diagnose_machine, health_index. Guardrails: check_guardrail, list_guardrails. Agents on your kernel: get_agent_card, list_agents. Work records: verify_record. Demo: fire_sandbox (the full watch → fire → settle loop, no card).

get_agent_card and list_agents are scoped to the agents connected to your kernel instance (their capabilities, trust scores, and machine access) and are included in your subscription — there is no per-call charge. They are operational tools for coordinating agents on your own equipment, not cross-platform discovery. For cross-platform agent trust across any framework, see Assay (assay.foundrynet.io). verify_record creates a tamper-evident, hash-verified record of completed work.

Free tier exposes the read-only tools; metered pay-per-use unlocks the premium prediction and diagnostics tools (see https://forge.foundrynet.io/pricing?utm_source=github&utm_medium=readme&utm_campaign=forge-mcp-readme).

Connect (Claude Desktop, Cursor, any MCP client)

bash
claude mcp add --transport http foundrynet-forge \  https://mcp.foundrynet.io/mcp \  --header "Authorization: Bearer fnet_YOUR_KEY"

Or via claude_desktop_config.json with the mcp-remote bridge:

json
{  "mcpServers": {    "foundrynet-forge": {      "command": "npx",      "args": ["-y", "mcp-remote",               "https://mcp.foundrynet.io/mcp",               "--header", "Authorization:Bearer ${FNET_KEY}"],      "env": { "FNET_KEY": "fnet_…  (get a free key at foundrynet.io/signup)" }    }  }}

Legacy SSE (--transport sse against https://mcp.foundrynet.io/sse) remains supported for existing configs, but new integrations should use the Streamable HTTP /mcp endpoint above.

Get a free fnet_ key at https://foundrynet.io/signup?utm_source=github&utm_medium=readme&utm_campaign=forge-mcp-readme (50 normalize calls, no card).

Required environment (server-side)

VarRequiredDefault
FOUNDRYNET_API_KEYNo longer used on the tool pathKept for the boot-time config report only; tool calls run as the caller's own key
SUPABASE_URL / SUPABASE_SERVICE_KEYYes for gatingunset = gating disabled, fail-open
ENABLE_OAUTH_EXCHANGENodefault false: /oauth/token and its metadata answer 501 and JWTs are not accepted (G9). true re-enables the client-credentials flow
MCP_JWT_SECRETNowith the exchange enabled: unset = issuance answers 503; key auth unaffected
FORGE_BASE_URLNohttps://forge.foundrynet.io
PORTNo8080 (Railway sets this automatically)
REQUEST_TIMEOUTNo120 (seconds)

Files

  • mcp_server.py — the server (32 tools + /health + /.well-known/mcp routes)
  • gating.py — per-client tier gating (Free vs Pro tool/quota enforcement)
  • server.json — MCP registry metadata (name, description, keywords, remote endpoint)
  • smithery.yaml — Smithery listing metadata
  • requirements.txt — fastmcp>=3.4.5,<4, httpx>=0.27, PyJWT>=2.14.0, supabase, stripe
  • tests/ — the behavioural suite (auth, tenancy, parity, idempotency, cache scope)
  • scripts/release_gate.sh — must be green on the exact commit before a deploy
  • deploy.sh — the only path to production; gated, locked, stamped and verified
  • stamp_build.py — writes build_info.json; what /health's build block reports
  • Procfile — Railway start command (stamps, then python mcp_server.py)
  • .github/workflows/release-gate.yml — CI; the whole suite on push and PR

License

Proprietary (commercial). © Foundry Labs LLC. Contact: [email protected]

來源:README.md,提交 1a07430

工具

0
SourceWeft 尚未讀取此伺服器的工具。

版本歷史

1
  1. v1.1.0最新Sep 16, 2026

評分

已滿足適用檢查項的 75%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。