@glie/mcp-polaris 0.5.0 → 0.7.0

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.
Files changed (2) hide show
  1. package/dist/index.js +109 -23
  2. package/package.json +15 -4
package/dist/index.js CHANGED
@@ -220,17 +220,34 @@ var TOOLS = [
220
220
  },
221
221
  {
222
222
  name: "polaris.task.create",
223
- description: "Create a task within a milestone.",
224
- inputSchema: objSchema({ milestone_id: intSchema(), name: strSchema(), description_md: strSchema() }, ["milestone_id", "name"]),
223
+ description: "Create a task within a milestone. For a marketing CREATIVE (a task in an mkt campaign): channel + format + scheduled_date (the publish day / calendar slot) + platform (if this creative is individually paid). A CAROUSEL (format=carrossel) also requires `slides` (2..10) \u2014 without it the call is refused, because a carousel with no declared size ships one image.",
224
+ inputSchema: objSchema({
225
+ milestone_id: intSchema(),
226
+ name: strSchema(),
227
+ description_md: strSchema(),
228
+ status: strSchema("draft|backlog|dev|test|approval|release (default draft)"),
229
+ channel: strSchema("mkt: Instagram, TikTok, LinkedIn, \u2026"),
230
+ format: strSchema("mkt: post, carrossel, reel, story, artigo, \u2026"),
231
+ slides: intSchema("mkt: REQUIRED when format is a carousel \u2014 how many images the piece has (2..10). " + "It is a contract: the generator delivers exactly this many. Omit for every other format."),
232
+ medium: strSchema("mkt: what the piece IS \u2014 image | video | text. The engine follows it (Codex, Remotion, " + "the writer). A carousel is `image` with slides > 1: only an image has more than one."),
233
+ surface: strSchema("mkt: where it publishes \u2014 feed | stories | reels | shorts | article | newsletter. It is " + "what separates a reel from a story: same medium, same 9:16, different place (and a " + "story is gone in 24h)."),
234
+ aspect: strSchema("mkt: the piece's SHAPE \u2014 1:1 | 4:5 | 9:16 | 16:9 | 2:3. The format says what the piece " + "IS (post, carrossel, reel), this says how it is framed, and they are independent: a " + "carousel can be vertical, a reel can be square. Omit to take the channel's usual one."),
235
+ output_type: strSchema("pr|post|video|email|generic \u2014 the delivery medium. Omit it: the format decides (reel/v\xEDdeo/short \u2192 video). Only pass it to override."),
236
+ scheduled_date: strSchema("mkt: publish day (ISO date) \u2014 the calendar slot"),
237
+ platform: strSchema("mkt: ad platform if this creative is individually paid"),
238
+ asset_url: strSchema("mkt: URL of the produced creative asset (image/video) for the reviewer")
239
+ }, ["milestone_id", "name"]),
225
240
  call: async (args) => (await apiCall("POST", "/api/tasks", args)).body
226
241
  },
