elog-mcp
The server provides read-only access to ELOG electronic logbooks over MCP/OpenAPI, letting LLM agents search and retrieve logbook entries and attachments.
List available logbooks (
elog_list_logbooks)Full-text, attribute, and date-range search across one or all logbooks (
elog_search), with regex support, optionallast_daysfilter, result limits, and newest/oldest sortingFetch complete logbook entries including body, attributes, threading info, and web URL (
elog_get_entry)Retrieve the newest entries of a logbook as excerpts (
elog_get_recent_entries)Download attachments as base64 content with filename, MIME type, and size (
elog_get_attachment)Operates strictly read-only via HTTP GET, with optional shared credentials and logbook allow-list restrictions
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., "@elog-mcpfind entries about detector calibration in the last week"
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.
elog-mcp
OpenAPI/MCP server giving LLM agents read-only access to ELOG electronic logbooks over HTTP. Works with any standard elogd instance.
Search entries by full text (regex), attributes, and date range
Read entries in full (attributes + body + attachments)
Download attachments, discover logbooks
Strictly read-only: only HTTP GET requests are issued. TLS verification is on by default. Credentials come from the environment only and are never logged or echoed.
Installation
Requires Python >= 3.10.
uvx (recommended -- runs elog-mcp in an isolated environment, no setup):
uvx elog-mcppipx:
pipx install elog-mcppip:
pip install elog-mcpFor the OpenAPI/REST transport, install with the openapi extra:
uvx --extra openapi elog-mcp
pipx install "elog-mcp[openapi]"
pip install "elog-mcp[openapi]"From source (development):
git clone https://github.com/ast0815/elog-mcp.git
cd elog-mcp
uv sync
uv run elog-mcpRelated MCP server: mcp-opensearch
Configuration
All settings are environment variables (ELOG_ prefix):
Variable | Required | Meaning |
| yes | Base URL incl. subdir, e.g. |
| no | Shared credentials |
| no | Comma-separated allow-list used by search |
| no |
|
| no | HTTP timeout seconds (default |
| no |
|
| no | Bind address/port in HTTP modes (default |
| no | Require |
| no | Comma-separated CORS origins for openapi mode (default |
| no | TLS cert/key (PEM) — serves HTTPS in HTTP modes |
Common prefix for every deployment:
export ELOG_URL=https://elog.example.org/elog
export ELOG_USER=your-shared-user
export ELOG_PASSWORD=your-shared-passwordDeployment
ELOG_MCP_TRANSPORT picks how clients talk to the server:
Transport | Clients | Endpoint |
| Claude Desktop, opencode, other local MCP hosts | spawned process |
| Web UIs speaking MCP over HTTP (LibreChat, …) |
|
| OpenAPI tool servers (Open WebUI, …) | spec at |
stdio (local MCP clients)
The command you put in the client config depends on how you installed elog-mcp:
Installation | Command |
uvx (no install needed) |
|
pipx |
|
pip / from source |
|
From source (dev) |
|
Finding the binary path. If which elog-mcp does not print a path (e.g.
you installed with pipx but your client runs in a different shell environment),
use:
pipx runpip show elog-mcp | grep Location
# → …/site-packages
# then: find …/site-packages/../../bin -name elog-mcpor on most systems simply:
ls ~/.local/bin/elog-mcpUse the absolute path in that case.
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"elog": {
"command": "uvx",
"args": ["elog-mcp"],
"env": { "ELOG_URL": "…", "ELOG_USER": "…", "ELOG_PASSWORD": "…" }
}
}
}If you installed with pipx and prefer the standalone binary:
{
"mcpServers": {
"elog": {
"command": "/home/YOU/.local/bin/elog-mcp",
"env": { "ELOG_URL": "…", "ELOG_USER": "…", "ELOG_PASSWORD": "…" }
}
}
}opencode (~/.config/opencode/opencode.json):
{
"mcp": {
"elog": {
"type": "local",
"command": ["uvx", "elog-mcp"],
"environment": { "ELOG_URL": "…", "ELOG_USER": "…", "ELOG_PASSWORD": "…" }
}
}
}If you installed with pipx and prefer the standalone binary:
{
"mcp": {
"elog": {
"type": "local",
"command": ["/home/YOU/.local/bin/elog-mcp"],
"environment": { "ELOG_URL": "…", "ELOG_USER": "…", "ELOG_PASSWORD": "…" }
}
}
}From source (without installing):
uv run elog-mcpstreamable-http (remote MCP clients)
ELOG_MCP_TRANSPORT=streamable-http elog-mcpRegister http://127.0.0.1:8000/mcp as a remote MCP server in your UI.
openapi (Open WebUI & friends)
ELOG_MCP_TRANSPORT=openapi \
ELOG_API_KEY=pick-a-random-secret \
elog-mcpFive read-only endpoints mirror the tools below (operationIds equal the tool
names). In Open WebUI: Settings → Tools → + (user-level, fetched by your
browser) or Admin Settings → Tools (global, fetched by its backend), enter
the server URL, and put your ELOG_API_KEY value in the Bearer key field.
HTTPS: pass ELOG_MCP_CERTFILE/ELOG_MCP_KEYFILE, or put a reverse proxy
or tunnel (e.g. cloudflared tunnel --url http://localhost:8000) in front.
For locally-trusted dev certs: mkcert -install && mkcert localhost 127.0.0.1 ::1,
then feed the two files to the variables above (absolute paths).
Reachability rules of thumb:
Everything binds
127.0.0.1by default. SetELOG_MCP_HOST=0.0.0.0and anELOG_API_KEYwhenever someone else must reach the server.Client in Docker?
127.0.0.1inside its container is not your machine — usehttp://host.docker.internal:<port>(--add-host=host.docker.internal:host-gatewayon Linux).Hosted instance (e.g. a university WebUI)? It can never reach your laptop's loopback. User-level tool servers are additionally subject to that site's Content-Security-Policy — if DevTools shows the request as Transferred: CSP, the browser blocked it and only an IT-side
connect-srcchange helps. The practical route: deploy elog-mcp somewhere reachable and let the admins register it once as a global tool server.
Tools
Same five operations on every transport (REST routes shown for openapi):
Tool | REST route | Purpose |
|
| List logbooks |
|
| Regex full-text + attribute + date filtering; returns excerpts |
|
| Full entry body, attributes, threading |
|
| Newest-first shortcut |
|
| Base64 attachment content |
Notes:
Text and attribute filters are regular expressions (elogd semantics);
^value$anchors give exact matches.Dates:
YYYY-MM-DD[ HH:MM[:SS]], or uselast_daysinstead of a range;logbook="*"searches all known logbooks.Errors surface uniformly:
EntryNotFound,AuthFailed,ServerError,NetworkError,InvalidLogbook(REST status codes: 404/502/502/503/404, invalid query parameters → 400/422).
Development
uv run pytest # unit tests, offline
uv run pytest -m live # live suite (needs ELOG_TEST_URL)
uv run ruff check . # lint
uv run ruff format --check . # formatting gate
uv run mypy src # type check (strict)Protocol details and wire-format references live in RESOURCES.md;
architecture and tool contracts in SPEC.md.
Available Tools
5 toolselog_get_attachmentA
Download an attachment (screenshot, config file, ...) as base64 content.
Args: logbook: Name of the logbook holding the attachment. filename: Attachment filename exactly as listed on the entry.
Returns {filename, content_b64, mime, size}; embed via MCP resource mechanisms when presenting to users.
| Name | Required | Description | Default |
|---|---|---|---|
| logbook | Yes | ||
| filename | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 discloses the return structure ({filename, content_b64, mime, size}) and advises embedding via MCP resource mechanisms, which is key behavioral context. It doesn't mention error conditions, authentication, or size limits, but for a simple read operation the core behavior is well-covered.
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 concise and well-structured with explicit 'Args' and 'Returns' sections. The purpose is front-loaded, and every sentence adds value. There is no redundancy or 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?
For a two-parameter tool with an output schema (per context), the description covers all necessary calling information: parameters, return format, and integration guidance. No additional details are needed for an agent to call it 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 does so effectively: 'logbook' is explained as the name of the holding logbook, and 'filename' is specified as the exact name as listed on the entry. This adds critical meaning beyond the bare schema titles.
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 opens with a specific verb ('Download') and a concrete resource ('an attachment'), and specifies the output encoding ('as base64 content'). This clearly distinguishes it from sibling tools like elog_get_entry or elog_search, which operate on entries or search results rather than binary attachments.
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 clearly implies when to use the tool: when you need to retrieve an attachment by logbook and filename. It does not explicitly reference alternatives or exclusions, but the purpose is self-evident and matches the tool's name. Since no sibling tool offers attachment downloading, no additional routing guidance is necessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
elog_get_entryA
Read one logbook entry in full: all attributes, complete body, attachments.
Args: logbook: Name of the logbook containing the entry. entry_id: Numeric message ID of the entry.
Returns the full entry record including the untruncated body text, threading info (reply_to / in_reply_to) and the canonical web URL.
| Name | Required | Description | Default |
|---|---|---|---|
| logbook | Yes | ||
| entry_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and discloses meaningful behavioral traits: it returns untruncated body text (a notable distinction from truncated list results), threading info (reply_to/in_reply_to), and the canonical web URL. This directly informs the agent of valuable return characteristics beyond a bare 'reads an entry.'
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?
Purpose is front-loaded in the first line, followed by a compact Args section and a concise Returns section. The structure is clean and scannable, though the Returns paragraph is slightly redundant with the opening line's mention of attributes, body, and attachments.
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 two-parameter read tool, the description is substantially complete: both parameters are explained, return value structure is disclosed, and the output schema exists to formalize the record shape. Missing only minor context like authentication prerequisites, which is typically not tool-specific for a 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, and it does: it explains logbook as 'Name of the logbook containing the entry' and entry_id as 'Numeric message ID of the entry.' Both parameters are adequately documented in prose despite the empty schema titles, with no enums or nesting concerns.
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 verb ('Read') and resource ('one logbook entry in full'), and lists what makes it distinct from siblings: all attributes, complete body, and attachments. The 'in full' phrasing clearly differentiates it from the list/summary tools in the sibling set like elog_get_recent_entries.
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 this is the right tool when you need a complete single entry rather than a summary or search result, but it never explicitly names alternatives or gives conditions for choosing between them. The 'in full' contrast versus elog_search and elog_get_recent_entries is implied, not stated. No exclusions or when-not-to-use guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
elog_get_recent_entriesA
Fetch the newest entries of a logbook, newest first.
Args: logbook: Name of the logbook to read. count: Number of recent entries to return.
Returns {"total": int, "entries": [...]} with excerpts like elog_search.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| logbook | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden. It discloses the return format ('Returns {"total": int, "entries": [...]}'), the ordering ('newest first'), and references sibling behavior ('excerpts like elog_search'). This adds meaningful context beyond the schema, though it does not address read-only guarantees, pagination limits, or error conditions, leaving some room for improvement.
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 concise and well-structured. It leads with the one-sentence purpose, then lists parameters in a clear 'Args:' block, and ends with the return type. No filler or redundancy; every sentence contributes useful information. The most critical info (what it does) is front-loaded.
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 (2 params, no enums, output schema exists), the description is complete. It states the purpose, parameter meanings, and the return shape, and references sibling behavior for the excerpt format. The presence of an output schema reduces the need to explain return details further, and nothing essential for a correct call is missing.
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?
With schema description coverage at 0%, the description must compensate. It clearly defines both parameters: 'Name of the logbook to read' for logbook and 'Number of recent entries to return' for count. This provides semantics that the schema omits, fully explaining the purpose of each 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 opens with a clear action verb and resource: 'Fetch the newest entries of a logbook, newest first.' It identifies the resource (logbook entries) and the ordering (newest first), which distinguishes it from siblings like elog_search (searches by criteria) and elog_get_entry (single entry).
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 purpose implies usage ('when you want recent entries'), but there is no explicit comparison to alternatives or conditions for when not to use this tool. It does not name elog_search or elog_get_entry as alternatives, nor does it describe when they would be more appropriate. Guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
elog_list_logbooksA
List the logbooks available on the configured ELOG server.
Returns a list of {name, description?, url} objects. The optional ELOG_LOGBOOKS environment variable restricts and orders the result.
| 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 provided, the description carries the full burden of behavioral disclosure. It discloses the return format (list of {name, description?, url} objects) and the effect of an optional environment variable (ELOG_LOGBOOKS) that restricts and orders results. This adds meaningful behavioral context beyond a simple 'list' call, though it does not cover potential errors or auth requirements.
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 concise sentences. The first states the purpose immediately; the second provides return format and an optional configuration detail. No redundant wording, no filler, and the most important information is front-loaded.
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 listing tool with no parameters and an output schema that likely describes the returned objects, the description is complete. It covers what it does, what it returns, and a relevant environment variable. The sibling tools are all entry-focused, so there is no missing context about when to use this tool. No output schema is shown, but the description compensates by describing the return structure.
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 provides no parameter meaning. The description adds value by explaining what is returned and mentioning the ELOG_LOGBOOKS environment variable as a configuring influence. This goes beyond the empty schema and justifies a score above the baseline for no-parameter tools.
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' and a specific resource 'logbooks available on the configured ELOG server'. It clearly distinguishes from sibling tools (elog_search, elog_get_entry, etc.) which all operate on entries rather than logbooks. No ambiguity.
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 (when you need the list of logbooks) but does not explicitly state when to use it vs alternatives or when not to use it. Since siblings are all entry-focused, the context makes the purpose obvious, but no explicit guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
elog_searchA
Search logbook entries by full text, attributes, and/or date.
Args: text: Regular expression matched against entry message bodies. Use ^…$ anchors for exact matches. attributes: Exact attribute filters as regular expressions, e.g. {"Author": "^jdoe$", "Category": "DAQ"}. date_from: Inclusive range start, 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM[:SS]'. date_to: Inclusive range end, same formats (time defaults to 23:59:59). last_days: Show entries from the last N days instead of an explicit range. logbook: Logbook name to search, or "*" to search all known logbooks. max_results: Maximum number of entries returned per page (server cap 100000). reverse: Sort newest-first when true, oldest-first when false.
Returns {"total": int, "entries": [{id, logbook?, date_raw, date_iso?, attributes{}, text_excerpt, encoding, encoding_name, attachments[], reply_to[], in_reply_to?, url}]}.
Each entry's text_excerpt is a ~500-char window centred on the first
occurrence of the search phrase (when text is provided). The full entry
body may contain additional matches; use elog_get_entry for the complete
text.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| date_to | No | ||
| logbook | No | * | |
| reverse | No | ||
| date_from | No | ||
| last_days | No | ||
| attributes | No | ||
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility and does so thoroughly: it defines regex semantics, inclusive date formats with defaults, server caps for max_results, sort ordering via reverse, and the ~500-character excerpt behavior. It discloses return fields and the important caveat that additional matches may exist in the full body.
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 front-loaded with a one-line summary and then organized into Args and Returns sections. Every sentence adds meaningful operational detail—regex anchoring, date defaults, excerpt size, and the alternative tool—without repetition or 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?
For a complex 8-parameter search tool with no annotations and no schema-level parameter documentation, the description covers all usage aspects: parameter semantics, return structure, behavioral edge cases, and the relationship to elog_get_entry. Nothing an agent needs to invoke it correctly is missing.
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 entirely. It explains every one of the 8 parameters, including format, defaults, wildcard behavior, filtering semantics, and pagination implications. This fully supplies the meaning missing from the 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 opens with a specific verb and resource: 'Search logbook entries by full text, attributes, and/or date.' It clearly defines a distinct search capability and even names the sibling elog_get_entry for retrieval of complete entry text, distinguishing search from retrieval.
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 explicitly explains when to use this tool versus alternatives: when text matches are only excerpts, it directs the agent to elog_get_entry for the full body. It also clarifies the '*' logbook wildcard and the last_days option for date-based searches. This gives clear usage context and an explicit alternative.
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.
5 tool updates
v0.1.0- First observed
elog_get_attachment - First observed
elog_get_entry - First observed
elog_get_recent_entries - First observed
elog_list_logbooks - First observed
elog_search
TDQS
Scored across 5 tools
Each tool maps to a distinct operation (listing logbooks, searching, reading a single entry, browsing recent entries, fetching attachments), so confusion is unlikely. However, elog_get_recent_entries overlaps with elog_search's last_days and reverse options, making the boundary between them slightly less sharp.
The elog_ prefix and verb-first style are consistent, and most tools follow a verb_noun pattern such as elog_list_logbooks, elog_get_entry, and elog_get_attachment. elog_search is the one outlier because it omits an explicit object, which is a minor deviation from the otherwise predictable pattern.
Five tools is a well-scoped size for a read-only logbook client. Each tool covers one essential need—discovering logbooks, searching entries, reading full entries, browsing recent entries, and downloading attachments—without unnecessary redundancy or bloat.
The read-oriented surface is complete for searching, reading, and retrieving attachments from ELOG entries. The only notable gap is the absence of write or lifecycle tools such as creating, replying to, or editing entries, though this appears to be an intentional read-only scope.
Maintenance
Related MCP Connectors
Search and read Empryo's documentation. Read-only, no auth, no local access.
Read-only search and page retrieval from the public Atisbo documentation corpus. No authentication.
Read-only access to Auralogs production logs: search logs, inspect errors, review AI analyses.
Anonymous read and search over the published nowyourlink developer documentation.
Related MCP Servers
AlicenseAqualityBmaintenanceEnables discovery of HEPData records, tables, and data access with read-only operations and export links.9GPL 2.0- AlicenseAqualityDmaintenanceRead-only MCP server for exploring and searching OpenSearch clusters, enabling log analysis, index exploration, and query execution.8MIT
- FlicenseNot gradedqualityCmaintenanceRead-only MCP server for Elasticsearch log querying. Enables natural language search, filtering, context retrieval, and aggregation of logs.-
- FlicenseNot gradedqualityBmaintenanceRead-only MCP server that converts Elasticsearch logs into citable evidence for AI agents, offering deterministic log summarization and search tools.-