@ourroadmaps/mcp 0.4.0 → 0.6.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 +158 -0
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -23976,6 +23976,21 @@ class ApiClient {
23976
23976
  });
23977
23977
  return response.data;
23978
23978
  }
23979
+ async getProduct(id) {
23980
+ const response = await this.request(`/v1/products/${id}`);
23981
+ return response.data;
23982
+ }
23983
+ async getProductDocumentation(productId) {
23984
+ const response = await this.request(`/v1/products/${productId}/documentation`);
23985
+ return response.data;
23986
+ }
23987
+ async updateProductDocumentation(productId, data) {
23988
+ const response = await this.request(`/v1/products/${productId}/documentation`, {
23989
+ method: "PUT",
23990
+ body: JSON.stringify(data)
23991
+ });
23992
+ return response.data;
23993
+ }
23979
23994
  async listAudiences() {
23980
23995
  const response = await this.request("/v1/audiences");
23981
23996
  return response.data;
@@ -24093,6 +24108,10 @@ function registerAllTools(server) {
24093
24108
  registerCreateProduct(server);
24094
24109
  registerUpdateProduct(server);
24095
24110
  registerDeleteProduct(server);
24111
+ registerGetProduct(server);
24112
+ registerSearchProducts(server);
24113
+ registerGetProductDocumentation(server);
24114
+ registerUpdateProductDocumentation(server);
24096
24115
  registerCreateAudience(server);
24097
24116
  registerUpdateAudience(server);
24098
24117
  registerDeleteAudience(server);
@@ -25043,6 +25062,145 @@ function registerDeleteProduct(server) {
25043
25062
  };
25044
25063
  });
25045
25064
  }
