Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
FoundryNet avatar

FoundryNet — Industrial Machine Intelligence

  • Updated July 19, 2026
  • FoundryNet/forge-mcp

The cross-manufacturer industrial MCP server for **machine monitoring**.

About

The cross-manufacturer industrial MCP server for **machine monitoring**. Talk to any. The cross-manufacturer industrial MCP server for **machine monitoring**. Talk to any CNC, robot, or industrial machine in natural language - machine identity, **OPC UA / MQTT / Modbus telemetry normalization** across 16 OEM families, plain-English automation, and tamper-evident on-chain **work attestation and verification** so every industrial action carries a verifiable trust record. Hosted MCP over Streamable HTTP (legacy SSE still supported). 14 tools wrap the Forge v1 API: provision a stable machine identity,

  • The cross-manufacturer industrial MCP server for **machine monitoring**. Talk to any
  • CNC, robot, or industrial machine in natural language - machine identity, **OPC UA /
  • MQTT / Modbus telemetry normalization** across 16 OEM families, plain-English
  • automation, and tamper-evident on-chain **work attestation and verification** so every
  • industrial action carries a verifiable trust record.

FoundryNet — Industrial Machine Intelligence by the numbers

  • Exposes 17 verified tools (MCP introspection)
  • Data as of Jul 20, 2026 (Skillselion catalog sync)
terminal
claude mcp add --transport http forge-mcp https://foundrynet-mcp-production.up.railway.app/mcp

Add your badge

Show developers this MCP server is listed on Skillselion. Paste this into your README.

Listed on Skillselion
TransportHTTP
AuthNone
Tools17
Last updatedJuly 19, 2026
RepositoryFoundryNet/forge-mcp

How do agents access FoundryNet - Industrial Machine Intelligence capabilities without custom integration code?

The cross-manufacturer industrial MCP server for **machine monitoring**. Talk to any

Who is it for?

Developers wiring FoundryNet - Industrial Machine Intelligence into Cursor, Claude Desktop, or other MCP clients.

Skip if: Teams that need features outside the documented FoundryNet - Industrial Machine Intelligence tool surface.

What you get

Configured MCP host can call FoundryNet - Industrial Machine Intelligence tools with schemas from the server README.

  • Agent-callable machine intelligence operations via FoundryNet
  • Normalized cross-vendor machine context for automation scripts
  • Attestation-oriented workflows aligned with FoundryNet’s industrial stack

By the numbers

  • [object Object]
At a glance

FoundryNet — Industrial Machine Intelligence capabilities & compatibility

Capabilities
the cross manufacturer industrial mcp server for · cnc, robot, or industrial machine in natural lan · mqtt / modbus telemetry normalization** across 1 · automation, and tamper evident on chain **work a
Use cases
api development · orchestration
Runs
Local or remote
Pricing
Bring your own API key
From the docs

What FoundryNet — Industrial Machine Intelligence says it does

https://foundrynet-mcp-production.up.railway.app/mcp
README.md

Tools 17

Public tool metadata - what this server can do for an agent.

identify_machine5 params

Provision or retrieve a persistent on-chain identity (mint_id) for any industrial machine. Works for CNC machines, industrial robots, PLCs, additive manufacturing cells, injection molders, presses, turbines, pumps, compressors, conveyors — any equipment from any OEM: Fanuc, Siemens, Haas, DMG Mori, Mazak, Okuma, Hurco, Doosan, Makino, ABB, KUKA, Universal Robots, Yaskawa, Stäubli, FANUC Robotics, Komatsu, Caterpillar, John Deere, Trumpf, Bystronic, Amada, EMAG, Bosch Rexroth, Beckhoff, Rockwell Allen-Bradley. Returns the mint_id (universal handle, format "MINT-xxxxxx") plus its Solana wallet_address. Idempotent — calling again with the same (oem, model, serial) returns the same mint_id with `created: false`. USE WHEN: a user references a specific machine by OEM/model/serial and you need a stable handle to attach normalized data, automations, or on-chain settlements to. Always call this first when a new machine is introduced to the conversation, before normalize_telemetry or create_au

  • oemstringrequired
  • modelstringrequired
  • serialstringrequired
  • site
  • metadata
