go_job
工作、远程和自由搜索MCP服务器。展示4个MCP工具,用于跨主要平台进行结构化作业发现。
MCP工具
| 工具 | 来源 | 描述 |
|---|
job_search | LinkedIn、Greenhouse、Lever、YC、HN、Indeed、Habr | 结构化求职筛选(经验、类型、远程、薪资、轻松申请)。返回多达15个重复的工作,包括工资、技能和描述。 |
remote_work_search | RemoteOK,WeWork远程,远程,SearXNG | 远程第一次求职。返回包含薪资、标签和来源的结构化列表。 |
freelance_search | Freelancer.com(直接API),Upwork(SearXNG) | 自由职业者项目搜索。自由职业者API直接返回预算,技能,出价。 |
job_match_score | LinkedIn,Indeed,YC,HN | 使用Jaccard关键字重叠(0-100)对简历中的工作列表进行评分。返回按匹配分数排序的带有匹配/缺失关键字的作业。 |
筛选器(job_search)
| 筛选器 | 值 |
|---|
experience | 实习、入职、助理、中高级、董事、高管 |
job_type | 全职、兼职、合同制、临时 |
remote | 现场、混合、远程 |
time_range | 日、周、月 |
salary | 40k+、60k+、80k+、100k+、120k+、140k+、160k+、180k+、200k+ |
easy_apply | true(仅限LinkedIn轻松申请) |
platform | linkedin、温室、杠杆、ats、yc、hn、habr、startup、all(默认) |
建筑
go_job/
├── main.go
├── internal/
│ ├── engine/
│ │ ├── config.go # Config struct + Init()
│ │ ├── types_jobs.go # Input/output types for all 4 tools
│ │ ├── prompt.go # LLM instructions (JobSearchInstruction, etc.)
│ │ ├── llm.go # LLM calls + SummarizeJobResults
│ │ ├── textutil.go # CanonicalJobKey, TruncateRunes, user agents
│ │ ├── cache.go # 2-tier cache: L1 in-memory + L2 Redis
│ │ ├── search.go # SearchSearXNG, DedupByDomain
│ │ ├── fetch.go # FetchURLContent (readability + html→markdown)
│ │ ├── httpclient.go # BrowserClient (Chrome TLS fingerprint via bogdanfinn)
│ │ ├── retry.go # RetryHTTP, RetryDo (exponential backoff)
│ │ └── jobs/
│ │ ├── 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 ATSes
│ │ ├── match.go # Jaccard keyword scoring (job_match_score)
│ │ ├── resume.go # resume_analyze, cover_letter_generate, resume_tailor
│ │ ├── research.go # company_research
│ │ └── tracker.go # Job application tracker (SQLite)
│ ├── jobserver/
│ │ └── register.go # Tool registrations (all 4 MCP tools)
└── deploy/
└── go_job.service # systemd unit (port 8891)
关键实施细节
领英
- 客人API --无身份验证,Chrome TLS指纹通过
bogdanfinn/tls-client - 分页 --25个结果页面,最多
maxResults=50 - geo_id --42个已知地点(城市+国家)→ 精确的LinkedIn地理ID过滤器
- 轻松申请 —
f_JIYN=true 参数,暴露为 easy_apply 你好,世界 - JSON-LD --取回
schema.org/JobPosting 来自前8个职位的完整描述
确实
- GraphQL API --内部iOS应用程序端点(
apis.indeed.com/graphql) - 钥匙 --加载自
INDEED_API_KEY env(无硬编码) - 薪水 --结构从
baseSalary 或 estimated.baseSalary 范围 - 后备方案 --SearXNG
site:indeed.com/viewjob 如果GraphQL失败
Removative
- 免费公共API —
remotive.com/api/remote-jobs?search=...,无身份验证 - 加上
remote_work_search 与RemoteOK+WeWork一起远程工作
去重
- URL已删除(完全匹配)
- 规范键去重——规范标题(去掉“CompanyName”),折叠非字母数字
结构化薪资(职位列表)
{
"salary": "$80k–120k USD/yr",
"salary_min": 80000,
"salary_max": 120000,
"salary_currency": "USD",
"salary_interval": "year"
}
跑步
# HTTP mode (default port 8891)
MCP_PORT=8891 LLM_API_KEY=... INDEED_API_KEY=... ./bin/go_job
# stdio mode
./bin/go_job --stdio
构建和部署
make build # → bin/go_job
make deploy # build + copy service + restart systemd unit
make restart # restart only
配置(环境变量)
| 变量 | 默认值 | 描述 |
|---|
SEARXNG_URL | http://127.0.0.1:8888 | SearXNG实例 |
LLM_API_KEY | (必需) | Gemini/OpenAI兼容的API密钥 |
LLM_API_BASE | Gemini端点 | OpenAI兼容的基本URL |
LLM_MODEL | gemini-2.5-flash | 型号名称 |
MCP_PORT | 8891 | HTTP服务器端口 |
INDEED_API_KEY | (Indeed需要) | iOS应用程序密钥-设置在 .env |
REDIS_URL | (可选) | Redis用于L2缓存 |
CACHE_TTL | 900 | 缓存TTL(秒) |
FETCH_TIMEOUT | 15 | URL获取超时(秒) |
健康检查
curl http://localhost:8891/health
# {"status":"ok","service":"go_job","version":"1.0.0"}