Skip to main content
Glama
E37dey

factory-floor-mcp

by E37dey

factory-floor-mcp · שרת MCP לנתוני רצפת ייצור

ci python MCP license

שרת MCP לקריאה בלבד שנותן ל-Claude (או לכל לקוח MCP) גישה בטוחה לנתוני ייצור: מכונות, יומן ייצור, השבתות, פסולים, הזמנות עבודה ומלאי. הנתונים מגיעים מקובץ Excel (למשל ייצוא לילי מ-SAP או מ-MES), או ישירות מ-SAP S/4HANA דרך OData.

מנהל מפעל שואל בעברית "למה ה-OEE ירד השבוע?" או "אילו הזמנות יאחרו בגלל חוסר בחומר?". Claude קורא לכלים של השרת, מקבל מספרים מדויקים שחושבו בקוד, ועונה עם הסבר. השרת לא משנה אף נתון, מסתיר עמודות רגישות לפי מדיניות, ורושם כל קריאה ביומן ביקורת.

נתוני הדוגמה בריפו בדויים: מפעל קטן לעיבוד שבבי מדויק עם 8 מכונות CNC בשני קווים, יולי עד ספטמבר 2026.

מה אפשר לשאול

שאלה של משתמש

הכלים ש-Claude מפעיל

"תן לי תמונת מצב של החודש מול החודש הקודם"

production_kpis

"איזו מכונה הכי בעייתית, ולמה?"

machine_oee, downtime_pareto עם machine_id, downtime_events

"מה גורם לרוב ההשבתות בקו B?"

downtime_pareto עם line

"אילו הזמנות באיחור, ואילו בסיכון לשבוע הבא?"

late_work_orders

"מה ייגמר לנו לפני שהספק יספיק לספק?"

inventory_alerts

"איפה הכי הרבה פסולים?"

scrap_summary

"מה קרה עם WO-26043?"

search_records

"הכן דוח משמרת למנהל"

הפרומפט המובנה shift_report

Related MCP server: MCP SQL Server Gateway

תמונת מצב: 2026-08-26 עד 2026-09-24

  • OEE: 74.3% (-1.5 נקודות מול התקופה הקודמת)

  • זמינות 88.5% · ביצועים 85.8% · איכות 97.8%

  • השבתות לא מתוכננות: 234.1 שעות

  • אספקה בזמן: 69.2% (27 מתוך 39 הזמנות שהושלמו)

שלוש המכונות עם ה-OEE הנמוך

  • CNC-08: 66.5% (זמינות 89.3%, ביצועים 75.6%, איכות 98.5%)

  • CNC-04: 71.1% (זמינות 83.6%, ביצועים 86.8%, איכות 98.1%)

  • CNC-05: 71.2% (זמינות 84.9%, ביצועים 87.3%, איכות 96.0%)

סיבות ההשבתה המובילות

  • תקלת ציר: 3,950 דקות, 39 אירועים (28.1%)

  • המתנה לחומר גלם: 3,259 דקות, 72 אירועים (23.2%)

  • חוסר מפעיל: 2,110 דקות, 35 אירועים (15.0%)

הזמנות באיחור: 17

  • WO-26075 · מקדח קרביד 12 מ״מ · 1000 יח׳ · 61 ימי איחור · ממתין לחומר

  • WO-26043 · תותב הברגה M12 · 250 יח׳ · 51 ימי איחור · ממתין לחומר

  • WO-26092 · מקדח קרביד 12 מ״מ · 100 יח׳ · 50 ימי איחור · ממתין לחומר

חומרים מתחת לנקודת ההזמנה: 3

  • אינסרט חריטה CNMG: 4.8 ימי מלאי, זמן אספקה 5 ימים · ייגמר לפני שהספק יספיק לספק

  • מוט קרביד 12 מ״מ: 6.1 ימי מלאי, זמן אספקה 21 ימים · ייגמר לפני שהספק יספיק לספק

  • נוזל קירור (ליטר): 7.7 ימי מלאי, זמן אספקה 7 ימים

זה בדיוק סוג הקשר ש-Claude צריך למצוא: הזמנות של מקדח 12 מ״מ מחכות לחומר, ומוט הקרביד של 12 מ״מ מתחת לנקודת ההזמנה עם זמן אספקה של שלושה שבועות.

כלים, משאבים ופרומפטים

