swagger_mcp_tool 0.1.2 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c9eccf6efe7428d34e07a2862835e55b8d76ec3941d092c2b2db88ee0f504836
4
- data.tar.gz: 18afd57f6908aed1bbd99a34ee955aaf87d8ab3098d5b2ceb1228d17b99591d3
3
+ metadata.gz: a17ce1a95b6b934487c74682672da45a1fb455bc757cd227f8194570173f395f
4
+ data.tar.gz: 0d9e16a449b6e48a885567d134d99646bd596d38b6a3d1ec9dd5606897c57bf4
5
5
  SHA512:
6
- metadata.gz: 2b9200c4656ed3db2db9979796836f462a40a91888139e6d8f996299b27d2a98d5d6808c85e6286d19a74a0e48b00166cb8ce1ec33804e868339ce6737e157bb
7
- data.tar.gz: f1e5978ec5ee724f567d29c7569580eb4a16316b995847c731e6b5cdf746e21410631851f712425e6a943781143d34741f75c7f6723eea35053e7dee32647852
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 Vscode IDE:
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
 
@@ -227,6 +227,7 @@ Use the provided example for HTTP-based integration:
227
227
 
228
228
  gem install swagger_mcp_tool
229
229
 
230
+
230
231
  require 'swagger_mcp_tool'
231
232
  SwaggerMCPTool.configure do |config|
232
233
  # Server settings
@@ -240,7 +241,7 @@ SwaggerMCPTool.configure do |config|
240
241
  config.mcp_name = 'my_company_api'
241
242
  config.mcp_name_for_human = 'My Company API'
242
243
  config.mcp_description_for_human = "Tools for interacting with My Company's API"
243
- config.auth_header_name = :'Token'
244
+ config.auth_header_name = :'X-Auth-Token'
244
245
  end
245
246
 
246
247
  # Start the server
@@ -324,21 +325,21 @@ end
324
325
 
325
326
  ## MCP Integration
326
327
 
327
- ### Vscode IDE Integration
328
+ ### Kiro IDE Integration
328
329
 
329
- To use with Vscode IDE, add the server to your MCP configuration file (`.vscode/settings/mcp.json`):
330
+ To use with Kiro IDE, add the server to your MCP configuration file (`.kiro/settings/mcp.json`):
330
331
 
331
332
  ```json
332
333
  {
333
334
  "mcpServers": {
334
335
  "swagger-mcp-tool": {
335
- "command": "/Users/<user>/.rbenv/versions/3.2.2/bin/ruby",
336
+ "command": "/Users/ankit/.rbenv/versions/3.2.2/bin/ruby",
336
337
  "args": [
337
- "/Users/<user>/swagger_mcp_tool/examples/mcp_stdio_server.rb"
338
+ "/Users/ankit/projects/dummy/swagger_mcp_tool/examples/mcp_stdio_server.rb"
338
339
  ],
339
340
  "env": {
340
341
  "RBENV_VERSION": "3.2.2",
341
- "PATH": "/Users/<user>/.rbenv/versions/3.2.2/bin:/Users/aki/.rbenv/shims:/usr/local/bin:/usr/bin:/bin"
342
+ "PATH": "/Users/ankit/.rbenv/versions/3.2.2/bin:/Users/ankit/.rbenv/shims:/usr/local/bin:/usr/bin:/bin"
342
343
  },
343
344
  "disabled": false,
344
345
  "autoApprove": []
@@ -372,6 +373,16 @@ The server automatically generates MCP tools based on your Swagger specification
372
373
 
373
374
  ## Authentication
374
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
+
375
386
  ### Passing User Context (HTTP Server)
376
387
 
377
388
  When making requests to the HTTP MCP server, you can pass user context in the headers:
@@ -382,7 +393,7 @@ curl -X POST http://localhost:3001/mcp \
382
393
  -H "X-User-ID: user123" \
383
394
  -H "X-Username: John Doe" \
384
395
  -H "X-Email: john@example.com" \
385
- -H "Auth-Token: Bearer token123" \
396
+ -H "X-Auth-Token: Bearer token123" \
386
397
  -d '{"jsonrpc":"2.0","id":"1","method":"tools/list"}'
387
398
  ```
388
399
 
@@ -423,9 +434,9 @@ When running the HTTP server, the following endpoints are available:
423
434
 
424
435
  ## Testing Your Tools
425
436
 
426
- ### With Vscode IDE
437
+ ### With Kiro IDE
427
438
 
428
- Once configured in Vscode, you can test tools directly:
439
+ Once configured in Kiro, you can test tools directly:
429
440
 
430
441
  ```
431
442
  # Test getInventory (no parameters)
@@ -512,7 +523,7 @@ end
512
523
 
513
524
  - **STDIO Server**: Logs go to stderr, check your terminal output
514
525
  - **HTTP Server**: Logs go to the configured log file (default: `mcp_server.log`)
515
- - **Vscode Integration**: Check Vscode's MCP server logs in the IDE
526
+ - **Kiro Integration**: Check Kiro's MCP server logs in the IDE
516
527
 
517
528
  ### Verifying Tool Generation
518
529
 
@@ -582,8 +593,6 @@ The gem consists of several key components:
582
593
 
583
594
  After checking out the repo, run `bundle install` to install dependencies.
584
595
 
585
- After checking out the repo, run `bundle install` to install dependencies.
586
-
587
596
  To install this gem onto your local machine, run `bundle exec rake install`.
588
597
 
589
598
  ## Contributing
@@ -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 { |key, value| request[key] = value }
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
- register_tool(tool_def, base_url) unless tool_exists?(tool_def['name'])
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"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SwaggerMcpTool
4
- VERSION = '0.1.2'
4
+ VERSION = '0.1.3'
5
5
  end
@@ -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.2
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-08-19 00:00:00.000000000 Z
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.1.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.1.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: 3.2.2
197
+ version: '0'
211
198
  required_rubygems_version: !ruby/object:Gem::Requirement
212
199
  requirements:
213
200
  - - ">="