pub-mcp 0.1.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 (63) hide show
  1. package/.dockerignore +13 -0
  2. package/.editorconfig +14 -0
  3. package/.env.example +15 -0
  4. package/.eslintrc.cjs +21 -0
  5. package/.github/workflows/ci.yml +63 -0
  6. package/.prettierrc +7 -0
  7. package/CHANGELOG.md +84 -0
  8. package/CODE_OF_CONDUCT.md +34 -0
  9. package/CONTRIBUTING.md +55 -0
  10. package/Dockerfile +13 -0
  11. package/LICENSE +21 -0
  12. package/README.md +287 -0
  13. package/dist/cache/cache.d.ts +27 -0
  14. package/dist/cache/cache.d.ts.map +1 -0
  15. package/dist/cache/cache.js +94 -0
  16. package/dist/cache/cache.js.map +1 -0
  17. package/dist/cli.d.ts +3 -0
  18. package/dist/cli.d.ts.map +1 -0
  19. package/dist/cli.js +286 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/clients/githubClient.d.ts +33 -0
  22. package/dist/clients/githubClient.d.ts.map +1 -0
  23. package/dist/clients/githubClient.js +126 -0
  24. package/dist/clients/githubClient.js.map +1 -0
  25. package/dist/clients/pubClient.d.ts +28 -0
  26. package/dist/clients/pubClient.d.ts.map +1 -0
  27. package/dist/clients/pubClient.js +223 -0
  28. package/dist/clients/pubClient.js.map +1 -0
  29. package/dist/server-http.d.ts +7 -0
  30. package/dist/server-http.d.ts.map +1 -0
  31. package/dist/server-http.js +139 -0
  32. package/dist/server-http.js.map +1 -0
  33. package/dist/server.d.ts +2 -0
  34. package/dist/server.d.ts.map +1 -0
  35. package/dist/server.js +69 -0
  36. package/dist/server.js.map +1 -0
  37. package/dist/toolRegistry.d.ts +74 -0
  38. package/dist/toolRegistry.d.ts.map +1 -0
  39. package/dist/toolRegistry.js +80 -0
  40. package/dist/toolRegistry.js.map +1 -0
  41. package/dist/tools/index.d.ts +142 -0
  42. package/dist/tools/index.d.ts.map +1 -0
  43. package/dist/tools/index.js +214 -0
  44. package/dist/tools/index.js.map +1 -0
  45. package/dist/types/index.d.ts +55 -0
  46. package/dist/types/index.d.ts.map +1 -0
  47. package/dist/types/index.js +2 -0
  48. package/dist/types/index.js.map +1 -0
  49. package/dist/utils/rateLimiter.d.ts +13 -0
  50. package/dist/utils/rateLimiter.d.ts.map +1 -0
  51. package/dist/utils/rateLimiter.js +42 -0
  52. package/dist/utils/rateLimiter.js.map +1 -0
  53. package/package.json +72 -0
  54. package/skills-lock.json +25 -0
  55. package/src/cache/cache.ts +124 -0
  56. package/src/cli.ts +350 -0
  57. package/src/clients/githubClient.ts +169 -0
  58. package/src/clients/pubClient.ts +312 -0
  59. package/src/tools/index.ts +266 -0
  60. package/src/types/index.ts +61 -0
  61. package/src/utils/rateLimiter.ts +56 -0
  62. package/tsconfig.json +24 -0
  63. package/vitest.config.ts +14 -0