כלי

מה הוא מחזיר

list_datasets

הטבלאות, מספר שורות, טווח תאריכים ואילו עמודות מוסתרות

production_kpis

OEE ושלושת רכיביו, חלקים תקינים ופסולים, שעות השבתה, אספקה בזמן, הזמנות באיחור, חוסרי מלאי. בהשוואה לתקופה הקודמת באותו אורך

machine_oee

OEE לפי מכונה, קו, יום או משמרת, מהגרוע לטוב

downtime_pareto

השבתות לפי סיבה, עם אחוז מצטבר ו"המעטים החשובים" (80% מהדקות)

downtime_events

אירועי השבתה בודדים להעמקה. שמות מפעילים מוחלפים בכינוי קבוע

scrap_summary

כמות ושיעור פסולים לפי סיבה, מכונה או מוצר

get_work_orders

הזמנות לפי סטטוס, קו, מוצר וטווח תאריכי יעד

late_work_orders

הזמנות באיחור והזמנות בסיכון לימים הקרובים

inventory_alerts

חומרים מתחת לנקודת ההזמנה, ימי מלאי, האם ייגמרו לפני אספקה, והצעת כמות להזמנה

search_records

חיפוש חופשי ברשומות (לא בעמודות מוסתרות)

משאבים: factory://schema (מילון נתונים עם סיווג לכל עמודה), factory://policy (מה השרת רשאי להחזיר), factory://audit/recent (50 הקריאות האחרונות). פרומפטים: shift_report (דוח ייצור יומי למנהל, בעברית), downtime_rca (ניתוח שורש להשבתות של מכונה).

כל הכלים מסומנים readOnlyHint. הקלט עובר ולידציה (תאריכים, מזהים, טווחים), וקלט שגוי מחזיר שגיאה ברורה ולא ניחוש.

ארכיטקטורה

flowchart LR
  subgraph Clients["לקוחות MCP"]
    CD[Claude Desktop / Claude Code<br/>stdio]
    CE[Claude Enterprise / סוכנים<br/>Streamable HTTP + Bearer]
  end
  subgraph Server["factory-floor-mcp (קריאה בלבד)"]
    T[כלים · משאבים · פרומפטים] --> AN[analytics.py<br/>OEE · פארטו · איחורים · מלאי]
    T --> G[governance.py<br/>סיווג · הסתרה · תקרת שורות · יומן ביקורת]
    AN --> SRC{RoutedSource}
  end
  CD --> T
  CE -->|NGINX / Cloudflare / IIS| T
  SRC --> XL[(Excel<br/>ייצוא לילי מ-SAP / MES)]
  SRC -.->|work_orders| SAP[(SAP S/4HANA<br/>OData V2)]
  G --> LOG[(audit.jsonl)]
  • חישובים בקוד, לא במודל. OEE, פארטו, ימי מלאי ואיחורים מחושבים ב-analytics.py עם בדיקות יחידה. המודל מסביר ומקשר, ולא עושה חשבון.

  • מקור נתונים לכל טבלה. RoutedSource מאפשר, למשל, הזמנות עבודה מ-SAP ושאר הטבלאות מ-Excel. קובץ Excel נטען מחדש אוטומטית כשהוא משתנה בדיסק.

  • הפרדה בין פרוטוקול ללוגיקה. create_server() מקבל מקור, מדיניות ויומן, ולכן כל שכבה נבדקת בנפרד.

ממשל נתונים ואבטחה

עיקרון

איך זה ממומש

קריאה בלבד

אין אף כלי שכותב. הקוד לא מכיל קריאות כתיבה ל-SAP או לקובץ

סיווג מידע

לכל עמודה רמה: ציבורי, פנימי או חסוי (governance.py). ברירת המחדל מחזירה עד "פנימי"

הסתרה

שמות לקוחות, מחירים ועלויות מוחלפים ב-[מוסתר]. שמות מפעילים מוחלפים בכינוי קבוע (עובד-1A2B3C), כך שאפשר לנתח לפי מפעיל בלי לחשוף זהות. עמודות מוסתרות לא ניתנות לחיפוש

מזעור

תקרת שורות לכל תשובה (FACTORY_MCP_MAX_ROWS), וכל רשימה מציינת אם נחתכה

יומן ביקורת

