33
44Exposes PraisonAI capabilities as an MCP server that any MCP client can connect to.
55
6+ MCP Protocol Version: 2025-11-25
7+
68Supports:
79- STDIO transport (default, for Claude Desktop, Cursor, etc.)
8- - HTTP Stream transport (MCP 2025-03-26 spec)
10+ - HTTP Stream transport (MCP 2025-11-25 spec)
11+ - Recipe-to-MCP server bridge
12+ - Tasks API (experimental)
13+ - Elicitation (form and URL modes)
14+ - OAuth 2.1 / OpenID Connect authentication
15+ - Icons and rich metadata
916
1017Usage:
1118 # STDIO mode (for Claude Desktop config)
1421 # HTTP Stream mode
1522 praisonai mcp serve --transport http-stream --port 8080
1623
24+ # Serve a recipe as MCP server
25+ praisonai mcp serve-recipe support-reply --transport stdio
26+
1727 # Programmatic usage
18- from praisonai.mcp_server import MCPServer
28+ from praisonai.mcp_server import MCPServer, RecipeMCPAdapter
1929
2030 server = MCPServer()
2131 server.run(transport="stdio")
32+
33+ # Recipe as MCP server
34+ adapter = RecipeMCPAdapter("support-reply")
35+ adapter.load()
36+ server = adapter.to_mcp_server()
37+ server.run(transport="stdio")
2238"""
2339
2440__all__ = [
41+ # Core server
2542 "MCPServer" ,
2643 "MCPToolRegistry" ,
2744 "MCPResourceRegistry" ,
2845 "MCPPromptRegistry" ,
2946 "register_tool" ,
3047 "register_resource" ,
3148 "register_prompt" ,
49+ # Recipe adapter
50+ "RecipeMCPAdapter" ,
51+ "RecipeMCPConfig" ,
52+ "create_recipe_mcp_server" ,
53+ # Tasks API
54+ "TaskManager" ,
55+ "TaskStore" ,
56+ "Task" ,
57+ "TaskState" ,
58+ # Elicitation
59+ "ElicitationHandler" ,
60+ "ElicitationRequest" ,
61+ "ElicitationResult" ,
62+ # Sampling
63+ "SamplingHandler" ,
64+ "SamplingRequest" ,
65+ "SamplingResponse" ,
66+ # Icons
67+ "IconMetadata" ,
68+ "RichMetadata" ,
3269]
3370
3471
3572def __getattr__ (name ):
3673 """Lazy load server components."""
74+ # Core server
3775 if name == "MCPServer" :
3876 from .server import MCPServer
3977 return MCPServer
@@ -55,4 +93,60 @@ def __getattr__(name):
5593 elif name == "register_prompt" :
5694 from .registry import register_prompt
5795 return register_prompt
96+
97+ # Recipe adapter
98+ elif name == "RecipeMCPAdapter" :
99+ from .recipe_adapter import RecipeMCPAdapter
100+ return RecipeMCPAdapter
101+ elif name == "RecipeMCPConfig" :
102+ from .recipe_adapter import RecipeMCPConfig
103+ return RecipeMCPConfig
104+ elif name == "create_recipe_mcp_server" :
105+ from .recipe_adapter import create_recipe_mcp_server
106+ return create_recipe_mcp_server
107+
108+ # Tasks API
109+ elif name == "TaskManager" :
110+ from .tasks import TaskManager
111+ return TaskManager
112+ elif name == "TaskStore" :
113+ from .tasks import TaskStore
114+ return TaskStore
115+ elif name == "Task" :
116+ from .tasks import Task
117+ return Task
118+ elif name == "TaskState" :
119+ from .tasks import TaskState
120+ return TaskState
121+
122+ # Elicitation
123+ elif name == "ElicitationHandler" :
124+ from .elicitation import ElicitationHandler
125+ return ElicitationHandler
126+ elif name == "ElicitationRequest" :
127+ from .elicitation import ElicitationRequest
128+ return ElicitationRequest
129+ elif name == "ElicitationResult" :
130+ from .elicitation import ElicitationResult
131+ return ElicitationResult
132+
133+ # Sampling
134+ elif name == "SamplingHandler" :
135+ from .sampling import SamplingHandler
136+ return SamplingHandler
137+ elif name == "SamplingRequest" :
138+ from .sampling import SamplingRequest
139+ return SamplingRequest
140+ elif name == "SamplingResponse" :
141+ from .sampling import SamplingResponse
142+ return SamplingResponse
143+
144+ # Icons
145+ elif name == "IconMetadata" :
146+ from .icons import IconMetadata
147+ return IconMetadata
148+ elif name == "RichMetadata" :
149+ from .icons import RichMetadata
150+ return RichMetadata
151+
58152 raise AttributeError (f"module { __name__ !r} has no attribute { name !r} " )
0 commit comments