Skip to content

Commit aa5a337

Browse files
feat(server): add HTTPS support
- Implement OpenSSL-based HTTPS transport protocol - Add SSL certificate and private key file configuration - Update config file structure with HTTPS related options - Optimize server initialization flow to support HTTPS service - todo:fix the Https SSL problems in next release version
1 parent abfee4d commit aa5a337

File tree

176 files changed

+45551
-81
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

176 files changed

+45551
-81
lines changed

CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
1414

1515
include(cmake/PluginCommon.cmake)
1616
include(cmake/CopyIniConfig.cmake)
17+
include(cmake/FindMCPOpenSSL.cmake)
1718
copy_ini_config()
1819

1920
set(PROJECT_VERSION_MAJOR ${${PROJECT_NAME}_VERSION_MAJOR} CACHE STRING "Major version number")
@@ -48,6 +49,8 @@ add_executable(mcp-server++ src/main.cpp)
4849
add_compile_definitions(NOMINMAX)
4950
add_compile_definitions(WIN32_LEAN_AND_MEAN)
5051

52+
include_directories(include)
53+
5154
# header directories
5255
target_include_directories(mcp-server++ PRIVATE
5356
${CMAKE_CURRENT_SOURCE_DIR}/src
@@ -96,6 +99,7 @@ if(UNIX)
9699
mcp_protocol
97100
-Wl,--end-group
98101
mcp_plugin_sdk
102+
MCP::OpenSSL
99103
)
100104
else()
101105
target_link_libraries(mcp-server++ PRIVATE
@@ -104,6 +108,7 @@ else()
104108
mcp_transport
105109
mcp_protocol
106110
mcp_plugin_sdk
111+
MCP::OpenSSL
107112
)
108113
endif()
109114

README.md

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ The server implements the JSON-RPC 2.0 protocol over HTTP transport and supports
3535

3636
## Features
3737

38+
- Full implementation of the Model Communication Protocol (MCP)
39+
- JSON-RPC 2.0 over HTTP/HTTPS transport
40+
- Plugin system for extending functionality
41+
- Built-in tools (echo, file operations, HTTP requests, system commands)
42+
- Streaming responses with Server-Sent Events (SSE)
43+
- Comprehensive logging and error handling
3844
- 🚀 **High Performance**: Built with C++20 and optimized with mimalloc for superior performance
3945
- 🔌 **Plugin System**: Extensible architecture with dynamic plugin loading
4046
- 🌐 **HTTP Transport**: Full HTTP/1.1 support with SSE streaming capabilities
@@ -205,7 +211,7 @@ The server implements the JSON-RPC 2.0 protocol over HTTP. All requests should b
205211

206212
### Example Request
207213

