trackly-cli 0.2.8 → 0.3.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/README.md CHANGED
@@ -35,7 +35,7 @@ trackly jobs --function product
35
35
 
36
36
  ## At a Glance
37
37
 
38
- 1,900+ companies | 128K+ jobs | 40+ ATS types | CLI + MCP | 10 MCP tools
38
+ 1,900+ companies | 128K+ jobs | 40+ ATS types | CLI + MCP | 11 MCP tools
39
39
 
40
40
  ## CLI Commands
41
41
 
@@ -63,6 +63,7 @@ trackly referral start 1234 # Start a referral campaign
63
63
  trackly referral status 1234 # Check referral campaign status
64
64
  trackly company-brief 243 # Get company brief (--refresh to regenerate)
65
65
  trackly company-workspace 243 # Full company workspace view
66
+ trackly request-company "eBay" # Request a company be added (--url, --notes optional)
66
67
  trackly api-key create # Generate API key
67
68
  trackly api-key list # List API keys
68
69
  trackly config # Show current CLI config
package/bin/trackly CHANGED
@@ -28,11 +28,13 @@ const VALUE_FLAGS = new Set([
28
28
  'keywords',
29
29
  'limit',
30
30
  'name',
31
+ 'notes',
31
32
  'offset',
32
33
  'region',
33
34
  'search',
34
35
  'sort',
35
36
  'status',
37
+ 'url',
36
38
  ]);
37
39
  const AUTH_HELP_TEXT = `Not authenticated.
38
40
  Option 1: trackly login (Google OAuth)
@@ -668,6 +670,43 @@ async function cmdCompanyWorkspace(args) {
668
670
  }
669
671
  }
670
672
 
673
+ async function cmdRequestCompany(args) {
674
+ // Positional arg = company name. Allow multi-word names without forcing the user
675
+ // to quote, e.g. `trackly request-company Built Robotics --url ...` joins the
676
+ // free-floating positionals into "Built Robotics". Matches `trackly ask` UX.
677
+ const name = (args._ || []).join(' ').trim();
678
+ if (!name) {
679
+ failNow('Company name required. Usage: trackly request-company <name> [--url <url>] [--notes <notes>]');
680
+ }
681
+ if (!hasAuth()) failNow(AUTH_HELP_TEXT);
682
+
683
+ const url = typeof args.url === 'string' ? args.url : '';
684
+ const notes = typeof args.notes === 'string' ? args.notes : '';
685
+
686
+ try {
687
+ const result = await apiRequest('POST', '/api/jobscout/companies/request', {
688
+ company_name: name,
689
+ company_url: url,
690
+ notes: notes,
691
+ source: 'cli',
692
+ });
693
+ if (isJSON()) return printJson(result);
694
+ const requestId = result.requestId || result.id || '?';
695
+ console.log(color('green', `Requested "${name}" (#${requestId}). Trackly team will review shortly.`));
696
+ } catch (e) {
697
+ // Backend returns 429 (rate limit, max 5 pending) and 409 (duplicate pending request)
698
+ // with a specific `error` message. Surface that message verbatim so the user knows
699
+ // exactly which gate fired without having to enable --json.
700
+ if (e.status === 429) {
701
+ setErrorExit(e.error || 'Maximum 5 pending requests allowed. Please wait for existing requests to be reviewed.');
702
+ } else if (e.status === 409) {
703
+ setErrorExit(e.error || 'You already have a pending request for this company.');
704
+ } else {
705
+ setErrorExit(e.error || e.message || 'Failed to request company');
706
+ }
707
+ }
708
+ }
709
+
671
710
  async function cmdConfig(args) {
672
711
  if (args['api-key'] === null) failNow('API key value required. Usage: trackly config --api-key <key>');
673
712
  if (args['base-url'] === null) failNow('Base URL value required. Usage: trackly config --base-url <url>');
@@ -770,6 +809,7 @@ ${color('bold', 'Commands:')}
770
809
  ${color('cyan', 'brief <id>')} Get network brief for a job
771
810
  ${color('cyan', 'company-brief <id>')} Get company brief (--refresh to generate)
772
811
  ${color('cyan', 'company-workspace <id>')} Show company workspace (jobs, contacts, campaigns)
812
+ ${color('cyan', 'request-company <name>')} Request a company be added to Trackly (--url, --notes)
773
813
  ${color('cyan', 'api-key create')} Generate an API key
774
814
  ${color('cyan', 'api-key list')} List your API keys
775
815
  ${color('cyan', 'config')} Show or update CLI config (--api-key, --base-url)
@@ -926,6 +966,9 @@ async function main() {
926
966
  case 'company-workspace':
927
967
  await cmdCompanyWorkspace(args);
928
968
  break;
969
+ case 'request-company':
970
+ await cmdRequestCompany(args);
971
+ break;
929
972
  case 'api-key':
930
973
  await cmdApiKey(args);
931
974
  break;
package/mcp/server.js CHANGED
@@ -297,6 +297,24 @@ function createServer() {
297
297
  }, 'Failed to fetch company workspace')
298
298
  );
299
299
 
300
+ server.tool(
301
+ 'trackly_request_company',
302
+ 'Request that a company be added to Trackly\'s tracked companies. Use when the user asks about a company that isn\'t in trackly_search_companies / trackly_list_companies results. Rate-limited to 5 pending requests per user.',
303
+ {
304
+ companyName: z.string().min(1).max(200).describe('Company name (e.g. "eBay")'),
305
+ companyUrl: z.string().max(500).optional().describe('Optional careers page or homepage URL (e.g. "https://careers.ebay.com")'),
306
+ notes: z.string().max(1000).optional().describe('Optional context (e.g. "MBA hiring page", "specific role I want tracked")'),
307
+ },
308
+ wrapTool(async ({ companyName, companyUrl, notes }) => {
309
+ return apiRequest('POST', '/api/jobscout/companies/request', {
310
+ company_name: companyName,
311
+ company_url: companyUrl || '',
312
+ notes: notes || '',
313
+ source: 'mcp',
314
+ }, false, false, MCP_USER_AGENT);
315
+ }, 'Failed to request company')
316
+ );
317
+
300
318
  return server;
301
319
  }
302
320
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trackly-cli",
3
- "version": "0.2.8",
3
+ "version": "0.3.2",
4
4
  "mcpName": "io.github.trackly-app/trackly",
5
5
  "description": "AI job search CLI + hosted MCP server with OAuth. 128K+ jobs, 1,900+ companies, 40+ ATS. Works with Claude, ChatGPT, Cursor, Windsurf, Codex via hosted streamable-http or local stdio.",
6
6
  "bin": {
package/server.json CHANGED
@@ -17,12 +17,12 @@
17
17
  ]
18
18
  }
19
19
  ],
20
- "version": "0.2.8",
20
+ "version": "0.3.2",
21
21
  "packages": [
22
22
  {
23
23
  "registryType": "npm",
24
24
  "identifier": "trackly-cli",
25
- "version": "0.2.8",
25
+ "version": "0.3.2",
26
26
  "runtimeHint": "npx",
27
27
  "runtimeArguments": [
28
28
  {