go_job

command module
v1.21.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 5, 2026 License: Apache-2.0 Imports: 32 Imported by: 0

README

go_job

Job search, resume optimization, career research, and application tracking — a Go MCP server exposing 28 tools across LinkedIn, Greenhouse, Lever, YC, HN, Indeed, Хабр, RemoteOK, WeWorkRemotely, Twitter/X, Google Jobs, and more.

MCP Tools

Tool Description
job_search Unified search: LinkedIn, Greenhouse, Lever, YC, HN, Indeed, Хабр, RemoteOK, WeWorkRemotely, Remotive, Twitter/X, Google Jobs. platform= selects source; limit (default 15, max 50) + offset for pagination.
job_match_score Score job listings against a resume using Jaccard keyword overlap (0–100).
opportunity_search Cross-type opportunity search (jobs + freelance + bounty).
opportunity_analyze Deep analyze a single opportunity URL.
opportunity_claim Initiate a claim action on a matched opportunity.
Resume
Tool Description
resume_analyze ATS score (0–100), missing keywords, gaps, recommendations.
cover_letter_generate Tailored cover letter (3 tones: professional / friendly / concise).
resume_tailor Rewrite resume sections to match JD, keyword diff.
master_resume_build Build a master resume profile from raw experience.
resume_generate Generate a targeted resume from the master profile.
resume_enrich Enrich master profile via Q&A.
resume_profile View the stored master profile.
resume_memory Semantic search/add/update over resume memory store.
Research
Tool Description
research Research salary, company, or person. subject=salary|company|person.
ats Direct ATS board fetch (Greenhouse, Lever, Ashby).
Interview & Career Prep
Tool Description
interview_prep Personalized Q&A (behavioral + technical + system design) with model answers.
project_showcase STAR-format project narratives with impact and talking points.
pitch_generate 30-sec & 2-min elevator pitches, "why this company" answer.
skill_gap Resume vs JD gap: match score, missing skills, learning plan.
Application Workflow
Tool Description
application_prep One-call combo: resume analysis + cover letter + interview prep + company research.
offer_compare Side-by-side offer comparison with scoring (0–100).
negotiation_prep Salary negotiation playbook: scripts, counters, BATNA.
linkedin LinkedIn profile operations.
linkedin_profile_ingest Ingest a LinkedIn profile for local analysis.
Tracker & Utilities
Tool Description
job_tracker Track job applications. action=add|list|update.
algora_job_ingest Ingest Algora bounty/job listings into the hunt store.
hunt_list List hunt entries from the local store (triggers lazy enrichment).
oversize Retrieve / list / purge oversized MCP responses from the spillover store.
Filter Values
experience internship, entry, associate, mid-senior, director, executive
job_type full-time, part-time, contract, temporary
remote onsite, hybrid, remote
time_range day, week, month
salary 40k+, 60k+, 80k+, 100k+, 120k+, 140k+, 160k+, 180k+, 200k+
easy_apply true (LinkedIn Easy Apply only)
platform linkedin, greenhouse, lever, ats, yc, hn, indeed, habr, remoteok, weworkremotely, remotive, twitter, google, un, inspira, undp, all (default)
limit 1–50 (default 15)
offset skip N results for pagination
blacklist comma-separated company/keyword exclusion

Architecture

