MCP Tool Map
The tools that Ask (chat) AI and automations can call come from seven MCP servers. This page lays out which server handles what, and why the AI sometimes doesn't use a tool even though it exists.
묻기(코파일럿) 의 AI
│
┌────────────┬────────────┬─────────┼──┬────────────┬────────────┬────────────┐
▼ ▼ ▼ ▼ ▼ ▼ ▼
플랫폼 통합 시계열 인사이트 RAG 문서 이해 비전 디지털 스레드 공학 계산
/api/v5/mcp insight_ 39개 rag_ 2개 document_ 2개 vision_ 5개 thread_ 4~9개 eng_ 4개
22개
«공장의 실제 «파형을 보고 «문서에서 «PDF·표를 «사진을 «무엇이 언제 «공식으로
데이터» 판단» 찾는다» 읽는다» 본다» 일어났고 무엇과 계산한다»
이어졌나»
The copilot does not attach these servers directly. From 2026.10 re-release (2026-10-20), a single MCP Gateway (plantpulse-mcp-gateway-api, internal 7160)
gathers the tools of the platform · built-in servers · external servers the operator has attached, and the copilot looks only at that one address. The gateway registers the built-in servers itself at installation.
Tools enabled at first — gateway policy
Whether a tool is on or off when first discovered is decided by the MCP Gateway's policy. The place to change on/off is AI Admin Console › MCP Gateway › Tools → AI Admin Console — MCP Gateway
| Server | When first discovered |
|---|---|
| Platform Integration MCP | All on |
Time series insights insight_ | 34 on — of the 39, the one write tool (trigger_feature_pipeline, cannot be enabled) and the four forecast_order_completion · autonomy_status · get_oee_losses · get_spc_chart are off → Time series insights tools |
Digital Thread thread_ | 9 on — all the read tools |
Engineering calculation eng_ | 4 on — all four |
RAG rag_ | 2 on — rag_search (document search) · rag_list_documents |
Document Understanding document_ | 2 on — document_understand · document_profiles |
Vision vision_ | 5 on — vision_read_meter · vision_inspect · vision_ocr · vision_analyze · vision_classify |
| External servers attached by the operator | Off — read each tool's description and enable it |
- The lists are written by name. When a new tool appears on a built-in server, it comes in disabled.
- A value an administrator has changed once stays in the gateway DB, and neither a restart nor an upgrade overwrites it.
- 🔴 Document search in chat goes only through
rag_search. If this tool is off or not allowed for the account, manual · drawing · procedure questions are answered with "Document search is turned off or not allowed for this account." - 🔴 Enabling this many assumes that tool search is on. For each question the gateway picks up to 20 matching tools (the budget) and loads them for the model,
and
search_domains, which finds name → ID, and document searchrag_searchare always loaded separately regardless of the budget (when allowed for the account). If you turn search off in Search Settings, the model receives all 70-some enabled tools for every question. - Search picks tools by their search terms as well as their name · description. Tool descriptions are in English, so these are words that link Korean questions to tools; they are used only in keyword search and are not shown to the model.
The sources win in the order this installation's override › server declaration › gateway default (platform integration MCP). An external MCP server can declare them in the tool's
_meta["io.plantpulse/search_terms"]as in{"ko": ["알람 확인 처리"]}. Per tool, up to 4 languages and 8 terms · 64 characters across all languages; anything beyond is discarded entirely → AI Admin Console — Tool search terms
In older releases (up to re-release 8) the copilot held the on/off values, and for time series insights only a few such as get_attention_ranking were on.
When you upgrade to re-release (2026-10-20) those values are not carried over and everything restarts from the policy above. If you deliberately turned off tools in the older release, turn them off again after upgrading.
There are two reasons for this.
- Throw dozens of tools at an AI and it fails to pick the right one.
- Descriptions of tools you will never use consume tokens on every request.
So the tools to enable are fixed by policy, and among the enabled ones, search narrows them down for each question.
Even after you add an external server to the gateway and read its tools, neither the AI nor automations can use anything. You must enable the server, enable each tool, and allow it for the caller (the copilot) under Permissions. An external tool's description goes into the model prompt as-is, so read it before enabling.
This is the first thing to check when "the tool exists but the AI won't use it" → AI Admin Console — MCP Gateway
Tools that change state are hidden automatically and blocked by policy. The single exception is alarm acknowledgement (ack_alarm), and even that passes only after the target equipment scope has been verified. There is no mechanism at all for controlling equipment or changing settings.
Platform Integration MCP — 22 tools
The actual factory data. Platform (server-web) serves it over /api/v5/mcp and authenticates with api_key.
| Axis | Tool | What it does |
|---|---|---|
| Time | get_current_time | Current server time |
| Structure | search_domains | Resolve an ID by searching on name (usually the starting point) |
| Structure | get_asset_tree | Asset hierarchy tree |
| Structure | get_ontology | Site ontology overview |
| Structure | query_ontology | Traverse the asset relationship graph |
| Structure | query_sparql | Ontology SPARQL query |
| Structure | get_asset_documents | List of documents attached to equipment |
| Connection | get_edge_status | Edge gateway status |
| Connection | get_edge_health_history | Edge health history (daily intervals) |
| Connection | list_connections | List of OPC collection connections |
| Tag | get_tag_values | Current tag value |
| Tag | get_tag_history | Tag history over a period |
| Alarm | list_alarms | Alarm list |
| Alarm | get_alarm_context | Alarm root-cause diagnostic bundle |
| Alarm | ack_alarm | Alarm acknowledgement — 🔴 the only write tool |
| Equipment | get_asset_snapshot | Snapshot of all tags on a piece of equipment |
| Equipment | get_asset_timeline | Equipment event timeline |
| Equipment | get_asset_stats | Equipment business statistics over a period |
| Production | list_orders | Work order list |
| Production | get_order_metrics | Work order detail · KPIs |
| Production | get_asset_kpi | Per-order equipment KPIs (OEE/EMS/RAM) |
| Rollup | get_health | Asset hierarchy health rollup |
People say "the line 3 compressor" while tools take IDs. search_domains bridges the two — if the AI picked the wrong equipment, that is usually where it diverged.
Usage is covered in MCP Server Management; the ontology tools are detailed in Ontology.
Time Series Insights — 39 insight_ tools
The side that looks at waveforms and judges. Anomaly detection, prediction, historical comparison, equipment summaries, alarm statistics, profiling, and — from 2026.10 — AI findings, equipment to watch, and production analysis (order completion forecast · OEE loss · control charts).
→ Full list of time series insight tools
RAG — 2 rag_ tools
| Tool | What it does |
|---|---|
rag_search | Finds relevant documents in hybrid mode and returns an answer with sources. Each source's reference_id pairs with the [n] in the answer body |
rag_list_documents | List of indexed documents |
When the search retrieves nothing, rag_search returns success: false · retrieved: false along with code (NO_CONTEXT · EMPTY_ANSWER) · reason and does not include answer.
This prevents the AI from receiving an empty result as "search results" and fabricating an answer from its own knowledge — the AI replying "I could not find this in the documents" is normal behavior.
Document Understanding — 2 document_ tools
| Tool | What it does |
|---|---|
document_understand | Converts a single document at a URL into structured markdown — recognizing tables, layout, and formulas. PDF · DOCX · PPTX · XLSX · images |
document_profiles | List of selectable parsing profiles |
| Profile | Use |
|---|---|
default | Same options as RAG indexing — for checking "how did RAG read this document?" |
fast | Fast — OCR off, tables handled roughly |
ocr | Text only — reads characters from images (table structure recognition off) |
scan | Scanned originals — ignores the text layer and OCRs everything |
If each caller picked its own parsing options, the same document would be read differently depending on who called. So the policies are bundled into profiles — for anything in the "tables come out broken" category, switching profiles is the first move.
Even if the parser reports success, an empty body comes back as ok: false (the REST response is status: "empty"). This usually means a scan with no text layer was read without OCR, so call again with the scan or ocr profile.
The per-document limit defaults to 200 MiB (MAX_DOCUMENT_BYTES); anything larger is rejected (413 over REST). The agent path waits for the result but returns a failure once MCP_WAIT_TIMEOUT (300 seconds by default) is exceeded.
Vision — 5 vision_ tools
Looks at photos. Stateless — images are processed and discarded, never stored.
| Tool | What it does |
|---|---|
vision_read_meter | Reads the indicated value on an instrument (gauge or digital display) |
vision_inspect | Finds defects in equipment photos — oil leaks, corrosion, cracks, breakage, foreign matter, overheating |
vision_ocr | Reads text in a photo — nameplates, labels, signage, screens. Korean is transcribed as Korean |
vision_classify | Classifies into one of the supplied labels (requires 2 or more labels) |
vision_analyze | Ask anything about a photo |
Vision does not guess at ambiguous cases. If the same photo is judged several times and no consensus is reached, it refuses rather than inventing an answer — because in field judgment, a "plausible wrong answer" costs far more than "I don't know."
| Tool | Consensus rule |
|---|---|
vision_read_meter | 4 out of 5 — value and unit must match exactly (strictest) |
vision_inspect · vision_classify | 2 out of 3 — the judgment (label) must match |
vision_analyze | No consensus — free-form description, so do not use it for readings or pass/fail decisions |
vision_ocr | 2 out of 3 — the strings must match with whitespace removed. From the 2026.10 re-release, the served LLM does the reading (before that it was Document Understanding's docling OCR — which could not read Korean). The engine can be reverted with VISION_OCR_ENGINE → Environment Variable Settings |
Digital Thread — 4 to 9 thread_ tools
Shows what happened in the plant, in what order, and what is connected to what. It returns references to events and connections rather than values — measurements and KPIs belong to Platform Integration MCP or Time Series Insights.
| Tool | What it does | Default |
|---|---|---|
thread_get_timeline | What happened, in chronological order, to one piece of equipment, order, or tag — state changes, alarms raised/cleared, order start/finish, planned stops, plus copilot incidents, suggestions, and findings. The window is at most 31 days | On |
thread_trace_links | How objects are connected — equipment hierarchy, tags, supply/dependency between equipment, work instructions tied to equipment, processes, parts, orders run on equipment, incidents raised against equipment, suggestions. Give it two objects and it returns the shortest path | On |
thread_today_work | The supervisor's work list for today (today when date is omitted) — for each process planned that day or running on Platform: readiness, equipment status, the slack days and risk of the customer order it fulfills, the material POs being waited on, and the drawings and revision labels to use. Tightest customer slack first | On |
thread_impact_range | How far a late PO · supplier · equipment · defective lot reaches — work orders · customer orders · customers. Forward (where a delay reaches: from PO lines · suppliers · parts · equipment · design changes · maintenance work orders) or backward (quality trace: from lots · serial numbers · nonconformities · tools · samples). With as_of it gives the links as of a past point in time, and customer order lines carry the ERP due date and days remaining (D-n). Families that are not connected are «unknown», not «none» | On |
thread_interval_production | What was being made on that equipment during an equipment anomaly · alarm · stop interval — the work orders · lots · serial numbers in that interval (MES execution times) and the customer orders · customers those lots reach. The interval is at most 31 days. Without MES it is «unknown», not «nothing ran», and customers reached only through links created after the interval are listed separately from confirmed impact | On |
thread_explain_recovery | How far milestones slip when a part is late, plus recovery options (what-if) — the numbers come from the server's optimization solver and the AI only relays them. With PLM · QM connectors enabled it also reports added delay from design changes and nonconformities, and if SCM supplies supplier capacity it answers whether a late part can be pulled in. It also includes the affected customer order lines (customer_orders[]) and PO values where ERP and SCM disagree (purchase_order_conflicts[]) | On |
thread_work_readiness | Supervisor work readiness — GO · AT_RISK · NO_GO · UNKNOWN per process with item-level reasons | On |
thread_part_revision_status | Whether a part number · revision is the one currently approved for use — current · outdated · change_open · unknown | On |
thread_check_tooling | From the tool management connector — measurements taken with instruments that are overdue for calibration or have been dropped, tools used on a work order, candidate causes of nonconformities | On |
- All are read-only (called without approval). Results are trimmed to under 16,000 characters.
- The conditions for appearing in the server list differ. the four
get_timeline·trace_links·impact_range·interval_productionare always present;explain_recoveryappears when a source for its input (such as the connector registry) is configured; and the fourtoday_work·work_readiness·part_revision_status·check_toolingappear only when the connector registry (DT_PG_*·PI_DT_SECRET_KEY) is configured. Hence the range of 4 to 9. - From re-release (2026-10-20), all nine are on from the start (gateway policy). The place to turn them off is AI Admin Console › MCP Gateway › Tools → MCP Gateway
- Objects in the results of
trace_links·get_timeline·impact_range·interval_production(for the timeline, the events' subjects and the head) get the source system screen addressopen_urland the button textopen_labelonly when that system's connector has a link template. Otherwise neither field is present → Digital Thread — External links - Attaching connectors and populating the mirror is done in the admin console → Digital Thread
Engineering Calculation — 4 eng_ tools
Computes engineering values from formulas — bearing fault frequencies, NPSH, and the like. This is the server that keeps the model from estimating in its head. The server is plantpulse-engcalc-api (:7150 inside the stack, not exposed externally) and runs without a DB, volumes, or an LLM. There is no separate switch — it comes up with the stack, always.
| Tool | Display name | What it does | Default |
|---|---|---|---|
eng_list_formulas | Engineering formula list | List of formulas available for calculation | On |
eng_formula | Engineering formula calculation | 29 named formulas — returns the answer along with units, substitution steps, and the source | On |
eng_unit_convert | Unit conversion | Convert units | On |
eng_calc_eval | Expression evaluation | Evaluates expressions such as arithmetic and exponentiation. Only permitted operations are solved, with limits on exponents, length, and time (it does not run programs) | On |
- All are read-only and are therefore called without approval.
- The key is the same
PI_INBOUND_API_KEYused by the other backends. If it is empty, the server refuses to start.
External system connectors are not attached here
MCP connectors for external systems such as MES · SCM · ERP · PLM · QM are registered under AI Admin Console → Digital Thread → Integration Map. They are enabled only after passing a conformance test there, and the copilot uses them through the Digital Thread server.
- If you attach one to the MCP Gateway as an external server, its connector tools (those starting with
mes_·scm_·sched_·erp_·plm_·qm_·cmms_·tool_·wms_·lims_·ehs_) cannot be enabled — only the Digital Thread relays these tools. - If you had external connectors registered with the copilot in an older release, those records are deleted in re-release (2026-10-20). Register them again in the Integration Map and re-enter the credentials → Digital Thread
Tools that take a URL — internal addresses are rejected
The Document Understanding and Vision tools take a URL, not a file. That URL is a string the AI produced, so accepting it without restriction would let the AI have something read on its behalf that is only reachable from inside the container. So it is blocked at the entry point.
- Only
http·httpsare accepted. - If the address resolves to loopback · private ranges (10/8 · 172.16/12 · 192.168/16) · link-local (including cloud metadata), it is rejected. Redirects are re-checked at every hop.
- Size limits — 200 MiB for documents, 32 MiB for photos.
On rejection the tool returns ok: false and a refused to fetch … reason.
Documents and photos at internal addresses, such as http://192.168.x.x/…, are rejected by default. List the hosts you want opened in FETCH_ALLOWED_HOSTS (comma-separated for multiple; empty by default) in /etc/kopens/plantpulse-ai.env, and compose passes it to both Document Understanding and Vision (as of the 2026.10 re-release).
- The entry must exactly match the URL's host name (case-insensitive). Appending a port, as in
files.example.local:8080, allows only that port. For a server addressed by IP, write the IP as-is. There are no wildcards or ranges. - Allowed hosts are still subject to
http·httpsand the size limits, and a redirect to another internal address is rejected at that point. - After editing, recreate the two services with
bin/restart.sh plantpulse-document-understanding-api plantpulse-vision-api.
Naming convention
Backend tool names are snake_case (vision_read_meter). The prefix is added by the MCP Gateway, so the name you see in the server documentation (read_meter) may differ from the name used in chat (vision_read_meter).
- If two servers expose the same name, the one registered first wins and the later one is not exposed (shown as a conflict on the Tools screen). Resolve it by changing the later server's prefix.
🔴 Do not transcribe tool lists by hand. The source of truth for the installation's state (what is on) is the gateway DB; the screen is
AI Admin Console › MCP Gateway › Tools, and the complete list is the gateway REST GET /api/v1/tools. The gateway re-reads each server's tool list at startup and every 5 minutes,
and you can also make it re-read on the spot with Rediscover on the Servers screen.
The other direction — the copilot is also an MCP server
Everything so far has been about the copilot «using» tools. In the other direction, another AI agent can use the copilot as a tool, because the copilot exposes its own capabilities over MCP.
| Item | Value |
|---|---|
| Endpoint | POST /mcp (a trailing-slash /mcp/ is also accepted) |
| Protocol | JSON-RPC 2.0 |
| Authentication | Same as /api/v1 — X-API-Key only (from 2026.10 re-release 6, login sessions get 403) |
| Tool | What it does |
|---|---|
ask_plant | Natural-language question → answer. The copilot picks the query tools it needs on its own, and the supporting evidence comes with the answer. It asks with the permissions of the API key's principal (the person the key was issued to), and leaving sessionId empty opens a new conversation owned by that principal |
list_plant_tools | List of query tools the copilot can reach «right now» |
daily_tasks | Morning card (KST) |
Tools that change things have a human approval step attached, and a caller coming in over MCP knows nothing about that step. So only queries are exposed.
The three are functionally identical to /api/v1 and delegate to the same implementation — the same capability exposed over two protocols, with one copy of the code. Two copies means only one of them gets fixed.
Both /mcp and /mcp/ work. Clients differ in which form they call, and that single character bouncing every call with a 307 has actually happened. Callers of our endpoint will not step into that trap.
Related documents
- MCP Server Management — enabling and disabling, connection testing
- Time Series Insight Tools — all 39
- Digital Thread — connectors · graph mirror ·
thread_tools - Automation — what an automation can choose from are the enabled read tools among these
- Architecture — where these servers live