normalize_telemetry6 params

Translate raw machine telemetry from any OEM's proprietary format into universal canonical FCS (FoundryNet Canonical Schema) data. Maps vendor-specific column names like "Spindle_Speed", "servo_load_x", "CoolantTemp", "FeedRateOverride" into standard fields like spindle_speed_rpm, axes.x_load_pct, sensor_readings.coolant_temp, feed_override_pct. Accepts a `data` dict of {raw_field: value}. If `machine_id` (mint_id or internal_id) is omitted but oem+model+serial are provided, silently auto-provisions the machine identity (same effect as calling identify_machine first). Each call: - Returns canonical_data + a per-field mapping_id (use mapping_id with /v1/feedback/{mapping_id}/correct if a mapping is wrong) - Writes a row to forge_normalized_history (visible via query_machine_history) - Evaluates active triggers; the response includes a `triggers_fired` array if any condition matched. The actual webhooks fire async, so the array tells you what was triggered without

  • dataobjectrequired
  • machine_id
  • oem
  • model
  • serial
  • site
query_machine_history6 params

Retrieve operational history for an identified machine. Each row is one /v1/normalize call's canonical output (FCS field → value). Query options: from_dt, to_dt ISO-8601 timestamps to bound the time range fields comma-separated FCS field names to project; omit for full canonical_data limit max rows (1–1000, default 100) summary true → returns aggregate stats only (row_count, time range, avg coverage_pct, fields_covered set) without the raw rows. Always cheap. USE WHEN: a user asks how a machine has been running, wants utilization or throughput or health trends, looks for patterns in alarms or operational state, compares periods ("how was today vs yesterday"), or wants to know what data is even available for a machine. Prefer `summary=true` first to orient on volume + which fields are present, then drill in with field projection on a smaller time window.

  • mint_idstringrequired
  • from_dt
  • to_dt
  • fields
  • limitinteger
  • summaryboolean
create_automation2 params

Set up automated monitoring + actions for an industrial machine using natural language. Connect machine telemetry to any business system — ERP, CMMS, MES, Slack, Teams, email, Zapier, n8n — via webhooks already registered as tools on the Forge service. Examples of `instruction`: "Alert maintenance Slack when spindle load exceeds 90 percent." "Create a Fiix work order when coolant temperature stays above 35°C for five minutes." "Notify the supervisor when part_count hits 500." "When the maintenance_type changes to CORRECTIVE, post to the ops channel." Returns a `parsed_trigger` JSON for HUMAN review — DOES NOT auto-activate. The caller (you, with user confirmation) must explicitly POST the parsed_trigger to /v1/triggers on the Forge API to actually create it. The response includes `confirmation_required: true` and may include `notes` if the parser had to make a fuzzy match (e.g. resolved an ambiguous field name to its closest canonical match). USE WHEN: a user wants to

  • mint_idstringrequired
  • instructionstringrequired
activate_automation5 params

Activate a parsed automation trigger on a machine. Call this AFTER create_automation returns a parsed_trigger and the user explicitly confirms they want to arm it. Creates a live trigger that monitors the machine's normalized telemetry and fires the listed actions when the condition matches. Each action references a registered tool by tool_id; on fire, the tool's webhook is POSTed with {{variable}} interpolation against the canonical data context (mint_id, oem, model, serial, site, field, value, threshold, plus every canonical field on the matched record). Inputs: machine_id mint_id ("MINT-…") or internal_id; resolved to canonical mint_id name short human label, ≤ 80 chars (e.g. "high spindle load") condition simple {field, op, value|threshold} OR compound {all: [...]} ops: >, <, >=, <=, ==, != actions list of {tool_id, payload_overrides?, headers_overrides?} enabled defaults to true; pass false to create the trigger paused Returns the persi

  • machine_idstringrequired
  • namestringrequired
  • conditionobjectrequired
  • actionsarrayrequired
  • enabledboolean
list_automations1 param

List all active automations / triggers configured for one machine. Returns each trigger with: id, name, condition (field/op/value or compound `all`), actions (each resolved to its tool name + url + method), enabled state, fire_count, last_fired_at, last_error. USE WHEN: the user asks "what automations do I have on this machine" / "show me my triggers" / "what alerts am I getting" / "what's monitoring this machine right now". Always pass the machine's mint_id (or internal_id — both resolve).

  • machine_idstringrequired
disable_automation1 param

Pause an automation trigger without deleting it. The trigger stops evaluating against incoming /v1/normalize calls but its configuration (condition, actions, history) is preserved. Re-enable later by PATCHing /v1/triggers/{id} with `{"enabled": true}` (or by asking the user to confirm and creating a follow-up tool for resume). USE WHEN: the user wants to TEMPORARILY stop an automation — e.g. "pause the high-spindle alert during planned maintenance," "stop that alarm for now, I'll re-enable it tomorrow." Distinct from delete_automation, which is permanent.

  • trigger_idstringrequired
delete_automation1 param

Soft-deletes the trigger (recoverable for 30 days via restore_automation). The trigger immediately stops evaluating against /v1/normalize calls and is hidden from list_automations, but the row persists with deleted_at set so an accidental delete can be undone. Use restore_automation to undo. For permanent deletion, the API supports ?permanent=true. Past forge_trigger_executions rows for this trigger remain in either case (audit trail). USE WHEN: the user wants to remove an automation they no longer need — "delete the coolant alert," "remove that trigger." Safer than hard delete because misclicks are recoverable; tell the user about restore_automation if they later change their mind.

  • trigger_idstringrequired
query_webhook_history2 params

Show webhook delivery history for a trigger — HTTP status codes, response times, retry counts, errors. Use to verify webhooks are actually delivering. Returns up to `limit` most-recent execution rows (default 10, max 200), each with: fired_at, http_status, attempt_count, response_time_ms, error (if any), tool_name, target_url, and the on-chain settlement tx (settled_tx) once the row has been Merkle-rooted via batch settle. USE WHEN: a user asks "did the alert actually go out?" / "why didn't Slack get pinged?" / "is the trigger working?" / "show me the last few fires." Soft-deleted triggers can still be queried — useful for forensic audits after a misclick + restore.

  • trigger_idstringrequired
  • limitinteger
restore_automation1 param

Restore a previously soft-deleted automation trigger within its 30-day recovery window. Re-enables the trigger so it evaluates against incoming /v1/normalize calls again. Returns the restored trigger row plus `restored: true` and the `restored_at` timestamp. 410 (Gone) if the trigger was deleted more than 30 days ago and is past the restorable window. 409 if the trigger isn't actually deleted. USE WHEN: a user accidentally deleted a trigger and wants it back. Also useful as the "undo" half of a "delete then change my mind" flow — pair with disable_automation when the user wants to pause rather than delete in the first place.

  • trigger_idstringrequired
verify_on_chain3 params

Anchor data on Solana mainnet via the MINT relay for cryptographic proof of work. Two modes: BATCH MODE (`batch=true`, requires `mint_id`): Collects every unsettled event for that machine — normalize calls, trigger fires, webhook executions — since the last batch. Computes a Merkle root of their event hashes and anchors that single root on Solana. ONE transaction proves dozens to thousands of events. Returns: merkle_root, event_count, event_types breakdown, tx_signature, verify_url (Solscan link). Cost-efficient — call this once an hour or once a shift per machine, not per event. SINGLE-PAYLOAD MODE (`batch=false`, requires `payload`): Hashes an arbitrary JSON `payload` deterministically (sorted keys, no whitespace) and anchors the hash. Returns: payload_hash, tx_signature, verify_url. Use for one-off proofs — inspection records, completed work orders, signed reports — where you want a permanent independent timestamp. USE WHEN: a user wants tamper-proof evide

  • mint_id
  • payload
  • batchboolean
fire_sandbox2 params

