Skip to content

feat: add Jobindex.dk job board provider - #203

Merged
amikai merged 11 commits into
mainfrom
feat/jobindex-provider
Jul 17, 2026
Merged

feat: add Jobindex.dk job board provider#203
amikai merged 11 commits into
mainfrom
feat/jobindex-provider

Conversation

@amikai

@amikai amikai commented Jul 17, 2026

Copy link
Copy Markdown
Owner

Summary

  • Add a dedicated Jobindex (jobindex.dk) job-board provider with jobindex_search_jobs / jobindex_get_job_detail MCP tools, wired into the openings-mcp server.
  • Search parses /jobsoegning HTML’s embedded var Stash payload (the old .json endpoint returns 204) and returns upstream field names (tid, headline, company, …), dropping only per-result card html.
  • Detail uses /vis-job/{tid} (not off-site /jobannonce/ redirects). Scraped fields use the same names where concepts match; no invented deadline merges.
  • Debug CLI: cmd/jobindex (search / detail --tid). Fixtures cover hosted (h*) and robot (r*) detail HTML.
  • Stash extract approach cited from ai-job-search helpers.ts.

Re-opens the work from #201 after #202 revert, with prior review feedback already applied.

Test plan

  • go test ./internal/provider/jobindex ./internal/openingsmcp ./cmd/openings-mcp
  • Live CLI: go run ./cmd/jobindex search --keyword backend --jobage 14
  • Live CLI: go run ./cmd/jobindex detail --tid h1683131
  • Live MCP smoke: jobindex_search_jobs + jobindex_get_job_detail
  • CI green on this PR

amikai and others added 11 commits July 17, 2026 20:06
Dedicated jobindex_search_jobs / jobindex_get_job_detail MCP tools, debug
CLI, and fixture-backed tests. Search returns Stash searchResponse field
names (minus card html); detail scrapes /vis-job/{tid}. Includes review
fixes: no synthesized total_pages, JoinPath, goquery og meta, robot (r*)
detail fixture, and GitHub citations for the Stash extract helpers.
json.Decoder already does the string/brace walk, so the hand-written
endOfJSONObject scanner is redundant; decoding straight off the response
body also stops downloading once the Stash object ends.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The per-function citations repeated the same blob URL; parseSearchHTML's
comment already covers all three ported steps.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Field lists, page size, and the apply_deadline caveat already live in the
input/output schemas; Stash and scraping are implementation detail.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Employers without a Jobindex profile render as plain text in the detail
toolbar; requiring an <a> dropped their company entirely (2 of 5 sampled
r-tids), leaving detail with less data than the search card.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Collapse apply_url / share_url / tracking url into a single results url
(prefer direct apply, else Jobindex page). Strip company homeurl and other
link noise from search and detail for LLM clients.
Map Jobindex listing dates to clearer field names for MCP clients while
keeping apply_deadline* separate from listing end.
Note YYYY-MM-DD in MCP schema and provider comments, matching ats isoDate.
…rams

Drop q=/jobage=/sort=/page= jargon from tool schemas so LLMs see intent-only
parameter and result descriptions.
Record the rationale for []map[string]any results and light slimming
(unstable Stash, no thin card DTO, drop fullcard html) next to the types.
@amikai
amikai merged commit 866b800 into main Jul 17, 2026
9 checks passed
@amikai
amikai deleted the feat/jobindex-provider branch July 17, 2026 13:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant