@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.
- package/dist/index.js +109 -23
- 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({
|
|
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).
|
|
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
|
|
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
|
|
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
|
|
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
|
|
390
|
-
inputSchema: objSchema({
|
|
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,
|
|
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|
|
|
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|
|
|
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
|
|
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|
|
|
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|
|
|
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.
|
|
4
|
-
"description": "Model Context Protocol (stdio) server exposing Polaris
|
|
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": [
|
|
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": [
|
|
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"
|