@toolsdk.ai/registry 1.0.96 → 1.0.98

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
@@ -1,5 +1,7 @@
1
1
  # Awesome MCP Registry
2
2
 
3
+ [![Product Hunt](https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=997428&theme=light&period=daily)](https://www.producthunt.com/products/toolsdk-ai)
4
+
3
5
  ![How many MCP Servers in Awesome MCP Registry](https://img.shields.io/badge/MCP_Servers-4082-blue)
4
6
  ![awesome-mcp-registry License](https://img.shields.io/badge/LICENSE-MIT-ff69b4)
5
7
 
@@ -1,3 +1,3 @@
1
- import { Hono } from 'hono';
2
- declare const app: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
1
+ import { OpenAPIHono } from '@hono/zod-openapi';
2
+ declare const app: OpenAPIHono;
3
3
  export default app;
package/dist/api/index.js CHANGED
@@ -1,15 +1,29 @@
1
1
  import dotenv from 'dotenv';
2
2
  import path from 'path';
3
- import { Hono } from 'hono';
4
3
  import { serve } from '@hono/node-server';
5
4
  import { packageRoutes } from './package-route';
5
+ import { OpenAPIHono } from '@hono/zod-openapi';
6
+ import { swaggerUI } from '@hono/swagger-ui';
6
7
  dotenv.config({ path: path.resolve(process.cwd(), '.env.local') });
7
8
  dotenv.config({ path: path.resolve(process.cwd(), '.env') });
8
- const app = new Hono();
9
+ const app = new OpenAPIHono();
9
10
  app.route('/api/v1', packageRoutes);
10
11
  app.get('/', (c) => {
11
12
  return c.text('MCP Registry API Server is running!');
12
13
  });
14
+ app.get('/api/meta', (c) => {
15
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
16
+ const packageJson = require('../../package.json');
17
+ return c.json({ version: packageJson.version });
18
+ });
19
+ app.doc('/api/v1/doc', {
20
+ openapi: '3.0.0',
21
+ info: {
22
+ version: '1.0.0',
23
+ title: 'MCP Registry API',
24
+ },
25
+ });
26
+ app.get('/swagger', swaggerUI({ url: '/api/v1/doc' }));
13
27
  app.notFound((c) => {
14
28
  return c.json({ success: false, code: 404, message: 'Route not found' }, 404);
15
29
  });
@@ -1,12 +1,16 @@
1
1
  import { Context } from 'hono';
2
2
  export declare const packageHandler: {
3
- executeTool: (c: Context) => Promise<(globalThis.Response & import("hono").TypedResponse<never, 200 | 500, "json">) | (globalThis.Response & import("hono").TypedResponse<{
4
- success: false;
3
+ executeTool: (c: Context) => Promise<(globalThis.Response & import("hono").TypedResponse<never, 200, "json">) | (globalThis.Response & import("hono").TypedResponse<{
4
+ success: boolean;
5
5
  code: number;
6
6
  message: string;
7
7
  }, 404, "json">)>;
8
8
  getPackageDetail: (c: Context) => Promise<(globalThis.Response & import("hono").TypedResponse<{
9
- success: false;
9
+ success: boolean;
10
+ code: number;
11
+ message: string;
12
+ }, 404, "json">) | (globalThis.Response & import("hono").TypedResponse<{
13
+ success: boolean;
10
14
  code: number;
11
15
  message: string;
12
16
  }, 400, "json">) | (globalThis.Response & import("hono").TypedResponse<{
@@ -17,9 +21,9 @@ export declare const packageHandler: {
17
21
  type: "mcp-server";
18
22
  packageName: string;
19
23
  runtime: "node" | "python" | "java" | "go";
20
- key?: string | undefined;
21
- name?: string | undefined;
22
24
  description?: string | undefined;
25
+ name?: string | undefined;
26
+ key?: string | undefined;
23
27
  packageVersion?: string | undefined;
24
28
  bin?: string | undefined;
25
29
  binArgs?: string[] | undefined;
@@ -34,6 +38,85 @@ export declare const packageHandler: {
34
38
  required: boolean;
35
39
  };
36
40
  } | undefined;
41
+ tools?: {
42
+ [x: string]: never;
43
+ name: string;
44
+ inputSchema: {
45
+ [x: string]: never;
46
+ type: "object";
47
+ properties?: {
48
+ [x: string]: never;
49
+ } | undefined;
50
+ required?: string[] | undefined;
51
+ };
52
+ description?: string | undefined;
53
+ title?: string | undefined;
54
+ outputSchema?: {
55
+ [x: string]: never;
56
+ type: "object";
57
+ properties?: {
58
+ [x: string]: never;
59
+ } | undefined;
60
+ required?: string[] | undefined;
61
+ } | undefined;
62
+ annotations?: {
63
+ [x: string]: never;
64
+ title?: string | undefined;
65
+ readOnlyHint?: boolean | undefined;
66
+ destructiveHint?: boolean | undefined;
67
+ idempotentHint?: boolean | undefined;
68
+ openWorldHint?: boolean | undefined;
69
+ } | undefined;
70
+ _meta?: {
71
+ [x: string]: never;
72
+ } | undefined;
73
+ }[] | undefined;
37
74
  } | undefined;
38
- }, 200 | 404, "json">)>;
75
+ }, 200, "json">)>;
76
+ listTools: (c: Context) => Promise<(globalThis.Response & import("hono").TypedResponse<{
77
+ success: boolean;
78
+ code: number;
79
+ message: string;
80
+ }, 404, "json">) | (globalThis.Response & import("hono").TypedResponse<{
81
+ success: boolean;
82
+ code: number;
83
+ message: string;
84
+ }, 400, "json">) | (globalThis.Response & import("hono").TypedResponse<{
85
+ success: boolean;
86
+ code: number;
87
+ message: string;
88
+ data?: {
89
+ [x: string]: never;
90
+ name: string;
91
+ inputSchema: {
92
+ [x: string]: never;
93
+ type: "object";
94
+ properties?: {
95
+ [x: string]: never;
96
+ } | undefined;
97
+ required?: string[] | undefined;
98
+ };
99
+ description?: string | undefined;
100
+ title?: string | undefined;
101
+ outputSchema?: {
102
+ [x: string]: never;
103
+ type: "object";
104
+ properties?: {
105
+ [x: string]: never;
106
+ } | undefined;
107
+ required?: string[] | undefined;
108
+ } | undefined;
109
+ annotations?: {
110
+ [x: string]: never;
111
+ title?: string | undefined;
112
+ readOnlyHint?: boolean | undefined;
113
+ destructiveHint?: boolean | undefined;
114
+ idempotentHint?: boolean | undefined;
115
+ openWorldHint?: boolean | undefined;
116
+ } | undefined;
117
+ _meta?: {
118
+ [x: string]: never;
119
+ } | undefined;
120
+ }[] | undefined;
121
+ }, 200, "json">)>;
39
122
  };
@@ -1,20 +1,24 @@
1
1
  import { PackageSO } from './package-so';
2
+ import { createErrorResponse, createResponse } from '../utils';
2
3
  export const packageHandler = {
3
4
  executeTool: async (c) => {
4
5
  const requestBody = await c.req.json();
5
6
  try {
6
7
  const toolSO = new PackageSO();
7
8
  const result = await toolSO.executeTool(requestBody);
8
- const statusCode = result.success ? 200 : 500;
9
- return c.json(result, statusCode);
9
+ const response = createResponse(result);
10
+ return c.json(response, 200);
10
11
  }
11
12
  catch (error) {
12
- if (error instanceof Error && (error.message.includes('not found') || error.message.includes('Unknown tool'))) {
13
- return c.json({
14
- success: false,
15
- code: 404,
16
- message: `Package '${requestBody.packageName}' or tool '${requestBody.toolKey}' not found`,
17
- }, 404);
13
+ if (error instanceof Error) {
14
+ if (error.message.includes('not found')) {
15
+ const errorResponse = createErrorResponse(`Package '${requestBody.packageName}' not found`, 404);
16
+ return c.json(errorResponse, 404);
17
+ }
18
+ if (error.message.includes('Unknown tool')) {
19
+ const errorResponse = createErrorResponse(`Tool '${requestBody.toolKey}' not found in package '${requestBody.packageName}`, 404);
20
+ return c.json(errorResponse, 404);
21
+ }
18
22
  }
19
23
  // Other errors are still thrown
20
24
  throw error;
@@ -23,15 +27,41 @@ export const packageHandler = {
23
27
  getPackageDetail: async (c) => {
24
28
  const packageName = c.req.query('packageName');
25
29
  if (!packageName) {
26
- return c.json({
27
- success: false,
28
- code: 400,
29
- message: 'Missing packageName query parameter',
30
- }, 400);
31
- }
32
- const toolSO = new PackageSO();
33
- const result = await toolSO.getPackageDetail(packageName);
34
- const statusCode = result.success ? 200 : 404;
35
- return c.json(result, statusCode);
30
+ const errorResponse = createErrorResponse('Missing packageName query parameter', 400);
31
+ return c.json(errorResponse, 400);
32
+ }
33
+ try {
34
+ const toolSO = new PackageSO();
35
+ const result = await toolSO.getPackageDetail(packageName);
36
+ const response = createResponse(result);
37
+ return c.json(response, 200);
38
+ }
39
+ catch (error) {
40
+ if (error instanceof Error && error.message.includes('not found')) {
41
+ const errorResponse = createErrorResponse(`Package '${packageName}' not found`, 404);
42
+ return c.json(errorResponse, 404);
43
+ }
44
+ throw error;
45
+ }
46
+ },
47
+ listTools: async (c) => {
48
+ const packageName = c.req.query('packageName');
49
+ if (!packageName) {
50
+ const errorResponse = createErrorResponse('Missing packageName query parameter', 400);
51
+ return c.json(errorResponse, 400);
52
+ }
53
+ try {
54
+ const toolSO = new PackageSO();
55
+ const result = await toolSO.listTools(packageName);
56
+ const response = createResponse(result);
57
+ return c.json(response, 200);
58
+ }
59
+ catch (error) {
60
+ if (error instanceof Error && error.message.includes('not found')) {
61
+ const errorResponse = createErrorResponse(`Package '${packageName}' not found`, 404);
62
+ return c.json(errorResponse, 404);
63
+ }
64
+ throw error;
65
+ }
36
66
  },
37
67
  };
@@ -1,2 +1,2 @@
1
- import { Hono } from 'hono';
2
- export declare const packageRoutes: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
1
+ import { OpenAPIHono } from '@hono/zod-openapi';
2
+ export declare const packageRoutes: OpenAPIHono;
@@ -1,36 +1,72 @@
1
1
  /* eslint-disable @typescript-eslint/no-require-imports */
2
- import { Hono } from 'hono';
3
2
  import { packageHandler } from './package-handler';
4
- export const packageRoutes = new Hono();
5
- packageRoutes.post('/packages/run', packageHandler.executeTool);
6
- packageRoutes.get('/packages/detail', packageHandler.getPackageDetail);
7
- packageRoutes.get('/config/categories', (c) => {
8
- const categories = require('../../config/categories.mjs').default;
9
- const response = {
10
- success: true,
11
- code: 200,
12
- message: 'Categories retrieved successfully',
13
- data: categories,
14
- };
15
- return c.json(response);
16
- });
17
- packageRoutes.get('/config/featured', (c) => {
3
+ import { OpenAPIHono, createRoute } from '@hono/zod-openapi';
4
+ import { FeaturedResponseSchema, CategoriesResponseSchema, PackagesListResponseSchema, PackageDetailResponseSchema, ToolsResponseSchema, ToolExecuteSchema, ExecuteToolResponseSchema, packageNameQuerySchema, } from '../schema';
5
+ import { createResponse, createRouteResponses } from '../utils';
6
+ export const packageRoutes = new OpenAPIHono();
7
+ const featuredRoute = createRoute({
8
+ method: 'get',
9
+ path: '/config/featured',
10
+ responses: createRouteResponses(FeaturedResponseSchema),
11
+ });
12
+ packageRoutes.openapi(featuredRoute, (c) => {
18
13
  const featured = require('../../config/featured.mjs').default;
19
- const response = {
20
- success: true,
21
- code: 200,
22
- message: 'Featured list retrieved successfully',
23
- data: featured,
24
- };
25
- return c.json(response);
26
- });
27
- packageRoutes.get('/indexes/packages-list', async (c) => {
14
+ const response = createResponse(featured);
15
+ return c.json(response, 200);
16
+ });
17
+ const categoriesRoute = createRoute({
18
+ method: 'get',
19
+ path: '/config/categories',
20
+ responses: createRouteResponses(CategoriesResponseSchema),
21
+ });
22
+ packageRoutes.openapi(categoriesRoute, (c) => {
23
+ const categories = require('../../config/categories.mjs').default;
24
+ const response = createResponse(categories);
25
+ return c.json(response, 200);
26
+ });
27
+ const packagesListRoute = createRoute({
28
+ method: 'get',
29
+ path: '/indexes/packages-list',
30
+ responses: createRouteResponses(PackagesListResponseSchema),
31
+ });
32
+ packageRoutes.openapi(packagesListRoute, async (c) => {
28
33
  const packagesList = (await import('../../indexes/packages-list.json')).default;
29
- const response = {
30
- success: true,
31
- code: 200,
32
- message: 'Packages list retrieved successfully',
33
- data: packagesList,
34
- };
35
- return c.json(response);
34
+ const response = createResponse(packagesList);
35
+ return c.json(response, 200);
36
+ });
37
+ const packageDetailRoute = createRoute({
38
+ method: 'get',
39
+ path: '/packages/detail',
40
+ request: { query: packageNameQuerySchema },
41
+ responses: createRouteResponses(PackageDetailResponseSchema, {
42
+ includeErrorResponses: true,
43
+ }),
44
+ });
45
+ packageRoutes.openapi(packageDetailRoute, packageHandler.getPackageDetail);
46
+ const toolsRoute = createRoute({
47
+ method: 'get',
48
+ path: '/packages/tools',
49
+ request: { query: packageNameQuerySchema },
50
+ responses: createRouteResponses(ToolsResponseSchema, {
51
+ includeErrorResponses: true,
52
+ }),
53
+ });
54
+ packageRoutes.openapi(toolsRoute, packageHandler.listTools);
55
+ const executeToolRoute = createRoute({
56
+ method: 'post',
57
+ path: '/packages/run',
58
+ request: {
59
+ body: {
60
+ content: {
61
+ 'application/json': {
62
+ schema: ToolExecuteSchema,
63
+ },
64
+ },
65
+ required: true,
66
+ },
67
+ },
68
+ responses: createRouteResponses(ExecuteToolResponseSchema, {
69
+ includeErrorResponses: true,
70
+ }),
36
71
  });
72
+ packageRoutes.openapi(executeToolRoute, packageHandler.executeTool);
@@ -1,5 +1,7 @@
1
- import type { MCPServerPackageConfig, ToolExecute, Response } from '../types';
1
+ import type { MCPServerPackageConfig, ToolExecute } from '../types';
2
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
2
3
  export declare class PackageSO {
3
- executeTool(request: ToolExecute): Promise<Response<unknown>>;
4
- getPackageDetail(packageName: string): Promise<Response<MCPServerPackageConfig>>;
4
+ executeTool(request: ToolExecute): Promise<unknown>;
5
+ listTools(packageName: string): Promise<Tool[]>;
6
+ getPackageDetail(packageName: string): Promise<MCPServerPackageConfig>;
5
7
  }
@@ -11,12 +11,25 @@ export class PackageSO {
11
11
  arguments: request.inputData,
12
12
  });
13
13
  console.log(`Tool ${request.toolKey} executed successfully`);
14
- return {
15
- success: true,
16
- code: 200,
17
- message: 'Tool executed successfully',
18
- data: result,
19
- };
14
+ return result;
15
+ }
16
+ finally {
17
+ await closeConnection();
18
+ }
19
+ }
20
+ async listTools(packageName) {
21
+ const mcpServerConfig = getPackageConfigByKey(packageName);
22
+ const mockEnvs = {};
23
+ if (mcpServerConfig.env) {
24
+ Object.keys(mcpServerConfig.env).forEach((key) => {
25
+ mockEnvs[key] = 'mock_value';
26
+ });
27
+ }
28
+ const { client, closeConnection } = await getMcpClient(mcpServerConfig, mockEnvs);
29
+ try {
30
+ const { tools } = await client.listTools();
31
+ console.log(`Tools list retrieved successfully for package ${packageName}`);
32
+ return tools;
20
33
  }
21
34
  finally {
22
35
  await closeConnection();
@@ -25,20 +38,21 @@ export class PackageSO {
25
38
  async getPackageDetail(packageName) {
26
39
  const packageInfo = typedAllPackagesList[packageName];
27
40
  if (!packageInfo) {
28
- return {
29
- success: false,
30
- code: 404,
31
- message: `Package ${packageName} not found`,
32
- };
41
+ throw new Error(`Package ${packageName} not found`);
33
42
  }
34
43
  const jsonFilePath = path.join(__dirname, '../../packages/', packageInfo.path);
35
44
  const jsonStr = fs.readFileSync(jsonFilePath, 'utf-8');
36
45
  const packageConfig = JSON.parse(jsonStr);
37
- return {
38
- success: true,
39
- code: 200,
40
- message: 'Package detail retrieved successfully',
41
- data: packageConfig,
42
- };
46
+ let tools;
47
+ try {
48
+ tools = await this.listTools(packageName);
49
+ }
50
+ catch (error) {
51
+ console.warn(`Warn retrieving tools for package ${packageName}:`, error.message);
52
+ // if tools cannot be retrieved, set tools to undefined
53
+ tools = undefined;
54
+ }
55
+ const packageConfigWithTools = Object.assign(Object.assign({}, packageConfig), { tools });
56
+ return packageConfigWithTools;
43
57
  }
44
58
  }
@@ -11,8 +11,7 @@ describe('PackageSO - MCP Tool Execution Service Test', () => {
11
11
  envs: {},
12
12
  };
13
13
  const result = await toolSO.executeTool(request);
14
- expect(result.success).toBe(true);
15
- expect(result.data).toEqual({
14
+ expect(result).toEqual({
16
15
  content: [],
17
16
  message: 'Hello, Mike!',
18
17
  });
package/dist/helper.d.ts CHANGED
@@ -6,8 +6,8 @@ export declare const typedAllPackagesList: Record<string, {
6
6
  category?: string | undefined;
7
7
  validated?: boolean | undefined;
8
8
  tools?: Record<string, {
9
- name?: string | undefined;
10
9
  description?: string | undefined;
10
+ name?: string | undefined;
11
11
  }> | undefined;
12
12
  }>;
13
13
  export declare function getPackageConfigByKey(packageKey: string): MCPServerPackageConfig;
package/dist/helper.js CHANGED
@@ -76,8 +76,10 @@ export function updatePackageJsonDependencies({ packageDeps, enableValidation =
76
76
  const newDeps = {
77
77
  '@modelcontextprotocol/sdk': '^1.12.0',
78
78
  '@hono/node-server': '1.15.0',
79
+ '@hono/swagger-ui': '^0.5.2',
80
+ '@hono/zod-openapi': '^0.16.4',
79
81
  lodash: '^4.17.21',
80
- zod: '^3.23.30',
82
+ zod: '^3.25.67',
81
83
  axios: '^1.9.0',
82
84
  hono: '4.8.3',
83
85
  semver: '^7.5.4',