praisonai-mcp 0.0.2__tar.gz
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.
- praisonai_mcp-0.0.2/PKG-INFO +70 -0
- praisonai_mcp-0.0.2/README.md +47 -0
- praisonai_mcp-0.0.2/praisonai_mcp/__init__.py +26 -0
- praisonai_mcp-0.0.2/praisonai_mcp/__main__.py +38 -0
- praisonai_mcp-0.0.2/praisonai_mcp/_bootstrap.py +35 -0
- praisonai_mcp-0.0.2/praisonai_mcp/_code_bridge.py +28 -0
- praisonai_mcp-0.0.2/praisonai_mcp/_version.py +1 -0
- praisonai_mcp-0.0.2/praisonai_mcp/_wrapper_bridge.py +36 -0
- praisonai_mcp-0.0.2/praisonai_mcp/cli/__init__.py +0 -0
- praisonai_mcp-0.0.2/praisonai_mcp/cli/_configuration.py +27 -0
- praisonai_mcp-0.0.2/praisonai_mcp/cli/app.py +7 -0
- praisonai_mcp-0.0.2/praisonai_mcp/cli/commands/__init__.py +0 -0
- praisonai_mcp-0.0.2/praisonai_mcp/cli/commands/mcp.py +861 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/__init__.py +152 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/adapters/__init__.py +74 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/adapters/agents.py +130 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/adapters/capabilities.py +173 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/adapters/cli_tools.py +626 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/adapters/extended_capabilities.py +467 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/adapters/knowledge.py +93 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/adapters/memory.py +104 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/adapters/prompts.py +306 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/adapters/resources.py +124 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/adapters/tools_bridge.py +280 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/auth/__init__.py +48 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/auth/api_key.py +291 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/auth/oauth.py +461 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/auth/oidc.py +289 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/auth/scopes.py +261 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/cli.py +898 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/elicitation.py +445 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/icons.py +302 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/recipe_adapter.py +576 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/recipe_cli.py +826 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/registry.py +718 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/sampling.py +422 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/server.py +610 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/tasks.py +443 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/tool_index.py +481 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/transports/__init__.py +18 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/transports/http_stream.py +525 -0
- praisonai_mcp-0.0.2/praisonai_mcp/mcp_server/transports/stdio.py +132 -0
- praisonai_mcp-0.0.2/praisonai_mcp.egg-info/PKG-INFO +70 -0
- praisonai_mcp-0.0.2/praisonai_mcp.egg-info/SOURCES.txt +48 -0
- praisonai_mcp-0.0.2/praisonai_mcp.egg-info/dependency_links.txt +1 -0
- praisonai_mcp-0.0.2/praisonai_mcp.egg-info/entry_points.txt +2 -0
- praisonai_mcp-0.0.2/praisonai_mcp.egg-info/requires.txt +15 -0
- praisonai_mcp-0.0.2/praisonai_mcp.egg-info/top_level.txt +1 -0
- praisonai_mcp-0.0.2/pyproject.toml +51 -0
- praisonai_mcp-0.0.2/setup.cfg +4 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: praisonai-mcp
|
|
3
|
+
Version: 0.0.2
|
|
4
|
+
Summary: MCP server hosting for PraisonAI — expose agents and tools to Cursor, Claude Desktop, and other MCP clients.
|
|
5
|
+
Author: Mervin Praison
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://docs.praison.ai
|
|
8
|
+
Project-URL: Repository, https://github.com/mervinpraison/PraisonAI
|
|
9
|
+
Requires-Python: <3.15,>=3.10
|
|
10
|
+
Description-Content-Type: text/markdown
|
|
11
|
+
Requires-Dist: praisonaiagents>=1.6.126
|
|
12
|
+
Requires-Dist: mcp>=1.20.0
|
|
13
|
+
Requires-Dist: rich>=13.7
|
|
14
|
+
Requires-Dist: typer>=0.12.0
|
|
15
|
+
Requires-Dist: click>=8.4.2
|
|
16
|
+
Provides-Extra: server
|
|
17
|
+
Requires-Dist: starlette>=0.36.0; extra == "server"
|
|
18
|
+
Requires-Dist: uvicorn>=0.27.0; extra == "server"
|
|
19
|
+
Provides-Extra: auth
|
|
20
|
+
Requires-Dist: httpx>=0.27.0; extra == "auth"
|
|
21
|
+
Provides-Extra: all
|
|
22
|
+
Requires-Dist: praisonai-mcp[auth,server]; extra == "all"
|
|
23
|
+
|
|
24
|
+
# PraisonAI MCP
|
|
25
|
+
|
|
26
|
+
Host PraisonAI agents and tools as an [MCP](https://modelcontextprotocol.io) server for Cursor, Claude Desktop, and other MCP clients.
|
|
27
|
+
|
|
28
|
+
## Install
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pip install "praisonai-mcp[all]"
|
|
32
|
+
|
|
33
|
+
# Or via the umbrella product
|
|
34
|
+
pip install "praisonai[mcp]"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Quickstart
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
export OPENAI_API_KEY=sk-...
|
|
41
|
+
# Standalone heavy host (full argparse options)
|
|
42
|
+
praisonai-mcp serve --transport stdio
|
|
43
|
+
praisonai-mcp list-tools
|
|
44
|
+
praisonai-mcp doctor
|
|
45
|
+
|
|
46
|
+
# Via umbrella CLI (same host commands on `praisonai mcp …`)
|
|
47
|
+
praisonai mcp serve --transport stdio
|
|
48
|
+
praisonai mcp list-tools
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Config management (`list`, `add`, `sync`, `tools`, …) works on both `praisonai-mcp` and `praisonai mcp`.
|
|
52
|
+
Full capability registry requires `praisonai` co-install (`_wrapper_bridge`).
|
|
53
|
+
|
|
54
|
+
## Three MCP layers (do not conflate)
|
|
55
|
+
|
|
56
|
+
| Layer | Package | Role |
|
|
57
|
+
|-------|---------|------|
|
|
58
|
+
| Client | `praisonaiagents[mcp]` | Connect agents to external MCP servers |
|
|
59
|
+
| Light server | `praisonai-code` (`praisonai serve mcp`) | Basic `ToolsMCPServer` |
|
|
60
|
+
| Heavy host | `praisonai-mcp` (this package) | Full capability/recipe MCP server |
|
|
61
|
+
|
|
62
|
+
## Stack
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
praisonaiagents (MCP client protocols)
|
|
66
|
+
└── praisonai-mcp (this package)
|
|
67
|
+
└── praisonai (wrapper shims: praisonai.mcp_server.*)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Boundary details: `src/praisonai/tests/PRAISONAI_MCP_MANIFEST.md`.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# PraisonAI MCP
|
|
2
|
+
|
|
3
|
+
Host PraisonAI agents and tools as an [MCP](https://modelcontextprotocol.io) server for Cursor, Claude Desktop, and other MCP clients.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install "praisonai-mcp[all]"
|
|
9
|
+
|
|
10
|
+
# Or via the umbrella product
|
|
11
|
+
pip install "praisonai[mcp]"
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Quickstart
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
export OPENAI_API_KEY=sk-...
|
|
18
|
+
# Standalone heavy host (full argparse options)
|
|
19
|
+
praisonai-mcp serve --transport stdio
|
|
20
|
+
praisonai-mcp list-tools
|
|
21
|
+
praisonai-mcp doctor
|
|
22
|
+
|
|
23
|
+
# Via umbrella CLI (same host commands on `praisonai mcp …`)
|
|
24
|
+
praisonai mcp serve --transport stdio
|
|
25
|
+
praisonai mcp list-tools
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Config management (`list`, `add`, `sync`, `tools`, …) works on both `praisonai-mcp` and `praisonai mcp`.
|
|
29
|
+
Full capability registry requires `praisonai` co-install (`_wrapper_bridge`).
|
|
30
|
+
|
|
31
|
+
## Three MCP layers (do not conflate)
|
|
32
|
+
|
|
33
|
+
| Layer | Package | Role |
|
|
34
|
+
|-------|---------|------|
|
|
35
|
+
| Client | `praisonaiagents[mcp]` | Connect agents to external MCP servers |
|
|
36
|
+
| Light server | `praisonai-code` (`praisonai serve mcp`) | Basic `ToolsMCPServer` |
|
|
37
|
+
| Heavy host | `praisonai-mcp` (this package) | Full capability/recipe MCP server |
|
|
38
|
+
|
|
39
|
+
## Stack
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
praisonaiagents (MCP client protocols)
|
|
43
|
+
└── praisonai-mcp (this package)
|
|
44
|
+
└── praisonai (wrapper shims: praisonai.mcp_server.*)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Boundary details: `src/praisonai/tests/PRAISONAI_MCP_MANIFEST.md`.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""MCP server hosting for PraisonAI — expose agents and tools to MCP clients.
|
|
2
|
+
|
|
3
|
+
Example:
|
|
4
|
+
praisonai-mcp serve --transport stdio
|
|
5
|
+
|
|
6
|
+
from praisonai_mcp.mcp_server import MCPServer
|
|
7
|
+
server = MCPServer()
|
|
8
|
+
server.run(transport="stdio")
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from praisonai_mcp._version import __version__
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def __getattr__(name: str):
|
|
17
|
+
if name == "MCPServer":
|
|
18
|
+
from praisonai_mcp.mcp_server.server import MCPServer
|
|
19
|
+
return MCPServer
|
|
20
|
+
if name == "handle_mcp_command":
|
|
21
|
+
from praisonai_mcp.mcp_server.cli import handle_mcp_command
|
|
22
|
+
return handle_mcp_command
|
|
23
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
__all__ = ["__version__", "MCPServer", "handle_mcp_command"]
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""Console entry: ``praisonai-mcp``."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
# Heavy MCP host commands (MCPServerCLI) — not Typer config subcommands.
|
|
8
|
+
_HOST_COMMANDS = frozenset({
|
|
9
|
+
"serve",
|
|
10
|
+
"serve-recipe",
|
|
11
|
+
"list-tools",
|
|
12
|
+
"list-resources",
|
|
13
|
+
"list-prompts",
|
|
14
|
+
"list-recipes",
|
|
15
|
+
"validate-recipe",
|
|
16
|
+
"inspect-recipe",
|
|
17
|
+
"config-generate",
|
|
18
|
+
"config-generate-recipe",
|
|
19
|
+
"tasks",
|
|
20
|
+
"doctor",
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def main(argv: list[str] | None = None) -> None:
|
|
25
|
+
args = argv if argv is not None else sys.argv[1:]
|
|
26
|
+
if not args:
|
|
27
|
+
args = ["--help"]
|
|
28
|
+
if args[0] in _HOST_COMMANDS:
|
|
29
|
+
from praisonai_mcp.mcp_server.cli import handle_mcp_command
|
|
30
|
+
|
|
31
|
+
raise SystemExit(handle_mcp_command(args))
|
|
32
|
+
from praisonai_mcp.cli.app import app
|
|
33
|
+
|
|
34
|
+
app(args=args, prog_name="praisonai-mcp")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
if __name__ == "__main__":
|
|
38
|
+
main()
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Monorepo bootstrap for ``praisonai_mcp`` and optional ``praisonai_code``."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import sys
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def ensure_praisonai_mcp() -> None:
|
|
10
|
+
try:
|
|
11
|
+
import praisonai_mcp # noqa: F401
|
|
12
|
+
return
|
|
13
|
+
except ImportError:
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
here = Path(__file__).resolve().parents[1]
|
|
17
|
+
if (here / "praisonai_mcp").is_dir():
|
|
18
|
+
root = str(here)
|
|
19
|
+
if root not in sys.path:
|
|
20
|
+
sys.path.insert(0, root)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def ensure_praisonai_code() -> None:
|
|
24
|
+
try:
|
|
25
|
+
import praisonai_code # noqa: F401
|
|
26
|
+
return
|
|
27
|
+
except ImportError:
|
|
28
|
+
pass
|
|
29
|
+
|
|
30
|
+
mcp_src = Path(__file__).resolve().parents[1]
|
|
31
|
+
code_src = mcp_src.parent / "praisonai-code"
|
|
32
|
+
if (code_src / "praisonai_code").is_dir():
|
|
33
|
+
root = str(code_src)
|
|
34
|
+
if root not in sys.path:
|
|
35
|
+
sys.path.insert(0, root)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Lazy access from praisonai-mcp to optional praisonai-code modules."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import importlib
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from praisonai_mcp._bootstrap import ensure_praisonai_code
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def code_available() -> bool:
|
|
12
|
+
ensure_praisonai_code()
|
|
13
|
+
try:
|
|
14
|
+
import praisonai_code # noqa: F401
|
|
15
|
+
return True
|
|
16
|
+
except ImportError:
|
|
17
|
+
return False
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def import_code_module(name: str) -> Any:
|
|
21
|
+
ensure_praisonai_code()
|
|
22
|
+
try:
|
|
23
|
+
return importlib.import_module(name)
|
|
24
|
+
except ImportError as exc:
|
|
25
|
+
raise ImportError(
|
|
26
|
+
f"Optional code module {name!r} requires praisonai-code. "
|
|
27
|
+
"Install with: pip install praisonai-code"
|
|
28
|
+
) from exc
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.0.2"
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""Lazy access from praisonai-mcp to optional praisonai wrapper modules."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import importlib
|
|
6
|
+
from typing import Any, Callable
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def wrapper_available() -> bool:
|
|
10
|
+
try:
|
|
11
|
+
import praisonai # noqa: F401
|
|
12
|
+
return True
|
|
13
|
+
except ImportError:
|
|
14
|
+
return False
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def import_wrapper_module(name: str) -> Any:
|
|
18
|
+
if not wrapper_available():
|
|
19
|
+
raise ImportError(
|
|
20
|
+
f"Optional wrapper module {name!r} requires the praisonai package. "
|
|
21
|
+
"Install with: pip install praisonai"
|
|
22
|
+
)
|
|
23
|
+
return importlib.import_module(name)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def wrapper_callable(module: str, attr: str) -> Callable[..., Any]:
|
|
27
|
+
return getattr(import_wrapper_module(module), attr)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def optional_wrapper_callable(
|
|
31
|
+
module: str, attr: str, default: Callable[..., Any] | None = None
|
|
32
|
+
) -> Callable[..., Any] | None:
|
|
33
|
+
try:
|
|
34
|
+
return wrapper_callable(module, attr)
|
|
35
|
+
except ImportError:
|
|
36
|
+
return default
|
|
File without changes
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""Lazy config helpers from praisonai-code (optional co-install)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from praisonai_mcp._code_bridge import import_code_module
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def get_config_loader():
|
|
9
|
+
fn = import_code_module("praisonai_code.cli.configuration.loader").get_config_loader
|
|
10
|
+
return fn()
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def configuration_schema():
|
|
14
|
+
return import_code_module("praisonai_code.cli.configuration.schema")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def configuration_paths():
|
|
18
|
+
return import_code_module("praisonai_code.cli.configuration.paths")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def configuration_loader_helpers():
|
|
22
|
+
return import_code_module("praisonai_code.cli.configuration.loader")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def get_output_controller():
|
|
26
|
+
fn = import_code_module("praisonai_code.cli.output.console").get_output_controller
|
|
27
|
+
return fn()
|
|
File without changes
|