universal-mcp 0.1.12__tar.gz → 0.1.13rc2__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.
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/.gitignore +4 -1
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/PKG-INFO +16 -41
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/README.md +12 -21
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/pyproject.toml +18 -37
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/playground/__main__.py +7 -12
- universal_mcp-0.1.13rc2/src/playground/client.py +388 -0
- universal_mcp-0.1.13rc2/src/playground/streamlit.py +449 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/tests/test_api_generator.py +14 -36
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/tests/test_applications.py +35 -9
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/tests/test_zenquotes.py +1 -1
- universal_mcp-0.1.13rc2/src/universal_mcp/applications/__init__.py +75 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/cli.py +109 -17
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/integrations/__init__.py +1 -1
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/integrations/integration.py +79 -0
- universal_mcp-0.1.13rc2/src/universal_mcp/servers/README.md +79 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/servers/server.py +17 -29
- universal_mcp-0.1.13rc2/src/universal_mcp/stores/README.md +74 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/stores/store.py +0 -2
- universal_mcp-0.1.13rc2/src/universal_mcp/templates/README.md.j2 +93 -0
- universal_mcp-0.1.13rc2/src/universal_mcp/templates/api_client.py.j2 +27 -0
- universal_mcp-0.1.13rc2/src/universal_mcp/tools/README.md +86 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/tools/tools.py +1 -1
- universal_mcp-0.1.13rc2/src/universal_mcp/utils/agentr.py +90 -0
- universal_mcp-0.1.13rc2/src/universal_mcp/utils/api_generator.py +227 -0
- universal_mcp-0.1.13rc2/src/universal_mcp/utils/openapi.py +455 -0
- universal_mcp-0.1.13rc2/src/universal_mcp/utils/singleton.py +23 -0
- universal_mcp-0.1.12/.github/workflows/publish-pypi.yml +0 -37
- universal_mcp-0.1.12/.github/workflows/pull-request-checks.yml +0 -8
- universal_mcp-0.1.12/.github/workflows/shared.yml +0 -54
- universal_mcp-0.1.12/.pre-commit-config.yaml +0 -24
- universal_mcp-0.1.12/.python-version +0 -1
- universal_mcp-0.1.12/CONTRIBUTING.md +0 -78
- universal_mcp-0.1.12/bump_and_release.sh +0 -61
- universal_mcp-0.1.12/local_config.json.example +0 -11
- universal_mcp-0.1.12/src/playground/__init__.py +0 -3
- universal_mcp-0.1.12/src/playground/client.py +0 -288
- universal_mcp-0.1.12/src/playground/service.py +0 -234
- universal_mcp-0.1.12/src/playground/streamlit.py +0 -438
- universal_mcp-0.1.12/src/universal_mcp/applications/__init__.py +0 -31
- universal_mcp-0.1.12/src/universal_mcp/applications/ahrefs/README.md +0 -76
- universal_mcp-0.1.12/src/universal_mcp/applications/ahrefs/app.py +0 -2291
- universal_mcp-0.1.12/src/universal_mcp/applications/cal_com_v2/README.md +0 -175
- universal_mcp-0.1.12/src/universal_mcp/applications/cal_com_v2/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/cal_com_v2/app.py +0 -5390
- universal_mcp-0.1.12/src/universal_mcp/applications/calendly/README.md +0 -78
- universal_mcp-0.1.12/src/universal_mcp/applications/calendly/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/calendly/app.py +0 -1195
- universal_mcp-0.1.12/src/universal_mcp/applications/clickup/README.md +0 -160
- universal_mcp-0.1.12/src/universal_mcp/applications/clickup/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/clickup/app.py +0 -5009
- universal_mcp-0.1.12/src/universal_mcp/applications/coda/README.md +0 -133
- universal_mcp-0.1.12/src/universal_mcp/applications/coda/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/coda/app.py +0 -3671
- universal_mcp-0.1.12/src/universal_mcp/applications/e2b/README.md +0 -37
- universal_mcp-0.1.12/src/universal_mcp/applications/e2b/app.py +0 -65
- universal_mcp-0.1.12/src/universal_mcp/applications/elevenlabs/README.md +0 -84
- universal_mcp-0.1.12/src/universal_mcp/applications/elevenlabs/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/elevenlabs/app.py +0 -1402
- universal_mcp-0.1.12/src/universal_mcp/applications/falai/README.md +0 -42
- universal_mcp-0.1.12/src/universal_mcp/applications/falai/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/falai/app.py +0 -332
- universal_mcp-0.1.12/src/universal_mcp/applications/figma/README.md +0 -74
- universal_mcp-0.1.12/src/universal_mcp/applications/figma/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/figma/app.py +0 -1261
- universal_mcp-0.1.12/src/universal_mcp/applications/firecrawl/README.md +0 -45
- universal_mcp-0.1.12/src/universal_mcp/applications/firecrawl/app.py +0 -268
- universal_mcp-0.1.12/src/universal_mcp/applications/github/README.md +0 -47
- universal_mcp-0.1.12/src/universal_mcp/applications/github/app.py +0 -429
- universal_mcp-0.1.12/src/universal_mcp/applications/gong/README.md +0 -88
- universal_mcp-0.1.12/src/universal_mcp/applications/gong/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/gong/app.py +0 -2297
- universal_mcp-0.1.12/src/universal_mcp/applications/google_calendar/app.py +0 -442
- universal_mcp-0.1.12/src/universal_mcp/applications/google_docs/README.md +0 -40
- universal_mcp-0.1.12/src/universal_mcp/applications/google_docs/app.py +0 -88
- universal_mcp-0.1.12/src/universal_mcp/applications/google_drive/README.md +0 -44
- universal_mcp-0.1.12/src/universal_mcp/applications/google_drive/app.py +0 -286
- universal_mcp-0.1.12/src/universal_mcp/applications/google_mail/README.md +0 -47
- universal_mcp-0.1.12/src/universal_mcp/applications/google_mail/app.py +0 -664
- universal_mcp-0.1.12/src/universal_mcp/applications/google_sheet/README.md +0 -42
- universal_mcp-0.1.12/src/universal_mcp/applications/google_sheet/app.py +0 -150
- universal_mcp-0.1.12/src/universal_mcp/applications/hashnode/app.py +0 -81
- universal_mcp-0.1.12/src/universal_mcp/applications/hashnode/prompt.md +0 -23
- universal_mcp-0.1.12/src/universal_mcp/applications/heygen/README.md +0 -69
- universal_mcp-0.1.12/src/universal_mcp/applications/heygen/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/heygen/app.py +0 -956
- universal_mcp-0.1.12/src/universal_mcp/applications/mailchimp/README.md +0 -306
- universal_mcp-0.1.12/src/universal_mcp/applications/mailchimp/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/mailchimp/app.py +0 -10937
- universal_mcp-0.1.12/src/universal_mcp/applications/markitdown/app.py +0 -44
- universal_mcp-0.1.12/src/universal_mcp/applications/notion/README.md +0 -55
- universal_mcp-0.1.12/src/universal_mcp/applications/notion/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/notion/app.py +0 -527
- universal_mcp-0.1.12/src/universal_mcp/applications/perplexity/README.md +0 -37
- universal_mcp-0.1.12/src/universal_mcp/applications/perplexity/app.py +0 -65
- universal_mcp-0.1.12/src/universal_mcp/applications/reddit/README.md +0 -45
- universal_mcp-0.1.12/src/universal_mcp/applications/reddit/app.py +0 -379
- universal_mcp-0.1.12/src/universal_mcp/applications/replicate/README.md +0 -65
- universal_mcp-0.1.12/src/universal_mcp/applications/replicate/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/replicate/app.py +0 -980
- universal_mcp-0.1.12/src/universal_mcp/applications/resend/README.md +0 -38
- universal_mcp-0.1.12/src/universal_mcp/applications/resend/app.py +0 -37
- universal_mcp-0.1.12/src/universal_mcp/applications/retell_ai/README.md +0 -46
- universal_mcp-0.1.12/src/universal_mcp/applications/retell_ai/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/retell_ai/app.py +0 -333
- universal_mcp-0.1.12/src/universal_mcp/applications/rocketlane/README.md +0 -42
- universal_mcp-0.1.12/src/universal_mcp/applications/rocketlane/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/rocketlane/app.py +0 -194
- universal_mcp-0.1.12/src/universal_mcp/applications/serpapi/README.md +0 -37
- universal_mcp-0.1.12/src/universal_mcp/applications/serpapi/app.py +0 -73
- universal_mcp-0.1.12/src/universal_mcp/applications/spotify/README.md +0 -116
- universal_mcp-0.1.12/src/universal_mcp/applications/spotify/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/spotify/app.py +0 -2526
- universal_mcp-0.1.12/src/universal_mcp/applications/supabase/README.md +0 -112
- universal_mcp-0.1.12/src/universal_mcp/applications/supabase/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/supabase/app.py +0 -2970
- universal_mcp-0.1.12/src/universal_mcp/applications/tavily/README.md +0 -38
- universal_mcp-0.1.12/src/universal_mcp/applications/tavily/app.py +0 -51
- universal_mcp-0.1.12/src/universal_mcp/applications/wrike/README.md +0 -71
- universal_mcp-0.1.12/src/universal_mcp/applications/wrike/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/wrike/app.py +0 -1372
- universal_mcp-0.1.12/src/universal_mcp/applications/youtube/README.md +0 -82
- universal_mcp-0.1.12/src/universal_mcp/applications/youtube/__init__.py +0 -0
- universal_mcp-0.1.12/src/universal_mcp/applications/youtube/app.py +0 -1428
- universal_mcp-0.1.12/src/universal_mcp/applications/zenquotes/README.md +0 -37
- universal_mcp-0.1.12/src/universal_mcp/applications/zenquotes/app.py +0 -31
- universal_mcp-0.1.12/src/universal_mcp/integrations/agentr.py +0 -112
- universal_mcp-0.1.12/src/universal_mcp/utils/api_generator.py +0 -269
- universal_mcp-0.1.12/src/universal_mcp/utils/openapi.py +0 -555
- universal_mcp-0.1.12/uv.lock +0 -3651
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/playground/README.md +0 -0
- {universal_mcp-0.1.12/src/tests → universal_mcp-0.1.13rc2/src/playground}/__init__.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/playground/agents/react.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/playground/memory/__init__.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/playground/memory/sqlite.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/playground/schema.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/playground/settings.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/playground/utils.py +0 -0
- {universal_mcp-0.1.12/src/universal_mcp → universal_mcp-0.1.13rc2/src/tests}/__init__.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/tests/conftest.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/tests/test_api_integration.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/tests/test_localserver.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/tests/test_stores.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/tests/test_tool.py +0 -0
- {universal_mcp-0.1.12/src/universal_mcp/applications/ahrefs → universal_mcp-0.1.13rc2/src/universal_mcp}/__init__.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/analytics.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/applications/application.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/config.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/exceptions.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/integrations/README.md +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/logger.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/py.typed +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/servers/__init__.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/stores/__init__.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/tools/__init__.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/tools/adapters.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/tools/func_metadata.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/utils/__init__.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/utils/docgen.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/utils/docstring_parser.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/utils/dump_app_tools.py +0 -0
- {universal_mcp-0.1.12 → universal_mcp-0.1.13rc2}/src/universal_mcp/utils/installation.py +0 -0
@@ -44,4 +44,7 @@ test_artifacts/
|
|
44
44
|
src/universal_mcp/applications/complex/
|
45
45
|
src/universal_mcp/applications/test/
|
46
46
|
src/universal_mcp/applications/test_with_docs/
|
47
|
-
src/universal_mcp/applications/test_without_docs/
|
47
|
+
src/universal_mcp/applications/test_without_docs/
|
48
|
+
|
49
|
+
# Temporary files
|
50
|
+
tmp/
|
@@ -1,13 +1,14 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: universal-mcp
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.13rc2
|
4
4
|
Summary: Universal MCP acts as a middle ware for your API applications. It can store your credentials, authorize, enable disable apps on the fly and much more.
|
5
5
|
Author-email: Manoj Bajaj <manojbajaj95@gmail.com>
|
6
|
+
License: MIT
|
6
7
|
Requires-Python: >=3.11
|
8
|
+
Requires-Dist: cookiecutter>=2.6.0
|
7
9
|
Requires-Dist: gql[all]>=3.5.2
|
10
|
+
Requires-Dist: jinja2>=3.1.3
|
8
11
|
Requires-Dist: keyring>=25.6.0
|
9
|
-
Requires-Dist: langchain-cerebras>=0.5.0
|
10
|
-
Requires-Dist: langchain-google-genai>=2.1.3
|
11
12
|
Requires-Dist: litellm>=1.30.7
|
12
13
|
Requires-Dist: loguru>=0.7.3
|
13
14
|
Requires-Dist: mcp>=1.6.0
|
@@ -18,17 +19,11 @@ Requires-Dist: pyyaml>=6.0.2
|
|
18
19
|
Requires-Dist: rich>=14.0.0
|
19
20
|
Requires-Dist: typer>=0.15.2
|
20
21
|
Provides-Extra: all
|
21
|
-
Requires-Dist: e2b-code-interpreter>=1.2.0; extra == 'all'
|
22
|
-
Requires-Dist: fal-client>=0.5.9; extra == 'all'
|
23
|
-
Requires-Dist: fastapi[standard]>=0.115.12; extra == 'all'
|
24
|
-
Requires-Dist: firecrawl-py>=1.15.0; extra == 'all'
|
25
|
-
Requires-Dist: google-search-results>=2.4.2; extra == 'all'
|
26
22
|
Requires-Dist: langchain-mcp-adapters>=0.0.3; extra == 'all'
|
27
23
|
Requires-Dist: langchain-openai>=0.3.12; extra == 'all'
|
28
24
|
Requires-Dist: langgraph-checkpoint-sqlite>=2.0.6; extra == 'all'
|
29
25
|
Requires-Dist: langgraph>=0.3.24; extra == 'all'
|
30
26
|
Requires-Dist: litellm>=1.30.7; extra == 'all'
|
31
|
-
Requires-Dist: markitdown[all]>=0.1.1; extra == 'all'
|
32
27
|
Requires-Dist: pyright>=1.1.398; extra == 'all'
|
33
28
|
Requires-Dist: pytest-asyncio>=0.26.0; extra == 'all'
|
34
29
|
Requires-Dist: pytest>=8.3.5; extra == 'all'
|
@@ -42,16 +37,7 @@ Requires-Dist: pyright>=1.1.398; extra == 'dev'
|
|
42
37
|
Requires-Dist: pytest-asyncio>=0.26.0; extra == 'dev'
|
43
38
|
Requires-Dist: pytest>=8.3.5; extra == 'dev'
|
44
39
|
Requires-Dist: ruff>=0.11.4; extra == 'dev'
|
45
|
-
Provides-Extra: e2b
|
46
|
-
Requires-Dist: e2b-code-interpreter>=1.2.0; extra == 'e2b'
|
47
|
-
Provides-Extra: fal-ai
|
48
|
-
Requires-Dist: fal-client>=0.5.9; extra == 'fal-ai'
|
49
|
-
Provides-Extra: firecrawl
|
50
|
-
Requires-Dist: firecrawl-py>=1.15.0; extra == 'firecrawl'
|
51
|
-
Provides-Extra: markitdown
|
52
|
-
Requires-Dist: markitdown[all]>=0.1.1; extra == 'markitdown'
|
53
40
|
Provides-Extra: playground
|
54
|
-
Requires-Dist: fastapi[standard]>=0.115.12; extra == 'playground'
|
55
41
|
Requires-Dist: langchain-mcp-adapters>=0.0.3; extra == 'playground'
|
56
42
|
Requires-Dist: langchain-openai>=0.3.12; extra == 'playground'
|
57
43
|
Requires-Dist: langgraph-checkpoint-sqlite>=2.0.6; extra == 'playground'
|
@@ -59,8 +45,6 @@ Requires-Dist: langgraph>=0.3.24; extra == 'playground'
|
|
59
45
|
Requires-Dist: python-dotenv>=1.0.1; extra == 'playground'
|
60
46
|
Requires-Dist: streamlit>=1.44.1; extra == 'playground'
|
61
47
|
Requires-Dist: watchdog>=6.0.0; extra == 'playground'
|
62
|
-
Provides-Extra: serpapi
|
63
|
-
Requires-Dist: google-search-results>=2.4.2; extra == 'serpapi'
|
64
48
|
Description-Content-Type: text/markdown
|
65
49
|
|
66
50
|
# Universal MCP
|
@@ -73,6 +57,8 @@ Universal MCP acts as a middleware layer for your API applications, enabling sea
|
|
73
57
|
- **Managed Authentication**: Built-in support for API keys and OAuth-based authentication flows
|
74
58
|
- **Extensible Architecture**: Easily build and add new app integrations with minimal boilerplate
|
75
59
|
- **Credential Management**: Flexible storage options for API credentials with memory and environment-based implementations
|
60
|
+
- **Tool Management**: Comprehensive tool registration, validation, and execution capabilities
|
61
|
+
- **Multiple Server Types**: Support for local, AgentR, and single-application server configurations
|
76
62
|
|
77
63
|
## 🔧 Installation
|
78
64
|
|
@@ -170,27 +156,7 @@ python src/playground
|
|
170
156
|
Refer to `src/playground/README.md` for more detailed setup and usage instructions.
|
171
157
|
|
172
158
|
## 🧩 Available Applications
|
173
|
-
|
174
|
-
Universal MCP comes with several pre-built applications:
|
175
|
-
|
176
|
-
| Application Slug | Description | Authentication Type |
|
177
|
-
| :--------------- | :--------------------------------------- | :---------------------------------------- |
|
178
|
-
| `e2b` | Execute Python code in secure sandboxes | API Key (via Integration) |
|
179
|
-
| `firecrawl` | Scrape/crawl web pages, search | API Key (via Integration) |
|
180
|
-
| `github` | Interact with GitHub repos, issues, PRs | OAuth (AgentR) |
|
181
|
-
| `google-calendar`| Manage Google Calendar events | OAuth (AgentR) |
|
182
|
-
| `google-docs` | Create and manage Google Docs documents | OAuth (AgentR) |
|
183
|
-
| `google-drive` | Manage Google Drive files and folders | OAuth (AgentR) |
|
184
|
-
| `google-mail` | Read and send Gmail emails | OAuth (AgentR) |
|
185
|
-
| `google-sheet` | Manage Google Sheets spreadsheets | OAuth (AgentR) |
|
186
|
-
| `markitdown` | Convert web pages/files to Markdown | None |
|
187
|
-
| `notion` | Interact with Notion pages/databases | OAuth (AgentR) |
|
188
|
-
| `perplexity` | Interact with Perplexity AI models | API Key (via Integration) |
|
189
|
-
| `reddit` | Interact with Reddit posts/comments | OAuth (AgentR) |
|
190
|
-
| `resend` | Send emails via Resend API | API Key (via Integration) |
|
191
|
-
| `serpapi` | Perform web searches via SerpApi | API Key (via Integration) |
|
192
|
-
| `tavily` | Advanced web search & research API | API Key (via Integration) |
|
193
|
-
| `zenquotes` | Get inspirational quotes | None |
|
159
|
+
Visit [https://agentr.dev](https://agentr.dev) to check all available applications
|
194
160
|
|
195
161
|
*Authentication Type notes:*
|
196
162
|
* *OAuth (AgentR)*: Typically requires configuring the integration with `type: "agentr"` in your `ServerConfig`. Requires the `AGENTR_API_KEY`.
|
@@ -275,6 +241,15 @@ universal_mcp --version
|
|
275
241
|
- `litellm` (optional, for `docgen` command)
|
276
242
|
- ... and others specific to certain applications.
|
277
243
|
|
244
|
+
## 📚 Documentation
|
245
|
+
|
246
|
+
For more detailed information about specific components:
|
247
|
+
|
248
|
+
- [Tools Documentation](src/universal_mcp/tools/README.md) - Learn about tool management and conversion
|
249
|
+
- [Servers Documentation](src/universal_mcp/servers/README.md) - Understand different server implementations
|
250
|
+
- [Stores Documentation](src/universal_mcp/stores/README.md) - Explore credential storage options
|
251
|
+
- [Integrations Documentation](src/universal_mcp/integrations/README.md) - Learn about authentication methods
|
252
|
+
|
278
253
|
## 📝 License
|
279
254
|
|
280
255
|
This project is licensed under the MIT License.
|
@@ -8,6 +8,8 @@ Universal MCP acts as a middleware layer for your API applications, enabling sea
|
|
8
8
|
- **Managed Authentication**: Built-in support for API keys and OAuth-based authentication flows
|
9
9
|
- **Extensible Architecture**: Easily build and add new app integrations with minimal boilerplate
|
10
10
|
- **Credential Management**: Flexible storage options for API credentials with memory and environment-based implementations
|
11
|
+
- **Tool Management**: Comprehensive tool registration, validation, and execution capabilities
|
12
|
+
- **Multiple Server Types**: Support for local, AgentR, and single-application server configurations
|
11
13
|
|
12
14
|
## 🔧 Installation
|
13
15
|
|
@@ -105,27 +107,7 @@ python src/playground
|
|
105
107
|
Refer to `src/playground/README.md` for more detailed setup and usage instructions.
|
106
108
|
|
107
109
|
## 🧩 Available Applications
|
108
|
-
|
109
|
-
Universal MCP comes with several pre-built applications:
|
110
|
-
|
111
|
-
| Application Slug | Description | Authentication Type |
|
112
|
-
| :--------------- | :--------------------------------------- | :---------------------------------------- |
|
113
|
-
| `e2b` | Execute Python code in secure sandboxes | API Key (via Integration) |
|
114
|
-
| `firecrawl` | Scrape/crawl web pages, search | API Key (via Integration) |
|
115
|
-
| `github` | Interact with GitHub repos, issues, PRs | OAuth (AgentR) |
|
116
|
-
| `google-calendar`| Manage Google Calendar events | OAuth (AgentR) |
|
117
|
-
| `google-docs` | Create and manage Google Docs documents | OAuth (AgentR) |
|
118
|
-
| `google-drive` | Manage Google Drive files and folders | OAuth (AgentR) |
|
119
|
-
| `google-mail` | Read and send Gmail emails | OAuth (AgentR) |
|
120
|
-
| `google-sheet` | Manage Google Sheets spreadsheets | OAuth (AgentR) |
|
121
|
-
| `markitdown` | Convert web pages/files to Markdown | None |
|
122
|
-
| `notion` | Interact with Notion pages/databases | OAuth (AgentR) |
|
123
|
-
| `perplexity` | Interact with Perplexity AI models | API Key (via Integration) |
|
124
|
-
| `reddit` | Interact with Reddit posts/comments | OAuth (AgentR) |
|
125
|
-
| `resend` | Send emails via Resend API | API Key (via Integration) |
|
126
|
-
| `serpapi` | Perform web searches via SerpApi | API Key (via Integration) |
|
127
|
-
| `tavily` | Advanced web search & research API | API Key (via Integration) |
|
128
|
-
| `zenquotes` | Get inspirational quotes | None |
|
110
|
+
Visit [https://agentr.dev](https://agentr.dev) to check all available applications
|
129
111
|
|
130
112
|
*Authentication Type notes:*
|
131
113
|
* *OAuth (AgentR)*: Typically requires configuring the integration with `type: "agentr"` in your `ServerConfig`. Requires the `AGENTR_API_KEY`.
|
@@ -210,6 +192,15 @@ universal_mcp --version
|
|
210
192
|
- `litellm` (optional, for `docgen` command)
|
211
193
|
- ... and others specific to certain applications.
|
212
194
|
|
195
|
+
## 📚 Documentation
|
196
|
+
|
197
|
+
For more detailed information about specific components:
|
198
|
+
|
199
|
+
- [Tools Documentation](src/universal_mcp/tools/README.md) - Learn about tool management and conversion
|
200
|
+
- [Servers Documentation](src/universal_mcp/servers/README.md) - Understand different server implementations
|
201
|
+
- [Stores Documentation](src/universal_mcp/stores/README.md) - Explore credential storage options
|
202
|
+
- [Integrations Documentation](src/universal_mcp/integrations/README.md) - Learn about authentication methods
|
203
|
+
|
213
204
|
## 📝 License
|
214
205
|
|
215
206
|
This project is licensed under the MIT License.
|
@@ -1,12 +1,13 @@
|
|
1
1
|
[project]
|
2
2
|
name = "universal-mcp"
|
3
|
-
version = "0.1.
|
3
|
+
version = "0.1.13-rc2"
|
4
4
|
description = "Universal MCP acts as a middle ware for your API applications. It can store your credentials, authorize, enable disable apps on the fly and much more."
|
5
5
|
readme = "README.md"
|
6
6
|
authors = [
|
7
7
|
{ name = "Manoj Bajaj", email = "manojbajaj95@gmail.com" }
|
8
8
|
]
|
9
9
|
requires-python = ">=3.11"
|
10
|
+
license = { text = "MIT" }
|
10
11
|
dependencies = [
|
11
12
|
"pydantic>=2.11.1",
|
12
13
|
"pydantic-settings>=2.8.1",
|
@@ -19,13 +20,12 @@ dependencies = [
|
|
19
20
|
"posthog>=3.24.0",
|
20
21
|
"mcp>=1.6.0",
|
21
22
|
"gql[all]>=3.5.2",
|
22
|
-
"
|
23
|
-
"
|
23
|
+
"cookiecutter>=2.6.0",
|
24
|
+
"Jinja2>=3.1.3",
|
24
25
|
]
|
25
26
|
|
26
27
|
[project.optional-dependencies]
|
27
28
|
playground = [
|
28
|
-
"fastapi[standard]>=0.115.12",
|
29
29
|
"langchain-mcp-adapters>=0.0.3",
|
30
30
|
"langgraph>=0.3.24",
|
31
31
|
"langgraph-checkpoint-sqlite>=2.0.6",
|
@@ -41,23 +41,8 @@ dev = [
|
|
41
41
|
"pyright>=1.1.398",
|
42
42
|
"litellm>=1.30.7",
|
43
43
|
]
|
44
|
-
e2b = [
|
45
|
-
"e2b-code-interpreter>=1.2.0",
|
46
|
-
]
|
47
|
-
firecrawl=[
|
48
|
-
"firecrawl-py>=1.15.0",
|
49
|
-
]
|
50
|
-
serpapi = [
|
51
|
-
"google-search-results>=2.4.2",
|
52
|
-
]
|
53
|
-
markitdown = [
|
54
|
-
"markitdown[all]>=0.1.1",
|
55
|
-
]
|
56
|
-
fal-ai = [
|
57
|
-
"fal-client>=0.5.9",
|
58
|
-
]
|
59
44
|
all = [
|
60
|
-
|
45
|
+
# Playground dependencies
|
61
46
|
"langchain-mcp-adapters>=0.0.3",
|
62
47
|
"langgraph>=0.3.24",
|
63
48
|
"langgraph-checkpoint-sqlite>=2.0.6",
|
@@ -65,17 +50,14 @@ all = [
|
|
65
50
|
"python-dotenv>=1.0.1",
|
66
51
|
"langchain-openai>=0.3.12",
|
67
52
|
"watchdog>=6.0.0",
|
53
|
+
# Development dependencies
|
68
54
|
"ruff>=0.11.4",
|
69
55
|
"pytest>=8.3.5",
|
70
56
|
"pytest-asyncio>=0.26.0",
|
71
57
|
"pyright>=1.1.398",
|
72
58
|
"litellm>=1.30.7",
|
73
|
-
"e2b-code-interpreter>=1.2.0",
|
74
|
-
"firecrawl-py>=1.15.0",
|
75
|
-
"google-search-results>=2.4.2",
|
76
|
-
"markitdown[all]>=0.1.1",
|
77
|
-
"fal-client>=0.5.9",
|
78
59
|
]
|
60
|
+
|
79
61
|
[project.scripts]
|
80
62
|
universal_mcp = "universal_mcp.cli:app"
|
81
63
|
|
@@ -83,6 +65,17 @@ universal_mcp = "universal_mcp.cli:app"
|
|
83
65
|
requires = ["hatchling"]
|
84
66
|
build-backend = "hatchling.build"
|
85
67
|
|
68
|
+
[tool.hatch.build.targets.sdist]
|
69
|
+
include = [
|
70
|
+
"/src",
|
71
|
+
"/templates", # Important: Include the templates directory!
|
72
|
+
]
|
73
|
+
[tool.hatch.build.targets.wheel]
|
74
|
+
packages = ["src/universal_mcp"]
|
75
|
+
# Ensure templates are included in the wheel data
|
76
|
+
[tool.hatch.build.targets.wheel.shared-data]
|
77
|
+
"templates" = "universal_mcp/templates"
|
78
|
+
|
86
79
|
[tool.ruff]
|
87
80
|
# Exclude a variety of commonly ignored directories.
|
88
81
|
exclude = [
|
@@ -161,18 +154,6 @@ skip-magic-trailing-comma = false
|
|
161
154
|
# Like Black, automatically detect the appropriate line ending.
|
162
155
|
line-ending = "auto"
|
163
156
|
|
164
|
-
# Enable auto-formatting of code examples in docstrings. Markdown,
|
165
|
-
# reStructuredText code/literal blocks and doctests are all supported.
|
166
|
-
#
|
167
|
-
# This is currently disabled by default, but it is planned for this
|
168
|
-
# to be opt-out in the future.
|
169
|
-
docstring-code-format = false
|
170
|
-
|
171
|
-
# Set the line length limit used when formatting code snippets in
|
172
|
-
# docstrings.
|
173
|
-
#
|
174
|
-
# This only has an effect when the `docstring-code-format` setting is
|
175
|
-
# enabled.
|
176
157
|
docstring-code-line-length = "dynamic"
|
177
158
|
|
178
159
|
[tool.pytest.ini_options]
|
@@ -8,19 +8,14 @@ def main():
|
|
8
8
|
processes = []
|
9
9
|
|
10
10
|
# Start MCP server first
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
# Ask the user if they want to run the MCP server
|
12
|
+
run_mcp_server = input("Do you want to run the MCP server? (y/n): ")
|
13
|
+
if run_mcp_server == "y":
|
14
|
+
mcp_process = subprocess.Popen(["universal_mcp", "run", "-c", "local_config.json"])
|
15
|
+
processes.append(mcp_process)
|
16
|
+
time.sleep(6) # Give MCP server time to start
|
17
|
+
logger.info("MCP server started")
|
15
18
|
|
16
|
-
# Start FastAPI app second
|
17
|
-
fastapi_process = subprocess.Popen(
|
18
|
-
["fastapi", "run", "src/playground", "--port", "8003"]
|
19
|
-
)
|
20
|
-
processes.append(fastapi_process)
|
21
|
-
time.sleep(3) # Give FastAPI time to start
|
22
|
-
logger.info("FastAPI app started")
|
23
|
-
# Start Streamlit app last
|
24
19
|
streamlit_process = subprocess.Popen(
|
25
20
|
["streamlit", "run", "src/playground/streamlit.py"]
|
26
21
|
)
|