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 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
- # @trackly/cli
1
+ [![npm](https://img.shields.io/npm/v/trackly-cli.svg)](https://www.npmjs.com/package/trackly-cli)
2
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
3
+ [![Node 18+](https://img.shields.io/badge/node-18+-brightgreen.svg)](https://nodejs.org/)
4
+ [![MCP Server](https://img.shields.io/badge/MCP-Server-blue.svg)](https://modelcontextprotocol.io/)
2
5
 
3
- Trackly job tracker CLI + MCP server for AI agents.
6
+ # trackly-cli
4
7
 
5
- ## Install
8
+ The only job tracking CLI built for AI agents.
6
9
 
7
- ```bash
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
- ## Login
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
- Opens Google OAuth in your browser. Credentials are stored in `~/.trackly/config.json`.
20
+ ## At a Glance
18
21
 
19
- ## CLI Usage
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 (Claude Code)
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.0',
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.0',
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.string().optional().describe('Job function filter: product_management, engineering, design, data_science, marketing, sales, finance, operations, legal, hr, other'),
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.string().optional().describe('Work modality: remote, hybrid, onsite'),
21
- status: z.string().optional().describe('Application status: new, saved, applied, dismissed'),
22
- sort: z.string().optional().describe('Sort order: newest, oldest, company'),
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.0",
4
- "description": "Trackly job tracker CLI + MCP server for AI agents",
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"