gql-to-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 (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +131 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +135 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config/config-loader.d.ts +5 -0
  8. package/dist/config/config-loader.d.ts.map +1 -0
  9. package/dist/config/config-loader.js +78 -0
  10. package/dist/config/config-loader.js.map +1 -0
  11. package/dist/config/config-schema.d.ts +1007 -0
  12. package/dist/config/config-schema.d.ts.map +1 -0
  13. package/dist/config/config-schema.js +130 -0
  14. package/dist/config/config-schema.js.map +1 -0
  15. package/dist/gql-client.d.ts +23 -0
  16. package/dist/gql-client.d.ts.map +1 -0
  17. package/dist/gql-client.js +129 -0
  18. package/dist/gql-client.js.map +1 -0
  19. package/dist/index.d.ts +24 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +93 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/logger/index.d.ts +11 -0
  24. package/dist/logger/index.d.ts.map +1 -0
  25. package/dist/logger/index.js +76 -0
  26. package/dist/logger/index.js.map +1 -0
  27. package/dist/mcp-server.d.ts +45 -0
  28. package/dist/mcp-server.d.ts.map +1 -0
  29. package/dist/mcp-server.js +284 -0
  30. package/dist/mcp-server.js.map +1 -0
  31. package/dist/operation-loader.d.ts +17 -0
  32. package/dist/operation-loader.d.ts.map +1 -0
  33. package/dist/operation-loader.js +332 -0
  34. package/dist/operation-loader.js.map +1 -0
  35. package/dist/registry/index.d.ts +7 -0
  36. package/dist/registry/index.d.ts.map +1 -0
  37. package/dist/registry/index.js +13 -0
  38. package/dist/registry/index.js.map +1 -0
  39. package/dist/registry/prompt-registry.d.ts +49 -0
  40. package/dist/registry/prompt-registry.d.ts.map +1 -0
  41. package/dist/registry/prompt-registry.js +84 -0
  42. package/dist/registry/prompt-registry.js.map +1 -0
  43. package/dist/registry/resource-registry.d.ts +39 -0
  44. package/dist/registry/resource-registry.d.ts.map +1 -0
  45. package/dist/registry/resource-registry.js +69 -0
  46. package/dist/registry/resource-registry.js.map +1 -0
  47. package/dist/registry/tool-registry.d.ts +30 -0
  48. package/dist/registry/tool-registry.d.ts.map +1 -0
  49. package/dist/registry/tool-registry.js +108 -0
  50. package/dist/registry/tool-registry.js.map +1 -0
  51. package/dist/schema-loader.d.ts +14 -0
  52. package/dist/schema-loader.d.ts.map +1 -0
  53. package/dist/schema-loader.js +52 -0
  54. package/dist/schema-loader.js.map +1 -0
  55. package/dist/telemetry/index.d.ts +19 -0
  56. package/dist/telemetry/index.d.ts.map +1 -0
  57. package/dist/telemetry/index.js +88 -0
  58. package/dist/telemetry/index.js.map +1 -0
  59. package/dist/transport/http.d.ts +16 -0
  60. package/dist/transport/http.d.ts.map +1 -0
  61. package/dist/transport/http.js +146 -0
  62. package/dist/transport/http.js.map +1 -0
  63. package/dist/transport/index.d.ts +5 -0
  64. package/dist/transport/index.d.ts.map +1 -0
  65. package/dist/transport/index.js +8 -0
  66. package/dist/transport/index.js.map +1 -0
  67. package/dist/transport/stdio.d.ts +6 -0
  68. package/dist/transport/stdio.d.ts.map +1 -0
  69. package/dist/transport/stdio.js +14 -0
  70. package/dist/transport/stdio.js.map +1 -0
  71. package/dist/types/config.d.ts +104 -0
  72. package/dist/types/config.d.ts.map +1 -0
  73. package/dist/types/config.js +3 -0
  74. package/dist/types/config.js.map +1 -0
  75. package/dist/types/errors.d.ts +45 -0
  76. package/dist/types/errors.d.ts.map +1 -0
  77. package/dist/types/errors.js +80 -0
  78. package/dist/types/errors.js.map +1 -0
  79. package/dist/types/gql.d.ts +10 -0
  80. package/dist/types/gql.d.ts.map +1 -0
  81. package/dist/types/gql.js +3 -0
  82. package/dist/types/gql.js.map +1 -0
  83. package/dist/types/index.d.ts +9 -0
  84. package/dist/types/index.d.ts.map +1 -0
  85. package/dist/types/index.js +17 -0
  86. package/dist/types/index.js.map +1 -0
  87. package/dist/types/request.d.ts +25 -0
  88. package/dist/types/request.d.ts.map +1 -0
  89. package/dist/types/request.js +23 -0
  90. package/dist/types/request.js.map +1 -0
  91. package/dist/types/server.d.ts +12 -0
  92. package/dist/types/server.d.ts.map +1 -0
  93. package/dist/types/server.js +3 -0
  94. package/dist/types/server.js.map +1 -0
  95. package/dist/types/tool.d.ts +47 -0
  96. package/dist/types/tool.d.ts.map +1 -0
  97. package/dist/types/tool.js +3 -0
  98. package/dist/types/tool.js.map +1 -0
  99. package/package.json +108 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,131 @@
1
+ # gql-mcp
2
+
3
+ > Convert GraphQL operations into MCP tools with support for custom multi-step workflows
4
+
5
+ ## Overview
6
+
7
+ `gql-mcp` is a TypeScript library that turns your GraphQL operations into MCP (Model Context Protocol) tools. It auto-discovers `.graphql` files and exposes them as tools, with support for custom tools that chain multiple GraphQL calls.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npm install gql-to-mcp
13
+ ```
14
+
15
+ ## Quick Start
16
+
17
+ ```typescript
18
+ import { createMcpServer } from 'gql-to-mcp';
19
+
20
+ const server = createMcpServer({
21
+ config: './mcp-config.yaml',
22
+ tools: [], // optional custom tools
23
+ });
24
+
25
+ await server.start();
26
+ ```
27
+
28
+ ## Configuration
29
+
30
+ Create a `mcp-config.yaml` file:
31
+
32
+ ```yaml
33
+ server_info:
34
+ name: my-mcp-server
35
+ version: 1.0.0
36
+
37
+ endpoint: 'https://api.example.com/graphql'
38
+
39
+ headers:
40
+ x-client-name: my-app
41
+
42
+ # Optional: Auto-discover GraphQL operations
43
+ schema:
44
+ source: local
45
+ path: ./schema.graphql
46
+
47
+ operations:
48
+ dirs:
49
+ - ./operations
50
+
51
+ # Optional: Logging
52
+ logging:
53
+ level: info # debug | info | warn | error
54
+ format: json # json | pretty
55
+ redact:
56
+ - headers.authorization
57
+ - jwt.sub
58
+
59
+ # Optional: Telemetry (New Relic, Splunk, etc)
60
+ telemetry:
61
+ enabled: true
62
+ service_name: my-service
63
+ exporters:
64
+ tracing:
65
+ otlp:
66
+ endpoint: ${env.OTLP_ENDPOINT}
67
+ headers:
68
+ api-key: ${env.LICENSE_KEY}
69
+ ```
70
+
71
+ ## Custom Tools
72
+
73
+ Create multi-step tools that chain GraphQL operations:
74
+
75
+ ```typescript
76
+ import { CustomTool } from 'gql-to-mcp';
77
+
78
+ const myTool: CustomTool = {
79
+ name: 'my_custom_tool',
80
+ description: 'Does something complex',
81
+ inputSchema: {
82
+ type: 'object',
83
+ properties: {
84
+ id: { type: 'string' },
85
+ },
86
+ required: ['id'],
87
+ },
88
+ execute: async (args, ctx) => {
89
+ // Call GraphQL
90
+ const result = await ctx.gql(
91
+ `
92
+ query GetData($id: ID!) {
93
+ item(id: $id) { id name }
94
+ }
95
+ `,
96
+ { id: args.id }
97
+ );
98
+
99
+ return result.data;
100
+ },
101
+ };
102
+
103
+ export default myTool;
104
+ ```
105
+
106
+ ## Features
107
+
108
+ - ✅ Auto-converts `.graphql` files to MCP tools
109
+ - ✅ Schema validation at startup
110
+ - ✅ Custom multi-step tools
111
+ - ✅ Auth header forwarding
112
+ - ✅ Structured logging (Pino)
113
+ - ✅ OpenTelemetry tracing
114
+ - ✅ TypeScript support
115
+
116
+ ## Development
117
+
118
+ ```bash
119
+ # Build
120
+ npm run build
121
+
122
+ # Type check
123
+ npm run type-check
124
+
125
+ # Lint
126
+ npm run lint
127
+ ```
128
+
129
+ ## License
130
+
131
+ MIT
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,135 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ const index_js_1 = require("./index.js");
38
+ const path = __importStar(require("path"));
39
+ const fs = __importStar(require("fs"));
40
+ const HELP = `
41
+ gql-mcp — GraphQL MCP Server
42
+
43
+ Usage:
44
+ gql-mcp <config-file> [options]
45
+
46
+ Arguments:
47
+ <config-file> Path to YAML configuration file
48
+
49
+ Options:
50
+ --help, -h Show this help message
51
+ --version, -v Show version
52
+
53
+ Examples:
54
+ gql-mcp ./mcp-config.yaml
55
+ gql-mcp /etc/gql-mcp/config.yaml
56
+
57
+ Config file structure:
58
+ server_info: Server name, version
59
+ endpoint: GraphQL endpoint URL
60
+ schema: Schema source (local file or introspection)
61
+ operations: Directory containing .graphql operation files
62
+ transport: Transport type (streamable_http | stdio) and options
63
+ headers: Static headers forwarded to every GraphQL request
64
+ forward_headers: Inbound MCP headers to forward to GraphQL endpoint
65
+ overrides: Mutation mode, tool description overrides
66
+ custom_scalars: JSON Schema mappings for custom GraphQL scalars
67
+ logging: Log level and format
68
+ telemetry: OTLP tracing and metrics exporters
69
+
70
+ Docs: https://github.com/your-org/gql-mcp
71
+ `;
72
+ async function main() {
73
+ const args = process.argv.slice(2);
74
+ if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
75
+ console.log(HELP);
76
+ process.exit(args.length === 0 ? 1 : 0);
77
+ }
78
+ if (args.includes('--version') || args.includes('-v')) {
79
+ const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf-8'));
80
+ console.log(pkg.version);
81
+ process.exit(0);
82
+ }
83
+ const configArg = args.find((a) => !a.startsWith('--'));
84
+ if (!configArg) {
85
+ console.error('❌ Error: No config file specified');
86
+ console.error(' Run gql-mcp --help for usage');
87
+ process.exit(1);
88
+ }
89
+ const configPath = path.isAbsolute(configArg)
90
+ ? configArg
91
+ : path.resolve(process.cwd(), configArg);
92
+ if (!fs.existsSync(configPath)) {
93
+ console.error(`❌ Error: Config file not found: ${configPath}`);
94
+ process.exit(1);
95
+ }
96
+ try {
97
+ const server = (0, index_js_1.createMcpServer)({ config: configPath });
98
+ await server.start();
99
+ const shutdown = (signal) => {
100
+ console.error(`\n⏹ Received ${signal}, shutting down...`);
101
+ server
102
+ .stop()
103
+ .then(() => {
104
+ console.error('✓ Shutdown complete');
105
+ process.exit(0);
106
+ })
107
+ .catch((err) => {
108
+ console.error('⚠ Error during shutdown:', err instanceof Error ? err.message : err);
109
+ process.exit(1);
110
+ });
111
+ };
112
+ process.on('SIGINT', () => shutdown('SIGINT'));
113
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
114
+ if (process.stdin.isTTY === false) {
115
+ process.stdin.resume();
116
+ }
117
+ }
118
+ catch (err) {
119
+ if (err instanceof Error) {
120
+ console.error(`❌ ${err.message}`);
121
+ if (process.env['DEBUG']) {
122
+ console.error(err.stack);
123
+ }
124
+ }
125
+ else {
126
+ console.error('❌ Unknown error during startup');
127
+ }
128
+ process.exit(1);
129
+ }
130
+ }
131
+ main().catch((err) => {
132
+ console.error('❌ Fatal:', err instanceof Error ? err.message : err);
133
+ process.exit(1);
134
+ });
135
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { McpConfig } from '../types/index.js';
2
+ export declare function resolveConfig(input: string | McpConfig): McpConfig;
3
+ export declare function loadConfig(configPath: string): McpConfig;
4
+ export declare function interpolateEnvVars(obj: unknown): unknown;
5
+ //# sourceMappingURL=config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAwBnD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAKlE;AAMD,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAExD;AA+ED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CA4BxD"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveConfig = resolveConfig;
4
+ exports.loadConfig = loadConfig;
5
+ exports.interpolateEnvVars = interpolateEnvVars;
6
+ const fs_1 = require("fs");
7
+ const js_yaml_1 = require("js-yaml");
8
+ const index_js_1 = require("../types/index.js");
9
+ const config_schema_js_1 = require("./config-schema.js");
10
+ function resolveConfig(input) {
11
+ if (typeof input === 'string') {
12
+ return loadFromFile(input);
13
+ }
14
+ return validateObject(input);
15
+ }
16
+ function loadConfig(configPath) {
17
+ return resolveConfig(configPath);
18
+ }
19
+ function loadFromFile(configPath) {
20
+ const raw = readFile(configPath);
21
+ const parsed = parseYaml(raw, configPath);
22
+ const interpolated = interpolateEnvVars(parsed);
23
+ return validate(interpolated, `config file "${configPath}"`);
24
+ }
25
+ function readFile(configPath) {
26
+ try {
27
+ return (0, fs_1.readFileSync)(configPath, 'utf-8');
28
+ }
29
+ catch (err) {
30
+ throw new index_js_1.ConfigError(`Failed to read config file at "${configPath}": ${err instanceof Error ? err.message : String(err)}`);
31
+ }
32
+ }
33
+ function parseYaml(raw, configPath) {
34
+ try {
35
+ return (0, js_yaml_1.load)(raw);
36
+ }
37
+ catch (err) {
38
+ throw new index_js_1.ConfigError(`Failed to parse YAML in "${configPath}": ${err instanceof Error ? err.message : String(err)}`);
39
+ }
40
+ }
41
+ function validateObject(config) {
42
+ return validate(config, 'programmatic config');
43
+ }
44
+ function validate(input, source) {
45
+ const result = config_schema_js_1.McpConfigSchema.safeParse(input);
46
+ if (!result.success) {
47
+ const errors = result.error.issues
48
+ .map((e) => {
49
+ const path = e.path.length > 0 ? e.path.join('.') : '(root)';
50
+ return ` - ${path}: ${e.message}`;
51
+ })
52
+ .join('\n');
53
+ throw new index_js_1.ConfigError(`Config validation failed (${source}):\n${errors}`);
54
+ }
55
+ return result.data;
56
+ }
57
+ function interpolateEnvVars(obj) {
58
+ if (typeof obj === 'string') {
59
+ return obj.replace(/\$\{env\.([A-Z_][A-Z0-9_]*)\}/g, (match, varName) => {
60
+ const value = process.env[varName];
61
+ if (value === undefined) {
62
+ throw new index_js_1.ConfigError(`Environment variable "${varName}" is not set (referenced as "${match}" in config)`);
63
+ }
64
+ return value;
65
+ });
66
+ }
67
+ if (Array.isArray(obj)) {
68
+ return obj.map(interpolateEnvVars);
69
+ }
70
+ if (obj !== null && typeof obj === 'object') {
71
+ return Object.fromEntries(Object.entries(obj).map(([key, value]) => [
72
+ key,
73
+ interpolateEnvVars(value),
74
+ ]));
75
+ }
76
+ return obj;
77
+ }
78
+ //# sourceMappingURL=config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":"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"}