nifimcp@0.1.0rc1
CAUTION· not startedPublisher claims: "Enables AI assistants to understand Apache NiFi flows, investigate failures with cited evidence, and draft reviewable flow files while keeping live NiFi access read-only." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Not started: dependency install failed; the server itself was not observed.- Tested
- the dependency install step · every file read, file written and host contacted by what ran
- Not tested
- server startup · the tool list · tool behavior
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
- no credential variables read in the code
- Where it talks to
- no vendor host named in the codeAlso example.invalid — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- server startup · the tool list · tool behavior
Connect it under the guard. Not started: dependency install failed; the server itself was not observed. The code names no credential variable; the guard pins the network to what the honeypot saw and logs every call.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; not started: dependency install failed; the server itself was not observed) on 2026-11-12 and scored it 76/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: URL with embedded credentials; URL with embedded credentials; URL with embedded credentials. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 2 scenarios · 0 deviationsStatic findings
"value": "https://ingest-user:[email protected]/feed"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."previousValue": "https://ingest-user:[email protected]/feed",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."previousValue": "https://ingest-user:[email protected]/feed",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."previousValue": "https://ingest-user:[email protected]/feed",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."previousValue": "https://ingest-user:[email protected]/feed",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."value": "https://ingest-user:[email protected]/feed"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."upstream.url": "https://ingest-user:[email protected]/feed",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."value": "https://ingest-user:[email protected]/feed"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…d.owner":"telemetry-team","Cache Value Lookup Cache Size":"100","upstream.url":"https://ingest-user:[email protected]/feed","Stateful Variables Initial Value":null},"proper…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if text.startswith(""):Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent."previousValue": "https://ingest-user:[email protected]/feed",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return subprocess.run(cmd, capture_output=True, text=True, timeout=30, env=ENV).stdout.strip()Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."$B/nifimcp" report --config "$WORK/operator.json" --scope demo-telemetry-intake --output "$WORK/report.html"Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.write_file("provenance-unmatched.json", wrap("POST /provenance", unmatched_prov, t,Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…t":"nifi-standard-nar","version":"2.12.0"},"properties":{"Log prefix":"#{warning.log.prefix}","Log FlowFile Properties":"true","Log Level":"debug","Attributes to Ignore":null,"Attributes to Log":null,"Attributes to Ignore Regular Expressio…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…d.owner":"telemetry-team","Cache Value Lookup Cache Size":"100","upstream.url":"https://ingest-user:[email protected]/feed","Stateful Variables Initial Value":null},"proper…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return subprocess.run(["git", *args], cwd=output, capture_output=True, text=True, check=True).stdout.strip()Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.commit_time = subprocess.run(["git", "log", "-1", "--format=%ct"], cwd=ROOT, capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.dirty = subprocess.run(["git", "status", "--porcelain", "--untracked-files=no"], cwd=ROOT,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.archive = subprocess.run(["git", "archive", "--format=tar", "HEAD"], cwd=ROOT, capture_output=True, check=True).stdoutFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."previousValue": "https://ingest-user:[email protected]/feed",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…t":"nifi-standard-nar","version":"2.12.0"},"properties":{"Log prefix":"#{warning.log.prefix}","Log FlowFile Properties":"true","Log Level":"debug","Attributes to Ignore":null,"Attributes to Log":null,"Attributes to Ignore Regular Expressio…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.write_file("provenance-trace.json", wrap("POST /provenance", trace, t, {"FlowFileUUID": trace_uuid})),Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.uv_version = subprocess.run(["uv", "--version"], capture_output=True, text=True).stdout.strip()Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.version = subprocess.run([claude, "--version"], capture_output=True, text=True).stdout.strip()Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proc = subprocess.run(cmd, cwd=cwd, stdout=handle, stderr=subprocess.STDOUT, timeout=timeout,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proc = subprocess.run(cmd, text=True, capture_output=True, **kw)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.names = subprocess.run(["git", "ls-tree", "-r", "--name-only", commit or "HEAD", "src/"], cwd=ROOT,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proc = subprocess.run([uvx, "--from", "detect-secrets==1.5.0", "detect-secrets", "scan", "--all-files", *paths],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.if cand and subprocess.run([cand, "-m", "pip", "--version"], capture_output=True).returncode == 0:Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.verify = subprocess.run(["sha256sum", "--quiet", "-c", "SHA256SUMS"], cwd=kit, capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.vproc = subprocess.run([sys.executable, str(ROOT / "scripts/lab_verify_draft.py"), "--artifact-id", native_id,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.source_date = subprocess.run(["git", "log", "-1", "--format=%cI", source_commit], cwd=ROOT,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proc = subprocess.run(cmd, stdout=handle, stderr=subprocess.PIPE, text=True, env=env, cwd=out, timeout=1800)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.write_file("queue-sample-unmatched.json", wrap(f"POST /flowfile-queues/{ids['unmatched']}/listing-requests",Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.out = subprocess.run(["git", "ls-files", "-z"], cwd=tree, capture_output=True, check=True).stdoutFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.files[n] = subprocess.run(["git", "show", f"{commit or 'HEAD'}:{n}"], cwd=ROOT, capture_output=True,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.head = subprocess.run(["git", "rev-parse", "HEAD"], cwd=ROOT, capture_output=True, text=True, check=True).stdout.strip()Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."value": "https://ingest-user:[email protected]/feed"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.rec_commit = subprocess.run(["git", "log", "-1", "--format=%H", "--", str(summary_path.relative_to(ROOT))],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.
What would make this Verified
4 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim nifimcp: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- URL with embedded credentials≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Hidden zero-width characters detected≈ +4 on the totalKeep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.
- Python subprocess execution detected≈ +2 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- File type combined with upload action≈ +2 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.