Edge Flow Manager MCP Server
Provides read-only access to Cloudera Edge Flow Manager (EFM) state, enabling AI agents to inspect agent classes, agents, manifests, designer flows, and resources for MiNiFi fleets at the edge.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Edge Flow Manager MCP ServerWhich MiNiFi agents are offline right now?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Edge Flow Manager MCP Server
A thin, read-only Model Context Protocol server that gives LLMs and AI agents (Claude Code, Claude Desktop, LangChain, Agent Studio) live state from a Cloudera Edge Flow Manager (EFM / CEM) instance — the control plane for MiNiFi agents at the edge.
Surface | What it exposes | API |
Agent classes | the groupings of MiNiFi agents that share a flow |
|
Agents | enrolled agents + last-heartbeat (online/offline) |
|
Manifests | the processor / controller-service types a class can run |
|
Designer flows | the live edge flow document, read + validate |
|
Resources | assets & extension bundles EFM syncs to agents |
|
Practitioner-grade MCP servers already ship for NiFi, Cloudera Manager, Iceberg, Trino, and Grafana — but nothing shipped for the edge. This is that server. It is the companion to the Cloudera Manager MCP Server: CM covers the datacenter, this covers everything MiNiFi runs at the edge.
MiNiFi has no REST API of its own. Its command-and-control state — which agents are alive, what flow each is running, what it's allowed to run — all lives in EFM. So an MCP server over EFM is an MCP server over the MiNiFi fleet.
Every tool is GET-only. There are no write, publish, or config-mutation paths in v1 (see Roadmap).
Tools
Agent classes & agents (5)
Tool | Purpose |
| All agent classes (name, description, bound manifest ids) |
| Detail for one class — resolves it to its manifest |
| Enrolled agents + |
| Full record for one agent (class, host, manifest hash, status) |
| Per-class health: flow version, online/missing counts, metrics |
Manifests (2)
Tool | Purpose |
| The component types a class can run — is a flow deployable there? |
| One manifest by id, with full property descriptors |
Designer flows (3)
Tool | Purpose |
| One summary per class: |
| The full live edge flow document (PGs, processors, connections) |
| Validation results — the check EFM runs before a publish |
Resources (2)
Tool | Purpose |
| All assets / extension bundles in the resource manager |
| Resources assigned to one class |
Related MCP server: airflow-mcp-server
Prerequisites
Git —
brew install gitNode.js — for
npx/ MCP Inspector:brew install nodeuv —
curl -LsSf https://astral.sh/uv/install.sh | shA reachable EFM / CEM instance. EFM's default HTTP port is 10090; the REST base is
http://<efm-host>:10090/efm/api.
On Kubernetes (the CSO / CFM operator), reach EFM with
kubectl port-forward service/efm 10090:10090 -n <namespace>and pointEFM_BASE_URLathttp://127.0.0.1:10090/efm/api.
Step 1 — Clone
git clone https://github.com/cldr-steven-matison/edge-flow-manager-mcp-server.git
cd edge-flow-manager-mcp-serverStep 2 — Configure
cp .env.example .env
$EDITOR .env
set -a; source .env; set +aMinimal .env (unauthenticated EFM — the default):
EFM_BASE_URL=http://efm-host:10090/efm/apiWith HTTP Basic and a self-signed TLS cert:
EFM_BASE_URL=https://efm-host:10090/efm/api
EFM_USER=admin
EFM_PASSWORD=yourpassword
EFM_VERIFY_SSL=falseStep 3 — Run with MCP Inspector
npx @modelcontextprotocol/inspector@0.14.0 uv run --directory . run-serverPin the Inspector to the v1 line (
@0.14.0). This server pinsmcp<2(the v1 FastMCP idiom, matching the sibling Cloudera MCP servers). The current@latestInspector (2.x) completestools/listbut its Tools pane renders empty against a v1 server — the tool list simply doesn't show.@0.14.0(classic Connect → List Tools UI) lists all tools correctly. For an ad-hoc launch you may also needDANGEROUSLY_OMIT_AUTH=trueto skip the proxy token locally.
The server prints (to stderr) whether EFM was wired up:
Starting Edge Flow Manager MCP Server via transport: stdio (EFM configured)In the Inspector: Connect → List Tools → you should see all 12 tools.
Step 4 — Smoke tests
Call | Expect |
| your agent-class names |
| enrolled agents + last-heartbeat |
| one summary per class, each with a flowId |
| assets / extension bundles (may be empty on a fresh EFM) |
A typical investigation chains them: efm_list_agent_classes → efm_get_agent_class →
efm_get_manifest → efm_list_flows → efm_get_flow → efm_validate_flow.
Step 5 — Claude Desktop / Claude Code
Local clone:
{
"mcpServers": {
"edge-flow-manager": {
"command": "uv",
"args": ["run", "--directory", "/abs/path/to/edge-flow-manager-mcp-server", "run-server"],
"env": {
"EFM_BASE_URL": "http://efm-host:10090/efm/api"
}
}
}
}Straight from GitHub (no clone), via uvx:
{
"mcpServers": {
"edge-flow-manager": {
"command": "uvx",
"args": ["--from", "git+https://github.com/cldr-steven-matison/edge-flow-manager-mcp-server@main", "run-server"],
"env": { "EFM_BASE_URL": "http://efm-host:10090/efm/api" }
}
}
}Agent-loop mapping
Loop | Tool sequence |
Fleet health |
|
Flow inspection |
|
Deployability check |
|
Knowing which agents are alive is a different question than what flow they run, which is different again from what a class can run — exposing all three lets an agent join them in one investigation without leaving the conversation.
Configuration reference
All settings are environment variables (see .env.example for the annotated set):
EFM_BASE_URL (the only required one), EFM_USER / EFM_PASSWORD (only if EFM enforces Basic),
EFM_VERIFY_SSL (true | false | path to a CA bundle), plus globals EFM_MCP_TIMEOUT /
EFM_MCP_RETRIES / EFM_MCP_RETRY_WAIT, MCP_TRANSPORT (stdio | sse), and EFM_READONLY
(defaults true; v1 has no write paths — the flag is plumbed for the future write tools).
Roadmap
v1 is read-only and REST-only. Two extensions are deliberately deferred:
Write tools, off by default.
efm_add_processor,efm_add_connection, andefm_publish_flow, gated behindEFM_READONLY=false. A publish pushes the flow to every agent in the class on its next heartbeat, so these land only once the read tools are in real use. The EFM Flow Designer write API is onePOSTper processor and one per connection (no bulk create, no whole-flowPUT), with aGET .../validateclean beforePOST .../publish.Postgres-backed
efm_get_operations(). EFM'soperation/bulk_operationtables in Postgres are the durable truth for command history and reliable online/offline status; the REST view can lag or, under a crash-looping agent that floods theoperationtable, hang entirely. A read-only Postgres query is the robust source — added when operational history is needed.
Related Cloudera MCP Servers
Cloudera Manager MCP Server — CM / YARN / Ranger / Atlas
License
Apache-2.0.
Available Tools
12 toolsefm_get_agentA
Full record for one agent: its class, device/host, manifest hash, and heartbeat/status detail. Use to confirm which manifest an agent actually reports.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden. It implies a read-only lookup and details the returned fields, but it does not mention failure modes, permissions, or confirmation that no side effects occur. For a get-type tool this is acceptable but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the purpose and immediately followed by the intended use case. No filler words or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so return structure is well-covered. The description clarifies the tool scope, content, and a key use-case, which is sufficient for a simple single-parameter getter. It does not address error cases, but that is a minor omission for such a routine read operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only hints that agent_id identifies the target through 'one agent,' but does not explain how to obtain an agent_id, its uniqueness, or any value constraints. The schema only provides the type string, leaving the parameter mostly unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific retrieval operation for one agent, enumerating the returned content (class, device/host, manifest hash, heartbeat/status). It clearly distinguishes itself from sibling tools like efm_list_agents (plural) and efm_get_agent_class (only class) by its scope and content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a concrete use: to confirm which manifest an agent actually reports. It does not explicitly mention alternatives or when not to use, so it misses the full when-not guidance required for a 5, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
efm_get_agent_classA
Detail for one agent class: its manifest ids, monitoring config, and any Designer flow association. Start here to resolve a class to its manifest.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_class | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. Its language ('Detail', 'resolve') signals a read-only retrieval, and it lists observable outputs, but it does not explicitly state that it has no side effects, whether any permissions are needed, or what it returns in error/edge cases. That makes it serviceable but not fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief and front-loaded, leading with the resource and key result fields. The ancestry 'Start here to resolve a class to its manifest' is a helpful single-sentence directive with no wasted prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter get tool with an output schema, the description provides enough working context: the tool targets a single agent class, shows manifest/monitoring/flow details, and is described as the starting point for manifest resolution. The main gap is the agent_class value semantics, but that is mitigated by its simple single-parameter shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema coverage is 0%, so the description should compensate, but it only says 'one agent class' without explaining how to form or source the agent_class string. The agent can infer it is an identifier or class name, but the definition adds almost no value beyond the schema's own parameter name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-plus-resource ('Detail for one agent class') and enumerates the returned areas: manifest ids, monitoring config, and Designer flow association. It does not explicitly compare itself to a sibling like efm_get_class_monitor or efm_get_manifest, but the resource scope is clear enough to establish a distinct purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Start here to resolve a class to its manifest' gives a clear workflow directive and tells the agent when this tool is the entry point. It does not name sibling alternatives or state when to choose them instead, but it offers a clear use case without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
efm_get_class_monitorB
Per-class health view: current flow version, agent counts (online / missing), health status, and connection metrics. The fastest answer to "is this class healthy and how many agents are up?".
| Name | Required | Description | Default |
|---|---|---|---|
| agent_class | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It discloses that the tool returns current flow version, agent counts (online/missing), health status, and connection metrics, which is useful. However, it doesn't disclose whether this is a read-only operation, whether it aggregates data from multiple sources, or any latency/caching behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the resource and key metrics. The parenthetical question at the end adds useful context without bloat. It earns its place, though the formatting with line breaks is slightly unusual.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so return values are covered. However, with no annotations and 0% parameter coverage, the description should provide more guidance on the required agent_class parameter and how it relates to sibling tools. The core purpose is clear, but an agent might not know how to obtain a valid agent_class value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the undocumented 'agent_class' parameter. The description mentions 'per-class' and 'agent class' context, but doesn't explicitly explain what values agent_class accepts or how to find valid class names (e.g., via efm_list_agent_classes). This is a gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('get') and resource ('class monitor view'), and clarifies the core question it answers ('is this class healthy and how many agents are up?'). It distinguishes itself from sibling tools like efm_get_agent_class by focusing on health/connection metrics rather than class configuration, though it doesn't explicitly name a sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for checking class health and agent counts, which is a clear context. However, it doesn't explicitly state when not to use it or mention alternatives like efm_get_agent_class or efm_list_agents for more detailed agent-level information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
efm_get_flowA
The full live Designer flow document for a flowId: process groups, processors, connections, controller services, and parameters. Ground truth for what an agent class is running — read this before reasoning about a flow.
| Name | Required | Description | Default |
|---|---|---|---|
| flow_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses that the result is the full live document, positions it as ground truth, and implies a read-only fetch. It does not overstate side effects or obscure the output nature beyond the provided schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, naming the exact resource (full live Designer flow document), its contents, and the intended use case in two sentences with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single obvious parameter and an output schema available, the description covers the key context: the document is authoritative, current, and should be read before reasoning about a flow. It could mention how to obtain a flowId, but the tool name and schema make this largely unnecessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage and the description only mentions 'flowId' without adding format, provenance, or relationship to other IDs. The parameter name is self-explanatory for flow ID, and the structure is simple, but the description fails to compensate fully for the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as retrieving the full live Designer flow document for a flowIdKN and enumerates the contained elements (process groups, processors, connections, controller services, parameters). This distinguishes it from sibling tools like efm_list_flows or efm_validate_flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit guidance to read this before reasoning about a flow, establishing when the tool should be invoked. It does not explicitly name sibling alternatives or say when not to use it, but the context is clear enough for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
efm_get_manifestA
The agent manifest(s) for a class: the processor, controller-service, and reporting-task types that class can run. This is what tells you whether a flow you want to build is even deployable to that class's agents.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_class | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the full behavioral burden. It states what is returned (manifest components) and its informational purpose, but does not explicitly confirm read-only behavior, error conditions, or required permissions. The word 'get' implies a read operation, but that is not guaranteed. The description provides some transparency but leaves gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and adds a high-value explanatory sentence about deployability. There is zero redundancy or filler; every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists (as noted in context), the description need not detail return values. It covers the primary purpose, the scope, and the practical implication for flow building. It does not mention edge cases like missing classes or pluralization of manifests, but for a simple retrieval tool this is acceptable. Overall, it is sufficiently complete for an agent to decide and call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It references 'for a class' which clarifies that agent_class is the class identifier, and the purpose sentence links it to deployability. However, it does not specify the format of agent_class, where to find valid values (e.g., via efm_list_agent_classes), or any constraints. This is adequate but not thorough.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves agent manifest(s) for a class, enumerating the manifest components (processor, controller-service, reporting-task types) and its role in determining deployability. It distinguishes from sibling efm_get_manifest_by_id by focusing on 'class' rather than an ID, though it does not explicitly name the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a purpose-driven usage hint ('tells you whether a flow you want to build is even deployable to that class's agents'), which implies when to use it. However, it does not explicitly contrast with efm_get_manifest_by_id or other sibling tools, nor does it state prerequisites like obtaining a valid agent_class from efm_list_agent_classes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
efm_get_manifest_by_idA
One agent manifest by its id (as listed on an agent class or agent record). Returns the full component-type catalog with property descriptors.
| Name | Required | Description | Default |
|---|---|---|---|
| manifest_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the return content ('full component-type catalog with property descriptors'), which is a useful behavioral trait. However, it does not mention any side effects, permissions, error behavior, or whether the operation is read-only. For a simple read-by-id tool, this is adequate but not rich, so a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary action and outcome. Every clause serves a purpose, with no filler or redundancy. The structure is efficient and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, output schema provided), the description covers the essential aspects: what the tool does, where the ID comes from, and what it returns. It does not explain differences from efm_get_manifest or address edge cases, but for a straightforward lookup, it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. The only parameter, manifest_id, is not elaborated beyond the schema property name. The description merely says 'by its id', adding no format, examples, or source details beyond what the schema already implies. This is a minimal compensation for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb (get) and resource (one agent manifest by its id), and specifies the source of the id ('as listed on an agent class or agent record'). It is distinct from siblings like efm_list_agent_classes and efm_get_agent, but does not explicitly differentiate from the closely named efm_get_manifest, so it lacks 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it by indicating the id comes from an agent class or agent record, providing clear context. It does not explicitly state when not to use it or name alternatives, but the context is enough for an agent to infer that this tool is for fetching a specific manifest by ID.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
efm_list_agent_classesA
List every agent class EFM manages (name, description, and the agent manifest(s) each class is bound to). An agent class groups MiNiFi agents that share one flow — the top of the edge hierarchy.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It communicates that this is a non-mutating enumeration ('List every'), specifies the response content (name, description, manifests), and adds domain context about what an agent class is. It does not mention pagination or output format, but the output schema covers the latter and the operation is inherently read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences: the first conveys the core operation and returned data, the second provides a useful conceptual definition. There is no filler or repetition, and all content earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless listing tool with an output schema, the description is nearly complete: it names the exact resource scope and returned fields, and it explains the concept of an agent class. The only notable gap is the absence of explicit usage guidance relative to sibling tools, which is minor for such a low-complexity operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema confirms this with 100% coverage. The description adds no parameter-specific detail, but none is needed; the baseline for zero-parameter tools is 4, and the description satisfies it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a precise resource ('every agent class EFM manages'), and the exact fields returned (name, description, agent manifests). This clearly distinguishes it from sibling tools like efm_get_agent_class (single class) and efm_list_agents (agents rather than classes).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied: call this to enumerate all agent classes rather than fetching one via efm_get_agent_class. However, the description does not explicitly state when to prefer this tool over siblings or mention exclusion cases, leaving some decision-making to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
efm_list_agentsA
List enrolled MiNiFi agents with their last-heartbeat timestamp (status/firstSeen/lastSeen) — the primary online/offline signal. Pass agent_class to filter to one class; omit it for every agent.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_class | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses that this is a read-style listing operation and what data it returns, including the heartbeat-derived online/offline semantics. It does not mention pagination, ordering, or failure behavior, but for a simple list tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose and output fields, followed by precise parameter usage. Every sentence earns its place with no redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The operation is simple, has one optional parameter, and the description covers purpose, output meaning, and filter semantics. It could mention that valid agent_class values come from efm_list_agent_classes, but that is not essential for basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only provides a field name and type, but the description explains the parameter's exact effect: passing agent_class filters to one class, omitting it returns every agent. This fully compensates for the low schema coverage and leaves no ambiguity about how to use the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List'), names the resource ('enrolled MiNiFi agents'), and states exactly what is returned (last-heartbeat timestamp, status/firstSeen/lastSeen). This clearly distinguishes it from sibling tools like efm_get_agent or efm_list_flows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains when to use the tool ('primary online/offline signal') and gives explicit parameter guidance: pass agent_class to filter, omit it for all agents. It does not explicitly name alternatives for single-agent lookup, but the 'list' framing is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
efm_list_class_resourcesA
Resources currently assigned to one agent class — the assets/extensions EFM syncs to every agent in that class on its next heartbeat.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_class | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. It adds meaningful context: the resources are 'currently assigned' and are synced to agents 'on its next heartbeat,' which clarifies that this is a read-only snapshot tied to a synchronization cycle. It stops short of explicitly stating no side effects or auth requirements, but the verb 'list' plus the snapshot wording make the behavior reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with a dash-delimited clarification. Every phrase carries meaning, the core subject is front-loaded, and there is no redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with an output schema, the description covers the core semantics well. However, it leaves the agent_class parameter under-specified and does not mention how to discover valid class identifiers. Given the schema and output schema already exist, this missing parameter guidance is the main completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has one parameter, agent_class, with no schema-level description, and schema description coverage is 0%. The description mentions 'one agent class' broadly but does not explain what agent_class values look like, where to obtain them, or any format constraints. This is a real gap for an agent trying to populate the only required parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb-resource pair ('list class resources') and then defines exactly what those resources are: assets/extensions EFM syncs to every agent in that class on its next heartbeat. This makes the tool's scope concrete and semantically distinguishable from siblings like efm_list_agent_classes and efm_list_resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: call this when you need resources assigned to a single agent class. It does not explicitly state when to prefer this over efm_list_resources or other sibling tools, nor does it provide exclusions. Context is present, but alternative routing 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.
efm_list_flowsA
One summary per agent class: identifier (the flowId), agentClass, and
rootProcessGroupIdentifier. This is how you map a class to the flowId that
efm_get_flow / efm_validate_flow take.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It does specify the output fields and that it returns one summary per agent class, but it doesn't mention whether results are cached, paginated, or if any authorization is needed. The output schema exists and likely covers return structure, but the description adds only minimal behavioral context beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no fluff, front-loading the core output and immediately explaining its purpose. Every sentence earns its place, and the structure is clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter listing tool with an output schema, the description is largely sufficient. It tells the agent exactly what to expect and how to use it, though it leaves out minor details like error conditions or behavioral notes that might be useful but are not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is trivially complete. The description adds no parameter-specific semantics because none are needed, earning the baseline of 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns one summary per agent class with specific fields, and explicitly explains that this maps a class to the flowId needed by sibling tools efm_get_flow and efm_validate_flow. This differentiates it from other listing tools like efm_list_agent_classes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: it is the way to map an agent class to a flowId for subsequent calls to efm_get_flow or efm_validate_flow. It doesn't explicitly name alternatives or when not to use it, but the purpose is clear enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
efm_list_resourcesA
All resources in EFM's resource manager (assets and extension bundles), with names, types, and SHA-512 digests — the files EFM can push to agents.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions the resource types and digest information, implying a read-only listing operation, but does not explicitly state that it is non-destructive or disclose any potential side effects such as pagination or rate limits. For a list tool, this is adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is front-loaded with the scope ('All resources in EFM's resource manager') and then provides specific details (types and digests). It is concise and every element adds value with no redundant words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has no parameters and an output schema is present, the description provides sufficient context for an agent to invoke it correctly. It explains what resources are returned and their relevance (files EFM can push to agents), covering the essential information needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the schema fully covers parameter semantics. The description adds no parameter-specific details, which is fine given the absence of parameters; the baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists all resources in EFM's resource manager, specifying the resource types (assets and extension bundles) and the returned metadata (names, types, SHA-512 digests). This verb+resource pairing is unambiguous and distinguishes it from sibling tools like efm_list_class_resources, which focuses on class-level resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides context about the resources ('the files EFM can push to agents'), helping an agent understand the purpose, but does not explicitly mention when to use this tool versus alternatives like efm_list_class_resources. There is no direct comparison or exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
efm_validate_flowA
Validation results for a flow — the same check EFM runs before a publish. Surfaces invalid/misconfigured components without changing anything.
| Name | Required | Description | Default |
|---|---|---|---|
| flow_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It explicitly states 'without changing anything', clearly indicating a non-destructive read-only operation. It also explains the purpose (surfaces invalid/misconfigured components). While it doesn't describe error behavior or output format, the presence of an output schema covers that. The non-mutating trait is a key behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose ('Validation results for a flow') and immediately clarifies it is non-destructive. Every phrase earns its place; no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (which explains return values) and only one parameter, the description is largely complete. It covers purpose and non-destructive behavior. The only missing element is explicit usage guidance relative to sibling tools, but this is minor given the clear separation from other efm tools. The simplicity of the tool means the description suffices.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not elaborate on the flow_id parameter at all. Since schema description coverage is 0%, the description could have added context about what flow_id refers to, but the parameter name is self-explanatory and the schema provides its type. The description adds no value beyond the schema, which is minimal. For a single trivial parameter, this is acceptable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool validates a flow, surfacing invalid or misconfigured components. It uses a specific verb (validate) and resource (flow) and adds the context of being the same check EFM runs before publish. It doesn't explicitly distinguish from siblings, but no sibling appears to be a validation tool, so the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used before publishing to validate a flow, but it does not explicitly state when to use it versus alternatives or when not to use it. No sibling tools are mentioned, and there is no guidance on exclusions or prerequisites. The publish context gives some usage hint, but it lacks explicit routing.
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.
12 tool updates
v0.1.0- First observed
efm_get_agent - First observed
efm_get_agent_class - First observed
efm_get_class_monitor - First observed
efm_get_flow - First observed
efm_get_manifest - First observed
efm_get_manifest_by_id - First observed
efm_list_agent_classes - First observed
efm_list_agents - First observed
efm_list_class_resources - First observed
efm_list_flows - First observed
efm_list_resources - First observed
efm_validate_flow
TDQS
Scored across 12 tools
Each tool targets a distinct resource or action: classes, agents, manifests, monitors, flows, resources. Even similar pairs (e.g. efm_get_manifest vs efm_get_manifest_by_id) are separated by query key, and efm_list_resources vs efm_list_class_resources differ by scope.
All tools follow a consistent efm_<verb>_<noun> snake_case pattern. List/get are used predictably, and compound nouns like class_monitor and class_resources are clear. Minor suffix variations (by_id) are still systematic.
12 tools is a well-scoped set for an edge flow manager: enough to cover the main entities (agent classes, agents, flows, manifests, resources) without bloat.
The read/query surface is thorough: classes, agents, manifests, flows, resources, health. Validation is included enough to test flows. However, there are no publish/update/delete operations, and resource assignment is only readable, so management actions are missing.
Maintenance
Related MCP Connectors
Discover Frontier inference capabilities and read sanitized usage through read-only tools.
Read-only MCP tools for AI agent discovery, structured resources, and NIULAI information.
Read-only MCP access to a documented IT fleet: state, changes, posture. 15 tools.
Gateway between LLM agents and world data through eight tools and a bundled endpoint catalog.
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides read-only access to JIRA REST API, enabling LLMs to query and retrieve information from JIRA instances.147 npmMIT
- AlicenseAqualityBmaintenanceEnables Claude to inspect and operate Apache Airflow over its REST API, providing read tools and safe write operations (gated by read-only mode) for managing DAGs, runs, tasks, and pools.14MIT
- FlicenseAqualityCmaintenanceEnables LLM agents to query and explore Cloudera Hive virtual warehouses through tools like list_databases, list_tables, describe_table, get_table_sample, and execute_query with read-only safety.5-
- FlicenseBqualityCmaintenanceEnables AI agents to manage and interact with Apache NiFi through its REST API, covering process groups, processors, connections, queues, provenance, and version control via natural language tool calls.28-