@inkog-io/mcp 1.0.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 (55) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +265 -0
  3. package/dist/api/client.d.ts +108 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +288 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/api/types.d.ts +286 -0
  8. package/dist/api/types.d.ts.map +1 -0
  9. package/dist/api/types.js +21 -0
  10. package/dist/api/types.js.map +1 -0
  11. package/dist/config.d.ts +68 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +130 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/index.d.ts +19 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +203 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/tools/audit-a2a.d.ts +20 -0
  20. package/dist/tools/audit-a2a.d.ts.map +1 -0
  21. package/dist/tools/audit-a2a.js +382 -0
  22. package/dist/tools/audit-a2a.js.map +1 -0
  23. package/dist/tools/audit-mcp.d.ts +16 -0
  24. package/dist/tools/audit-mcp.d.ts.map +1 -0
  25. package/dist/tools/audit-mcp.js +259 -0
  26. package/dist/tools/audit-mcp.js.map +1 -0
  27. package/dist/tools/compliance.d.ts +14 -0
  28. package/dist/tools/compliance.d.ts.map +1 -0
  29. package/dist/tools/compliance.js +255 -0
  30. package/dist/tools/compliance.js.map +1 -0
  31. package/dist/tools/explain.d.ts +14 -0
  32. package/dist/tools/explain.d.ts.map +1 -0
  33. package/dist/tools/explain.js +202 -0
  34. package/dist/tools/explain.js.map +1 -0
  35. package/dist/tools/governance.d.ts +16 -0
  36. package/dist/tools/governance.d.ts.map +1 -0
  37. package/dist/tools/governance.js +200 -0
  38. package/dist/tools/governance.js.map +1 -0
  39. package/dist/tools/index.d.ts +50 -0
  40. package/dist/tools/index.d.ts.map +1 -0
  41. package/dist/tools/index.js +94 -0
  42. package/dist/tools/index.js.map +1 -0
  43. package/dist/tools/mlbom.d.ts +18 -0
  44. package/dist/tools/mlbom.d.ts.map +1 -0
  45. package/dist/tools/mlbom.js +344 -0
  46. package/dist/tools/mlbom.js.map +1 -0
  47. package/dist/tools/scan.d.ts +15 -0
  48. package/dist/tools/scan.d.ts.map +1 -0
  49. package/dist/tools/scan.js +270 -0
  50. package/dist/tools/scan.js.map +1 -0
  51. package/dist/utils/file-reader.d.ts +55 -0
  52. package/dist/utils/file-reader.d.ts.map +1 -0
  53. package/dist/utils/file-reader.js +269 -0
  54. package/dist/utils/file-reader.js.map +1 -0
  55. package/package.json +64 -0
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Inkog MCP Server Configuration
3
+ *
4
+ * All configuration is externalized - no hardcoded values.
5
+ * Uses environment variables with sensible defaults.
6
+ */
7
+ import { z } from 'zod';
8
+ /**
9
+ * Configuration schema with validation
10
+ */
11
+ declare const ConfigSchema: z.ZodObject<{
12
+ apiBaseUrl: z.ZodDefault<z.ZodString>;
13
+ apiVersion: z.ZodDefault<z.ZodString>;
14
+ apiTimeout: z.ZodDefault<z.ZodNumber>;
15
+ apiRetryAttempts: z.ZodDefault<z.ZodNumber>;
16
+ apiRetryDelay: z.ZodDefault<z.ZodNumber>;
17
+ serverName: z.ZodDefault<z.ZodString>;
18
+ serverVersion: z.ZodDefault<z.ZodString>;
19
+ enableMcpAudit: z.ZodDefault<z.ZodBoolean>;
20
+ enableMlbom: z.ZodDefault<z.ZodBoolean>;
21
+ enableA2a: z.ZodDefault<z.ZodBoolean>;
22
+ logLevel: z.ZodDefault<z.ZodEnum<["debug", "info", "warn", "error"]>>;
23
+ logFormat: z.ZodDefault<z.ZodEnum<["json", "text"]>>;
24
+ }, "strip", z.ZodTypeAny, {
25
+ apiBaseUrl: string;
26
+ apiVersion: string;
27
+ apiTimeout: number;
28
+ apiRetryAttempts: number;
29
+ apiRetryDelay: number;
30
+ serverName: string;
31
+ serverVersion: string;
32
+ enableMcpAudit: boolean;
33
+ enableMlbom: boolean;
34
+ enableA2a: boolean;
35
+ logLevel: "debug" | "info" | "warn" | "error";
36
+ logFormat: "json" | "text";
37
+ }, {
38
+ apiBaseUrl?: string | undefined;
39
+ apiVersion?: string | undefined;
40
+ apiTimeout?: number | undefined;
41
+ apiRetryAttempts?: number | undefined;
42
+ apiRetryDelay?: number | undefined;
43
+ serverName?: string | undefined;
44
+ serverVersion?: string | undefined;
45
+ enableMcpAudit?: boolean | undefined;
46
+ enableMlbom?: boolean | undefined;
47
+ enableA2a?: boolean | undefined;
48
+ logLevel?: "debug" | "info" | "warn" | "error" | undefined;
49
+ logFormat?: "json" | "text" | undefined;
50
+ }>;
51
+ export type Config = z.infer<typeof ConfigSchema>;
52
+ /**
53
+ * Create configuration with defaults and environment overrides
54
+ */
55
+ export declare function createConfig(overrides?: Partial<Config>): Config;
56
+ /**
57
+ * Get the API key from environment
58
+ * Returns undefined if not set (API client will handle the error)
59
+ */
60
+ export declare function getApiKey(): string | undefined;
61
+ /**
62
+ * Build full API endpoint URL
63
+ */
64
+ export declare function buildApiUrl(config: Config, path: string): string;
65
+ export declare function getConfig(): Config;
66
+ export declare function resetConfig(): void;
67
+ export {};
68
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBhB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAgFlD;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAWhE;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,GAAG,SAAS,CAE9C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKhE;AAOD,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
package/dist/config.js ADDED
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Inkog MCP Server Configuration
3
+ *
4
+ * All configuration is externalized - no hardcoded values.
5
+ * Uses environment variables with sensible defaults.
6
+ */
7
+ import { z } from 'zod';
8
+ /**
9
+ * Configuration schema with validation
10
+ */
11
+ const ConfigSchema = z.object({
12
+ // API Configuration
13
+ apiBaseUrl: z.string().url().default('https://api.inkog.io'),
14
+ apiVersion: z.string().default('v1'),
15
+ apiTimeout: z.number().positive().default(30000),
16
+ apiRetryAttempts: z.number().int().min(0).max(10).default(3),
17
+ apiRetryDelay: z.number().positive().default(1000),
18
+ // MCP Server Configuration
19
+ serverName: z.string().default('inkog'),
20
+ serverVersion: z.string().default('1.0.0'),
21
+ // Feature Flags
22
+ enableMcpAudit: z.boolean().default(true),
23
+ enableMlbom: z.boolean().default(true),
24
+ enableA2a: z.boolean().default(true),
25
+ // Logging
26
+ logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
27
+ logFormat: z.enum(['json', 'text']).default('json'),
28
+ });
29
+ /**
30
+ * Load configuration from environment variables
31
+ */
32
+ function loadFromEnvironment() {
33
+ const config = {};
34
+ const apiUrl = process.env.INKOG_API_URL;
35
+ if (apiUrl !== undefined) {
36
+ config.apiBaseUrl = apiUrl;
37
+ }
38
+ const apiVersion = process.env.INKOG_API_VERSION;
39
+ if (apiVersion !== undefined) {
40
+ config.apiVersion = apiVersion;
41
+ }
42
+ const apiTimeout = process.env.INKOG_API_TIMEOUT;
43
+ if (apiTimeout !== undefined) {
44
+ config.apiTimeout = parseInt(apiTimeout, 10);
45
+ }
46
+ const retryAttempts = process.env.INKOG_API_RETRY_ATTEMPTS;
47
+ if (retryAttempts !== undefined) {
48
+ config.apiRetryAttempts = parseInt(retryAttempts, 10);
49
+ }
50
+ const retryDelay = process.env.INKOG_API_RETRY_DELAY;
51
+ if (retryDelay !== undefined) {
52
+ config.apiRetryDelay = parseInt(retryDelay, 10);
53
+ }
54
+ const serverName = process.env.INKOG_SERVER_NAME;
55
+ if (serverName !== undefined) {
56
+ config.serverName = serverName;
57
+ }
58
+ const serverVersion = process.env.INKOG_SERVER_VERSION;
59
+ if (serverVersion !== undefined) {
60
+ config.serverVersion = serverVersion;
61
+ }
62
+ const enableMcpAudit = process.env.INKOG_ENABLE_MCP_AUDIT;
63
+ if (enableMcpAudit !== undefined) {
64
+ config.enableMcpAudit = enableMcpAudit === 'true';
65
+ }
66
+ const enableMlbom = process.env.INKOG_ENABLE_MLBOM;
67
+ if (enableMlbom !== undefined) {
68
+ config.enableMlbom = enableMlbom === 'true';
69
+ }
70
+ const enableA2a = process.env.INKOG_ENABLE_A2A;
71
+ if (enableA2a !== undefined) {
72
+ config.enableA2a = enableA2a === 'true';
73
+ }
74
+ const logLevel = process.env.INKOG_LOG_LEVEL;
75
+ if (logLevel !== undefined) {
76
+ config.logLevel = logLevel;
77
+ }
78
+ const logFormat = process.env.INKOG_LOG_FORMAT;
79
+ if (logFormat !== undefined) {
80
+ config.logFormat = logFormat;
81
+ }
82
+ return config;
83
+ }
84
+ /**
85
+ * Remove undefined values from object
86
+ */
87
+ function filterDefined(obj) {
88
+ return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined));
89
+ }
90
+ /**
91
+ * Create configuration with defaults and environment overrides
92
+ */
93
+ export function createConfig(overrides) {
94
+ const envConfig = loadFromEnvironment();
95
+ const overrideConfig = overrides !== undefined ? filterDefined(overrides) : {};
96
+ const merged = { ...envConfig, ...overrideConfig };
97
+ const result = ConfigSchema.safeParse(merged);
98
+ if (!result.success) {
99
+ throw new Error(`Invalid configuration: ${result.error.message}`);
100
+ }
101
+ return result.data;
102
+ }
103
+ /**
104
+ * Get the API key from environment
105
+ * Returns undefined if not set (API client will handle the error)
106
+ */
107
+ export function getApiKey() {
108
+ return process.env.INKOG_API_KEY;
109
+ }
110
+ /**
111
+ * Build full API endpoint URL
112
+ */
113
+ export function buildApiUrl(config, path) {
114
+ const baseUrl = config.apiBaseUrl.replace(/\/$/, '');
115
+ const version = config.apiVersion;
116
+ const cleanPath = path.replace(/^\//, '');
117
+ return `${baseUrl}/${version}/${cleanPath}`;
118
+ }
119
+ /**
120
+ * Default configuration singleton
121
+ */
122
+ let defaultConfig = null;
123
+ export function getConfig() {
124
+ defaultConfig ??= createConfig();
125
+ return defaultConfig;
126
+ }
127
+ export function resetConfig() {
128
+ defaultConfig = null;
129
+ }
130
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Inkog MCP Server
4
+ *
5
+ * AI Security Platform for the Agentic Era
6
+ *
7
+ * This MCP server provides AI agent security capabilities:
8
+ * - Vulnerability scanning (prompt injection, infinite loops, token bombing)
9
+ * - AGENTS.md governance verification
10
+ * - Compliance reporting (EU AI Act, NIST, OWASP)
11
+ * - MCP server security auditing
12
+ * - ML Bill of Materials (MLBOM) generation
13
+ * - Agent-to-Agent communication security
14
+ *
15
+ * @author Inkog.io
16
+ * @license Apache-2.0
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG"}
package/dist/index.js ADDED
@@ -0,0 +1,203 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Inkog MCP Server
4
+ *
5
+ * AI Security Platform for the Agentic Era
6
+ *
7
+ * This MCP server provides AI agent security capabilities:
8
+ * - Vulnerability scanning (prompt injection, infinite loops, token bombing)
9
+ * - AGENTS.md governance verification
10
+ * - Compliance reporting (EU AI Act, NIST, OWASP)
11
+ * - MCP server security auditing
12
+ * - ML Bill of Materials (MLBOM) generation
13
+ * - Agent-to-Agent communication security
14
+ *
15
+ * @author Inkog.io
16
+ * @license Apache-2.0
17
+ */
18
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
19
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
20
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
21
+ import { getConfig, getApiKey } from './config.js';
22
+ import { callTool, getToolList, registeredToolCount } from './tools/index.js';
23
+ // =============================================================================
24
+ // Server Setup
25
+ // =============================================================================
26
+ const config = getConfig();
27
+ /**
28
+ * Create and configure the MCP server
29
+ * Note: Using Server (not McpServer) for advanced request handling capabilities
30
+ */
31
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
32
+ function createServer() {
33
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
34
+ const server = new Server({
35
+ name: config.serverName,
36
+ version: config.serverVersion,
37
+ }, {
38
+ capabilities: {
39
+ tools: {},
40
+ },
41
+ });
42
+ // ---------------------------------------------------------------------------
43
+ // Request Handlers
44
+ // ---------------------------------------------------------------------------
45
+ /**
46
+ * Handle tool listing requests
47
+ */
48
+ server.setRequestHandler(ListToolsRequestSchema, () => {
49
+ const tools = getToolList();
50
+ // Log tool count in debug mode
51
+ if (config.logLevel === 'debug') {
52
+ logDebug('ListTools', `Returning ${tools.length} tools`);
53
+ }
54
+ return { tools };
55
+ });
56
+ /**
57
+ * Handle tool execution requests
58
+ */
59
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
60
+ const { name, arguments: args } = request.params;
61
+ // Log tool call in debug mode
62
+ if (config.logLevel === 'debug') {
63
+ logDebug('CallTool', `Executing tool: ${name}`);
64
+ }
65
+ // Execute the tool
66
+ const result = await callTool(name, args ?? {});
67
+ // Convert our internal result format to MCP format
68
+ return {
69
+ content: result.content.map((item) => {
70
+ if (item.type === 'text') {
71
+ return {
72
+ type: 'text',
73
+ text: item.text ?? '',
74
+ };
75
+ }
76
+ if (item.type === 'image') {
77
+ return {
78
+ type: 'image',
79
+ data: item.data ?? '',
80
+ mimeType: item.mimeType ?? 'image/png',
81
+ };
82
+ }
83
+ // Resource type - convert to text for now
84
+ return {
85
+ type: 'text',
86
+ text: item.text ?? '',
87
+ };
88
+ }),
89
+ isError: result.isError,
90
+ };
91
+ });
92
+ return server;
93
+ }
94
+ const logLevelOrder = {
95
+ debug: 0,
96
+ info: 1,
97
+ warn: 2,
98
+ error: 3,
99
+ };
100
+ function shouldLog(level) {
101
+ return logLevelOrder[level] >= logLevelOrder[config.logLevel];
102
+ }
103
+ function formatLogMessage(level, context, message) {
104
+ const timestamp = new Date().toISOString();
105
+ if (config.logFormat === 'json') {
106
+ return JSON.stringify({
107
+ timestamp,
108
+ level,
109
+ context,
110
+ message,
111
+ server: config.serverName,
112
+ version: config.serverVersion,
113
+ });
114
+ }
115
+ return `[${timestamp}] [${level.toUpperCase()}] [${context}] ${message}`;
116
+ }
117
+ function log(level, context, message) {
118
+ if (shouldLog(level)) {
119
+ console.error(formatLogMessage(level, context, message));
120
+ }
121
+ }
122
+ function logDebug(context, message) {
123
+ log('debug', context, message);
124
+ }
125
+ function logInfo(context, message) {
126
+ log('info', context, message);
127
+ }
128
+ function logError(context, message) {
129
+ log('error', context, message);
130
+ }
131
+ // =============================================================================
132
+ // Startup Banner
133
+ // =============================================================================
134
+ function printBanner() {
135
+ if (config.logLevel === 'debug' || config.logLevel === 'info') {
136
+ const banner = `
137
+ ╔══════════════════════════════════════════════════════════════════╗
138
+ ║ ║
139
+ ║ ██╗███╗ ██╗██╗ ██╗ ██████╗ ██████╗ ║
140
+ ║ ██║████╗ ██║██║ ██╔╝██╔═══██╗██╔════╝ ║
141
+ ║ ██║██╔██╗ ██║█████╔╝ ██║ ██║██║ ███╗ ║
142
+ ║ ██║██║╚██╗██║██╔═██╗ ██║ ██║██║ ██║ ║
143
+ ║ ██║██║ ╚████║██║ ██╗╚██████╔╝╚██████╔╝ ║
144
+ ║ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ║
145
+ ║ ║
146
+ ║ AI Security Platform for the Agentic Era ║
147
+ ║ ║
148
+ ╚══════════════════════════════════════════════════════════════════╝
149
+ `;
150
+ console.error(banner);
151
+ }
152
+ }
153
+ // =============================================================================
154
+ // Main Entry Point
155
+ // =============================================================================
156
+ async function main() {
157
+ printBanner();
158
+ // Check for API key
159
+ const apiKey = getApiKey();
160
+ if (apiKey === undefined) {
161
+ logInfo('Startup', 'No API key configured. Set INKOG_API_KEY environment variable.');
162
+ logInfo('Startup', 'Get your free API key at https://app.inkog.io');
163
+ }
164
+ else {
165
+ logDebug('Startup', 'API key configured');
166
+ }
167
+ // Create and start server
168
+ logInfo('Startup', `Starting Inkog MCP Server v${config.serverVersion}`);
169
+ logInfo('Startup', `Registered ${registeredToolCount} tools`);
170
+ logDebug('Startup', `API endpoint: ${config.apiBaseUrl}/${config.apiVersion}`);
171
+ const server = createServer();
172
+ const transport = new StdioServerTransport();
173
+ // Handle graceful shutdown
174
+ const handleShutdown = (signal) => {
175
+ logInfo('Shutdown', `Received ${signal}, shutting down...`);
176
+ server.close().then(() => {
177
+ process.exit(0);
178
+ }).catch((error) => {
179
+ const message = error instanceof Error ? error.message : String(error);
180
+ logError('Shutdown', `Error during shutdown: ${message}`);
181
+ process.exit(1);
182
+ });
183
+ };
184
+ process.on('SIGINT', () => { handleShutdown('SIGINT'); });
185
+ process.on('SIGTERM', () => { handleShutdown('SIGTERM'); });
186
+ // Connect and run
187
+ try {
188
+ await server.connect(transport);
189
+ logInfo('Startup', 'MCP Server connected and ready');
190
+ }
191
+ catch (error) {
192
+ const message = error instanceof Error ? error.message : String(error);
193
+ logError('Startup', `Failed to start server: ${message}`);
194
+ process.exit(1);
195
+ }
196
+ }
197
+ // Run the server
198
+ main().catch((error) => {
199
+ const message = error instanceof Error ? error.message : String(error);
200
+ logError('Fatal', message);
201
+ process.exit(1);
202
+ });
203
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * inkog_audit_a2a Tool
3
+ *
4
+ * P2 - Agent-to-Agent (A2A) Security Auditing (MULTI-AGENT SECURITY)
5
+ *
6
+ * Audits communication patterns in multi-agent systems for:
7
+ * - Infinite delegation loops
8
+ * - Privilege escalation via delegation
9
+ * - Data leakage between agents
10
+ * - Unauthorized agent handoffs
11
+ * - Missing permission guards
12
+ *
13
+ * Supports: Google A2A protocol, CrewAI, LangGraph, auto-detection
14
+ *
15
+ * Aligned with Google Cloud AI Agent Trends 2026:
16
+ * "Multi-agent orchestration is the future of enterprise AI"
17
+ */
18
+ import type { ToolDefinition } from './index.js';
19
+ export declare const auditA2aTool: ToolDefinition;
20
+ //# sourceMappingURL=audit-a2a.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-a2a.d.ts","sourceRoot":"","sources":["../../src/tools/audit-a2a.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAYH,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,YAAY,CAAC;AAkY7D,eAAO,MAAM,YAAY,EAAE,cA4B1B,CAAC"}