227
242
  {
228
243
  name: "polaris.task.update",
229
- description: "Correct or refine a task's spec \u2014 PATCH its description_md (and optionally name). Use this to sharpen an underspecified brief so the implementing agent gets better results; it is NOT a log of what was done (leave that as a comment). Needs a token.",
244
+ description: "Correct or refine a task's spec \u2014 PATCH its description_md (and optionally name). For a marketing creative, set asset_url to the produced asset (image/video) so the reviewer can download and review it. It is NOT a log of what was done (leave that as a comment). Needs a token.",
230
245
  inputSchema: objSchema({
231
246
  id: intSchema(),
232
247
  name: strSchema(),
233
- description_md: strSchema("full markdown brief; replaces the current description")
248
+ description_md: strSchema("full markdown brief; replaces the current description"),
249
+ asset_url: strSchema("mkt: URL of the produced creative asset (image/video) for the reviewer"),
250
+ output_type: strSchema("pr|post|video|email|generic \u2014 fix the delivery medium of a task filed with the wrong one (it routes the worker to the video or the image pipeline).")
234
251
  }, ["id"]),
235
252
  call: async (args) => {
236
253
  const body = {};
@@ -238,6 +255,10 @@ var TOOLS = [
238
255
  body.name = args.name;
239
256
  if (typeof args.description_md === "string")
240
257
  body.description_md = args.description_md;
258
+ if (typeof args.asset_url === "string")
259
+ body.asset_url = args.asset_url;
260
+ if (typeof args.output_type === "string")
261
+ body.output_type = args.output_type;
241
262
  return (await apiCall("PATCH", `/api/tasks/${args.id}`, body)).body;
242
263
  }
243
264
  },
@@ -249,10 +270,28 @@ var TOOLS = [
249
270
  },
250
271
  {
251
272
  name: "polaris.task.approve",
252
- description: "The human review gate: approve a task in `approval` \u2192 it advances toward release. Human-only. To ship several approval tasks of one milestone together, group them into a stack and use polaris.stack.release instead.",
273
+ description: "The human review gate: approve a dev task in `approval` \u2192 it advances toward release. Human-only. NOT valid for mkt creatives (output_type=post/video/etc.) \u2014 use polaris.task.schedule or polaris.task.mark_published instead. To ship several approval tasks together, group them into a stack and use polaris.stack.release.",
253
274
  inputSchema: objSchema({ id: intSchema() }, ["id"]),
254
275
  call: async (args) => (await apiCall("POST", `/api/tasks/${args.id}/approve`)).body
255
276
  },
277
+ {
278
+ name: "polaris.task.schedule",
279
+ description: "Schedule a mkt creative for publication: approval \u2192 agendado. The creative must be bound to an active social account (resolved from its market + channel) and have a publish_at in the future. Its copy is frozen while scheduled \u2014 editing it requires unscheduling first.",
280
+ inputSchema: objSchema({ id: intSchema() }, ["id"]),
281
+ call: async (args) => (await apiCall("POST", `/api/tasks/${args.id}/schedule`)).body
282
+ },
283
+ {
284
+ name: "polaris.task.unschedule",
285
+ description: "Unschedule a mkt creative: agendado \u2192 approval. Refused once the post is live. The creative returns to approval for edits or re-scheduling.",
286
+ inputSchema: objSchema({ id: intSchema() }, ["id"]),
287
+ call: async (args) => (await apiCall("POST", `/api/tasks/${args.id}/unschedule`)).body
288
+ },
289
+ {
290
+ name: "polaris.task.mark_published",
291
+ description: "Manually mark a mkt creative as published: approval \u2192 release (bypasses scheduling). Recorded as a manual human action. Use when the post was published outside the scheduler.",
292
+ inputSchema: objSchema({ id: intSchema() }, ["id"]),
293
+ call: async (args) => (await apiCall("POST", `/api/tasks/${args.id}/mark-published`)).body
294
+ },
256
295
  {
257
296
  name: "polaris.task.dep_add",
258
297
  description: "Add a dependency edge (cycle-checked).",
@@ -339,12 +378,12 @@ var TOOLS = [
339
378
  },
340
379
  {
341
380
  name: "polaris.ticket.update",
342
- description: "Update a ticket's type, its human assignee, and/or its guidance (the communicator's orientation on what to do/say next).",
381
+ description: "Update a ticket's type, its human assignee, and/or its guidance (the helpdesker's orientation on what to do/say next).",
343
382
  inputSchema: objSchema({
344
383
  id: intSchema(),
345
384
  type: strSchema("bug|question|suggestion|feedback"),
346
385
  assignee_human_id: intSchema(),
347
- guidance: strSchema("The communicator's guidance on what to do/say next \u2014 orientation (e.g. create an issue, inform, reassure), researched from the customer's history + related issues. Shown to the human as advice; NOT inserted into the reply box.")
386
+ guidance: strSchema("The helpdesker's guidance on what to do/say next \u2014 orientation (e.g. create an issue, inform, reassure), researched from the customer's history + related issues. Shown to the human as advice; NOT inserted into the reply box.")
348
387
  }, ["id"]),
349
388
  call: async (args) => (await apiCall("PATCH", `/api/tickets/${args.id}`, {
350
389
  type: args.type,
@@ -377,20 +416,23 @@ var TOOLS = [
377
416
  },
378
417
  {
379
418
  name: "polaris.issue.open",
380
- description: "Open a STANDALONE issue (no ticket needed) \u2014 e.g. an internal dev files a bug. Scope with project_key.",
381
- inputSchema: objSchema({ project_key: strSchema(), title: strSchema() }, [
382
- "project_key",
383
- "title"
384
- ]),
419
+ description: "Open a STANDALONE issue (no ticket needed) \u2014 e.g. an internal dev files a bug. Scope with project_key. owner_human_id = the human accountable (defaults to you).",
420
+ inputSchema: objSchema({ project_key: strSchema(), title: strSchema(), owner_human_id: intSchema() }, ["project_key", "title"]),
385
421
  call: async (args) => (await apiCall("POST", "/api/issues", args)).body
386
422
  },
387
423
  {
388
424
  name: "polaris.issue.update",
389
- description: "Update an issue \u2014 set its title and/or assign it to an agent (assignee_agent_id, e.g. hand it to a planner).",
390
- inputSchema: objSchema({ id: intSchema(), title: strSchema(), assignee_agent_id: intSchema() }, ["id"]),
425
+ description: "Update an issue \u2014 set its title, assign it to an agent (assignee_agent_id, e.g. hand it to a planner), and/or set its owner (owner_human_id, the accountable human).",
426
+ inputSchema: objSchema({
427
+ id: intSchema(),
428
+ title: strSchema(),
429
+ assignee_agent_id: intSchema(),
430
+ owner_human_id: intSchema()
431
+ }, ["id"]),
391
432
  call: async (args) => (await apiCall("PATCH", `/api/issues/${args.id}`, {
392
433
  title: args.title,
393
- assignee_agent_id: args.assignee_agent_id
434
+ assignee_agent_id: args.assignee_agent_id,
435
+ owner_human_id: args.owner_human_id
394
436
  })).body
395
437
  },
396
438
  {
@@ -513,11 +555,10 @@ var TOOLS = [
513
555
  },
514
556
  {
515
557
  name: "polaris.project.update",
516
- description: "Update a project (human-only): repo_url, description_md, name, status (active|paused|archived), owner_human_id.",
558
+ description: "Update a project (human-only): repo_url, name, status (active|paused|archived), owner_human_id. Brand/context live in the CLAUDE.md \u2014 use polaris.project.claude_md_set.",
517
559
  inputSchema: objSchema({
518
560
  key: strSchema("project key"),
519
561
  name: strSchema(),
520
- description_md: strSchema(),
521
562
  repo_url: strSchema("github.com repo URL"),
522
563
  status: strSchema("active|paused|archived"),
523
564
  owner_human_id: intSchema()
@@ -535,10 +576,10 @@ var TOOLS = [
535
576
  },
536
577
  {
537
578
  name: "polaris.agent.create",
538
- description: "Create an agent/employee (human-only). function: developer|tester|planner|communicator; product = project key; team = dev|mkt; domain optional (roadmap|helpdesk|both).",
579
+ description: "Create an agent/employee (human-only). function: developer|tester|planner|helpdesker; product = project key; team = dev|mkt; domain optional (roadmap|helpdesk|both).",
539
580
  inputSchema: objSchema({
540
581
  agent_id_slug: strSchema("stable slug, e.g. developer-polaris-01"),
541
- function: strSchema("developer|tester|planner|communicator"),
582
+ function: strSchema("developer|tester|planner|helpdesker"),
542
583
  product: strSchema("project key"),
543
584
  name: strSchema("friendly display name"),
544
585
  team: strSchema("dev|mkt"),
@@ -593,16 +634,61 @@ var TOOLS = [
593
634
  ]),
594
635
  call: async (args) => (await apiCall("POST", `/api/agents/${args.id}/claude-login/code`, { code: args.code })).body
595
636
  },
637
+ {
638
+ name: "polaris.agent.claude_logout",
639
+ description: "Log an agent out of Claude (human-only): deletes its stored credentials and clears the login. Use when claude_login_status is 'expired' to force a clean re-login.",
640
+ inputSchema: objSchema({ id: intSchema("agent id") }, ["id"]),
641
+ call: async (args) => (await apiCall("POST", `/api/agents/${args.id}/claude-login/logout`)).body
642
+ },
643
+ {
644
+ name: "polaris.agent.codex_login",
645
+ description: "Kick off a generator agent's Codex device-login (human-only). Poll agent.get for codex_login_url, then approve it in the browser \u2014 no code to paste back.",
646
+ inputSchema: objSchema({ id: intSchema("agent id") }, ["id"]),
647
+ call: async (args) => (await apiCall("POST", `/api/agents/${args.id}/codex-login`)).body
648
+ },
649
+ {
650
+ name: "polaris.agent.codex_logout",
651
+ description: "Log an agent out of Codex (human-only): deletes its stored auth and clears the login. Use when codex_login_status is 'expired' to force a clean re-login.",
652
+ inputSchema: objSchema({ id: intSchema("agent id") }, ["id"]),
653
+ call: async (args) => (await apiCall("POST", `/api/agents/${args.id}/codex-login/logout`)).body
654
+ },
596
655
  {
597
656
  name: "polaris.milestone.create",
598
- description: "Create a milestone. team = dev|mkt; end_date = deadline (ISO date, required); framework_key optional.",
657
+ description: "Create a milestone. team=dev|mkt; end_date = deadline (ISO date, required). For a marketing CAMPAIGN (team=mkt) these extra fields carry the plan: market (BR/US/EU), cadence (per-channel rules Discovery expands into dated creatives), max_creatives (cap on that expansion), and paid + platforms + budget for a paid campaign.",
599
658
  inputSchema: objSchema({
600
659
  project_key: strSchema(),
601
660
  name: strSchema(),
602
661
  team: strSchema("dev|mkt"),
603
662
  end_date: strSchema("ISO date, e.g. 2026-06-30"),
663
+ start_date: strSchema("ISO date (optional)"),
604
664
  framework_key: strSchema(),
605
- description_md: strSchema()
665
+ description_md: strSchema(),
666
+ market: {
667
+ type: "array",
668
+ items: { type: "string" },
669
+ description: "mkt: target markets \u2014 any of BR, US, EU"
670
+ },
671
+ cadence: {
672
+ type: "array",
673
+ description: "mkt: per-channel cadence rules Discovery expands into dated creatives",
674
+ items: {
675
+ type: "object",
676
+ properties: {
677
+ channel: { type: "string", description: "Instagram, TikTok, LinkedIn, \u2026" },
678
+ format: { type: "string", description: "post, reel, story, artigo, \u2026" },
679
+ n: { type: "integer", description: "count per period" },
680
+ per: { type: "string", description: "day | week" }
681
+ }
682
+ }
683
+ },
684
+ max_creatives: intSchema("mkt: cap on how many creatives Discovery/cadence may generate"),
685
+ paid: { type: "boolean", description: "mkt: is the whole campaign paid?" },
686
+ platforms: {
687
+ type: "array",
688
+ items: { type: "string" },
689
+ description: "mkt paid: any of Meta, Google, Reddit, LinkedIn, TikTok, YouTube"
690
+ },
691
+ budget: { type: "number", description: "mkt: campaign ad-spend budget (\u20AC)" }
606
692
  }, ["project_key", "name", "team", "end_date"]),
607
693
  call: async (args) => (await apiCall("POST", "/api/milestones", args)).body
608
694
  },
@@ -677,7 +763,7 @@ var TOOLS = [
677
763
  },
678
764
  {
679
765
  name: "polaris.team.create",
680
- description: 'Create a team (human-only). requires = capability keys (e.g. ["repo"]); functions = agent functions it runs (developer|tester|planner|communicator).',
766
+ description: 'Create a team (human-only). requires = capability keys (e.g. ["repo"]); functions = agent functions it runs (developer|tester|planner|helpdesker).',
681
767
  inputSchema: objSchema({
682
768
  key: strSchema("team key, e.g. dev"),
683
769
  name: strSchema(),
@@ -689,7 +775,7 @@ var TOOLS = [
689
775
  functions: {
690
776
  type: "array",
691
777
  items: { type: "string" },
692
- description: "developer|tester|planner|communicator"
778
+ description: "developer|tester|planner|helpdesker"
693
779
  },
694
780
  framework_key: strSchema()
695
781
  }, ["key", "name"]),
package/package.json CHANGED
@@ -1,14 +1,18 @@
1
1
  {
2
2
  "name": "@glie/mcp-polaris",
3
- "version": "0.5.0",
4
- "description": "Model Context Protocol (stdio) server exposing Polaris — glie's ops platform — as native tools in Claude Code and any MCP client.",
3
+ "version": "0.7.0",
4
+ "description": "Model Context Protocol (stdio) server exposing Polaris \u2014 glie's ops platform \u2014 as native tools in Claude Code and any MCP client.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "glie <carlos@glie.ai>",
7
7
  "type": "module",
8
8
  "bin": {
9
9
  "mcp-polaris": "dist/index.js"
10
10
  },
11
- "files": ["dist", "README.md", "LICENSE"],
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
12
16
  "engines": {
13
17
  "node": ">=18"
14
18
  },
@@ -21,7 +25,14 @@
21
25
  "directory": "packages/mcp-polaris"
22
26
  },
23
27
  "homepage": "https://polaris.glie.ai",
24
- "keywords": ["mcp", "model-context-protocol", "claude", "claude-code", "polaris", "glie"],
28
+ "keywords": [
29
+ "mcp",
30
+ "model-context-protocol",
31
+ "claude",
32
+ "claude-code",
33
+ "polaris",
34
+ "glie"
35
+ ],
25
36
  "scripts": {
26
37
  "build": "bun run build.ts",
27
38
  "prepublishOnly": "bun run build.ts"