@voteship/mcp-server 0.1.0 → 0.1.1
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/client.js +1 -1
- package/dist/prompts/changelog.js +4 -7
- package/dist/prompts/sprint.js +5 -12
- package/dist/prompts/summary.js +4 -7
- package/dist/resources/analytics.js +1 -1
- package/dist/resources/changelog.js +1 -1
- package/dist/resources/project.js +2 -2
- package/dist/resources/roadmap.js +1 -1
- package/dist/tools/ai.js +8 -7
- package/dist/tools/analytics.js +2 -1
- package/dist/tools/comments.js +5 -4
- package/dist/tools/posts.js +16 -15
- package/dist/tools/releases.js +5 -4
- package/dist/tools/search.js +4 -3
- package/dist/tools/tags.js +3 -2
- package/dist/tools/users.js +3 -2
- package/dist/tools/votes.js +12 -9
- package/dist/tools/webhooks.js +4 -3
- package/package.json +3 -2
package/dist/client.js
CHANGED
|
@@ -114,7 +114,7 @@ export class VoteShipClient {
|
|
|
114
114
|
if (params?.period)
|
|
115
115
|
query.set("period", params.period);
|
|
116
116
|
const qs = query.toString();
|
|
117
|
-
return this.request("GET", `/analytics
|
|
117
|
+
return this.request("GET", `/analytics${qs ? `?${qs}` : ""}`);
|
|
118
118
|
}
|
|
119
119
|
// --- AI Workflows ---
|
|
120
120
|
async submitFeedback(data) {
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
export function registerChangelogPrompt(server) {
|
|
2
|
-
server.prompt("generate_changelog", "Draft release notes from recently completed feature requests",
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
description: "Time period to look back: week, month, or quarter (default: month)",
|
|
6
|
-
required: false,
|
|
7
|
-
},
|
|
8
|
-
], async (params) => ({
|
|
3
|
+
server.prompt("generate_changelog", "Draft release notes from recently completed feature requests", {
|
|
4
|
+
period: z.string().describe("Time period to look back: week, month, or quarter (default: month)").optional(),
|
|
5
|
+
}, async (params) => ({
|
|
9
6
|
messages: [
|
|
10
7
|
{
|
|
11
8
|
role: "user",
|
package/dist/prompts/sprint.js
CHANGED
|
@@ -1,16 +1,9 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
export function registerSprintPrompt(server) {
|
|
2
|
-
server.prompt("sprint_planning", "Suggest what to build next based on votes, themes, and prioritization strategy",
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
required: false,
|
|
7
|
-
},
|
|
8
|
-
{
|
|
9
|
-
name: "strategy",
|
|
10
|
-
description: "Prioritization: balanced, revenue, popular, or quick-wins (default: balanced)",
|
|
11
|
-
required: false,
|
|
12
|
-
},
|
|
13
|
-
], async (params) => ({
|
|
3
|
+
server.prompt("sprint_planning", "Suggest what to build next based on votes, themes, and prioritization strategy", {
|
|
4
|
+
capacity: z.string().describe("Number of features for the sprint (default: 5)").optional(),
|
|
5
|
+
strategy: z.string().describe("Prioritization: balanced, revenue, popular, or quick-wins (default: balanced)").optional(),
|
|
6
|
+
}, async (params) => ({
|
|
14
7
|
messages: [
|
|
15
8
|
{
|
|
16
9
|
role: "user",
|
package/dist/prompts/summary.js
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
export function registerSummaryPrompt(server) {
|
|
2
|
-
server.prompt("feedback_summary", "Summarize feedback trends, highlights, and actionable insights for a time period",
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
description: "Time period: week, month, or quarter (default: week)",
|
|
6
|
-
required: false,
|
|
7
|
-
},
|
|
8
|
-
], async (params) => ({
|
|
3
|
+
server.prompt("feedback_summary", "Summarize feedback trends, highlights, and actionable insights for a time period", {
|
|
4
|
+
period: z.string().describe("Time period: week, month, or quarter (default: week)").optional(),
|
|
5
|
+
}, async (params) => ({
|
|
9
6
|
messages: [
|
|
10
7
|
{
|
|
11
8
|
role: "user",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export function registerAnalyticsResources(server, client) {
|
|
2
|
-
server.resource("project-analytics", "voteship://project/analytics", "Analytics snapshot — daily stats, top posts, and trending tags for the past week", async () => {
|
|
2
|
+
server.resource("project-analytics", "voteship://project/analytics", { description: "Analytics snapshot — daily stats, top posts, and trending tags for the past week" }, async () => {
|
|
3
3
|
const result = await client.getAnalytics({ period: "week" });
|
|
4
4
|
return {
|
|
5
5
|
contents: [
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export function registerChangelogResources(server, client) {
|
|
2
|
-
server.resource("project-changelog", "voteship://project/changelog", "Published changelog releases — recent product updates and shipped features", async () => {
|
|
2
|
+
server.resource("project-changelog", "voteship://project/changelog", { description: "Published changelog releases — recent product updates and shipped features" }, async () => {
|
|
3
3
|
const result = await client.listReleases({ limit: 20 });
|
|
4
4
|
return {
|
|
5
5
|
contents: [
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export function registerProjectResources(server, client) {
|
|
2
|
-
server.resource("project-overview", "voteship://project/overview", "Project summary with key stats — post counts, vote counts, and configuration", async () => {
|
|
2
|
+
server.resource("project-overview", "voteship://project/overview", { description: "Project summary with key stats — post counts, vote counts, and configuration" }, async () => {
|
|
3
3
|
const [postsData, tagsData, usersData] = await Promise.all([
|
|
4
4
|
client.listPosts({ limit: 1 }),
|
|
5
5
|
client.listTags(),
|
|
@@ -20,7 +20,7 @@ export function registerProjectResources(server, client) {
|
|
|
20
20
|
],
|
|
21
21
|
};
|
|
22
22
|
});
|
|
23
|
-
server.resource("project-board", "voteship://project/board", "Full board state — all posts grouped by status with tags and vote counts", async () => {
|
|
23
|
+
server.resource("project-board", "voteship://project/board", { description: "Full board state — all posts grouped by status with tags and vote counts" }, async () => {
|
|
24
24
|
const result = await client.listPosts({ limit: 100 });
|
|
25
25
|
return {
|
|
26
26
|
contents: [
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export function registerRoadmapResources(server, client) {
|
|
2
|
-
server.resource("project-roadmap", "voteship://project/roadmap", "Public roadmap — approved, in-progress, and completed features sorted by votes", async () => {
|
|
2
|
+
server.resource("project-roadmap", "voteship://project/roadmap", { description: "Public roadmap — approved, in-progress, and completed features sorted by votes" }, async () => {
|
|
3
3
|
const result = await client.getRoadmap();
|
|
4
4
|
return {
|
|
5
5
|
contents: [
|
package/dist/tools/ai.js
CHANGED
|
@@ -1,27 +1,28 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
export function registerAiTools(server, client) {
|
|
2
3
|
server.tool("submit_feedback", "Submit unstructured text as a feature request. AI extracts the title, description, checks for duplicates, and auto-categorizes with tags. Great for processing Slack messages, emails, or support tickets.", {
|
|
3
|
-
text:
|
|
4
|
-
source:
|
|
5
|
-
source_url:
|
|
4
|
+
text: z.string().describe("Raw text describing a feature request, e.g. 'Multiple customers asked for PDF export'"),
|
|
5
|
+
source: z.string().describe("Where the feedback came from: slack, email, support, intercom, etc.").optional(),
|
|
6
|
+
source_url: z.string().describe("URL to the original message (e.g. Slack permalink)").optional(),
|
|
6
7
|
}, async (params) => {
|
|
7
8
|
const result = await client.submitFeedback(params);
|
|
8
9
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
9
10
|
});
|
|
10
11
|
server.tool("triage_inbox", "AI-powered triage of unreviewed feature requests. Analyzes pending posts, detects duplicates, suggests status/tags, and provides priority recommendations. Requires Growth plan.", {
|
|
11
|
-
limit:
|
|
12
|
+
limit: z.number().describe("Maximum posts to triage (default: 20, max: 50)").optional(),
|
|
12
13
|
}, async (params) => {
|
|
13
14
|
const result = await client.triageInbox(params);
|
|
14
15
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
15
16
|
});
|
|
16
17
|
server.tool("get_summary", "Generate an AI-powered natural language summary of recent feedback trends, highlights, and recommended actions. Requires Growth plan.", {
|
|
17
|
-
period:
|
|
18
|
+
period: z.string().describe("Time period: week, month, or quarter (default: week)").optional(),
|
|
18
19
|
}, async (params) => {
|
|
19
20
|
const result = await client.getSummary(params);
|
|
20
21
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
21
22
|
});
|
|
22
23
|
server.tool("plan_sprint", "AI-suggested sprint plan based on approved feature requests, votes, tags, and the selected prioritization strategy. Requires Growth plan.", {
|
|
23
|
-
capacity:
|
|
24
|
-
strategy:
|
|
24
|
+
capacity: z.number().describe("Number of features to include in the sprint (default: 5, max: 20)").optional(),
|
|
25
|
+
strategy: z.string().describe("Prioritization strategy: balanced, revenue, popular, or quick-wins (default: balanced)").optional(),
|
|
25
26
|
}, async (params) => {
|
|
26
27
|
const result = await client.planSprint(params);
|
|
27
28
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
package/dist/tools/analytics.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
export function registerAnalyticsTools(server, client) {
|
|
2
3
|
server.tool("get_analytics", "Get analytics summary — new posts, votes, comments, page views, top posts, and trending tags for a given time period", {
|
|
3
|
-
period:
|
|
4
|
+
period: z.string().describe("Time period: week, month, or quarter (default: week)").optional(),
|
|
4
5
|
}, async (params) => {
|
|
5
6
|
const result = await client.getAnalytics(params);
|
|
6
7
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
package/dist/tools/comments.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
export function registerCommentTools(server, client) {
|
|
2
3
|
server.tool("add_comment", "Add a comment to a feature request post", {
|
|
3
|
-
post_id:
|
|
4
|
-
body:
|
|
5
|
-
author_name:
|
|
4
|
+
post_id: z.string().describe("The post ID to comment on"),
|
|
5
|
+
body: z.string().describe("Comment text content"),
|
|
6
|
+
author_name: z.string().describe("Display name for the comment author").optional(),
|
|
6
7
|
}, async (params) => {
|
|
7
8
|
const result = await client.addComment(params.post_id, {
|
|
8
9
|
body: params.body,
|
|
@@ -11,7 +12,7 @@ export function registerCommentTools(server, client) {
|
|
|
11
12
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
12
13
|
});
|
|
13
14
|
server.tool("get_comments", "List all comments on a feature request post", {
|
|
14
|
-
post_id:
|
|
15
|
+
post_id: z.string().describe("The post ID to get comments for"),
|
|
15
16
|
}, async (params) => {
|
|
16
17
|
const result = await client.getComments(params.post_id);
|
|
17
18
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
package/dist/tools/posts.js
CHANGED
|
@@ -1,24 +1,25 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
export function registerPostTools(server, client) {
|
|
2
3
|
server.tool("list_posts", "List feature requests with optional filters for status, sorting, and pagination", {
|
|
3
|
-
status:
|
|
4
|
-
sort:
|
|
5
|
-
limit:
|
|
6
|
-
page:
|
|
4
|
+
status: z.string().describe("Filter by status: PENDING, APPROVED, IN_PROGRESS, COMPLETE, CLOSED").optional(),
|
|
5
|
+
sort: z.string().describe("Sort order: votes (default) or date").optional(),
|
|
6
|
+
limit: z.number().describe("Results per page (default: 50, max: 100)").optional(),
|
|
7
|
+
page: z.number().describe("Page number (default: 1)").optional(),
|
|
7
8
|
}, async (params) => {
|
|
8
9
|
const result = await client.listPosts(params);
|
|
9
10
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
10
11
|
});
|
|
11
12
|
server.tool("get_post", "Get a single feature request post with its votes, comments, and tags", {
|
|
12
|
-
post_id:
|
|
13
|
+
post_id: z.string().describe("The post ID to retrieve"),
|
|
13
14
|
}, async (params) => {
|
|
14
15
|
const result = await client.getPost(params.post_id);
|
|
15
16
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
16
17
|
});
|
|
17
18
|
server.tool("create_post", "Create a new feature request post. Title is required. Status defaults to PENDING if not provided.", {
|
|
18
|
-
title:
|
|
19
|
-
description:
|
|
20
|
-
status:
|
|
21
|
-
tag_ids:
|
|
19
|
+
title: z.string().describe("Feature request title (max 200 chars)"),
|
|
20
|
+
description: z.string().describe("Detailed description of the feature request").optional(),
|
|
21
|
+
status: z.string().describe("Initial status: PENDING, APPROVED, IN_PROGRESS, COMPLETE, CLOSED").optional(),
|
|
22
|
+
tag_ids: z.string().describe("Comma-separated tag IDs to attach").optional(),
|
|
22
23
|
}, async (params) => {
|
|
23
24
|
const tagIds = params.tag_ids ? params.tag_ids.split(",").map((s) => s.trim()) : undefined;
|
|
24
25
|
const result = await client.createPost({
|
|
@@ -30,11 +31,11 @@ export function registerPostTools(server, client) {
|
|
|
30
31
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
31
32
|
});
|
|
32
33
|
server.tool("update_post", "Update an existing post's title, description, status, or tags. Only include fields you want to change.", {
|
|
33
|
-
post_id:
|
|
34
|
-
title:
|
|
35
|
-
description:
|
|
36
|
-
status:
|
|
37
|
-
tag_ids:
|
|
34
|
+
post_id: z.string().describe("The post ID to update"),
|
|
35
|
+
title: z.string().describe("New title (max 200 chars)").optional(),
|
|
36
|
+
description: z.string().describe("New description").optional(),
|
|
37
|
+
status: z.string().describe("New status: PENDING, APPROVED, IN_PROGRESS, COMPLETE, CLOSED").optional(),
|
|
38
|
+
tag_ids: z.string().describe("Comma-separated tag IDs (replaces all existing tags)").optional(),
|
|
38
39
|
}, async (params) => {
|
|
39
40
|
const tagIds = params.tag_ids ? params.tag_ids.split(",").map((s) => s.trim()) : undefined;
|
|
40
41
|
const result = await client.updatePost(params.post_id, {
|
|
@@ -46,7 +47,7 @@ export function registerPostTools(server, client) {
|
|
|
46
47
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
47
48
|
});
|
|
48
49
|
server.tool("delete_post", "Permanently delete a feature request and all its associated votes and comments", {
|
|
49
|
-
post_id:
|
|
50
|
+
post_id: z.string().describe("The post ID to delete"),
|
|
50
51
|
}, async (params) => {
|
|
51
52
|
const result = await client.deletePost(params.post_id);
|
|
52
53
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
package/dist/tools/releases.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
export function registerReleaseTools(server, client) {
|
|
2
3
|
server.tool("list_releases", "List published changelog releases", {
|
|
3
|
-
limit:
|
|
4
|
+
limit: z.number().describe("Number of releases to return (default: 20)").optional(),
|
|
4
5
|
}, async (params) => {
|
|
5
6
|
const result = await client.listReleases(params);
|
|
6
7
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
7
8
|
});
|
|
8
9
|
server.tool("create_release", "Create a new changelog release. Publishes immediately unless is_draft is true.", {
|
|
9
|
-
title:
|
|
10
|
-
content:
|
|
11
|
-
is_draft:
|
|
10
|
+
title: z.string().describe("Release title, e.g. 'January 2026 Update'"),
|
|
11
|
+
content: z.string().describe("Release notes content (HTML supported)"),
|
|
12
|
+
is_draft: z.boolean().describe("Save as draft (true) or publish immediately (false, default)").optional(),
|
|
12
13
|
}, async (params) => {
|
|
13
14
|
const result = await client.createRelease({
|
|
14
15
|
title: params.title,
|
package/dist/tools/search.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
export function registerSearchTools(server, client) {
|
|
2
3
|
server.tool("search_similar", "Find similar feature requests using AI semantic search (pgvector). Useful for checking if a request already exists before creating a new one.", {
|
|
3
|
-
query:
|
|
4
|
-
threshold:
|
|
5
|
-
limit:
|
|
4
|
+
query: z.string().describe("Natural language search query, e.g. 'export data as PDF'"),
|
|
5
|
+
threshold: z.number().describe("Minimum similarity score 0-1 (default: 0.7)").optional(),
|
|
6
|
+
limit: z.number().describe("Maximum results to return (default: 5, max: 20)").optional(),
|
|
6
7
|
}, async (params) => {
|
|
7
8
|
const result = await client.searchSimilar(params);
|
|
8
9
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
package/dist/tools/tags.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
export function registerTagTools(server, client) {
|
|
2
3
|
server.tool("list_tags", "List all available tags for categorizing feature requests", {}, async () => {
|
|
3
4
|
const result = await client.listTags();
|
|
4
5
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
5
6
|
});
|
|
6
7
|
server.tool("create_tag", "Create a new tag for categorizing feature requests", {
|
|
7
|
-
label:
|
|
8
|
-
theme:
|
|
8
|
+
label: z.string().describe("Tag name, e.g. 'Mobile', 'Performance', 'UI'"),
|
|
9
|
+
theme: z.string().describe("Hex color for the tag, e.g. '#6366f1'").optional(),
|
|
9
10
|
}, async (params) => {
|
|
10
11
|
const result = await client.createTag(params);
|
|
11
12
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
package/dist/tools/users.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
export function registerUserTools(server, client) {
|
|
2
3
|
server.tool("list_users", "List board users who have submitted feedback or voted on feature requests", {
|
|
3
|
-
limit:
|
|
4
|
-
page:
|
|
4
|
+
limit: z.number().describe("Results per page (default: 50, max: 100)").optional(),
|
|
5
|
+
page: z.number().describe("Page number (default: 1)").optional(),
|
|
5
6
|
}, async (params) => {
|
|
6
7
|
const result = await client.listUsers(params);
|
|
7
8
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
package/dist/tools/votes.js
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
export function registerVoteTools(server, client) {
|
|
2
|
-
server.tool("add_vote", "Add a vote to a feature request.
|
|
3
|
-
post_id:
|
|
4
|
-
board_user_id:
|
|
5
|
-
anonymous_id:
|
|
3
|
+
server.tool("add_vote", "Add a vote to a feature request. You must provide either a board_user_id or anonymous_id to identify the voter.", {
|
|
4
|
+
post_id: z.string().describe("The post ID to vote on"),
|
|
5
|
+
board_user_id: z.string().describe("Board user ID (for identified users)").optional(),
|
|
6
|
+
anonymous_id: z.string().describe("Anonymous ID (for unidentified users, e.g. a fingerprint or UUID)").optional(),
|
|
6
7
|
}, async (params) => {
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
const data = {};
|
|
9
|
+
if (params.board_user_id)
|
|
10
|
+
data.boardUserId = params.board_user_id;
|
|
11
|
+
if (params.anonymous_id)
|
|
12
|
+
data.anonymousId = params.anonymous_id;
|
|
13
|
+
const result = await client.addVote(params.post_id, data);
|
|
11
14
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
12
15
|
});
|
|
13
16
|
server.tool("get_voters", "List all users who voted on a specific feature request", {
|
|
14
|
-
post_id:
|
|
17
|
+
post_id: z.string().describe("The post ID to get voters for"),
|
|
15
18
|
}, async (params) => {
|
|
16
19
|
const result = await client.getVoters(params.post_id);
|
|
17
20
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
package/dist/tools/webhooks.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
export function registerWebhookTools(server, client) {
|
|
2
3
|
server.tool("configure_webhook", "Create a new webhook endpoint to receive real-time notifications. Events: post.created, post.updated, post.deleted, post.status_changed, vote.created, vote.removed, comment.created, comment.deleted, tag.created, tag.deleted, release.published, or * for all.", {
|
|
3
|
-
url:
|
|
4
|
-
events:
|
|
5
|
-
description:
|
|
4
|
+
url: z.string().describe("The HTTPS URL to receive webhook POST requests"),
|
|
5
|
+
events: z.string().describe("Comma-separated event types to subscribe to, e.g. 'post.created,vote.created' or '*' for all"),
|
|
6
|
+
description: z.string().describe("Human-readable description of this webhook").optional(),
|
|
6
7
|
}, async (params) => {
|
|
7
8
|
const events = params.events.split(",").map((e) => e.trim());
|
|
8
9
|
const result = await client.configureWebhook({
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voteship/mcp-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "MCP server for VoteShip — manage feature requests, votes, roadmaps, and AI workflows from any MCP client",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
"typecheck": "tsc --noEmit"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@modelcontextprotocol/sdk": "^1.12.1"
|
|
20
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
21
|
+
"zod": "^3.25.76"
|
|
21
22
|
},
|
|
22
23
|
"devDependencies": {
|
|
23
24
|
"@types/node": "^22.0.0",
|