trackly-cli 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +77 -11
- package/lib/client.js +1 -1
- package/mcp/server.js +13 -13
- package/package.json +18 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Kevin Astuhuaman
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,22 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
[](https://www.npmjs.com/package/trackly-cli)
|
|
2
|
+
[](https://opensource.org/licenses/MIT)
|
|
3
|
+
[](https://nodejs.org/)
|
|
4
|
+
[](https://modelcontextprotocol.io/)
|
|
2
5
|
|
|
3
|
-
|
|
6
|
+
# trackly-cli
|
|
4
7
|
|
|
5
|
-
|
|
8
|
+
The only job tracking CLI built for AI agents.
|
|
6
9
|
|
|
7
|
-
|
|
8
|
-
npm install -g @trackly/cli
|
|
9
|
-
```
|
|
10
|
+
Search 99,000+ jobs across 775+ companies and 22 ATS types. Track applications, get AI-powered recommendations, and manage your job search -- from the terminal or through Claude Code, Cursor, and other MCP-compatible AI agents.
|
|
10
11
|
|
|
11
|
-
##
|
|
12
|
+
## Quick Start
|
|
12
13
|
|
|
13
14
|
```bash
|
|
15
|
+
npm install -g trackly-cli
|
|
14
16
|
trackly login
|
|
17
|
+
trackly jobs --function product_management
|
|
15
18
|
```
|
|
16
19
|
|
|
17
|
-
|
|
20
|
+
## At a Glance
|
|
18
21
|
|
|
19
|
-
|
|
22
|
+
775+ companies | 99K+ jobs | 22 ATS types | 14 CLI commands | 7 MCP tools
|
|
23
|
+
|
|
24
|
+
## CLI Commands
|
|
20
25
|
|
|
21
26
|
```bash
|
|
22
27
|
trackly jobs # List jobs
|
|
@@ -38,7 +43,15 @@ trackly logout # Clear credentials
|
|
|
38
43
|
|
|
39
44
|
Add `--json` to any command for JSON output.
|
|
40
45
|
|
|
41
|
-
## MCP Server
|
|
46
|
+
## MCP Server Setup
|
|
47
|
+
|
|
48
|
+
### One-liner (recommended)
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
claude mcp add-json trackly '{"command":"trackly","args":["mcp"]}'
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Manual config
|
|
42
55
|
|
|
43
56
|
Add to `~/.claude/settings.json`:
|
|
44
57
|
|
|
@@ -54,10 +67,23 @@ Add to `~/.claude/settings.json`:
|
|
|
54
67
|
```
|
|
55
68
|
|
|
56
69
|
Then use natural language in Claude Code:
|
|
70
|
+
|
|
57
71
|
- "Find me PM jobs at fintech companies"
|
|
58
72
|
- "What remote engineering roles are available?"
|
|
59
73
|
- "Mark job 1234 as applied"
|
|
60
74
|
|
|
75
|
+
## MCP Tools Reference
|
|
76
|
+
|
|
77
|
+
| Tool | Description |
|
|
78
|
+
|------|-------------|
|
|
79
|
+
| trackly_search_jobs | Search and filter jobs by function, location, modality, status |
|
|
80
|
+
| trackly_get_job | Get full details for a specific job |
|
|
81
|
+
| trackly_search_companies | Semantic company search |
|
|
82
|
+
| trackly_list_companies | List all tracked companies |
|
|
83
|
+
| trackly_get_stats | Job tracker metrics and status counts |
|
|
84
|
+
| trackly_update_status | Mark jobs as applied, saved, or dismissed |
|
|
85
|
+
| trackly_ask | Natural language job search (20/day) |
|
|
86
|
+
|
|
61
87
|
## API Key
|
|
62
88
|
|
|
63
89
|
For programmatic access without OAuth:
|
|
@@ -66,6 +92,46 @@ For programmatic access without OAuth:
|
|
|
66
92
|
trackly api-key create --name "my-script"
|
|
67
93
|
```
|
|
68
94
|
|
|
95
|
+
Use the generated key with the `--api-key` flag or set the `TRACKLY_API_KEY` environment variable.
|
|
96
|
+
|
|
97
|
+
## Comparison
|
|
98
|
+
|
|
99
|
+
| Feature | CLI | Web App | Public API |
|
|
100
|
+
|---------|-----|---------|------------|
|
|
101
|
+
| Job search + filters | Yes | Yes | Yes |
|
|
102
|
+
| Apply/save/dismiss | Yes | Yes | Yes |
|
|
103
|
+
| AI-powered search | Yes (trackly ask) | Yes | Yes |
|
|
104
|
+
| MCP integration | Yes (7 tools) | -- | -- |
|
|
105
|
+
| Browser required | No | Yes | No |
|
|
106
|
+
| Best for | Terminal + AI agents | Visual browsing | Custom integrations |
|
|
107
|
+
|
|
108
|
+
Web: [usetrackly.app](https://usetrackly.app) | API docs: [usetrackly.app/developers](https://usetrackly.app/developers)
|
|
109
|
+
|
|
110
|
+
## Frequently Asked Questions
|
|
111
|
+
|
|
112
|
+
**How do I track job applications from the terminal?**
|
|
113
|
+
|
|
114
|
+
Install trackly-cli (`npm install -g trackly-cli`), authenticate with `trackly login`, then use `trackly jobs` to browse openings and `trackly apply <id>` to mark applications. All data syncs with the Trackly web app at usetrackly.app.
|
|
115
|
+
|
|
116
|
+
**What MCP servers exist for job searching?**
|
|
117
|
+
|
|
118
|
+
trackly-cli includes a built-in MCP server with 7 tools for job search, company lookup, and application tracking. Run `trackly mcp` or add it to Claude Code with `claude mcp add-json trackly '{"command":"trackly","args":["mcp"]}'`. It connects to a live database of 99,000+ jobs across 775+ companies.
|
|
119
|
+
|
|
120
|
+
**How do I use Claude Code for job hunting?**
|
|
121
|
+
|
|
122
|
+
Add trackly as an MCP server in Claude Code. Then ask questions naturally: "Find PM jobs at fintech companies in SF", "What companies are hiring for engineering?", or "Mark job 1234 as applied." Claude will use trackly's MCP tools to search and manage your applications.
|
|
123
|
+
|
|
124
|
+
**What are the best CLI tools for job search?**
|
|
125
|
+
|
|
126
|
+
trackly-cli is the first dedicated job tracking CLI. It provides direct terminal access to 99,000+ job postings across 775+ companies, with filters for job function, location, and work modality. It also integrates with AI agents via the Model Context Protocol (MCP).
|
|
127
|
+
|
|
128
|
+
## Security
|
|
129
|
+
|
|
130
|
+
- OAuth tokens stored in `~/.trackly/config.json` with 0600 permissions
|
|
131
|
+
- OAuth callback bound to 127.0.0.1 only
|
|
132
|
+
- CSRF protection on login flow
|
|
133
|
+
- See [SECURITY.md](SECURITY.md) for vulnerability reporting
|
|
134
|
+
|
|
69
135
|
## License
|
|
70
136
|
|
|
71
|
-
MIT
|
|
137
|
+
MIT -- see [LICENSE](LICENSE)
|
package/lib/client.js
CHANGED
|
@@ -73,7 +73,7 @@ function apiRequest(method, endpoint, data = null, skipAuth = false, _isRetry =
|
|
|
73
73
|
const headers = {
|
|
74
74
|
'Content-Type': 'application/json',
|
|
75
75
|
'Accept': 'application/json',
|
|
76
|
-
'User-Agent': 'trackly-cli/0.1.
|
|
76
|
+
'User-Agent': 'trackly-cli/0.1.2',
|
|
77
77
|
};
|
|
78
78
|
|
|
79
79
|
if (!skipAuth) {
|
package/mcp/server.js
CHANGED
|
@@ -7,7 +7,7 @@ const { apiRequest, getToken } = require('../lib/client');
|
|
|
7
7
|
|
|
8
8
|
const server = new McpServer({
|
|
9
9
|
name: 'trackly',
|
|
10
|
-
version: '0.1.
|
|
10
|
+
version: '0.1.2',
|
|
11
11
|
});
|
|
12
12
|
|
|
13
13
|
// Tool: Search/filter jobs
|
|
@@ -15,14 +15,14 @@ server.tool(
|
|
|
15
15
|
'trackly_search_jobs',
|
|
16
16
|
'Search and filter job postings. Returns matching jobs with title, company, location, modality.',
|
|
17
17
|
{
|
|
18
|
-
function: z.
|
|
18
|
+
function: z.enum(['product_management','engineering','design','data_science','marketing','sales','finance','operations','legal','hr','other']).optional().describe('Job function filter: product_management, engineering, design, data_science, marketing, sales, finance, operations, legal, hr, other'),
|
|
19
19
|
location: z.string().optional().describe('Location filter (city or state)'),
|
|
20
|
-
modality: z.
|
|
21
|
-
status: z.
|
|
22
|
-
sort: z.
|
|
23
|
-
limit: z.number().optional().describe('Max results (default 20, max 50)'),
|
|
24
|
-
offset: z.number().optional().describe('Pagination offset'),
|
|
25
|
-
keywords: z.string().optional().describe('Keyword search in title/description'),
|
|
20
|
+
modality: z.enum(['remote','hybrid','onsite']).optional().describe('Work modality: remote, hybrid, onsite'),
|
|
21
|
+
status: z.enum(['new','saved','applied','dismissed']).optional().describe('Application status: new, saved, applied, dismissed'),
|
|
22
|
+
sort: z.enum(['newest','oldest','company']).optional().describe('Sort order: newest, oldest, company'),
|
|
23
|
+
limit: z.number().max(50).optional().describe('Max results (default 20, max 50)'),
|
|
24
|
+
offset: z.number().min(0).optional().describe('Pagination offset'),
|
|
25
|
+
keywords: z.string().max(500).optional().describe('Keyword search in title/description'),
|
|
26
26
|
},
|
|
27
27
|
async (params) => {
|
|
28
28
|
const qs = new URLSearchParams();
|
|
@@ -60,8 +60,8 @@ server.tool(
|
|
|
60
60
|
'trackly_search_companies',
|
|
61
61
|
'Semantic search for companies by name, domain, or keywords.',
|
|
62
62
|
{
|
|
63
|
-
query: z.string().describe('Search query'),
|
|
64
|
-
limit: z.number().optional().describe('Max results (default 10)'),
|
|
63
|
+
query: z.string().max(500).describe('Search query'),
|
|
64
|
+
limit: z.number().max(50).optional().describe('Max results (default 10)'),
|
|
65
65
|
},
|
|
66
66
|
async ({ query, limit }) => {
|
|
67
67
|
const qs = new URLSearchParams({ q: query });
|
|
@@ -80,8 +80,8 @@ server.tool(
|
|
|
80
80
|
'trackly_list_companies',
|
|
81
81
|
'List all tracked companies with their active job counts.',
|
|
82
82
|
{
|
|
83
|
-
limit: z.number().optional().describe('Max results'),
|
|
84
|
-
offset: z.number().optional().describe('Pagination offset'),
|
|
83
|
+
limit: z.number().max(50).optional().describe('Max results'),
|
|
84
|
+
offset: z.number().min(0).optional().describe('Pagination offset'),
|
|
85
85
|
},
|
|
86
86
|
async ({ limit, offset }) => {
|
|
87
87
|
const qs = new URLSearchParams();
|
|
@@ -134,7 +134,7 @@ server.tool(
|
|
|
134
134
|
'trackly_ask',
|
|
135
135
|
'Natural language job search. Describe what you are looking for and the AI parses it into structured filters. Limited to 20 queries per day.',
|
|
136
136
|
{
|
|
137
|
-
query: z.string().describe('Natural language search query, e.g. "PM jobs at fintech companies in SF"'),
|
|
137
|
+
query: z.string().max(500).describe('Natural language search query, e.g. "PM jobs at fintech companies in SF"'),
|
|
138
138
|
},
|
|
139
139
|
async ({ query }) => {
|
|
140
140
|
try {
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "trackly-cli",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"mcpName": "io.github.kevinastuhuaman/trackly",
|
|
5
|
+
"description": "CLI + MCP server for job tracking — search, apply, and manage applications from terminal or AI agents",
|
|
5
6
|
"bin": {
|
|
6
7
|
"trackly": "./bin/trackly"
|
|
7
8
|
},
|
|
@@ -10,16 +11,25 @@
|
|
|
10
11
|
"lib/",
|
|
11
12
|
"mcp/",
|
|
12
13
|
"docs/",
|
|
13
|
-
"README.md"
|
|
14
|
+
"README.md",
|
|
15
|
+
"LICENSE"
|
|
14
16
|
],
|
|
15
17
|
"keywords": [
|
|
16
18
|
"trackly",
|
|
17
19
|
"jobs",
|
|
18
20
|
"job-tracker",
|
|
19
21
|
"mcp",
|
|
22
|
+
"mcp-server",
|
|
23
|
+
"model-context-protocol",
|
|
20
24
|
"cli",
|
|
21
25
|
"claude-code",
|
|
22
|
-
"ai-agent"
|
|
26
|
+
"ai-agent",
|
|
27
|
+
"ai-tools",
|
|
28
|
+
"job-search",
|
|
29
|
+
"job-application",
|
|
30
|
+
"job-hunting",
|
|
31
|
+
"career",
|
|
32
|
+
"terminal"
|
|
23
33
|
],
|
|
24
34
|
"author": "Kevin Astuhuaman <kevin.astuhuaman.flores@gmail.com>",
|
|
25
35
|
"license": "MIT",
|
|
@@ -27,6 +37,10 @@
|
|
|
27
37
|
"type": "git",
|
|
28
38
|
"url": "https://github.com/kevinastuhuaman/trackly-cli"
|
|
29
39
|
},
|
|
40
|
+
"homepage": "https://usetrackly.app/cli",
|
|
41
|
+
"bugs": {
|
|
42
|
+
"url": "https://github.com/kevinastuhuaman/trackly-cli/issues"
|
|
43
|
+
},
|
|
30
44
|
"dependencies": {
|
|
31
45
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
32
46
|
"zod": "^3.23.0"
|