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 +4 -4
- data/config.ru +1 -1
- data/lib/cf/mcp/cli.rb +1 -1
- data/lib/cf/mcp/server.rb +55 -75
- data/lib/cf/mcp/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ad39a05c699d135149232079a4fde287ad14f7d9e01f4aac4fac7441c21fdfe6
|
|
4
|
+
data.tar.gz: 298af20e5926fe580ba1eef84180a8cb05e319cfb72ea3c3f8cfee475beb106f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6a118fd341152bf21b4252e4f9da09a02f937a56b9cf0c279cfa2d90d52dd7c3737e2de41717f6a10a8757449fc01f7f600686525f465789c1f87590e35012d1
|
|
7
|
+
data.tar.gz: 5b91f27293ef5b9048f826eb549deeae63ce5bf950311927bfc59cd4f63fcbfe0bdc37a9204d7eef20c9b6f97a61981fa62c18eaee0196a71e8573885bdb1833
|
data/config.ru
CHANGED
data/lib/cf/mcp/cli.rb
CHANGED
data/lib/cf/mcp/server.rb
CHANGED
|
@@ -32,62 +32,13 @@ module CF
|
|
|
32
32
|
Tools::GetTopic
|
|
33
33
|
].freeze
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
126
|
-
|
|
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 =
|
|
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"
|
data/lib/cf/mcp/version.rb
CHANGED