@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.
@@ -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
+ }