raindropio-mcp 0.1.1__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.
- raindropio_mcp-0.1.1/.coverage-ratchet.json +16 -0
- raindropio_mcp-0.1.1/.github/FUNDING.yml +1 -0
- raindropio_mcp-0.1.1/.gitignore +17 -0
- raindropio_mcp-0.1.1/.idea/copilot.data.migration.agent.xml +6 -0
- raindropio_mcp-0.1.1/.idea/inspectionProfiles/Project_Default.xml +29 -0
- raindropio_mcp-0.1.1/.idea/inspectionProfiles/profiles_settings.xml +6 -0
- raindropio_mcp-0.1.1/.idea/modules.xml +8 -0
- raindropio_mcp-0.1.1/.idea/raindropio-mcp.iml +10 -0
- raindropio_mcp-0.1.1/.idea/ruff.xml +6 -0
- raindropio_mcp-0.1.1/.idea/vcs.xml +4 -0
- raindropio_mcp-0.1.1/.idea/workspace.xml +193 -0
- raindropio_mcp-0.1.1/.pre-commit-config.yaml +102 -0
- raindropio_mcp-0.1.1/AGENTS.md +25 -0
- raindropio_mcp-0.1.1/CLAUDE.md +222 -0
- raindropio_mcp-0.1.1/LICENSE +29 -0
- raindropio_mcp-0.1.1/PKG-INFO +168 -0
- raindropio_mcp-0.1.1/QWEN.md +105 -0
- raindropio_mcp-0.1.1/README.md +155 -0
- raindropio_mcp-0.1.1/coverage.json +1 -0
- raindropio_mcp-0.1.1/docs/README.md +25 -0
- raindropio_mcp-0.1.1/docs/clients.md +34 -0
- raindropio_mcp-0.1.1/docs/operations.md +51 -0
- raindropio_mcp-0.1.1/docs/overview.md +34 -0
- raindropio_mcp-0.1.1/example.mcp.dev.json +23 -0
- raindropio_mcp-0.1.1/example.mcp.json +16 -0
- raindropio_mcp-0.1.1/examples/auth_example.py +19 -0
- raindropio_mcp-0.1.1/examples/base_client_usage.py +32 -0
- raindropio_mcp-0.1.1/monitoring/alert_rules.yml +40 -0
- raindropio_mcp-0.1.1/monitoring/prometheus.yml +37 -0
- raindropio_mcp-0.1.1/mypy.ini +9 -0
- raindropio_mcp-0.1.1/pyproject.toml +157 -0
- raindropio_mcp-0.1.1/raindropio_mcp/__init__.py +16 -0
- raindropio_mcp-0.1.1/raindropio_mcp/__main__.py +8 -0
- raindropio_mcp-0.1.1/raindropio_mcp/auth/__init__.py +5 -0
- raindropio_mcp-0.1.1/raindropio_mcp/auth/token_provider.py +29 -0
- raindropio_mcp-0.1.1/raindropio_mcp/clients/__init__.py +6 -0
- raindropio_mcp-0.1.1/raindropio_mcp/clients/base_client.py +216 -0
- raindropio_mcp-0.1.1/raindropio_mcp/clients/client_factory.py +34 -0
- raindropio_mcp-0.1.1/raindropio_mcp/clients/raindrop_client.py +486 -0
- raindropio_mcp-0.1.1/raindropio_mcp/config/__init__.py +5 -0
- raindropio_mcp-0.1.1/raindropio_mcp/config/settings.py +111 -0
- raindropio_mcp-0.1.1/raindropio_mcp/main.py +87 -0
- raindropio_mcp-0.1.1/raindropio_mcp/models/__init__.py +77 -0
- raindropio_mcp-0.1.1/raindropio_mcp/models/batch_payloads.py +66 -0
- raindropio_mcp-0.1.1/raindropio_mcp/models/bookmark.py +71 -0
- raindropio_mcp-0.1.1/raindropio_mcp/models/collection.py +65 -0
- raindropio_mcp-0.1.1/raindropio_mcp/models/filter_payloads.py +50 -0
- raindropio_mcp-0.1.1/raindropio_mcp/models/highlight.py +65 -0
- raindropio_mcp-0.1.1/raindropio_mcp/models/import_export_payloads.py +38 -0
- raindropio_mcp-0.1.1/raindropio_mcp/models/payloads.py +54 -0
- raindropio_mcp-0.1.1/raindropio_mcp/models/tag.py +24 -0
- raindropio_mcp-0.1.1/raindropio_mcp/models/user.py +36 -0
- raindropio_mcp-0.1.1/raindropio_mcp/server.py +53 -0
- raindropio_mcp-0.1.1/raindropio_mcp/tools/__init__.py +40 -0
- raindropio_mcp-0.1.1/raindropio_mcp/tools/account.py +35 -0
- raindropio_mcp-0.1.1/raindropio_mcp/tools/batch.py +91 -0
- raindropio_mcp-0.1.1/raindropio_mcp/tools/bookmarks.py +122 -0
- raindropio_mcp-0.1.1/raindropio_mcp/tools/collections.py +105 -0
- raindropio_mcp-0.1.1/raindropio_mcp/tools/filters.py +62 -0
- raindropio_mcp-0.1.1/raindropio_mcp/tools/highlights.py +82 -0
- raindropio_mcp-0.1.1/raindropio_mcp/tools/import_export.py +61 -0
- raindropio_mcp-0.1.1/raindropio_mcp/tools/system.py +28 -0
- raindropio_mcp-0.1.1/raindropio_mcp/tools/tags.py +57 -0
- raindropio_mcp-0.1.1/raindropio_mcp/tools/tool_registry.py +80 -0
- raindropio_mcp-0.1.1/raindropio_mcp/utils/__init__.py +27 -0
- raindropio_mcp-0.1.1/raindropio_mcp/utils/exceptions.py +143 -0
- raindropio_mcp-0.1.1/tests/__init__.py +0 -0
- raindropio_mcp-0.1.1/tests/conftest.py +18 -0
- raindropio_mcp-0.1.1/tests/unit/test_account_tools.py +46 -0
- raindropio_mcp-0.1.1/tests/unit/test_base_client.py +86 -0
- raindropio_mcp-0.1.1/tests/unit/test_base_client_extended.py +292 -0
- raindropio_mcp-0.1.1/tests/unit/test_batch_client.py +153 -0
- raindropio_mcp-0.1.1/tests/unit/test_batch_tools.py +185 -0
- raindropio_mcp-0.1.1/tests/unit/test_bookmark_tools.py +144 -0
- raindropio_mcp-0.1.1/tests/unit/test_client_factory.py +62 -0
- raindropio_mcp-0.1.1/tests/unit/test_collection_tools.py +86 -0
- raindropio_mcp-0.1.1/tests/unit/test_exceptions.py +19 -0
- raindropio_mcp-0.1.1/tests/unit/test_filter_client.py +91 -0
- raindropio_mcp-0.1.1/tests/unit/test_filter_tools.py +111 -0
- raindropio_mcp-0.1.1/tests/unit/test_highlight_client.py +208 -0
- raindropio_mcp-0.1.1/tests/unit/test_highlight_tools.py +173 -0
- raindropio_mcp-0.1.1/tests/unit/test_import_export_client.py +155 -0
- raindropio_mcp-0.1.1/tests/unit/test_import_export_tools.py +107 -0
- raindropio_mcp-0.1.1/tests/unit/test_main.py +114 -0
- raindropio_mcp-0.1.1/tests/unit/test_main_module.py +11 -0
- raindropio_mcp-0.1.1/tests/unit/test_main_server.py +101 -0
- raindropio_mcp-0.1.1/tests/unit/test_raindrop_client.py +95 -0
- raindropio_mcp-0.1.1/tests/unit/test_raindrop_client_extended.py +385 -0
- raindropio_mcp-0.1.1/tests/unit/test_server.py +63 -0
- raindropio_mcp-0.1.1/tests/unit/test_settings.py +30 -0
- raindropio_mcp-0.1.1/tests/unit/test_tag_tools.py +60 -0
- raindropio_mcp-0.1.1/tests/unit/test_token_provider.py +17 -0
- raindropio_mcp-0.1.1/tests/unit/test_tools.py +99 -0
- raindropio_mcp-0.1.1/uv.lock +3544 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"baseline": 81.87919463087249,
|
|
3
|
+
"current_minimum": 81.87919463087249,
|
|
4
|
+
"target": 100.0,
|
|
5
|
+
"last_updated": "2025-10-11T00:11:40.140419",
|
|
6
|
+
"history": [
|
|
7
|
+
{
|
|
8
|
+
"date": "2025-10-11T00:11:40.140469",
|
|
9
|
+
"coverage": 81.87919463087249,
|
|
10
|
+
"commit": "baseline",
|
|
11
|
+
"milestone": false
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"milestones_achieved": [],
|
|
15
|
+
"next_milestone": 90
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
github: [lesleslie]
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<component name="InspectionProjectProfileManager">
|
|
2
|
+
<profile version="1.0">
|
|
3
|
+
<option name="myName" value="Project Default" />
|
|
4
|
+
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
|
5
|
+
<inspection_tool class="JSHint" enabled="true" level="ERROR" enabled_by_default="true" />
|
|
6
|
+
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
|
|
7
|
+
<option name="ignoredErrors">
|
|
8
|
+
<list>
|
|
9
|
+
<option value="N802" />
|
|
10
|
+
</list>
|
|
11
|
+
</option>
|
|
12
|
+
</inspection_tool>
|
|
13
|
+
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
|
14
|
+
<option name="ignoredIdentifiers">
|
|
15
|
+
<list>
|
|
16
|
+
<option value="google.cloud.storage" />
|
|
17
|
+
<option value="firebase.ic" />
|
|
18
|
+
<option value="templates.ic" />
|
|
19
|
+
<option value="cloud_storage.ic" />
|
|
20
|
+
<option value="memorystore.ic" />
|
|
21
|
+
<option value="main.ic" />
|
|
22
|
+
<option value="models.ic" />
|
|
23
|
+
<option value="sys._getframe" />
|
|
24
|
+
</list>
|
|
25
|
+
</option>
|
|
26
|
+
</inspection_tool>
|
|
27
|
+
<inspection_tool class="PyprojectInspection" enabled="false" level="WARNING" enabled_by_default="false" />
|
|
28
|
+
</profile>
|
|
29
|
+
</component>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="ProjectModuleManager">
|
|
4
|
+
<modules>
|
|
5
|
+
<module fileurl="file://$PROJECT_DIR$/.idea/raindropio-mcp.iml" filepath="$PROJECT_DIR$/.idea/raindropio-mcp.iml" />
|
|
6
|
+
</modules>
|
|
7
|
+
</component>
|
|
8
|
+
</project>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<module type="PYTHON_MODULE" version="4">
|
|
3
|
+
<component name="NewModuleRootManager">
|
|
4
|
+
<content url="file://$MODULE_DIR$">
|
|
5
|
+
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
|
6
|
+
</content>
|
|
7
|
+
<orderEntry type="inheritedJdk" />
|
|
8
|
+
<orderEntry type="sourceFolder" forTests="false" />
|
|
9
|
+
</component>
|
|
10
|
+
</module>
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="AutoImportSettings">
|
|
4
|
+
<option name="autoReloadType" value="SELECTIVE" />
|
|
5
|
+
</component>
|
|
6
|
+
<component name="ChangeListManager">
|
|
7
|
+
<list default="true" id="833cfa98-3bf1-4d40-99c6-fb0b48fec22d" name="Changes" comment="">
|
|
8
|
+
<change afterPath="$PROJECT_DIR$/.idea/raindropio-mcp.iml" afterDir="false" />
|
|
9
|
+
<change afterPath="$PROJECT_DIR$/LICENSE" afterDir="false" />
|
|
10
|
+
<change afterPath="$PROJECT_DIR$/QWEN.md" afterDir="false" />
|
|
11
|
+
<change afterPath="$PROJECT_DIR$/mypy.ini" afterDir="false" />
|
|
12
|
+
<change beforePath="$PROJECT_DIR$/.dockerignore" beforeDir="false" />
|
|
13
|
+
<change beforePath="$PROJECT_DIR$/.env.example" beforeDir="false" />
|
|
14
|
+
<change beforePath="$PROJECT_DIR$/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
|
|
15
|
+
<change beforePath="$PROJECT_DIR$/.idea/.gitignore" beforeDir="false" />
|
|
16
|
+
<change beforePath="$PROJECT_DIR$/.idea/vcs.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
|
|
17
|
+
<change beforePath="$PROJECT_DIR$/.pre-commit-config.yaml" beforeDir="false" afterPath="$PROJECT_DIR$/.pre-commit-config.yaml" afterDir="false" />
|
|
18
|
+
<change beforePath="$PROJECT_DIR$/AGENTS.md" beforeDir="false" afterPath="$PROJECT_DIR$/AGENTS.md" afterDir="false" />
|
|
19
|
+
<change beforePath="$PROJECT_DIR$/CLAUDE.md" beforeDir="false" afterPath="$PROJECT_DIR$/CLAUDE.md" afterDir="false" />
|
|
20
|
+
<change beforePath="$PROJECT_DIR$/Dockerfile" beforeDir="false" />
|
|
21
|
+
<change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
|
|
22
|
+
<change beforePath="$PROJECT_DIR$/docker-compose.yml" beforeDir="false" />
|
|
23
|
+
<change beforePath="$PROJECT_DIR$/docs/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/docs/README.md" afterDir="false" />
|
|
24
|
+
<change beforePath="$PROJECT_DIR$/docs/base-client-implementation.md" beforeDir="false" />
|
|
25
|
+
<change beforePath="$PROJECT_DIR$/docs/implementation-plan.md" beforeDir="false" />
|
|
26
|
+
<change beforePath="$PROJECT_DIR$/docs/phase5-summary.md" beforeDir="false" />
|
|
27
|
+
<change beforePath="$PROJECT_DIR$/docs/production-monitoring.md" beforeDir="false" />
|
|
28
|
+
<change beforePath="$PROJECT_DIR$/docs/security-implementation.md" beforeDir="false" />
|
|
29
|
+
<change beforePath="$PROJECT_DIR$/example.mcp.dev.json" beforeDir="false" afterPath="$PROJECT_DIR$/example.mcp.dev.json" afterDir="false" />
|
|
30
|
+
<change beforePath="$PROJECT_DIR$/example.mcp.json" beforeDir="false" afterPath="$PROJECT_DIR$/example.mcp.json" afterDir="false" />
|
|
31
|
+
<change beforePath="$PROJECT_DIR$/examples/auth_example.py" beforeDir="false" afterPath="$PROJECT_DIR$/examples/auth_example.py" afterDir="false" />
|
|
32
|
+
<change beforePath="$PROJECT_DIR$/examples/base_client_usage.py" beforeDir="false" afterPath="$PROJECT_DIR$/examples/base_client_usage.py" afterDir="false" />
|
|
33
|
+
<change beforePath="$PROJECT_DIR$/monitoring/alert_rules.yml" beforeDir="false" afterPath="$PROJECT_DIR$/monitoring/alert_rules.yml" afterDir="false" />
|
|
34
|
+
<change beforePath="$PROJECT_DIR$/monitoring/prometheus.yml" beforeDir="false" afterPath="$PROJECT_DIR$/monitoring/prometheus.yml" afterDir="false" />
|
|
35
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/__init__.py" beforeDir="false" />
|
|
36
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/__main__.py" beforeDir="false" />
|
|
37
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/auth/__init__.py" beforeDir="false" />
|
|
38
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/auth/audit_logger.py" beforeDir="false" />
|
|
39
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/auth/oauth_handler.py" beforeDir="false" />
|
|
40
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/auth/secure_oauth_handler.py" beforeDir="false" />
|
|
41
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/auth/security_enhancements.py" beforeDir="false" />
|
|
42
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/auth/security_middleware.py" beforeDir="false" />
|
|
43
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/clients/__init__.py" beforeDir="false" />
|
|
44
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/clients/api_clients/__init__.py" beforeDir="false" />
|
|
45
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/clients/api_clients/activities.py" beforeDir="false" />
|
|
46
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/clients/api_clients/block.py" beforeDir="false" />
|
|
47
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/clients/api_clients/cashiering.py" beforeDir="false" />
|
|
48
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/clients/api_clients/crm.py" beforeDir="false" />
|
|
49
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/clients/api_clients/front_office.py" beforeDir="false" />
|
|
50
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/clients/api_clients/housekeeping.py" beforeDir="false" />
|
|
51
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/clients/api_clients/inventory.py" beforeDir="false" />
|
|
52
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/clients/api_clients/rates.py" beforeDir="false" />
|
|
53
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/clients/api_clients/reservations.py" beforeDir="false" />
|
|
54
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/clients/base_client.py" beforeDir="false" />
|
|
55
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/clients/client_factory.py" beforeDir="false" />
|
|
56
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/config/__init__.py" beforeDir="false" />
|
|
57
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/config/security_settings.py" beforeDir="false" />
|
|
58
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/config/settings.py" beforeDir="false" />
|
|
59
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/main.py" beforeDir="false" />
|
|
60
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/models/__init__.py" beforeDir="false" />
|
|
61
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/models/common.py" beforeDir="false" />
|
|
62
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/models/financial.py" beforeDir="false" />
|
|
63
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/models/guest.py" beforeDir="false" />
|
|
64
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/models/reservation.py" beforeDir="false" />
|
|
65
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/models/room.py" beforeDir="false" />
|
|
66
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/resources/__init__.py" beforeDir="false" />
|
|
67
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/resources/api_specs.py" beforeDir="false" />
|
|
68
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/resources/health_check.py" beforeDir="false" />
|
|
69
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/server.py" beforeDir="false" />
|
|
70
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/tools/__init__.py" beforeDir="false" />
|
|
71
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/tools/financial_tools.py" beforeDir="false" />
|
|
72
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/tools/guest_tools.py" beforeDir="false" />
|
|
73
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/tools/operation_tools.py" beforeDir="false" />
|
|
74
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/tools/reservation_tools.py" beforeDir="false" />
|
|
75
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/tools/room_tools.py" beforeDir="false" />
|
|
76
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/tools/tool_registry.py" beforeDir="false" />
|
|
77
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/utils/__init__.py" beforeDir="false" />
|
|
78
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/utils/cache_manager.py" beforeDir="false" />
|
|
79
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/utils/client_factory.py" beforeDir="false" />
|
|
80
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/utils/connection_optimizer.py" beforeDir="false" />
|
|
81
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/utils/exceptions.py" beforeDir="false" />
|
|
82
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/utils/formatters.py" beforeDir="false" />
|
|
83
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/utils/observability.py" beforeDir="false" />
|
|
84
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/utils/resilience_manager.py" beforeDir="false" />
|
|
85
|
+
<change beforePath="$PROJECT_DIR$/opera_cloud_mcp/utils/validators.py" beforeDir="false" />
|
|
86
|
+
<change beforePath="$PROJECT_DIR$/pyproject.toml" beforeDir="false" afterPath="$PROJECT_DIR$/pyproject.toml" afterDir="false" />
|
|
87
|
+
<change beforePath="$PROJECT_DIR$/requirements.txt" beforeDir="false" />
|
|
88
|
+
<change beforePath="$PROJECT_DIR$/tests/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/tests/__init__.py" afterDir="false" />
|
|
89
|
+
<change beforePath="$PROJECT_DIR$/tests/conftest.py" beforeDir="false" afterPath="$PROJECT_DIR$/tests/conftest.py" afterDir="false" />
|
|
90
|
+
<change beforePath="$PROJECT_DIR$/tests/fixtures/__init__.py" beforeDir="false" />
|
|
91
|
+
<change beforePath="$PROJECT_DIR$/tests/fixtures/mock_responses.py" beforeDir="false" />
|
|
92
|
+
<change beforePath="$PROJECT_DIR$/tests/integration/__init__.py" beforeDir="false" />
|
|
93
|
+
<change beforePath="$PROJECT_DIR$/tests/integration/test_main_integration.py" beforeDir="false" />
|
|
94
|
+
<change beforePath="$PROJECT_DIR$/tests/integration/test_reservation_integration.py" beforeDir="false" />
|
|
95
|
+
<change beforePath="$PROJECT_DIR$/tests/integration/test_tools.py" beforeDir="false" />
|
|
96
|
+
<change beforePath="$PROJECT_DIR$/tests/integration/test_workflows.py" beforeDir="false" />
|
|
97
|
+
<change beforePath="$PROJECT_DIR$/tests/performance/__init__.py" beforeDir="false" />
|
|
98
|
+
<change beforePath="$PROJECT_DIR$/tests/performance/load_test.py" beforeDir="false" />
|
|
99
|
+
<change beforePath="$PROJECT_DIR$/tests/performance/test_performance.py" beforeDir="false" />
|
|
100
|
+
<change beforePath="$PROJECT_DIR$/tests/test_oauth_integration.py" beforeDir="false" />
|
|
101
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/__init__.py" beforeDir="false" />
|
|
102
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/test_activities_client.py" beforeDir="false" />
|
|
103
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/test_api_specs.py" beforeDir="false" />
|
|
104
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/test_auth.py" beforeDir="false" />
|
|
105
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/test_clients.py" beforeDir="false" />
|
|
106
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/test_crm_client.py" beforeDir="false" />
|
|
107
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/test_enhanced_oauth_integration.py" beforeDir="false" />
|
|
108
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/test_financial_tools.py" beforeDir="false" />
|
|
109
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/test_front_office_client.py" beforeDir="false" />
|
|
110
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/test_guest_tools.py" beforeDir="false" />
|
|
111
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/test_models.py" beforeDir="false" />
|
|
112
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/test_operation_tools.py" beforeDir="false" />
|
|
113
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/test_reservation_models.py" beforeDir="false" />
|
|
114
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/test_reservation_tools.py" beforeDir="false" />
|
|
115
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/test_reservation_tools_simple.py" beforeDir="false" />
|
|
116
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/test_reservations_client.py" beforeDir="false" />
|
|
117
|
+
<change beforePath="$PROJECT_DIR$/tests/unit/test_room_tools.py" beforeDir="false" />
|
|
118
|
+
<change beforePath="$PROJECT_DIR$/uv.lock" beforeDir="false" afterPath="$PROJECT_DIR$/uv.lock" afterDir="false" />
|
|
119
|
+
</list>
|
|
120
|
+
<option name="SHOW_DIALOG" value="false" />
|
|
121
|
+
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
|
122
|
+
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
|
123
|
+
<option name="LAST_RESOLUTION" value="IGNORE" />
|
|
124
|
+
</component>
|
|
125
|
+
<component name="Git.Settings">
|
|
126
|
+
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
|
127
|
+
</component>
|
|
128
|
+
<component name="GitLabMergeRequestFiltersHistory"><![CDATA[{
|
|
129
|
+
"lastFilter": {
|
|
130
|
+
"state": "OPENED",
|
|
131
|
+
"assignee": {
|
|
132
|
+
"type": "org.jetbrains.plugins.gitlab.mergerequest.ui.filters.GitLabMergeRequestsFiltersValue.MergeRequestsMemberFilterValue.MergeRequestsAssigneeFilterValue",
|
|
133
|
+
"username": "lesleslie",
|
|
134
|
+
"fullname": "Les Leslie"
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}]]></component>
|
|
138
|
+
<component name="GitLabMergeRequestsSettings"><![CDATA[{
|
|
139
|
+
"selectedUrlAndAccountId": {
|
|
140
|
+
"first": "https://gitlab.com/lesleslie/opera-cloud-mcp.git",
|
|
141
|
+
"second": "97b5872b-7573-42a7-9547-7db3d03839d1"
|
|
142
|
+
}
|
|
143
|
+
}]]></component>
|
|
144
|
+
<component name="ProjectColorInfo"><![CDATA[{
|
|
145
|
+
"associatedIndex": 5
|
|
146
|
+
}]]></component>
|
|
147
|
+
<component name="ProjectId" id="33u08LqPPfDUSlV76SPmGCKpiIW" />
|
|
148
|
+
<component name="ProjectViewState">
|
|
149
|
+
<option name="hideEmptyMiddlePackages" value="true" />
|
|
150
|
+
<option name="showLibraryContents" value="true" />
|
|
151
|
+
</component>
|
|
152
|
+
<component name="PropertiesComponent"><![CDATA[{
|
|
153
|
+
"keyToString": {
|
|
154
|
+
"ASKED_MARK_IGNORED_FILES_AS_EXCLUDED": "true",
|
|
155
|
+
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
|
156
|
+
"RunOnceActivity.ShowReadmeOnStart": "true",
|
|
157
|
+
"RunOnceActivity.git.unshallow": "true",
|
|
158
|
+
"com.google.cloudcode.ide_session_index": "20251010_0001",
|
|
159
|
+
"dart.analysis.tool.window.visible": "false",
|
|
160
|
+
"git-widget-placeholder": "main",
|
|
161
|
+
"last_opened_file_path": "/Users/les/Projects/raindropio-mcp",
|
|
162
|
+
"node.js.detected.package.eslint": "true",
|
|
163
|
+
"node.js.detected.package.tslint": "true",
|
|
164
|
+
"node.js.selected.package.eslint": "(autodetect)",
|
|
165
|
+
"node.js.selected.package.tslint": "(autodetect)",
|
|
166
|
+
"nodejs_package_manager_path": "npm",
|
|
167
|
+
"settings.editor.selected.configurable": "com.augmentcode.intellij.settings",
|
|
168
|
+
"vue.rearranger.settings.migration": "true"
|
|
169
|
+
}
|
|
170
|
+
}]]></component>
|
|
171
|
+
<component name="SharedIndexes">
|
|
172
|
+
<attachedChunks>
|
|
173
|
+
<set>
|
|
174
|
+
<option value="bundled-js-predefined-d6986cc7102b-3aa1da707db6-JavaScript-PY-252.26830.99" />
|
|
175
|
+
<option value="bundled-python-sdk-164cda30dcd9-0af03a5fa574-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-252.26830.99" />
|
|
176
|
+
</set>
|
|
177
|
+
</attachedChunks>
|
|
178
|
+
</component>
|
|
179
|
+
<component name="TaskManager">
|
|
180
|
+
<task active="true" id="Default" summary="Default task">
|
|
181
|
+
<changelist id="833cfa98-3bf1-4d40-99c6-fb0b48fec22d" name="Changes" comment="" />
|
|
182
|
+
<created>1760151488736</created>
|
|
183
|
+
<option name="number" value="Default" />
|
|
184
|
+
<option name="presentableId" value="Default" />
|
|
185
|
+
<updated>1760151488736</updated>
|
|
186
|
+
<workItem from="1760151490728" duration="4558000" />
|
|
187
|
+
</task>
|
|
188
|
+
<servers />
|
|
189
|
+
</component>
|
|
190
|
+
<component name="TypeScriptGeneratedFilesManager">
|
|
191
|
+
<option name="version" value="3" />
|
|
192
|
+
</component>
|
|
193
|
+
</project>
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: local
|
|
3
|
+
hooks:
|
|
4
|
+
- id: validate-regex-patterns
|
|
5
|
+
name: validate-regex-patterns
|
|
6
|
+
entry: uv run python -m crackerjack.tools.validate_regex_patterns
|
|
7
|
+
language: system
|
|
8
|
+
files: \.py$
|
|
9
|
+
exclude: ^\.venv/|^src/
|
|
10
|
+
- id: skylos
|
|
11
|
+
name: skylos-dead-code-detection
|
|
12
|
+
entry: skylos
|
|
13
|
+
language: system
|
|
14
|
+
args: ["raindropio_mcp", "--exclude", "tests"]
|
|
15
|
+
pass_filenames: false
|
|
16
|
+
exclude: ^tests/|^src/
|
|
17
|
+
stages: ["pre-push", "manual"]
|
|
18
|
+
- id: zuban
|
|
19
|
+
name: zuban-type-checking
|
|
20
|
+
entry: uv run zuban check
|
|
21
|
+
language: system
|
|
22
|
+
args: ["--config-file", "mypy.ini", "./raindropio_mcp"]
|
|
23
|
+
pass_filenames: false
|
|
24
|
+
exclude: ^tests/|^src/
|
|
25
|
+
stages: ["pre-push", "manual"]
|
|
26
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
27
|
+
rev: v6.0.0
|
|
28
|
+
hooks:
|
|
29
|
+
- id: trailing-whitespace
|
|
30
|
+
name: trailing-whitespace
|
|
31
|
+
exclude: ^\.venv/|^src/
|
|
32
|
+
- id: end-of-file-fixer
|
|
33
|
+
name: end-of-file-fixer
|
|
34
|
+
exclude: ^\.venv/|^src/
|
|
35
|
+
- id: check-yaml
|
|
36
|
+
name: check-yaml
|
|
37
|
+
exclude: ^\.venv/|^src/
|
|
38
|
+
- id: check-toml
|
|
39
|
+
name: check-toml
|
|
40
|
+
exclude: ^\.venv/|^src/
|
|
41
|
+
- id: check-added-large-files
|
|
42
|
+
name: check-added-large-files
|
|
43
|
+
exclude: ^\.venv/|^src/
|
|
44
|
+
- repo: https://github.com/astral-sh/uv-pre-commit
|
|
45
|
+
rev: 0.9.0
|
|
46
|
+
hooks:
|
|
47
|
+
- id: uv-lock
|
|
48
|
+
files: ^ pyproject\.toml$
|
|
49
|
+
exclude: ^src/
|
|
50
|
+
- repo: https://github.com/gitleaks/gitleaks
|
|
51
|
+
rev: v8.28.0
|
|
52
|
+
hooks:
|
|
53
|
+
- id: gitleaks
|
|
54
|
+
exclude: uv\.lock|pyproject\.toml|tests/.*|docs/.*|\.claude/.*|.*\.md|^src/
|
|
55
|
+
- repo: https://github.com/PyCQA/bandit
|
|
56
|
+
rev: 1.8.6
|
|
57
|
+
hooks:
|
|
58
|
+
- id: bandit
|
|
59
|
+
args: ["-c", "pyproject.toml", "-r", "-ll"]
|
|
60
|
+
files: ^raindropio_mcp/.*\.py$
|
|
61
|
+
exclude: ^tests/|^src/
|
|
62
|
+
stages: ["pre-push", "manual"]
|
|
63
|
+
- repo: https://github.com/codespell-project/codespell
|
|
64
|
+
rev: v2.4.1
|
|
65
|
+
hooks:
|
|
66
|
+
- id: codespell
|
|
67
|
+
exclude: ^\.venv/|^src/
|
|
68
|
+
additional_dependencies: ["tomli"]
|
|
69
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
70
|
+
rev: v0.14.0
|
|
71
|
+
hooks:
|
|
72
|
+
- id: ruff-check
|
|
73
|
+
exclude: ^\.venv/|^src/
|
|
74
|
+
- id: ruff-format
|
|
75
|
+
exclude: ^\.venv/|^src/
|
|
76
|
+
- repo: https://github.com/executablebooks/mdformat
|
|
77
|
+
rev: 0.7.22
|
|
78
|
+
hooks:
|
|
79
|
+
- id: mdformat
|
|
80
|
+
exclude: ^\.venv/|^src/
|
|
81
|
+
additional_dependencies: ["mdformat-ruff"]
|
|
82
|
+
- repo: https://github.com/fredrikaverpil/creosote
|
|
83
|
+
rev: v4.1.0
|
|
84
|
+
hooks:
|
|
85
|
+
- id: creosote
|
|
86
|
+
exclude: ^\.venv/|^src/
|
|
87
|
+
stages: ["pre-push", "manual"]
|
|
88
|
+
- repo: https://github.com/rohaquinlop/complexipy-pre-commit
|
|
89
|
+
rev: v3.3.0
|
|
90
|
+
hooks:
|
|
91
|
+
- id: complexipy
|
|
92
|
+
args: ["-d", "low", "--max-complexity-allowed", "15"]
|
|
93
|
+
files: ^raindropio_mcp/.*\.py$
|
|
94
|
+
exclude: ^(\.venv/|tests/)|^src/
|
|
95
|
+
stages: ["pre-push", "manual"]
|
|
96
|
+
- repo: https://github.com/dosisod/refurb
|
|
97
|
+
rev: v2.2.0
|
|
98
|
+
hooks:
|
|
99
|
+
- id: refurb
|
|
100
|
+
files: ^raindropio_mcp/.*\.py$
|
|
101
|
+
exclude: ^tests/|^src/
|
|
102
|
+
stages: ["pre-push", "manual"]
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Repository Guidelines
|
|
2
|
+
|
|
3
|
+
## Project Structure & Module Organization
|
|
4
|
+
|
|
5
|
+
Core MCP code lives in `raindropio_mcp/`, with functional domains under `auth/`, `clients/`, `tools/`, `config/`, and `utils/`. `server.py` hosts the FastMCP entrypoint, while `main.py` and `__main__.py` wire configuration, tool registration, and observability. Tests mirror the package layout in `tests/`, `docs/` holds shared references, `monitoring/` stores dashboards, and runnable samples sit in `examples/`. Coverage output from pytest lands in `htmlcov/`.
|
|
6
|
+
|
|
7
|
+
## Build, Test, and Development Commands
|
|
8
|
+
|
|
9
|
+
Install dependencies with `uv sync`. Use `uv run python -m raindropio_mcp` (or `uv run raindropio-mcp`) to start the server locally. Run the full quality suite via `uv run crackerjack`; it chains Ruff, mypy, pytest, and Bandit. For targeted checks: `uv run ruff check --fix` formats and lints, `uv run mypy .` enforces typing, and `uv run pytest --cov=. --cov-report=html` regenerates coverage reports.
|
|
10
|
+
|
|
11
|
+
## Coding Style & Naming Conventions
|
|
12
|
+
|
|
13
|
+
Target Python 3.13 with 4-space indentation and Ruff-enforced 88-character lines. Keep functions and modules in `snake_case`, classes in `PascalCase`, and constants in `SCREAMING_SNAKE_CASE`. Maintain strict typing (`disallow_untyped_defs = true`) by annotating functions and preferring typed dataclasses or Pydantic models for payloads. Normalise imports with `uv run ruff check --select I --fix` before committing.
|
|
14
|
+
|
|
15
|
+
## Testing Guidelines
|
|
16
|
+
|
|
17
|
+
Pytest discovers `test_*.py` and `*_test.py` modules; test functions must start with `test_`. Shared fixtures belong in `tests/conftest.py`. Maintain ≥80% coverage by running `uv run pytest --cov=. --cov-report=html` and reviewing `htmlcov/index.html` for gaps. Write integration tests when adding MCP tools to exercise end-to-end flows.
|
|
18
|
+
|
|
19
|
+
## Commit & Pull Request Guidelines
|
|
20
|
+
|
|
21
|
+
Use imperative commit subjects (e.g., `Add Raindrop task sync`) and keep each commit scoped to one concern. Before opening a PR, run `uv run crackerjack` and include the output in the description. Link relevant issues, call out configuration or schema changes, and attach screenshots or sample MCP transcripts when behaviour shifts. Highlight new environment variables so reviewers can update `.env.example`.
|
|
22
|
+
|
|
23
|
+
## Security & Configuration Tips
|
|
24
|
+
|
|
25
|
+
Copy `.env.example` when bootstrapping and populate it with your Raindrop.io token locally—never commit secrets. Rotate personal tokens used for testing and rely on the structured logger for tool telemetry to preserve PII masking. Review `docs/` before altering authentication or observability flows to stay aligned with platform requirements.
|