airbyte-internal-ops 0.6.1__py3-none-any.whl → 0.7.1__py3-none-any.whl
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.
- {airbyte_internal_ops-0.6.1.dist-info → airbyte_internal_ops-0.7.1.dist-info}/METADATA +6 -1
- {airbyte_internal_ops-0.6.1.dist-info → airbyte_internal_ops-0.7.1.dist-info}/RECORD +33 -30
- airbyte_ops_mcp/_sentry.py +101 -0
- airbyte_ops_mcp/cli/app.py +1 -1
- airbyte_ops_mcp/cli/{repo.py → local.py} +131 -8
- airbyte_ops_mcp/connector_ops/__init__.py +17 -0
- airbyte_ops_mcp/connector_ops/utils.py +859 -0
- airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/assets.py +4 -5
- airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/documentation/__init__.py +1 -1
- airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/documentation/documentation.py +23 -22
- airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/documentation/models.py +7 -7
- airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/metadata.py +15 -15
- airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/packaging.py +11 -9
- airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/security.py +16 -20
- airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/version.py +94 -18
- airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/cli.py +6 -8
- airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/models.py +7 -8
- airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/utils.py +2 -2
- airbyte_ops_mcp/mcp/_guidance.py +37 -0
- airbyte_ops_mcp/mcp/cloud_connector_versions.py +46 -9
- airbyte_ops_mcp/mcp/server.py +5 -0
- {airbyte_internal_ops-0.6.1.dist-info → airbyte_internal_ops-0.7.1.dist-info}/WHEEL +0 -0
- {airbyte_internal_ops-0.6.1.dist-info → airbyte_internal_ops-0.7.1.dist-info}/entry_points.txt +0 -0
- /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/README.md +0 -0
- /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/__init__.py +0 -0
- /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/__init__.py +0 -0
- /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/documentation/helpers.py +0 -0
- /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/documentation/templates/documentation_headers_check_description.md.j2 +0 -0
- /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/documentation/templates/section_content_description.md.j2 +0 -0
- /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/checks/documentation/templates/template.md.j2 +0 -0
- /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/consts.py +0 -0
- /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/templates/__init__.py +0 -0
- /airbyte_ops_mcp/{_legacy/airbyte_ci/connector_qa → connector_qa}/templates/qa_checks.md.j2 +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: airbyte-internal-ops
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.1
|
|
4
4
|
Summary: MCP and API interfaces that let the agents do the admin work
|
|
5
5
|
Author-email: Aaron Steers <aj@airbyte.io>
|
|
6
6
|
Keywords: admin,airbyte,api,mcp
|
|
@@ -15,6 +15,7 @@ Requires-Dist: airbyte-cdk<8.0,>=7.3.9
|
|
|
15
15
|
Requires-Dist: airbyte-connector-models<1.0,>=0.1.3
|
|
16
16
|
Requires-Dist: airbyte-protocol-models-pdv2>=0.13.0
|
|
17
17
|
Requires-Dist: airbyte==0.35.4
|
|
18
|
+
Requires-Dist: asyncclick<9.0,>=8.1.7
|
|
18
19
|
Requires-Dist: asyncer<1.0,>=0.0.4
|
|
19
20
|
Requires-Dist: click<9.0,>=8.1.3
|
|
20
21
|
Requires-Dist: cloud-sql-python-connector[pg8000]<2.0,>=1.7.0
|
|
@@ -28,12 +29,16 @@ Requires-Dist: google-cloud-logging<4.0,>=3.9.0
|
|
|
28
29
|
Requires-Dist: google-cloud-secret-manager<3.0,>=2.18.0
|
|
29
30
|
Requires-Dist: google-cloud-storage<3.0,>=2.8.0
|
|
30
31
|
Requires-Dist: jinja2<4.0,>=3.1.2
|
|
32
|
+
Requires-Dist: markdown-it-py<3.0,>=2.2.0
|
|
31
33
|
Requires-Dist: pydantic>=2.0.0
|
|
34
|
+
Requires-Dist: pydash<8.0,>=6.0.2
|
|
32
35
|
Requires-Dist: python-dotenv<2.0,>=1.0.0
|
|
33
36
|
Requires-Dist: pyyaml<7.0,>=6.0.0
|
|
34
37
|
Requires-Dist: requests<3.0,>=2.31.0
|
|
35
38
|
Requires-Dist: rich<14.0,>=13.0.0
|
|
36
39
|
Requires-Dist: semver<4.0,>=3.0.1
|
|
40
|
+
Requires-Dist: sentry-sdk>=2.50.0
|
|
41
|
+
Requires-Dist: simpleeval<1.0,>=0.9.13
|
|
37
42
|
Requires-Dist: slack-sdk<4.0,>=3.36.0
|
|
38
43
|
Requires-Dist: sqlalchemy<3.0,>=2.0.0
|
|
39
44
|
Requires-Dist: toml<1.0,>=0.10.2
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
airbyte_ops_mcp/__init__.py,sha256=tuzdlMkfnWBnsri5KGHM2M_xuNnzFk2u_aR79mmN7Yg,772
|
|
2
|
+
airbyte_ops_mcp/_sentry.py,sha256=bCgLfIdD6Jf_8bdLkhs0JchtMLXLiK3skPxaRK36fzU,3351
|
|
2
3
|
airbyte_ops_mcp/constants.py,sha256=xU8ARMs7jG0-1hseKn3K1dmhyMOMM3JTetRZugLSKEo,7695
|
|
3
4
|
airbyte_ops_mcp/docker_hub.py,sha256=qdOYpj2KOFOsEGsl2b2rcVPzyYDharOVM_lJxNTytds,5833
|
|
4
5
|
airbyte_ops_mcp/gcp_auth.py,sha256=i0cm1_xX4fj_31iKlfARpNvTaSr85iGTSw9KMf4f4MU,7206
|
|
@@ -150,27 +151,6 @@ airbyte_ops_mcp/_legacy/airbyte_ci/connector_pipelines/models/steps.py,sha256=t7
|
|
|
150
151
|
airbyte_ops_mcp/_legacy/airbyte_ci/connector_pipelines/models/contexts/__init__.py,sha256=4Hw-PX1-VgESLF16cDdvuYCzGJtHntThLF4qIiULWeo,61
|
|
151
152
|
airbyte_ops_mcp/_legacy/airbyte_ci/connector_pipelines/models/contexts/click_pipeline_context.py,sha256=aPwt8XTzt2NOIU2ItAj0mLTZu4lmQwgwut7iOfM6lnI,5458
|
|
152
153
|
airbyte_ops_mcp/_legacy/airbyte_ci/connector_pipelines/models/contexts/pipeline_context.py,sha256=68lfAR5NuLMqUgaHayJKkwXt-vqcucsKWq5L6PA4rqA,15640
|
|
153
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/README.md,sha256=ajuFHew-gZPqGwoX3AAPbGvuysUyQJqTKmzvVEDJRWk,5146
|
|
154
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
155
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/cli.py,sha256=-GpHJvlZDBU49XJmepBDqXlkRmf47K4GIpQYG0tVkKk,5152
|
|
156
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/consts.py,sha256=XK0M1dend18Mz1ThxS-tUEiU1zb_4HUcje7BR9Eb6mQ,1161
|
|
157
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/models.py,sha256=VSTLs7CSObwF5_m6Fh1tYZODAMgGxeTuEMIBjRsbpA0,11572
|
|
158
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/utils.py,sha256=MSQFYK87hLXISh2IeDHJTDap23ZOHI_vEB9qoOLbe0I,1514
|
|
159
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/__init__.py,sha256=aN4T6K0hfj-jOroBNu93BD5FKG9XxCjDiL1foZLNQkg,578
|
|
160
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/assets.py,sha256=cQqM1UTNo3VBYjg8b_dgMVJzbqNuE-9fZnhJT2CZsi8,4440
|
|
161
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/metadata.py,sha256=d3ZhQPgyGN-Q4is2M1j0GPio2OUyAy65kBm0KGM5vAQ,11256
|
|
162
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/packaging.py,sha256=ME5MtSIs5NFlpN1eYe_FpOWKanNfe9nRJpFinFw5HHQ,11383
|
|
163
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/security.py,sha256=bd0AX9f7O78RfebYgxDh5LAur-WNrV5vdTGx-MlHqAU,6140
|
|
164
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/version.py,sha256=W-3YC5mQoykpAcqUag0wJsCkv1u8sbGp32wea5QAuZo,5629
|
|
165
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/documentation/__init__.py,sha256=8KFZmApEqToxV9wolNKSbNy8LO6z6J0pDSKDCHExQBQ,1058
|
|
166
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/documentation/documentation.py,sha256=4Vkos46JmMxYSTUMOvDXT2FdYgFhKlPlnRPDlfAhx8o,28187
|
|
167
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/documentation/helpers.py,sha256=89ueBU9uo3f-fOcD3Jd7J8XoO8ymRSZc0vPf9CQ9MCc,6250
|
|
168
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/documentation/models.py,sha256=-X8RpJ3QdLFOTLTwPcBE7arR-Fx6VPfaJE_qn7BdTNg,5533
|
|
169
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/documentation/templates/documentation_headers_check_description.md.j2,sha256=EFcYAhOQvvoc58YO_yqu6DgmSZFe8l0JnOTmG_3g7e4,572
|
|
170
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/documentation/templates/section_content_description.md.j2,sha256=2TXJbvt_S9-PTlJ-MmC3xUanpOvuCY4dUjTYuoocwdc,365
|
|
171
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/checks/documentation/templates/template.md.j2,sha256=bYxLfOP3GDwQC9Q3PiVbxsL5GS0p5b10k1dwzfOrm1M,1962
|
|
172
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
173
|
-
airbyte_ops_mcp/_legacy/airbyte_ci/connector_qa/templates/qa_checks.md.j2,sha256=v3NyYUAYkqRiYAFDQ2NgpgYK6PIDhDKrqfRgpX8454s,1946
|
|
174
154
|
airbyte_ops_mcp/_legacy/airbyte_ci/metadata_service/README.md,sha256=uAAl7KUD4NRgwRhyTAgRSV7NVYMELfGRiGGVmDar8ss,602
|
|
175
155
|
airbyte_ops_mcp/_legacy/airbyte_ci/metadata_service/commands.py,sha256=5nUC1UF6Jt0I9XmnH_ON1c24JlG8Y3lwkc9EATKQ0sA,13338
|
|
176
156
|
airbyte_ops_mcp/_legacy/airbyte_ci/metadata_service/constants.py,sha256=bSXsx-RQjRh5Nlw0-621p28UuaUx4B9PKSe-TF3HEpc,2664
|
|
@@ -243,11 +223,11 @@ airbyte_ops_mcp/airbyte_repo/utils.py,sha256=TXlOAfhiu_hVRNjCxB4PRPVDhTWCU5lYmgq
|
|
|
243
223
|
airbyte_ops_mcp/cli/__init__.py,sha256=XpL7FyVfgabfBF2JR7u7NwJ2krlYqjd_OwLcWf-Xc7s,114
|
|
244
224
|
airbyte_ops_mcp/cli/_base.py,sha256=I8tWnyQf0ks4r3J8N8h-5GZxyn37T-55KsbuHnxYlcg,415
|
|
245
225
|
airbyte_ops_mcp/cli/_shared.py,sha256=jg-xMyGzTCGPqKd8VTfE_3kGPIyO_3Kx5sQbG4rPc0Y,1311
|
|
246
|
-
airbyte_ops_mcp/cli/app.py,sha256=
|
|
226
|
+
airbyte_ops_mcp/cli/app.py,sha256=xxlyJzlFvZuy-qKAhTPPmzj-t0o7MSqQ7aPHonfT1vU,790
|
|
247
227
|
airbyte_ops_mcp/cli/cloud.py,sha256=jac0FcG3UvNNeNNhqZR04uY9BCyVvins1kjO0LRZ86Y,45861
|
|
248
228
|
airbyte_ops_mcp/cli/gh.py,sha256=koJPu0MDB6AW7mJq2z4dZV65ofvsZTkqoeitGF8KJR8,5364
|
|
229
|
+
airbyte_ops_mcp/cli/local.py,sha256=7C6PZ2RHDnOciurrSan5te93LWPjC1Rfwes6y37JL5Q,20756
|
|
249
230
|
airbyte_ops_mcp/cli/registry.py,sha256=L4nDKhlegr31gSE-GUvDFSq10KgDz5kJuZXgLIxYIyg,9785
|
|
250
|
-
airbyte_ops_mcp/cli/repo.py,sha256=G1hoQpH0XYhUH3FFOsia9xabGB0LP9o3XcwBuqvFVo0,16331
|
|
251
231
|
airbyte_ops_mcp/cloud_admin/__init__.py,sha256=cqE96Q10Kp6elhH9DAi6TVsIwSUy3sooDLLrxTaktGk,816
|
|
252
232
|
airbyte_ops_mcp/cloud_admin/api_client.py,sha256=pzdnZpIxOaXJsF_vQuw9_goiDbqwgEQxFwZwsoupY40,57459
|
|
253
233
|
airbyte_ops_mcp/cloud_admin/auth.py,sha256=qE2Aqe0qbZB755KscL65s54Jz78-F-X5a8fXKsrYEOQ,3749
|
|
@@ -257,11 +237,34 @@ airbyte_ops_mcp/connection_config_retriever/__init__.py,sha256=Xoi-YvARrNPhECdpw
|
|
|
257
237
|
airbyte_ops_mcp/connection_config_retriever/audit_logging.py,sha256=QdOG9984NXeMaKeJnFUZ4oCOmqi37PBRG2NRBBjrZQQ,2753
|
|
258
238
|
airbyte_ops_mcp/connection_config_retriever/retrieval.py,sha256=s6yeCyrboWkUd6KdaheEo87x-rLtQNTL8XeR8O9z2HI,12160
|
|
259
239
|
airbyte_ops_mcp/connection_config_retriever/secrets_resolution.py,sha256=12g0lZzhCzAPl4Iv4eMW6d76mvXjIBGspOnNhywzks4,3644
|
|
240
|
+
airbyte_ops_mcp/connector_ops/__init__.py,sha256=5nkBfeHDRKVyqEln8bvPs-J1qDDM6RBvRYPgWNb5dZk,370
|
|
241
|
+
airbyte_ops_mcp/connector_ops/utils.py,sha256=yZsrdj2Jv-6rb97recNncZCkmY79EqpPiZOMUOf8ke4,28573
|
|
242
|
+
airbyte_ops_mcp/connector_qa/README.md,sha256=ajuFHew-gZPqGwoX3AAPbGvuysUyQJqTKmzvVEDJRWk,5146
|
|
243
|
+
airbyte_ops_mcp/connector_qa/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
244
|
+
airbyte_ops_mcp/connector_qa/cli.py,sha256=e9hygxSttegibGzs3g6xEJ1AiXEnOnrIFQQEsNWTY6E,5037
|
|
245
|
+
airbyte_ops_mcp/connector_qa/consts.py,sha256=XK0M1dend18Mz1ThxS-tUEiU1zb_4HUcje7BR9Eb6mQ,1161
|
|
246
|
+
airbyte_ops_mcp/connector_qa/models.py,sha256=PDWeKVzqOa5VLa5iLHE76h7qePL3r-zhf8dmeLuXMUw,11488
|
|
247
|
+
airbyte_ops_mcp/connector_qa/utils.py,sha256=AtegjKBGmYqq9juPedJ4-Jt7LBxcD4ZYNIIS7iLEqiU,1476
|
|
248
|
+
airbyte_ops_mcp/connector_qa/checks/__init__.py,sha256=aN4T6K0hfj-jOroBNu93BD5FKG9XxCjDiL1foZLNQkg,578
|
|
249
|
+
airbyte_ops_mcp/connector_qa/checks/assets.py,sha256=94LgVaHmlDkVL3u6dkHHHUtyXv8xsTk_QjESeUfYYIU,4369
|
|
250
|
+
airbyte_ops_mcp/connector_qa/checks/metadata.py,sha256=ZSIc-odQ8lyuOGVLCVMqqzgaulo47a7exwjOEt-UVDs,11332
|
|
251
|
+
airbyte_ops_mcp/connector_qa/checks/packaging.py,sha256=KyS9vc0FmvLrxZUVwizoWN-D60sMCUmH2nplJ3KGEZI,11456
|
|
252
|
+
airbyte_ops_mcp/connector_qa/checks/security.py,sha256=JEZJAOrAXF6PsLKZQAJ1JDLQpiBPaF_4aLdBO9y5buI,6072
|
|
253
|
+
airbyte_ops_mcp/connector_qa/checks/version.py,sha256=zWLmLLbBooPGmJhHzQ6glOfwc2DPjujkKvAVuZeezOI,9240
|
|
254
|
+
airbyte_ops_mcp/connector_qa/checks/documentation/__init__.py,sha256=CFLhD2C4tlGkYcLRnd6xSzWB1MvQfXXswgp76HcoIjk,1039
|
|
255
|
+
airbyte_ops_mcp/connector_qa/checks/documentation/documentation.py,sha256=cA8f2huCi4Jcut9sOkmwnuEFcoxmwDRWokHKsy6KubY,28236
|
|
256
|
+
airbyte_ops_mcp/connector_qa/checks/documentation/helpers.py,sha256=89ueBU9uo3f-fOcD3Jd7J8XoO8ymRSZc0vPf9CQ9MCc,6250
|
|
257
|
+
airbyte_ops_mcp/connector_qa/checks/documentation/models.py,sha256=c4xH7TsLI0EqkdwwTOYA_RpeU-zxvFRuy9ZNKcd_FjQ,5533
|
|
258
|
+
airbyte_ops_mcp/connector_qa/checks/documentation/templates/documentation_headers_check_description.md.j2,sha256=EFcYAhOQvvoc58YO_yqu6DgmSZFe8l0JnOTmG_3g7e4,572
|
|
259
|
+
airbyte_ops_mcp/connector_qa/checks/documentation/templates/section_content_description.md.j2,sha256=2TXJbvt_S9-PTlJ-MmC3xUanpOvuCY4dUjTYuoocwdc,365
|
|
260
|
+
airbyte_ops_mcp/connector_qa/checks/documentation/templates/template.md.j2,sha256=bYxLfOP3GDwQC9Q3PiVbxsL5GS0p5b10k1dwzfOrm1M,1962
|
|
261
|
+
airbyte_ops_mcp/connector_qa/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
262
|
+
airbyte_ops_mcp/connector_qa/templates/qa_checks.md.j2,sha256=v3NyYUAYkqRiYAFDQ2NgpgYK6PIDhDKrqfRgpX8454s,1946
|
|
260
263
|
airbyte_ops_mcp/gcp_logs/__init__.py,sha256=IqkxclXJnD1U4L2at7aC9GYqPXnuLdYLgmkm3ZiIu6s,409
|
|
261
264
|
airbyte_ops_mcp/gcp_logs/error_lookup.py,sha256=Ufl1FtNQJKP_yWndVT1Xku1mT-gxW_0atmNMCYMXvOo,12757
|
|
262
265
|
airbyte_ops_mcp/mcp/__init__.py,sha256=Y5K-iKUxSY5KM_2XWrYRJqGpjjTHE_ezriED98ZzalU,538
|
|
263
|
-
airbyte_ops_mcp/mcp/_guidance.py,sha256=
|
|
264
|
-
airbyte_ops_mcp/mcp/cloud_connector_versions.py,sha256=
|
|
266
|
+
airbyte_ops_mcp/mcp/_guidance.py,sha256=n0dLggQXNi2PKZ0eFDqQx5YIjhQpMnI3xcjouub9AGA,4211
|
|
267
|
+
airbyte_ops_mcp/mcp/cloud_connector_versions.py,sha256=dRKrgsRGadQieTSvBrc5HYI6TTDzVAT6-4tiOHNcDHU,36244
|
|
265
268
|
airbyte_ops_mcp/mcp/connector_analysis.py,sha256=OC4KrOSkMkKPkOisWnSv96BDDE5TQYHq-Jxa2vtjJpo,298
|
|
266
269
|
airbyte_ops_mcp/mcp/connector_qa.py,sha256=aImpqdnqBPDrz10BS0owsV4kuIU2XdalzgbaGZsbOL0,258
|
|
267
270
|
airbyte_ops_mcp/mcp/gcp_logs.py,sha256=QCDQHmsxQHJ26BB0sxkBgKXr7Ja9wVFkdpY6423H-xo,2677
|
|
@@ -273,7 +276,7 @@ airbyte_ops_mcp/mcp/prod_db_queries.py,sha256=EdZyrccrM5tHKEtjks4598hzbZ62FuDCCH
|
|
|
273
276
|
airbyte_ops_mcp/mcp/prompts.py,sha256=v4bguskw7hSsISkseACzKQm5QwrIXmiwbs27oclXTE8,1591
|
|
274
277
|
airbyte_ops_mcp/mcp/registry.py,sha256=PW-VYUj42qx2pQ_apUkVaoUFq7VgB9zEU7-aGrkSCCw,290
|
|
275
278
|
airbyte_ops_mcp/mcp/regression_tests.py,sha256=zwdQ-ymUhWtVcIjwiNIZAC151GKhuxi55HDi4S91RnI,17046
|
|
276
|
-
airbyte_ops_mcp/mcp/server.py,sha256=
|
|
279
|
+
airbyte_ops_mcp/mcp/server.py,sha256=ID7wZIds8e-qcGAhsaK0vTJDQQ4YNSdYKTQGQWL3Evw,7280
|
|
277
280
|
airbyte_ops_mcp/prod_db_access/__init__.py,sha256=5pxouMPY1beyWlB0UwPnbaLTKTHqU6X82rbbgKY2vYU,1069
|
|
278
281
|
airbyte_ops_mcp/prod_db_access/db_engine.py,sha256=VUqEWZtharJUR-Cri_pMwtGh1C4Neu4s195mbEXlm-w,9190
|
|
279
282
|
airbyte_ops_mcp/prod_db_access/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -302,7 +305,7 @@ airbyte_ops_mcp/regression_tests/regression/comparators.py,sha256=MJkLZEKHivgrG0
|
|
|
302
305
|
airbyte_ops_mcp/regression_tests/validation/__init__.py,sha256=MBEwGOoNuqT4_oCahtoK62OKWIjUCfWa7vZTxNj_0Ek,1532
|
|
303
306
|
airbyte_ops_mcp/regression_tests/validation/catalog_validators.py,sha256=jqqVAMOk0mtdPgwu4d0hA0ZEjtsNh5gapvGydRv3_qk,12553
|
|
304
307
|
airbyte_ops_mcp/regression_tests/validation/record_validators.py,sha256=RjauAhKWNwxMBTu0eNS2hMFNQVs5CLbQU51kp6FOVDk,7432
|
|
305
|
-
airbyte_internal_ops-0.
|
|
306
|
-
airbyte_internal_ops-0.
|
|
307
|
-
airbyte_internal_ops-0.
|
|
308
|
-
airbyte_internal_ops-0.
|
|
308
|
+
airbyte_internal_ops-0.7.1.dist-info/METADATA,sha256=t0gLi4mWDcu44KHUYJJ43_6l1fFlkQBnO2V9ywznbNQ,5964
|
|
309
|
+
airbyte_internal_ops-0.7.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
310
|
+
airbyte_internal_ops-0.7.1.dist-info/entry_points.txt,sha256=WxP0l7bRFss4Cr5uQqVj9mTEKwnRKouNuphXQF0lotA,171
|
|
311
|
+
airbyte_internal_ops-0.7.1.dist-info/RECORD,,
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Copyright (c) 2025 Airbyte, Inc., all rights reserved.
|
|
2
|
+
"""Sentry error tracking integration for airbyte-ops-mcp.
|
|
3
|
+
|
|
4
|
+
This module provides automatic error tracking via Sentry for the airbyte-ops-mcp
|
|
5
|
+
package. Errors during server startup, tool execution, and API interactions are
|
|
6
|
+
automatically captured and reported.
|
|
7
|
+
|
|
8
|
+
The Sentry DSN is embedded in the package since it only allows write access
|
|
9
|
+
(sending errors), not read access. This is standard practice for client-side
|
|
10
|
+
error tracking.
|
|
11
|
+
|
|
12
|
+
To disable Sentry tracking, set the environment variable:
|
|
13
|
+
AIRBYTE_DISABLE_SENTRY=1
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import logging
|
|
17
|
+
import os
|
|
18
|
+
from typing import Literal
|
|
19
|
+
|
|
20
|
+
import sentry_sdk
|
|
21
|
+
|
|
22
|
+
# Valid Sentry severity levels
|
|
23
|
+
SentryLevel = Literal["fatal", "error", "warning", "info", "debug"]
|
|
24
|
+
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
# Environment variable to disable Sentry tracking
|
|
28
|
+
DISABLE_SENTRY_ENV_VAR = "AIRBYTE_DISABLE_SENTRY"
|
|
29
|
+
|
|
30
|
+
# Sentry DSN for the airbyte-ops-mcp project
|
|
31
|
+
# This DSN only allows sending errors to Sentry, not reading data.
|
|
32
|
+
# It is safe to embed in client-side code per Sentry's documentation.
|
|
33
|
+
# Project: https://airbytehq.sentry.io/projects/internal-ops-app/
|
|
34
|
+
_SENTRY_DSN = "https://292842cbf7f632f34c68cff23f2deee3@o1009025.ingest.us.sentry.io/4510746336559104"
|
|
35
|
+
|
|
36
|
+
_sentry_initialized = False
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _get_package_version() -> str:
|
|
40
|
+
"""Get the package version for Sentry release tracking."""
|
|
41
|
+
try:
|
|
42
|
+
from importlib.metadata import version
|
|
43
|
+
|
|
44
|
+
return version("airbyte-internal-ops")
|
|
45
|
+
except Exception as exc:
|
|
46
|
+
logger.debug("Failed to get package version for Sentry release", exc_info=exc)
|
|
47
|
+
return "unknown"
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def init_sentry_tracking() -> bool:
|
|
51
|
+
"""Initialize Sentry error tracking if not already initialized.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
True if Sentry was initialized successfully, False otherwise.
|
|
55
|
+
"""
|
|
56
|
+
global _sentry_initialized
|
|
57
|
+
|
|
58
|
+
if _sentry_initialized:
|
|
59
|
+
return True
|
|
60
|
+
|
|
61
|
+
if os.getenv(DISABLE_SENTRY_ENV_VAR):
|
|
62
|
+
logger.debug("Sentry tracking is disabled via environment variable")
|
|
63
|
+
return False
|
|
64
|
+
|
|
65
|
+
try:
|
|
66
|
+
sentry_sdk.init(
|
|
67
|
+
dsn=_SENTRY_DSN,
|
|
68
|
+
release=f"airbyte-ops-mcp@{_get_package_version()}",
|
|
69
|
+
environment=os.getenv("SENTRY_ENVIRONMENT", "production"),
|
|
70
|
+
# Only send errors, not performance data
|
|
71
|
+
traces_sample_rate=0.0,
|
|
72
|
+
# Attach request data for better debugging
|
|
73
|
+
send_default_pii=False,
|
|
74
|
+
# Set server name to help identify the source
|
|
75
|
+
server_name=os.getenv("HOSTNAME", "unknown"),
|
|
76
|
+
)
|
|
77
|
+
_sentry_initialized = True
|
|
78
|
+
logger.debug("Sentry initialized successfully")
|
|
79
|
+
return True
|
|
80
|
+
except Exception as e:
|
|
81
|
+
logger.warning(f"Failed to initialize Sentry: {e}")
|
|
82
|
+
return False
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def capture_exception(exception: BaseException) -> None:
|
|
86
|
+
"""Capture an exception and send it to Sentry.
|
|
87
|
+
|
|
88
|
+
This is a convenience wrapper that ensures Sentry is initialized
|
|
89
|
+
before capturing the exception.
|
|
90
|
+
"""
|
|
91
|
+
if init_sentry_tracking():
|
|
92
|
+
sentry_sdk.capture_exception(exception)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def capture_message(message: str, level: SentryLevel = "info") -> None:
|
|
96
|
+
"""Capture a message and send it to Sentry.
|
|
97
|
+
|
|
98
|
+
This is useful for logging important events that aren't exceptions.
|
|
99
|
+
"""
|
|
100
|
+
if init_sentry_tracking():
|
|
101
|
+
sentry_sdk.capture_message(message, level=level)
|
airbyte_ops_mcp/cli/app.py
CHANGED
|
@@ -12,8 +12,8 @@ and provides the main() function for the CLI entry point.
|
|
|
12
12
|
from airbyte_ops_mcp.cli import (
|
|
13
13
|
cloud, # noqa: F401
|
|
14
14
|
gh, # noqa: F401
|
|
15
|
+
local, # noqa: F401
|
|
15
16
|
registry, # noqa: F401
|
|
16
|
-
repo, # noqa: F401
|
|
17
17
|
)
|
|
18
18
|
from airbyte_ops_mcp.cli._base import app
|
|
19
19
|
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
"""CLI commands for local Airbyte monorepo operations.
|
|
3
3
|
|
|
4
4
|
Commands:
|
|
5
|
-
airbyte-ops
|
|
6
|
-
airbyte-ops
|
|
7
|
-
airbyte-ops
|
|
5
|
+
airbyte-ops local connector list - List connectors in the monorepo
|
|
6
|
+
airbyte-ops local connector info - Get metadata for a single connector
|
|
7
|
+
airbyte-ops local connector bump-version - Bump connector version
|
|
8
|
+
airbyte-ops local connector qa - Run QA checks on a connector
|
|
9
|
+
airbyte-ops local connector qa-docs-generate - Generate QA checks documentation
|
|
8
10
|
"""
|
|
9
11
|
|
|
10
12
|
from __future__ import annotations
|
|
@@ -15,6 +17,7 @@ from typing import Annotated, Literal
|
|
|
15
17
|
|
|
16
18
|
import yaml
|
|
17
19
|
from cyclopts import App, Parameter
|
|
20
|
+
from jinja2 import Environment, PackageLoader, select_autoescape
|
|
18
21
|
from rich.console import Console
|
|
19
22
|
|
|
20
23
|
from airbyte_ops_mcp.airbyte_repo.bump_version import (
|
|
@@ -31,6 +34,19 @@ from airbyte_ops_mcp.airbyte_repo.list_connectors import (
|
|
|
31
34
|
)
|
|
32
35
|
from airbyte_ops_mcp.cli._base import app
|
|
33
36
|
from airbyte_ops_mcp.cli._shared import exit_with_error, print_json
|
|
37
|
+
from airbyte_ops_mcp.connector_ops.utils import Connector
|
|
38
|
+
from airbyte_ops_mcp.connector_qa.checks import ENABLED_CHECKS
|
|
39
|
+
from airbyte_ops_mcp.connector_qa.consts import CONNECTORS_QA_DOC_TEMPLATE_NAME
|
|
40
|
+
from airbyte_ops_mcp.connector_qa.models import (
|
|
41
|
+
Check,
|
|
42
|
+
CheckCategory,
|
|
43
|
+
CheckStatus,
|
|
44
|
+
Report,
|
|
45
|
+
)
|
|
46
|
+
from airbyte_ops_mcp.connector_qa.utils import (
|
|
47
|
+
get_all_connectors_in_directory,
|
|
48
|
+
remove_strict_encrypt_suffix,
|
|
49
|
+
)
|
|
34
50
|
from airbyte_ops_mcp.mcp.github_repo_ops import list_connectors_in_repo
|
|
35
51
|
|
|
36
52
|
console = Console()
|
|
@@ -138,13 +154,13 @@ def _get_connector_info(
|
|
|
138
154
|
}
|
|
139
155
|
|
|
140
156
|
|
|
141
|
-
# Create the
|
|
142
|
-
|
|
143
|
-
app.command(
|
|
157
|
+
# Create the local sub-app
|
|
158
|
+
local_app = App(name="local", help="Local Airbyte monorepo operations.")
|
|
159
|
+
app.command(local_app)
|
|
144
160
|
|
|
145
|
-
# Create the connector sub-app under
|
|
161
|
+
# Create the connector sub-app under local
|
|
146
162
|
connector_app = App(name="connector", help="Connector operations in the monorepo.")
|
|
147
|
-
|
|
163
|
+
local_app.command(connector_app)
|
|
148
164
|
|
|
149
165
|
|
|
150
166
|
@connector_app.command(name="list")
|
|
@@ -486,3 +502,110 @@ def bump_version(
|
|
|
486
502
|
"new_version": result.new_version,
|
|
487
503
|
}
|
|
488
504
|
)
|
|
505
|
+
|
|
506
|
+
|
|
507
|
+
@connector_app.command(name="qa")
|
|
508
|
+
def run_qa_checks(
|
|
509
|
+
name: Annotated[
|
|
510
|
+
list[str] | None,
|
|
511
|
+
Parameter(
|
|
512
|
+
help="Connector technical name(s) (e.g., source-github). Can be specified multiple times."
|
|
513
|
+
),
|
|
514
|
+
] = None,
|
|
515
|
+
connector_directory: Annotated[
|
|
516
|
+
str | None,
|
|
517
|
+
Parameter(
|
|
518
|
+
help="Directory containing connectors to run checks on all connectors in this directory."
|
|
519
|
+
),
|
|
520
|
+
] = None,
|
|
521
|
+
check: Annotated[
|
|
522
|
+
list[str] | None,
|
|
523
|
+
Parameter(help="Specific check(s) to run. Can be specified multiple times."),
|
|
524
|
+
] = None,
|
|
525
|
+
report_path: Annotated[
|
|
526
|
+
str | None,
|
|
527
|
+
Parameter(help="Path to write the JSON report file."),
|
|
528
|
+
] = None,
|
|
529
|
+
) -> None:
|
|
530
|
+
"""Run QA checks on connector(s).
|
|
531
|
+
|
|
532
|
+
Validates connector metadata, documentation, packaging, security, and versioning.
|
|
533
|
+
Exit code is non-zero if any checks fail.
|
|
534
|
+
"""
|
|
535
|
+
# Determine which checks to run
|
|
536
|
+
checks_to_run = ENABLED_CHECKS
|
|
537
|
+
if check:
|
|
538
|
+
check_names = set(check)
|
|
539
|
+
checks_to_run = [c for c in ENABLED_CHECKS if type(c).__name__ in check_names]
|
|
540
|
+
if not checks_to_run:
|
|
541
|
+
exit_with_error(
|
|
542
|
+
f"No matching checks found. Available checks: {[type(c).__name__ for c in ENABLED_CHECKS]}"
|
|
543
|
+
)
|
|
544
|
+
|
|
545
|
+
# Collect connectors to check
|
|
546
|
+
connectors: list[Connector] = []
|
|
547
|
+
if name:
|
|
548
|
+
connectors.extend(Connector(remove_strict_encrypt_suffix(n)) for n in name)
|
|
549
|
+
if connector_directory:
|
|
550
|
+
connectors.extend(get_all_connectors_in_directory(Path(connector_directory)))
|
|
551
|
+
|
|
552
|
+
if not connectors:
|
|
553
|
+
exit_with_error("No connectors specified. Use --name or --connector-directory.")
|
|
554
|
+
|
|
555
|
+
connectors = sorted(connectors, key=lambda c: c.technical_name)
|
|
556
|
+
|
|
557
|
+
# Run checks synchronously (simpler than async for CLI)
|
|
558
|
+
all_results = []
|
|
559
|
+
for connector in connectors:
|
|
560
|
+
for qa_check in checks_to_run:
|
|
561
|
+
result = qa_check.run(connector)
|
|
562
|
+
status_icon = (
|
|
563
|
+
"[green]PASS[/green]"
|
|
564
|
+
if result.status == CheckStatus.PASSED
|
|
565
|
+
else "[red]FAIL[/red]"
|
|
566
|
+
)
|
|
567
|
+
console.print(
|
|
568
|
+
f"{status_icon} {connector.technical_name}: {result.check.name}"
|
|
569
|
+
)
|
|
570
|
+
if result.message:
|
|
571
|
+
console.print(f" {result.message}")
|
|
572
|
+
all_results.append(result)
|
|
573
|
+
|
|
574
|
+
# Write report if requested
|
|
575
|
+
if report_path:
|
|
576
|
+
Report(check_results=all_results).write(Path(report_path))
|
|
577
|
+
console.print(f"Report written to {report_path}")
|
|
578
|
+
|
|
579
|
+
# Exit with error if any checks failed
|
|
580
|
+
failed = [r for r in all_results if r.status == CheckStatus.FAILED]
|
|
581
|
+
if failed:
|
|
582
|
+
exit_with_error(f"{len(failed)} check(s) failed")
|
|
583
|
+
|
|
584
|
+
|
|
585
|
+
@connector_app.command(name="qa-docs-generate")
|
|
586
|
+
def generate_qa_docs(
|
|
587
|
+
output_file: Annotated[
|
|
588
|
+
str,
|
|
589
|
+
Parameter(help="Path to write the generated documentation file."),
|
|
590
|
+
],
|
|
591
|
+
) -> None:
|
|
592
|
+
"""Generate documentation for QA checks.
|
|
593
|
+
|
|
594
|
+
Creates a markdown file documenting all available QA checks organized by category.
|
|
595
|
+
"""
|
|
596
|
+
checks_by_category: dict[CheckCategory, list[Check]] = {}
|
|
597
|
+
for qa_check in ENABLED_CHECKS:
|
|
598
|
+
checks_by_category.setdefault(qa_check.category, []).append(qa_check)
|
|
599
|
+
|
|
600
|
+
jinja_env = Environment(
|
|
601
|
+
loader=PackageLoader("airbyte_ops_mcp.connector_qa", "templates"),
|
|
602
|
+
autoescape=select_autoescape(),
|
|
603
|
+
trim_blocks=False,
|
|
604
|
+
lstrip_blocks=True,
|
|
605
|
+
)
|
|
606
|
+
template = jinja_env.get_template(CONNECTORS_QA_DOC_TEMPLATE_NAME)
|
|
607
|
+
documentation = template.render(checks_by_category=checks_by_category)
|
|
608
|
+
|
|
609
|
+
output_path = Path(output_file)
|
|
610
|
+
output_path.write_text(documentation)
|
|
611
|
+
console.print(f"Documentation written to {output_file}")
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Connector operations utilities."""
|
|
2
|
+
|
|
3
|
+
from airbyte_ops_mcp.connector_ops.utils import (
|
|
4
|
+
Connector,
|
|
5
|
+
ConnectorInvalidNameError,
|
|
6
|
+
ConnectorLanguage,
|
|
7
|
+
ConnectorLanguageError,
|
|
8
|
+
ConnectorVersionNotFound,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"Connector",
|
|
13
|
+
"ConnectorInvalidNameError",
|
|
14
|
+
"ConnectorLanguage",
|
|
15
|
+
"ConnectorLanguageError",
|
|
16
|
+
"ConnectorVersionNotFound",
|
|
17
|
+
]
|