כל קריאה, כולל כאלה שנכשלו, נרשמת ב-JSONL: זמן, כלי, פרמטרים, מספר שורות, משך ושגיאה

אימות ב-HTTP

Bearer token חובה (לפחות 24 תווים, השוואה בזמן קבוע), ומטא-דאטה של OAuth Protected Resource לפי מפרט MCP. בלי טוקן השרת מסרב לעלות ב-HTTP

הרצה בקונטיינר

משתמש לא-root, מערכת קבצים לקריאה בלבד ב-compose, והשרת חשוף רק דרך NGINX עם TLS

הגדרות: FACTORY_MCP_MAX_LEVEL (public / internal / confidential), FACTORY_MCP_MAX_ROWS, FACTORY_MCP_AUDIT_LOG, FACTORY_MCP_SALT (למלח הכינויים), FACTORY_MCP_TOKEN.

התקנה וחיבור

pip install git+https://github.com/E37dey/factory-floor-mcp

Claude Code:

claude mcp add factory-floor -- factory-floor-mcp --data /exports/plant.xlsx
# או לשרת מרוחק:
claude mcp add --transport http factory-floor https://mcp.plant.example/mcp --header "Authorization: Bearer $FACTORY_MCP_TOKEN"

Claude Desktop: מוסיפים ל-claude_desktop_config.json את הבלוק שב-examples/claude_desktop_config.json.

שרת בארגון (Docker + NGINX):

docker build -t factory-floor-mcp .
cd deploy && FACTORY_MCP_TOKEN=$(openssl rand -hex 32) docker compose up -d

deploy/nginx.conf חושף רק את /mcp ואת המטא-דאטה של OAuth, עם buffering כבוי (התשובות יכולות לזרום). אותו עיקרון חל מאחורי Cloudflare Tunnel או IIS עם ARR.

חיבור לנתונים שלכם

Excel: חוברת עם גיליון לכל טבלה ושורת כותרת. שמות העמודות כמו בקובץ הדוגמה (scripts/make_sample_data.py מתעד אותם). מצביעים עליה עם --data או FACTORY_MCP_DATA.

SAP S/4HANA: מגדירים SAP_ODATA_BASE (שירות API_PRODUCTION_ORDER_2_SRV), משתמש טכני לקריאה בלבד (SAP_USER / SAP_PASSWORD) או SAP_TOKEN, ואופציונלית SAP_PLANT. הזמנות העבודה ייקראו מ-SAP, עם דפדוף וסינון לפי מפעל, והשאר מ-Excel. המיפוי בין שדות SAP לעמודות נמצא במילון FIELD_MAP ב-sap.py.

המתאם ל-SAP נבדק מול תשובות OData מדומות בלבד, לא מול מערכת SAP חיה. שמות השדות לקוחים מהתיעוד הציבורי של SAP, וכדאי לאמת אותם מול המערכת שלכם.

בדיקות

25 בדיקות pytest רצות ב-GitHub Actions על Python 3.10 ו-3.12, ואחריהן בנייה של קונטיינר ובדיקה שהוא מסרב לבקשות בלי טוקן:

  • חישובים: OEE לפי ההגדרה המקובלת, פארטו עם אחוז מצטבר, איחורים והזמנות בסיכון, התראות מלאי, השוואה לתקופה קודמת, ועקביות של נתוני הדוגמה.

  • ממשל: הסתרה לפי רמה, כינויים קבועים, הגדרות מסביבה, יומן ביקורת בקובץ.

  • פרוטוקול MCP: לקוח MCP אמיתי מול השרת (בזיכרון ובתהליך stdio נפרד): רשימת כלים וסכמות, תקרת שורות, דחיית קלט שגוי, הסתרה בחיפוש, משאבים ופרומפטים, רישום של קריאות שנכשלו.

  • SAP: פענוח תאריכי OData, מיפוי סטטוסים, דפדוף, סינון לפי מפעל וכותרת אימות, והשרת כשהזמנות העבודה מגיעות מ-SAP.

  • HTTP: 401 בלי טוקן או עם טוקן שגוי, 200 עם טוקן נכון, ומטא-דאטה של OAuth.

pip install -e ".[dev]"
pytest -q
python examples/morning_brief.py

