cf-mcp 0.12.1 → 0.13.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 30c68992a64d36c8265af4bdcd018dd116c7d2e59479ab1fd83213896028b86d
4
- data.tar.gz: 4a4e5b715cdca959296e1043bf3173a2c4c314a40ab5c1cb76154dd20b823557
3
+ metadata.gz: ad39a05c699d135149232079a4fde287ad14f7d9e01f4aac4fac7441c21fdfe6
4
+ data.tar.gz: 298af20e5926fe580ba1eef84180a8cb05e319cfb72ea3c3f8cfee475beb106f
5
5
  SHA512:
6
- metadata.gz: 1704a19c8b49fb37258b247e5689a15f7ed67a2cce9ff226ee5ac0c4689dbc45b547150d426cc91e15e09a2f36405752f58a98e5b14596e5282dc7b9784c4e15
7
- data.tar.gz: d1c5c7f81871cddb2f0a1bb81b98272b7d3d07a8d7d40bfafd08c338ef2e6b8073d296407ae2dd74575b7ec2738864c1c5bd941408f9f681e373002af363a70d
6
+ metadata.gz: 6a118fd341152bf21b4252e4f9da09a02f937a56b9cf0c279cfa2d90d52dd7c3737e2de41717f6a10a8757449fc01f7f600686525f465789c1f87590e35012d1
7
+ data.tar.gz: 5b91f27293ef5b9048f826eb549deeae63ce5bf950311927bfc59cd4f63fcbfe0bdc37a9204d7eef20c9b6f97a61981fa62c18eaee0196a71e8573885bdb1833
data/config.ru CHANGED
@@ -3,4 +3,4 @@
3
3
  require_relative "lib/cf/mcp"
4
4
 
5
5
  # Build and run the HTTP server with automatic header downloading
6
- run CF::MCP::HTTPServer.build_rack_app(download: true)
6
+ run CF::MCP::Server.build_rack_app(download: true)
data/lib/cf/mcp/cli.rb CHANGED
@@ -110,7 +110,7 @@ module CF
110
110
  port = @options[:port] || 9292
111
111
  host = @options[:host]
112
112
 
113
- app = HTTPServer.build_rack_app(
113
+ app = Server.build_rack_app(
114
114
  root: @options[:root],
115
115
  download: @options[:download]
116
116
  )
data/lib/cf/mcp/server.rb CHANGED
@@ -32,62 +32,13 @@ module CF
32
32
  Tools::GetTopic
33
33
  ].freeze
34
34
 
35
- def initialize(index)
36
- @index = index
37
- @server = ::MCP::Server.new(
38
- name: "cf-mcp",
39
- version: CF::MCP::VERSION,
40
- tools: TOOLS,
41
- resources: build_topic_resources(index)
42
- )
43
- @server.server_context = {index: index}
44
-
45
- # Register handler for reading resource content
46
- @server.resources_read_handler do |params|
47
- handle_resource_read(params, index)
48
- end
49
- end
50
-
51
- private
52
-
53
- def build_topic_resources(index)
54
- index.topics.map do |topic|
55
- ::MCP::Resource.new(
56
- uri: "cf://topics/#{topic.name}",
57
- name: topic.name,
58
- title: topic.name.tr("_", " ").split.map(&:capitalize).join(" "),
59
- description: topic.brief,
60
- mime_type: "text/markdown"
61
- )
62
- end
63
- end
64
-
65
- def handle_resource_read(params, index)
66
- uri = params[:uri]
67
- return [] unless uri&.start_with?("cf://topics/")
68
-
69
- topic_name = uri.sub("cf://topics/", "")
70
- topic = index.find(topic_name)
71
-
72
- return [] unless topic&.type == :topic
73
-
74
- [{
75
- uri: uri,
76
- mimeType: "text/markdown",
77
- text: topic.content
78
- }]
79
- end
80
-
81
- public
82
-
83
- def run_stdio
84
- transport = ::MCP::Server::Transports::StdioTransport.new(@server)
85
- transport.open
86
- end
87
- end
35
+ CORS_HEADERS = {
36
+ "access-control-allow-origin" => "*",
37
+ "access-control-allow-methods" => "GET, POST, DELETE, OPTIONS",
38
+ "access-control-allow-headers" => "Content-Type, Accept, Mcp-Session-Id",
39
+ "access-control-expose-headers" => "Mcp-Session-Id"
40
+ }.freeze
88
41
 