@@ -0,0 +1,223 @@
1
+ import { getPackageCache, getSearchCache } from '../cache/cache.js';
2
+ const DEFAULT_TIMEOUT = 10000;
3
+ const DEFAULT_RETRIES = 3;
4
+ export class PubClientError extends Error {
5
+ statusCode;
6
+ isRetryable;
7
+ constructor(message, statusCode, isRetryable = false) {
8
+ super(message);
9
+ this.statusCode = statusCode;
10
+ this.isRetryable = isRetryable;
11
+ this.name = 'PubClientError';
12
+ }
13
+ }
14
+ export class PubClient {
15
+ baseUrl;
16
+ timeout;
17
+ retries;
18
+ constructor(options = {}) {
19
+ this.baseUrl = options.baseUrl || process.env.PUB_DEV_API_URL || 'https://pub.dev/api';
20
+ this.timeout = options.timeout || DEFAULT_TIMEOUT;
21
+ this.retries = options.retries || DEFAULT_RETRIES;
22
+ }
23
+ async fetchWithTimeout(url, options = {}) {
24
+ const controller = new AbortController();
25
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
26
+ try {
27
+ const response = await fetch(url, {
28
+ ...options,
29
+ signal: controller.signal,
30
+ });
31
+ return response;
32
+ }
33
+ finally {
34
+ clearTimeout(timeoutId);
35
+ }
36
+ }
37
+ async fetchWithRetry(url, options = {}) {
38
+ let lastError = null;
39
+ for (let attempt = 0; attempt < this.retries; attempt++) {
40
+ try {
41
+ const response = await this.fetchWithTimeout(url, options);
42
+ if (!response.ok) {
43
+ const isRetryable = response.status === 429 || (response.status >= 500 && response.status < 600);
44
+ if (isRetryable && attempt < this.retries - 1) {
45
+ await this.delay(Math.pow(2, attempt) * 1000);
46
+ continue;
47
+ }
48
+ throw new PubClientError(`HTTP error: ${response.status} ${response.statusText}`, response.status, isRetryable);
49
+ }
50
+ return response;
51
+ }
52
+ catch (error) {
53
+ lastError = error;
54
+ if (attempt < this.retries - 1 && lastError.name === 'AbortError') {
55
+ await this.delay(Math.pow(2, attempt) * 1000);
56
+ }
57
+ }
58
+ }
59
+ throw lastError || new PubClientError('Failed to fetch after retries');
60
+ }
61
+ delay(ms) {
62
+ return new Promise((resolve) => setTimeout(resolve, ms));
63
+ }
64
+ async searchPackages(query, limit = 10) {
65
+ const cacheKey = `search:${query}:${limit}`;
66
+ const cached = getSearchCache().get(cacheKey);
67
+ if (cached) {
68
+ return cached;
69
+ }
70
+ const url = `${this.baseUrl}/search?q=${encodeURIComponent(query)}&limit=${limit}`;
71
+ const response = await this.fetchWithRetry(url);
72
+ const data = (await response.json());
73
+ const packages = (data.packages || []).map((p) => ({
74
+ name: p.package,
75
+ description: p.description || '',
76
+ latestVersion: p.version,
77
+ }));
78
+ const result = {
79
+ packages,
80
+ total: data.totalCount || packages.length,
81
+ };
82
+ getSearchCache().set(cacheKey, result);
83
+ return result;
84
+ }
85
+ async getPackage(name) {
86
+ const cacheKey = `package:${name}`;
87
+ const cached = getPackageCache().get(cacheKey);
88
+ if (cached) {
89
+ return cached;
90
+ }
91
+ const url = `${this.baseUrl}/packages/${name}`;
92
+ const response = await this.fetchWithRetry(url);
93
+ if (response.status === 404) {
94
+ throw new PubClientError(`Package not found: ${name}`, 404, false);
95
+ }
96
+ const data = (await response.json());
97
+ const result = {
98
+ name: data.name,
99
+ description: data.latest.description || '',
100
+ latestVersion: data.latest.version,
101
+ published: data.latest.published,
102
+ updated: data.latest.published,
103
+ publisher: data.publisher?.publisherName,
104
+ homepage: data.urls?.homepage,
105
+ repository: data.urls?.repository,
106
+ issues: data.urls?.issues,
107
+ };
108
+ getPackageCache().set(cacheKey, result);
109
+ return result;
110
+ }
111
+ async getPackageVersions(name) {
112
+ const cacheKey = `versions:${name}`;
113
+ const cached = getPackageCache().get(cacheKey);
114
+ if (cached) {
115
+ return cached;
116
+ }
117
+ const url = `${this.baseUrl}/packages/${name}`;
118
+ const response = await this.fetchWithRetry(url);
119
+ if (response.status === 404) {
120
+ throw new PubClientError(`Package not found: ${name}`, 404, false);
121
+ }
122
+ const data = (await response.json());
123
+ const result = data.versions.map((v) => ({
124
+ version: v.version,
125
+ published: v.published,
126
+ }));
127
+ getPackageCache().set(cacheKey, result);
128
+ return result;
129
+ }
130
+ async getReadme(name, version) {
131
+ const cacheKey = `readme:${name}:${version || 'latest'}`;
132
+ const cached = getPackageCache().get(cacheKey);
133
+ if (cached) {
134
+ return cached;
135
+ }
136
+ const versionPart = version ? `/${version}` : '';
137
+ const url = `${this.baseUrl}/packages/${name}${versionPart}/readme`;
138
+ try {
139
+ const response = await this.fetchWithRetry(url);
140
+ if (response.status === 404) {
141
+ return '';
142
+ }
143
+ const content = await response.text();
144
+ getPackageCache().set(cacheKey, content);
145
+ return content;
146
+ }
147
+ catch (error) {
148
+ if (error instanceof PubClientError && error.statusCode === 404) {
149
+ return '';
150
+ }
151
+ throw error;
152
+ }
153
+ }
154
+ async getDependencies(name, version) {
155
+ const cacheKey = `deps:${name}:${version || 'latest'}`;
156
+ const cached = getPackageCache().get(cacheKey);
157
+ if (cached) {
158
+ return cached;
159
+ }
160
+ const versionPart = version ? `/${version}` : '';
161
+ const url = `${this.baseUrl}/packages/${name}${versionPart}`;
162
+ const response = await this.fetchWithRetry(url);
163
+ if (response.status === 404) {
164
+ throw new PubClientError(`Package not found: ${name}`, 404, false);
165
+ }
166
+ const data = (await response.json());
167
+ const result = data.latest?.dependencies || {};
168
+ getPackageCache().set(cacheKey, result);
169
+ return result;
170
+ }
171
+ async getPackageScore(name) {
172
+ const cacheKey = `score:${name}`;
173
+ const cached = getPackageCache().get(cacheKey);
174
+ if (cached) {
175
+ return cached;
176
+ }
177
+ const url = `${this.baseUrl}/packages/${name}/score`;
178
+ const response = await this.fetchWithRetry(url);
179
+ if (response.status === 404) {
180
+ throw new PubClientError(`Package not found: ${name}`, 404, false);
181
+ }
182
+ const data = (await response.json());
183
+ const result = {
184
+ grantedPoints: data.grantedPoints ?? 0,
185
+ maxPoints: data.maxPoints ?? 0,
186
+ likeCount: data.likeCount ?? 0,
187
+ downloadCount30Days: data.downloadCount30Days ?? 0,
188
+ tags: data.tags ?? [],
189
+ };
190
+ getPackageCache().set(cacheKey, result);
191
+ return result;
192
+ }
193
+ async getChangelog(name, version) {
194
+ const cacheKey = `changelog:${name}:${version || 'latest'}`;
195
+ const cached = getPackageCache().get(cacheKey);
196
+ if (cached) {
197
+ return cached;
198
+ }
199
+ const versionPart = version ? `/${version}` : '';
200
+ const url = `${this.baseUrl}/packages/${name}${versionPart}/changelog`;
201
+ try {
202
+ const response = await this.fetchWithRetry(url);
203
+ if (response.status === 404) {
204
+ return null;
205
+ }
206
+ const data = (await response.json());
207
+ const result = {
208
+ version: data.version,
209
+ published: data.published,
210
+ content: data.content || '',
211
+ };
212
+ getPackageCache().set(cacheKey, result);
213
+ return result;
214
+ }
215
+ catch (error) {
216
+ if (error instanceof PubClientError && error.statusCode === 404) {
217
+ return null;
218
+ }
219
+ throw error;
220
+ }
221
+ }
222
+ }
223
+ //# sourceMappingURL=pubClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pubClient.js","sourceRoot":"","sources":["../../src/clients/pubClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ declare function createServer(): Server;
3
+ declare function startStdio(): Promise<void>;
4
+ declare function startHttp(): Promise<void>;
5
+ export declare function startBoth(): Promise<void>;
6
+ export { startStdio, startHttp, createServer };
7
+ //# sourceMappingURL=server-http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-http.d.ts","sourceRoot":"","sources":["../src/server-http.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAwBnE,iBAAS,YAAY,IAAI,MAAM,CA2E9B;AAqDD,iBAAe,UAAU,kBAKxB;AAED,iBAAe,SAAS,kBASvB;AAED,wBAAsB,SAAS,kBAK9B;AAED,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,139 @@
1
+ import express from 'express';
2
+ import cors from 'cors';
3
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
4
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
5
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
6
+ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
7
+ import { PubClient } from './clients/pubClient.js';
8
+ import { GitHubClient } from './clients/githubClient.js';
9
+ import { tools, handleSearchPackages, handleGetPackageInfo, handleGetPackageVersions, handleGetReadme, handleGetDependencies, } from './tools/index.js';
10
+ import pino from 'pino';
11
+ const logger = pino({ level: process.env.LOG_LEVEL || 'info' });
12
+ const VERSION = '0.0.1';
13
+ const PORT = parseInt(process.env.PORT || '3000');
14
+ const client = new PubClient();
15
+ const githubClient = new GitHubClient();
16
+ function createServer() {
17
+ const server = new Server({
18
+ name: 'pub-mcp',
19
+ version: VERSION,
20
+ }, {
21
+ capabilities: {
22
+ tools: {},
23
+ },
24
+ });
25
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
26
+ return { tools };
27
+ });
28
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
29
+ const { name, arguments: args } = request.params;
30
+ try {
31
+ let result;
32
+ switch (name) {
33
+ case 'ping':
34
+ return {
35
+ content: [{ type: 'text', text: 'pong' }],
36
+ };
37
+ case 'health':
38
+ return {
39
+ content: [{ type: 'text', text: JSON.stringify({ status: 'ok', version: VERSION }) }],
40
+ };
41
+ case 'search_packages':
42
+ result = await handleSearchPackages(client, args);
43
+ break;
44
+ case 'get_package_info':
45
+ result = await handleGetPackageInfo(client, args);
46
+ break;
47
+ case 'get_package_versions':
48
+ result = await handleGetPackageVersions(client, args);
49
+ break;
50
+ case 'get_readme':
51
+ result = await handleGetReadme(client, githubClient, args);
52
+ break;
53
+ case 'get_dependencies':
54
+ result = await handleGetDependencies(client, args);
55
+ break;
56
+ default:
57
+ throw new Error(`Unknown tool: ${name}`);
58
+ }
59
+ return {
60
+ content: [{ type: 'text', text: JSON.stringify(result) }],
61
+ };
62
+ }
63
+ catch (error) {
64
+ const message = error instanceof Error ? error.message : String(error);
65
+ return {
66
+ content: [{ type: 'text', text: JSON.stringify({ error: message }) }],
67
+ isError: true,
68
+ };
69
+ }
70
+ });
71
+ return server;
72
+ }
73
+ const app = express();
74
+ app.use(express.json());
75
+ const transports = new Map();
76
+ app.use(cors({
77
+ exposedHeaders: ['WWW-Authenticate', 'Mcp-Session-Id', 'Mcp-Protocol-Version'],
78
+ origin: '*',
79
+ }));
80
+ app.post('/mcp', async (req, res) => {
81
+ const sessionId = req.headers['mcp-session-id'];
82
+ if (sessionId && transports.has(sessionId)) {
83
+ await transports.get(sessionId).handleRequest(req, res, req.body);
84
+ }
85
+ else {
86
+ const transport = new StreamableHTTPServerTransport({
87
+ sessionIdGenerator: () => crypto.randomUUID(),
88
+ onsessioninitialized: (sid) => {
89
+ transports.set(sid, transport);
90
+ },
91
+ });
92
+ transport.onclose = () => {
93
+ if (transport.sessionId) {
94
+ transports.delete(transport.sessionId);
95
+ }
96
+ };
97
+ const server = createServer();
98
+ await server.connect(transport);
99
+ await transport.handleRequest(req, res, req.body);
100
+ }
101
+ });
102
+ app.get('/health', (_req, res) => {
103
+ res.json({ status: 'ok', version: VERSION });
104
+ });
105
+ app.get('/', (_req, res) => {
106
+ res.json({
107
+ name: 'pub-mcp',
108
+ version: VERSION,
109
+ description: 'MCP server for pub.dev',
110
+ endpoints: {
111
+ mcp: 'POST /mcp',
112
+ health: 'GET /health',
113
+ },
114
+ });
115
+ });
116
+ async function startStdio() {
117
+ const server = createServer();
118
+ const transport = new StdioServerTransport();
119
+ await server.connect(transport);
120
+ logger.info('pub-mcp server running on stdio');
121
+ }
122
+ async function startHttp() {
123
+ try {
124
+ app.listen(PORT, () => {
125
+ logger.info(`pub-mcp HTTP server listening on port ${PORT}`);
126
+ });
127
+ }
128
+ catch (err) {
129
+ logger.error(err);
130
+ process.exit(1);
131
+ }
132
+ }
133
+ export async function startBoth() {
134
+ const stdioPromise = startStdio();
135
+ const httpPromise = startHttp();
136
+ await Promise.all([stdioPromise, httpPromise]);
137
+ }
138
+ export { startStdio, startHttp, createServer };
139
+ //# sourceMappingURL=server-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-http.js","sourceRoot":"","sources":["../src/server-http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
package/dist/server.js ADDED
@@ -0,0 +1,69 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
4
+ import { PubClient } from './clients/pubClient.js';
5
+ import { GitHubClient } from './clients/githubClient.js';
6
+ import { tools, handleSearchPackages, handleGetPackageInfo, handleGetPackageVersions, handleGetReadme, handleGetDependencies } from './tools/index.js';
7
+ const client = new PubClient();
8
+ const githubClient = new GitHubClient();
9
+ const server = new Server({
10
+ name: 'pub-mcp',
11
+ version: '0.0.1',
12
+ }, {
13
+ capabilities: {
14
+ tools: {},
15
+ },
16
+ });
17
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
18
+ return { tools };
19
+ });
20
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
21
+ const { name, arguments: args } = request.params;
22
+ try {
23
+ let result;
24
+ switch (name) {
25
+ case 'ping':
26
+ return {
27
+ content: [{ type: 'text', text: 'pong' }],
28
+ };
29
+ case 'health':
30
+ return {
31
+ content: [{ type: 'text', text: JSON.stringify({ status: 'ok', version: '0.0.1' }) }],
32
+ };
33
+ case 'search_packages':
34
+ result = await handleSearchPackages(client, args);
35
+ break;
36
+ case 'get_package_info':
37
+ result = await handleGetPackageInfo(client, args);
38
+ break;
39
+ case 'get_package_versions':
40
+ result = await handleGetPackageVersions(client, args);
41
+ break;
42
+ case 'get_readme':
43
+ result = await handleGetReadme(client, githubClient, args);
44
+ break;
45
+ case 'get_dependencies':
46
+ result = await handleGetDependencies(client, args);
47
+ break;
48
+ default:
49
+ throw new Error(`Unknown tool: ${name}`);
50
+ }
51
+ return {
52
+ content: [{ type: 'text', text: JSON.stringify(result) }],
53
+ };
54
+ }
55
+ catch (error) {
56
+ const message = error instanceof Error ? error.message : String(error);
57
+ return {
58
+ content: [{ type: 'text', text: JSON.stringify({ error: message }) }],
59
+ isError: true,
60
+ };
61
+ }
62
+ });
63
+ async function main() {
64
+ const transport = new StdioServerTransport();
65
+ await server.connect(transport);
66
+ console.error('pub-mcp server running on stdio');
67
+ }
68
+ main().catch(console.error);
69
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import { z } from 'zod';
2
+ export declare const searchPackagesSchema: z.ZodObject<{
3
+ query: z.ZodString;
4
+ limit: z.ZodDefault<z.ZodNumber>;
5
+ }, "strip", z.ZodTypeAny, {
6
+ query: string;
7
+ limit: number;
8
+ }, {
9
+ query: string;
10
+ limit?: number | undefined;
11
+ }>;
12
+ export declare const getPackageInfoSchema: z.ZodObject<{
13
+ name: z.ZodString;
14
+ }, "strip", z.ZodTypeAny, {
15
+ name: string;
16
+ }, {
17
+ name: string;
18
+ }>;
19
+ export declare const getPackageVersionsSchema: z.ZodObject<{
20
+ name: z.ZodString;
21
+ }, "strip", z.ZodTypeAny, {
22
+ name: string;
23
+ }, {
24
+ name: string;
25
+ }>;
26
+ export declare const getReadmeSchema: z.ZodObject<{
27
+ name: z.ZodString;
28
+ version: z.ZodOptional<z.ZodString>;
29
+ }, "strip", z.ZodTypeAny, {
30
+ name: string;
31
+ version?: string | undefined;
32
+ }, {
33
+ name: string;
34
+ version?: string | undefined;
35
+ }>;
36
+ export declare const getDependenciesSchema: z.ZodObject<{
37
+ name: z.ZodString;
38
+ version: z.ZodOptional<z.ZodString>;
39
+ }, "strip", z.ZodTypeAny, {
40
+ name: string;
41
+ version?: string | undefined;
42
+ }, {
43
+ name: string;
44
+ version?: string | undefined;
45
+ }>;
46
+ export type SearchPackagesInput = {
47
+ query: string;
48
+ limit?: number;
49
+ };
50
+ export type GetPackageInfoInput = {
51
+ name: string;
52
+ };
53
+ export type GetPackageVersionsInput = {
54
+ name: string;
55
+ };
56
+ export type GetReadmeInput = {
57
+ name: string;
58
+ version?: string;
59
+ };
60
+ export type GetDependenciesInput = {
61
+ name: string;
62
+ version?: string;
63
+ };
64
+ export interface ToolDefinition {
65
+ name: string;
66
+ description: string;
67
+ inputSchema: {
68
+ type: 'object';
69
+ properties: Record<string, unknown>;
70
+ required?: string[];
71
+ };
72
+ }
73
+ export declare const toolRegistry: ToolDefinition[];
74
+ //# sourceMappingURL=toolRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolRegistry.d.ts","sourceRoot":"","sources":["../src/toolRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,oBAAoB;;;;;;;;;EAG/B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;EAE/B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;EAEnC,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;EAG1B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;EAGhC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACpE,MAAM,MAAM,mBAAmB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AACnD,MAAM,MAAM,uBAAuB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AACvD,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAChE,MAAM,MAAM,oBAAoB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,eAAO,MAAM,YAAY,EAAE,cAAc,EA2DxC,CAAC"}
@@ -0,0 +1,80 @@
1
+ import { z } from 'zod';
2
+ export const searchPackagesSchema = z.object({
3
+ query: z.string().min(1),
4
+ limit: z.number().int().min(1).max(100).default(10),
5
+ });
6
+ export const getPackageInfoSchema = z.object({
7
+ name: z.string().min(1),
8
+ });
9
+ export const getPackageVersionsSchema = z.object({
10
+ name: z.string().min(1),
11
+ });
12
+ export const getReadmeSchema = z.object({
13
+ name: z.string().min(1),
14
+ version: z.string().optional(),
15
+ });
16
+ export const getDependenciesSchema = z.object({
17
+ name: z.string().min(1),
18
+ version: z.string().optional(),
19
+ });
20
+ export const toolRegistry = [
21
+ {
22
+ name: 'search_packages',
23
+ description: 'Search for packages on pub.dev by query',
24
+ inputSchema: {
25
+ type: 'object',
26
+ properties: {
27
+ query: { type: 'string', description: 'Search query string' },
28
+ limit: { type: 'number', description: 'Maximum number of results (default 10)' },
29
+ },
30
+ required: ['query'],
31
+ },
32
+ },
33
+ {
34
+ name: 'get_package_info',
35
+ description: 'Get detailed information about a specific package',
36
+ inputSchema: {
37
+ type: 'object',
38
+ properties: {
39
+ name: { type: 'string', description: 'Package name' },
40
+ },
41
+ required: ['name'],
42
+ },
43
+ },
44
+ {
45
+ name: 'get_package_versions',
46
+ description: 'Get all available versions of a package',
47
+ inputSchema: {
48
+ type: 'object',
49
+ properties: {
50
+ name: { type: 'string', description: 'Package name' },
51
+ },
52
+ required: ['name'],
53
+ },
54
+ },
55
+ {
56
+ name: 'get_readme',
57
+ description: 'Get the README content of a package',
58
+ inputSchema: {
59
+ type: 'object',
60
+ properties: {
61
+ name: { type: 'string', description: 'Package name' },
62
+ version: { type: 'string', description: 'Specific version (optional, defaults to latest)' },
63
+ },
64
+ required: ['name'],
65
+ },
66
+ },
67
+ {
68
+ name: 'get_dependencies',
69
+ description: 'Get the dependencies of a package',
70
+ inputSchema: {
71
+ type: 'object',
72
+ properties: {
73
+ name: { type: 'string', description: 'Package name' },
74
+ version: { type: 'string', description: 'Specific version (optional, defaults to latest)' },
75
+ },
76
+ required: ['name'],
77
+ },
78
+ },
79
+ ];
80
+ //# sourceMappingURL=toolRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolRegistry.js","sourceRoot":"","sources":["../src/toolRegistry.ts"],"names":[],"mappings":"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"}