EPICS-MCPBLOCK
Ask an AI assistant about your EPICS control system: live PV values, why a PV is disconnected, and where it appears across ChannelFinder, the Archiver and the alarm tree. Read-only by default.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
[](https://github.com/epicDirk/EPICS-MCP/actions/workflows/ci.yml) [](https://pypi.org/project/epics-mcp/) [](https://github.com/epicDirk/EPICS-MCP/blob/main/LICENSE) [](https://www.python.org/)
Ask an AI assistant about your EPICS control system, whether you are on shift or writing code against it. Why is this PV disconnected? Which IOC was supposed to serve it? When did the archive last see a value, and did anybody log a problem with that device this week?
That is one question, and its answer sits in four different services. A facility runs its live layer, a channel registry, an archiver, an alarm logger and a logbook side by side. Each has its own port, its own query language, its own idea of how a date is written, and often its own login. This server puts them behind one set of Model Context Protocol (MCP) tools, live values over p4p and the other planes over their own REST APIs. The question is asked once instead of four times, and each service you have configured answers the part it holds.
Read-only by default. The one tool that can write to your control system is triple-gated, and off until you turn it on. Logbook writes sit behind a separate gate of their own. The full posture, including what leaves your machine, is Safety and network posture.
It also answers what no single service can. Which of the channels this IOC serves is nobody archiving? The registry holds one list, the archive holds another, and nobody holds the difference. An assistant asks for both and works it out, with no script to write first.
Project status. Pre-1.0 and under active development. To
a61fe91489d3OBSERVED · 2026-10-11Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add epics-mcp --env EPICS_MCP_OLOG_TEST_OTHER_PASSWORD=${EPICS_MCP_OLOG_TEST_OTHER_PASSWORD} --env EPICS_MCP_OLOG_WRITE_PASSWORD=${EPICS_MCP_OLOG_WRITE_PASSWORD} --env OA1C_WRITE_PASSWORD=${OA1C_WRITE_PASSWORD} -- uvx epics-mcp{
"mcpServers": {
"epics-mcp": {
"command": "uvx",
"args": [
"epics-mcp"
],
"env": {
"EPICS_MCP_OLOG_TEST_OTHER_PASSWORD": "${EPICS_MCP_OLOG_TEST_OTHER_PASSWORD}",
"EPICS_MCP_OLOG_WRITE_PASSWORD": "${EPICS_MCP_OLOG_WRITE_PASSWORD}",
"OA1C_WRITE_PASSWORD": "${OA1C_WRITE_PASSWORD}"
}
}
}
}Exposed tools (3)
3 read · 0 write · 0 destructive.
| Tool | Risk | Description |
|---|---|---|
named | read | |
seek | read | |
untyped | read | Return nothing typed. |
Trust audit
BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (2 observation(s))
- Network
- declared (4 observation(s))
- Shell
- declared (1 observation(s))
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (25)
" - EPICS_MCP_TLS_VERIFY=false as the answer to question 7. The answer to an internal CA "
importlib.import_module(_ENGINE_ENTRY_POINT)
f"swagger beacon (probe: {self._identity}); a 'not registered' answer is withheld ".pre-commit-config.yaml
.language-exceptions
.typography-exceptions
module = importlib.import_module(module_name)
module = importlib.import_module(module_name)
module = importlib.import_module(module_name)
module = importlib.import_module(module_name)
("identity", "swagger beacon"),get_read_throttle().check() # spend the only token: the beacon below is refused
parser and never a substring of the authority (`http://127.0.0.1@logbook-remote/...` has host
olog_url="http://127.0.0.1:8080/Olog",
os.environ["HTTP_PROXY"] = "http://127.0.0.1:9"
os.environ["HTTP_PROXY"] = "http://127.0.0.1:9"
os.environ["HTTP_PROXY"] = "http://127.0.0.1:9"
cli_init.main([*_REST_ARGV, "--set", "EPICS_MCP_TLS_VERIFY=false"])
session = build_retrying_session(verify=False)
lambda: EpicsConfig(ca_bundle="", tls_verify=False),
_with_config(monkeypatch, tls_verify=False)
return base64.b64decode(value, validate=True)
_PNG = base64.b64decode(
_PNG = base64.b64decode(
probe = "SIM:PS-01:Cur-RB 12 μA 50 Ω probe-äöü"
Gates applied: no_behavioural_pass.
a61fe91489d3full audit observations/trust-audit/mcp-server/epicdirk__epics-mcp.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-11 | a61fe91489d3 | BLOCK | D | 69 | first audit |
Questions
What is the EPICS-MCP MCP server?
Ask an AI assistant about your EPICS control system: live PV values, why a PV is disconnected, and where it appears across ChannelFinder, the Archiver and the alarm tree. Read-only by default.
What tools does EPICS-MCP expose?
3 in total: 3 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.
Is EPICS-MCP safe to connect to an agent?
No — not without reading the findings first. The audit graded it D (69/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on.
What credentials does EPICS-MCP need?
It reads EPICS_MCP_OLOG_TEST_OTHER_PASSWORD, EPICS_MCP_OLOG_WRITE_PASSWORD and OA1C_WRITE_PASSWORD from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does EPICS-MCP run?
It speaks streamable-http, so it runs as a service you connect to over the network. It is published on PyPI as epics-mcp.
How current is this page?
The grade is for one exact copy of the source (a61fe91489d3), read on 2026-10-11. The repository is watched and re-audited when it changes.