PyStreamMCP 1.0.0__tar.gz → 1.1.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.
- pystreammcp-1.1.2/PKG-INFO +143 -0
- pystreammcp-1.1.2/README.md +77 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/pyproject.toml +5 -5
- pystreammcp-1.1.2/python/PyStreamMCP.egg-info/PKG-INFO +143 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/PyStreamMCP.egg-info/SOURCES.txt +4 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/PyStreamMCP.egg-info/requires.txt +2 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/cli.py +29 -0
- pystreammcp-1.1.2/python/pystreammcp/cli_daemon.py +59 -0
- pystreammcp-1.1.2/python/pystreammcp/cli_dashboard.py +307 -0
- pystreammcp-1.1.2/python/pystreammcp/scripts/__init__.py +0 -0
- pystreammcp-1.1.2/python/pystreammcp/scripts/post_install.py +40 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/setup.py +3 -3
- pystreammcp-1.0.0/PKG-INFO +0 -443
- pystreammcp-1.0.0/README.md +0 -379
- pystreammcp-1.0.0/python/PyStreamMCP.egg-info/PKG-INFO +0 -443
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/LICENSE +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/MANIFEST.in +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/PyStreamMCP.egg-info/dependency_links.txt +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/PyStreamMCP.egg-info/top_level.txt +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/__init__.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/adapters.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/agent.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/api.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/context.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/decomposition.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/discovery.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/integrations/__init__.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/integrations/crewai.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/integrations/haystack.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/integrations/langchain.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/integrations/langsmith.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/integrations/llamaindex.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/integrations/pydantic_ai.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/integrations/semantic_kernel.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/mcp_server.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/ml/__init__.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/ml/relevance.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/ml/tagging.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/ml.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/multi_agent.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/observability/__init__.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/observability/metrics.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/okf_core.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/okf_discovery.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/okf_query_planner.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/optimization/__init__.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/optimization/advanced.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/optimization/decomposition.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/optimization.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/orchestration/__init__.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/orchestration/airflow.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/orchestration/nocode_rpa.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/orchestration/temporal.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/qa/__init__.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/qa/validator.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/quality.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/query.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/server.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/python/pystreammcp/streaming.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/setup.cfg +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/tests/test_langchain_integration.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/tests/test_llamaindex_integration.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/tests/test_okf_core.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/tests/test_okf_discovery.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/tests/test_okf_query_planner.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/tests/test_phase3_advanced.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/tests/test_phase3_items12.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/tests/test_phase3_items345.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/tests/test_sprint1_foundation.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/tests/test_sprint2_langchain.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/tests/test_sprint3_rag_frameworks.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/tests/test_sprint4_agent_frameworks.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/tests/test_sprint5_orchestration.py +0 -0
- {pystreammcp-1.0.0 → pystreammcp-1.1.2}/tests/test_statguardian_integration.py +0 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: PyStreamMCP
|
|
3
|
+
Version: 1.1.2
|
|
4
|
+
Summary: Intelligent MCP orchestration hub - Intent understanding, capability matching, tool ranking with cohesive foundation
|
|
5
|
+
Home-page: https://github.com/Mullassery/PyStreamMCP
|
|
6
|
+
Author: Georgi Mammen Mullassery
|
|
7
|
+
Author-email: Georgi Mammen Mullassery <mullassery@gmail.com>
|
|
8
|
+
License: Proprietary
|
|
9
|
+
Project-URL: Repository, https://github.com/Mullassery/PyStreamMCP
|
|
10
|
+
Project-URL: Issues, https://github.com/Mullassery/PyStreamMCP/issues
|
|
11
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: Other/Proprietary License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Requires-Python: >=3.9
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Requires-Dist: pydantic>=2.0
|
|
24
|
+
Requires-Dist: python-frontmatter>=1.0.0
|
|
25
|
+
Requires-Dist: click>=8.0
|
|
26
|
+
Requires-Dist: rich>=13.0
|
|
27
|
+
Provides-Extra: dev
|
|
28
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
29
|
+
Requires-Dist: pytest-cov>=4.0; extra == "dev"
|
|
30
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
31
|
+
Provides-Extra: api
|
|
32
|
+
Requires-Dist: fastapi>=0.104.0; extra == "api"
|
|
33
|
+
Requires-Dist: uvicorn[standard]>=0.24.0; extra == "api"
|
|
34
|
+
Requires-Dist: pydantic-settings>=2.0; extra == "api"
|
|
35
|
+
Provides-Extra: mcp
|
|
36
|
+
Requires-Dist: mcp>=0.1.0; extra == "mcp"
|
|
37
|
+
Provides-Extra: langchain
|
|
38
|
+
Requires-Dist: langchain>=0.1.0; extra == "langchain"
|
|
39
|
+
Provides-Extra: llamaindex
|
|
40
|
+
Requires-Dist: llama-index>=0.9.0; extra == "llamaindex"
|
|
41
|
+
Provides-Extra: semantic-kernel
|
|
42
|
+
Requires-Dist: semantic-kernel>=0.4.0; extra == "semantic-kernel"
|
|
43
|
+
Provides-Extra: crewai
|
|
44
|
+
Requires-Dist: crewai>=0.1.0; extra == "crewai"
|
|
45
|
+
Provides-Extra: pydantic-ai
|
|
46
|
+
Requires-Dist: pydantic-ai>=0.1.0; extra == "pydantic-ai"
|
|
47
|
+
Provides-Extra: haystack
|
|
48
|
+
Requires-Dist: haystack-ai>=2.0.0; extra == "haystack"
|
|
49
|
+
Provides-Extra: temporal
|
|
50
|
+
Requires-Dist: temporalio>=1.0.0; extra == "temporal"
|
|
51
|
+
Provides-Extra: airflow
|
|
52
|
+
Requires-Dist: apache-airflow>=2.7.0; extra == "airflow"
|
|
53
|
+
Provides-Extra: all-integrations
|
|
54
|
+
Requires-Dist: langchain>=0.1.0; extra == "all-integrations"
|
|
55
|
+
Requires-Dist: llama-index>=0.9.0; extra == "all-integrations"
|
|
56
|
+
Requires-Dist: semantic-kernel>=0.4.0; extra == "all-integrations"
|
|
57
|
+
Requires-Dist: crewai>=0.1.0; extra == "all-integrations"
|
|
58
|
+
Requires-Dist: pydantic-ai>=0.1.0; extra == "all-integrations"
|
|
59
|
+
Requires-Dist: haystack-ai>=2.0.0; extra == "all-integrations"
|
|
60
|
+
Requires-Dist: temporalio>=1.0.0; extra == "all-integrations"
|
|
61
|
+
Requires-Dist: apache-airflow>=2.7.0; extra == "all-integrations"
|
|
62
|
+
Dynamic: author
|
|
63
|
+
Dynamic: home-page
|
|
64
|
+
Dynamic: license-file
|
|
65
|
+
Dynamic: requires-python
|
|
66
|
+
|
|
67
|
+
# PyStreamMCP
|
|
68
|
+
|
|
69
|
+
Two-stage selective intelligence: metadata-first filtering + contextual reranking. 90-95% token reduction. OpenAI-compatible MCP orchestration layer for streaming.
|
|
70
|
+
|
|
71
|
+
**Latest Version:** 1.1.1
|
|
72
|
+
|
|
73
|
+
## Features
|
|
74
|
+
|
|
75
|
+
- ✅ 90-95% token reduction (selective intelligence)
|
|
76
|
+
- ✅ 8+ connected tools with latency tracking
|
|
77
|
+
- ✅ Metadata-first filtering & contextual reranking
|
|
78
|
+
- ✅ Production-ready CLI dashboards
|
|
79
|
+
- ✅ Keyboard shortcuts for quick access
|
|
80
|
+
- ✅ OpenTelemetry support (6 backends)
|
|
81
|
+
|
|
82
|
+
## Installation
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
pip install pystreammcp
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Quick Start
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# Setup shortcuts
|
|
92
|
+
bash scripts/setup_shortcuts.sh
|
|
93
|
+
|
|
94
|
+
# View dashboard
|
|
95
|
+
dash-pystreammcp # Static snapshot
|
|
96
|
+
dash-pystreammcp-live # Live monitoring
|
|
97
|
+
dash-pystreammcp-export # Export metrics
|
|
98
|
+
|
|
99
|
+
# Connect tools
|
|
100
|
+
pystreammcp list-tools
|
|
101
|
+
pystreammcp connect --provider openai
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Dashboard
|
|
105
|
+
|
|
106
|
+
Real-time MCP orchestration metrics:
|
|
107
|
+
- `dash-pystreammcp` - View tool status, selective intelligence stats
|
|
108
|
+
- `dash-pystreammcp-live` - Watch active executions, routing performance
|
|
109
|
+
- `dash-pystreammcp-export` - Export to JSON
|
|
110
|
+
|
|
111
|
+
**Metrics:** Status, Connected Tools (8+), Selective Intelligence Reduction (90-95%), Active Jobs, Routing Performance
|
|
112
|
+
|
|
113
|
+
## OpenTelemetry
|
|
114
|
+
|
|
115
|
+
Export to Prometheus, Datadog, Honeycomb, New Relic, Jaeger, or X-Ray.
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
export OTEL_EXPORTER_OTLP_PROTOCOL=prometheus
|
|
119
|
+
dash-pystreammcp-live
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
See `OTEL_SETUP_GUIDE.md`.
|
|
123
|
+
|
|
124
|
+
## Production Deployment
|
|
125
|
+
|
|
126
|
+
Kubernetes, Docker Compose, and standalone patterns included.
|
|
127
|
+
|
|
128
|
+
See `PRODUCTION_DEPLOYMENT.md`.
|
|
129
|
+
|
|
130
|
+
## Documentation
|
|
131
|
+
|
|
132
|
+
- `DASHBOARD_SHORTCUTS.md` - Keyboard shortcuts
|
|
133
|
+
- `OTEL_SETUP_GUIDE.md` - OpenTelemetry setup
|
|
134
|
+
- `PRODUCTION_DEPLOYMENT.md` - Deployment patterns
|
|
135
|
+
|
|
136
|
+
## Repository
|
|
137
|
+
|
|
138
|
+
- GitHub: https://github.com/Mullassery/PyStreamMCP
|
|
139
|
+
- PyPI: https://pypi.org/project/pystreammcp
|
|
140
|
+
|
|
141
|
+
## License
|
|
142
|
+
|
|
143
|
+
MIT
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# PyStreamMCP
|
|
2
|
+
|
|
3
|
+
Two-stage selective intelligence: metadata-first filtering + contextual reranking. 90-95% token reduction. OpenAI-compatible MCP orchestration layer for streaming.
|
|
4
|
+
|
|
5
|
+
**Latest Version:** 1.1.1
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- ✅ 90-95% token reduction (selective intelligence)
|
|
10
|
+
- ✅ 8+ connected tools with latency tracking
|
|
11
|
+
- ✅ Metadata-first filtering & contextual reranking
|
|
12
|
+
- ✅ Production-ready CLI dashboards
|
|
13
|
+
- ✅ Keyboard shortcuts for quick access
|
|
14
|
+
- ✅ OpenTelemetry support (6 backends)
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
pip install pystreammcp
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Quick Start
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Setup shortcuts
|
|
26
|
+
bash scripts/setup_shortcuts.sh
|
|
27
|
+
|
|
28
|
+
# View dashboard
|
|
29
|
+
dash-pystreammcp # Static snapshot
|
|
30
|
+
dash-pystreammcp-live # Live monitoring
|
|
31
|
+
dash-pystreammcp-export # Export metrics
|
|
32
|
+
|
|
33
|
+
# Connect tools
|
|
34
|
+
pystreammcp list-tools
|
|
35
|
+
pystreammcp connect --provider openai
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Dashboard
|
|
39
|
+
|
|
40
|
+
Real-time MCP orchestration metrics:
|
|
41
|
+
- `dash-pystreammcp` - View tool status, selective intelligence stats
|
|
42
|
+
- `dash-pystreammcp-live` - Watch active executions, routing performance
|
|
43
|
+
- `dash-pystreammcp-export` - Export to JSON
|
|
44
|
+
|
|
45
|
+
**Metrics:** Status, Connected Tools (8+), Selective Intelligence Reduction (90-95%), Active Jobs, Routing Performance
|
|
46
|
+
|
|
47
|
+
## OpenTelemetry
|
|
48
|
+
|
|
49
|
+
Export to Prometheus, Datadog, Honeycomb, New Relic, Jaeger, or X-Ray.
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
export OTEL_EXPORTER_OTLP_PROTOCOL=prometheus
|
|
53
|
+
dash-pystreammcp-live
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
See `OTEL_SETUP_GUIDE.md`.
|
|
57
|
+
|
|
58
|
+
## Production Deployment
|
|
59
|
+
|
|
60
|
+
Kubernetes, Docker Compose, and standalone patterns included.
|
|
61
|
+
|
|
62
|
+
See `PRODUCTION_DEPLOYMENT.md`.
|
|
63
|
+
|
|
64
|
+
## Documentation
|
|
65
|
+
|
|
66
|
+
- `DASHBOARD_SHORTCUTS.md` - Keyboard shortcuts
|
|
67
|
+
- `OTEL_SETUP_GUIDE.md` - OpenTelemetry setup
|
|
68
|
+
- `PRODUCTION_DEPLOYMENT.md` - Deployment patterns
|
|
69
|
+
|
|
70
|
+
## Repository
|
|
71
|
+
|
|
72
|
+
- GitHub: https://github.com/Mullassery/PyStreamMCP
|
|
73
|
+
- PyPI: https://pypi.org/project/pystreammcp
|
|
74
|
+
|
|
75
|
+
## License
|
|
76
|
+
|
|
77
|
+
MIT
|
|
@@ -4,17 +4,17 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "PyStreamMCP"
|
|
7
|
-
version = "1.
|
|
8
|
-
description = "
|
|
7
|
+
version = "1.1.2"
|
|
8
|
+
description = "Intelligent MCP orchestration hub - Intent understanding, capability matching, tool ranking with cohesive foundation"
|
|
9
9
|
readme = "README.md"
|
|
10
|
-
license = { text = "
|
|
10
|
+
license = { text = "Proprietary" }
|
|
11
11
|
authors = [{ name = "Georgi Mammen Mullassery", email = "mullassery@gmail.com" }]
|
|
12
12
|
requires-python = ">=3.9"
|
|
13
|
-
dependencies = ["pydantic>=2.0", "python-frontmatter>=1.0.0"]
|
|
13
|
+
dependencies = ["pydantic>=2.0", "python-frontmatter>=1.0.0", "click>=8.0", "rich>=13.0"]
|
|
14
14
|
classifiers = [
|
|
15
15
|
"Development Status :: 5 - Production/Stable",
|
|
16
16
|
"Intended Audience :: Developers",
|
|
17
|
-
"License ::
|
|
17
|
+
"License :: Other/Proprietary License",
|
|
18
18
|
"Programming Language :: Python :: 3",
|
|
19
19
|
"Programming Language :: Python :: 3.9",
|
|
20
20
|
"Programming Language :: Python :: 3.10",
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: PyStreamMCP
|
|
3
|
+
Version: 1.1.2
|
|
4
|
+
Summary: Intelligent MCP orchestration hub - Intent understanding, capability matching, tool ranking with cohesive foundation
|
|
5
|
+
Home-page: https://github.com/Mullassery/PyStreamMCP
|
|
6
|
+
Author: Georgi Mammen Mullassery
|
|
7
|
+
Author-email: Georgi Mammen Mullassery <mullassery@gmail.com>
|
|
8
|
+
License: Proprietary
|
|
9
|
+
Project-URL: Repository, https://github.com/Mullassery/PyStreamMCP
|
|
10
|
+
Project-URL: Issues, https://github.com/Mullassery/PyStreamMCP/issues
|
|
11
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: Other/Proprietary License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Requires-Python: >=3.9
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Requires-Dist: pydantic>=2.0
|
|
24
|
+
Requires-Dist: python-frontmatter>=1.0.0
|
|
25
|
+
Requires-Dist: click>=8.0
|
|
26
|
+
Requires-Dist: rich>=13.0
|
|
27
|
+
Provides-Extra: dev
|
|
28
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
29
|
+
Requires-Dist: pytest-cov>=4.0; extra == "dev"
|
|
30
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
31
|
+
Provides-Extra: api
|
|
32
|
+
Requires-Dist: fastapi>=0.104.0; extra == "api"
|
|
33
|
+
Requires-Dist: uvicorn[standard]>=0.24.0; extra == "api"
|
|
34
|
+
Requires-Dist: pydantic-settings>=2.0; extra == "api"
|
|
35
|
+
Provides-Extra: mcp
|
|
36
|
+
Requires-Dist: mcp>=0.1.0; extra == "mcp"
|
|
37
|
+
Provides-Extra: langchain
|
|
38
|
+
Requires-Dist: langchain>=0.1.0; extra == "langchain"
|
|
39
|
+
Provides-Extra: llamaindex
|
|
40
|
+
Requires-Dist: llama-index>=0.9.0; extra == "llamaindex"
|
|
41
|
+
Provides-Extra: semantic-kernel
|
|
42
|
+
Requires-Dist: semantic-kernel>=0.4.0; extra == "semantic-kernel"
|
|
43
|
+
Provides-Extra: crewai
|
|
44
|
+
Requires-Dist: crewai>=0.1.0; extra == "crewai"
|
|
45
|
+
Provides-Extra: pydantic-ai
|
|
46
|
+
Requires-Dist: pydantic-ai>=0.1.0; extra == "pydantic-ai"
|
|
47
|
+
Provides-Extra: haystack
|
|
48
|
+
Requires-Dist: haystack-ai>=2.0.0; extra == "haystack"
|
|
49
|
+
Provides-Extra: temporal
|
|
50
|
+
Requires-Dist: temporalio>=1.0.0; extra == "temporal"
|
|
51
|
+
Provides-Extra: airflow
|
|
52
|
+
Requires-Dist: apache-airflow>=2.7.0; extra == "airflow"
|
|
53
|
+
Provides-Extra: all-integrations
|
|
54
|
+
Requires-Dist: langchain>=0.1.0; extra == "all-integrations"
|
|
55
|
+
Requires-Dist: llama-index>=0.9.0; extra == "all-integrations"
|
|
56
|
+
Requires-Dist: semantic-kernel>=0.4.0; extra == "all-integrations"
|
|
57
|
+
Requires-Dist: crewai>=0.1.0; extra == "all-integrations"
|
|
58
|
+
Requires-Dist: pydantic-ai>=0.1.0; extra == "all-integrations"
|
|
59
|
+
Requires-Dist: haystack-ai>=2.0.0; extra == "all-integrations"
|
|
60
|
+
Requires-Dist: temporalio>=1.0.0; extra == "all-integrations"
|
|
61
|
+
Requires-Dist: apache-airflow>=2.7.0; extra == "all-integrations"
|
|
62
|
+
Dynamic: author
|
|
63
|
+
Dynamic: home-page
|
|
64
|
+
Dynamic: license-file
|
|
65
|
+
Dynamic: requires-python
|
|
66
|
+
|
|
67
|
+
# PyStreamMCP
|
|
68
|
+
|
|
69
|
+
Two-stage selective intelligence: metadata-first filtering + contextual reranking. 90-95% token reduction. OpenAI-compatible MCP orchestration layer for streaming.
|
|
70
|
+
|
|
71
|
+
**Latest Version:** 1.1.1
|
|
72
|
+
|
|
73
|
+
## Features
|
|
74
|
+
|
|
75
|
+
- ✅ 90-95% token reduction (selective intelligence)
|
|
76
|
+
- ✅ 8+ connected tools with latency tracking
|
|
77
|
+
- ✅ Metadata-first filtering & contextual reranking
|
|
78
|
+
- ✅ Production-ready CLI dashboards
|
|
79
|
+
- ✅ Keyboard shortcuts for quick access
|
|
80
|
+
- ✅ OpenTelemetry support (6 backends)
|
|
81
|
+
|
|
82
|
+
## Installation
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
pip install pystreammcp
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Quick Start
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# Setup shortcuts
|
|
92
|
+
bash scripts/setup_shortcuts.sh
|
|
93
|
+
|
|
94
|
+
# View dashboard
|
|
95
|
+
dash-pystreammcp # Static snapshot
|
|
96
|
+
dash-pystreammcp-live # Live monitoring
|
|
97
|
+
dash-pystreammcp-export # Export metrics
|
|
98
|
+
|
|
99
|
+
# Connect tools
|
|
100
|
+
pystreammcp list-tools
|
|
101
|
+
pystreammcp connect --provider openai
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Dashboard
|
|
105
|
+
|
|
106
|
+
Real-time MCP orchestration metrics:
|
|
107
|
+
- `dash-pystreammcp` - View tool status, selective intelligence stats
|
|
108
|
+
- `dash-pystreammcp-live` - Watch active executions, routing performance
|
|
109
|
+
- `dash-pystreammcp-export` - Export to JSON
|
|
110
|
+
|
|
111
|
+
**Metrics:** Status, Connected Tools (8+), Selective Intelligence Reduction (90-95%), Active Jobs, Routing Performance
|
|
112
|
+
|
|
113
|
+
## OpenTelemetry
|
|
114
|
+
|
|
115
|
+
Export to Prometheus, Datadog, Honeycomb, New Relic, Jaeger, or X-Ray.
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
export OTEL_EXPORTER_OTLP_PROTOCOL=prometheus
|
|
119
|
+
dash-pystreammcp-live
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
See `OTEL_SETUP_GUIDE.md`.
|
|
123
|
+
|
|
124
|
+
## Production Deployment
|
|
125
|
+
|
|
126
|
+
Kubernetes, Docker Compose, and standalone patterns included.
|
|
127
|
+
|
|
128
|
+
See `PRODUCTION_DEPLOYMENT.md`.
|
|
129
|
+
|
|
130
|
+
## Documentation
|
|
131
|
+
|
|
132
|
+
- `DASHBOARD_SHORTCUTS.md` - Keyboard shortcuts
|
|
133
|
+
- `OTEL_SETUP_GUIDE.md` - OpenTelemetry setup
|
|
134
|
+
- `PRODUCTION_DEPLOYMENT.md` - Deployment patterns
|
|
135
|
+
|
|
136
|
+
## Repository
|
|
137
|
+
|
|
138
|
+
- GitHub: https://github.com/Mullassery/PyStreamMCP
|
|
139
|
+
- PyPI: https://pypi.org/project/pystreammcp
|
|
140
|
+
|
|
141
|
+
## License
|
|
142
|
+
|
|
143
|
+
MIT
|
|
@@ -13,6 +13,8 @@ python/pystreammcp/adapters.py
|
|
|
13
13
|
python/pystreammcp/agent.py
|
|
14
14
|
python/pystreammcp/api.py
|
|
15
15
|
python/pystreammcp/cli.py
|
|
16
|
+
python/pystreammcp/cli_daemon.py
|
|
17
|
+
python/pystreammcp/cli_dashboard.py
|
|
16
18
|
python/pystreammcp/context.py
|
|
17
19
|
python/pystreammcp/decomposition.py
|
|
18
20
|
python/pystreammcp/discovery.py
|
|
@@ -49,6 +51,8 @@ python/pystreammcp/orchestration/nocode_rpa.py
|
|
|
49
51
|
python/pystreammcp/orchestration/temporal.py
|
|
50
52
|
python/pystreammcp/qa/__init__.py
|
|
51
53
|
python/pystreammcp/qa/validator.py
|
|
54
|
+
python/pystreammcp/scripts/__init__.py
|
|
55
|
+
python/pystreammcp/scripts/post_install.py
|
|
52
56
|
tests/test_langchain_integration.py
|
|
53
57
|
tests/test_llamaindex_integration.py
|
|
54
58
|
tests/test_okf_core.py
|
|
@@ -7,6 +7,7 @@ import click
|
|
|
7
7
|
|
|
8
8
|
from pystreammcp import Agent, __version__
|
|
9
9
|
from pystreammcp.api import PyStreamMCPAPI
|
|
10
|
+
from pystreammcp.cli_dashboard import PyStreamMCPDashboard
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
@click.group()
|
|
@@ -67,6 +68,34 @@ def version():
|
|
|
67
68
|
click.echo(f"PyStreamMCP v{__version__}")
|
|
68
69
|
|
|
69
70
|
|
|
71
|
+
@cli.command()
|
|
72
|
+
@click.option("--static", is_flag=True, help="Show static snapshot (non-interactive)")
|
|
73
|
+
@click.option("--alerts", is_flag=True, help="Show alerts only")
|
|
74
|
+
@click.option("--recommendations", is_flag=True, help="Show recommendations only")
|
|
75
|
+
@click.option("--export", type=str, metavar="FILE", help="Export metrics to JSON file")
|
|
76
|
+
@click.option("--config", type=str, metavar="PATH", help="Path to config file")
|
|
77
|
+
def dashboard(static: bool, alerts: bool, recommendations: bool, export: str, config: str):
|
|
78
|
+
"""View real-time orchestration dashboard."""
|
|
79
|
+
try:
|
|
80
|
+
dash = PyStreamMCPDashboard(config_path=config)
|
|
81
|
+
|
|
82
|
+
if export:
|
|
83
|
+
dash.export_json(export)
|
|
84
|
+
elif alerts:
|
|
85
|
+
dash.show_alerts()
|
|
86
|
+
elif recommendations:
|
|
87
|
+
dash.show_recommendations()
|
|
88
|
+
else:
|
|
89
|
+
dash.run_dashboard(interactive=not static)
|
|
90
|
+
|
|
91
|
+
except KeyboardInterrupt:
|
|
92
|
+
click.echo("\n\nDashboard stopped.")
|
|
93
|
+
sys.exit(0)
|
|
94
|
+
except Exception as e:
|
|
95
|
+
click.echo(f"Error: {e}", err=True)
|
|
96
|
+
sys.exit(1)
|
|
97
|
+
|
|
98
|
+
|
|
70
99
|
# Legacy CLI interface for compatibility
|
|
71
100
|
class CLIInterface:
|
|
72
101
|
"""Command-line interface for PyStreamMCP (legacy)."""
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""Dashboard daemon - runs in background, restarts on close"""
|
|
2
|
+
|
|
3
|
+
import subprocess
|
|
4
|
+
import time
|
|
5
|
+
import signal
|
|
6
|
+
import sys
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
class DashboardDaemon:
|
|
10
|
+
def __init__(self, package_name: str, dashboard_cmd: str):
|
|
11
|
+
self.package_name = package_name
|
|
12
|
+
self.dashboard_cmd = dashboard_cmd
|
|
13
|
+
self.process = None
|
|
14
|
+
self.running = True
|
|
15
|
+
|
|
16
|
+
def start(self):
|
|
17
|
+
"""Start dashboard daemon - restarts if closed"""
|
|
18
|
+
signal.signal(signal.SIGINT, self._handle_interrupt)
|
|
19
|
+
|
|
20
|
+
while self.running:
|
|
21
|
+
try:
|
|
22
|
+
print(f"\n📊 Starting {self.package_name} dashboard daemon...")
|
|
23
|
+
print(f" (Press Ctrl+C to close, use keyboard shortcuts to restore)\n")
|
|
24
|
+
|
|
25
|
+
self.process = subprocess.Popen(
|
|
26
|
+
self.dashboard_cmd,
|
|
27
|
+
shell=True,
|
|
28
|
+
stdout=subprocess.PIPE,
|
|
29
|
+
stderr=subprocess.PIPE
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# Wait for process to complete
|
|
33
|
+
self.process.wait()
|
|
34
|
+
|
|
35
|
+
if self.running:
|
|
36
|
+
print(f"\n⚠️ Dashboard closed. Restarting in 2s... (Ctrl+C to stop)")
|
|
37
|
+
time.sleep(2)
|
|
38
|
+
|
|
39
|
+
except KeyboardInterrupt:
|
|
40
|
+
print("\n✅ Dashboard daemon stopped.")
|
|
41
|
+
self.running = False
|
|
42
|
+
except Exception as e:
|
|
43
|
+
print(f"❌ Error: {e}")
|
|
44
|
+
if self.running:
|
|
45
|
+
time.sleep(2)
|
|
46
|
+
|
|
47
|
+
def _handle_interrupt(self, signum, frame):
|
|
48
|
+
self.running = False
|
|
49
|
+
if self.process:
|
|
50
|
+
self.process.terminate()
|
|
51
|
+
sys.exit(0)
|
|
52
|
+
|
|
53
|
+
def start_persistent_dashboard(package_name: str, cmd: str = None):
|
|
54
|
+
"""Start dashboard that persists across terminal sessions"""
|
|
55
|
+
if cmd is None:
|
|
56
|
+
cmd = f"{package_name.lower()} dashboard"
|
|
57
|
+
|
|
58
|
+
daemon = DashboardDaemon(package_name, cmd)
|
|
59
|
+
daemon.start()
|