25065
+ function registerGetProduct(server) {
25066
+ server.registerTool("get_product", {
25067
+ description: "Get full details of a product by ID, including its documentation (design system and ADRs).",
25068
+ inputSchema: {
25069
+ id: exports_external.string().describe("The UUID of the product")
25070
+ }
25071
+ }, async ({ id }) => {
25072
+ const client2 = getApiClient();
25073
+ const [product2, documentation] = await Promise.all([
25074
+ client2.getProduct(id),
25075
+ client2.getProductDocumentation(id)
25076
+ ]);
25077
+ return {
25078
+ content: [
25079
+ {
25080
+ type: "text",
25081
+ text: JSON.stringify({
25082
+ product: {
25083
+ id: product2.id,
25084
+ type: product2.type,
25085
+ name: product2.name,
25086
+ parentId: product2.parentId,
25087
+ order: product2.order,
25088
+ isExpanded: product2.isExpanded,
25089
+ createdAt: product2.createdAt
25090
+ },
25091
+ documentation: documentation ? {
25092
+ designSystem: documentation.designSystem,
25093
+ adrs: documentation.adrs,
25094
+ updatedAt: documentation.updatedAt
25095
+ } : null
25096
+ }, null, 2)
25097
+ }
25098
+ ]
25099
+ };
25100
+ });
25101
+ }
25102
+ function registerSearchProducts(server) {
25103
+ server.registerTool("search_products", {
25104
+ description: "Search for products by name. Returns a list of matching products with basic info.",
25105
+ inputSchema: {
25106
+ query: exports_external.string().optional().describe("Search query to match against product name"),
25107
+ type: productTypeSchema2.optional().describe("Filter by product type")
25108
+ }
25109
+ }, async ({ query, type }) => {
25110
+ const client2 = getApiClient();
25111
+ let products = await client2.listProducts();
25112
+ if (query) {
25113
+ const lowerQuery = query.toLowerCase();
25114
+ products = products.filter((p) => p.name.toLowerCase().includes(lowerQuery));
25115
+ }
25116
+ if (type) {
25117
+ products = products.filter((p) => p.type === type);
25118
+ }
25119
+ return {
25120
+ content: [
25121
+ {
25122
+ type: "text",
25123
+ text: JSON.stringify({
25124
+ count: products.length,
25125
+ products: products.map((p) => ({
25126
+ id: p.id,
25127
+ type: p.type,
25128
+ name: p.name,
25129
+ parentId: p.parentId
25130
+ }))
25131
+ }, null, 2)
25132
+ }
25133
+ ]
25134
+ };
25135
+ });
25136
+ }
25137
+ function registerGetProductDocumentation(server) {
25138
+ server.registerTool("get_product_documentation", {
25139
+ description: "Get the documentation (design system and ADRs) for a product. Use this to read existing documentation before updating.",
25140
+ inputSchema: {
25141
+ productId: exports_external.string().describe("The UUID of the product")
25142
+ }
25143
+ }, async ({ productId }) => {
25144
+ const client2 = getApiClient();
25145
+ const documentation = await client2.getProductDocumentation(productId);
25146
+ return {
25147
+ content: [
25148
+ {
25149
+ type: "text",
25150
+ text: JSON.stringify({
25151
+ productId,
25152
+ documentation: documentation ? {
25153
+ id: documentation.id,
25154
+ designSystem: documentation.designSystem,
25155
+ adrs: documentation.adrs,
25156
+ createdAt: documentation.createdAt,
25157
+ updatedAt: documentation.updatedAt
25158
+ } : null
25159
+ }, null, 2)
25160
+ }
25161
+ ]
25162
+ };
25163
+ });
25164
+ }
25165
+ function registerUpdateProductDocumentation(server) {
25166
+ server.registerTool("update_product_documentation", {
25167
+ description: "Update the documentation for a product. Use this to keep design system and ADRs up to date. Creates documentation if it does not exist.",
25168
+ inputSchema: {
25169
+ productId: exports_external.string().describe("The UUID of the product"),
25170
+ designSystem: exports_external.string().nullable().optional().describe("Design system documentation - colors, typography, spacing, components. Pass null to clear."),
25171
+ adrs: exports_external.string().nullable().optional().describe("Architecture Decision Records - document key technical decisions. Pass null to clear.")
25172
+ }
25173
+ }, async ({
25174
+ productId,
25175
+ designSystem,
25176
+ adrs
25177
+ }) => {
25178
+ const client2 = getApiClient();
25179
+ const updates = {};
25180
+ if (designSystem !== undefined)
25181
+ updates.designSystem = designSystem;
25182
+ if (adrs !== undefined)
25183
+ updates.adrs = adrs;
25184
+ const documentation = await client2.updateProductDocumentation(productId, updates);
25185
+ return {
25186
+ content: [
25187
+ {
25188
+ type: "text",
25189
+ text: JSON.stringify({
25190
+ success: true,
25191
+ documentation: {
25192
+ id: documentation.id,
25193
+ productId: documentation.productId,
25194
+ designSystem: documentation.designSystem,
25195
+ adrs: documentation.adrs,
25196
+ updatedAt: documentation.updatedAt
25197
+ }
25198
+ }, null, 2)
25199
+ }
25200
+ ]
25201
+ };
25202
+ });
25203
+ }
25046
25204
  var audienceTypeSchema2 = exports_external.enum(["stakeholder", "user_persona"]);
25047
25205
  function registerCreateAudience(server) {
25048
25206
  server.registerTool("create_audience", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ourroadmaps/mcp",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "MCP server for OurRoadmaps - manage roadmaps, features, and ideas from Claude Code",
5
5
  "type": "module",
6
6
  "bin": {
@@ -30,7 +30,7 @@
30
30
  "url": "https://github.com/bgraner/roadmaps3.git",
31
31
  "directory": "apps/mcp"
32
32
  },
33
- "license": "MIT",
33
+ "license": "UNLICENSED",
34
34
  "dependencies": {
35
35
  "@modelcontextprotocol/sdk": "^1.24.3",
36
36
  "@ourroadmaps/shared": "*",