@ourroadmaps/mcp 0.7.5 → 0.8.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 +33 -29
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -461,9 +461,15 @@ class ApiClient {
|
|
|
461
461
|
}
|
|
462
462
|
return await response.json();
|
|
463
463
|
}
|
|
464
|
-
async listRoadmaps() {
|
|
465
|
-
const
|
|
466
|
-
|
|
464
|
+
async listRoadmaps(params) {
|
|
465
|
+
const searchParams = new URLSearchParams;
|
|
466
|
+
if (params?.limit)
|
|
467
|
+
searchParams.set("limit", String(params.limit));
|
|
468
|
+
if (params?.offset)
|
|
469
|
+
searchParams.set("offset", String(params.offset));
|
|
470
|
+
const query = searchParams.toString();
|
|
471
|
+
const path = query ? `/v1/roadmaps?${query}` : "/v1/roadmaps";
|
|
472
|
+
return await this.request(path);
|
|
467
473
|
}
|
|
468
474
|
async getRoadmap(id) {
|
|
469
475
|
const response = await this.request(`/v1/roadmaps/${id}`);
|
|
@@ -756,15 +762,20 @@ function registerSearchRoadmaps(server) {
|
|
|
756
762
|
inputSchema: {
|
|
757
763
|
query: z10.string().optional().describe("Search query to match against title or description"),
|
|
758
764
|
status: roadmapStatusSchema.optional().describe("Filter by status"),
|
|
759
|
-
horizon: horizonSchema.optional().describe("Filter by planning horizon")
|
|
765
|
+
horizon: horizonSchema.optional().describe("Filter by planning horizon"),
|
|
766
|
+
limit: z10.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
|
|
767
|
+
offset: z10.number().int().min(0).optional().describe("Number of items to skip (default 0)")
|
|
760
768
|
}
|
|
761
769
|
}, async ({
|
|
762
770
|
query,
|
|
763
771
|
status,
|
|
764
|
-
horizon
|
|
772
|
+
horizon,
|
|
773
|
+
limit,
|
|
774
|
+
offset
|
|
765
775
|
}) => {
|
|
766
776
|
const client2 = getApiClient();
|
|
767
|
-
|
|
777
|
+
const response = await client2.listRoadmaps({ limit, offset });
|
|
778
|
+
let roadmaps = response.items;
|
|
768
779
|
if (query) {
|
|
769
780
|
const q = query.toLowerCase();
|
|
770
781
|
roadmaps = roadmaps.filter((r) => r.title.toLowerCase().includes(q));
|
|
@@ -779,15 +790,18 @@ function registerSearchRoadmaps(server) {
|
|
|
779
790
|
content: [
|
|
780
791
|
{
|
|
781
792
|
type: "text",
|
|
782
|
-
text: JSON.stringify(
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
793
|
+
text: JSON.stringify({
|
|
794
|
+
items: roadmaps.map((r) => ({
|
|
795
|
+
id: r.id,
|
|
796
|
+
title: r.title,
|
|
797
|
+
status: r.status,
|
|
798
|
+
horizon: r.horizon,
|
|
799
|
+
value: r.value,
|
|
800
|
+
effort: r.effort,
|
|
801
|
+
order: r.order
|
|
802
|
+
})),
|
|
803
|
+
pagination: response.pagination
|
|
804
|
+
}, null, 2)
|
|
791
805
|
}
|
|
792
806
|
]
|
|
793
807
|
};
|
|
@@ -954,28 +968,20 @@ function registerGetContext(server) {
|
|
|
954
968
|
- Audiences: Who the product serves (stakeholders and user personas) with their preferences
|
|
955
969
|
- Scenarios: User workflows and how they accomplish goals
|
|
956
970
|
- Features: Capabilities and functionality areas organized hierarchically
|
|
957
|
-
- Roadmap Summary:
|
|
971
|
+
- Roadmap Summary: Total count of roadmap items
|
|
958
972
|
|
|
959
973
|
Use this as your FIRST call when starting work on a roadmap to understand the full context.`,
|
|
960
974
|
inputSchema: {}
|
|
961
975
|
}, async () => {
|
|
962
976
|
const client2 = getApiClient();
|
|
963
|
-
const [strategy, products, audiences, scenarios, features,
|
|
977
|
+
const [strategy, products, audiences, scenarios, features, roadmapsResponse] = await Promise.all([
|
|
964
978
|
client2.getStrategy(),
|
|
965
979
|
client2.listProducts(),
|
|
966
980
|
client2.listAudiences(),
|
|
967
981
|
client2.listScenarios(),
|
|
968
982
|
client2.listFeatures(),
|
|
969
|
-
client2.listRoadmaps()
|
|
983
|
+
client2.listRoadmaps({ limit: 1 })
|
|
970
984
|
]);
|
|
971
|
-
const statusCounts = {};
|
|
972
|
-
const horizonCounts = {};
|
|
973
|
-
for (const r of roadmaps) {
|
|
974
|
-
const status = r.status ?? "unknown";
|
|
975
|
-
const horizon = r.horizon ?? "unknown";
|
|
976
|
-
statusCounts[status] = (statusCounts[status] || 0) + 1;
|
|
977
|
-
horizonCounts[horizon] = (horizonCounts[horizon] || 0) + 1;
|
|
978
|
-
}
|
|
979
985
|
return {
|
|
980
986
|
content: [
|
|
981
987
|
{
|
|
@@ -1013,9 +1019,7 @@ Use this as your FIRST call when starting work on a roadmap to understand the fu
|
|
|
1013
1019
|
parentId: f.parentId
|
|
1014
1020
|
})),
|
|
1015
1021
|
roadmapSummary: {
|
|
1016
|
-
total:
|
|
1017
|
-
byStatus: statusCounts,
|
|
1018
|
-
byHorizon: horizonCounts
|
|
1022
|
+
total: roadmapsResponse.pagination.total
|
|
1019
1023
|
}
|
|
1020
1024
|
}, null, 2)
|
|
1021
1025
|
}
|