go_job/
├── main.go
├── internal/
│   ├── engine/
│   │   ├── config.go          # Config struct + Init()
│   │   ├── bridge.go          # Source bridge wiring
│   │   ├── bridge_jobs.go     # Job-specific bridge helpers
│   │   ├── bridge_llm.go      # LLM bridge
│   │   ├── cache.go           # 2-tier cache: L1 in-memory + L2 Redis
│   │   ├── search.go          # SearchSearXNG, DedupByDomain
│   │   ├── metrics.go         # Prometheus counters/histograms
│   │   ├── pipeline.go        # Fan-out pipeline helpers
│   │   ├── types_jobs.go      # Input/output types
│   │   ├── prompt.go          # LLM instructions (shared)
│   │   ├── prompt_jobs.go     # Job-specific LLM prompts
│   │   └── jobs/              # Job source + career tool implementations
│   │       ├── linkedin.go    # LinkedIn Guest API + JSON-LD + geo_id + pagination
│   │       ├── indeed.go      # Indeed iOS GraphQL API + SearXNG fallback
│   │       ├── remotejobs.go  # RemoteOK + WeWorkRemotely + Remotive APIs
│   │       ├── habr.go        # Habr Карьера scraper
│   │       ├── hnjobs.go      # HN Who is Hiring (Algolia)
│   │       ├── ycjobs.go      # YC workatastartup.com
│   │       ├── ats.go         # Greenhouse + Lever + Ashby ATSes
│   │       ├── match.go       # Jaccard keyword scoring (job_match_score)
│   │       ├── resume.go      # resume_analyze, cover_letter_generate, resume_tailor
│   │       ├── research.go    # research tool (salary / company / person)
│   │       ├── tracker.go     # Job application tracker (SQLite)
│   │       ├── profile.go     # User profile persistence
│   │       └── ...            # algora, twitter, linkedin, bounty, opportunity, etc.
│   │   └── sources/           # Pluggable source connectors
│   │       ├── freelancer.go  # Freelancer.com REST API
│   │       ├── github.go      # GitHub jobs / PRs
│   │       ├── hackernews.go  # HN source
│   │       └── ...
│   ├── jobserver/
│   │   ├── register.go        # Tool registrations (28 MCP tools)
│   │   └── tool_*.go          # Per-tool handler files
│   └── hunt/                  # Hunt store + notifications
│       ├── notify/
│       │   └── telegram.go    # Telegram notifications via go-kit ProductSink
│       └── ...
└── deploy/
    └── go_job.service         # systemd unit (MCP :8891, metrics :9891)

Key Implementation Details

  • Unified platform: remote_work_search and freelance_search and twitter_job_search are folded into job_search via platform=remoteok|weworkremotely|remotive|twitter. Use raw=true with platform=twitter to skip LLM processing.
  • LinkedIn: no auth, Chrome TLS fingerprint via bogdanfinn/tls-client; pagination with offset; 42 geo locations.
  • Google Jobs: platform=google via SearXNG.
  • UN sources: platform=inspira (careers.un.org) / platform=undp / platform=un (fan-out both). Not included in platform=all.
research tool
  • Replaces three separate tools (salary_research, company_research, person_research).
  • subject=salary (role required), subject=company (company required), subject=person (name required).
job_tracker
  • Single tool replaces job_tracker_add, job_tracker_list, job_tracker_update.
  • action=add (title+company required), action=list, action=update (id required).
Data Storage
  • Job tracker DB: $UPLOADS_ROOT/go-job/tracker/tracker.db (SQLite, table jobs). Default path: $HOME/uploads/go-job/tracker/tracker.db. Override via UPLOADS_ROOT.
  • User profile: $UPLOADS_ROOT/go-job/profile/profile.json. Default: $HOME/uploads/go-job/profile/profile.json.
  • L1 cache: in-memory (sync.Map), lost on restart.
  • L2 cache: Redis (optional), persistent.
Notifications
  • New hunt entries trigger Telegram notifications via internal/hunt/notify/telegram.go using go-kit ProductSink (own bot, rate-limited fan-out).
  • Requires TELEGRAM_BOT_TOKEN + HUNT_NOTIFY_CHAT_ID env vars.

Running

# HTTP mode (default MCP port 8891, metrics port 9891)
MCP_PORT=8891 PROM_PORT=9891 LLM_API_KEY=... ./bin/go_job

# stdio mode
./bin/go_job --stdio

Build & Deploy

make build    # → bin/go_job
make deploy   # build + copy service + restart systemd unit
make restart  # restart only

Config (env vars)

Var Default Description
SEARXNG_URL http://127.0.0.1:8888 SearXNG instance
LLM_API_KEY (required) API key for the OpenAI-compatible LLM gateway
LLM_API_BASE http://127.0.0.1:8317/v1 OpenAI-compatible LLM gateway (cliproxyapi) base URL
LLM_MODEL (deploy-set) Primary model name. Model selection is dynamic (go-engine/llm) — see LLM_MODEL_FALLBACK
LLM_MODEL_FALLBACK (empty) CSV cross-provider fallback chain: tries the primary, then each entry on retryable failure, health-filtered against the gateway's /v1/models
MCP_PORT 8891 MCP HTTP server port
PROM_PORT 9891 Prometheus metrics port
REDIS_URL (optional) Redis for L2 cache
CACHE_TTL 900 Cache TTL in seconds
UPLOADS_ROOT $HOME/uploads Base dir for tracker DB + user profile
DATABASE_URL (optional) Postgres for oversized payload spillover
TELEGRAM_BOT_TOKEN (required for notifications) Telegram bot token
HUNT_NOTIFY_CHAT_ID (required for notifications) Notification recipient chat ID