מגבלות ידועות

  • טוקן משותף אחד מתאים לפריסה פנימית. לגישה לפי משתמש מחליפים את StaticTokenVerifier באימות מול ספק הזהויות של הארגון (למשל Entra ID) וממפים קבוצות להרשאות.

  • המתאם ל-SAP מכסה הזמנות ייצור בלבד, ולא נבדק מול מערכת חיה.

  • בנוי על MCP Python SDK מסדרה 1.x (נעול ל-<2). המעבר לסדרה 2.x עוד לא נעשה.

  • נתוני הדוגמה בדויים.


English summary

factory-floor-mcp is a read-only Model Context Protocol server that gives Claude safe access to manufacturing data: machines, production log, downtime, scrap, work orders and inventory, from an Excel export or SAP S/4HANA (OData V2).

  • 10 tools (OEE by machine/line/day/shift, downtime Pareto with vital few, late and at-risk orders, inventory alerts with stock-out-before-delivery, scrap, plant KPIs vs previous period, search), 3 resources (schema with classification, policy, recent audit), 2 prompts (daily shift report, downtime RCA).

  • All numbers are computed in code and unit-tested; the model explains them.

  • Governance: read-only, column-level classification, masking and stable pseudonyms for people, row caps, JSONL audit log of every call including failures.

  • Transports: stdio for Claude Desktop / Claude Code; Streamable HTTP with bearer-token auth and OAuth protected-resource metadata; Docker image (non-root) with an NGINX reverse-proxy example.

  • 25 pytest tests including protocol-level tests with a real MCP client and a stdio subprocess; CI builds the container and checks it rejects unauthenticated calls.

  • Built on the MCP Python SDK 1.x (pinned <2). The SAP adapter is tested against mocked OData responses only.

Sample data is fictional. MIT License.

Available Tools

10 tools
downtime_eventsA
Read-only

Individual downtime events (newest first) for drill-down after downtime_pareto. Operator names are pseudonymized by policy.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
reasonNo
date_toNoISO date YYYY-MM-DD
date_fromNoISO date YYYY-MM-DD
machine_idNoMachine id, for example CNC-05

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already covering the safety profile, the description adds two genuinely useful behavioral facts: results are ordered newest first, and operator names are pseudonymized by policy. The latter is a real data-handling disclosure an agent could not infer from annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, with the resource and ordering front-loaded and the drill-down relationship second. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is unnecessary, and the description covers purpose, ordering, privacy handling, and the drill-down relationship. The missing element is any pointer to the available filters, which matters for a tool whose parameters are largely undocumentmented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema coverage at only 60%, the description must compensate. It adds nothing about the parameters — notably 'reason' and 'limit' are undocumented in both schema and description, and nothing tells the agent that machine_id, reason, or date range can be used to narrow the drill-down.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific resource (individual downtime events) and a clear scope ('newest first'), and explicitly frames itself as a drill-down companion to downtime_pareto, distinguishing it from that sibling's aggregate view. It stops short of an explicit verb like 'list', but the retrieval intent is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'for drill-down after downtime_pareto' states exactly when an agent should reach for this tool and positions the sibling as the entry point. It provides no exclusions or negative guidance, but the triggering context is explicit rather than implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

downtime_paretoA
Read-only

Downtime by reason, largest first, with share and cumulative share (Pareto). vital_few lists the reasons that make up the first 80% of lost minutes. Planned maintenance is excluded unless asked.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNo
lineNoProduction line
date_toNoISO date YYYY-MM-DD
date_fromNoISO date YYYY-MM-DD
machine_idNoMachine id, for example CNC-05
include_plannedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint, so the description carries most of the behavioral load and does it well: default exclusion of planned maintenance, largest-first ordering, cumulative share output, and the meaning of the `vital_few` grouping. It stops short of mentioning aggregation window or empty-result behavior, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences; the primary behavior (ranked downtime with cumulative share) leads, and the one notable default (planned maintenance excluded) follows. No filler or restated field names.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and the description supplies the default-exclusion rule and the vital_few semantics an agent needs to interpret results. Only the filter parameters' interactions (line/machine/date range together) go unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverate is 67% and the description touches only `include_planned` ('unless asked') and implies a top-N cutoff via vital_few. It says nothing about `top` (default 10, max 20), `line`, `machine_id`, or the date range semantics, so it adds little beyond the documented schema fields. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Downtime by reason') and the exact output shape: sorted descending with share and cumulative share. The reference to pareto/vital_few makes it unambiguous that this is an analysis tool rather than a raw event list like downtime_events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives one scoping rule ('Planned maintenance is excluded unless asked') which shapes when the tool is appropriate, but never contrasts it with siblings such as downtime_events or machine_oee, nor states when a Pareto view beats a plain event listing. Usage is implied rather than guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_work_ordersA
Read-only

Work orders filtered by status, line, product and due-date range, sorted by due date. Customer names and prices are withheld unless the server policy allows confidential data.

ParametersJSON Schema
NameRequiredDescriptionDefault
lineNoProduction line
limitNo
due_toNoISO date YYYY-MM-DD
statusNoOrder status in Hebrew
due_fromNoISO date YYYY-MM-DD
product_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply readOnlyHint, so the description carries the burden and adds genuinely useful behavior: customer names and prices are masked unless server policy permits confidential data. That is a non-obvious output trait an agent must know. It omits any note on pagination/limit behavior or result size, which keeps it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core filtering/sorting purpose and no filler. The opening is a fragment rather than a full sentence, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return value structure needn't be explained, and the description covers filtering, sorting, and the data-masking caveat. The main gap is the failure to distinguish this from late_work_orders, which is the most likely selection error for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, so the schema documents most parameters including the Hebrew status enum values and ISO date formats. The description merely restates the same filter fields (status, line, product, due dates) without adding format or boundary detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

It states a specific resource (work orders) plus the filter dimensions (status, line, product, due-date range) and the sort order, which is more than a bare tautology. However, it does not differentiate itself from the sibling late_work_orders, which appears to be a closely related view an agent could easily confuse it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance and no mention of alternatives, despite a directly competing sibling (late_work_orders) existing. The filtering capabilities imply a use case but the agent is left to infer when this tool is the right choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inventory_alertsA
Read-only

Materials at or below their reorder point, with days of cover, whether they will run out before a new delivery can arrive (lead time), and a suggested order quantity. Most urgent first.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuine behavioral context beyond that: the result is sorted most-urgent-first, and the 'will they run out before a new delivery can arrive' logic explains how lead time is factored into the alert.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence that front-loads the core condition (at/below reorder point) and then appends the derived fields, plus a short ordering note. No filler, no repetition of the name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters, an output schema present, and readOnlyHint set, the description needs only to orient the agent, which it does well. It slightly underspecifies scope (all materials vs. a subset, freshness of the data), but nothing essential to calling it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics for the description to explain; the baseline for a parameterless tool is 4. The schema is empty and fully consistent with the description's implication that the tool returns a global alert list.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (materials at or below reorder point) and states exactly what the tool reports, including the computed fields. It is unambiguous against siblings such as machine_oee or downtime_pareto, but it never explicitly distinguishes itself from adjacent supply-chain tools like late_work_orders or get_work_orders.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent can infer this is the tool to call when it wants reorder/exhaustion risk, and the 'most urgent first' ordering hints at triage use. There is no explicit statement of when to prefer this over siblings or when it does not apply.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

late_work_ordersA
Read-only

Orders past their due date and not completed (most late first), plus orders due within horizon_days that have not started or are waiting for material. Default as_of: the day after the last production record.

ParametersJSON Schema
NameRequiredDescriptionDefault
as_ofNoISO date YYYY-MM-DD
horizon_daysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint, so the description carries the rest of the burden: it discloses output ordering ('most late first') and resolves the real default for as_of ('the day after the last production record'), which the schema leaves as null. It does not mention result limits or pagination behavior, which keeps it out of 5 territory.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences, front-loaded with the primary result set and followed by the forward-looking complement and the default. Efficient overall, though the backtick-formatted parameter references make it slightly denser than it needs to be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only filtered query with an output schema already defining return shape, the description covers scope, ordering, and defaulting behavior adequately. The remaining gap is that result-count or truncation behavior is never mentioned.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50% (horizon_days has no schema description), and the description compensates by explaining horizon_days as the forward-looking due-date window and by supplying the effective default for as_of that the schema omits. It adds no detail on boundaries or the unit relationship, so not a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description defines the exact result set: orders past due and incomplete, plus orders due within horizon_days that haven't started or are waiting on material. That specificity implicitly separates it from the broader get_work_orders sibling, but no sibling is named explicitly, so it falls short of the 5 bar.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the scope definition (this is the 'late and at-risk' view rather than a general order listing), but there is no explicit statement of when to prefer this over get_work_orders or how the two complement each other. Nothing misleading, but nothing that routes the agent either.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_datasetsA
Read-only

List the available tables with row counts, date coverage and which columns are masked. Call this first when you do not know the data.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds useful behavioral context by disclosing what the listing surfaces (row counts, date coverage, masked columns), which matters for a discovery tool, but says nothing about result size or limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: capability first, then the call-first routing cue. No filler, and the most actionable instruction is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-value detail need not live in the description, and for a zero-parameter read-only discovery tool nothing an agent needs is missing. The description supplies exactly the orientation cue required to start a session.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so there is no parameter semantics to document; the baseline for a parameterless tool is 4. The description correctly adds no redundant parameter chatter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (available tables/datasets) and even previews the return payload: row counts, date coverage, and masked columns. That framing clearly distinguishes it from data-returning siblings like search_records, get_work_orders, and scrap_summary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger condition: "Call this first when you do not know the data." That tells the agent when to reach for it instead of the other siblings, though it names no concrete alternative for the case where you already do know the data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

machine_oeeA
Read-only

Overall Equipment Effectiveness (OEE = availability x performance x quality) for a period, grouped by machine, line, day or shift. Results by machine are sorted worst first.

ParametersJSON Schema
NameRequiredDescriptionDefault
lineNoProduction line
date_toNoISO date YYYY-MM-DD
group_byNomachine
date_fromNoISO date YYYY-MM-DD
machine_idNoMachine id, for example CNC-05

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered. The description still adds genuine behavioral context beyond that: the OEE formula for interpreting the number, and the non-obvious ordering rule that results are sorted worst first by machine. It does not disclose default date-range behavior when date_from/date_to are omitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences with no filler; the metric definition and grouping are front-loaded before the result-ordering note. Efficient, though the parenthetical formula is the only elaboration offered.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and the description covers metric meaning, grouping grain, and result ordering. The main gap is the behavior when all filter parameters are left at their null defaults (e.g., what time window is assumed).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, so the schema already documents line, date_from, date_to, and machine_id formats. The description only echoes the group_by options and the date scoping ('for a period'), adding no syntax or default details beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific metric (OEE, with its formula spelled out as availability x performance x quality) and the resource scope, plus the grouping dimension. An agent knows exactly what is computed and at what grain, though it never distinguishes itself from siblings like production_kpis or downtime_pareto.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance is given. The description never says to prefer this over production_kpis (general KPIs) or downtime_pareto (loss breakdown), nor when each group_by choice is appropriate. Usage is only inferable from the metric name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

production_kpisB
Read-only

Management summary for a period, compared with the previous period of the same length: OEE and its three factors, good and scrap parts, unplanned downtime hours with the top reasons, on-time delivery, open late orders and materials below reorder point.

ParametersJSON Schema
NameRequiredDescriptionDefault
date_toNoISO date YYYY-MM-DD
date_fromNoISO date YYYY-MM-DD

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered, and the description adds a genuinely useful behavioral trait not in the structured data: results are compared against the previous period of the same length. It does not mention default/omitted date behavior or any rate/permission constraints, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence, front-loaded with 'Management summary for a period,' with no wasted words. The metric list is long but each item earns its place by scoping the result set. Slightly list-heavy but efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover the read-only nature. The gap is that both parameters default to null and the description never states what period is used when dates are omitted, which an agent needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters are documented in the schema, so the baseline is 3. The description adds no detail about date formatting, defaults, or what period is assumed when the nullable dates are omitted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies this as a rolled-up management summary spanning OEE, quality, downtime, delivery and inventory — a specific composite resource. However, it never names the overlapping siblings (machine_oee, downtime_pareto, scrap_summary, late_work_orders) to explain how it differs from them. A clear purpose, but no explicit sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance and no mention of alternatives, despite four sibling tools covering overlapping metrics. The agent must infer on its own whether to call this composite summary or the individual metric tools. Only implied usage is present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scrap_summaryA
Read-only

Scrap quantity and scrap rate for a period, grouped by reason, machine or product.

ParametersJSON Schema
NameRequiredDescriptionDefault
date_toNoISO date YYYY-MM-DD
group_byNoreason
date_fromNoISO date YYYY-MM-DD

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered and the description only needs to add aggregation context, which it does by naming the grouping dimensions. It does not disclose the effect of omitted date bounds (both default to null) or the default grouping, so a mutation-free but behaviorally thin addition.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence with the metric front-loaded and the grouping options trailing. No filler, though it is a verbless fragment rather than a fully formed instruction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. For a 3-parameter read-only aggregation with an enum and documented date patterns, the description is nearly sufficient; only the null date defaults and default grouping are left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67% and both date parameters are documented with ISO format in the schema itself. The description restates the group_by enum values, which is largely redundant with the structured enum, and adds no explanation of default behavior or how grouping changes the returned rows. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (scrap quantity and scrap rate) and the dimensions over which it aggregates (reason, machine, product), which is enough to separate it from siblings like machine_oee and downtime_pareto. It never names an alternative tool, but the resource is precise and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for a period' and the list of grouping options imply the usage context, but there is no explicit when-to-use/when-not guidance and no mention of how this differs from other analytics siblings such as production_kpis. Usage is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_recordsA
Read-only

Free-text search (substring, case-insensitive) across record fields, for questions like 'what happened with WO-26017' or 'anything about coolant'. Masked columns are not searched.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
tableNoLimit the search to one table

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint already declares this a safe read, but the description adds real behavioral detail beyond that: substring matching, case-insensitivity, and the important security exclusion that masked columns are not searched. This is meaningful context an agent cannot derive from annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences that front-load the core mechanism and then supply examples and the exclusion. Every clause earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and the description covers matching semantics and the masked-column exclusion well. Minor gaps remain around the limit and table parameters, but nothing essential for calling the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33% — the table parameter is documented in-schema, but query and limit have no descriptions. The description clarifies the query's matching semantics (substring, case-insensitive) and its scope (not masked columns), but says nothing about the limit or table parameters, so it only partially compensates for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (free-text search) and resource (record fields) with concrete mechanics (substring, case-insensitive) and two example queries that make the scope immediately tangible. An agent can tell this apart from the analytical siblings (downtime_pareto, machine_oee) without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'for questions like ...' examples give clear positive usage context, showing exactly the kind of exploratory lookup this tool serves. However, it never states when NOT to use it or names an alternative sibling for structured retrieval.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 10 tool updatesv0.1.0
    • First observeddowntime_events
    • First observeddowntime_pareto
    • First observedget_work_orders
    • First observedinventory_alerts
    • First observedlate_work_orders
    • First observedlist_datasets
    • First observedmachine_oee
    • First observedproduction_kpis
    • First observedscrap_summary
    • First observedsearch_records

TDQS

A3.7/5.0

Scored across 10 tools

Disambiguation4/5

Tools mostly target distinct analytical areas (inventory, OEE, downtime, scrap, work orders), but get_work_orders and late_work_orders have overlapping scope, and production_kpis overlaps with component tools like machine_oee and downtime_pareto. Descriptions help clarify boundaries, reducing confusion.

Naming Consistency3/5

Mixed conventions: some tools use verb_noun (list_datasets, search_records, get_work_orders) while others are noun phrases (inventory_alerts, production_kpis, machine_oee, downtime_pareto, downtime_events, scrap_summary, late_work_orders). All are snake_case and readable, but the lack of a consistent verb pattern reduces predictability.

Tool Count5/5

10 tools is well within the typical 3-15 range for a domain-specific analytics server. Each tool provides a distinct analytical view, and there is no obvious redundancy or bloat.

Completeness4/5

The server covers key factory-floor analytics: dataset discovery, inventory alerts, production KPIs, OEE, downtime, scrap, and work orders. Minor gaps exist, such as no dedicated tool for raw production records or quality inspections beyond scrap, but core workflows are well supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Bridges Claude (or any MCP client) to manufacturing data via the i3X standard, enabling natural language queries about equipment status, hierarchy, and historical trends.
    12
    6 npm
    2
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enterprise-safe MCP server that enables Claude Enterprise to access approved on-prem SQL Server data through read-only, governed, and auditable tools.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides read-only, guarded access to business databases via MCP. Enables natural language querying with built-in security barriers like table allowlists, PII masking, and audit logging.
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables authorized Energi-Up staff to query KLIP data in natural language through Claude, strictly read-only, without opening the application.
    28 npm
    -