No description
  • JavaScript 42%
  • Python 41%
  • CSS 16.2%
  • Dockerfile 0.4%
  • HTML 0.4%
Find a file
Feiko e0d8c59168
All checks were successful
Build and Deploy / lint-backend (push) Successful in 13s
Build and Deploy / lint-frontend (push) Successful in 14s
Build and Deploy / test-backend (push) Successful in 32s
Build and Deploy / build-and-push (push) Successful in 10s
Build and Deploy / deploy (push) Successful in 19s
feat: MCP views, availability and data-health tools, compact output
Acts on feedback from an agent that actually used the server.

Views instead of more typed tools (migrations v7/v8). Domain knowledge belongs
in SQL, not in every query the caller writes, and a view stays composable where
a typed tool answers exactly one question:
- courses_resolved: price/duration lifted out of the JSON metadata blob,
  mirroring get_course_price_map (manual override wins, '' and 0 are absent).
- work_days_enriched: days joined to course and location with students (NULL->1),
  month, weekday, in_catalog, earns_revenue, revenue and travel_km.
SUM(revenue) over the view reproduces compute_stats exactly — asserted by a test,
verified against a 67-day dataset covering all four price/duration permutations.

get_availability. Free days have no row, so "when am I free" is not expressible
as a SELECT; the calendar has to be generated and subtracted from. This was the
one question the previous server could not answer at all.

data_health. Four checks on the loose work_days <-> courses text join. The
scraped-name check requires EXACT equality against a known spelling: a substring
test repeats the scraper's own bug, since the alias "Python" is a substring of
"Machine Learning with Python". Measured on the real catalog, the substring rule
found 0 of 25 mis-scrapes and the exact rule found 15, ranked by token overlap so
the certainly-wrong ones sort above translations. The duration check uses the
modal block length and needs real evidence, so honest bookings stay silent.

Output. Tools are now annotated `-> Any`: a `-> str` annotation made FastMCP
generate an output schema wrapping every result as {"result": "<json string>"},
so callers parsed JSON out of a JSON string. A test asserts no tool declares an
outputSchema. format="table" is the new default at roughly half the characters
of JSON, and list_days drops all-empty columns; query_sql never does, because a
column the caller selected being empty is itself an answer.

describe_schema returns DDL only — the parallel column array just restated it —
and now covers views.

Docs rewritten around the views, and the query recipes are executed by a test so
they cannot rot.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 11:49:10 +02:00
.claude feat: streamline UI, remove hours, and overhaul bulk/lunch workflows 2026-05-09 14:13:42 +02:00
.forgejo/workflows security: add bandit SAST and pip-audit to CI 2026-05-20 00:03:52 +02:00
docs feat: MCP views, availability and data-health tools, compact output 2026-07-23 11:49:10 +02:00
frontend fix: patch axios and brace-expansion to clear bun audit CI gate 2026-07-23 10:56:01 +02:00
routers feat: sliding sessions — 30-day expiry now counts from last use 2026-07-07 15:45:05 +02:00
tests feat: MCP views, availability and data-health tools, compact output 2026-07-23 11:49:10 +02:00
.dockerignore Add Docker configuration and ignore files 2026-03-25 12:50:55 +01:00
.gitignore Replace SQLite with Google Sheets, add Calendar import UI 2026-04-22 20:19:13 +02:00
.pre-commit-config.yaml fix(ops): use correct mirrors-oxlint repo for pre-commit 2026-05-09 22:15:24 +02:00
.ruff.toml ci: fix ruff linting errors and adjust config 2026-05-09 10:14:59 +02:00
CLAUDE.md feat: MCP views, availability and data-health tools, compact output 2026-07-23 11:49:10 +02:00
db.py feat: MCP views, availability and data-health tools, compact output 2026-07-23 11:49:10 +02:00
dependencies.py feat: sliding sessions — 30-day expiry now counts from last use 2026-07-07 15:45:05 +02:00
docker-compose.yml refactor: replace Google Sheets with SQLite, delete legacy cruft 2026-05-08 21:40:55 +02:00
Dockerfile feat: read-only MCP server at /mcp for agent access to the tracker DB 2026-07-23 10:41:55 +02:00
GEMINI.md docs: document use of Bitwarden Secrets Manager 2026-05-17 13:32:38 +02:00
insights_logic.py feat: MCP views, availability and data-health tools, compact output 2026-07-23 11:49:10 +02:00
main.py feat: read-only MCP server at /mcp for agent access to the tracker DB 2026-07-23 10:41:55 +02:00
mcp_server.py feat: MCP views, availability and data-health tools, compact output 2026-07-23 11:49:10 +02:00
migrate_from_sheets.py fix: improve multi-day timed events parsing from google calendar import 2026-07-02 00:06:44 +02:00
pyproject.toml security: add bandit SAST and pip-audit to CI 2026-05-20 00:03:52 +02:00
requirements.txt feat: read-only MCP server at /mcp for agent access to the tracker DB 2026-07-23 10:41:55 +02:00
scrape_courses.py security: add bandit SAST and pip-audit to CI 2026-05-20 00:03:52 +02:00
seed.json refactor(db): decouple seed data from logic 2026-05-09 16:52:53 +02:00
stats_logic.py security: gate financials by auth, harden OAuth/sessions, extract pure stats logic 2026-07-07 15:25:39 +02:00
token_store.py security: add bandit SAST and pip-audit to CI 2026-05-20 00:03:52 +02:00
tracker.db fix: improve multi-day timed events parsing from google calendar import 2026-07-02 00:06:44 +02:00