Health check

curl http://localhost:8891/health
# {"status":"ok","service":"go_job","version":"1.0.0"}

Metrics

curl http://localhost:9891/metrics

Spillover store

Large MCP responses can exceed the MCP envelope limit (~25KB). go-job spills oversized payloads to a Postgres table oversize_responses (auto-migrated on startup).

When a tool response exceeds GO_JOB_OVERSIZE_THRESHOLD_BYTES (default 24576), the client receives a small envelope with oversize_id and a sample. Use the oversize tool to retrieve the full payload.

Requires DATABASE_URL. Gracefully falls back to direct response if unset.

Documentation

Overview

go_job — Job, Remote & Freelance Search MCP server.

Exposes MCP tools for job search, remote work, freelance, resume, interview prep, and more. Runs as HTTP MCP server or stdio transport.

Directories

Path Synopsis
cmd
migrate-application-pdfs command
cmd/migrate-application-pdfs is a one-shot migration that copies application PDFs from the legacy slug-based directory (APPLICATIONS_DIR) into the canonical uploads layout (go-kit/uploads, keyed by hunt_jobs.id).
cmd/migrate-application-pdfs is a one-shot migration that copies application PDFs from the legacy slug-based directory (APPLICATIONS_DIR) into the canonical uploads layout (go-kit/uploads, keyed by hunt_jobs.id).
migrate-tracker command
cmd/migrate-tracker migrates the legacy SQLite tracker.db rows into postgres hunt_jobs + hunt_ratings.
cmd/migrate-tracker migrates the legacy SQLite tracker.db rows into postgres hunt_jobs + hunt_ratings.
migrate-tracker-json command
migrate-tracker-json — one-shot migration of _tracker.json favorites into hunt_jobs + hunt_ratings.
migrate-tracker-json — one-shot migration of _tracker.json favorites into hunt_jobs + hunt_ratings.
internal
adminui
Package adminui serves go-job's operator admin (job/career tables) on a dedicated HTTP listener using the go-panel resource framework.
Package adminui serves go-job's operator admin (job/career tables) on a dedicated HTTP listener using the go-panel resource framework.
dbtest
Package dbtest provides test helpers for database integration tests.
Package dbtest provides test helpers for database integration tests.
engine/jobs/applications
Package applications is the single authority for application artifact paths, persistence, and resolution in go-job.
Package applications is the single authority for application artifact paths, persistence, and resolution in go-job.
hunt
Package hunt provides domain-typed persistent storage for job-hunting search results with URL-hash deduplication.
Package hunt provides domain-typed persistent storage for job-hunting search results with URL-hash deduplication.
hunt/discovery
Package discovery provides the cross-service URL-discovery client that delegates ATS board URL discovery to go-search's raw_web_search pipeline.
Package discovery provides the cross-service URL-discovery client that delegates ATS board URL discovery to go-search's raw_web_search pipeline.
hunt/enrich
Package enrich provides lazy on-read GitHub issue status enrichment for hunt entries.
Package enrich provides lazy on-read GitHub issue status enrichment for hunt entries.
hunt/notify
Package notify provides ingest-side Telegram notifications for hunt entries.
Package notify provides ingest-side Telegram notifications for hunt entries.
hunt/score
Package score provides the ScoringProfile struct and loader for the fit-scoring layer (Phase 2 of the hunt fit-scoring plan).
Package score provides the ScoringProfile struct and loader for the fit-scoring layer (Phase 2 of the hunt fit-scoring plan).
huntworker
Package huntworker provides a durable scheduled ATS ingest worker.
Package huntworker provides a durable scheduled ATS ingest worker.
oversize
Package oversize stores MCP tool responses that exceed the MCP envelope size limit (~25KB).
Package oversize stores MCP tool responses that exceed the MCP envelope size limit (~25KB).
pdfrender
Package pdfrender provides the TypstAdapter that implements applications.Renderer using go-kit/render/typst + go-kit/fileopt.
Package pdfrender provides the TypstAdapter that implements applications.Renderer using go-kit/render/typst + go-kit/fileopt.
quality
Package quality provides a deterministic job-posting quality score (0-100) that requires no LLM and no network access.
Package quality provides a deterministic job-posting quality score (0-100) that requires no LLM and no network access.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL