Skip to main content
Glama
Louis-Lastella

berichtsheft-mcp

berichtsheft-mcp

MCP server (stdio) for the BLok online Berichtsheft.

  • collect_week(week) – reads a Hermes state.db and returns what you worked on during a given ISO week, bucketed by day and by your work/school hours. Raw data only; your agent turns it into bullet points.

  • fill_week(week, entries, locations=None, dry_run=False) – logs into BLok with headless Playwright and appends lines per weekday (BLok Tagesformat): entries={"thursday": ["..."]}, locations={"thursday": "betrieb"} (schule, betrieb, ueberbetrieblich). Never overwrites, skips lines that already exist, returns a screenshot path. Requires "Wochenformat aktivieren" to be off in BLok's Benutzereinstellungen.

Intended flow: cron job collects on Friday → agent drafts → human approves → fill_week.

Setup

uv sync
mkdir -p ~/.config/berichtsheft
cp .env.example ~/.config/berichtsheft/.env && chmod 600 ~/.config/berichtsheft/.env
# edit it; either set CHROMIUM_PATH or run: uv run playwright install chromium

MCP client config (Hermes config.yaml):

mcp_servers:
  berichtsheft:
    command: uv
    args: [--directory, /path/to/berichtsheft-mcp, run, berichtsheft-mcp]

Related MCP server: time-tracker-ai-mcp

Config (~/.config/berichtsheft/.env)

Var

Example

BLOK_USERNAME / BLOK_PASSWORD

your BLok login

WORK_HOURS

mon=12:45-16:15;tue=07:30-16:15

SCHOOL_HOURS

mon=07:30-12:45;wed=07:30-12:45

HERMES_STATE_DB

default ~/.hermes/state.db

CHROMIUM_PATH

optional, e.g. /usr/bin/chromium

SCREENSHOT_DIR

default ~/.cache/berichtsheft

Test

uv run pytest

MIT

Available Tools

2 tools
collect_weekA

Rohdaten einer ISO-Woche (z.B. '2026-W39') aus der Hermes-Session-DB.

Gibt pro Wochentag die Sessions im Zeitfenster 'betrieb' (WORK_HOURS) bzw. 'schule' (SCHOOL_HOURS) zurück: Titel, User-Nachrichten, letzte Antwort. Ungefiltert und unzusammengefasst: der Aufrufer muss Privates aussortieren und daraus Stichpunkte machen.

ParametersJSON Schema
NameRequiredDescriptionDefault
weekYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full load and does disclose key traits: this is a raw, unfiltered, non-summarized read that buckets sessions by WORK_HOURS vs SCHOOL_HOURS and includes user messages. It stops short of covering permissions, empty-week behavior, or data volume.

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

Conciseness5/5

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

Three tight sentences: source + parameter format first, then the per-day return shape, then the caller's responsibility. Nothing redundant and the most important constraint (raw/unfiltered) is front-loaded.

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

Completeness4/5

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

No output schema exists, and the description does describe the returned fields and time-window grouping, so an agent knows what comes back. Minor gaps remain around error/empty cases and result size, but the core contract is complete.

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

Parameters4/5

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

Schema coverage is 0% and the single 'week' property is undocumented in the schema, so the description must compensate. The inline example '2026-W39' establishes the required ISO-week string format, which is exactly the missing semantic.

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

Purpose5/5

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

States a specific verb+resource (collect raw data for one ISO week) and precisely enumerates the return payload per weekday. The 'ungefiltert und unzusammengefasst' framing implicitly but clearly separates it from a summarizing/filling sibling like fill_week.

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

Usage Guidelines3/5

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

It tells the caller what post-processing is expected ('Privates aussortieren und Stichpunkte machen'), which implies how the tool is meant to be used, but never states when to pick this over fill_week or any preconditions (e.g., session DB availability, date validity).

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

fill_weekA

Trägt Stichpunkte in die BLok-Woche ein (ISO-Woche, z.B. '2026-W39').

entries = {"betrieb": [...], "themen": [...], "schule": [...]}, je ein Stichpunkt pro Zeile. Bestehende Zeilen werden nie überschrieben, identische übersprungen. Nur nach ausdrücklicher Freigabe durch den Nutzer aufrufen. dry_run=True loggt nur ein und zeigt, was eingetragen würde.

ParametersJSON Schema
NameRequiredDescriptionDefault
weekYes
dry_runNo
entriesYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses that existing lines are never overwritten, identical entries are skipped (dedup/idempotency), and that dry_run only logs. It omits what the tool returns and how errors/partial writes are handled.

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

Conciseness4/5

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

Front-loaded with purpose and format, then behavior and safety in short sentences; each sentence carries real information. Slightly dense but no filler.

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

Completeness4/5

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

For a 3-param mutation tool with nested entries, no annotations and no output schema, the description covers format, safety, idempotency and the dry-run escape hatch. The only real gap is omission of any return-value or error semantics.

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

Parameters5/5

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

Schema coverage is 0%, and the description compensates for all three parameters: week format is exemplified ('2026-W39'), entries keys are enumerated ('betrieb', 'themen', 'schule'), the one-per-line convention is stated, and dry_run behavior is explained. Nothing about the inputs is left undocumented.

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

Purpose4/5

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

States a specific verb ('Trägt ... ein') and resource ('BLok-Woche') and clarifies the ISO-week format with an example. However, it never mentions the sibling collect_week, so the agent gets no help distinguishing write-vs-collect beyond the verbs themselves.

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

Usage Guidelines4/5

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

Gives an explicit gating condition – 'Nur nach ausdrücklicher Freigabe durch den Nutzer aufrufen' – plus a dry_run trial mode, which is clear usage context. It stops short of naming alternatives or stating when-not to use it relative to collect_week.

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

Tool Schema Changelog

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

  1. 2 tool updatesv0.1.0
    • First observedcollect_week
    • First observedfill_week

TDQS

A4.1/5.0

Scored across 2 tools

Disambiguation5/5

The two tools have clearly distinct roles: collect_week reads raw session data, while fill_week writes summarized bullet points into the report book. Their inverse read/write purposes are unambiguous and complementary.

Naming Consistency5/5

Both names follow the same verb_noun pattern (collect_week, fill_week) and share the same noun, making the set predictable and easy to scan.

Tool Count3/5

With only 2 tools, the surface feels thin even for a narrow weekly-report workflow; a read/inspect tool for existing entries or an update capability would help justify a slightly larger set.

Completeness3/5

The core collect-then-fill lifecycle is covered, but there is no way to read back what has already been entered, update non-duplicate existing lines, or delete entries. These are notable gaps, though the dry_run and duplicate-skipping behavior partially mitigates them.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers