swagger_mcp_tool 0.1.1 → 0.1.3
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.
- checksums.yaml +4 -4
- data/README.md +21 -11
- data/lib/swagger_mcp_tool/config.rb +5 -2
- data/lib/swagger_mcp_tool/helpers/request.rb +10 -2
- data/lib/swagger_mcp_tool/helpers/tool_register.rb +14 -0
- data/lib/swagger_mcp_tool/server.rb +2 -3
- data/lib/swagger_mcp_tool/stdio_server.rb +53 -0
- data/lib/swagger_mcp_tool/tool_registry.rb +5 -2
- data/lib/swagger_mcp_tool/version.rb +1 -1
- data/lib/swagger_mcp_tool.rb +9 -0
- metadata +8 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a17ce1a95b6b934487c74682672da45a1fb455bc757cd227f8194570173f395f
|
4
|
+
data.tar.gz: 0d9e16a449b6e48a885567d134d99646bd596d38b6a3d1ec9dd5606897c57bf4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91da95b89b5f2f136829b21c07c759878a553526afcfa6c1d233b8d22c7fb7ffd6434e30be0905a45c9a1afbe7c3caa22a45a2e1e65c33840eb95140659bdd19
|
7
|
+
data.tar.gz: c95fdfc6057627469d4caa35580f523f5f469d9ef0c12858ff83c91cce44ace84214c791c6f682dd9757fd1314a0d19baba6bbff864591abb638c3997b144cd7
|
data/README.md
CHANGED
@@ -85,7 +85,7 @@ swagger_mcp_server --help
|
|
85
85
|
|
86
86
|
### STDIO Server (Recommended for MCP Integration)
|
87
87
|
|
88
|
-
Use the provided example for direct integration with MCP clients like
|
88
|
+
Use the provided example for direct integration with MCP clients like Kiro IDE:
|
89
89
|
|
90
90
|
**File: `examples/mcp_stdio_server.rb`**
|
91
91
|
|
@@ -241,7 +241,7 @@ SwaggerMCPTool.configure do |config|
|
|
241
241
|
config.mcp_name = 'my_company_api'
|
242
242
|
config.mcp_name_for_human = 'My Company API'
|
243
243
|
config.mcp_description_for_human = "Tools for interacting with My Company's API"
|
244
|
-
config.auth_header_name = :'Token'
|
244
|
+
config.auth_header_name = :'X-Auth-Token'
|
245
245
|
end
|
246
246
|
|
247
247
|
# Start the server
|
@@ -325,21 +325,21 @@ end
|
|
325
325
|
|
326
326
|
## MCP Integration
|
327
327
|
|
328
|
-
###
|
328
|
+
### Kiro IDE Integration
|
329
329
|
|
330
|
-
To use with
|
330
|
+
To use with Kiro IDE, add the server to your MCP configuration file (`.kiro/settings/mcp.json`):
|
331
331
|
|
332
332
|
```json
|
333
333
|
{
|
334
334
|
"mcpServers": {
|
335
335
|
"swagger-mcp-tool": {
|
336
|
-
"command": "/Users
|
336
|
+
"command": "/Users/ankit/.rbenv/versions/3.2.2/bin/ruby",
|
337
337
|
"args": [
|
338
|
-
"/Users
|
338
|
+
"/Users/ankit/projects/dummy/swagger_mcp_tool/examples/mcp_stdio_server.rb"
|
339
339
|
],
|
340
340
|
"env": {
|
341
341
|
"RBENV_VERSION": "3.2.2",
|
342
|
-
"PATH": "/Users
|
342
|
+
"PATH": "/Users/ankit/.rbenv/versions/3.2.2/bin:/Users/ankit/.rbenv/shims:/usr/local/bin:/usr/bin:/bin"
|
343
343
|
},
|
344
344
|
"disabled": false,
|
345
345
|
"autoApprove": []
|
@@ -373,6 +373,16 @@ The server automatically generates MCP tools based on your Swagger specification
|
|
373
373
|
|
374
374
|
## Authentication
|
375
375
|
|
376
|
+
### Setting an Auth Token (HTTP Server)
|
377
|
+
|
378
|
+
You can set an auth token for a user by making a POST request to the `/set_auth_token` endpoint:
|
379
|
+
|
380
|
+
```bash
|
381
|
+
curl -X POST http://localhost:3001/set_auth_token \
|
382
|
+
-H "Content-Type: application/json" \
|
383
|
+
-d '{"user_id": "user123", "auth_token": "Bearer token123"}'
|
384
|
+
```
|
385
|
+
|
376
386
|
### Passing User Context (HTTP Server)
|
377
387
|
|
378
388
|
When making requests to the HTTP MCP server, you can pass user context in the headers:
|
@@ -383,7 +393,7 @@ curl -X POST http://localhost:3001/mcp \
|
|
383
393
|
-H "X-User-ID: user123" \
|
384
394
|
-H "X-Username: John Doe" \
|
385
395
|
-H "X-Email: john@example.com" \
|
386
|
-
-H "Auth-Token: Bearer token123" \
|
396
|
+
-H "X-Auth-Token: Bearer token123" \
|
387
397
|
-d '{"jsonrpc":"2.0","id":"1","method":"tools/list"}'
|
388
398
|
```
|
389
399
|
|
@@ -424,9 +434,9 @@ When running the HTTP server, the following endpoints are available:
|
|
424
434
|
|
425
435
|
## Testing Your Tools
|
426
436
|
|
427
|
-
### With
|
437
|
+
### With Kiro IDE
|
428
438
|
|
429
|
-
Once configured in
|
439
|
+
Once configured in Kiro, you can test tools directly:
|
430
440
|
|
431
441
|
```
|
432
442
|
# Test getInventory (no parameters)
|
@@ -513,7 +523,7 @@ end
|
|
513
523
|
|
514
524
|
- **STDIO Server**: Logs go to stderr, check your terminal output
|
515
525
|
- **HTTP Server**: Logs go to the configured log file (default: `mcp_server.log`)
|
516
|
-
- **
|
526
|
+
- **Kiro Integration**: Check Kiro's MCP server logs in the IDE
|
517
527
|
|
518
528
|
### Verifying Tool Generation
|
519
529
|
|
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
require 'logger'
|
4
4
|
require 'singleton'
|
5
|
-
|
6
5
|
module SwaggerMCPTool
|
7
6
|
# Configuration management for SwaggerMCPTool
|
8
7
|
#
|
@@ -15,7 +14,8 @@ module SwaggerMCPTool
|
|
15
14
|
:log_level, :log_file, :swagger_url, :mcp_name,
|
16
15
|
:mcp_name_for_human, :mcp_description_for_human,
|
17
16
|
:mcp_description_for_model, :auth_type, :default_token,
|
18
|
-
:prompts, :resources, :auth_header_name, :tools
|
17
|
+
:prompts, :resources, :auth_header_name, :tools, :protocol_version,
|
18
|
+
:exclude_tools
|
19
19
|
|
20
20
|
DEFAULT_SERVER_PORT = 3001
|
21
21
|
DEFAULT_SERVER_BIND = '0.0.0.0'
|
@@ -29,6 +29,7 @@ module SwaggerMCPTool
|
|
29
29
|
DEFAULT_MCP_DESCRIPTION_FOR_MODEL = 'This MCP server provides tools for interacting with APIs via Swagger/OpenAPI specifications.'
|
30
30
|
DEFAULT_AUTH_TYPE = 'none'
|
31
31
|
DEFAULT_LOG_FILE = nil
|
32
|
+
DEFAULT_PROTOCOL_VERSION = "2024-11-05"
|
32
33
|
|
33
34
|
def initialize
|
34
35
|
# Server settings
|
@@ -47,6 +48,7 @@ module SwaggerMCPTool
|
|
47
48
|
@tools = []
|
48
49
|
@resources = []
|
49
50
|
@prompts = [] # Will be generated lazily
|
51
|
+
@exclude_tools = []
|
50
52
|
end
|
51
53
|
|
52
54
|
def setup_server_defaults
|
@@ -67,6 +69,7 @@ module SwaggerMCPTool
|
|
67
69
|
@mcp_name_for_human = DEFAULT_MCP_NAME_FOR_HUMAN
|
68
70
|
@mcp_description_for_human = DEFAULT_MCP_DESCRIPTION_FOR_HUMAN
|
69
71
|
@mcp_description_for_model = DEFAULT_MCP_DESCRIPTION_FOR_MODEL
|
72
|
+
@protocol_version = DEFAULT_PROTOCOL_VERSION
|
70
73
|
end
|
71
74
|
|
72
75
|
def setup_auth_defaults
|
@@ -19,7 +19,7 @@ module SwaggerMCPTool
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def create_http_request(method, uri, params)
|
22
|
-
req_method = request_methods(method.downcase)
|
22
|
+
req_method = request_methods(method.downcase&.to_sym)
|
23
23
|
request = req_method.new(uri.request_uri)
|
24
24
|
|
25
25
|
set_json_body(request, params) if body_required?(method.downcase)
|
@@ -58,7 +58,10 @@ module SwaggerMCPTool
|
|
58
58
|
|
59
59
|
def add_headers_to_request(request, headers, auth_token)
|
60
60
|
# Add custom headers
|
61
|
-
headers.each
|
61
|
+
headers.each do |key, value|
|
62
|
+
next unless valid_header?(key, value)
|
63
|
+
request[key] = sanitize_header_value(value)
|
64
|
+
end
|
62
65
|
|
63
66
|
# Add authorization header if available
|
64
67
|
add_authorization_header(request, auth_token)
|
@@ -109,6 +112,11 @@ module SwaggerMCPTool
|
|
109
112
|
def filter_unused_params(params, used_params)
|
110
113
|
params.reject { |key, _| used_params.include?(key) }
|
111
114
|
end
|
115
|
+
|
116
|
+
def sanitize_header_value(value)
|
117
|
+
# Remove any potentially dangerous characters
|
118
|
+
value.to_s.gsub(/[\r\n\0]/, '')
|
119
|
+
end
|
112
120
|
end
|
113
121
|
end
|
114
122
|
end
|
@@ -2,6 +2,20 @@
|
|
2
2
|
|
3
3
|
module SwaggerMCPTool
|
4
4
|
module Helpers
|
5
|
+
# Provides helper methods for registering and initializing tools using Swagger definitions.
|
6
|
+
# This module includes methods to set up the tool registry, generate tools from a Swagger URL,
|
7
|
+
# and handle dynamic tool registration. It is intended to be included in classes that require
|
8
|
+
# integration with the SwaggerMCPTool tool registry system.
|
9
|
+
#
|
10
|
+
# Example usage:
|
11
|
+
# include SwaggerMCPTool::Helpers::ToolRegister
|
12
|
+
#
|
13
|
+
# @see SwaggerMCPTool::ToolRegistry
|
14
|
+
# @see SwaggerClient
|
15
|
+
# @see ToolGenerator
|
16
|
+
#
|
17
|
+
# @author Your Name
|
18
|
+
# @since 1.0.0
|
5
19
|
module ToolRegister
|
6
20
|
def tool_registry
|
7
21
|
SwaggerMCPTool::ToolRegistry.instance
|
@@ -5,7 +5,6 @@ require 'sinatra/json'
|
|
5
5
|
require 'mcp'
|
6
6
|
require 'json'
|
7
7
|
require 'logger'
|
8
|
-
require 'byebug'
|
9
8
|
require_relative 'tool_registry'
|
10
9
|
require_relative 'logging'
|
11
10
|
require_relative 'config'
|
@@ -103,7 +102,7 @@ module SwaggerMCPTool
|
|
103
102
|
self.class.before do
|
104
103
|
headers 'Access-Control-Allow-Origin' => '*',
|
105
104
|
'Access-Control-Allow-Methods' => 'GET, POST, OPTIONS',
|
106
|
-
'Access-Control-Allow-Headers' => 'Content-Type, Authorization, X-User-ID, Auth-Token, X-Username, X-Email'
|
105
|
+
'Access-Control-Allow-Headers' => 'Content-Type, Authorization, X-User-ID, X-Auth-Token, X-Username, X-Email'
|
107
106
|
end
|
108
107
|
end
|
109
108
|
|
@@ -111,7 +110,7 @@ module SwaggerMCPTool
|
|
111
110
|
self.class.options '*' do
|
112
111
|
response.headers['Allow'] = 'GET, POST, OPTIONS'
|
113
112
|
response.headers['Access-Control-Allow-Headers'] =
|
114
|
-
'Authorization, Content-Type, Accept, X-User-ID, Auth-Token, X-Username, X-Email'
|
113
|
+
'Authorization, Content-Type, Accept, X-User-ID, X-Auth-Token, X-Username, X-Email'
|
115
114
|
200
|
116
115
|
end
|
117
116
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'mcp'
|
2
|
+
require 'mcp/server/transports/stdio_transport'
|
3
|
+
require 'json'
|
4
|
+
require 'logger'
|
5
|
+
require_relative 'tool_registry'
|
6
|
+
require_relative 'logging'
|
7
|
+
require_relative 'config'
|
8
|
+
require_relative 'helpers/tool_register'
|
9
|
+
|
10
|
+
module SwaggerMCPTool
|
11
|
+
# This module provides the StdioServer for handling MCP tool operations via standard IO.
|
12
|
+
# StdioServer handles MCP tool operations via standard IO.
|
13
|
+
# It initializes the server, sets up configuration and logging,
|
14
|
+
# registers available tools, and starts the server using standard IO transport.
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
# server = SwaggerMCPTool::StdioServer.new
|
18
|
+
# server.start_stdio_server
|
19
|
+
#
|
20
|
+
# @see SwaggerMCPTool::Logging
|
21
|
+
# @see SwaggerMCPTool::Helpers::ToolRegister
|
22
|
+
# @see MCP::Server
|
23
|
+
# @see MCP::Server::Transports::StdioTransport
|
24
|
+
class StdioServer
|
25
|
+
include SwaggerMCPTool::Logging
|
26
|
+
include SwaggerMCPTool::Helpers::ToolRegister
|
27
|
+
|
28
|
+
def initialize
|
29
|
+
@config = Config.instance
|
30
|
+
@logger = @config.logger || Logger.new($stdout)
|
31
|
+
log_server_initialization
|
32
|
+
setup_tool_registry
|
33
|
+
initialize_tools
|
34
|
+
end
|
35
|
+
|
36
|
+
def start_stdio_server(context = {})
|
37
|
+
user_details = context
|
38
|
+
configuration = MCP::Configuration.new(protocol_version: @config.protocol_version)
|
39
|
+
|
40
|
+
# Create MCP server with our tools and prompts
|
41
|
+
mcp = MCP::Server.new(
|
42
|
+
name: @config.mcp_name,
|
43
|
+
tools: tool_registry.dynamic_tools,
|
44
|
+
prompts: @config.prompts,
|
45
|
+
server_context: user_details,
|
46
|
+
configuration: configuration
|
47
|
+
)
|
48
|
+
|
49
|
+
transport = MCP::Server::Transports::StdioTransport.new(mcp)
|
50
|
+
transport.open
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -25,9 +25,12 @@ module SwaggerMCPTool
|
|
25
25
|
@dynamic_tools = @config.tools if @config&.tools
|
26
26
|
validate_inputs!(tools, base_url)
|
27
27
|
@logger.info "Registering #{tools.size} dynamic tools"
|
28
|
-
|
28
|
+
excluded_tools = Set.new(@config.exclude_tools)
|
29
|
+
|
29
30
|
tools.each do |tool_def|
|
30
|
-
|
31
|
+
unless excluded_tools.include?(tool_def['name'])
|
32
|
+
register_tool(tool_def, base_url) unless tool_exists?(tool_def['name'])
|
33
|
+
end
|
31
34
|
end
|
32
35
|
|
33
36
|
@logger.info "Successfully registered #{@dynamic_tools.size} tools"
|
data/lib/swagger_mcp_tool.rb
CHANGED
@@ -5,7 +5,11 @@ require 'swagger_mcp_tool/swagger_client'
|
|
5
5
|
require 'swagger_mcp_tool/tool_generator'
|
6
6
|
require 'swagger_mcp_tool/api_client'
|
7
7
|
require 'swagger_mcp_tool/auth_handler'
|
8
|
+
require 'swagger_mcp_tool/stdio_server'
|
8
9
|
|
10
|
+
# The SwaggerMCPTool module provides functionality to start and configure a server,
|
11
|
+
# as well as to run a stdio-based server for integration with other tools.
|
12
|
+
# It defines custom error handling and exposes methods for server lifecycle management.
|
9
13
|
module SwaggerMCPTool
|
10
14
|
class Error < StandardError; end
|
11
15
|
|
@@ -18,4 +22,9 @@ module SwaggerMCPTool
|
|
18
22
|
def self.configure(&block)
|
19
23
|
Config.configure(&block)
|
20
24
|
end
|
25
|
+
|
26
|
+
def self.start_stdio_server(context={})
|
27
|
+
server = StdioServer.new
|
28
|
+
server.start_stdio_server(context)
|
29
|
+
end
|
21
30
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: swagger_mcp_tool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ankit
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-10-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -34,16 +34,16 @@ dependencies:
|
|
34
34
|
name: mcp
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
|
-
- - "
|
37
|
+
- - ">="
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: 0.
|
39
|
+
version: 0.3.0
|
40
40
|
type: :runtime
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
|
-
- - "
|
44
|
+
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: 0.
|
46
|
+
version: 0.3.0
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: puma
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -152,20 +152,6 @@ dependencies:
|
|
152
152
|
- - ">="
|
153
153
|
- !ruby/object:Gem::Version
|
154
154
|
version: 3.13.1
|
155
|
-
- !ruby/object:Gem::Dependency
|
156
|
-
name: yard
|
157
|
-
requirement: !ruby/object:Gem::Requirement
|
158
|
-
requirements:
|
159
|
-
- - "~>"
|
160
|
-
- !ruby/object:Gem::Version
|
161
|
-
version: '0.9'
|
162
|
-
type: :development
|
163
|
-
prerelease: false
|
164
|
-
version_requirements: !ruby/object:Gem::Requirement
|
165
|
-
requirements:
|
166
|
-
- - "~>"
|
167
|
-
- !ruby/object:Gem::Version
|
168
|
-
version: '0.9'
|
169
155
|
description: A Model Context Protocol (MCP) server that generates tools from Swagger/OpenAPI
|
170
156
|
specifications
|
171
157
|
email:
|
@@ -191,6 +177,7 @@ files:
|
|
191
177
|
- lib/swagger_mcp_tool/helpers/tool_register.rb
|
192
178
|
- lib/swagger_mcp_tool/logging.rb
|
193
179
|
- lib/swagger_mcp_tool/server.rb
|
180
|
+
- lib/swagger_mcp_tool/stdio_server.rb
|
194
181
|
- lib/swagger_mcp_tool/swagger_client.rb
|
195
182
|
- lib/swagger_mcp_tool/tool_generator.rb
|
196
183
|
- lib/swagger_mcp_tool/tool_registry.rb
|
@@ -207,7 +194,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
207
194
|
requirements:
|
208
195
|
- - ">="
|
209
196
|
- !ruby/object:Gem::Version
|
210
|
-
version:
|
197
|
+
version: '0'
|
211
198
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
212
199
|
requirements:
|
213
200
|
- - ">="
|