Demo the full Forge watch→fire→settle loop against a built-in sandbox endpoint. Free tier; no machine onboarding required. The MCP server POSTs `{message, condition: condition_text, ts}` to its own /sandbox/echo route — a real HTTP round-trip with a real response body — then hashes the response and anchors it on Solana mainnet via the MINT relay. Returns the echo body, the tx_signature, and a Solscan verify_url. USE WHEN: a developer is evaluating Forge and wants to feel the full loop (a webhook actually fires, a real Solana tx actually settles, the Solscan link actually verifies) without onboarding any machines or paying for the Pro tier. 10 fires lifetime per fnet_ key.

  • condition_textstringrequiredA plain-English description of the condition the sandbox is simulating, e.g. "Spindle load crossed 85%".
  • messagestringThe payload text the sandbox webhook receives. Defaults to a representative example.
correct_mapping7 params

Teach Forge the RIGHT canonical field for a source column that normalize_telemetry mapped wrong (or abstained on). Each correction is recorded as a corpus-improvement signal the retrainer uses to fix the mapping for everyone — so every agent interaction makes normalization better. USE WHEN: you or the user can see normalize_telemetry returned the wrong canonical for a field (e.g. it mapped an oil-pressure column to a tire- pressure field), or it abstained on a field whose meaning you know. - source_field: the raw column name exactly as it appeared in your data. - confirmed_canonical: the canonical field it SHOULD map to. - original_canonical: what normalize_telemetry actually returned (pass the `canonical` from that field's entry; use "abstained" if it abstained). - oem: the OEM you passed to normalize_telemetry (improves aggregation). - mapping_id: optional — the `mapping_id` from the normalize_telemetry field entry. If omitted it is derived deterministically from (source_field,

  • source_fieldstringrequired
  • confirmed_canonicalstringrequired
  • original_canonicalstringrequired
  • oem
  • mapping_id
  • sample_value
  • confidence
get_coverage1 param

Ask Forge what it can normalize BEFORE you try: the recognized OEM verticals (CNC / robot / vehicle / AMR), the canonical-field families, and the field list per family. Optionally pass an `oem` to see which vertical it resolves to and whether the cross-vertical gate will engage. USE WHEN: starting a new integration, or deciding whether to call normalize_telemetry — confirm the machine's OEM and your fields are in coverage. Unknown OEMs still normalize (the gate just disables itself), so absence here is a soft signal, not a hard block.

  • oem
predict4 params

Forecast the next `horizon` readings of a canonical telemetry series using TimesFM (Google's time-series foundation model). Returns a point forecast plus quantile uncertainty bands (q0.1 … q0.9) — no per-machine training required. The kernel already normalizes raw OEM telemetry into canonical FCS fields; this predicts where a field is headed next. Args: time_series historical canonical values, oldest→newest (≥16 recommended) canonical_field the FCS field the series represents (e.g. "spindle_load_pct"), carried through for labeling/provenance horizon number of steps to predict (1–256, default 24) frequency accepted for forward-compat; TimesFM 2.5 auto-detects cadence USE WHEN: a user wants to know where a metric is trending — "what will spindle load look like over the next 2 hours", "project coolant temperature", "forecast throughput". For threshold/failure questions use predict_breach or remaining_life instead. PREMIUM (Pro tier) — run

  • time_seriesarrayrequired
  • canonical_field
  • horizoninteger
  • frequency
predict_breach7 params

Predict whether — and when — a canonical series will cross a threshold. This is the parametric-insurance primitive: it answers "will this machine's <field> exceed <threshold> within the forecast window, and how soon?". Returns will_breach, estimated_steps_to_breach, a confidence, and a quantile-derived breach_window {earliest, latest}. Every result carries a deterministic data_hash so the prediction is cryptographically provable. Pass a caller-owned `mint_id` to write a MINT audit event tying the prediction to a specific machine; add `settle=true` to anchor it on-chain (Solana) for an insurance-grade, tamper-evident record. Args: time_series historical canonical values, oldest→newest (≥16 recommended) threshold the value to test for a crossing (e.g. 95.0 for 95% load) canonical_field FCS field the series represents (e.g. "spindle_load_pct") direction "above" (default) or "below" — which side is the breach horizon steps to look ahead (1–256, defa

  • time_seriesarrayrequired
  • thresholdnumberrequired
  • canonical_field
  • directionstring
  • horizoninteger
  • mint_id
  • settleboolean
remaining_life7 params

Estimate a machine's remaining useful life before a failure threshold is crossed, with a maintenance recommendation. A maintenance-planning reframing of predict_breach: same TimesFM forecast, expressed as time-to-failure. Returns remaining_steps (None if no failure forecast), remaining_useful_life_pct (headroom to the threshold), failure_predicted, failure_window, a trend, and a recommendation — one of immediate_maintenance / schedule_maintenance / monitor / healthy. Same provenance + optional on-chain anchoring as predict_breach. Args: time_series historical canonical values, oldest→newest (≥16 recommended) failure_threshold the value whose crossing constitutes failure canonical_field FCS field the series represents (e.g. "bearing_vibration_mm_s") direction "above" (default) or "below" — failure side horizon steps to look ahead (1–256, default 96) mint_id / settle optional MINT provenance / on-chain anchoring (see predict_breach) USE WHE

  • time_seriesarrayrequired
  • failure_thresholdnumberrequired
  • canonical_field
  • directionstring
  • horizoninteger
  • mint_id
  • settleboolean
README.md

FoundryNet — Industrial Machine Intelligence

The cross-manufacturer industrial MCP server for machine monitoring. Talk to any CNC, robot, or industrial machine in natural language — machine identity, OPC UA / MQTT / Modbus telemetry normalization across 16 OEM families, plain-English automation, and tamper-evident on-chain work attestation and verification so every industrial action carries a verifiable trust record.

Hosted MCP over Streamable HTTP (legacy SSE still supported). 14 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, and settle work on Solana via the MINT relay so every state-changing action has a verifiable, tamper-evident hash.

  • Website: https://foundrynet.io
  • Docs: https://foundrynet.io/mcp-industrial · Free key: https://foundrynet.io/signup
  • MCP endpoint: https://foundrynet-mcp-production.up.railway.app/mcp (Streamable HTTP)
  • Legacy SSE: https://foundrynet-mcp-production.up.railway.app/sse (deprecated)
  • Health: https://foundrynet-mcp-production.up.railway.app/health
  • Server card: https://foundrynet-mcp-production.up.railway.app/.well-known/mcp/server-card.json

What it does

It normalizes raw OEM telemetry from 16 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 anchors every state-changing action on-chain via MINT for a tamper-evident work record.

Architecture

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

Claude Desktop / agent
        │ Streamable HTTP (mcp-remote bridge)
        ▼
  foundrynet-mcp on Railway
        │ HTTPS + Bearer fnet_…
        ▼
  forge.foundrynet.io/v1/*

Tools (14)

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. Attestation: verify_on_chain. Demo: fire_sandbox (the full watch → fire → settle loop, no card).

Free tier exposes the read-only tools; Pro ($49/mo) unlocks the full set.

Connect (Claude Desktop, Cursor, any MCP client)

claude mcp add --transport http foundrynet \
  https://foundrynet-mcp-production.up.railway.app/mcp \
  --header "Authorization: Bearer fnet_YOUR_KEY"

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

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

Get a free fnet_ key at https://foundrynet.io/signup (50 normalize calls, no card).

Required environment (server-side)

Var Required Default
FOUNDRYNET_API_KEY Yes — (server boots; tool calls return 401 until set)
FORGE_BASE_URL No https://forge.foundrynet.io
PORT No 8080 (Railway sets this automatically)
REQUEST_TIMEOUT No 30 (seconds)

Files

  • mcp_server.py — the server (14 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.txtfastmcp>=2.0, httpx>=0.27
  • Procfile — Railway start command (web: python mcp_server.py)

Resources

License

Proprietary (commercial). © FoundryNet. Contact: hello@foundrynet.io

Recommended MCP Servers

How it compares

Industrial machine-intelligence MCP, not a generic docs or VPS deploy server.

FAQ

What does FoundryNet - Industrial Machine Intelligence do?

The cross-manufacturer industrial MCP server for **machine monitoring**.

When should I use FoundryNet - Industrial Machine Intelligence?

The cross-manufacturer industrial MCP server for **machine monitoring**. Talk to any

Is FoundryNet - Industrial Machine Intelligence safe to install?

Review the Security Audits panel on this page before installing in production.

Developer Toolsintegrations

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.