@yirifi-org/mcp-server 1.2.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/LICENSE +21 -0
- package/README.md +809 -0
- package/dist/client.d.ts +73 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +116 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +99 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +105 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/server-core.d.ts +73 -0
- package/dist/server-core.d.ts.map +1 -0
- package/dist/server-core.js +189 -0
- package/dist/server-core.js.map +1 -0
- package/dist/server-http.d.ts +17 -0
- package/dist/server-http.d.ts.map +1 -0
- package/dist/server-http.js +87 -0
- package/dist/server-http.js.map +1 -0
- package/dist/server-stdio.d.ts +13 -0
- package/dist/server-stdio.d.ts.map +1 -0
- package/dist/server-stdio.js +43 -0
- package/dist/server-stdio.js.map +1 -0
- package/dist/tools/executor.d.ts +24 -0
- package/dist/tools/executor.d.ts.map +1 -0
- package/dist/tools/executor.js +220 -0
- package/dist/tools/executor.js.map +1 -0
- package/dist/tools/filter.d.ts +82 -0
- package/dist/tools/filter.d.ts.map +1 -0
- package/dist/tools/filter.js +176 -0
- package/dist/tools/filter.js.map +1 -0
- package/dist/tools/generator.d.ts +45 -0
- package/dist/tools/generator.d.ts.map +1 -0
- package/dist/tools/generator.js +97 -0
- package/dist/tools/generator.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool filtering and defer loading utility for MCP server.
|
|
3
|
+
* Allows filtering tools via YIRIFI_TOOLS environment variable.
|
|
4
|
+
* Supports defer_loading for on-demand tool discovery to reduce token usage.
|
|
5
|
+
*/
|
|
6
|
+
import type { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Extended Tool type that supports defer_loading for on-demand tool discovery.
|
|
9
|
+
*
|
|
10
|
+
* When `defer_loading: true`, the tool is excluded from initial context but can
|
|
11
|
+
* still be discovered by Claude's Tool Search Tool. This reduces token usage
|
|
12
|
+
* by ~85% while maintaining access to the full tool library.
|
|
13
|
+
*
|
|
14
|
+
* @see https://www.anthropic.com/engineering/advanced-tool-use
|
|
15
|
+
*/
|
|
16
|
+
export interface DeferredTool extends Tool {
|
|
17
|
+
/** When true, tool is excluded from initial context but discoverable on-demand */
|
|
18
|
+
defer_loading?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Set the tool categories map for filtering.
|
|
22
|
+
* Called during server startup after tools are generated.
|
|
23
|
+
*/
|
|
24
|
+
export declare function setToolCategories(categories: Record<string, {
|
|
25
|
+
service: string;
|
|
26
|
+
category: string;
|
|
27
|
+
}>): void;
|
|
28
|
+
/**
|
|
29
|
+
* Filter tools based on YIRIFI_TOOLS patterns.
|
|
30
|
+
*
|
|
31
|
+
* @param tools - Array of all available tools
|
|
32
|
+
* @param patternsString - Comma-separated whitelist patterns (from YIRIFI_TOOLS env var)
|
|
33
|
+
* @returns Filtered array of tools matching at least one pattern
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* // Return all tools (no filtering)
|
|
37
|
+
* filterTools(tools, undefined)
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* // Return only RegDB tools
|
|
41
|
+
* filterTools(tools, "regdb:*")
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* // Return specific categories
|
|
45
|
+
* filterTools(tools, "regdb:countries:*,web3grc:knowledge:*")
|
|
46
|
+
*/
|
|
47
|
+
export declare function filterTools(tools: DeferredTool[], patternsString: string | undefined): DeferredTool[];
|
|
48
|
+
/**
|
|
49
|
+
* Apply defer_loading flag to tools matching the specified patterns.
|
|
50
|
+
*
|
|
51
|
+
* Tools marked with `defer_loading: true` are excluded from initial context
|
|
52
|
+
* but can still be discovered on-demand by Claude's Tool Search Tool.
|
|
53
|
+
* This significantly reduces token usage (~85% reduction) while maintaining
|
|
54
|
+
* full access to the tool library.
|
|
55
|
+
*
|
|
56
|
+
* @param tools - Array of tools to process
|
|
57
|
+
* @param patternsString - Comma-separated patterns for tools to defer (from YIRIFI_DEFER_TOOLS)
|
|
58
|
+
* @returns Array of tools with defer_loading applied to matching tools
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* // Defer all marketplace tools
|
|
62
|
+
* applyDeferLoading(tools, "web3grc:marketplace:*")
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* // Defer multiple categories
|
|
66
|
+
* applyDeferLoading(tools, "regdb:articles:*,web3grc:common:*")
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* // Defer all tools except those explicitly needed
|
|
70
|
+
* // (combine with YIRIFI_TOOLS to whitelist immediate tools)
|
|
71
|
+
* applyDeferLoading(tools, "regdb:*,web3grc:*")
|
|
72
|
+
*
|
|
73
|
+
* @see https://www.anthropic.com/engineering/advanced-tool-use
|
|
74
|
+
*/
|
|
75
|
+
export declare function applyDeferLoading(tools: DeferredTool[], patternsString: string | undefined): DeferredTool[];
|
|
76
|
+
/**
|
|
77
|
+
* Get all available tool categories for documentation/help.
|
|
78
|
+
*
|
|
79
|
+
* @returns Object with service -> categories mapping
|
|
80
|
+
*/
|
|
81
|
+
export declare function getAvailableCategories(): Record<string, string[]>;
|
|
82
|
+
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/tools/filter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE/D;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAa,SAAQ,IAAI;IACxC,kFAAkF;IAClF,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,GAChE,IAAI,CAEN;AA2DD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,YAAY,EAAE,EACrB,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,YAAY,EAAE,CA8BhB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,EAAE,EACrB,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,YAAY,EAAE,CA+BhB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAWjE"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool filtering and defer loading utility for MCP server.
|
|
3
|
+
* Allows filtering tools via YIRIFI_TOOLS environment variable.
|
|
4
|
+
* Supports defer_loading for on-demand tool discovery to reduce token usage.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Tool category mapping - dynamically populated from generated tools.
|
|
8
|
+
* Set via setToolCategories() during server startup.
|
|
9
|
+
*/
|
|
10
|
+
let TOOL_CATEGORIES = {};
|
|
11
|
+
/**
|
|
12
|
+
* Set the tool categories map for filtering.
|
|
13
|
+
* Called during server startup after tools are generated.
|
|
14
|
+
*/
|
|
15
|
+
export function setToolCategories(categories) {
|
|
16
|
+
TOOL_CATEGORIES = categories;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if a tool name matches a given pattern.
|
|
20
|
+
*
|
|
21
|
+
* Supported patterns:
|
|
22
|
+
* - Service wildcard: "regdb:*" (all tools from regdb service)
|
|
23
|
+
* - Category wildcard: "web3grc:knowledge:*" (all knowledge tools)
|
|
24
|
+
* - Exact match: tool name (less common with swagger-based generation)
|
|
25
|
+
*
|
|
26
|
+
* @param toolName - The tool name to check
|
|
27
|
+
* @param pattern - The pattern to match against
|
|
28
|
+
* @returns true if the tool matches the pattern
|
|
29
|
+
*/
|
|
30
|
+
function matchesPattern(toolName, pattern) {
|
|
31
|
+
// Exact match
|
|
32
|
+
if (pattern === toolName) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
// Wildcard patterns use colon separator
|
|
36
|
+
if (!pattern.includes(":")) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
const parts = pattern.split(":");
|
|
40
|
+
const toolInfo = TOOL_CATEGORIES[toolName];
|
|
41
|
+
// Unknown tool - can't match patterns
|
|
42
|
+
if (!toolInfo) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
// Service wildcard: "regdb:*" or "web3grc:*"
|
|
46
|
+
if (parts.length === 2 && parts[1] === "*") {
|
|
47
|
+
return toolInfo.service === parts[0];
|
|
48
|
+
}
|
|
49
|
+
// Category wildcard: "regdb:countries:*" or "web3grc:knowledge:*"
|
|
50
|
+
if (parts.length === 3 && parts[2] === "*") {
|
|
51
|
+
return toolInfo.service === parts[0] && toolInfo.category === parts[1];
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parse comma-separated patterns string into array.
|
|
57
|
+
*
|
|
58
|
+
* @param patternsString - Comma-separated patterns (e.g., "regdb:*,web3grc:knowledge:*")
|
|
59
|
+
* @returns Array of trimmed patterns
|
|
60
|
+
*/
|
|
61
|
+
function parsePatterns(patternsString) {
|
|
62
|
+
return patternsString
|
|
63
|
+
.split(",")
|
|
64
|
+
.map((p) => p.trim())
|
|
65
|
+
.filter((p) => p.length > 0);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Filter tools based on YIRIFI_TOOLS patterns.
|
|
69
|
+
*
|
|
70
|
+
* @param tools - Array of all available tools
|
|
71
|
+
* @param patternsString - Comma-separated whitelist patterns (from YIRIFI_TOOLS env var)
|
|
72
|
+
* @returns Filtered array of tools matching at least one pattern
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* // Return all tools (no filtering)
|
|
76
|
+
* filterTools(tools, undefined)
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* // Return only RegDB tools
|
|
80
|
+
* filterTools(tools, "regdb:*")
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* // Return specific categories
|
|
84
|
+
* filterTools(tools, "regdb:countries:*,web3grc:knowledge:*")
|
|
85
|
+
*/
|
|
86
|
+
export function filterTools(tools, patternsString) {
|
|
87
|
+
// No filtering if patterns not specified or empty
|
|
88
|
+
if (!patternsString || patternsString.trim() === "") {
|
|
89
|
+
return tools;
|
|
90
|
+
}
|
|
91
|
+
const patterns = parsePatterns(patternsString);
|
|
92
|
+
if (patterns.length === 0) {
|
|
93
|
+
return tools;
|
|
94
|
+
}
|
|
95
|
+
const filtered = tools.filter((tool) => patterns.some((pattern) => matchesPattern(tool.name, pattern)));
|
|
96
|
+
// Log warnings for patterns that didn't match any tools
|
|
97
|
+
const matchedToolNames = new Set(filtered.map((t) => t.name));
|
|
98
|
+
for (const pattern of patterns) {
|
|
99
|
+
// Skip wildcards for this check
|
|
100
|
+
if (pattern.includes("*")) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
// Check if exact tool name exists
|
|
104
|
+
if (!matchedToolNames.has(pattern) && !TOOL_CATEGORIES[pattern]) {
|
|
105
|
+
console.error(`Warning: Unknown tool in YIRIFI_TOOLS: "${pattern}"`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return filtered;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Apply defer_loading flag to tools matching the specified patterns.
|
|
112
|
+
*
|
|
113
|
+
* Tools marked with `defer_loading: true` are excluded from initial context
|
|
114
|
+
* but can still be discovered on-demand by Claude's Tool Search Tool.
|
|
115
|
+
* This significantly reduces token usage (~85% reduction) while maintaining
|
|
116
|
+
* full access to the tool library.
|
|
117
|
+
*
|
|
118
|
+
* @param tools - Array of tools to process
|
|
119
|
+
* @param patternsString - Comma-separated patterns for tools to defer (from YIRIFI_DEFER_TOOLS)
|
|
120
|
+
* @returns Array of tools with defer_loading applied to matching tools
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* // Defer all marketplace tools
|
|
124
|
+
* applyDeferLoading(tools, "web3grc:marketplace:*")
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* // Defer multiple categories
|
|
128
|
+
* applyDeferLoading(tools, "regdb:articles:*,web3grc:common:*")
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* // Defer all tools except those explicitly needed
|
|
132
|
+
* // (combine with YIRIFI_TOOLS to whitelist immediate tools)
|
|
133
|
+
* applyDeferLoading(tools, "regdb:*,web3grc:*")
|
|
134
|
+
*
|
|
135
|
+
* @see https://www.anthropic.com/engineering/advanced-tool-use
|
|
136
|
+
*/
|
|
137
|
+
export function applyDeferLoading(tools, patternsString) {
|
|
138
|
+
// No defer loading if patterns not specified or empty
|
|
139
|
+
if (!patternsString || patternsString.trim() === "") {
|
|
140
|
+
return tools;
|
|
141
|
+
}
|
|
142
|
+
const patterns = parsePatterns(patternsString);
|
|
143
|
+
if (patterns.length === 0) {
|
|
144
|
+
return tools;
|
|
145
|
+
}
|
|
146
|
+
// Count how many tools will be deferred for logging
|
|
147
|
+
let deferredCount = 0;
|
|
148
|
+
const result = tools.map((tool) => {
|
|
149
|
+
const shouldDefer = patterns.some((pattern) => matchesPattern(tool.name, pattern));
|
|
150
|
+
if (shouldDefer) {
|
|
151
|
+
deferredCount++;
|
|
152
|
+
return { ...tool, defer_loading: true };
|
|
153
|
+
}
|
|
154
|
+
return tool;
|
|
155
|
+
});
|
|
156
|
+
if (deferredCount > 0) {
|
|
157
|
+
console.error(`Defer loading applied: ${deferredCount}/${tools.length} tools marked for deferred loading`);
|
|
158
|
+
}
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get all available tool categories for documentation/help.
|
|
163
|
+
*
|
|
164
|
+
* @returns Object with service -> categories mapping
|
|
165
|
+
*/
|
|
166
|
+
export function getAvailableCategories() {
|
|
167
|
+
const categories = {};
|
|
168
|
+
for (const { service, category } of Object.values(TOOL_CATEGORIES)) {
|
|
169
|
+
if (!categories[service]) {
|
|
170
|
+
categories[service] = new Set();
|
|
171
|
+
}
|
|
172
|
+
categories[service].add(category);
|
|
173
|
+
}
|
|
174
|
+
return Object.fromEntries(Object.entries(categories).map(([k, v]) => [k, Array.from(v)]));
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/tools/filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI-based tool generator.
|
|
3
|
+
* Fetches swagger specs and generates MCP tools dynamically.
|
|
4
|
+
*
|
|
5
|
+
* Tool names are derived from swagger operationId with service prefix:
|
|
6
|
+
* operationId: "list_categories" → tool name: "web3grc_list_categories"
|
|
7
|
+
*/
|
|
8
|
+
import { type McpToolDefinition } from "openapi-mcp-generator";
|
|
9
|
+
import type { DeferredTool } from "./filter.js";
|
|
10
|
+
/**
|
|
11
|
+
* Extended tool definition that includes execution metadata.
|
|
12
|
+
* Combines DeferredTool properties with generator-specific metadata.
|
|
13
|
+
*/
|
|
14
|
+
export interface GeneratedTool {
|
|
15
|
+
/** Tool name */
|
|
16
|
+
name: string;
|
|
17
|
+
/** Tool description */
|
|
18
|
+
description?: string;
|
|
19
|
+
/** JSON Schema for input parameters */
|
|
20
|
+
inputSchema: DeferredTool["inputSchema"];
|
|
21
|
+
/** When true, tool is excluded from initial context */
|
|
22
|
+
defer_loading?: boolean;
|
|
23
|
+
/** Original tool definition from openapi-mcp-generator */
|
|
24
|
+
_meta: McpToolDefinition;
|
|
25
|
+
/** Category information for filtering */
|
|
26
|
+
_category?: {
|
|
27
|
+
service: string;
|
|
28
|
+
category: string;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Build tool categories map for filtering support.
|
|
33
|
+
*/
|
|
34
|
+
export declare function buildToolCategories(tools: GeneratedTool[]): Record<string, {
|
|
35
|
+
service: string;
|
|
36
|
+
category: string;
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* Generate all MCP tools from swagger specifications.
|
|
40
|
+
*
|
|
41
|
+
* @param baseUrl - Base URL for the Yirifi API (e.g., https://dev-api.yirifi.ai)
|
|
42
|
+
* @returns Array of generated tools with execution metadata
|
|
43
|
+
*/
|
|
44
|
+
export declare function generateToolsFromSwagger(baseUrl: string): Promise<GeneratedTool[]>;
|
|
45
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/tools/generator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,iBAAiB,EAAuB,MAAM,uBAAuB,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAehD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,WAAW,EAAE,YAAY,CAAC,aAAa,CAAC,CAAC;IACzC,uDAAuD;IACvD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0DAA0D;IAC1D,KAAK,EAAE,iBAAiB,CAAC;IACzB,yCAAyC;IACzC,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD;AAqDD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,aAAa,EAAE,GACrB,MAAM,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAWvD;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA0BxF"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI-based tool generator.
|
|
3
|
+
* Fetches swagger specs and generates MCP tools dynamically.
|
|
4
|
+
*
|
|
5
|
+
* Tool names are derived from swagger operationId with service prefix:
|
|
6
|
+
* operationId: "list_categories" → tool name: "web3grc_list_categories"
|
|
7
|
+
*/
|
|
8
|
+
import { getToolsFromOpenApi } from "openapi-mcp-generator";
|
|
9
|
+
const SERVICES = [
|
|
10
|
+
{ name: "web3grc", swaggerPath: "/web3grc/external-swagger-auto.json" },
|
|
11
|
+
{ name: "regdb", swaggerPath: "/regdb/external-swagger-auto.json" },
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Infer category from tool path for filtering support.
|
|
15
|
+
*/
|
|
16
|
+
function inferCategory(pathTemplate, service) {
|
|
17
|
+
if (service === "regdb") {
|
|
18
|
+
if (pathTemplate.includes("/country"))
|
|
19
|
+
return "countries";
|
|
20
|
+
if (pathTemplate.includes("/articles"))
|
|
21
|
+
return "articles";
|
|
22
|
+
if (pathTemplate.includes("/organization"))
|
|
23
|
+
return "organizations";
|
|
24
|
+
return "other";
|
|
25
|
+
}
|
|
26
|
+
// web3grc
|
|
27
|
+
if (pathTemplate.includes("/knowledge/"))
|
|
28
|
+
return "knowledge";
|
|
29
|
+
if (pathTemplate.includes("/marketplace/"))
|
|
30
|
+
return "marketplace";
|
|
31
|
+
if (pathTemplate.includes("/common/"))
|
|
32
|
+
return "common";
|
|
33
|
+
return "other";
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Generate tools from a single swagger spec.
|
|
37
|
+
*/
|
|
38
|
+
async function generateToolsFromSpec(baseUrl, config) {
|
|
39
|
+
const specUrl = `${baseUrl}${config.swaggerPath}`;
|
|
40
|
+
console.error(`Fetching swagger spec: ${specUrl}`);
|
|
41
|
+
const mcpTools = await getToolsFromOpenApi(specUrl, {
|
|
42
|
+
baseUrl,
|
|
43
|
+
dereference: true,
|
|
44
|
+
});
|
|
45
|
+
console.error(`Generated ${mcpTools.length} tools from ${config.name} spec`);
|
|
46
|
+
return mcpTools.map((tool) => {
|
|
47
|
+
// Tool name = service prefix + operationId from swagger
|
|
48
|
+
const name = `${config.name}_${tool.operationId}`;
|
|
49
|
+
const category = inferCategory(tool.pathTemplate, config.name);
|
|
50
|
+
return {
|
|
51
|
+
name,
|
|
52
|
+
description: tool.description || `${tool.method.toUpperCase()} ${tool.pathTemplate}`,
|
|
53
|
+
inputSchema: tool.inputSchema,
|
|
54
|
+
_meta: tool,
|
|
55
|
+
_category: { service: config.name, category },
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Build tool categories map for filtering support.
|
|
61
|
+
*/
|
|
62
|
+
export function buildToolCategories(tools) {
|
|
63
|
+
const categories = {};
|
|
64
|
+
for (const tool of tools) {
|
|
65
|
+
const meta = tool;
|
|
66
|
+
if (meta._category) {
|
|
67
|
+
categories[tool.name] = meta._category;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return categories;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Generate all MCP tools from swagger specifications.
|
|
74
|
+
*
|
|
75
|
+
* @param baseUrl - Base URL for the Yirifi API (e.g., https://dev-api.yirifi.ai)
|
|
76
|
+
* @returns Array of generated tools with execution metadata
|
|
77
|
+
*/
|
|
78
|
+
export async function generateToolsFromSwagger(baseUrl) {
|
|
79
|
+
console.error("Generating tools from swagger specifications...");
|
|
80
|
+
const results = await Promise.all(SERVICES.map((config) => generateToolsFromSpec(baseUrl, config)));
|
|
81
|
+
const allTools = results.flat();
|
|
82
|
+
// Check for duplicate tool names
|
|
83
|
+
const names = new Set();
|
|
84
|
+
const duplicates = [];
|
|
85
|
+
for (const tool of allTools) {
|
|
86
|
+
if (names.has(tool.name)) {
|
|
87
|
+
duplicates.push(tool.name);
|
|
88
|
+
}
|
|
89
|
+
names.add(tool.name);
|
|
90
|
+
}
|
|
91
|
+
if (duplicates.length > 0) {
|
|
92
|
+
console.error(`Warning: Duplicate tool names detected: ${duplicates.join(", ")}`);
|
|
93
|
+
}
|
|
94
|
+
console.error(`Total tools generated: ${allTools.length}`);
|
|
95
|
+
return allTools;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/tools/generator.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@yirifi-org/mcp-server",
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "MCP server for Yirifi GRC Platform external APIs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"yirifi-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/yirifi/yirifi-external-api-mcp.git"
|
|
20
|
+
},
|
|
21
|
+
"homepage": "https://github.com/yirifi/yirifi-external-api-mcp#readme",
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/yirifi/yirifi-external-api-mcp/issues"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"prepare": "npm run build",
|
|
27
|
+
"dev": "tsx watch src/server-stdio.ts",
|
|
28
|
+
"dev:http": "tsx watch src/server-http.ts",
|
|
29
|
+
"build": "tsc",
|
|
30
|
+
"start": "node dist/server-stdio.js",
|
|
31
|
+
"start:http": "node dist/server-http.js",
|
|
32
|
+
"typecheck": "tsc --noEmit",
|
|
33
|
+
"lint": "biome check .",
|
|
34
|
+
"format": "biome format --write .",
|
|
35
|
+
"test": "vitest"
|
|
36
|
+
},
|
|
37
|
+
"keywords": [
|
|
38
|
+
"mcp",
|
|
39
|
+
"yirifi",
|
|
40
|
+
"grc",
|
|
41
|
+
"compliance",
|
|
42
|
+
"regulations"
|
|
43
|
+
],
|
|
44
|
+
"author": "Yirifi Team",
|
|
45
|
+
"license": "MIT",
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@modelcontextprotocol/sdk": "^1.25.0",
|
|
48
|
+
"axios": "^1.7.9",
|
|
49
|
+
"dotenv": "^16.4.7",
|
|
50
|
+
"express": "^5.2.1",
|
|
51
|
+
"openapi-mcp-generator": "^3.2.0",
|
|
52
|
+
"zod": "^3.24.1",
|
|
53
|
+
"zod-to-json-schema": "^3.24.1"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@biomejs/biome": "^1.9.4",
|
|
57
|
+
"@types/express": "^5.0.6",
|
|
58
|
+
"@types/node": "^22.10.2",
|
|
59
|
+
"tsx": "^4.19.2",
|
|
60
|
+
"typescript": "^5.7.2",
|
|
61
|
+
"vitest": "^2.1.8"
|
|
62
|
+
},
|
|
63
|
+
"engines": {
|
|
64
|
+
"node": ">=18.0.0"
|
|
65
|
+
}
|
|
66
|
+
}
|