208-
```json
214+
``json
209215
{
210216
"jsonrpc": "2.0",
211217
"id": 1,
@@ -216,7 +222,7 @@ The server implements the JSON-RPC 2.0 protocol over HTTP. All requests should b
216222
217223
### Example Response
218224
219-
```json
225+
``json
220226
{
221227
"jsonrpc": "2.0",
222228
"id": 1,
@@ -282,4 +288,28 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
282288
<div align="center">
283289
<p>Built with ❤️ for the AI community</p>
284290
<p><a href="https://github.com/caomengxuan666/MCPServer.cpp">GitHub</a> | <a href=https://github.com/caomengxuan666/MCPServer.cpp/issues>Issues</a></p>
285-
</div>
291+
</div>
292+
```
293+
294+
## SSL/TLS Support (HTTPS)
295+
296+
MCPServer++ now supports HTTPS connections for secure communication. To enable HTTPS, you need to:
297+
298+
1. Generate SSL certificate and private key files
299+
2. Configure the server to use these files
300+
301+
Example using OpenSSL to generate self-signed certificates:
302+
```bash
303+
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes
304+
```
305+
306+
Then configure the server in the config.ini file:
307+
```ini
308+
[server]
309+
https_enabled = true
310+
https_port = 6667
311+
ssl_cert_file = server.crt
312+
ssl_private_key_file = server.key
313+
```
314+
315+
The server will then listen on both HTTP (port 6666) and HTTPS (port 6667) endpoints, allowing clients to choose their preferred connection method.

README_zh.md

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
## 目录
1717

1818
- [简介](#简介)
19-
- [特性](#特性)
19+
- [功能特性](#功能特性)
2020
- [架构](#架构)
2121
- [快速开始](#快速开始)
2222
- [从源码构建](#从源码构建)
@@ -33,18 +33,37 @@ MCPServer.cpp 是一个使用现代 C++ 编写的高性能、跨平台的模型
3333

3434
该服务器通过 HTTP 传输实现了 JSON-RPC 2.0 协议,并支持常规请求-响应和服务器发送事件(SSE)流式传输,以实现实时通信。
3535

36-
## 特性
36+
## 功能特性
3737

38-
- 🚀 **高性能**: 使用 C++20 构建,并通过 mimalloc 优化性能
39-
- 🔌 **插件系统**: 可扩展的架构,支持动态插件加载
40-
- 🌐 **HTTP 传输**: 完整的 HTTP/1.1 支持,具备 SSE 流式传输能力
41-
- 📦 **JSON-RPC 2.0**: 完整实现了 JSON-RPC 2.0 规范
42-
- 🛠️ **内置工具**: 包含文件操作、HTTP 请求和系统命令
43-
- 🧠 **AI 模型就绪**: 专为 AI 模型集成而设计
44-
- 🔄 **异步 I/O**: 基于 ASIO 实现高效的并发处理
45-
- 📊 **日志**: 使用 spdlog 实现全面的日志记录
46-
- 📈 **可扩展**: 多线程架构,可处理并发请求
47-
- 🌍 **跨平台**: 支持 Windows、Linux 和 macOS
38+
- 完整实现模型通信协议(MCP)
39+
- 基于 HTTP/HTTPS 的 JSON-RPC 2.0 传输协议
40+
- 插件系统,可扩展功能
41+
- 内置工具(echo、文件操作、HTTP请求、系统命令)
42+
- 使用服务器发送事件(SSE)的流式响应
43+
- 全面的日志记录和错误处理
44+
45+
### SSL/TLS 支持(HTTPS)
46+
47+
MCPServer++ 现在支持 HTTPS 连接以实现安全通信。要启用 HTTPS,您需要:
48+
49+
1. 生成 SSL 证书和私钥文件
50+
2. 配置服务器使用这些文件
51+
52+
使用 OpenSSL 生成自签名证书的示例:
53+
```bash
54+
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes
55+
```
56+
57+
然后在 config.ini 文件中配置服务器:
58+
```ini
59+
[server]
60+
https_enabled = true
61+
https_port = 6667
62+
ssl_cert_file = server.crt
63+
ssl_private_key_file = server.key
64+
```
65+
66+
服务器将同时监听 HTTP(端口 6666)和 HTTPS(端口 6667)端点,允许客户端选择其首选的连接方式。
4867

4968
## 架构
5069

@@ -205,7 +224,7 @@ MCPServer.cpp 支持强大的插件系统,允许在不修改核心服务器的
205224

206225
### 请求示例
207226

208-
```json
227+
``json
209228
{
210229
"jsonrpc": "2.0",
211230
"id": 1,
@@ -216,7 +235,7 @@ MCPServer.cpp 支持强大的插件系统,允许在不修改核心服务器的
216235
217236
### 响应示例
218237
219-
```json
238+
``json
220239
{
221240
"jsonrpc": "2.0",
222241
"id": 1,

certs/server.crt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIC5zCCAc+gAwIBAgIBATANBgkqhkiG9w0BAQsFADA3MQswCQYDVQQGEwJVUzEU
3+
MBIGA1UECgwLTUNQU2VydmVyKysxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0yNTA4
4+
MDkwOTQ5MzRaFw0yNjA4MDkwOTQ5MzRaMDcxCzAJBgNVBAYTAlVTMRQwEgYDVQQK
5+
DAtNQ1BTZXJ2ZXIrKzESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0B
6+
AQEFAAOCAQ8AMIIBCgKCAQEAmH3Jy7ghp32KGMAhddwBGS6S0+xavzNArW+jyQSr
7+
A4xDy+CACjQ79mxgqaY4WVbHCPgHlJqJV4i7+w+pQ0EWV5KF/55OdQvf7o4tX6Jn
8+
lxEOD4hTK71xxVAlt8W67n+RUZo0jHoYjV4dMD+kQjstX6xnC/u3vqaKOxa4VREr
9+
t0tg5k6WEsXmFr6bRzvYyx1ycFnkw20ReRi12PFXMJMSE1HwJ9VDxi+cvM7tTndx
10+
mhfsxYdCi6CmaN8WMQOwxYxRP9OejlaomADF/Lu0E29etgaC07adRjMojGaOF7jk
11+
p5aM7AsYyt0HCRbDoYP0OCJsBQ6262aEXYq4rfal528VJwIDAQABMA0GCSqGSIb3
12+
DQEBCwUAA4IBAQCWFeu8no5LQUpX3RybUo25jogg83PYF6sqBLPvlgwBXdS1o9pP
13+
2Re8dL9ZMYWAH0ekfaWB3Uxx4pQxhK/nW9mI3nMnxJuvKq/q4yJY8aws5Njy3RHL
14+
kEmkHly1nio7Y3q35sKJus+s9y4sji/d4gByUFQC8igDZfRT+MaOKMGcv/FnkHA0
15+
q+7ON9pQSKw71a1yB4bs/BhRVcfvNg19GoZIDCvt4ZW7g4hSdWAHv4w182DocVqr
16+
XIBF6/0psal0qLFqEbmRxXWobIpynAFWavlJCmuqnfeQ/uXKl5Zsg/7gDPJKiTOB
17+
5bIRnkVPlTNbVX+09xQcLthfhmW5nPCH1fFF
18+
-----END CERTIFICATE-----

certs/server.key

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCYfcnLuCGnfYoY
3+
wCF13AEZLpLT7Fq/M0Ctb6PJBKsDjEPL4IAKNDv2bGCppjhZVscI+AeUmolXiLv7
4+
D6lDQRZXkoX/nk51C9/uji1fomeXEQ4PiFMrvXHFUCW3xbruf5FRmjSMehiNXh0w
5+
P6RCOy1frGcL+7e+poo7FrhVESu3S2DmTpYSxeYWvptHO9jLHXJwWeTDbRF5GLXY
6+
8VcwkxITUfAn1UPGL5y8zu1Od3GaF+zFh0KLoKZo3xYxA7DFjFE/056OVqiYAMX8
7+
u7QTb162BoLTtp1GMyiMZo4XuOSnlozsCxjK3QcJFsOhg/Q4ImwFDrbrZoRdirit
8+
9qXnbxUnAgMBAAECggEAJfQc3yr3mV/aGLntOg/laBaa7cskdPU1MlWYfsY+KDZn
9+
g11fkOqaSAWGc4MPAFFkXXuaK2bhKxu5qc2mk7ol7Ornlg0ZOvGXLSFO8sARp1xT
10+
0xLbnIXcxL7jfF9m3Mh8a0KFtLcI2FqlyiX05JUlAGyBA08F1xpNSlKn02hgKJDk
11+
aaeIYsTYKUl9Y/YQdH4XIq9Pr0y0B3z02502Cjrm3tq0VFpjbZU1Bey4eF3LPk+f
12+
6UArTwx69DWpvswka0sa4lZy0oR4EFvwuUf+K3RulPzyNM9HbVF6LqeW86DDwiX8
13+
qsurEgDGtw6uNM4nSpEPleQ/dJWDlwZ95dBhmPueLQKBgQDLt4prjL4TZq45386h
14+
1MjoZAHPt4W+7tws9CvXef4gXOV66/dl6Cm5MtS5RrfIx6nGoEkUzo/AuYe/ax/l
15+
2Xouob2fbGbGQySbac6jCVjVbkM3tyRdLoHT11QIesGgAH3XRE7dTcSgJJkgflB9
16+
EXO9kbT16K9Vk9FB7WqY+8j4GwKBgQC/oKloDIVBDpDUM6rDBMK0VSTDbwIJfLdG
17+
jVYs/RsRPx8Cw/crZ/mfOA5tXFhvcwSXrlsuWuSHacoU73dXMzyoE3+sNCFUBFTt
18+
ClV3gF4eOM48u0ISUXMkQaixTZZ7d4nakGp5aI2+8uhjAp0ccQuDAFIc946qMVyJ
19+
yuSnpXe/5QKBgA2uIKSCSg1hete2GNkzQd6hQKHjUB73SV/Xcc5BifhAZMSxbeax
20+
BYRDTpe2kQbxqYwGHYJBMNQfYWdQWU8FILha8jHvhKNRxPaOz2qRaR7EDc2DBfUf
21+
92Xzctgy7ifBgLHhC26/FzIt4v6UnPEZJ+2WCFHvMz8K8yV7PQpS9jb7AoGAZVUw
22+
QDVewehR7eTkh/wcegAMUMyC50FsKYLT7zZo+dXHME8whWOWPPwHpQ0QNt87rnok
23+
/X5TGsh2dFutYA9YJAkrmoR2m1cvEapFR8w5+QFRDgx4A/fOS33tFtVQnjm4TDvS
24+
EiGX00HgYXsgWcntrHie83J1nso7hSIliAGYMYECgYEApNj+6p9FOhkdqL/BRpht
25+
HgkXTkSQuAY5uB7t6OW9bFVSnNZU7rQuNsVdg7sIsRz+TFTWND9s0yzqJ3xR+U8U
26+
k5lm/aVJ9b1ehgHPZlTnKZ/759iatM7AK5y2n9zzDWx3XsFbiUq/gYO15OcoTtZU
27+
2tw+1A0sgz0eO2v9MbSNHm0=
28+
-----END PRIVATE KEY-----

cmake/FindMCPOpenSSL.cmake

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# FindMCPOpenSSL.cmake - Cross-platform OpenSSL resolver with Windows fallback
2+
#
3+
# Behavior:
4+
# 1. First tries system/vcpkg OpenSSL via find_package
5+
# 2. On Windows only, falls back to project-local libraries if not found
6+
# 3. Fails immediately if OpenSSL cannot be resolved
7+
#
8+
# Usage:
9+
# include(FindMCPOpenSSL)
10+
# target_link_libraries(your_target PRIVATE MCP::OpenSSL)
11+
12+
include_guard(GLOBAL)
13+
14+
# --- Phase 1: Primary detection via find_package ---
15+
find_package(OpenSSL QUIET)
16+
17+
if(OPENSSL_FOUND)
18+
message(STATUS "Found system OpenSSL: ${OPENSSL_VERSION}")
19+
add_library(MCP::OpenSSL INTERFACE IMPORTED)
20+
target_link_libraries(MCP::OpenSSL INTERFACE OpenSSL::SSL OpenSSL::Crypto)
21+
return()
22+
endif()
23+
24+
# --- Phase 2: Windows-specific fallback to local libraries ---
25+
if(WIN32 AND NOT OPENSSL_FOUND)
26+
message(STATUS "Using project-local OpenSSL libraries")
27+
28+
# Configure paths based on build type
29+
set(MCP_OPENSSL_ROOT "${CMAKE_SOURCE_DIR}/lib")
30+
31+
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
32+
set(OPENSSL_LIB_DIR "${MCP_OPENSSL_ROOT}/Debug")
33+
else()
34+
set(OPENSSL_LIB_DIR "${MCP_OPENSSL_ROOT}/Release")
35+
endif()
36+
37+
# Verify files exist (both .lib and .dll)
38+
set(REQUIRED_LIBS
39+
"${OPENSSL_LIB_DIR}/libssl.lib"
40+
"${OPENSSL_LIB_DIR}/libcrypto.lib"
41+
)
42+
set(REQUIRED_DLLS
43+
"${OPENSSL_LIB_DIR}/libssl-3-x64.dll"
44+
"${OPENSSL_LIB_DIR}/libcrypto-3-x64.dll"
45+
)
46+
47+
foreach(LIB ${REQUIRED_LIBS})
48+
if(NOT EXISTS ${LIB})
49+
message(FATAL_ERROR "Missing OpenSSL library: ${LIB}")
50+
endif()
51+
endforeach()
52+
53+
foreach(DLL ${REQUIRED_DLLS})
54+
if(NOT EXISTS ${DLL})
55+
message(FATAL_ERROR "Missing OpenSSL DLL: ${DLL}")
56+
endif()
57+
endforeach()
58+
59+
# Create imported target for static linking
60+
add_library(MCP::OpenSSL STATIC IMPORTED)
61+
set_target_properties(MCP::OpenSSL PROPERTIES
62+
IMPORTED_LOCATION "${OPENSSL_LIB_DIR}/libssl.lib"
63+
INTERFACE_LINK_LIBRARIES "${OPENSSL_LIB_DIR}/libcrypto.lib"
64+
INTERFACE_INCLUDE_DIRECTORIES "${MCP_OPENSSL_ROOT}/include"
65+
)
66+
67+
# Copy DLLs to output directory
68+
add_custom_command(TARGET your_target POST_BUILD
69+
COMMAND ${CMAKE_COMMAND} -E copy
70+
${REQUIRED_DLLS}
71+
$<TARGET_FILE_DIR:your_target>
72+
COMMENT "Copying OpenSSL DLLs to output directory"
73+
)
74+
75+
message(STATUS "Using OpenSSL libraries from: ${OPENSSL_LIB_DIR}")
76+
set(OPENSSL_FOUND TRUE)
77+
return()
78+
endif()
79+
80+
# --- Phase 3: Non-Windows systems must have OpenSSL ---
81+
if((UNIX OR APPLE) AND NOT OPENSSL_FOUND)
82+
message(FATAL_ERROR
83+
"OpenSSL is required but not found. Install with:\n"
84+
" Linux: sudo apt install libssl-dev\n"
85+
" macOS: brew install openssl"
86+
)
87+
endif()
88+
89+
# --- Final fallthrough error ---
90+
if(NOT OPENSSL_FOUND)
91+
message(FATAL_ERROR
92+
"OpenSSL setup failed. This is a workflow-critical dependency."
93+
)
94+
endif()

config.ini

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ title=MCP Server Configuration
77
ip=0.0.0.0
88
;Network port for incoming connections
99
port=6666
10+
;HTTP transport port (set to 0 to disable HTTP)
11+
http_port=6666
12+
;HTTPS transport port (set to 0 to disable HTTPS)
13+
https_port=6667
1014
;Logging severity (trace, debug, info, warn, error)
1115
log_level=trace
1216
;Filesystem path for log storage
@@ -20,4 +24,10 @@ plugin_dir=plugins
2024
;Enable stdio transport (1=enable, 0=disable)
2125
enable_stdio=1
2226
;Enable HTTP transport (1=enable, 0=disable)
23-
enable_streamable_http=1
27+
enable_http=1
28+
;Enable HTTPS transport (1=enable, 0=disable)
29+
enable_https=1
30+
;SSL certificate file path (required for HTTPS)
31+
ssl_cert_file=certs/server.crt
32+
;SSL private key file path (required for HTTPS)
33+
ssl_key_file=certs/server.key

0 commit comments

Comments
 (0)