Commit f97377fd authored by Lisa (AI Assistant)'s avatar Lisa (AI Assistant)

MCP server: Add dual-mode HTTPS streaming + SSE on same port

- HTTPS by default using existing self-signed certificate
- --plain option for plain HTTP
- Both streaming HTTP (/mcp) and SSE (/sse) on port 8765
- Updated mcporter config to use HTTPS with allowInsecure: true
- Added proper async tool implementations
parent 34f5a7c1
#!/home/share/clawphone/venv/bin/python3
"""
ClawPhone - MCP Server using FastMCP for SSE transport
ClawPhone - MCP Server using FastMCP for both HTTPS streaming and SSE
Supports both transport modes on the same port with HTTPS by default
"""
import os
......@@ -19,9 +20,12 @@ import aiosqlite
import sqlite3
import uuid
import httpx
import uvicorn
# Default paths
DEFAULT_DB_PATH = "/home/lisa/.openclaw/workspace/working/clawphone/queue.db"
DEFAULT_CERT_PATH = "/home/share/clawphone/server.crt"
DEFAULT_KEY_PATH = "/home/share/clawphone/server.key"
DEFAULT_LOG_PATH = "/var/log/clawphone"
DEFAULT_HOST = "0.0.0.0"
DEFAULT_PORT = 8765
......@@ -32,16 +36,20 @@ parser.add_argument("--host", default=None)
parser.add_argument("--port", type=int, default=None)
parser.add_argument("--token", default=None)
parser.add_argument("--db", default=None)
parser.add_argument("--cert", default=None)
parser.add_argument("--key", default=None)
parser.add_argument("--syslog", action="store_true")
parser.add_argument("--log-dir", default=None)
parser.add_argument("--stdio", action="store_true")
parser.add_argument("--http", action="store_true")
parser.add_argument("--plain", action="store_true", help="Use plain HTTP instead of HTTPS")
args = parser.parse_args()
# Config
DB_PATH = args.db or os.getenv("CLAWPHONE_DB", DEFAULT_DB_PATH)
HOST = args.host or os.getenv("CLAWPHONE_HOST", DEFAULT_HOST)
PORT = args.port or int(os.getenv("CLAWPHONE_PORT", str(DEFAULT_PORT)))
CERT_PATH = args.cert or os.getenv("CLAWPHONE_CERT", DEFAULT_CERT_PATH)
KEY_PATH = args.key or os.getenv("CLAWPHONE_KEY", DEFAULT_KEY_PATH)
LOG_DIR = args.log_dir or os.getenv("CLAWPHONE_LOG_DIR", DEFAULT_LOG_PATH)
# Ensure DB directory exists
......@@ -237,17 +245,36 @@ async def main():
logger.info(f"Starting ClawPhone MCP Server on {HOST}:{PORT}")
logger.info("="*60)
logger.info(f" SERVER TOKEN: {API_TOKEN}")
logger.info(f" MODE: {'HTTPS' if not args.plain else 'HTTP'}")
logger.info(f" PORTS: {PORT}")
logger.info(f" ENDPOINTS: /mcp (streaming), /sse (SSE), /messages/ (messages)")
logger.info("="*60)
if args.stdio:
logger.info("Running in stdio mode...")
await mcp.run_stdio_async()
elif args.http:
logger.info("Running in streamable HTTP mode...")
await mcp.run_streamable_http_async()
else:
logger.info("Running in SSE mode...")
await mcp.run_sse_async(mount_path="/mcp")
# Create streamable HTTP app as base
app = mcp.streamable_http_app()
# Get SSE app and add its routes to our app
sse_app = mcp.sse_app()
for route in sse_app.routes:
app.routes.append(route)
logger.info(f"Added {len(sse_app.routes)} SSE routes")
# Run the combined app
config = uvicorn.Config(
app,
host=HOST,
port=PORT,
log_level="info",
ssl_keyfile=KEY_PATH if not args.plain else None,
ssl_certfile=CERT_PATH if not args.plain else None
)
server = uvicorn.Server(config)
await server.serve()
if __name__ == "__main__":
asyncio.run(main())
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment