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.
Files changed (94) hide show
  1. raindropio_mcp-0.1.1/.coverage-ratchet.json +16 -0
  2. raindropio_mcp-0.1.1/.github/FUNDING.yml +1 -0
  3. raindropio_mcp-0.1.1/.gitignore +17 -0
  4. raindropio_mcp-0.1.1/.idea/copilot.data.migration.agent.xml +6 -0
  5. raindropio_mcp-0.1.1/.idea/inspectionProfiles/Project_Default.xml +29 -0
  6. raindropio_mcp-0.1.1/.idea/inspectionProfiles/profiles_settings.xml +6 -0
  7. raindropio_mcp-0.1.1/.idea/modules.xml +8 -0
  8. raindropio_mcp-0.1.1/.idea/raindropio-mcp.iml +10 -0
  9. raindropio_mcp-0.1.1/.idea/ruff.xml +6 -0
  10. raindropio_mcp-0.1.1/.idea/vcs.xml +4 -0
  11. raindropio_mcp-0.1.1/.idea/workspace.xml +193 -0
  12. raindropio_mcp-0.1.1/.pre-commit-config.yaml +102 -0
  13. raindropio_mcp-0.1.1/AGENTS.md +25 -0
  14. raindropio_mcp-0.1.1/CLAUDE.md +222 -0
  15. raindropio_mcp-0.1.1/LICENSE +29 -0
  16. raindropio_mcp-0.1.1/PKG-INFO +168 -0
  17. raindropio_mcp-0.1.1/QWEN.md +105 -0
  18. raindropio_mcp-0.1.1/README.md +155 -0
  19. raindropio_mcp-0.1.1/coverage.json +1 -0
  20. raindropio_mcp-0.1.1/docs/README.md +25 -0
  21. raindropio_mcp-0.1.1/docs/clients.md +34 -0
  22. raindropio_mcp-0.1.1/docs/operations.md +51 -0
  23. raindropio_mcp-0.1.1/docs/overview.md +34 -0
  24. raindropio_mcp-0.1.1/example.mcp.dev.json +23 -0
  25. raindropio_mcp-0.1.1/example.mcp.json +16 -0
  26. raindropio_mcp-0.1.1/examples/auth_example.py +19 -0
  27. raindropio_mcp-0.1.1/examples/base_client_usage.py +32 -0
  28. raindropio_mcp-0.1.1/monitoring/alert_rules.yml +40 -0
  29. raindropio_mcp-0.1.1/monitoring/prometheus.yml +37 -0
  30. raindropio_mcp-0.1.1/mypy.ini +9 -0
  31. raindropio_mcp-0.1.1/pyproject.toml +157 -0
  32. raindropio_mcp-0.1.1/raindropio_mcp/__init__.py +16 -0
  33. raindropio_mcp-0.1.1/raindropio_mcp/__main__.py +8 -0
  34. raindropio_mcp-0.1.1/raindropio_mcp/auth/__init__.py +5 -0
  35. raindropio_mcp-0.1.1/raindropio_mcp/auth/token_provider.py +29 -0
  36. raindropio_mcp-0.1.1/raindropio_mcp/clients/__init__.py +6 -0
  37. raindropio_mcp-0.1.1/raindropio_mcp/clients/base_client.py +216 -0
  38. raindropio_mcp-0.1.1/raindropio_mcp/clients/client_factory.py +34 -0
  39. raindropio_mcp-0.1.1/raindropio_mcp/clients/raindrop_client.py +486 -0
  40. raindropio_mcp-0.1.1/raindropio_mcp/config/__init__.py +5 -0
  41. raindropio_mcp-0.1.1/raindropio_mcp/config/settings.py +111 -0
  42. raindropio_mcp-0.1.1/raindropio_mcp/main.py +87 -0
  43. raindropio_mcp-0.1.1/raindropio_mcp/models/__init__.py +77 -0
  44. raindropio_mcp-0.1.1/raindropio_mcp/models/batch_payloads.py +66 -0
  45. raindropio_mcp-0.1.1/raindropio_mcp/models/bookmark.py +71 -0
  46. raindropio_mcp-0.1.1/raindropio_mcp/models/collection.py +65 -0
  47. raindropio_mcp-0.1.1/raindropio_mcp/models/filter_payloads.py +50 -0
  48. raindropio_mcp-0.1.1/raindropio_mcp/models/highlight.py +65 -0
  49. raindropio_mcp-0.1.1/raindropio_mcp/models/import_export_payloads.py +38 -0
  50. raindropio_mcp-0.1.1/raindropio_mcp/models/payloads.py +54 -0
  51. raindropio_mcp-0.1.1/raindropio_mcp/models/tag.py +24 -0
  52. raindropio_mcp-0.1.1/raindropio_mcp/models/user.py +36 -0
  53. raindropio_mcp-0.1.1/raindropio_mcp/server.py +53 -0
  54. raindropio_mcp-0.1.1/raindropio_mcp/tools/__init__.py +40 -0
  55. raindropio_mcp-0.1.1/raindropio_mcp/tools/account.py +35 -0
  56. raindropio_mcp-0.1.1/raindropio_mcp/tools/batch.py +91 -0
  57. raindropio_mcp-0.1.1/raindropio_mcp/tools/bookmarks.py +122 -0
  58. raindropio_mcp-0.1.1/raindropio_mcp/tools/collections.py +105 -0
  59. raindropio_mcp-0.1.1/raindropio_mcp/tools/filters.py +62 -0
  60. raindropio_mcp-0.1.1/raindropio_mcp/tools/highlights.py +82 -0
  61. raindropio_mcp-0.1.1/raindropio_mcp/tools/import_export.py +61 -0
  62. raindropio_mcp-0.1.1/raindropio_mcp/tools/system.py +28 -0
  63. raindropio_mcp-0.1.1/raindropio_mcp/tools/tags.py +57 -0
  64. raindropio_mcp-0.1.1/raindropio_mcp/tools/tool_registry.py +80 -0
  65. raindropio_mcp-0.1.1/raindropio_mcp/utils/__init__.py +27 -0
  66. raindropio_mcp-0.1.1/raindropio_mcp/utils/exceptions.py +143 -0
  67. raindropio_mcp-0.1.1/tests/__init__.py +0 -0
  68. raindropio_mcp-0.1.1/tests/conftest.py +18 -0
  69. raindropio_mcp-0.1.1/tests/unit/test_account_tools.py +46 -0
  70. raindropio_mcp-0.1.1/tests/unit/test_base_client.py +86 -0
  71. raindropio_mcp-0.1.1/tests/unit/test_base_client_extended.py +292 -0
  72. raindropio_mcp-0.1.1/tests/unit/test_batch_client.py +153 -0
  73. raindropio_mcp-0.1.1/tests/unit/test_batch_tools.py +185 -0
  74. raindropio_mcp-0.1.1/tests/unit/test_bookmark_tools.py +144 -0
  75. raindropio_mcp-0.1.1/tests/unit/test_client_factory.py +62 -0
  76. raindropio_mcp-0.1.1/tests/unit/test_collection_tools.py +86 -0
  77. raindropio_mcp-0.1.1/tests/unit/test_exceptions.py +19 -0
  78. raindropio_mcp-0.1.1/tests/unit/test_filter_client.py +91 -0
  79. raindropio_mcp-0.1.1/tests/unit/test_filter_tools.py +111 -0
  80. raindropio_mcp-0.1.1/tests/unit/test_highlight_client.py +208 -0
  81. raindropio_mcp-0.1.1/tests/unit/test_highlight_tools.py +173 -0
  82. raindropio_mcp-0.1.1/tests/unit/test_import_export_client.py +155 -0
  83. raindropio_mcp-0.1.1/tests/unit/test_import_export_tools.py +107 -0
  84. raindropio_mcp-0.1.1/tests/unit/test_main.py +114 -0
  85. raindropio_mcp-0.1.1/tests/unit/test_main_module.py +11 -0
  86. raindropio_mcp-0.1.1/tests/unit/test_main_server.py +101 -0
  87. raindropio_mcp-0.1.1/tests/unit/test_raindrop_client.py +95 -0
  88. raindropio_mcp-0.1.1/tests/unit/test_raindrop_client_extended.py +385 -0
  89. raindropio_mcp-0.1.1/tests/unit/test_server.py +63 -0
  90. raindropio_mcp-0.1.1/tests/unit/test_settings.py +30 -0
  91. raindropio_mcp-0.1.1/tests/unit/test_tag_tools.py +60 -0
  92. raindropio_mcp-0.1.1/tests/unit/test_token_provider.py +17 -0
  93. raindropio_mcp-0.1.1/tests/unit/test_tools.py +99 -0
  94. 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,17 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ /.venv/
11
+ /.envrc
12
+ /.mcp.json
13
+ /.python-version
14
+ /.coverage
15
+ /.claude/
16
+ /htmlcov/
17
+ /.benchmarks/
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="AgentMigrationStateService">
4
+ <option name="migrationStatus" value="COMPLETED" />
5
+ </component>
6
+ </project>
@@ -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,6 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <settings>
3
+ <option name="USE_PROJECT_PROFILE" value="false" />
4
+ <version value="1.0" />
5
+ </settings>
6
+ </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,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="RuffConfigService">
4
+ <option name="globalRuffExecutablePath" value="/usr/local/bin/ruff" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings" defaultProject="true" />
4
+ </project>
@@ -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.