89
- # HTTP server with web interface at root and MCP endpoint at /http
90
- class HTTPServer
91
42
  # Build a rack app with automatic header downloading and indexing
92
43
  # This is the shared entry point for both config.ru and CLI
93
44
  def self.build_rack_app(root: nil, download: false)
@@ -110,25 +61,36 @@ module CF
110
61
 
111
62
  def initialize(index)
112
63
  @index = index
64
+ configuration = ::MCP::Configuration.new(protocol_version: "2024-11-05")
65
+ @server = ::MCP::Server.new(
66
+ name: "cf-mcp",
67
+ configuration:,
68
+ version: CF::MCP::VERSION,
69
+ tools: TOOLS,
70
+ resources: build_topic_resources(index)
71
+ )
72
+ @server.server_context = {index: index}
73
+
74
+ # Register handler for reading resource content
75
+ @server.resources_read_handler do |params|
76
+ handle_resource_read(params, index)
77
+ end
113
78
  end
114
79
 
115
- CORS_HEADERS = {
116
- "access-control-allow-origin" => "*",
117
- "access-control-allow-methods" => "GET, POST, DELETE, OPTIONS",
118
- "access-control-allow-headers" => "Content-Type, Accept, Mcp-Session-Id",
119
- "access-control-expose-headers" => "Mcp-Session-Id"
120
- }.freeze
80
+ def run_stdio
81
+ transport = ::MCP::Server::Transports::StdioTransport.new(@server)
82
+ transport.open
83
+ end
121
84
 
122
85
  def rack_app
123
86
  require "rack"
124
87
 
125
- mcp_server = create_mcp_server
126
- http_transport = ::MCP::Server::Transports::StreamableHTTPTransport.new(mcp_server, stateless: true)
127
- mcp_server.transport = http_transport
88
+ http_transport = ::MCP::Server::Transports::StreamableHTTPTransport.new(@server, stateless: true)
89
+ @server.transport = http_transport
128
90
 
129
91
  landing_page = build_landing_page
130
92
  index = @index
131
- tools = Server::TOOLS
93
+ tools = TOOLS
132
94
  cors_headers = CORS_HEADERS
133
95
 
134
96
  app = ->(env) {
@@ -170,6 +132,34 @@ module CF
170
132
 
171
133
  private
172
134
 
135
+ def build_topic_resources(index)
136
+ index.topics.map do |topic|
137
+ ::MCP::Resource.new(
138
+ uri: "cf://topics/#{topic.name}",
139
+ name: topic.name,
140
+ title: topic.name.tr("_", " ").split.map(&:capitalize).join(" "),
141
+ description: topic.brief,
142
+ mime_type: "text/markdown"
143
+ )
144
+ end
145
+ end
146
+
147
+ def handle_resource_read(params, index)
148
+ uri = params[:uri]
149
+ return [] unless uri&.start_with?("cf://topics/")
150
+
151
+ topic_name = uri.sub("cf://topics/", "")
152
+ topic = index.find(topic_name)
153
+
154
+ return [] unless topic&.type == :topic
155
+
156
+ [{
157
+ uri: uri,
158
+ mimeType: "text/markdown",
159
+ text: topic.content
160
+ }]
161
+ end
162
+
173
163
  def escape_html(text)
174
164
  text.to_s
175
165
  .gsub("&", "&")
@@ -179,16 +169,6 @@ module CF
179
169
  .gsub("'", "'")
180
170
  end
181
171
 
182
- def create_mcp_server
183
- server = ::MCP::Server.new(
184
- name: "cf-mcp",
185
- version: CF::MCP::VERSION,
186
- tools: Server::TOOLS
187
- )
188
- server.server_context = {index: @index}
189
- server
190
- end
191
-
192
172
  def build_landing_page
193
173
  require "erb"
194
174
  require "json"
@@ -2,6 +2,6 @@
2
2
 
3
3
  module CF
4
4
  module MCP
5
- VERSION = "0.12.1"
5
+ VERSION = "0.13.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cf-mcp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.1
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Usewicz