@aioproductoscom/mcp 0.8.0 → 0.9.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/README.md CHANGED
@@ -61,6 +61,10 @@ at a self-hosted platform.
61
61
  | `list_bookings` | scheduled calls/meetings (upcoming by default) |
62
62
  | `cancel_booking` | cancel a booking (frees the slot, cancels the meeting) |
63
63
  | `reschedule_booking` | move a booking to a new open slot |
64
+ | `list_channels` | the team Comms channels you belong to |
65
+ | `read_channel` | recent messages in a channel (catch up before replying) |
66
+ | `post_to_channel` | post into a team channel — visible live to teammates, as you |
67
+ | `reply_in_channel` | reply in a thread under a message |
64
68
 
65
69
  > For an assignable **coding teammate** (Backend / Frontend / Mobile / QA that
66
70
  > opens PRs in your repo), install the separate
package/dist/client.js CHANGED
@@ -114,4 +114,25 @@ export class PlatformClient {
114
114
  schedulingAction(body) {
115
115
  return this.req("/api/me/scheduling", { method: "POST", body: JSON.stringify(body) });
116
116
  }
117
+ listChannels() {
118
+ return this.req("/api/me/comms");
119
+ }
120
+ readChannel(channelId, limit) {
121
+ const p = new URLSearchParams({ channel_id: channelId });
122
+ if (limit)
123
+ p.set("limit", String(limit));
124
+ return this.req(`/api/me/comms?${p.toString()}`);
125
+ }
126
+ postToChannel(channelId, body) {
127
+ return this.req("/api/me/comms", {
128
+ method: "POST",
129
+ body: JSON.stringify({ action: "post", channel_id: channelId, body }),
130
+ });
131
+ }
132
+ replyInChannel(channelId, parentId, body) {
133
+ return this.req("/api/me/comms", {
134
+ method: "POST",
135
+ body: JSON.stringify({ action: "reply", channel_id: channelId, parent_id: parentId, body }),
136
+ });
137
+ }
117
138
  }
package/dist/index.js CHANGED
@@ -17,7 +17,7 @@ function text(data) {
17
17
  ],
18
18
  };
19
19
  }
20
- const server = new McpServer({ name: "productos", version: "0.8.0" }, {
20
+ const server = new McpServer({ name: "productos", version: "0.9.0" }, {
21
21
  instructions: "You manage ProductOS PM tickets on behalf of the connected member — the board is the team's " +
22
22
  "source of truth, so work precisely. Resolve names to ids with pm_meta before create_task / " +
23
23
  "update_task; never guess an id. Link a task to the spine (feature_id / insight_id) whenever the " +
@@ -70,6 +70,10 @@ server.tool("resolve_conversation", "Mark a support conversation resolved (statu
70
70
  server.tool("list_bookings", "List scheduled bookings (calls/meetings) — upcoming confirmed ones by default; pass include='all' for past + cancelled. Each has id, event type, guest, host, start/end, and status.", { include: z.enum(["all"]).optional() }, async (a) => text(await client.listBookings({ include: a.include })));
71
71
  server.tool("cancel_booking", "Cancel a booking by id — frees the slot and cancels the linked meeting. Cannot cancel a meeting that has already started.", { booking_id: z.string() }, async (a) => text(await client.schedulingAction({ action: "cancel", booking_id: a.booking_id })));
72
72
  server.tool("reschedule_booking", "Move a booking to a new start time (ISO 8601, e.g. 2026-06-20T15:00:00Z). The new time must be a currently-open slot for that event type. Cannot reschedule a meeting that has already started.", { booking_id: z.string(), start: z.string() }, async (a) => text(await client.schedulingAction({ action: "reschedule", booking_id: a.booking_id, start: a.start })));
73
+ server.tool("list_channels", "List the team Comms channels you (this token's member) belong to — id, name, kind, topic. These are the channels you can read and post into. An admin adds you to a channel in ProductOS → Comms.", {}, async () => text(await client.listChannels()));
74
+ server.tool("read_channel", "Read recent messages in a Comms channel you belong to (oldest→newest), so you can catch up before replying. Pass the channel_id from list_channels.", { channel_id: z.string(), limit: z.number().optional() }, async (a) => text(await client.readChannel(a.channel_id, a.limit)));
75
+ server.tool("post_to_channel", "Post a message into a team Comms channel you belong to. It goes out as you (this token's member) and appears live for your teammates — use it to tell the team what you did, share a link, or ask a question. Only works for channels you're a member of (see list_channels).", { channel_id: z.string(), body: z.string() }, async (a) => text(await client.postToChannel(a.channel_id, a.body)));
76
+ server.tool("reply_in_channel", "Reply in a thread under a specific message in a Comms channel you belong to. Pass the parent message's id (from read_channel) as parent_id.", { channel_id: z.string(), parent_id: z.string(), body: z.string() }, async (a) => text(await client.replyInChannel(a.channel_id, a.parent_id, a.body)));
73
77
  async function main() {
74
78
  await server.connect(new StdioServerTransport());
75
79
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aioproductoscom/mcp",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "ProductOS MCP — manage tickets, read your product brain + analytics, and run the support inbox from Claude Code, Cursor, Codex, and any MCP host.",
5
5
  "type": "module",
6
6
  "license": "MIT",