mcp-server-appwrite 0.1.0__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.
- mcp_server_appwrite-0.1.0/.env.example +3 -0
- mcp_server_appwrite-0.1.0/.github/workflows/publish.yml +31 -0
- mcp_server_appwrite-0.1.0/.gitignore +15 -0
- mcp_server_appwrite-0.1.0/.python-version +1 -0
- mcp_server_appwrite-0.1.0/LICENSE +21 -0
- mcp_server_appwrite-0.1.0/PKG-INFO +155 -0
- mcp_server_appwrite-0.1.0/README.md +145 -0
- mcp_server_appwrite-0.1.0/images/claude-desktop-integration.png +0 -0
- mcp_server_appwrite-0.1.0/images/cursor-integration.png +0 -0
- mcp_server_appwrite-0.1.0/pyproject.toml +17 -0
- mcp_server_appwrite-0.1.0/src/mcp_server_appwrite/__init__.py +11 -0
- mcp_server_appwrite-0.1.0/src/mcp_server_appwrite/__main__.py +4 -0
- mcp_server_appwrite-0.1.0/src/mcp_server_appwrite/server.py +105 -0
- mcp_server_appwrite-0.1.0/src/mcp_server_appwrite/service.py +84 -0
- mcp_server_appwrite-0.1.0/src/mcp_server_appwrite/tool_manager.py +21 -0
- mcp_server_appwrite-0.1.0/uv.lock +392 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
name: Publish to PyPI
|
2
|
+
on:
|
3
|
+
release:
|
4
|
+
types: [published]
|
5
|
+
|
6
|
+
jobs:
|
7
|
+
publish:
|
8
|
+
name: Release build and publish
|
9
|
+
runs-on: ubuntu-latest
|
10
|
+
steps:
|
11
|
+
- name: Check out code
|
12
|
+
uses: actions/checkout@v4
|
13
|
+
|
14
|
+
- name: Set up Python
|
15
|
+
uses: actions/setup-python@v5
|
16
|
+
with:
|
17
|
+
python-version: '3.12'
|
18
|
+
|
19
|
+
- name: Install build dependencies
|
20
|
+
run: |
|
21
|
+
python -m pip install --upgrade pip
|
22
|
+
pip install build twine
|
23
|
+
|
24
|
+
- name: Build package
|
25
|
+
run: python -m build
|
26
|
+
|
27
|
+
- name: Publish to PyPI
|
28
|
+
env:
|
29
|
+
TWINE_USERNAME: __token__
|
30
|
+
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
|
31
|
+
run: twine upload dist/*
|
@@ -0,0 +1 @@
|
|
1
|
+
3.13
|
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2025 Christy Jacob
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
1. The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
2. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
@@ -0,0 +1,155 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: mcp-server-appwrite
|
3
|
+
Version: 0.1.0
|
4
|
+
Summary: MCP (Model Context Protocol) server for Appwrite
|
5
|
+
License-File: LICENSE
|
6
|
+
Requires-Python: >=3.12
|
7
|
+
Requires-Dist: appwrite>=7.1.0
|
8
|
+
Requires-Dist: mcp[cli]>=1.3.0
|
9
|
+
Description-Content-Type: text/markdown
|
10
|
+
|
11
|
+
# Appwrite MCP server
|
12
|
+
|
13
|
+
## Overview
|
14
|
+
|
15
|
+
A Model Context Protocol server for interacting with Appwrite's API. This server provides tools to manage databases, users, functions, teams, and more within your Appwrite project.
|
16
|
+
|
17
|
+
Currently the server supports the following tools:
|
18
|
+
|
19
|
+
- [x] Databases
|
20
|
+
- [x] Users
|
21
|
+
- [x] Teams
|
22
|
+
- [x] Messaging
|
23
|
+
- [x] Locale
|
24
|
+
- [x] Avatars
|
25
|
+
- [x] Storage (Beta)
|
26
|
+
- [x] Functions (Beta)
|
27
|
+
|
28
|
+
> Please note that the Storage and Functions tools are currently in beta and methods like createFile and createDeployment are not yet supported.
|
29
|
+
|
30
|
+
## Local Development
|
31
|
+
|
32
|
+
Clone the repository
|
33
|
+
|
34
|
+
```bash
|
35
|
+
git clone https://github.com/appwrite/mcp.git
|
36
|
+
```
|
37
|
+
|
38
|
+
Install `uv`
|
39
|
+
|
40
|
+
```bash
|
41
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
42
|
+
```
|
43
|
+
|
44
|
+
Create virtual environment
|
45
|
+
|
46
|
+
```bash
|
47
|
+
uv venv
|
48
|
+
source .venv/bin/activate
|
49
|
+
```
|
50
|
+
|
51
|
+
## Configuration
|
52
|
+
|
53
|
+
Create a `.env` file in the root directory based on `.env.example`:
|
54
|
+
|
55
|
+
```env
|
56
|
+
APPWRITE_API_KEY=your-api-key
|
57
|
+
APPWRITE_PROJECT_ID=your-project-id
|
58
|
+
APPWRITE_ENDPOINT=your-endpoint # Optional, defaults to https://cloud.appwrite.io/v1
|
59
|
+
```
|
60
|
+
|
61
|
+
Run the server
|
62
|
+
|
63
|
+
```bash
|
64
|
+
uv run -v --directory ./ mcp-server-appwrite
|
65
|
+
```
|
66
|
+
|
67
|
+
### Usage with Claude Desktop
|
68
|
+
|
69
|
+
Add this to your `claude_desktop_config.json`:
|
70
|
+
|
71
|
+
```json
|
72
|
+
"mcpServers": {
|
73
|
+
"appwrite": {
|
74
|
+
"command": "uv",
|
75
|
+
"args": [
|
76
|
+
"run",
|
77
|
+
"--directory",
|
78
|
+
"<path-to-repository>",
|
79
|
+
"mcp-server-appwrite"
|
80
|
+
],
|
81
|
+
"env": {
|
82
|
+
"APPWRITE_PROJECT_ID": "your-project-id",
|
83
|
+
"APPWRITE_API_KEY": "your-api-key",
|
84
|
+
"APPWRITE_ENDPOINT": "your-endpoint" // Optional
|
85
|
+
}
|
86
|
+
}
|
87
|
+
}
|
88
|
+
```
|
89
|
+
|
90
|
+
Upon successful configuration, you should be able to see the server in the list of available servers in Claude Desktop.
|
91
|
+
|
92
|
+

|
93
|
+
|
94
|
+
### Usage with [Zed](https://github.com/zed-industries/zed)
|
95
|
+
|
96
|
+
Add to your Zed settings.json:
|
97
|
+
|
98
|
+
```json
|
99
|
+
"context_servers": {
|
100
|
+
"appwrite": {
|
101
|
+
"command": "uv",
|
102
|
+
"args": [
|
103
|
+
"run",
|
104
|
+
"--directory",
|
105
|
+
"<path-to-repository>",
|
106
|
+
"mcp-server-appwrite"
|
107
|
+
],
|
108
|
+
"env": {
|
109
|
+
"APPWRITE_PROJECT_ID": "your-project-id",
|
110
|
+
"APPWRITE_API_KEY": "your-api-key",
|
111
|
+
"APPWRITE_ENDPOINT": "your-endpoint" // Optional
|
112
|
+
}
|
113
|
+
}
|
114
|
+
}
|
115
|
+
```
|
116
|
+
|
117
|
+
### Usage with [Cursor](https://www.cursor.com/)
|
118
|
+
|
119
|
+
Head to Cursor `Settings > Features > MCP Servers` and click on **Add New MCP Server**. Choose the type as `Command` and add the command below to the **Command** field.
|
120
|
+
|
121
|
+
```bash
|
122
|
+
APPWRITE_PROJECT_ID=your-project-id APPWRITE_API_KEY=your-api-key uv run --directory <path_to_repository> mcp-server-appwrite
|
123
|
+
```
|
124
|
+
|
125
|
+

|
126
|
+
|
127
|
+
## Debugging
|
128
|
+
|
129
|
+
You can use the MCP inspector to debug the server.
|
130
|
+
|
131
|
+
```bash
|
132
|
+
npx @modelcontextprotocol/inspector \
|
133
|
+
uv \
|
134
|
+
--directory . \
|
135
|
+
run mcp-server-appwrite
|
136
|
+
```
|
137
|
+
|
138
|
+
Make sure your `.env` file is properly configured before running the inspector. You can then access the inspector at `http://localhost:5173`.
|
139
|
+
|
140
|
+
## License
|
141
|
+
|
142
|
+
This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository.
|
143
|
+
|
144
|
+
## Todos
|
145
|
+
- Add MCP server to registries
|
146
|
+
- Glama
|
147
|
+
- https://github.com/chatmcp/mcp-directory
|
148
|
+
- https://mcp.so/
|
149
|
+
- https://github.com/punkpeye/awesome-mcp-servers
|
150
|
+
- https://portkey.ai/mcp-servers
|
151
|
+
- https://www.claudemcp.com/servers
|
152
|
+
- Add support for SSE server
|
153
|
+
- Release to PIP
|
154
|
+
- ✅ Add support for env vars
|
155
|
+
- Add suppport for resources
|
@@ -0,0 +1,145 @@
|
|
1
|
+
# Appwrite MCP server
|
2
|
+
|
3
|
+
## Overview
|
4
|
+
|
5
|
+
A Model Context Protocol server for interacting with Appwrite's API. This server provides tools to manage databases, users, functions, teams, and more within your Appwrite project.
|
6
|
+
|
7
|
+
Currently the server supports the following tools:
|
8
|
+
|
9
|
+
- [x] Databases
|
10
|
+
- [x] Users
|
11
|
+
- [x] Teams
|
12
|
+
- [x] Messaging
|
13
|
+
- [x] Locale
|
14
|
+
- [x] Avatars
|
15
|
+
- [x] Storage (Beta)
|
16
|
+
- [x] Functions (Beta)
|
17
|
+
|
18
|
+
> Please note that the Storage and Functions tools are currently in beta and methods like createFile and createDeployment are not yet supported.
|
19
|
+
|
20
|
+
## Local Development
|
21
|
+
|
22
|
+
Clone the repository
|
23
|
+
|
24
|
+
```bash
|
25
|
+
git clone https://github.com/appwrite/mcp.git
|
26
|
+
```
|
27
|
+
|
28
|
+
Install `uv`
|
29
|
+
|
30
|
+
```bash
|
31
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
32
|
+
```
|
33
|
+
|
34
|
+
Create virtual environment
|
35
|
+
|
36
|
+
```bash
|
37
|
+
uv venv
|
38
|
+
source .venv/bin/activate
|
39
|
+
```
|
40
|
+
|
41
|
+
## Configuration
|
42
|
+
|
43
|
+
Create a `.env` file in the root directory based on `.env.example`:
|
44
|
+
|
45
|
+
```env
|
46
|
+
APPWRITE_API_KEY=your-api-key
|
47
|
+
APPWRITE_PROJECT_ID=your-project-id
|
48
|
+
APPWRITE_ENDPOINT=your-endpoint # Optional, defaults to https://cloud.appwrite.io/v1
|
49
|
+
```
|
50
|
+
|
51
|
+
Run the server
|
52
|
+
|
53
|
+
```bash
|
54
|
+
uv run -v --directory ./ mcp-server-appwrite
|
55
|
+
```
|
56
|
+
|
57
|
+
### Usage with Claude Desktop
|
58
|
+
|
59
|
+
Add this to your `claude_desktop_config.json`:
|
60
|
+
|
61
|
+
```json
|
62
|
+
"mcpServers": {
|
63
|
+
"appwrite": {
|
64
|
+
"command": "uv",
|
65
|
+
"args": [
|
66
|
+
"run",
|
67
|
+
"--directory",
|
68
|
+
"<path-to-repository>",
|
69
|
+
"mcp-server-appwrite"
|
70
|
+
],
|
71
|
+
"env": {
|
72
|
+
"APPWRITE_PROJECT_ID": "your-project-id",
|
73
|
+
"APPWRITE_API_KEY": "your-api-key",
|
74
|
+
"APPWRITE_ENDPOINT": "your-endpoint" // Optional
|
75
|
+
}
|
76
|
+
}
|
77
|
+
}
|
78
|
+
```
|
79
|
+
|
80
|
+
Upon successful configuration, you should be able to see the server in the list of available servers in Claude Desktop.
|
81
|
+
|
82
|
+

|
83
|
+
|
84
|
+
### Usage with [Zed](https://github.com/zed-industries/zed)
|
85
|
+
|
86
|
+
Add to your Zed settings.json:
|
87
|
+
|
88
|
+
```json
|
89
|
+
"context_servers": {
|
90
|
+
"appwrite": {
|
91
|
+
"command": "uv",
|
92
|
+
"args": [
|
93
|
+
"run",
|
94
|
+
"--directory",
|
95
|
+
"<path-to-repository>",
|
96
|
+
"mcp-server-appwrite"
|
97
|
+
],
|
98
|
+
"env": {
|
99
|
+
"APPWRITE_PROJECT_ID": "your-project-id",
|
100
|
+
"APPWRITE_API_KEY": "your-api-key",
|
101
|
+
"APPWRITE_ENDPOINT": "your-endpoint" // Optional
|
102
|
+
}
|
103
|
+
}
|
104
|
+
}
|
105
|
+
```
|
106
|
+
|
107
|
+
### Usage with [Cursor](https://www.cursor.com/)
|
108
|
+
|
109
|
+
Head to Cursor `Settings > Features > MCP Servers` and click on **Add New MCP Server**. Choose the type as `Command` and add the command below to the **Command** field.
|
110
|
+
|
111
|
+
```bash
|
112
|
+
APPWRITE_PROJECT_ID=your-project-id APPWRITE_API_KEY=your-api-key uv run --directory <path_to_repository> mcp-server-appwrite
|
113
|
+
```
|
114
|
+
|
115
|
+

|
116
|
+
|
117
|
+
## Debugging
|
118
|
+
|
119
|
+
You can use the MCP inspector to debug the server.
|
120
|
+
|
121
|
+
```bash
|
122
|
+
npx @modelcontextprotocol/inspector \
|
123
|
+
uv \
|
124
|
+
--directory . \
|
125
|
+
run mcp-server-appwrite
|
126
|
+
```
|
127
|
+
|
128
|
+
Make sure your `.env` file is properly configured before running the inspector. You can then access the inspector at `http://localhost:5173`.
|
129
|
+
|
130
|
+
## License
|
131
|
+
|
132
|
+
This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository.
|
133
|
+
|
134
|
+
## Todos
|
135
|
+
- Add MCP server to registries
|
136
|
+
- Glama
|
137
|
+
- https://github.com/chatmcp/mcp-directory
|
138
|
+
- https://mcp.so/
|
139
|
+
- https://github.com/punkpeye/awesome-mcp-servers
|
140
|
+
- https://portkey.ai/mcp-servers
|
141
|
+
- https://www.claudemcp.com/servers
|
142
|
+
- Add support for SSE server
|
143
|
+
- Release to PIP
|
144
|
+
- ✅ Add support for env vars
|
145
|
+
- Add suppport for resources
|
Binary file
|
Binary file
|
@@ -0,0 +1,17 @@
|
|
1
|
+
[project]
|
2
|
+
name = "mcp-server-appwrite"
|
3
|
+
version = "0.1.0"
|
4
|
+
description = "MCP (Model Context Protocol) server for Appwrite"
|
5
|
+
readme = "README.md"
|
6
|
+
requires-python = ">=3.12"
|
7
|
+
dependencies = [
|
8
|
+
"appwrite>=7.1.0",
|
9
|
+
"mcp[cli]>=1.3.0",
|
10
|
+
]
|
11
|
+
|
12
|
+
[project.scripts]
|
13
|
+
mcp-server-appwrite = "mcp_server_appwrite.__main__:main"
|
14
|
+
|
15
|
+
[build-system]
|
16
|
+
requires = ["hatchling"]
|
17
|
+
build-backend = "hatchling.build"
|
@@ -0,0 +1,105 @@
|
|
1
|
+
import asyncio
|
2
|
+
import os
|
3
|
+
import mcp.server.stdio
|
4
|
+
import mcp.types as types
|
5
|
+
from mcp.server import NotificationOptions, Server
|
6
|
+
from mcp.server.models import InitializationOptions
|
7
|
+
from mcp.shared.exceptions import McpError
|
8
|
+
from dotenv import load_dotenv
|
9
|
+
from appwrite.client import Client
|
10
|
+
from appwrite.services.databases import Databases
|
11
|
+
from appwrite.services.users import Users
|
12
|
+
from appwrite.services.teams import Teams
|
13
|
+
from appwrite.services.storage import Storage
|
14
|
+
from appwrite.services.functions import Functions
|
15
|
+
from appwrite.services.locale import Locale
|
16
|
+
from appwrite.services.avatars import Avatars
|
17
|
+
from appwrite.services.messaging import Messaging
|
18
|
+
from appwrite.exception import AppwriteException
|
19
|
+
from .tool_manager import ToolManager
|
20
|
+
from .service import Service
|
21
|
+
|
22
|
+
# Load environment variables from .env file
|
23
|
+
load_dotenv()
|
24
|
+
|
25
|
+
# Get environment variables
|
26
|
+
project_id = os.getenv('APPWRITE_PROJECT_ID')
|
27
|
+
api_key = os.getenv('APPWRITE_API_KEY')
|
28
|
+
endpoint = os.getenv('APPWRITE_ENDPOINT', 'https://cloud.appwrite.io/v1')
|
29
|
+
|
30
|
+
if not project_id or not api_key:
|
31
|
+
raise ValueError("APPWRITE_PROJECT_ID and APPWRITE_API_KEY must be set in environment variables")
|
32
|
+
|
33
|
+
# Initialize Appwrite client
|
34
|
+
client = Client()
|
35
|
+
client.set_endpoint(endpoint)
|
36
|
+
client.set_project(project_id)
|
37
|
+
client.set_key(api_key)
|
38
|
+
|
39
|
+
# Initialize tools manager and register services
|
40
|
+
tools_manager = ToolManager()
|
41
|
+
tools_manager.register_service(Service(Users(client), "users"))
|
42
|
+
tools_manager.register_service(Service(Teams(client), "teams"))
|
43
|
+
tools_manager.register_service(Service(Databases(client), "databases"))
|
44
|
+
tools_manager.register_service(Service(Storage(client), "storage"))
|
45
|
+
tools_manager.register_service(Service(Functions(client), "functions"))
|
46
|
+
tools_manager.register_service(Service(Messaging(client), "messaging"))
|
47
|
+
tools_manager.register_service(Service(Locale(client), "locale"))
|
48
|
+
tools_manager.register_service(Service(Avatars(client), "avatars"))
|
49
|
+
|
50
|
+
async def serve() -> Server:
|
51
|
+
server = Server("Appwrite MCP Server")
|
52
|
+
|
53
|
+
# @server.list_resources()
|
54
|
+
# async def handle_list_resources() -> list[types.Resource]:
|
55
|
+
# return tools_manager.get_all_resources()
|
56
|
+
|
57
|
+
# @server.read_resource()
|
58
|
+
# async def handle_read_resource(resource_id: str) -> str:
|
59
|
+
# return tools_manager.get_resource(resource_id)
|
60
|
+
|
61
|
+
@server.list_tools()
|
62
|
+
async def handle_list_tools() -> list[types.Tool]:
|
63
|
+
return tools_manager.get_all_tools()
|
64
|
+
|
65
|
+
@server.call_tool()
|
66
|
+
async def handle_call_tool(
|
67
|
+
name: str, arguments: dict | None
|
68
|
+
) -> list[types.TextContent | types.ImageContent | types.EmbeddedResource]:
|
69
|
+
|
70
|
+
try:
|
71
|
+
tool_info = tools_manager.get_tool(name)
|
72
|
+
if not tool_info:
|
73
|
+
raise McpError(f"Tool {name} not found")
|
74
|
+
|
75
|
+
bound_method = tool_info["function"]
|
76
|
+
result = bound_method(**(arguments or {}))
|
77
|
+
if hasattr(result, 'to_dict'):
|
78
|
+
result_dict = result.to_dict()
|
79
|
+
return [types.TextContent(type="text", text=str(result_dict))]
|
80
|
+
return [types.TextContent(type="text", text=str(result))]
|
81
|
+
except AppwriteException as e:
|
82
|
+
return [types.TextContent(type="text", text=f"Appwrite Error: {str(e)}")]
|
83
|
+
except Exception as e:
|
84
|
+
return [types.TextContent(type="text", text=f"Error: {str(e)}")]
|
85
|
+
|
86
|
+
return server
|
87
|
+
|
88
|
+
async def _run():
|
89
|
+
async with mcp.server.stdio.stdio_server() as (read_stream, write_stream):
|
90
|
+
server = await serve()
|
91
|
+
await server.run(
|
92
|
+
read_stream,
|
93
|
+
write_stream,
|
94
|
+
InitializationOptions(
|
95
|
+
server_name="appwrite",
|
96
|
+
server_version="0.1.0",
|
97
|
+
capabilities=server.get_capabilities(
|
98
|
+
notification_options=NotificationOptions(),
|
99
|
+
experimental_capabilities={},
|
100
|
+
),
|
101
|
+
),
|
102
|
+
)
|
103
|
+
|
104
|
+
if __name__ == "__main__":
|
105
|
+
asyncio.run(_run())
|
@@ -0,0 +1,84 @@
|
|
1
|
+
from typing import Any, get_type_hints, Dict
|
2
|
+
import inspect
|
3
|
+
from mcp.types import Tool
|
4
|
+
|
5
|
+
class Service():
|
6
|
+
"""Base class for all Appwrite services"""
|
7
|
+
|
8
|
+
def __init__(self, service_instance, service_name: str):
|
9
|
+
self.service = service_instance
|
10
|
+
self.service_name = service_name
|
11
|
+
self._method_name_overrides = self.get_method_name_overrides()
|
12
|
+
|
13
|
+
def get_method_name_overrides(self) -> Dict[str, str]:
|
14
|
+
"""
|
15
|
+
Override this method to provide method name mappings.
|
16
|
+
Returns a dictionary where:
|
17
|
+
- key: original method name
|
18
|
+
- value: new method name to be used
|
19
|
+
"""
|
20
|
+
return {}
|
21
|
+
|
22
|
+
def python_type_to_json_schema(self, py_type: Any) -> dict:
|
23
|
+
"""Converts Python type hints to JSON Schema types."""
|
24
|
+
type_mapping = {
|
25
|
+
str: "string",
|
26
|
+
int: "integer",
|
27
|
+
float: "number",
|
28
|
+
bool: "boolean",
|
29
|
+
list: "array",
|
30
|
+
dict: "object"
|
31
|
+
}
|
32
|
+
return {"type": type_mapping.get(py_type, "string")}
|
33
|
+
|
34
|
+
def list_tools(self) -> Dict[str, Dict]:
|
35
|
+
"""Lists all available tools for this service"""
|
36
|
+
tools = {}
|
37
|
+
|
38
|
+
for name, func in inspect.getmembers(self.service, predicate=inspect.ismethod):
|
39
|
+
if name.startswith('_'): # Skip private methods
|
40
|
+
continue
|
41
|
+
|
42
|
+
original_func = func.__func__
|
43
|
+
|
44
|
+
# Skip if not from the service's module
|
45
|
+
if original_func.__module__ != self.service.__class__.__module__:
|
46
|
+
continue
|
47
|
+
|
48
|
+
# Get the overridden name if it exists
|
49
|
+
tool_name = self._method_name_overrides.get(name, f"{self.service_name}_{name}")
|
50
|
+
|
51
|
+
docstring = (original_func.__doc__ or "No description available").strip()
|
52
|
+
signature = inspect.signature(original_func)
|
53
|
+
type_hints = get_type_hints(original_func)
|
54
|
+
|
55
|
+
properties = {}
|
56
|
+
required = []
|
57
|
+
|
58
|
+
for param_name, param in signature.parameters.items():
|
59
|
+
if param_name == 'self':
|
60
|
+
continue
|
61
|
+
|
62
|
+
param_type = type_hints.get(param_name, str)
|
63
|
+
properties[param_name] = self.python_type_to_json_schema(param_type)
|
64
|
+
properties[param_name]["description"] = f"Parameter '{param_name}'"
|
65
|
+
|
66
|
+
if param.default is param.empty:
|
67
|
+
required.append(param_name)
|
68
|
+
|
69
|
+
tool_definition = Tool(
|
70
|
+
name=tool_name,
|
71
|
+
description=f"{docstring}",
|
72
|
+
inputSchema={
|
73
|
+
"type": "object",
|
74
|
+
"properties": properties,
|
75
|
+
"required": required
|
76
|
+
}
|
77
|
+
)
|
78
|
+
|
79
|
+
tools[tool_name] = {
|
80
|
+
"definition": tool_definition,
|
81
|
+
"function": func
|
82
|
+
}
|
83
|
+
|
84
|
+
return tools
|
@@ -0,0 +1,21 @@
|
|
1
|
+
from typing import List, Dict
|
2
|
+
from mcp.types import Tool
|
3
|
+
from .service import Service
|
4
|
+
|
5
|
+
class ToolManager:
|
6
|
+
def __init__(self):
|
7
|
+
self.services: List[Service] = []
|
8
|
+
self.tools_registry = {}
|
9
|
+
|
10
|
+
def register_service(self, service: Service):
|
11
|
+
"""Register a new service and its tools"""
|
12
|
+
self.services.append(service)
|
13
|
+
self.tools_registry.update(service.list_tools())
|
14
|
+
|
15
|
+
def get_all_tools(self) -> List[Tool]:
|
16
|
+
"""Get all tool definitions"""
|
17
|
+
return [tool_info["definition"] for tool_info in self.tools_registry.values()]
|
18
|
+
|
19
|
+
def get_tool(self, name: str) -> Dict:
|
20
|
+
"""Get a specific tool by name"""
|
21
|
+
return self.tools_registry.get(name)
|
@@ -0,0 +1,392 @@
|
|
1
|
+
version = 1
|
2
|
+
revision = 1
|
3
|
+
requires-python = ">=3.13"
|
4
|
+
|
5
|
+
[[package]]
|
6
|
+
name = "annotated-types"
|
7
|
+
version = "0.7.0"
|
8
|
+
source = { registry = "https://pypi.org/simple" }
|
9
|
+
sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 }
|
10
|
+
wheels = [
|
11
|
+
{ url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 },
|
12
|
+
]
|
13
|
+
|
14
|
+
[[package]]
|
15
|
+
name = "anyio"
|
16
|
+
version = "4.8.0"
|
17
|
+
source = { registry = "https://pypi.org/simple" }
|
18
|
+
dependencies = [
|
19
|
+
{ name = "idna" },
|
20
|
+
{ name = "sniffio" },
|
21
|
+
]
|
22
|
+
sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 }
|
23
|
+
wheels = [
|
24
|
+
{ url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 },
|
25
|
+
]
|
26
|
+
|
27
|
+
[[package]]
|
28
|
+
name = "appwrite"
|
29
|
+
version = "7.1.0"
|
30
|
+
source = { registry = "https://pypi.org/simple" }
|
31
|
+
dependencies = [
|
32
|
+
{ name = "requests" },
|
33
|
+
]
|
34
|
+
sdist = { url = "https://files.pythonhosted.org/packages/9b/db/233d6ce6bb5c4621b77edbd631b80002eae30e63a46a5aa0bfa8710fa2db/appwrite-7.1.0.tar.gz", hash = "sha256:9d4f90398886b91dae2b70e2652c24d1b94705c0664c182feead5c3778e05ebc", size = 27096 }
|
35
|
+
wheels = [
|
36
|
+
{ url = "https://files.pythonhosted.org/packages/1c/e3/b51c4fcfe67bc941a2bc7980ab5efe34c59e6e3b89429cc2e3ae66731a3c/appwrite-7.1.0-py3-none-any.whl", hash = "sha256:261306c7d87db9d88e5399f8e43e442ed2c5ea0672b2f236bdb5cfe6b11e4cd7", size = 34421 },
|
37
|
+
]
|
38
|
+
|
39
|
+
[[package]]
|
40
|
+
name = "certifi"
|
41
|
+
version = "2025.1.31"
|
42
|
+
source = { registry = "https://pypi.org/simple" }
|
43
|
+
sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 }
|
44
|
+
wheels = [
|
45
|
+
{ url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 },
|
46
|
+
]
|
47
|
+
|
48
|
+
[[package]]
|
49
|
+
name = "charset-normalizer"
|
50
|
+
version = "3.4.1"
|
51
|
+
source = { registry = "https://pypi.org/simple" }
|
52
|
+
sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 }
|
53
|
+
wheels = [
|
54
|
+
{ url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 },
|
55
|
+
{ url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 },
|
56
|
+
{ url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 },
|
57
|
+
{ url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 },
|
58
|
+
{ url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 },
|
59
|
+
{ url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 },
|
60
|
+
{ url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 },
|
61
|
+
{ url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 },
|
62
|
+
{ url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 },
|
63
|
+
{ url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 },
|
64
|
+
{ url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 },
|
65
|
+
{ url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 },
|
66
|
+
{ url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 },
|
67
|
+
{ url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 },
|
68
|
+
]
|
69
|
+
|
70
|
+
[[package]]
|
71
|
+
name = "click"
|
72
|
+
version = "8.1.8"
|
73
|
+
source = { registry = "https://pypi.org/simple" }
|
74
|
+
dependencies = [
|
75
|
+
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
76
|
+
]
|
77
|
+
sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 }
|
78
|
+
wheels = [
|
79
|
+
{ url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 },
|
80
|
+
]
|
81
|
+
|
82
|
+
[[package]]
|
83
|
+
name = "colorama"
|
84
|
+
version = "0.4.6"
|
85
|
+
source = { registry = "https://pypi.org/simple" }
|
86
|
+
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
|
87
|
+
wheels = [
|
88
|
+
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
|
89
|
+
]
|
90
|
+
|
91
|
+
[[package]]
|
92
|
+
name = "h11"
|
93
|
+
version = "0.14.0"
|
94
|
+
source = { registry = "https://pypi.org/simple" }
|
95
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 }
|
96
|
+
wheels = [
|
97
|
+
{ url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 },
|
98
|
+
]
|
99
|
+
|
100
|
+
[[package]]
|
101
|
+
name = "httpcore"
|
102
|
+
version = "1.0.7"
|
103
|
+
source = { registry = "https://pypi.org/simple" }
|
104
|
+
dependencies = [
|
105
|
+
{ name = "certifi" },
|
106
|
+
{ name = "h11" },
|
107
|
+
]
|
108
|
+
sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 }
|
109
|
+
wheels = [
|
110
|
+
{ url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 },
|
111
|
+
]
|
112
|
+
|
113
|
+
[[package]]
|
114
|
+
name = "httpx"
|
115
|
+
version = "0.28.1"
|
116
|
+
source = { registry = "https://pypi.org/simple" }
|
117
|
+
dependencies = [
|
118
|
+
{ name = "anyio" },
|
119
|
+
{ name = "certifi" },
|
120
|
+
{ name = "httpcore" },
|
121
|
+
{ name = "idna" },
|
122
|
+
]
|
123
|
+
sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 }
|
124
|
+
wheels = [
|
125
|
+
{ url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 },
|
126
|
+
]
|
127
|
+
|
128
|
+
[[package]]
|
129
|
+
name = "httpx-sse"
|
130
|
+
version = "0.4.0"
|
131
|
+
source = { registry = "https://pypi.org/simple" }
|
132
|
+
sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624 }
|
133
|
+
wheels = [
|
134
|
+
{ url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819 },
|
135
|
+
]
|
136
|
+
|
137
|
+
[[package]]
|
138
|
+
name = "idna"
|
139
|
+
version = "3.10"
|
140
|
+
source = { registry = "https://pypi.org/simple" }
|
141
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 }
|
142
|
+
wheels = [
|
143
|
+
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
|
144
|
+
]
|
145
|
+
|
146
|
+
[[package]]
|
147
|
+
name = "markdown-it-py"
|
148
|
+
version = "3.0.0"
|
149
|
+
source = { registry = "https://pypi.org/simple" }
|
150
|
+
dependencies = [
|
151
|
+
{ name = "mdurl" },
|
152
|
+
]
|
153
|
+
sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 }
|
154
|
+
wheels = [
|
155
|
+
{ url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 },
|
156
|
+
]
|
157
|
+
|
158
|
+
[[package]]
|
159
|
+
name = "mcp"
|
160
|
+
version = "1.3.0"
|
161
|
+
source = { registry = "https://pypi.org/simple" }
|
162
|
+
dependencies = [
|
163
|
+
{ name = "anyio" },
|
164
|
+
{ name = "httpx" },
|
165
|
+
{ name = "httpx-sse" },
|
166
|
+
{ name = "pydantic" },
|
167
|
+
{ name = "pydantic-settings" },
|
168
|
+
{ name = "sse-starlette" },
|
169
|
+
{ name = "starlette" },
|
170
|
+
{ name = "uvicorn" },
|
171
|
+
]
|
172
|
+
sdist = { url = "https://files.pythonhosted.org/packages/6b/b6/81e5f2490290351fc97bf46c24ff935128cb7d34d68e3987b522f26f7ada/mcp-1.3.0.tar.gz", hash = "sha256:f409ae4482ce9d53e7ac03f3f7808bcab735bdfc0fba937453782efb43882d45", size = 150235 }
|
173
|
+
wheels = [
|
174
|
+
{ url = "https://files.pythonhosted.org/packages/d0/d2/a9e87b506b2094f5aa9becc1af5178842701b27217fa43877353da2577e3/mcp-1.3.0-py3-none-any.whl", hash = "sha256:2829d67ce339a249f803f22eba5e90385eafcac45c94b00cab6cef7e8f217211", size = 70672 },
|
175
|
+
]
|
176
|
+
|
177
|
+
[package.optional-dependencies]
|
178
|
+
cli = [
|
179
|
+
{ name = "python-dotenv" },
|
180
|
+
{ name = "typer" },
|
181
|
+
]
|
182
|
+
|
183
|
+
[[package]]
|
184
|
+
name = "mcp-server-appwrite"
|
185
|
+
version = "0.1.0"
|
186
|
+
source = { editable = "." }
|
187
|
+
dependencies = [
|
188
|
+
{ name = "appwrite" },
|
189
|
+
{ name = "mcp", extra = ["cli"] },
|
190
|
+
]
|
191
|
+
|
192
|
+
[package.metadata]
|
193
|
+
requires-dist = [
|
194
|
+
{ name = "appwrite", specifier = ">=7.1.0" },
|
195
|
+
{ name = "mcp", extras = ["cli"], specifier = ">=1.3.0" },
|
196
|
+
]
|
197
|
+
|
198
|
+
[[package]]
|
199
|
+
name = "mdurl"
|
200
|
+
version = "0.1.2"
|
201
|
+
source = { registry = "https://pypi.org/simple" }
|
202
|
+
sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 }
|
203
|
+
wheels = [
|
204
|
+
{ url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 },
|
205
|
+
]
|
206
|
+
|
207
|
+
[[package]]
|
208
|
+
name = "pydantic"
|
209
|
+
version = "2.10.6"
|
210
|
+
source = { registry = "https://pypi.org/simple" }
|
211
|
+
dependencies = [
|
212
|
+
{ name = "annotated-types" },
|
213
|
+
{ name = "pydantic-core" },
|
214
|
+
{ name = "typing-extensions" },
|
215
|
+
]
|
216
|
+
sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 }
|
217
|
+
wheels = [
|
218
|
+
{ url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 },
|
219
|
+
]
|
220
|
+
|
221
|
+
[[package]]
|
222
|
+
name = "pydantic-core"
|
223
|
+
version = "2.27.2"
|
224
|
+
source = { registry = "https://pypi.org/simple" }
|
225
|
+
dependencies = [
|
226
|
+
{ name = "typing-extensions" },
|
227
|
+
]
|
228
|
+
sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 }
|
229
|
+
wheels = [
|
230
|
+
{ url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 },
|
231
|
+
{ url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 },
|
232
|
+
{ url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 },
|
233
|
+
{ url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 },
|
234
|
+
{ url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 },
|
235
|
+
{ url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 },
|
236
|
+
{ url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 },
|
237
|
+
{ url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 },
|
238
|
+
{ url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 },
|
239
|
+
{ url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 },
|
240
|
+
{ url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 },
|
241
|
+
{ url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 },
|
242
|
+
{ url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 },
|
243
|
+
{ url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 },
|
244
|
+
]
|
245
|
+
|
246
|
+
[[package]]
|
247
|
+
name = "pydantic-settings"
|
248
|
+
version = "2.8.0"
|
249
|
+
source = { registry = "https://pypi.org/simple" }
|
250
|
+
dependencies = [
|
251
|
+
{ name = "pydantic" },
|
252
|
+
{ name = "python-dotenv" },
|
253
|
+
]
|
254
|
+
sdist = { url = "https://files.pythonhosted.org/packages/ca/a2/ad2511ede77bb424f3939e5148a56d968cdc6b1462620d24b2a1f4ab65b4/pydantic_settings-2.8.0.tar.gz", hash = "sha256:88e2ca28f6e68ea102c99c3c401d6c9078e68a5df600e97b43891c34e089500a", size = 83347 }
|
255
|
+
wheels = [
|
256
|
+
{ url = "https://files.pythonhosted.org/packages/c1/a9/3b9642025174bbe67e900785fb99c9bfe91ea584b0b7126ff99945c24a0e/pydantic_settings-2.8.0-py3-none-any.whl", hash = "sha256:c782c7dc3fb40e97b238e713c25d26f64314aece2e91abcff592fcac15f71820", size = 30746 },
|
257
|
+
]
|
258
|
+
|
259
|
+
[[package]]
|
260
|
+
name = "pygments"
|
261
|
+
version = "2.19.1"
|
262
|
+
source = { registry = "https://pypi.org/simple" }
|
263
|
+
sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 }
|
264
|
+
wheels = [
|
265
|
+
{ url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 },
|
266
|
+
]
|
267
|
+
|
268
|
+
[[package]]
|
269
|
+
name = "python-dotenv"
|
270
|
+
version = "1.0.1"
|
271
|
+
source = { registry = "https://pypi.org/simple" }
|
272
|
+
sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 }
|
273
|
+
wheels = [
|
274
|
+
{ url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 },
|
275
|
+
]
|
276
|
+
|
277
|
+
[[package]]
|
278
|
+
name = "requests"
|
279
|
+
version = "2.32.3"
|
280
|
+
source = { registry = "https://pypi.org/simple" }
|
281
|
+
dependencies = [
|
282
|
+
{ name = "certifi" },
|
283
|
+
{ name = "charset-normalizer" },
|
284
|
+
{ name = "idna" },
|
285
|
+
{ name = "urllib3" },
|
286
|
+
]
|
287
|
+
sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 }
|
288
|
+
wheels = [
|
289
|
+
{ url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 },
|
290
|
+
]
|
291
|
+
|
292
|
+
[[package]]
|
293
|
+
name = "rich"
|
294
|
+
version = "13.9.4"
|
295
|
+
source = { registry = "https://pypi.org/simple" }
|
296
|
+
dependencies = [
|
297
|
+
{ name = "markdown-it-py" },
|
298
|
+
{ name = "pygments" },
|
299
|
+
]
|
300
|
+
sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 }
|
301
|
+
wheels = [
|
302
|
+
{ url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 },
|
303
|
+
]
|
304
|
+
|
305
|
+
[[package]]
|
306
|
+
name = "shellingham"
|
307
|
+
version = "1.5.4"
|
308
|
+
source = { registry = "https://pypi.org/simple" }
|
309
|
+
sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 }
|
310
|
+
wheels = [
|
311
|
+
{ url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 },
|
312
|
+
]
|
313
|
+
|
314
|
+
[[package]]
|
315
|
+
name = "sniffio"
|
316
|
+
version = "1.3.1"
|
317
|
+
source = { registry = "https://pypi.org/simple" }
|
318
|
+
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
|
319
|
+
wheels = [
|
320
|
+
{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 },
|
321
|
+
]
|
322
|
+
|
323
|
+
[[package]]
|
324
|
+
name = "sse-starlette"
|
325
|
+
version = "2.2.1"
|
326
|
+
source = { registry = "https://pypi.org/simple" }
|
327
|
+
dependencies = [
|
328
|
+
{ name = "anyio" },
|
329
|
+
{ name = "starlette" },
|
330
|
+
]
|
331
|
+
sdist = { url = "https://files.pythonhosted.org/packages/71/a4/80d2a11af59fe75b48230846989e93979c892d3a20016b42bb44edb9e398/sse_starlette-2.2.1.tar.gz", hash = "sha256:54470d5f19274aeed6b2d473430b08b4b379ea851d953b11d7f1c4a2c118b419", size = 17376 }
|
332
|
+
wheels = [
|
333
|
+
{ url = "https://files.pythonhosted.org/packages/d9/e0/5b8bd393f27f4a62461c5cf2479c75a2cc2ffa330976f9f00f5f6e4f50eb/sse_starlette-2.2.1-py3-none-any.whl", hash = "sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99", size = 10120 },
|
334
|
+
]
|
335
|
+
|
336
|
+
[[package]]
|
337
|
+
name = "starlette"
|
338
|
+
version = "0.46.0"
|
339
|
+
source = { registry = "https://pypi.org/simple" }
|
340
|
+
dependencies = [
|
341
|
+
{ name = "anyio" },
|
342
|
+
]
|
343
|
+
sdist = { url = "https://files.pythonhosted.org/packages/44/b6/fb9a32e3c5d59b1e383c357534c63c2d3caa6f25bf3c59dd89d296ecbaec/starlette-0.46.0.tar.gz", hash = "sha256:b359e4567456b28d473d0193f34c0de0ed49710d75ef183a74a5ce0499324f50", size = 2575568 }
|
344
|
+
wheels = [
|
345
|
+
{ url = "https://files.pythonhosted.org/packages/41/94/8af675a62e3c91c2dee47cf92e602cfac86e8767b1a1ac3caf1b327c2ab0/starlette-0.46.0-py3-none-any.whl", hash = "sha256:913f0798bd90ba90a9156383bcf1350a17d6259451d0d8ee27fc0cf2db609038", size = 71991 },
|
346
|
+
]
|
347
|
+
|
348
|
+
[[package]]
|
349
|
+
name = "typer"
|
350
|
+
version = "0.15.1"
|
351
|
+
source = { registry = "https://pypi.org/simple" }
|
352
|
+
dependencies = [
|
353
|
+
{ name = "click" },
|
354
|
+
{ name = "rich" },
|
355
|
+
{ name = "shellingham" },
|
356
|
+
{ name = "typing-extensions" },
|
357
|
+
]
|
358
|
+
sdist = { url = "https://files.pythonhosted.org/packages/cb/ce/dca7b219718afd37a0068f4f2530a727c2b74a8b6e8e0c0080a4c0de4fcd/typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a", size = 99789 }
|
359
|
+
wheels = [
|
360
|
+
{ url = "https://files.pythonhosted.org/packages/d0/cc/0a838ba5ca64dc832aa43f727bd586309846b0ffb2ce52422543e6075e8a/typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847", size = 44908 },
|
361
|
+
]
|
362
|
+
|
363
|
+
[[package]]
|
364
|
+
name = "typing-extensions"
|
365
|
+
version = "4.12.2"
|
366
|
+
source = { registry = "https://pypi.org/simple" }
|
367
|
+
sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 }
|
368
|
+
wheels = [
|
369
|
+
{ url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 },
|
370
|
+
]
|
371
|
+
|
372
|
+
[[package]]
|
373
|
+
name = "urllib3"
|
374
|
+
version = "2.3.0"
|
375
|
+
source = { registry = "https://pypi.org/simple" }
|
376
|
+
sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 }
|
377
|
+
wheels = [
|
378
|
+
{ url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 },
|
379
|
+
]
|
380
|
+
|
381
|
+
[[package]]
|
382
|
+
name = "uvicorn"
|
383
|
+
version = "0.34.0"
|
384
|
+
source = { registry = "https://pypi.org/simple" }
|
385
|
+
dependencies = [
|
386
|
+
{ name = "click" },
|
387
|
+
{ name = "h11" },
|
388
|
+
]
|
389
|
+
sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 }
|
390
|
+
wheels = [
|
391
|
+
{ url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 },
|
392
|
+
]
|