Terminal access to Poland's largest IT job board — JSON output, smart filters, and AI agent support.
it-pracuj-pl gives you fast, scriptable access to it.pracuj.pl — Poland's largest IT job board — directly from your terminal. Search job offers, compare technology demand, explore available filters, and sync data locally for offline use.
The tool ships two binaries: it-pracuj-pl (the CLI) and it-pracuj-pp-mcp (a Model Context Protocol server for use with Claude Desktop and other MCP-compatible AI agents).
- 📈 filters — Show available filters and live offer counts for any keyword — work modes, position levels, contract types, IT specializations
- ⚖️ compare — Compare job offer counts for multiple technologies side-by-side; runs all queries in parallel
- 📋 job-offers — List, count, and group IT job offers with rich filtering (keyword, work mode, employment type, tech category, position level, salary range)
- 🏢 companies — Fetch company profile metadata by ID
- 🌟 recommended-job-offers — Retrieve recommended job offers grouped by category
- 📦 subservices — Get total job counts across all categories (IT, engineering, sales, blue-collar)
- 🔄 sync — Pull live API data into a local SQLite store with FTS5 full-text search
- 🔍 search — Full-text search across synced local data — works without network
- 📥 import — Import data from a file into the local store
- 🧩 MCP server — Exposes all API operations as MCP tools for Claude Desktop and compatible agents
- ⚡ Agent mode —
--agentflag enables JSON + compact + non-interactive output in one flag - 📡 agent-context — Prints a machine-readable JSON description of all capabilities for AI agents
- 🔎 which — Natural language capability resolver (
which "find remote react jobs")
- 📤 Output delivery — Route output to
stdout(default),file:<path>, orwebhook:<url> - 💾 Named profiles — Save and reuse flag combinations with
profile save/profile apply - 📝 Multiple formats — JSON, CSV, plain tab-separated, or human-friendly table
- 🏥 doctor — Health check that verifies configuration and API connectivity
- 🌐 Browser-compatible transport — Chrome-like HTTP headers handle Cloudflare-protected endpoints automatically
- ✨ Features
- 📦 Installation
- 🚀 Quick Start
- ⚙️ Commands
- 🎛️ Global Flags
- 🔧 Configuration
- 🧩 MCP Integration
- 💡 Examples
- 📁 Project Structure
- 🤝 Contributing
- 📜 License
- 🙏 Acknowledgments
- 📧 Contact & Support
Download the latest binary for your platform from the Releases page.
| Platform | Archive |
|---|---|
| macOS Apple Silicon | it-pracuj-pl_darwin_arm64.tar.gz |
| macOS Intel | it-pracuj-pl_darwin_amd64.tar.gz |
| Linux amd64 | it-pracuj-pl_linux_amd64.tar.gz |
| Linux arm64 | it-pracuj-pl_linux_arm64.tar.gz |
| Windows amd64 | it-pracuj-pl_windows_amd64.zip |
| Windows arm64 | it-pracuj-pl_windows_arm64.zip |
On macOS, clear the Gatekeeper quarantine after download:
xattr -d com.apple.quarantine it-pracuj-pl
chmod +x it-pracuj-plbrew install JanSzewczyk/homebrew-tap/it-pracuj-plRequires Go 1.22+:
go install github.com/JanSzewczyk/it-pracuj-cli/cmd/it-pracuj-pl@latestgit clone https://github.com/JanSzewczyk/it-pracuj-cli.git
cd it-pracuj-cli
make build
# Binary at bin/it-pracuj-pl# Health check — verify API connectivity
it-pracuj-pl doctor
# Total job offer counts across all categories
it-pracuj-pl subservices
# Count offers for a keyword
it-pracuj-pl job-offers list-count --keyword "backend developer"
# List remote React job offers as JSON
it-pracuj-pl job-offers list-offers --keyword react --work-mode home-office --json
# Show available filters for a technology
it-pracuj-pl filters golang
# Compare demand across technologies
it-pracuj-pl compare react vue angular --sort| Command | Description |
|---|---|
job-offers list-count |
Count job offers matching search criteria |
job-offers list-grouped |
Get grouped counts by filter category (work mode, position level, contract type, IT specialization) |
job-offers list-offers |
List job offers — scrapes it.pracuj.pl and returns structured offer data |
list-offers filters:
| Flag | Description |
|---|---|
--keyword <kw> |
Search keyword (required) |
--city <name> |
City name, e.g. warszawa, kraków |
--radius <km> |
Search radius in km from city |
--work-mode <modes> |
Comma-separated: full-office, hybrid, home-office, mobile |
--it-spec <spec> |
IT specialization: frontend, backend, fullstack, devops, mobile, data-analytics-and-bi, ai-ml, and 14 more |
--it-tech <ids> |
Technology IDs, comma-separated (e.g. 76,33,42 = React, JavaScript, TypeScript). See full list |
--position-level <codes> |
17=Junior, 4=Mid, 18=Senior, 19=Expert, 5=Manager |
--contract-type <codes> |
0=UoP, 3=B2B, 2=zlecenie, 1=o dzieło |
--with-salary |
Only offers with disclosed salary range |
--no-agency |
Direct employer offers only |
--posted-within <days> |
1, 3, 7, 14, or 30 days |
See docs/filters.md for the complete filter and technology ID reference.
| Command | Description |
|---|---|
filters <keyword> |
Show live offer counts for all available filters — work modes, position levels, contract types, IT specializations |
compare <kw1> [kw2...] |
Compare job offer counts for multiple keywords side-by-side (parallel queries) |
compare flags:
| Flag | Description |
|---|---|
--sort |
Sort results by offer count (descending) |
--subservice <n> |
Limit to a specific job category (default: IT) |
| Command | Description |
|---|---|
companies --ids <ids> |
Get company profile metadata by ID (comma-separated) |
subservices |
Get total job counts across all categories (IT, engineering, sales, blue-collar) |
recommended-job-offers |
Get recommended job offers grouped by category |
| Command | Description |
|---|---|
sync |
Pull live API data into the local SQLite store |
search <query> |
Full-text search across synced local data |
import <file> |
Import data from a file into the local store |
| Command | Description |
|---|---|
agent-context |
Print machine-readable JSON description of all capabilities |
which <description> |
Natural language capability resolver |
doctor |
Verify configuration and API connectivity |
profile |
Manage named flag profiles (save, apply, list, delete) |
feedback |
Submit feedback (stored locally by default) |
version |
Print version |
Run it-pracuj-pl --help or it-pracuj-pl <command> --help for the complete flag reference.
These flags work on every command:
| Flag | Default | Description |
|---|---|---|
--json |
false |
Output as JSON |
--compact |
false |
Return only key fields (reduces token usage for agents) |
--csv |
false |
Output as CSV |
--plain |
false |
Output as plain tab-separated text |
--quiet |
false |
Bare output, one value per line |
--agent |
false |
Set all agent-friendly defaults (--json --compact --no-input --no-color --yes) |
--dry-run |
false |
Show request details without sending |
--no-cache |
false |
Bypass response cache |
--data-source |
auto |
Data source: auto (live + local fallback), live (API only), local (synced only) |
--select <fields> |
— | Comma-separated fields to include in output (e.g. --select id,name) |
--deliver <sink> |
— | Route output: stdout, file:<path>, webhook:<url> |
--profile <name> |
— | Apply a saved named profile |
--rate-limit <n> |
2 |
Max requests per second (0 to disable) |
--timeout <dur> |
30s |
Request timeout |
--human-friendly |
false |
Enable colored output and rich formatting |
--no-color |
false |
Disable colored output |
--no-input |
false |
Disable all interactive prompts (for CI and agents) |
--yes |
false |
Skip confirmation prompts |
Exit codes: 0 success · 2 usage error · 3 not found · 5 API error · 7 rate limited · 10 config error
Config file: ~/.config/it-pracuj-pl/config.toml
[headers]
# Static request headers applied to every request.
# Per-command overrides take precedence.
# User-Agent = "my-scraper/1.0"| Path | Purpose |
|---|---|
~/.config/it-pracuj-pl/config.toml |
Static headers and global settings |
~/.cache/it-pracuj-pl/http/ |
HTTP response cache (SHA256-keyed) |
~/.local/share/it-pracuj-pl/data.db |
Local SQLite store (FTS5) |
it-pracuj-cli ships an MCP server (it-pracuj-pp-mcp) that exposes all API operations as tools for Claude Desktop and other MCP-compatible AI agents.
go install github.com/JanSzewczyk/it-pracuj-cli/cmd/it-pracuj-pp-mcp@latestOr download the pre-built binary from the Releases page.
Add to your Claude Desktop config:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"it-pracuj": {
"command": "it-pracuj-pp-mcp"
}
}
}| Tool | Description |
|---|---|
job_offers_list_count |
Count job offers matching criteria |
job_offers_list_grouped |
Get grouped counts by filter category |
job_offers_list_offers |
List job offers with full filter support |
companies_list_metadata |
Get company profile metadata by ID |
subservices_list_counts |
Get job counts by service category |
recommendedJobOffers_list_grouped |
Get recommended job offers grouped by category |
The MCP server also mirrors the full Cobra command tree at runtime — every user-facing CLI command becomes an additional MCP tool automatically.
# Which backend language has the most IT job offers in Poland?
it-pracuj-pl compare go python java rust --sort --jsonit-pracuj-pl job-offers list-offers \
--keyword react \
--work-mode home-office \
--position-level 18 \
--contract-type 3 \
--jsonit-pracuj-pl companies --ids 42 --json --deliver file:company.json# Pull all IT offers to local store
it-pracuj-pl sync
# Search locally (no network required)
it-pracuj-pl search "golang kubernetes" --data-source local --json# All agent-friendly flags in a single --agent shortcut
it-pracuj-pl job-offers list-count --keyword typescript --agent \
| jq '.results.offersCount'# Save a profile once
it-pracuj-pl profile save daily --json --compact --quiet
# Reuse it later
it-pracuj-pl job-offers list-count --keyword react --profile dailyit-pracuj-cli/
├── cmd/
│ ├── it-pracuj-pl/ # CLI binary entry point
│ └── it-pracuj-pp-mcp/ # MCP server binary entry point
├── internal/
│ ├── cache/ # SHA256-keyed HTTP response cache
│ ├── cli/ # All CLI commands (~25 files, Cobra)
│ ├── client/ # HTTP client — browser-compatible headers, retries, rate limiting
│ ├── cliutil/ # Shared utilities: concurrent fanout, adaptive rate limiter
│ ├── config/ # TOML config loader
│ ├── mcp/ # MCP tool registration
│ │ └── cobratree/ # Reflects Cobra command tree → MCP tools at runtime
│ ├── scraper/ # Next.js __NEXT_DATA__ extraction + 270+ IT tech ID lookup
│ └── store/ # SQLite store — FTS5, WAL mode, schema versioning
├── docs/
│ └── filters.md # Complete filter reference (343 IT technologies with IDs)
├── .golangci.yml # Linter configuration
├── .goreleaser.yaml # Cross-platform release automation (6 targets)
├── go.mod # Go module (github.com/JanSzewczyk/it-pracuj-cli)
├── Makefile # Build targets
└── spec.yaml # API specification (captured from browser traffic)
cmd/— Minimal entry points; all business logic lives ininternal/internal/cli/— Cobra command tree; each file maps to one command or command groupinternal/store/— SQLite persistence with FTS5 full-text search, WAL mode, and schema version migrationsinternal/scraper/— Extracts structured offer data fromit.pracuj.plSSR HTML and maps 270+ IT technologies to their API IDsinternal/mcp/cobratree/— Reflects the entire Cobra command tree into MCP tools at runtime — new CLI commands become MCP tools automatically
Contributions are welcome!
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes using Conventional Commits
- Run tests:
go test ./... - Open a Pull Request
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.
- CLI Printing Press — toolchain used to scaffold this CLI
- Cobra — CLI framework
- mark3labs/mcp-go — MCP server library for Go
- enetx/surf — Browser-compatible HTTP client
- modernc.org/sqlite — Pure-Go SQLite driver (no CGO required)
Made with ❤️ by JanSzewczyk
If this CLI helped you, please consider giving it a ⭐ on GitHub!